/* ********************************************************************
This script provides reusable form-value validity definitions.  Test
against these definitions in order to recieve back as value of 
True or False. These methods return a boolean value, and if a value is
deemed invalid, getErrMsg() car be called to return the relevent error 
messange. Note that methods whose named begin with an underscore are 
considered to be support methods.  If written as a class, these methods
would have been signed as private methods.

00. getErrMsg(value)
01. validEmail(value)
02. validPassword(value)
03. validName(value)
04. validAddress(value)
05. validZip(value)
06  validPhone(value)
07. validURL(value)
08. validCreditCard(value)
09. validMaxLength(value,maxLen)
10. validMinLength(value,minLen)
11. validLength(value,maxLen,minLen)
12. validPrice(value)
13. validDate(value)
14. previousDate(today, dateToCompare)
15. _isNumber(value)
16. _isCharsOnly(value)
17. _containsVowels(value)
18. _validCharVariety(value)
19. _luhnCheckDigit(value)
20. _numberStrip(value)

******************************************************************** */
 var errMsg;   		//Error message contained here. 
 var MinChars = 2; 	//Default minumum characters for a field.
 
 
 function getErrMsg(value) {
 //Takes context information as an optional parameter to
 // build up an error message to send back to client.
 
    temp = "Form Validation Error : " + value + " -\r" + errMsg;
    return(temp)
 }
 
 function validEmail(value) {
 //Valid email address contains "@", ".", and at least characters.
  StrObj = new String(value); 
  if (!(StrObj.length >=5 && StrObj.match("@") && StrObj.match("."))){
   errMsg = "'" + value + "' is not a valid email address.";
   return(false);
  }else{
   return(true);
  }
 }
 
 function validPassword(value) {
  StrObj = new String(value); 
  if (!(StrObj.length >= MinChars)){
   errMsg = "'" + value + "' is not a valid password. Please provide a password that is at least " + MinChars + " character in length.";
   return(false);
  }else{
   return(true);
  }
 }

 function validName(value) {
  StrObj = new String(value); 
  if (!(StrObj.length >= MinChars)){
   errMsg = "'" + value + "' is not a valid name name that is at least " + MinChars + " characters in length.";
   return(false);
  }else{
   if (!(_containsVowels(value)))  {return(false)}
   else if (!(_validCharVariety(value))){return(false)}
   else {return(true)}
  }
 }

 function validAddress(value) {
 //not done
  StrObj = new String(value); 
  if (!(StrObj.length >= 5)){
   errMsg = "'" + value + "' is not a valid street address.";
   return(false);
  }else{
   if (!(_validCharVariety(value))){return(false)}
   else {return(true)}
  }
 }

 function validZip(value) {

  var parsedValue = _numberStrip(value);

  if (!(parsedValue.length>=5)){
  	errMsg = "'" + value + "' is not a valid zipCode.";
   	return(false);
  }else{
   	return(true);
  }

 }

 function validPhone(value) {
 //not done
  StrObj = new String(_numberStrip(value)); 
  if (!(StrObj.length > 7 && StrObj.length < 20)){
   errMsg = "'" + value + "' is not a valid phone number.";
   return(false);
  }else{
   return(true);
  }
 }  
 
 function validURL(value) {
 //not done
  StrObj = new String(value); 
  if (!(StrObj.length >= 12 && (StrObj.match("http://")=="http://" || StrObj.match("https://")=="https://"))){
   errMsg = "'" + value + "' is not a valid URL. Please provide a Web address, written as 'http://www.xyz.com'.";
   return(false);
  }else{
   if (!(_validCharVariety(value))){return(false)}
   else {return(true)}
  }
 }

 function validCreditCard(value) {
  StrObj = new String(_numberStrip(value)); 
  if (!(StrObj.length >= 13 && StrObj.length <= 16)){
   errMsg = "'" + StrObj.valueOf() + "' is not a valid credit card number. It must be between 13 and 16 digits in length.";
   return(false);
  }else{
   if (_luhnCheckDigit(StrObj.valueOf())) {return(true);}
   else {return(false)}
  }
 }
 
 function validMaxLength(value, len) {
 //not done
  StrObj = new String(value); 
  if (StrObj.length > len){
   errMsg = "'" + value + "' is too long. Please reduce the length of your input to " + len + " characters.";
   return(false);
  }else{
   return(true);
  }
 }
 
 function validMinLength(value, len) {
 //not done
  StrObj = new String(value); 
  if (StrObj.length < len){
   errMsg = "'" + value + "' is not a valid length. Please provide a value that is it least " + len + " characters.";
   return(false);
  }else{
   return(true);
  }
 }
 
 function validLength(value,minLen,maxLen) {
 //not done
  StrObj = new String(value); 
//var a[]=StrObj.split(" ");
//alert(a.length)
  if (!(StrObj.length <= maxLen && StrObj.length >= minLen)){
   errMsg = "'" + value + "' is not a valid length. Pklease provide a value that is between " + minLen + " and " + maxLen + " characters.";
   return(false);
  }else{
   return(true);
  }
 }

function validPrice(value) {
 //not done
  StrObj = new String(value); 
  if (StrObj.length ==1){
    if (value=="$") {
        errMsg = "'" + value + "' is not a valid price value.";
        return(false);
    }else{
        return(true);
    }
  }else if (StrObj.length == 0) {
    errMsg = "'" + value + "' is not a valid price value.";
    return(false);
  }else{
    return(true);
  }
}

function validDate(value){
//assumes a format of MM/dd/yyyy or MM/dd/yy

	flag = false;	
    aValue = value.split("/");
    iValue = aValue[2] + aValue[0] + aValue[1];

	if (Number(iValue)>0) {
		if (aValue[0].length==2 && aValue[1].length==2 && (aValue[2].length==2 || aValue[2].length==4)) {
			flag=true;
		}
	}
	return flag;
}

 
 function previousDate(	evalDate,today){
    aToday = today.split("/");
    sToday = aToday[2] + aToday[0] + aToday[1];
    aEvalDate = evalDate.split("/");
    sEvalDate = aEvalDate[2] + aEvalDate[0] + aEvalDate[1];
    flag=false;
    if (sToday>sEvalDate){flag=true;}

    return(flag);
 }

 function _isNumber(value) {
 //Will tell if value is a valid number, or a valid
 //number value cast as another datatype (e.g. "1").
 
	 myVal = Number(value);
	 if (isNaN(myVal)) {return(false)}
	 else {return(true)}
 }
 
 function _isCharsOnly(value) {
 //Returns true if String contains only chars of values [a-z]/[A-Z]
 
  StrObj = new String(value);
  for(i=0; i<StrObj.length; i++) {
   if (!(StrObj.charCodeAt(i) >=65 && StrObj.charCodeAt(i) <=122 )) {
    errMsg = "The value '" + value + "' must only contain characters of [a-z]/[A-Z] values.";  
    return(false);
   }
  } 
  return(true);
 }

 function _containsVowels(value) {
 //Ensures a value has meaning by looking for vowels. In some
 //Scenarios this may indicate if the value is valid or not.
 
  vowelArray = new Array("a","e","i","o","u","y","A","E","I","O","U","Y");
  StrObj = new String(value);
  
  for(i=0; i<StrObj.length; i++) {
   for(j=0; j< vowelArray.length; j++) {
    if (StrObj.charAt(i)== vowelArray[j]) {
     return(true);
    }
   }
  } 
  errMsg = "The value '" + value + "' must only contain at least one vowel.";  
  return(false);
 }
 
 function _validCharVariety(value) {
 //If all chars in a string are exactly the same character, chances are 
 //it's not valid.
 
  StrObj = new String(value);
  firstVal = StrObj.charAt(0);
  flag = 0;
 
  if (StrObj.length >=3) {  
   for(i=0; i<StrObj.length; i++) { 
    if (StrObj.charAt(i)==firstVal) {flag++;}
   }
   
   if (flag == StrObj.length) {
   errMsg = "The value '" + value + "' can not simply be a repition of " + flag + " '" + firstVal + "'s.";  
   return(false);
   } else {return(true)}
  }else{
   return(true);
  }
 }
 
 function _luhnCheckDigit(value){ 
 //The luhn Check Digit determines if a CCard is valid or not...mod 10 
 
 if (_getOS()=="Mac" && _getBrowser()=="Explorer"){
    //Do not assess for MSIE.  Cannot push items into array.
    return(true);
 }else{
  StrObj = new String(value);
  oddArray = new Array();  evenArray = new Array();
  var oddTotal; evenTotal=0; var oddTotal; oddTotal=0;

  for(i=0; i<StrObj.length; i++) {
   lclVal = parseInt(StrObj.charAt(i));

   if (i % 2 == 0) {evenArray.push(lclVal);}
   else{oddArray.push(lclVal);}
  }

  if (StrObj.length % 2 == 0) {

   for(i=0; i < oddArray.length; i++) {oddTotal = (oddTotal + oddArray[i])}
   for(i=0; i < evenArray.length; i++) {
    temp = evenArray[i] * 2;
    if (temp >= 10) {temp = temp-9;}
    evenTotal = evenTotal + temp;
   }     

  }else {
   for(i=0; i < evenArray.length; i++) {evenTotal = evenTotal + evenArray[i]}
   for(i=0; i < oddArray.length; i++) {
    temp = oddArray[i] * 2;
    if (temp >= 10) {temp = temp-9;}
    oddTotal = oddTotal + temp;
   }
  }

  total = evenTotal + oddTotal;  
  if (total % 10 ==0) {return(true)}
  else {
   errMsg = "This is not a valid credit card number.";
   return(false)
  }
 }
 }
 
 function _numberStrip(value) {
 //Strip out all non-numeric chars and return an integer.
 
 StrObj = new String(value);
 myStr = "";
  for(i=0; i < StrObj.length; i++) {
   if ((StrObj.charCodeAt(i) >= 48) && (StrObj.charCodeAt(i) <= 57)) {
    myStr=myStr + StrObj.charAt(i); 
   }
  } 
  return(myStr);
 }

function _getBrowser() {
//returns browser name (eg Netscape, Explorer, Opera)

    sRaw    = navigator.userAgent.toLowerCase();
    sType   = "unknown";

    if (sRaw.indexOf("mozilla") !=-1) {sType="Netscape"}
    if (sRaw.indexOf("msie") !=-1) {sType="Explorer"}
    return(sType);
}

function _getOS() {
//Returns OS (eg Mac, win3.1, win95, win98, winNT
    sRaw    = navigator.userAgent.toLowerCase();
    sType   = "unknown";

    if (sRaw.indexOf("mac")!=-1)  {sType="Mac"}
    if (sRaw.indexOf("win")!=-1) {sType="Win"}
    return(sType);
}

