/*
	CssFormValidator 1.4
	Fransjo Leihitu
	
	http://www.leihitu.nl

	DESCRIPTION:
	This is my attempt for making an unobtrusive form validator.
	
	When a required field is empty the script will add a class called cssFormValidatorError, so you can style that element.
		
*/

function CssFormValidator(theFormElement) 
{
	/* vars */
	var requiredTextFields=Array();
	var requiredEmailFields=Array();
	var errorPlaceHolder="cssFormValidatorErrorPlaceHolder";
	var hasErrors=false;
	
	var show_alert=false;
	
	var theForm;
	
	var errorLabelText="_fieldname_ is required!";
	var errorLabels=Array();
	/* ---------------------------------------- */
	
	
	/* functions */
	this.addRequiredTextField=addRequiredTextField;
	this.addRequiredEmailField=addRequiredEmailField;
	this.removeField=removeField;
	this.validateForm=validateForm;
	this.setAlertText=setAlertText;
	/* ---------------------------------------- */
	
	init(theFormElement);
	
	function getForm()
	{
		return this.theForm;
	}
	
	function init(el)
	{		
		if(el)
		{
			this.theForm=el;
			addRequiredTextFields();
			addRequiredEmailFields();
			addOptionalRequiredTextFields();
			
			var elShowAlert=eval("this.theForm.cssformvalidator_show_alert");
					
			if(elShowAlert) 
			{
				if(elShowAlert.value=="true")
				{
					show_alert=true;
									
					var elAlertText=eval("this.theForm.cssformvalidator_alert_text");
					if(elAlertText)
					{
						if(elAlertText.value!=""){
							errorLabelText=elAlertText.value;
						}
					}
					
				}
			}
			
		} else {
			alert("CssFormValidator constructor error!!! \nPlease specify the form id");
		}
	}
	
	function removeField(str)
	{
		try{
			
			if(requiredTextFields.length>0)
			{
				var dummyArray=Array();
				for(var i=0;i<requiredTextFields.length;i++)
				{
					if(requiredTextFields[i]!=str) dummyArray.push(requiredTextFields[i]);
				}
				
				requiredTextFields=null;
				requiredTextFields=Array();
				requiredTextFields=dummyArray;
			}
			
			
			if(requiredEmailFields.length>0)
			{
				var dummyArray1=Array();
				for(var i=0;i<requiredEmailFields.length;i++)
				{
					if(requiredEmailFields[i]!=str) dummyArray1.push(requiredEmailFields[i]);
				}
				
				requiredEmailFields=null;
				requiredEmailFields=Array();
				requiredEmailFields=dummyArray1;
			}
					
		} catch (e) {
		}
	}
	
	function isValidEmail(str) {
	   return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);	 
	}
	
	
	function addRequiredTextFields()
	{
		var el=eval("this.theForm.cssformvalidator_required_textfields");
		
		if(el)
		{
			var dummyArray=el.value.split("|");
			for(var i=0;i<dummyArray.length;i++)
			{
				addRequiredTextField(dummyArray[i]);
			}
		}
	}
	
	
	function addOptionalRequiredTextFields()
	{
		var el=eval("this.theForm.cssformvalidator_optional_required_textfields");
		
		if(el)
		{
			var dummyArray=el.value.split("|");
			for(var i=0;i<dummyArray.length;i++)
			{
				var val=dummyArray[i];
				var dummyArray1=val.split(",");
				
				addRequiredTextField(dummyArray1[0],dummyArray1[1]);
			}
		}
	}	
	
	function addRequiredEmailFields()
	{
		var el=eval("this.theForm.cssformvalidator_required_email");
		
		if(el)
		{
			var dummyArray=el.value.split("|");
			for(var i=0;i<dummyArray.length;i++)
			{
				addRequiredEmailField(dummyArray[i]);
			}
		}
	}	
	
	function clearRequiredFields()
	{
		var elTextfields=eval("this.theForm.cssformvalidator_required_textfields");
		var elOptionalTextfields=eval("this.theForm.cssformvalidator_optional_required_textfields");
		
		var elEmail=eval("this.theForm.cssformvalidator_required_email");
		var elShowAlerts=eval("this.theForm.cssformvalidator_show_alert");
		var elAlertText=eval("this.theForm.cssformvalidator_alert_text");
				
		if(elTextfields) this.theForm.removeChild(elTextfields);
		if(elOptionalTextfields) this.theForm.removeChild(elOptionalTextfields);
		
		
		if(elEmail) this.theForm.removeChild(elEmail);
		if(elShowAlerts) this.theForm.removeChild(elShowAlerts);
		if(elAlertText) this.theForm.removeChild(elAlertText);
		
		

	}
	
	
	function addRequiredTextField(param,param2)
	{
		if(param!="")
		{
			if(param!=null)
			{
			
				if(param2!=null)
				{
					var myForm=getForm();
					var el=eval("myForm.text_" + param2);
					
					if(el)
					{
						if(el.value!="") 
						{
							requiredTextFields[requiredTextFields.length]=param;
						} 
					}
				} else {
					requiredTextFields[requiredTextFields.length]=param;
				}
			}
		}
	}
	
	function addErrorLabel(param)
	{
		if(param!=null)
		{
			if(param!="")
			{
				errorLabels[errorLabels.length]=param;
			}
		}
	}
	
	function addRequiredEmailField(param)
	{
		if(param!="")
		{
			if(param!=null)
			{
				requiredEmailFields[requiredEmailFields.length]=param;
			}
		}
	}

	
	function setAlertText(param)
	{
		if(param){
			if(param!=null)
			{
				if(param!="")
				{
					errorLabelText=param;
				}
			}
		}
	}
	
	
	function validateForm()
	{
		var hasNoErrors=true;
		
		
		try{	
			
			validateTextFields(this.theForm);
			validateEmailFields(this.theForm); 

			if(errorLabels.length>0)
			{
				if(show_alert)
				{
					var errorsText="";
					for(i=0;i<errorLabels.length;i++)
					{
						var errorsTextDummy="";
						errorsTextDummy=errorLabelText;
						
						errorsTextDummy=errorsTextDummy.replace(/_fieldname_/,errorLabels[i]);
						
						errorsText=errorsText +errorsTextDummy + "\n";
					}
				
					alert(errorsText);
				}
					
				hasNoErrors=false;
			}
			
			if(hasNoErrors)
			{
				clearRequiredFields();
			}			
			
		} catch (e){
			
		}		
		
		return hasNoErrors;
				
	}
	
	function validateTextFields()
	{
		var hasNoErrors=true;
		
		try{
			
			for(i=0;i<requiredTextFields.length;i++)
			{
				var el=eval("this.theForm.text_" + requiredTextFields[i]);
				
				if(el)
				{						
					var el_label=document.getElementById("label_" + requiredTextFields[i]);
					var el_fieldset=document.getElementById("fieldset_" + requiredTextFields[i]);

					resetClass(el_label);
					resetClass(el_fieldset);
					resetClass(el);
													
					if(el.value=="")
					{
						
						if(el_label)
						{							
							if(el_label.className=="")
							{
								el_label.className="cssFormValidatorError";							
							} else {
								el_label.className=el_label.className + " cssFormValidatorError";
							}
							
							addErrorLabel(el_label.innerHTML);
						}
						
						if(el_fieldset)
						{
							if(el_fieldset.className=="")
							{
								el_fieldset.className="cssFormValidatorError";		
							}
							el_fieldset.className=el_fieldset.className + " cssFormValidatorError";
						}
						
						if(el.className=="")
						{
							el.className="cssFormValidatorError";		
						}
						el.className=el.className + " cssFormValidatorError";						
						
						hasNoErrors=false;
					}
				}
	
			}
			
		} catch (e) {
			
		}
		
		return hasNoErrors;
		
	}
	
	function validateEmailFields()
	{
		var hasNoErrors=true;
		
		try{
			
			for(i=0;i<requiredEmailFields.length;i++)
			{
				var el=eval("this.theForm.text_" + requiredEmailFields[i]);
				
				if(el)
				{						
					var el_label=document.getElementById("label_" + requiredEmailFields[i]);
					var el_fieldset=document.getElementById("fieldset_" + requiredEmailFields[i]);

					resetClass(el_label);
					resetClass(el_fieldset);
					resetClass(el);
													
					if(!isValidEmail(el.value))
					{
						
						if(el_label)
						{							
							if(el_label.className=="")
							{
								el_label.className="cssFormValidatorError";							
							} else {
								el_label.className=el_label.className + " cssFormValidatorError";
							}
							
							addErrorLabel(el_label.innerHTML);
						}
						
						if(el_fieldset)
						{
							if(el_fieldset.className=="")
							{
								el_fieldset.className="cssFormValidatorError";		
							}
							el_fieldset.className=el_fieldset.className + " cssFormValidatorError";
						}
						
						if(el.className=="")
						{
							el.className="cssFormValidatorError";		
						}
						el.className=el.className + " cssFormValidatorError";						
						
						hasNoErrors=false;
					}
				}
	
			}
			
		} catch (e) {
			
		}
		
		return hasNoErrors;		
	}		
	
	function resetClass(el)
	{
		if(el)
		{
			el.className = el.className.replace(/cssFormValidatorError/g, "");
			el.className = el.className.replace(/ /g, "");			
		}
	}
	
}
