/***************************
* Copyright Dealer.com Websystems
* validation.js
* author: ScottyG
* modified: 7.27.01
* REQUIRED:
*    Array called 'required'
* USAGE:
*    var required = new Array( "field1", "field2", .... "fieldn" );
*    var normalized = new Array( "field1", "field2", .... "fieldn" );
*    <a href="validate( 'Please fill in [formElement]' );">Submit</a>
*        (instead of submitting the form, you can call whatever function you want)
***************************/
if(!formElementNames) var formElementNames=new Array();
var normalized=new Array();
var required=new Array();

document.onkeydown = keyControl;
// if (window.captureEvents) window.captureEvents(Event.KEYPRESS);

//quick browser test
isNS6=false;isNS=false;isIE=false;isNS4=false;
if( navigator.appName.indexOf("Netscape")!=-1) {
	isNS=true;
	if(parseFloat(navigator.appVersion)>4.9) isNS6=true;
	else isNS4=true;
} else {
	isIE=true;
}

function setRequiredFields() {
	required = setRequiredFields.arguments;
}

function setNormalizedFields() {
	normalized = setNormalizedFields.arguments;
}

function defineElementName(elementName, description) {
	if(!description) description=formatDescription(elementName);
	formElementNames[formElementNames.length]=new Array(elementName,description);
}

function normalizeFields( formName ) {
  // required: normalized array
  var formRef = (formName)?formName:document.forms[0];
	ln = normalized.length;
	for( i=0; i<ln; i++) {
			elm=formRef.elements[normalized[i]];
			tmp = elm.value;
			if(elm.type=="select-one") {
				elm.options[elm.selectedIndex].value = tmp.replace(/[$,]/g,"");
			} else {
				formRef.elements[normalized[i]].value = tmp.replace(/[$,]/g,"");
			}
	}
}

function validate( msg, formName ) {
	passedValidation = true;
	formRef = (formName)?formName:document.forms[0]; // MUST BE GLOBAL, DO NOT ADD VAR
	msg = (msg)?msg:"Please Enter a Valid [formElement]";

	var reqFields;
	if (eval('typeof(required'+formRef.name+')') != 'undefined') { reqFields = eval('required'+formRef.name); }
	else { reqFields = required; }

	ln = reqFields.length;

	for( i=0; i<ln; i++) {
			if(!formRef.elements[reqFields[i]]) {
				continue;
			}

			if( formRef[reqFields[i]].length && formRef[reqFields[i]][0].type == 'radio' ) {
				var radioChecked = false;
				for(j = 0; j < formRef[reqFields[i]].length; j++) {
					if (formRef[reqFields[i]][j].checked == true) {
						radioChecked = true;
						break;
					}
				}
				if (!radioChecked) {
					alert(formatMessageInput('Please click one of the radio buttons for [formElement]',reqFields));
					return;
				}
				continue;
 			}

			if( reqFields[i].toLowerCase().indexOf("authorize")!= -1 ) {
				if((!formRef[reqFields[i]].checked) && ((formRef[reqFields[i]].value == "") || (formRef[reqFields[i]].value == "true"))) {
					alert("We cannot submit this form without your authorization.\nThank You");
					return;
				}
				continue;
			}

			if( formRef.elements[reqFields[i]].value == "" ) {
					alert( formatMessageInput(msg,reqFields) );
					return;
			}

      if( reqFields[i].toLowerCase().indexOf("phone") != -1 ) {
        if( !isPhoneNumber( formRef.elements[reqFields[i]] ) ){
            alert( formatMessageInput("Please enter a valid [formElement].\nThank you.",reqFields) );
            return;
        }
      }

      if( reqFields[i].toLowerCase().indexOf("email") != -1 ) {
          if( !isEmail( formRef.elements[reqFields[i]] ) ){
            alert("Please enter a valid email address.\nThank you.");
						return;
        }
      }

      if( reqFields[i].toLowerCase().indexOf("postalCode") != -1 ){
          if( !isZipcode( formRef.elements[reqFields[i]] ) ){
            alert("Please enter a valid zipcode.\nThank you.");
            return;
        }
      }

			if( reqFields[i].toLowerCase().indexOf("dob") != -1 ) {
				if( !isDate( formRef.elements[reqFields[i]] ) ) {
					alert(formatMessageInput("Please enter a valid value for [formElement]\n(MM/DD/YYYY)",reqFields));
					return;
				}
			}

      if (reqFields[i].toLowerCase().indexOf("contact.password") > -1) {
				if (formRef.elements['contact.password'].value != formRef.elements['contact.passwordConfirm'].value) {
					alert('Your password does not match what you typed in the \'Confirm Password\' box.');
					return;
				}
			}

	}
	normalizeFields( formRef );
	for (i = 0; i < formRef.elements.length; i++) {
		if (formRef.elements[i].disabled) { formRef.elements[i].disabled = false; }
	}
	formRef.submit();
}

function keyControl(e) {
	if (!e) var e = window.event
	if(e.keyCode==13) {
		return false;
	}
}

function validatePassword( plength, formName ) {
  var formRef = (formName)?document.forms[formName]:document.forms[0];

  if( formRef.password.value.length < plength ){
      alert("Your password must be at least "+plength+" characters.\nThank you.");
      return false;
  }

  if( formRef.password.value != formRef.passwordconfirm.value ){
      alert("Your password must match your confirmation password.\nThank you.");
      return false;
  }
  return true;
}

function isEmail( elm ) {
	elm.value = elm.value.replace(/ /g,'');
	if(isNS4) return checkEmailNS4( elm.value );
  var str = elm.value;
  var notValidEmail = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)/;
  var validEmail = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$/;
  if (!notValidEmail.test(str) && validEmail.test(str)) { // if syntax is valid
    return true;
  }
  return false;
}

function checkEmailNS4( emailText ) {
	if( emailText.indexOf("@") > -1 && emailText.indexOf(".") > -1 ) {
		if( ((emailText.length-emailText.lastIndexOf("."))-1) <= 3 ) {
			return true;
		}
	}
	return false;
}

// make more generic
function isOnePhone( formName ){
  var formRef = (formName)?document.forms[formName]:document.forms[0];

  // one phone number
  if( formRef.dayphone.value == "" && formRef.eveningphone.value == "" ){
      alert("Please fill in at least one phone number you can be reached at.\nThank You");
      return false;
  }else if( formRef.dayphone.value != "" ){
      if( !isPhoneNumber( formRef.dayphone ) ){
          alert("You have entered an invalid day phone number, please enter a valid one.\nThank You.");
          return false;
      }
  }else if( formRef.eveningphone.value != "" ){
      if( !isPhoneNumber( formRef.eveningphone ) ){
          alert("You have entered an invalid evening phone number, please enter a valid one.\nThank You.");
          return false;
      }
  }
  return true;
}

function isPhoneNumber( elm ){
  elm.value = elm.value.replace( /\s/g, "-" );
  elm.value = elm.value.replace( /\./g, "-" );

  if( elm.value.length < 7 )
      return false;

  if( elm.value.length == 7 && elm.value.indexOf("-") != -1 )
      return false;

  if( elm.value.length == 7 && elm.value.indexOf("-") == -1 &&
      elm.value.indexOf("x") == -1 ){
      elm.value = elm.value.substring(0,3) +"-"+ elm.value.substring(3);
  }

  if( elm.value.length == 10 && elm.value.indexOf("-") == -1 &&
      elm.value.indexOf("x") == -1 ){
      elm.value = elm.value.substring(0,3) +"-"+ elm.value.substring(3,6) +"-"+
                  elm.value.substring(6);
  }

  if( elm.value.length == 11 && elm.value.indexOf("-") == -1 &&
      elm.value.indexOf("x") == -1 ){
      elm.value = elm.value.substring(0,1) +"-"+ elm.value.substring(1,4) +"-"+
                  elm.value.substring(4,7) +"-"+ elm.value.substring(7);
  }
  return true;
}

function isZipcode( elm ){
  value = elm.value;
  if( value.length < 5 )
      return false;
  return true;
}

// Is it A positive integer?
function isNumber( elmstr ) {
  if (elmstr == "") {
      return false;
  }

  for (var i = 0; i < elmstr.length; i++) {
    if (elmstr.charAt(i) < "0" || elmstr.charAt(i) > "9") {
        return false;
    }
  }
  return true;
}

function isDate( objRef ) {
	var objRegExp1 = /^\d{1,2}\D\d{1,2}\D(\d{2}){1,2}$/
	var objRegExp2 = /^\d{8}$/
	var objRegExp3 = /^\d{6}$/

	if ((objRegExp1.test(objRef.value)) || (objRegExp2.test(objRef.value)) || (objRegExp3.test(objRef.value))) {
		var arrayDate = new Array();
		if (objRegExp1.test(objRef.value)) { arrayDate = objRef.value.split(/\D/); }
		else {
			arrayDate[0] = objRef.value.substring(0,2);
			arrayDate[1] = objRef.value.substring(2,4);
			arrayDate[2] = objRef.value.substring(4);
		}
		var intMonth = parseInt(arrayDate[0],10); // specify base 10, otherwise strings begining with 0 are parsed as octals
		var intDay = parseInt(arrayDate[1],10);
		var intYear = arrayDate[2];
		if (intYear.length == 2) {
			var curYear = (new Date().getFullYear() - 2000);
			intYear = ((parseInt(intYear) > (curYear + 5))?'19':'20') + intYear;
		}

		var arrayLookup = { 1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31 }
		var monthMax = arrayLookup[intMonth];
		if ((intDay) && (monthMax != null)) {
			if ((intMonth == 2) && !(intYear % 4)) { monthMax++; }
			if (intDay <= monthMax) {
				objRef.value = ((intMonth <= 9)?'0':'')+intMonth+'/'+((intDay <= 9)?'0':'')+intDay+'/'+intYear;
				return(true);
			}
		}
	}
	return(false);
}
/* old isDate function, replaced 8/5/05 -wick
function isDate( elm ) {
	value=elm.value;
	slashPos=new Array(value.indexOf("/"),value.substring(value.indexOf("/")+1,value.length).indexOf("/")+value.indexOf("/")+1);
	if(slashPos[0]==-1 || slashPos[1]==-1) return false;
	month=value.substring(0,slashPos[0]);
	day=value.substring(slashPos[0]+1,slashPos[1]);
	year=value.substring(slashPos[1]+1,value.length);
	if(month.length<2) month="0"+month;
	if(day.length<2) day="0"+day;
	if(year.length==2) year="19"+year;
	value=month+"/"+day+"/"+year;
	if( parseInt(month)<0 || parseInt(month)>12 || parseInt(day)<0 || parseInt(day)>32
	|| parseInt(year)<0 || parseInt(year) > 2010) return false;
	if( value.length!=10 ) return false;
	else if( value.charAt(2)!="/" ) return false;
	else if( value.charAt(5)!="/" ) return false;
	else {	elm.value=value;return true; }
}
*/

function formatMessageInput( message,reqFields ) {
	if (!reqFields) { reqFields = required; }
	formElementNames.length;
	elementName=findElementName(reqFields[i]);
	if( elementName ) message = message.substring(0,message.indexOf("[formElement]"))+ elementName +message.substring(message.indexOf("[formElement]")+13,message.length);
	else message = message.substring(0,message.indexOf("[formElement]"))+formRef.elements[reqFields[i]].name+message.substring(message.indexOf("[formElement]")+13,message.length);
	return message;
}

function formatDescription( name ) {
	retVal=name.charAt(0).toUpperCase();
	for(i=1;i<name.length;i++) {
		if( /[A-Z]/.test(name.charAt(i)) )
			retVal+=" "+name.charAt(i);
		if(name.charAt(i-1)==".") {
			retVal+=name.charAt(i).toUpperCase();
		} else {
			retVal+=name.charAt(i);
		}
	}
	return retVal.replace("."," ");
}

function findElementName(eleName) {
	for(k=0;k<formElementNames.length;k++) {
		if(formElementNames[k][0]==eleName) return formElementNames[k][1];
	}
	return false;
}

function scrubNumber(num) {
	return(num.replace(/[$,]/g,'').replace(/^.*?(\d+).*/,'$1').replace(/\D/g,''));
}
