//******************* GENERAL PURPOSE FORM VALIDATION FUNCTIONS *************************

function validate(check,obj,len,msg){
  /* 
  validate(checkType,formObject,length,message);
  
  checkType: Specifies the type of check to perform on the Form Object.
             Valid Values are:
             required      - Applies to TextFields - Ensures that characters have been entered in the field (spaces are ignored).
             isEmail       - Check is a Textfield contains a valid email address. 
                             For detailed email checking call the function emailCheck() directly.
             containNumber - Checks is a Textfield contains any numeric characters.
             hasLength     - Checks if a Textfield contains at least a certain number of characters (spaces are ignored).            
             isNumeric     - Checks if a textfield is a number.
             selected      = Checks if a selectbox has a option with a value equal to length selected.
  
  formObject:Reference to the Form Object which is to be checked.
  length    : When checkType is 'hasLength' length specifies the minimu lenght that the Textfield must have. 
              When checkType is 'selected'  length specifies the option which must be selected for the function to return true.
              For all other checkTypes set length = 0
  message   : The text to display in the alert box if validation fails.
  
  NOTES:
  This function returns false if validation fails, true if validation is successfull.            
               
                      
  USAGE:
  validate('required',document.formName.sFirstName,0,'Please enter your First Name!')
  */

  bIsValid = true;
  switch (check)
  {
    case 'required'://Check if text has been entered into this field
      if (!isFilled(obj.value)){bIsValid = false;}
      break;        
    case 'isEmail'://Check if text is a email address.
      if(emailCheck(obj.value) != 0){bIsValid = false;}
      break;
    case 'containsNumber'://Check if text contains a number.
      if (containsNumber(obj.value)){bIsValid = false;}
      break;    
    case 'hasLength'://Check if text has a certain length.                
      if (len != 0 && !isLength(obj.value,len)){bIsValid = false;}
      break;
    case 'isNumeric'://Check if text contains a number.
      if (!isNumeric(obj.value)){bIsValid = false;}
      break;
    case 'selected'://Check if the SelectBox option has a value of 0.
      if(obj.options[obj.selectedIndex].value==len){bIsValid = false;}
      break
    case 'isChecked'://Check if a Checkbox has been ticked.
      if(!obj.checked){bIsValid = false;}
      break                                
  }
  if (!bIsValid)
  {
    alert(msg)
    obj.focus()
    return false  
  }
  return true;
}

// General purpose function to see if an input value has been entered.
function isFilled(inputStr) 
{
  if (inputStr == null || trim(inputStr) == "")
  {
    return false
  }
  return true
}

// General purpose function to see if an input value has a certain length.
function isLength(inputStr,iLen) 
{
  inputStr = trim(inputStr,iLen)
  if (inputStr.length < iLen)
  {
    return false
  }
  return true
}

// General purpose function to see if an input value contains a number.
function containsNumber(s)
{ 
  for (i=0; i <= 9;i=i+1)
  {
    if (s.search(i) != -1)
    {
      return true;
    }
  }
  return false;
}  

// General purpose function Trim.
function trim (s)
{
	return rtrim(ltrim(s));
}

// General purpose function Left Trim.
function ltrim (s)
{
	return s.replace(/^\s*/,"")
}

// General purpose function Right Trim.
function rtrim (s)
{
	return s.replace(/\s*$/,"");
}

// General purpose function is value a number.
function isNumeric(s)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char; 
   for (i = 0; i < s.length && IsNumber == true; i++) 
      { 
      Char = s.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;   
}

//General purpose function if value is a Email.
function emailCheck (emailStr) 
{
  /* 
     RETURN CODES
     0 = ValidEmail
     1 = @ and .'s check failed.
     2 = Non Valid Characters detected.
     3 = Non Valid Characters detected in domainname.
     4 = Email wrong and is not valid.
     5 = The IP Address is not valid.
     6 = Email is not valid.
     7 = Unknown country domain.
     8 = No Host Name Specified.
  */   
  var emailStr = emailStr.replace(/ /g,"");
  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){return 1;}   
  var user=matchArray[1];
  var domain=matchArray[2];  
  for (i=0; i<user.length; i++) 
  {
    if (user.charCodeAt(i)>127){return 2;}       
  }    
  for (i=0; i<domain.length; i++) 
  {
    if (domain.charCodeAt(i)>127){ return 3;}   
  }  
  if (user.match(userPat)==null){return 4;}    
  var IPArray=domain.match(ipDomainPat);
  if (IPArray!=null) 
  {
    for (var i=1;i<=4;i++) 
    {
      if (IPArray[i]>255){return 5;}        
    }
    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){return 6;}    
  }  
  if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) 
  {
    return 7;
  }      
  // Make sure there's a host name preceding the domain.  
  if (len<2){return 8;} 
  return 0;
}

//Script for basic creditcard validation - http://www.evolt.org/article/rating/17/24700/
function isCreditCard(cardNumber, cardType)
{
  var isValid = false;
  var ccCheckRegExp = /[^\d ]/;
  isValid = !ccCheckRegExp.test(cardNumber);

  if (isValid)
  {
    var cardNumbersOnly = cardNumber.replace(/ /g,"");
    var cardNumberLength = cardNumbersOnly.length;
    var lengthIsValid = false;
    var prefixIsValid = false;
    var prefixRegExp;

    switch(cardType)
    {
      case "2": //mastercard
        lengthIsValid = (cardNumberLength == 16);
        prefixRegExp = /^5[1-5]/;
        break;

      case "1"://visa
        lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
        prefixRegExp = /^4/;
        break;

      case "3"://amex
        lengthIsValid = (cardNumberLength == 15);
        prefixRegExp = /^3(4|7)/;
        break;

      default:
        prefixRegExp = /^$/;
        alert("Card type not found");
    }

    prefixIsValid = prefixRegExp.test(cardNumbersOnly);
    isValid = prefixIsValid && lengthIsValid;
  }

  if (isValid)
  {
    var numberProduct;
    var numberProductDigitIndex;
    var checkSumTotal = 0;

    for (digitCounter = cardNumberLength - 1; 
      digitCounter >= 0; 
      digitCounter--)
    {
      checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
      digitCounter--;
      numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
      for (var productDigitCounter = 0;
        productDigitCounter < numberProduct.length; 
        productDigitCounter++)
      {
        checkSumTotal += 
          parseInt(numberProduct.charAt(productDigitCounter));
      }
    }

    isValid = (checkSumTotal % 10 == 0);
  }

  return isValid;
}