// #####################################
// # validation.js
// # Copyright 2007 Sean C. Rowland
// # Used with Permission
// #####################################
// rev = 1.0.8

var nbsp = 160; 
var node_text = 3; 
var proceed = 2;   
emptyString = /^\s*$/


// #####################################
// basic validation

function valBasic(objFld, msgFld, Req, fldData){
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   msg(msgFld, 'validate_note', '');   
   return true;
}

// #####################################
// password validation

function valCompare(objFld, comFld, msgFld, Req, fldData){
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   var elem = document.getElementById(comFld)
   if (objFld.value != elem.value){
      msg (msgFld, 'validate_warn', 'password mismatch');
      return false;
   }
   msg(msgFld, 'validate_note', '');   
   return true;
}

// #####################################
// number validation

function valNum(objFld, msgFld, Req, fldData, min, max){
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   var numFld = trim(objFld.value);
   var numRE = /^[-+]?([0-9]*\.)?[0-9]+$/   
   if (!numRE.test(numFld)) {
      msg (msgFld, 'validate_warn', 'not a number');      
      return false;
   }else{
      if (!emptyString.test(min)) {
         if (numFld<min) {
            msg (msgFld, 'validate_warn', 'enter '+min+'-'+max);            
            return false;
         }   
      }
      if (!emptyString.test(max)) {
         if (numFld>max) {
            msg (msgFld, 'validate_warn', 'enter '+min+'-'+max);            
            return false;
         } 
      }  
      msg (msgFld, 'validate_note', '');
      return true;
   }
   return true;
}

// #####################################
// email validation

function valEmail(objFld, msgFld, Req, fldData){
   // untested expression
   ///^[!#$%&amp;'*+-~/=?^_`|0-9a-z]+(\.[!#$%&amp;'*+-~/=?^_`|0-9a-z]+)*@[0-9a-z]+([\._-][0-9a-z]+)*\.[a-z]{2,6}$
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   var txtFld = trim(objFld.value); 
   var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
   if (!email.test(txtFld)) {
      msg (msgFld, 'validate_warn', 'invalid email address');
      return false;
   }
   var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/
   if (!email2.test(txtFld)) 
      msg (msgFld, 'validate_note', 'unusual e-mail address');
   else
      msg (msgFld, 'validate_note', '');
   return true;
}

// #####################################
// url validation

function valURL(objFld, msgFld, Req, fldData){
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   var txtFld = trim(objFld.value); 
   var url = /^https?:\/\/|^$/   
   if (!url.test(txtFld)) {
      msg (msgFld, 'validate_warn', 'invalid URL');
      return false;	
   }else{
      msg (msgFld, 'validate_note', '');   
   }  	
   return true;
}

// #####################################
// country & region validation

function valRegion(objFldCo, objFldRe, msgFldCo, msgFldRe){   
   var Req = false   
   var country = '';
   for (i=0; i < objFldCo.length; i++){
       if (objFldCo[i].selected){
          country=objFldCo[i].value; 
          break; 
      }        
   }  
   if (emptyString.test(country)){
      msg (msgFldCo, 'validate_warn', 'required');
      return false;
   }else{
      //var sym = '';  
      //if (sym.test(country)){
      //   var region = ''; 
      //   for (i=0; i < objFldRe.length; i++){
      //      if (objFldRe[i].selected){
      //      region=objFldRe[i].value; 
      //      break; 
      //   }        
      //}  
      //if (emptyString.test(region)){
      //   msg (msgFldRe, 'validate_warn', 'required');
      //   return false;      
      //}
   }   
   return true;
}

// #####################################
// selector validation

function valSelect(objFld, msgFld, Req, MinChk){   
   var intLength = objFld.length;
   var strSelected = '';
   for (i=0; i < intLength; i++){
      if (objFld[i].selected){
          strSelected=objFld[i].value; 
          break; 
      }        
   }   
   if(emptyString.test(strSelected)){
      msg (msgFld, 'validate_warn', 'select one');
      return false;
   }else{
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// checkbox validation

function valCheckbox(objFld, msgFld, Req, MinChk){   
   var intLength = objFld.length;
   var intChk = 0;
   for (i=0; i < intLength; i++){
       if (objFld[i].checked) intChk=+1;          
   }   
   if(intChk<MinChk){
      msg (msgFld, 'validate_warn', 'select ' + MinChk);
      return false;
   }else{
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// radio validation

function valRadio(objFld, msgFld, Req){   
   var intLength = objFld.length;
   var bolChecked = false;
   for (i=0; i < intLength; i++){
      if(objFld[i].checked){
         bolChecked = true;
         break;
      }
   }
   if(!bolChecked){
      msg (msgFld, 'validate_warn', 'select one');
      return false;
   }else{
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// phone number validation

function valPhone(objFld, msgFld, Req, fldData){
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   var txtFld = trim(objFld.value); 
   var telnr = /^\+?[0-9 ()-.]+[0-9]$/
   if (!telnr.test(txtFld)) {
      msg (msgFld, 'validate_warn', 'invalid phone #');      
      return false;
   }
   var numdigits = 0;
   for (var j=0; j<txtFld.length; j++)
      if (txtFld.charAt(j)>='0' && txtFld.charAt(j)<='9') numdigits++;
   if (numdigits<6) {
      msg (msgFld, 'validate_warn', numdigits + ' digits? - too short');      
      return false;
   }
   if (numdigits>14)
      msg (msgFld, 'validate_note', numdigits + ' digits? - are you sure?');
   else { 
      if (numdigits<10)
         msg (msgFld, 'validate_note', numdigits + ' digits? - if you say so');
      else
         msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// CreditCard Expiry validation

function valCCexpiry(objFldMo, objFldYr, msgFld) {   
   var month = '';
   for (i=0; i < objFldMo.length; i++){
       if (objFldMo[i].selected){
          month=objFldMo[i].value; 
          break; 
      }        
   }  
   if (emptyString.test(month)){
      msg (msgFld, 'validate_warn', 'required');
      return false;
   }  
   var year = ''; 
   for (i=0; i < objFldYr.length; i++){
       if (objFldYr[i].selected){
          year=objFldYr[i].value; 
          break; 
      }        
   }  
   if (emptyString.test(year)){
      msg (msgFld, 'validate_warn', 'required');
      return false;
   }
   var eDate = new Date;
   var tDate = new Date;
   eDate.setMonth(month);
   eDate.setYear(year);
   if (tDate.getTime > eDate.getTime) {
      msg (msgFld, 'validate_warn', 'invalid date');
      return false;
   }else{
         msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// CreditCard Number validation

function valCCno(objFldNo, objFldName, msgFldNo, msgFldName) {
   
   var cardnumber = trim(objFldNo.value);
   if (emptyString.test(cardnumber)){
      msg (msgFldNo, 'validate_warn', 'required');      
   }  
   var cardname = '';
   for (i=0; i < objFldName.length; i++){
       if (objFldName[i].selected){
          cardname=objFldName[i].value; 
          break; 
      }        
   }  
   if (emptyString.test(cardname)){
      msg (msgFldName, 'validate_warn', 'required');      
   }  
   if (emptyString.test(cardnumber)||emptyString.test(cardname)){
      return false;
   }  
   var cards = new Array();
   cards [0] = {name: "Visa", length: "13,16", prefixes: "4", checkdigit: true};
   cards [1] = {name: "MasterCard", length: "16", prefixes: "51,52,53,54,55", checkdigit: true};
   cards [2] = {name: "Amex", length: "15", prefixes: "34,37", checkdigit: true};
   cards [3] = {name: "Diners", length: "14,", prefixes: "300,301,302,303,304,305,36,38", checkdigit: true};  
   cards [4] = {name: "Discover",length: "16", prefixes: "6011", checkdigit: true};
   cards [5] = {name: "JCB", length: "15,16", prefixes: "3,1800,2131", checkdigit: true};
   cards [6] = {name: "CarteBlanche", length: "14",prefixes: "300,301,302,303,304,305,36,38", checkdigit: true};
   cards [7] = {name: "Enroute", length: "15", prefixes: "2014,2149", checkdigit: true};               
   var cardType = -1; 
   for (var i=0; i<cards.length; i++) {   
     if (cardname.toLowerCase () == cards[i].name.toLowerCase()) {
        cardType = i;
        break;
     }
   }  
   if (cardType == -1) {     
      msg (msgFldName, 'validate_warn', 'invalid card name');
      return false; 
   }   
   if (cardnumber.length == 0)  {     
      msg (msgFldName, 'validate_warn', 'required');
      return false; 
   }    
   var cardNo = cardnumber
   var cardexp = /^([0-9]{4})\s?([0-9]{4})\s?([0-9]{4})\s?([0-9]{1,4})$/;
   if (!cardexp.exec(cardNo))  {
      msg (msgFldNo, 'validate_warn', 'invalid card number');
      return false; 
   }    
   cardexp.exec(cardNo);
   cardNo = RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4;       
   if (cards[cardType].checkdigit) {
      var checksum = 0;                                 
      var mychar = "";                                  
      var j = 1;     
      var calc;
      for (i = cardNo.length - 1; i >= 0; i--) {          
         calc = Number(cardNo.charAt(i)) * j;          
         if (calc > 9) {
            checksum = checksum + 1;
            calc = calc - 10;
         }         
         checksum = checksum + calc;          
         if (j ==1) {j = 2} else {j = 1};
      }      
      if (checksum % 10 != 0)  {
        msg (msgFldNo, 'validate_warn', 'invalid card number');
        return false; 
      }
   }   
   var LengthValid = false;
   var PrefixValid = false; 
   var undefined; 
   var prefix = new Array ();
   var lengths = new Array ();   
   prefix = cards[cardType].prefixes.split(",");        
   for (i=0; i<prefix.length; i++) {
      var exp = new RegExp ("^" + prefix[i]);
      if (exp.test (cardNo)) PrefixValid = true;
   }        
   if (!PrefixValid) {
      msg (msgFldNo, 'validate_warn', 'invalid card number');
      return false; 
   }      
   lengths = cards[cardType].length.split(",");
   for (j=0; j<lengths.length; j++) {
      if (cardNo.length == lengths[j]) LengthValid = true;
   }    
   if (!LengthValid) {
      msg (msgFldNo, 'validate_warn', 'invalid card number');
      return false; 
   }     	
   msg (msgFldNo, 'validate_note', '');
   msg (msgFldName, 'validate_note', '');
   return true;
}   

// #####################################
// age validation

function valAge(objFld, msgFld, Req, fldData){
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   var txtFld = trim(objFld.value);
   var ageRE = /^[0-9]{1,3}$/
   if (!ageRE.test(txtFld)) {
      msg (msgFld, 'validate_warn', 'ERROR: not a valid age');     
      return false;
   }
   if (txtFld>=110) {
      msg (msgFld, 'validate_warn', 'ERROR: not a valid age');      
      return false;
   }   
   return true;
}

// #####################################
// global functions

function trim(str){
   return str.replace(/^\s+|\s+$/g, '')
}

function msg(msgFld, msgClass, msgText){
   var dispMsg;
   var elem = document.getElementById(msgFld);
   if (emptyString.test(msgText)) 
      dispMsg = String.fromCharCode(nbsp);      
   else   
      dispMsg = msgText;  
   elem.firstChild.nodeValue = dispMsg;      
   elem.className = msgClass;
}

function commonCheck(objFld, msgFld, Req, fldData){   
   if (!document.getElementById){
      alert('Your browser is not compliant with ECware. Please upgrade to Internet Explorer 5.0 or greater.');
      return False;   
   }
   var elem = document.getElementById(msgFld);
   if (!elem.firstChild){	
      alert('No message field matches "' + msgFld + '".');
      return false;   
   }
   if (elem.firstChild.nodeType != node_text){		
      alert('Incorrect node type (' + msgFld + ') for this operation.');
      return false; 
   }
   if (emptyString.test(objFld.value)){
      if ((Req) && (!emptyString.test(fldData))){	
         msg(msgFld, 'validate_warn', fldData);
         return false; 
      }
      if ((!Req) && (!emptyString.test(fldData))){
         objFld.value = fldData;
         msg(msgFld, 'validate_note', 'default');
         return true; 
      }
      if ((Req) && (emptyString.test(fldData))){						
         msg(msgFld, 'validate_warn', 'required');
         return false;
      }
      if ((!Req) && (emptyString.test(fldData))){
         msg (msgFld, 'validate_note', '');				
         return true;           			
      }
   }
   return proceed;
}
