// #####################################
// # validation.js
// # ECmerchant(tm)
// # www.ecware.com
// #####################################
// rev = 1.0.8

var nbsp = 160;
var node_text = 3;
var proceed = 2;
var allowPost = true;
var IE = document.all;
var emptyString = /^\s*$/

// #####################################
// delete confirmation

function confirmDelete(msg, url){
   var bDelete = confirm(msg);
   if (bDelete)
      location.href = url
   else
      return false;
}

// #####################################
// character count

function charCount(objFld, maxlimit){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   if (objFld.value.length > maxlimit){
      objFld.value = objFld.value.substring(0, maxlimit);
   }else{
      var txtMsg = (maxlimit - objFld.value.length) + ' ' + strCharsLeft;
      msg(msgFld, 'validate_note', txtMsg);
   }
}

// #####################################
// basic validation

function valBasic(objFld, Req, fldData){     
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   var chk = commonCheck(objFld, msgFld, Req, fldData);
   if (chk != proceed) return chk;
   msg(msgFld, 'validate_note', '', chk);
   return true;
}

// #####################################
// password validation

function valCompare(objFld, comFld, Req, fldData){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   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', strCompare);
      return false;
   }
   msg(msgFld, 'validate_note', '');
   return true;
}

// #####################################
// number validation

function valNum(objFld, Req, fldData, min, max){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   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', strNum);
      return false;
   }else{
      if (!emptyString.test(min)) {
         if (numFld<min) {
            msg (msgFld, 'validate_warn', strEnter + ' ' + min + '-' + max);
            return false;
         }
      }
      if (!emptyString.test(max)) {
         if (numFld>max) {
            msg (msgFld, 'validate_warn', strEnter + ' ' + min + '-' + max);
            return false;
         }
      }
      msg (msgFld, 'validate_note', '');
      return true;
   }
   return true;
}

// #####################################
// email validation

function valEmail(objFld, Req, fldData){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   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', strEmail);
      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', strEmailSuspect);
   else
      msg (msgFld, 'validate_note', '');
   return true;
}

// #####################################
// url validation

function valURL(objFld, Req, fldData){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   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', strURL);
      return false;	
   }else{
      msg (msgFld, 'validate_note', '');   
   }  	
   return true;
}

// #####################################
// file type validation

function valFile(objFld, fldData){   
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;  
   if (objFld.value != ''){  
      var txtFld = trim(objFld.value);
      var fileExt = /^\.gif$/
      if (!fileExt.test(txtFld)) {
         msg (msgFld, 'validate_warn', strFile + ' ' + fldData);
         return false;
      }else{
         msg (msgFld, 'validate_note', '');   
      } 
   }  
   return true;
}

// #####################################
// country & region validation

function valRegion(objFldCo, objFldRe, msgFldCo, msgFldRe){
   var msgFldCo = 'x' + objFldCo.name;
   var msgFldRe = 'x' + objFldRe.name;   
   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', strRequired);
      return false;
   }else{
      msg (msgFld, 'validate_note', '');  
   }   
   return true;
}

// #####################################
// selector validation

function valSelect(objFld, Req, MinChk){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;   
   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', strSelectOne);
      return false;
   }else{
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// checkbox validation

function valCheckbox(objFld, Req, MinChk){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;   
   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', strSelect + ' ' + MinChk);
      return false;
   }else{
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// radio validation

function valRadio(objFld, Req){
   var msgFld = 'x' + objFld.id; 
   if(msgFld=='x') msgFld = 'x' + objFld.name;  
   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', strSelectOne);
      return false;
   }else{
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// phone number validation

function valPhone(objFld, Req, fldData){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   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', strPhone);      
      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 + ' ' + strPhoneShort);      
      return false;
   }
   if (numdigits>14)
      msg (msgFld, 'validate_note', numdigits + ' ' + strPhoneLong);
   else {      
      msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// CreditCard Expiry validation

function valCCexpiry(objFldMo, objFldYr, msgFld) {
   var month = '';
   for (i=0; i < objFldM0.length; i++){
       if (objFldMo[i].selected){
          month=objFldMo[i].value; 
          break; 
      }        
   }  
   if (emptyString.test(month)){
      msg (msgFld, 'validate_warn', strRequired);
      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', strRequired);
      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', strCCDate);
      return false;
   }else{
         msg (msgFld, 'validate_note', '');
   }
   return true;
}

// #####################################
// CreditCard Number validation

function valCCno(objFldNo, objFldName, msgFldNo, msgFldName) {
   var msgFldNo = 'x' + objFldNo.name;
   var msgFldName = 'x' + objFldName.name;
   var cardnumber = trim(objFldNo.value);
   if (emptyString.test(cardnumber)){
      msg (msgFldNo, 'validate_warn', strRequired);      
   }  
   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', strRequired);      
   }  
   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', strCCName);
      return false; 
   }   
   if (cardnumber.length == 0)  {     
      msg (msgFldName, 'validate_warn', strRequired);
      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', strCCNum);
      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', strCCNum);
        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', strCCNum);
      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', strCCNum);
      return false; 
   }     	
   msg (msgFldNo, 'validate_note', '');
   msg (msgFldName, 'validate_note', '');
   return true;
}   

// #####################################
// age validation

function valAge(objFld, Req, fldData){
   var msgFld = 'x' + objFld.id;
   if(msgFld=='x') msgFld = 'x' + objFld.name;
   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', strAge);
      return false;
   }
   if (txtFld>=110) {
      msg (msgFld, 'validate_warn', strAge);
      return false;
   }
   return true;
}

// #####################################
// onSubmit Validation

function valOnSubmit(thisForm, msg){
   //var aMsg;
   var thisField;
   for (i=0; i < thisForm.length; i++){
      thisField = thisForm.elements[i];
      if (!thisField.disabled && (thisField.type=='select-one' || thisField.type=='text' || thisField.type=='radio' || thisField.type=='checkbox' || thisField.type=='textarea' || thisField.type=='password')){                  
         if (IE) {
            thisField.fireEvent('onfocus');
            thisField.fireEvent('onblur');  
         }else{
            thisField.focus();
            thisField.blur(); 
         }        
         //aMsg = aMsg + thisField.name + '(' + thisField.type + ') is blurred (' + i + ' of ' + (thisForm.length - 1) + ') ' + window.allowPost + '\n';
      }
      //aMsg = aMsg + thisField.name + '(' + thisField.type + ')' + '\n';
   }
   //alert(aMsg);   
   if (!window.allowPost) alert(strPopup);
   return window.allowPost;
   //return false;
}

// #####################################
// 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){      
   //alert(objFld + '-' +  msgFld + '-' + Req + '-' + fldData);  
   if (!document.getElementById){      
      alert('Your browser is not compliant with current JavaScript standards. Please upgrade to the latest version.');      
      return false;   
   }
   var elem = document.getElementById(msgFld);
   if (!elem){      
      alert('JavaScript Error: No message field matches "' + msgFld + '".');      
      return false;   
   }
   if (elem.firstChild.nodeType != node_text){      		
      alert('JavaScript Error: Incorrect node type used for ' + msgFld + ' - use DIV or SPAN.');      
      return false; 
   }
   if (emptyString.test(objFld.value)){
      if ((Req) && (!emptyString.test(fldData))){  
         window.allowPost = false;       
         msg(msgFld, 'validate_warn', fldData);       
         return false; 
      }
      if ((!Req) && (!emptyString.test(fldData))){         
         objFld.value = fldData;
         msg(msgFld, 'validate_note', strDefault);
         return true; 
      }
      if ((Req) && (emptyString.test(fldData))){  
         window.allowPost = false;      			
         msg(msgFld, 'validate_warn', strRequired); 	 
         return false;
      }
      if ((!Req) && (emptyString.test(fldData))){                
         msg (msgFld, 'validate_note', '');				
         return true;           			
      }
   }
   return proceed;
}