var Validate=new Class({
	options:{
		requiredClass:'required',
		incompleteClass:'incomplete',
		anchorTag:'TR',
		backupAnchor:'TD',
		alertText:false
	},
	initialize:function(form,options)
	{
		this.setOptions(options);
		this.disinclude=[];
		this.form=$(form);
		$(form).onsubmit=function()
		{
			try{var inputs=document.getElements('input').filter(function(t){return (t.hasClass(this.options.requiredClass));}.bind(this));
			var selects=document.getElements('select').filter(function(t){return (t.hasClass(this.options.requiredClass));}.bind(this));
			var textareas=document.getElements('textarea').filter(function(t){return (t.hasClass(this.options.requiredClass));}.bind(this));
			var incompletes=[];

			for(i=0;i<inputs.length;i++)
			{
				if(this.disinclude.contains(inputs[i])){continue;}
				switch(inputs[i].type)
				{
					case 'radio':
					case 'checkbox':
						var cb = document.getElements('input[name='+inputs[i].name+']');
						if((cb.filter(function(t){return t.checked==1;})).length==0)
						{
							if(!this.options.alertText){try{this.mark(inputs[i]);}catch(e){alert('burned!');return false;};}
							incompletes.push(inputs[i]);
						}else{if(!this.options.alertText){this.mark(inputs[i],1);}}
					break;
					default:
						if(!inputs[i].getValue()||(inputs[i].getValue()&&inputs[i].getValue().trim()==''))
						{
							if(!this.options.alertText){try{this.mark(inputs[i]);}catch(e){alert('burned!');return false;};}
							incompletes.push(inputs[i]);
						}else{if(!this.options.alertText){this.mark(inputs[i],1);}}
					break;
				}
			}
			for(i=0;i<textareas.length;i++)
			{
				if(this.disinclude.contains(textareas[i])){continue;}
				if(!textareas[i].getValue()||textareas[i].getValue().trim()=='')
				{
					if(!this.options.alertText){this.mark(textareas[i]);}
					incompletes.push(textareas[i]);
				}else{
					if(!this.options.alertText){this.mark(textareas[i],1);}
				}
			}
			for(i=0;i<selects.length;i++)
			{
				if(this.disinclude.contains(selects[i])){continue;}

				if(!selects[i].getValue()||selects[i].getValue()==''||selects[i].getValue()=='-----'||selects[i].getValue()==0)
				{
					if(!this.options.alertText){this.mark(selects[i]);}
					incompletes.push(selects[i]);
				}else{
					if(!this.options.alertText){this.mark(selects[i],1);}
				}
			}

			if(incompletes.length>0){

				if(this.options.alertText){
					var needs_attention=[];for(n=0;n<incompletes.length;n++){needs_attention.push(incompletes[n].name);}
					alert("The following fields need to be completed: \r\n"+needs_attention.join("\n"));
				}
				incompletes[0].focus();

				var coords=incompletes[0].getCoordinates();window.scrollTo(0,(coords.top.toInt()-50));
				return false;
			};
			}catch(e){var s = '';for(var i in e){s+=i+' '+e[i]+' ';}alert(s);return false;}
		}.bind(this);
	},
	mark:function(field,type){
		var currentTag=field;
		var anchor=(((currentTag.type=='radio')||(currentTag.type=='checkbox'))?this.options.backupAnchor:this.options.anchorTag);
		if(anchor!='this'){do{currentTag=currentTag.getParent();}while(currentTag.tagName!=anchor);}
		switch(type)
		{
			case 1: if(currentTag.hasClass(this.options.incompleteClass)){currentTag.removeClass(this.options.incompleteClass);};break;
			default:if(!currentTag.hasClass(this.options.incompleteClass)){currentTag.addClass(this.options.incompleteClass);};break;
		}
	},
	exception:function(target,fn)
	{
		(function()
		{
			if(typeof fn!='function'){return false;}
			if(fn($(target))){
				this.disinclude.include($(target));
			}else{
				if(this.disinclude.contains($(target))){this.disinclude.remove($(target));}
			}
		}).periodical(500,this);
	}
});
Validate.implement(new Options);

function FloodOut(elm)
{
	var e = $(elm);
	if($type(e)!='element'){return false;}
	e.addEvents({
		'move':function(){
			var form=this.form;
			for(i=0;i<form.length;i++)
			{
				if(form[i]===elm){var key=i;break;}
			}
			form[(key+1)].focus();
		},
		'keyup':function(event)
		{
			var ev = new Event(event);if(ev.code==9||ev.code==16){return false;}
			var l=e.value.length,max=e.getProperty('maxlength');
			if(max&&l>=(max.toInt())&&ev.code!='9'){this.fireEvent('move');}
		}
	});
}