/*
Name:   validations.js
Author: Robert Parlato
E-Mail: Robert@Parlato.com
Web:    www.parlato.com

Example of use:

<HTML>
<HEAD>
<TITLE>Parlato.com? - IT Consulting Services</TITLE>
<SCRIPT LANGUAGE="JavaScript" SRC="javascripts/validations2.js" TYPE="text/javascript"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
function validateForm() {
  var eltNames = new Array(
    document.moreInfo.ContactName,
    document.moreInfo.CompanyName,
    document.moreInfo.Address,
    document.moreInfo.City,
    document.moreInfo.Zip,
    document.moreInfo.AreaCode,
    document.moreInfo.Phone,
    document.moreInfo.ContactEmail
  );
  var eltTypes = new Array(
    'Alpha',
    'AlphaNumeric',
    'AlphaNumeric',
    'Alpha',
    'ZipCode',
    'AreaCode',
    'Phone',
    'Email'
  );  
  var eltRequired = new Array(
    'required',
    'required',
    'required',
    'required',
    'required',
    'required',
    'required',
    'optional'
  );
  return (doValidations(eltNames,eltTypes,eltRequired));
}
</SCRIPT>
</HEAD>
<BODY>
<FORM METHOD="Post" NAME="moreInfo" ACTION="" onSubmit="return validateForm();">
<INPUT TYPE="text" NAME="ContactName" ID="Contact Name">
<INPUT TYPE="text" NAME="CompanyName" ID="Company Name">
<INPUT TYPE="text" NAME="Address" ID="Address">
<INPUT TYPE="text" NAME="City" ID="City">
<INPUT TYPE="text" NAME="" ID="Zip Code">
<INPUT TYPE="text" NAME="AreaCode" ID="Area Code">
<INPUT TYPE="text" NAME="Phone" ID="Phone">
<INPUT TYPE="text" NAME="ContactEmail" ID="Contact Email">
</FORM>

</BODY>

*/

var errorStr = '';

//Begin field validation.
function doValidations(flds, types, required) {
  var errorMsg = new Array();
  var errorFlds = new Array();
  for (var i=0; i<flds.length; i++) {
    if (types[i]=='Alpha')
      if (!validateCharacters(flds[i], 'Alpha', required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;  
    if (types[i]=='NotBlank')
      if (validateNotBlank(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+"Blank Value not allowed.";     
    if (types[i]=='AlphaNumeric')
      if (!validateCharacters(flds[i], 'AlphaNumeric', required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;      
    if (types[i]=='Numeric')
      if (!validateCharacters(flds[i], 'Numeric', required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;             
    if (types[i]=='AreaCode')
      if (!validateAreaCode(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;
    if (types[i]=='Phone') 
      if (!validatePhone(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;  
    if (types[i]=='AreaCodePhone') 
      if (!validateAreaCodePhone(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;          
    if (types[i]=='Email')
      if (!validateEmail(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;  
    if (types[i]=='ZipCode')
      if (!validateZipCode(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;
    if (types[i]=='DateYesYes')
      if (!validateDate(flds[i],'yes','yes', required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr; 
    if (types[i]=='DateYesNo')
      if (!validateDate(flds[i],'yes','no', required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;        
    if (types[i]=='SSN')
      if (!validateSSN(flds[i], required[i]))
        errorMsg[errorMsg.length]=flds[i].id+" - "+errorStr;           
    if (types[i]=='YYYY')
      if ( (!validateLength(flds[i], 4)) || (!validateCharacters(flds[i], 'Numeric')) )
        errorMsg[errorMsg.length]=flds[i].id+" - "+"Year must be 4 digits."; 
    if (types[i]=='Radio')
      if (!validateRadio(flds[i])) {
        fldid = flds[i][0].id;
        errorMsg[errorMsg.length]=fldid+" - "+errorStr;    //.substr(1)
      }
           
    errorStr = '';  
  } 
  return displayErrorMsgs(flds, errorMsg);
}


//Check if value is blank.
function isBlank(elt) {
  var val=trimString(elt.value);
  if (val.length==0) {
    errorStr = "Blank Value not allowed.";
    return true;
  }
}

//Validate NotBlank.
function validateNotBlank(elt, required) {
  if (required=="required") {
    return isBlank(elt);
  }
  else {
   if (elt.value.length==0)
    return false;
  }
}

//Validate entry length.
function validateLength(elt,len) {
  return ((elt.value.length != len)?false:true);
}

//Validate Radio.
function validateRadio(elt) {
  for (var i=0;i<elt.length;i++) {
    if (elt[i].checked) {
      return true;
    }
  }
  errorStr = "Selection required.";
  return false;
}

//Validate US 5 digit Zipcode format
function validateZipCodeOld(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
  if ( (!validateLength(elt, 5)) || (!validateCharacters(elt, 'Numeric')) ) {
    errorStr = 'Invalid Zip Code.';
    return false;
  }
  return true;  
}

//Validate US 5 digit Zipcode format
function validateZipCode(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
  var str = elt.value;
  var val ='';
  for (var i=0; i<elt.value.length; i++)
    if((str.charAt(i)>='0') && (str.charAt(i)<='9'))
      val = val+str.charAt(i);
  if ((parseInt(val).toString().length!=5) && (parseInt(val).toString().length!=9)) {
    errorStr = 'Invalid Zip Code.';
    return false;
  }
  else {  
    if (parseInt(val).toString().length==9)
      elt.value = val.substring(0,5)+"-"+val.substring(5,val.length);
    return true;   
  }
}  

//Validate US Phone Area Code format.
function validateAreaCode(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
  if ( (!validateLength(elt, 3)) || (!validateCharacters(elt, 'Numeric')) ) {
    errorStr = 'Invalid Area Code.';
    return false;
  }
  return true;  
}

//Validate US Phone format
function validatePhone(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  } 
  var str = elt.value;
  var val ='';
  for (var i=0; i<elt.value.length; i++)
    if((str.charAt(i)>='0') && (str.charAt(i)<='9'))
      val = val+str.charAt(i);
  if ((parseInt(val).toString().length!=7) && (parseInt(val).toString().length!=10)) {
    errorStr = 'Invalid Phone Number.';
    return false;
  }
  else {  
    if (parseInt(val).toString().length==7)
      elt.value = val.substring(0,3)+"-"+val.substring(3,val.length);
    if (parseInt(val).toString().length==10)
      elt.value = val.substring(0,3)+"-"+val.substring(3,6)+"-"+val.substring(6,val.length);
    return true;   
  }
}

//Validate US Phone format
function validateAreaCodePhone(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  } 
  var str = elt.value;
  var val ='';
  for (var i=0; i<elt.value.length; i++)
    if((str.charAt(i)>='0') && (str.charAt(i)<='9'))
      val = val+str.charAt(i);
  if (parseInt(val).toString().length!=10) {
    errorStr = 'Invalid Phone Number.';
    return false;
  }
  else {  
    if (parseInt(val).toString().length==10)
      elt.value = val.substring(0,3)+"-"+val.substring(3,6)+"-"+val.substring(6,val.length);
    return true;   
  }
}


//Validate SSN format
function validateSSN(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
  var str = elt.value;
  var val ='';
  for (var i=0; i<elt.value.length; i++)
    if (str.charAt(i)!='-') 
      val = val+str.charAt(i);
  if (parseInt(val).toString().length!=9) {
    errorStr = 'Invalid Soc.Sec. No.';
    return false;
  }
  else {
    elt.value = val.substring(0,3)+"-"+val.substring(3,5)+"-"+val.substring(5,val.length);
    return true;   
  }
}

//Check for Characters only.
function validateCharacters(elt,type,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
  var valid = 'abcdefghijklmnopqrstuvwxyz .,-&';
  if (type=='Numeric')
    valid='0123456789'  
  if (type=='AlphaNumeric')
    valid='abcdefghijklmnopqrstuvwxyz .,-0123456789';
  var temp='';
  for(var i=0; i<elt.value.length; i++){
    temp=''+elt.value.substring(i, i+1).toLowerCase();
    if (valid.indexOf(temp)=='-1') {
      if (type=='Alpha')
        errorStr = 'Characters Only.';
      if (type=='Numeric') 
        errorStr = 'Numbers Only.';
      if (type=='AlphaNumeric')
        errorStr = 'Characters or Numbers Only.';
      return false;
    }
  }
	return true;
}

//Check Dollar format with or without decimals and
// remove any commas or $.
function ValidateDollar(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
	var val='';
  var amt=elt.value;
		for(i=0;i<amt.length;i++){
			if((amt.charAt(i)>='0') && (amt.charAt(i)<='9')){
				val=val+amt.charAt(i);
			} 
			else{
				if(amt.charAt(i)=='.')
					val=val+amt.charAt(i)
				else
			 		if(amt.charAt(i)!=',') 
						errorMsg(elt,'Not a proper Dollar value.\n \n Only numbers, commas, and decimals are allowed in this field');
			}	
		}
	elt.value = val;	
	return true;
}

//Validate E-Mail.
function validateEmail(elt,required) {
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }   
  var emailStr = elt.value;
  var checkTLD=1;
  var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
  var emailPat=/^(.+)@(.+)$/;
  var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
  var validChars="\[^\\s" + specialChars + "\]";
  var quotedUser="(\"[^\"]*\")";
  var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
  var atom=validChars + '+';
  var word="(" + atom + "|" + quotedUser + ")";
  var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
  var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
  var matchArray=emailStr.match(emailPat);
  if (matchArray==null) {
    errorStr = "Email address seems incorrect.";
    return false;
  }
  var user=matchArray[1];
  var domain=matchArray[2];
  for (i=0; i<user.length; i++) {
    if (user.charCodeAt(i)>127) {
      errorStr = "Ths username contains invalid characters.";
      return false;
   }
  }
  for (i=0; i<domain.length; i++) {
    if (domain.charCodeAt(i)>127) {
      errorStr = "Ths domain name contains invalid characters.";
      return false;
    }
  }
  if (user.match(userPat)==null) {
    errorStr = "The username doesn't seem to be valid.";
    return false;
  }
  var IPArray=domain.match(ipDomainPat);
  if (IPArray!=null) {
    for (var i=1;i<=4;i++) {
      if (IPArray[i]>255) {
        errorStr = "Destination IP address is invalid!";
        return false;
      }
    }
    return true;
  }
  var atomPat=new RegExp("^" + atom + "$");
  var domArr=domain.split(".");
  var len=domArr.length;
  for (i=0;i<len;i++) {
    if (domArr[i].search(atomPat)==-1) {
      errorStr = "The domain name does not seem to be valid.";
      return false;
    }
  }
  if (checkTLD && 
      domArr[domArr.length-1].length!=2 && 
      domArr[domArr.length-1].search(knownDomsPat)==-1) {
    errorStr = "Email addresses must end in a \nwell-known domain or two letter " + "country.";
    return false;
  }
  if (len<2) {
    errorStr = "This Email address is missing a hostname!";
    return false;
  }
  return true;
}

//Check for Valid Dates
//Example: dateValidation(this,'no','yes','required')
function validateDate(elt,allowPastDates,allowFutureDates,required){
  if (required=="required") {
    if (isBlank(elt))
      return false;
  }
  else {
   if (elt.value.length==0)
    return true;
  }
	var msg='';
	var now=new Date();	
  var datePattern = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2,4})$/; //valid format m[m]/d[d]/yy[yy]. [] = optional values
	var today=new Date(now.getFullYear(),now.getMonth(),now.getDate());	
	var allowPastDates=allowPastDates.toLowerCase();
	var val=elt.value;
	var matchArray=val.match(datePattern);
	if (matchArray==null) {
		errorStr='The date entered is not in a \n valid format. \n\n Valid Format: (m[m]/d[d]/yy[yy]) \n\n [] = optional values';
    return false;
  }
	month=matchArray[1];
  day=matchArray[3];
	year=matchArray[4];

  if(year.length<3) 
    year = parseInt(currentYear).toString().substring(0,2)+year;
    
	var date=new Date(year,month-1,day); 
	if((eval(month)<1)||(eval(month)>12)) {
		errorStr='Month must be between 1 and 12'; 
    return false;
  }
	if((eval(day)<1)||(eval(day)>31)) {
		errorStr='Day must be between 1 and '+daysInMonth(eval(month)-1,eval(year)); 
    return false;
  }
 	if((month==4||month==6||month==9||month==11)&&day==31){
 		if(month==4) monthName='April';
		if(month==6) monthName='June';
		if(month==9) monthName='September';
		if(month==11) monthName='November';
		errorStr=monthName+' doesn\'t have 31 days!';
    return false;
 	}
 	if(month==2){
  	var isleap=(year%4==0&&(year%100!=0||year%400==0));
  		if (day>29||(day==29&&!isleap)) {
				errorStr='February '+year+' doesn\'t have '+day+' days!';
        return false;
      }
 	}
	if(allowPastDates=='no'){
		if(date<today) {
			errorStr='The date you entered occurs in the past. \n Please re-enter a date that is equal to \n'+
									 'or greater than today';
      return false;
   }                
	}
  
 if(allowFutureDates=='no'){
		if(date>today) {
			errorStr='The date you entered occurs in the future. \n Please re-enter a date that is equal to \n'+
		  						 'or less than today';
      return false;
    }                   
	}	
   
  elt.value=formatDate(date,"MM/dd/yyyy");
   
  return true;
}


//Display error messages
function displayErrorMsgs(flds, errorMsg) {
  if (errorMsg.length==0)
    return true;
  var msg = '\n___________________________________\n\n';
  for (var i=0; i<errorMsg.length; i++) {
    msg = msg + errorMsg[i]+'\n';
  }
  msg = 'Please correct the following errors' + msg+
  '\n___________________________________\n\n';
  alert(msg);
  for (var i=0; i<flds.length; i++)
    if ( (errorMsg[0].substring(0, errorMsg[0].indexOf("-")-1)) == flds[i].id ) {
      if (flds[i].type=='text')
        flds[i].select();
      else
        flds[i].focus();
      break;
    }
  return (errorMsg.length>0?false:true);
}

function clearErrorColors(elt) {
      elt.style.backgroundColor='White'; 
      elt.style.color='Black'; 
}
