	/** Desc:  These are the RegExps that are used to validate the field scheme's and the credit cards.  The function below checkForm
	will loop through all the form values and check them for a field called required if it's there it checks it to make sure that it is 
	not blank and that the scheme matches it's content.  
	
	Special: 
		Email can validate against another field so that there is an email and an email confirm.  Credit Cards
		need to have both the Number and the Type sent to the credit card function in order to check it
	
	Author: Dustin S. Tinney
	Date:	05/25/03		
	*/
	
	var formSchemes = {
		email:/^[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/,
		zipcode:/^\d{5}(-\d{4})?$/,
		integer:/^-?\d+$/,
		floats:/^-?\d*\.?\d*$/,
		quarters:/^\d*((\.0)|(\.00)|(\.25)|(\.5)|(\.50)|(\.75))?$/,
		socialsecurity:/^\d{3}-\d{2}-\d{4}$/,
		telephone:/^\d{3}-\d{3}-\d{4}$/,
		date:/^\d{2}\/\d{2}\/\d{4}$/,
		listserve:/^[a-zA-Z0-9\-\_]*$/,
		currency:/^\$?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{1,2}){0,1}$/,
		gnumber:/^G\d{8}$/,
		foap:/^\d{6}-\d{5}-\d{4}-\d{3}$/,
		macaddress:/^[a-zA-Z0-9][a-zA-Z0-9]\-[a-zA-Z0-9][a-zA-Z0-9]\-[a-zA-Z0-9][a-zA-Z0-9]\-[a-zA-Z0-9][a-zA-Z0-9]\-[a-zA-Z0-9][a-zA-Z0-9]\-[a-zA-Z0-9][a-zA-Z0-9]$/
	}
		
	var cards = {
		visa:/^4\d{15}$/,
		masterCard:/^5[12345]\d{14}$/,
		discover:/^6011\d{12}$/,
		amEx:/^3[47]\d{13}$/
	}
		
	function checkForm(form){		
		for(var i = 0; i < form.length; i++) {
			
			//check if the field needs validation based on validate on and validate off
			if( hasValidation( form[i] ) ) {
				validationAdd( form[i], form );
			}
			
			if( isRequired(form[i]) && isBlank(form[i])) {
				dspError( form[i] );
				form[i].focus();
				return false
			}
			
			if( ! isBlank(form[i]) && ! checkScheme(form[i], form) ) {
				dspError( form[i] );
				form[i].focus();
				return false
			}	
			
			if( ! isBlank(form[i]) && typeof( form[i].getAttribute('validateEmail') ) == 'string' && ! validateEmail(form[i], form[form[i].getAttribute('validateEmail')]) ) {
				dspError( form[i] );
				form[i].focus();
				return false
			}	
		} 		
		
		return true
	}
	
	function validationAdd( formField, form ) {
		
		if( formField.getAttribute('validateOff') != null ) {
			if( isNull( form[formField.getAttribute( 'validateOff' )] ) ) {
				formField.setAttribute("required", "True");
			} else {
				formField.setAttribute("required", "False");
			}
		} else if ( formField.getAttribute('validateOn') != null ){
			//if the field is not null then we want to turn on our required
			if( isNull( form[formField.getAttribute( 'validateOn' )] ) ) {
				formField.setAttribute("required", "False");
			} else {
				formField.setAttribute("required", "True");
			}
		}
	}
	/*
	function validationRemove( formField ) {
		if( formField.getAttribute('validateOff') != null ) {
			formField.required = "True";
		} else if ( formField.getAttribute('validateOn') != null ){
			formField.required = "False";
		}
	}*/
	
	//returns true/false if a form has validationOn or validationOff set
	function hasValidation( formField ) {
		if( formField.getAttribute('validateOff') != null || formField.getAttribute('validateOn') != null)
			return true
		return false
	}
	
	
	function setValidationOn ( ) {
		
	}
	
	function setValidationOff ( ) { 
		
	}
	
	function checkScheme( formField, form ) {
		//if the scheme is defined and is not a credit card we'll check it. 
		if(typeof( formField.getAttribute('scheme') ) == 'string' 
				&& formField.getAttribute('scheme') != 'creditcard') {
			return formSchemes[formField.getAttribute('scheme')].test(formField.value)
		}	else if(typeof( formField.getAttribute('scheme') ) == 'string' 
						&& formField.getAttribute('scheme') == 'creditcard'
						&& typeof( formField.getAttribute('cardTypeField') ) == 'string') {
			return checkCard( formField.value, form[formField.getAttribute('cardTypeField')].value );  //if scheme is defined and is a credit card we'll check it by calling the check card function
		}
		return true
	}
	
	function validateEmail( formField1, formField2 ) {
		if(formField1.value == formField2.value)
			return true
		return false
	}
	
/**
  *if buttonNumber is undefined we can assume there is only 
  *one radio button and that we should check just that one
  *otherwise we Loop through all the buttonNumbers and check if they are checked.
  *if one is checked then we will return False because the field is 
  *not blank
 **/
	function isChecked( formField ) {
		var buttonName = formField.name;
		var form = formField.form;
		var button = form[buttonName];
		var buttonNumber = button.length;
		var isChecked = false;
//if buttonNumber is undefined Radio button only has one option
		
		if(!buttonNumber) {
			if(button.checked)
				isChecked = true;
		} else {
			for(var i=0; i < buttonNumber; i++) {
				if(button[i].checked)
					isChecked = true;
			}
		}
		return isChecked;
	}
		
	function isBlank( formField ) {
		var returnVal = false;
		
		switch(formField.type) {
			case "radio":
				if( !isChecked( formField ) ) 
					returnVal = true;
				break;
			
			case "text":
				if( !formField.value ) 
					returnVal = true;
				break;
			
			case "checkbox":
				if( !isChecked( formField ) ) 
					returnVal = true;
				break;
			
			default:
				if( !formField.value ) 
					returnVal = true;
				break;
		}		
		return returnVal
	}
	
	function isRequired( formField ) {
		if( formField.getAttribute('required') == 'True' || formField.getAttribute('required') == 'true' )
			return true
		return false
	}
	
	function isNull( formField ) {
		var returnVal = false;
		
		switch(formField.type) {
			case "radio":
					returnVal = !formField.checked;
				break;
			
			case "text":
				if( !formField.value ) 
					returnVal = true;
				break;
			
			case "checkbox":
					returnVal = !formField.checked;
				break;
			
			default:
				if( !formField.value ) 
					returnVal = true;
				break;
		}		
		return returnVal
	}
	
	
	/*Creditcard validation*/
	function checkCard(cardNbr, cardType) 
	{
		if ((cards[cardType].test(cardNbr)) == true) {
			return checkMod10(cardNbr);
		}
		return false;
	}
	
	function checkMod10(cardNbr) 
	{
		
		var i = 0;
		var multipleOfTwo = false;
		var total = 0;
		var curNbr = 0;
		var addingNbr = 0;
		//Loop until there are no more numbers in the credit card number
		for(i=cardNbr.length-1; i>=0; i--)
		{
			
			//Determines if the current number is supposed to be multiplied by 2 or not
			if(multipleOfTwo == false)
			{
				addingNbr = cardNbr.charAt(i);
				multipleOfTwo = true;
				//alert(cardNbr.charAt(i));
			}
			else
			{
				if (cardNbr.charAt(i) >= 5) {
					if(cardNbr.charAt(i) == 5) {
						curNbr = 1;
					}
					if(cardNbr.charAt(i) == 6) {
						curNbr = 3;
					}
					if(cardNbr.charAt(i) == 7) {
						curNbr = 5;
					}
					if(cardNbr.charAt(i) == 8) {
						curNbr = 7;
					}
					if(cardNbr.charAt(i) == 9) {
						curNbr = 9;
					}
				} else {
					curNbr = (cardNbr.charAt(i)*2);
				}
				//sets second to false, indicating that the next number is not to be modified
				total += (parseInt(addingNbr) + parseInt(curNbr));
				multipleOfTwo = false;
			}		
		} 
		
		if(total % 10 == 0) {
			return true;
		}
		return false;
	}
	
	/** This is where the error information is processed and displayed 
	there are 3 types of errors.  
	1. Message, will print the message
	2. If the generalName is defined it will print Please adjust values...  
	3.  Last it will just print "Error on form" */
	function dspError( formField ) {
		if( typeof(formField.getAttribute('message')) == 'string') {
			alert(formField.getAttribute('message'));
		} else 
		
		if( typeof(formField.getAttribute('generalName')) == 'string') {
			alert("Please adjust values in " + formField.getAttribute('generalName'));
		} else
			alert("Error on form");
	}