var validationElements = {
	
	/*==========================
		Required Field
	===========================*/
	required:{
		classTest:"v_required",
		message:"Please supply all marked fields",
		test:function(string){
			return (string.length > 0) ? true:false;
		}
	},
	
	/*==========================
		Required Field
	===========================*/
	currency:{
		classTest:"v_currency",
		message:"Please supply a valid amount!",
		match:/^(\d+)\.\d{2}$/m,
		test:function(string){
			return (string.match(this.match)) ? true:false;
		}
	},
	
	/*==========================
		E-Mail Address
	===========================*/
	emailAddress:{
		classTest:"v_email",
		message:"Please supply a valid email address",
		match:/^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$/i,
		test:function(string){
			return (string.match(this.match)) ? true:false;
		}
	},
	
	/*==========================
		Date Validation
	===========================*/	
	date:{
		classTest:"v_date",
		message:"Please supply a valid date",
		match:/^(?:(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)[0-9]{2})$/,
		test:function(string){			
			return (string.match(this.match)) ? true:false;
		}
	},
	
	/*==========================
		Telephone Validation
	===========================*/
	telephone:{
		classTest:"v_tel",
		message:"Please supply a valid telephone number",
		match:/^(\s?\d\s?){10,}$/i,
		test:function(string){			
			return (string.match(this.match)) ? true:false;
		}
	},
	
	/*==========================
		Number
	===========================*/
	number:{
		classTest:"v_number",
		message:"Please supply a valid number",
		match:/^(\s?\d\s?)+/i,
		test:function(string){			
			return (string.match(this.match)) ? true:false;
		}
	}
	
	/*=================================================================
		IF YOU NEED ANYMORE DROP ME AN E-MAIL AND I WILL ADD THEM IN
	=================================================================*/
}

var validator = {

	init:function(){
		var self = this;
		for(var i=0;i<document.forms.length;i++){
			SWJS.addEvent(document.forms[i],'submit',function(e){
				var rtn = !self.checkFields(this);
				if(!rtn){
					SWJS.stopDefault(e);
				}
			});
		}		
	},
	checkFields:function(par){
		var par = par || document;
		var inputs = SWJS.$$('input',par);
		var textAreas = SWJS.$$('textarea',par);
		var selectboxes = SWJS.$$('select',par);
		var outputErrors = [];
		var selectBoxErrors = [];
		var inputErrors = [];
		var textAreaErrors = [];
		
		/*==========================
		 Input Handling
		===========================*/
		for(var i=0;i<inputs.length;i++){
		
			if(inputs[i].type == "checkbox")
			{
			
			
					if(SWJS.hasClassName(inputs[i],validationElements.required.classTest)){
					
						if(!inputs[i].checked){
							// If not valid add the error
							if(inputs[i].title){
								inputErrors.push("- "+inputs[i].title+"\r\n");
							}else{
								inputErrors.push("- "+validationElements.required.message+"\r\n");
							}
							// Mark it with a style
							SWJS.addClassName(inputs[i],"invalid");
							SWJS.addEvent(inputs[i],'click',function(){
								SWJS.removeClassName(this,"invalid");	
							});
							SWJS.addEvent(inputs[i],'focus',function(){
								SWJS.removeClassName(this,"invalid");	
							});
							
						}else{
							SWJS.removeClassName(inputs[i],"invalid");
						}					
					}
			
				
				
			} else {
		
			for(elem in validationElements){
				if(SWJS.hasClassName(inputs[i],validationElements[elem].classTest)){
					
						if(!validationElements[elem].test(inputs[i].value)){
							// If not valid add the error
							if(inputs[i].title){
								inputErrors.push("- "+inputs[i].title+"\r\n");
							}else{
								inputErrors.push("- "+validationElements[elem].message+"\r\n");
							}
							// Mark it with a style
							SWJS.addClassName(inputs[i],"invalid");
							SWJS.addEvent(inputs[i],'click',function(){
								SWJS.removeClassName(this,"invalid");	
							});
							SWJS.addEvent(inputs[i],'focus',function(){
								SWJS.removeClassName(this,"invalid");	
							});
							
						}else{
							SWJS.removeClassName(inputs[i],"invalid");
						}					
					}
				}
			}						
		}
		
		/*==========================
		 Textarea Handling
		===========================*/
		for(var i=0;i<textAreas.length;i++){
			for(elem in validationElements){
				if(SWJS.hasClassName(textAreas[i],validationElements[elem].classTest)){
					if(!validationElements[elem].test(textAreas[i].value)){
						// If not valid add the error
						if(textAreas[i].title){
							textAreaErrors.push("- "+textAreas[i].title+"\r\n");
						}else{
							textAreaErrors.push("- "+validationElements[elem].message+"\r\n");
						}
						// Mark it with a style
						SWJS.addClassName(textAreas[i],"invalid");
								SWJS.addEvent(textAreas[i],'click',function(){
							SWJS.removeClassName(this,"invalid");	
						});
						SWJS.addEvent(textAreas[i],'focus',function(){
							SWJS.removeClassName(this,"invalid");	
						});
					}else{
						SWJS.removeClassName(textAreas[i],"invalid");
					}
				}
			}			
		}
		
		
		/*==========================
		 Select Box Handling
		===========================*/
		for(var i=0;i<selectboxes.length;i++){
		
			if(SWJS.hasClassName(selectboxes[i],'v_required')){
				if(!validationElements.required.test(selectboxes[i].value)){
					if(selectboxes[i].title){
						selectBoxErrors.push("- "+selectboxes[i].title+"\r\n");
					}else{
						selectBoxErrors.push("- "+validationElements.required.message+"\r\n");
					}
					
						// Mark it with a style
						SWJS.addClassName(selectboxes[i],"invalid");
								SWJS.addEvent(selectboxes[i],'click',function(){
							SWJS.removeClassName(this,"invalid");	
						});
						SWJS.addEvent(selectboxes[i],'focus',function(){
							SWJS.removeClassName(this,"invalid");	
						});					
					
				} else {
					SWJS.removeClassName(selectboxes[i],"invalid");
				}
			}
		}
		
		var string = new String();
		string = "";
		var retVal = false;
		
		// Add in Input Errors
		for(var i=0;i<inputErrors.length;i++){
			if(!outputErrors.inArray(inputErrors[i])){
				outputErrors.push(inputErrors[i]);
			}
		}
		
		// Add in Select Box Errors
		for(var i=0;i<selectBoxErrors.length;i++){
			if(!outputErrors.inArray(selectBoxErrors[i])){
				outputErrors.push(selectBoxErrors[i]);
			}
		}
		
		// Add in Text Area Errors
		for(var i=0;i<textAreaErrors.length;i++){
			if(!outputErrors.inArray(textAreaErrors[i])){
				outputErrors.push(textAreaErrors[i]);
			}
		}
			
		// Create The Output String
		if(outputErrors.length > 0){
			for(var i=0;i<outputErrors.length;i++){
				string = string+outputErrors[i];
			}
			retVal = true;
			alert(string);
		}else{
			retVal = false;
		}
		return retVal;
		
		/*==========================
		 Select Box Handling
		===========================
		for(var i=0;i<selectboxes.length;i++){
			for(elem in validationElements){
				if(SWJS.hasClassName(selectboxes[i],validationElements[elem].classTest){
					// Code Stub
				}
			}			
		}*/
	}
}

addLoadEvent(
	function(){
		validator.init();
	}
);