//Created By: Chris Campbell
//www.particletree.com

window.onload = attachFormHandlers;


function attachFormHandlers()
{
  // Make sure we're on a newer browser
	if (document.getElementsByTagName)
    { 
		var objInput = document.getElementsByTagName('input'); // get all input tags
		var objTextarea = document.getElementsByTagName('textarea'); // get all input tags
		var objSelect = document.getElementsByTagName('select'); // get all input tags
		var attribute;
		var inputmask;
		var form = document.getElementsByTagName('form') // get the form
		if(validateonsubmitonly!=1)
		{
			for (var iCounter=0; iCounter<objInput.length; iCounter++)
			{
				var type=objInput[iCounter].getAttribute('type');
		
				if((type=='button')||(type=='submit')||(type=='image')||(type=='radio')||(type=='checkbox'))
				{
					//alert("caught");
					continue;
				}
		
		
				attribute=objInput[iCounter].getAttribute("validate");
				inputmask=objInput[iCounter].getAttribute("inputmask");
				
				if(inputmask)
				{
					if(inputmask.search("#"))
					{
						var inputdefault=inputmask.replace(/#/g,"_");
						objInput[iCounter].value=inputdefault;
					}
					objInput[iCounter].onkeydown = function(e){ onKeyDown(e,this);}
				}
				
				if(attribute!="confirm"&&(attribute!="password"))
				{
					objInput[iCounter].onblur = function(){return  onBlur(this);} // attach the onBlur event to each input tag
					objInput[iCounter].onchange = function(){return onChange(this);} // attach the onchange event to each input tag
					objInput[iCounter].onkeydown = function(e){return  onKeyDown(e,this);} // attach the onKeyPressevent to each input tag
					objInput[iCounter].onfocus = function(){return  onFocus(this);} // attach the onFocus event to each input tag
					objInput[iCounter].onClick = function(){return  onClick(this);} // attach the onClick event to each input tag
					objInput[iCounter].onMouseOver = function(){return  onMouseOver(this);} // attach the onMouseOver event to each input tag
				}
				else
				{
					objInput[iCounter].onblur = function(){return  onBlur(this,this.form);} // attach the onBlur event to each input tag
					objInput[iCounter].onfocus = function(){return  onFocus(this);}
				}
				
				if(attribute=="password")
				{
					objInput[iCounter].onkeyup= function(){return  passwordStrength(this.value,this.form);}
				}
				
				
				
			}		
			for (var tCounter=0; tCounter<objTextarea.length; tCounter++)
			{
				objTextarea[tCounter].onblur = function(){return  onBlur(this);} // attach the onBlur event to each input tag
				objTextarea[tCounter].onchange = function(){return onChange(this);} // attach the onchange event to each input tag
				objTextarea[tCounter].onKeyPress = function(){return  onKeyPress(this);} // attach the onKeyPressevent to each input tag
				objTextarea[tCounter].onfocus = function(){return  onFocus(this);} // attach the onFocus event to each input tag
				objTextarea[tCounter].onClick = function(){return  onClick(this);} // attach the onClick event to each input tag
				objTextarea[tCounter].onMouseOver = function(){return  onMouseOver(this);} // attach the onMouseOver event to each input tag
			}		
			for (var sCounter=0; sCounter<objSelect.length; sCounter++)
			{
				objSelect[sCounter].onblur = function(){return  onBlur(this);} // attach the onBlur event to each input tag
					
				objSelect[sCounter].onchange = function(){return onChange(this);} // attach the onchange event to each input tag
				objSelect[sCounter].onKeyPress = function(){return  onKeyPress(this);} // attach the onKeyPressevent to each input tag
				objSelect[sCounter].onfocus = function(){return  onFocus(this);} // attach the onFocus event to each input tag
				objSelect[sCounter].onClick = function(){return  onClick(this);} // attach the onClick event to each input tag
				objSelect[sCounter].onMouseOver = function(){return  onMouseOver(this);} // attach the onMouseOver event to each input tag
			}
		}
			
		for (var fCounter=0;fCounter<form.length;fCounter++)
		{
			//alert(form[fCounter]);
			form[fCounter].onsubmit = function(){return validate(this);} // atttach the onsubmit to the form 
		}
	}
}


function onBlur(objInput,kform)
{
	
	sVal = objInput.value; //sVal is the value of the input field being validated
    var sFeedBack; //feedback message sent back to the user
	var sFeedbackLoc = objInput.getAttribute('message');
	var required=objInput.getAttribute('required');
	var unique=objInput.getAttribute('unique');
	var uniqueaccross=objInput.getAttribute('uniqueaccross');
	var inputmask=objInput.getAttribute('inputmask');
	var minlength=objInput.getAttribute('minlength');
	var minval=objInput.getAttribute('minval');
	var maxval=objInput.getAttribute('maxval');
	var appendMessage=objInput.getAttribute('appendmessage');
	var exception=objInput.getAttribute('exception');

	var sFeedbackPass;
	var type=objInput.getAttribute('type');

	if(type==null)
	type=objInput.tagName;
	type=type.toLowerCase();
	
	var res;
	var flag=0;
	
	sFeedback="";
    
	if (required == "true")
	{
			//alert('aaaa');
		if(!isEmpty(sVal))
		{
			//sFeedback = "Thank you";
			if(type!="textarea")
			objInput.className=normalclass;
			else
			objInput.className=tnormalclass;
			
			sFeedback='';
		}
		else
		{
			flag=1;
			if(type!="textarea")
			objInput.className=errorclass;
			else
			objInput.className=terrorclass;
			sFeedback = REQUIRED;
		}
		//sFeedback = validateRequired(sVal); //validateRequired() checks if it is invalid and sends back feedback
	}
	
	
	if(exception)
	{
		for(i=0;i<exception.length;i++)
		{
			 var c=exception.charAt(i);
			 var str=sVal.replace(c,'');
			 sVal=str;
			// alert(sVal);
		}
	}
			
	if (sVal != "") //if the value is blank we don't need to validate.  If it is required, the word
		//"required"  will already be the feedback message from the validateRequired() function
	{
	// check the different validation cases (ie: email, phone, etc.)
		switch (objInput.getAttribute('validate'))
		{
			case "int" :        if(!isInteger(sVal))
								{
				  			       sFeedback=INVALID_INTEGER;
								   flag=1;
								}
				 		        break;
			case "signedint" :  if(!isSignedInteger(sVal))
								{
				  			       sFeedback=INVALID_SIGNED_INTEGER;
								   flag=1;
								}
				 		        break;
			case "positiveint": if(!isPositiveInteger(sVal))
								{
				  			       sFeedback=INVALID_POSITIVE_INTEGER;
								   flag=1;
								}
							    break;
			case "letter" :     if(!isLetter(sVal))
								{
				  			       sFeedback=INVALID_LETTER;
								   flag=1;
								}
			 	 				break;
			case "digit":       if(!isDigit(sVal))
								{
				  			       sFeedback=INVALID_DIGIT;  
								   flag=1;
								}
			 	 				break;
			case "letterordigit":if(!isLetterOrDigit(sVal))
								{
				  			       sFeedback=INVALID_LETTER_OR_DIGIT;  
								   flag=1;
								}
			 				    break;
			case "nonnegativeint":if(!isNonnegativeInteger(sVal))
								{
				  			       sFeedback=INVALID_NON_NEGATIVE_INTEGER;  
								   flag=1;
								}
			 	 				break;
			case "negativeint": if(!isNegativeInteger(sVal))
								{
				  			       sFeedback=INVALID_NEGATIVE_INTEGER;  
								   flag=1;
								}
			 	 				break;
 			case "nonpositiveint":if(!isNonpositiveInteger(sVal))
								{
				  			       sFeedback=INVALID_NONPOSITIVE_INTEGER; 
								   flag=1;
								}
			 	 				break;
			case "float":		if(!isFloat (sVal))
								{
				  			       sFeedback=INVALID_FLOAT; 
								   flag=1;
								}
			 	 				break;
 			case "signedfloat": if(!isSignedFloat(sVal))
								{
				  			       sFeedback=INVALID_SIGNED_FLOAT; 
								   flag=1;
								}
			 				    break;
			case "alphanumeric":if(!isAlphanumeric(sVal))
								{
				  			       sFeedback=INVALID_ALPHANUMERIC; 
								   flag=1;
								}
			 	 				break;
 			case "ssn":			if(!isSSN(sVal))
								{
				  			       sFeedback=INVALID_SSN; 
								   flag=1;
								}
			 	 				break;
 			case "usphone":		if(!isUSPhoneNumber(sVal))
								{
				  			       sFeedback=INVALID_US_PHONE_NUMBER; 
								   flag=1;
								}
			 	 				break;
			case "intphone":	if(!isInternationalPhoneNumber(sVal))
								{
				  			       sFeedback=INVALID_INTERNATIONAL_PHONE_NUMBER; 
								   flag=1;
								}
			 	 				break;
 			case "zip":         if(!isZIPCode(sVal))
								{
				  				   sFeedback=INVALID_ZIP_CODE;
								   flag=1;
								}
			 	 				break;
 			case "state":		if(!isStateCode(sVal))
								{
				  				   sFeedback=INVALID_STATE_CODE;
								   flag=1;
								}
			 					break;
 			case "email":       if(!isEmail(sVal))
								{
				   				   sFeedback=INVALID_EMAIL_ADDRESS;
								   flag=1;
								}
			 	 				break;
 			case "year":		if(!isYear(sVal))
								{
				  				   sFeedback=INVALID_YEAR;
								   flag=1;
								}
			 	 				break;
 			case "range":		if(!isIntegerInRange (sVal,minval,maxval))
								{
								   sFeedback=INTEGER_NOT_IN_RANGE; 
								   flag=1;
								}
			 				    break;
			case "month": 		if(!isMonth(sVal))
								{
				  				   sFeedback=INVALID_MONTH;
								   flag=1;
								}
			 	 				break;
			case "day":			if(!isDay(sVal))
								{
				  				   sFeedback=INVALID_DAY;
								   flag=1;
								}
			 	 				break;
 			case "date":		//alert('isDate function to be changed'); 
								/*if(!isDate(sVal))
								{
									
				  				   sFeedback=INVALID_DATE;			 	 
								   flag=1;
								}*/
								
								break;
			case "currency":
			 	 break;
 			
 			case "phone":
			 	 break;
 			case "text":		if(!isText(sVal))
								{
				  				   sFeedback=INVALID_TEXT;			 	 
								   flag=1;
								}
								break;

 			case "textandnum":  if(!isTextandNum(sVal))
								{
				  				   sFeedback=INVALID_TEXTANDNUM;			 	 
								   flag=1;
								}
								break;
								
			case "website":		if(!isWebsite(sVal))
								{
				  				   sFeedback=INVALID_WEBSITE_ADDRESS;			 	 
								   flag=1;
								}
								break;
			case "datetime":
			 	 break;
 			case "name":		if(!isName(sVal))
								{
				  				  sFeedback=INVALID_NAME;			 	 
								  flag=1;
								}
								else
								{
									var newname=reformatName(sVal);
									objInput.value=newname;
								}
								break;
 			case "password":  
								if(!checkpass(kform,sVal))
							   	{
			   					  sFeedback=PASSWORDS_DONT_MATCH;
								  flag=1;
							   	}
			 				   break;
 			case "confirm":    
								
								if(!checkconfirm(kform,sVal))
							   	{
			   					  sFeedback=PASSWORDS_DONT_MATCH;
								  flag=1;
							   	}
			 	 			   break;
			
		}
	}
	
	
	if(!isEmpty(sVal))
	{
		
		if(flag==1)
		{
			if(type!="textarea")
			objInput.className=errorclass;
			else
			objInput.className=terrorclass;
			
			if(objInput.getAttribute('validate')=="confirm")
			{
				 
				 passelement=getConfirmField(kform);
				 passelement.className=errorclass;
				 sFeedbackPass=passelement.getAttribute('message');
			}
			
			if(objInput.getAttribute('validate')=="password")
			{
				 
				 passelement=getPassField(kform);
				 passelement.className=errorclass;
				 sFeedbackPass=passelement.getAttribute('message');
			}
		}
		else
		{
			if(type!="textarea")
			objInput.className=okclass;
			else
			objInput.className=tokclass;
			
			
			if(objInput.getAttribute('validate')=="confirm")
			{
				passelement=getConfirmField(kform);
				passelement.className=okclass;
				sFeedbackPass=passelement.getAttribute('message');
			}
			
			if(objInput.getAttribute('validate')=="password")
			{
				 
				 passelement=getPassField(kform);
				 passelement.className=okclass;
				 sFeedbackPass=passelement.getAttribute('message');
			}
			
		}
	}
	
	if(showtick==1)
	{
		if(flag==1)
		{
			sFeedback='<img src=\"validation/error.gif\"> '+sFeedback;
		}
		else
		{
			if(!isEmpty(sVal))
			sFeedback='<img src=\"validation/ok.gif\"> ';
		}
	}
	
	
			// after validation is complete return the feedback 
	if(document.getElementById(sFeedbackLoc))
		document.getElementById(sFeedbackLoc).innerHTML = sFeedback;	
		
	if(document.getElementById(sFeedbackPass))
		document.getElementById(sFeedbackPass).innerHTML = sFeedback;	
}



function onKeyDown(e,objInput)
{
	sVal = objInput.value; //sVal is the value of the input field being validated
    var sFeedBack; //feedback message sent back to the user
	var sFeedbackLoc = objInput.getAttribute('message');
	var required=objInput.getAttribute('required');
	var unique=objInput.getAttribute('unique');
	var uniqueaccross=objInput.getAttribute('uniqueaccross');
	var inputmask=objInput.getAttribute('inputmask');
	var minlength=objInput.getAttribute('minlength');
	var minval=objInput.getAttribute('minval');
	var maxval=objInput.getAttribute('maxval');
	var appendMessage=objInput.getAttribute('appendmessage');
	var exception=objInput.getAttribute('exception');
	var masktype=objInput.getAttribute('masktype');
	if(!e)
	e=window.event;
	if(inputmask!="")
	{
		if(masktype=="numeric")
			return dFilter(e.keyCode,objInput,inputmask);
		else if(masktype=="alpha")
			return dFilterAlpha(e.keyCode,objInput,inputmask);
	}
}




function onClick(objInput)
{
	sVal = objInput.value; //sVal is the value of the input field being validated
    var sFeedBack; //feedback message sent back to the user
	var sFeedbackLoc = objInput.getAttribute('message');
	var required=objInput.getAttribute('required');
	var unique=objInput.getAttribute('unique');
	var uniqueaccross=objInput.getAttribute('uniqueaccross');
	var inputmask=objInput.getAttribute('inputmask');
	var minlength=objInput.getAttribute('minlength');
	var minval=objInput.getAttribute('minval');
	var maxval=objInput.getAttribute('maxval');
	var appendMessage=objInput.getAttribute('appendmessage');
	var exception=objInput.getAttribute('exception');
}

function onMouseOver(objInput)
{
	sVal = objInput.value; //sVal is the value of the input field being validated
    var sFeedBack; //feedback message sent back to the user
	var sFeedbackLoc = objInput.getAttribute('message');
	var required=objInput.getAttribute('required');
	var unique=objInput.getAttribute('unique');
	var uniqueaccross=objInput.getAttribute('uniqueaccross');
	var inputmask=objInput.getAttribute('inputmask');
	var minlength=objInput.getAttribute('minlength');
	var minval=objInput.getAttribute('minval');
	var maxval=objInput.getAttribute('maxval');
	var appendMessage=objInput.getAttribute('appendmessage');
	var exception=objInput.getAttribute('exception');
}

function onFocus(objInput)
{
	sVal = objInput.value; //sVal is the value of the input field being validated
    var sFeedBack; //feedback message sent back to the user
	var sFeedbackLoc = objInput.getAttribute('message');
	var required=objInput.getAttribute('required');
	var unique=objInput.getAttribute('unique');
	var uniqueaccross=objInput.getAttribute('uniqueaccross');
	var inputmask=objInput.getAttribute('inputmask');
	var minlength=objInput.getAttribute('minlength');
	var minval=objInput.getAttribute('minval');
	var maxval=objInput.getAttribute('maxval');
	var appendMessage=objInput.getAttribute('appendmessage');
	var exception=objInput.getAttribute('exception');
	var type=objInput.getAttribute('type');

	if(type==null)
	type=objInput.tagName;
	type=type.toLowerCase();
	
	if(type!="textarea")
	objInput.className=onfocusclass;
	else
		objInput.className=tonfocusclass;
}


function onChange(objInput)
{ 
	
	sVal = objInput.value; //sVal is the value of the input field being validated
    var sFeedBack=''; //feedback message sent back to the user
	var sFeedbackLoc = objInput.getAttribute('message');
	var required=objInput.getAttribute('required');
	var unique=objInput.getAttribute('unique');
	var uniqueaccross=objInput.getAttribute('uniqueaccross');
	var inputmask=objInput.getAttribute('inputmask');
	var minlength=objInput.getAttribute('minlength');
	var minval=objInput.getAttribute('minval');
	var maxval=objInput.getAttribute('maxval');
	var appendMessage=objInput.getAttribute('appendmessage');
	var exception=objInput.getAttribute('exception');
	
	
    
	
	if (required == "true")
	{
		if(!isEmpty(sVal))
			sFeedback = "Thank you";
		else
			sFeedback = "Required";
		//sFeedback = validateRequired(sVal); //validateRequired() checks if it is invalid and sends back feedback
	}
	
			
	if (sVal != "") //if the value is blank we don't need to validate.  If it is required, the word
		//"required"  will already be the feedback message from the validateRequired() function
	{
	// check the different validation cases (ie: email, phone, etc.)
		switch (objInput.getAttribute('validate'))
		{
			/*case "int" :        if(!isInteger(sVal))
				  			       sFeedback="Invalid Integer";
				 		        break;
			case "signedint" :  if(!isSignedInteger(sVal))
				  			       sFeedback="Invalid Signed Integer";
				 		        break;
			case "positiveint": if(!isPositiveInteger(sVal))
				  			       sFeedback="Invalid Positive Integer";
							    break;
			case "letter" :     if(!isLetter(sVal))
				  			       sFeedback="Invalid Letter";
			 	 				break;
			case "digit":       if(!isDigit(sVal))
				  			       sFeedback="Invalid Digit";  
			 	 				break;
			case "letterordigit":if(!isLetterOrDigit(sVal))
				  			       sFeedback="Invalid Letter Or Digit";  
			 				    break;
			case "nonnegativeint":if(!isNonnegativeInteger(sVal))
				  			       sFeedback="Invalid Non negative Integer";  
			 	 				break;
			case "negativeint": if(!isNegativeInteger(sVal))
				  			       sFeedback="Invalid Negative Integer";  
			 	 				break;
 			case "nonpositiveint":if(!isNonpositiveInteger(sVal))
				  			       sFeedback="Invalid NonpositiveInteger"; 
			 	 				break;
			case "float":		if(!isFloat (sVal))
				  			       sFeedback="Invalid Float"; 
			 	 				break;
 			case "signedfloat": if(!isSignedFloat(sVal))
				  			       sFeedback="Invalid Signed Float"; 
			 				    break;
			case "alphanumeric":if(!isAlphanumeric(sVal))
				  			       sFeedback="Invalid Alphanumeric"; 
			 	 				break;
 			case "ssn":			if(!isSSN(sVal))
				  			       sFeedback="Invalid SSN"; 
			 	 				break;
 			case "usphone":		if(!isUSPhoneNumber(sVal))
				  			       sFeedback="Invalid US Phone Number"; 
			 	 				break;
			case "intphone":	if(!isInternationalPhoneNumber(sVal))
				  			       sFeedback="Invalid International Phone Number"; 
			 	 				break;
 			case "zip":         if(!isZIPCode(sVal))
				  				   sFeedback="Invalid pOST code";
			 	 				break;
 			case "state":		if(!isStateCode(sVal))
				  				   sFeedback="Invalid County Code";
			 					break;
 			case "email":       if(!isEmail(sVal))
				   				   sFeedback="Invalid Email Address";
			 	 				break;
 			case "year":		if(!isYear(sVal))
				  				   sFeedback="Invalid Year";
			 	 				break;
 			case "range":
			 	 break;
			case "month": 		if(!isMonth(sVal))
				  				   sFeedback="Invalid Month";
			 	 				break;
			case "day":			if(!isDay(sVal))
				  				   sFeedback="Invalid Day";
			 	 				break;
 			case "date":		if(!isDate(sVal))
				  				   sFeedback="Invalid Date";			 	 
								break;
			case "currency":
			 	 break;
 			
 			case "phone":
			 	 break;
 			case "text":
			 	 break;
 			case "textandnum":
			 	 break;
			case "website":
			 	 break;
			case "datetime":
			 	 break;
 			case "name":
			 	 break;
 			case "password":
			 	 break;
 			case "confirm":
			 	 break;*/
			
		}
	}
			// after validation is complete return the feedback 
	if(sFeedbackLoc)		
	document.getElementById(sFeedbackLoc).innerHTML = sFeedBack;
}

