
/* global variables used for handling validation */

var confirmExists;
var missingField;
var strMsg;
var holdPassword, holdPasswordName, holdUserID, holdUserIDName;	
var pageMsgArray = new Array();
var pageMsg = false;
var arrCntr;
var pageMsgStr;
var referID;
var notRequiredArray = new Array("Address2", "Phone", "School", "dateOptional", "Email", "AccountingCode", "PurchaseOrderNumber");
var compToUserID = new Array("BidNumber");
var urlToken;
var chosenText, holdVal, creditCardType;
var re = /^\s{1,}$/;

/****************************************************************/	
/*       validate required form text fields are populated       */
	
    function validateForm(frmElement){  
	var fieldFnd;
	    if(frmElement.value == "" || frmElement.value == null || frmElement.value == "0" || re.test(frmElement.value)){	
		 	 for(x=0; x < notRequiredArray.length; x++){  
			  if(frmElement.name != notRequiredArray[x])
			     fieldFnd = true;
			  else{
			  /* frmElement.value = " " sets a default value for the 
			     non-required fields for the database insert/update */
			    frmElement.value = " ";
			    fieldFnd = false;
				break;}
		
		  }
		}
	/* check t see if element being checked is a shopping cart
	   quantity box - if it is then user is attempting to add
	   to cart without indicating a quantity */
	  if(fieldFnd){
	     aStr = ("casItemNumber")
		 search = frmElement.name.indexOf(aStr)
	     if(search == 0)
		   {addToCartMsg(frmElement);}
		 else
	      {missingField(frmElement);}
		  fieldFnd = false;
	  }
	 
	/* all special text box type validations are done here -
	   date fields are the only exception, some dates are 
	   mandatory some not - for those that are not add the 
	   input name to the notRequiredArray above. make sure
	   that the name of your "date" input box has the word
	   date in it, this way even for those date fields that 
	   are not mandatory the data can still be validated if 
	   the box contains data                                */
	   	
       if(frmElement.value != "" && frmElement.value != " " ){
	      var elementName;
	      aStr = "DATE";
	      elementName = frmElement.name.toUpperCase();
		  search = elementName.indexOf(aStr)
		      if(search != -1)
		              elementName = "DATE";
         
		  switch(elementName) {
		      case "ZIPCODE": if(isNaN(frmElement.value))
		                      strMsg = strMsg +
							   "\tZip Code Is Not Numberic" + "\n";
							   break;
			  case   "EMAIL":  aChar = ("@");
                               search = frmElement.value.indexOf(aChar);
                                 if(search == -1)
                                  {validMailAt = false;}
                                else 
                                   {validMailAt = true;}      
                                aChar = ".";
                                search = frmElement.value.indexOf(aChar);
                                  if(search == -1)
                                    {validMailDot = false;}
                                  else
                                    {validMailDot = true;}      
				                  if(!validMailAt || !validMailDot)
				                    strMsg = strMsg + 
									"\tEmail Format Is Invalid\n"; 
								  break;
			  case "USERID": invalid = /\s/;
			                 if (invalid.test(frmElement.value))
							 { alert("The Following Error(s) Have Ocurred:\n \t Sorry, spaces are not allowed in Userid\n");return false; }
							 break;
			               
			              																				  
												  
			  case  "QUANTITY": if(isNaN(frmElement.value))
			                       strMsg = strMsg + "\tQuantity Must Be Numeric\n";
			                    else if(frmElement.value < 0)
			                       strMsg = strMsg + "\tQuantity Cannot Be Less Than Zero\n";
								else frmElement.value = Math.round(frmElement.value)
								   break;
			  case      "DATE":    expDate = "EXP"
			                         elementName = frmElement.name.toUpperCase();
			                         search = elementName.indexOf(expDate)
				                        if(search != -1){
			                              doDateChk(frmElement, expDate);}
										 else
										   doDateChk(frmElement, '');
			                     break;
	   case "CREDITCARDNUMBER":  //verifyCardNumber(frmElement);
	                             break;
				        default: break; 
			}//switch
		  }//if
		
		}	
/****************************************************************/

/*  validate date - validates mm/dd/yy format as well as mm/yy 
    credit card expiration date                                 */
   function doDateChk(frmElement, expDate){

   var dateMnth=new Number() ,dateDay=new Number(), dateYY=new Number();
   var search1, search2;
       dateFormatMsg = "\t Date Format Is mm/dd/yy\n";
	    dateSlash = "/";
		
		 search1 = frmElement.value.indexOf(dateSlash, 0);
	  if(expDate != "EXP"){
		 search2 = frmElement.value.indexOf( dateSlash, search1 + 1);
		 }
			if((search1 != -1) && (search2 != -1)){
				 dateMnth = frmElement.value.substring(0,search1);
			     dateDay = frmElement.value.substring(search1 + 1, search2);
				 endLength = frmElement.value.length - search2;
				 endLen = frmElement.value.length
			    if(expDate != "EXP")
			     dateYY =frmElement.value.substring(search2 + 1,endLen);
				else
				 dateYY = frmElement.value.substring(search1 + 1,endLen);
				if(expDate == "EXP"){
			       if(isNaN(dateMnth) || isNaN(dateYY))
			          strMsg = strMsg + "\tMonths - Days - Years Must Be Numberic\n";
			    }
			     else{
				  if(isNaN(dateMnth) || isNaN(dateDay) || isNaN(dateYY))
			          strMsg = strMsg + "\tMonths - Days - Years Must Be Numberic\n";
				}
			 }
		     else
		         strMsg = strMsg + dateFormatMsg;
				 
			  if(strMsg == ""){
			    var datesToChck = new Array("dateMnth", "dateDay", "dateYY")
				var curDt=new Date();   
			    var tempYY = new Number(); 
				  n = 0;
				  if(n <= datesToChck.length){
     			      switch(datesToChck[n]){
					    case("dateMnth"):if(dateMnth < 01 || dateMnth > 12)
						                  strMsg = strMsg + "\tMonth Is Incorrect For " + frmElement.name + "\n";
									     else if((dateMnth == 04 || dateMnth == 06 ||
									           dateMnth == 09 || dateMnth == 11) &&
											   dateDay > 30)
										           strMsg = strMsg + "\tDay Cannot Be " +
												           "Greater Than 30 When " + "'"+ dateMnth+"'" + " Is\n" +
														   "\tThe Month Please Check " + frmElement.name +"\n";	 
										 
										//break;
						 case("dateDay"):  if(expDate != "EXP"){
						                    if(dateDay < 01 || dateDay > 31)
						                     strMsg = strMsg + "\tDay Is Incorrect For " + frmElement.name + "\n";		
										  } 
										//break;
						 case("dateYY"):  if(dateYY <=50)
						                    tempYY = 2000 + parseFloat(dateYY);
										  else
										    tempYY == 1900 + parseFloat(dateYY);
										  if((tempYY % 4 == 0)  && (dateMnth == 2 && dateDay > 29))
										    strMsg = strMsg + "\tThere Is NoFeburary " + dateDay +" For " + tempYY + "\n"+
											                  "\tPlease Check " + frmElement.name + "\n";
										  else if((tempYY % 4 != 0) && (dateMnth == 2 && dateDay > 28))
										    strMsg = strMsg + "\tThere Is No Feburary " + dateDay +" For " + tempYY + "\n";
										  else if(tempYY < curDt.getYear()){
										    strMsg = strMsg + "\tThe Year Can't Pre-Date The Current Year\n";
											}
										  else if((dateMnth < curDt.getMonth() && dateYY == curDt.getYear) ||
										          (dateMnth == curDt.getMonth() && dateDay < curDt.getDate()) &&
												   (expDate != "EXP"))
											strMsg = strMsg + "\tEither Your Card Has Expired Or You Have\n" +
											                  "\tEntered An Incorrect Date - Please Re-Check\n";
										 else if((dateMnth < curDt.getMonth()) && (tempYY <= curDt.getYear()))
											       strMsg = strMsg + "\tPlease Re-Check The Month In Your Date Input For " + frmElement.name + "\n" 
												                     
										  break;
						default:          break;
					}//switch
					n = n+1;
				 }//if
		
			}//if
			//else{
			//  frmElement.focus();
			//  frmElement.select()
			//}		                   
	}
		  
	/****************************************************************
	           client side credit card validation - this code in
				  no way insures that the credit card it truly a
				  valid number but instead verifies that the card
				  type has the correct prefix and that card number
				  adheres to Mod 10 algorithm (verifyCardNumber()   */ 
	  
	  function verifyCardNumber(frmElement){
	   var stdPrefix
	   var holdType = "";
	   var doLoop = true
	   var i = 0;
	   var frmToSearch, badNumber = false;
	   var odd = new Number(), even = new Number(), chckSum = new Number();
	    while(doLoop) {
		         frmToSearch = document.forms[i];
			        for(c=0; c < frmToSearch.elements.length; c++){
		              srchStr = "CardType";
			          search = frmToSearch.elements[c].name.indexOf(srchStr);
				     if(search != -1){
					   creditCardType = frmToSearch.elements[c].options[frmToSearch.elements[c].selectedIndex].text;
					   doLoop = false;
					 }
					}
					  i = i + i;
		   }//while

	      switch(creditCardType.toUpperCase()){
		     case "MASTERCARD": stdPrefix = frmElement.value.substring(0, 2);
			                    if((stdPrefix <= 50 || stdPrefix >= 56) && (frmElement.value.length != 16))
								 badNumber = true;
			                    break;
			 case      "VISA" : stdPrefix = frmElement.value.substring(0,1);
			                    if((stdPrefix != 4)&&(frmElement.length != 13 || frmElement.value.length != 16))
								badNumber = true;
			                    break;
			 case  "DISCOVER" : stdPrefix = frmElement.value.substring(0, 4);
			                    if((stdPrefix != 6011) && (frmElement.value.length != 16))
								badNumber = true;
			                    break;
					   default: break;
		 }
		 
	    if(!badNumber){
		  charPos = frmElement.value.length;
		   for(i=0; i <= frmElement.value.length;i++){
		   crdDgt = parseInt(frmElement.value.charAt(charPos - i));
		   if(!isNaN(crdDgt)){
		     if((i % 2 == 0)){
			     chckSum = crdDgt * 2;
			     if(chckSum >= 10){
				     even = even + (chckSum - 10) + 1;
					}
				 else{
					even = even + (crdDgt * 2);}
				}
			 else{odd = odd + crdDgt;}
			 }//if not isNaN
		   }//for
		    chckSum = 0
		    chckSum = odd + even;
		     if(chckSum % 10 != 0)
		          strMsg = strMsg + "\tPlease Re-Check Your Number and Re-Enter\n";
		    }//if
		else
		strMsg = strMsg + "\tNumber Is Not Correct - Please Re-Enter\n";
		  
	  }
 /********************************************************************/
 
 /* determine  hidden fields processing add your particular 
    elements ID to the switch statement(s) */
      function validateHidden(frmToSub, frmElement){
	 
	       switch(frmElement.name){
		     case      "holdNameSelected": holdVal = frmElement.value;
			                               break;
			 case      "holdCat1Selected": holdVal = frmElement.value;
			                               break;
						          default: break;
			}
			
	       switch(frmToSub){
		       case     "casSchAccLink":    checkUserBid(frmElement);
			                                break;
			  case "casViewAnotherCart":  if(frmElement.name.toUpperCase() == "NAMESELECTED"){
			                                 if(chosenText == "")
			                                  frmElement.value = holdVal;
											 else
			                                  frmElement.value = chosenText;
										  }
			                                break;
			case  "casCategory1Selection":  if(frmElement.name.toUpperCase() == "HIDCATEGORY1"){
			                                 if(chosenText == "")
			                                  frmElement.value = holdVal;
											 else
			                                  frmElement.value = chosenText;
										  }
			                                break;
		                    default: break;
			}
	   }
	
       function setHiddenAction(frmElement, dbAction){
	     var reply = false;
	       dbAction = "" + dbAction + "";
	       if(frmElement.name.toUpperCase() == "ACTION"){   
		    if(dbAction == "D")
			  reply =  confirm("Are You Sure You Want To Delete\n" +
			                      "This Item From Your Cart?");
	        
		  if(reply || dbAction.toUpperCase() == "U")
		    frmElement.value = dbAction;
		  else {
		     strMsg = strMsg + "Your Deletion Has Been Canceled\n";
			 return dbAction;
			}
		 }
	   }  
/****************************************************************/  

 /*               process for shop-link page                 */
      function checkUserBid(frmElement) {
	     if(frmElement.name == "UserID")
			holdUserID = frmElement.value;
			
	    if((frmElement.name == "BidNumber") && (holdUserID != "")){
		  if(frmElement.value == "")
		     {strMsg = "Sorry But You Do Not Have A Bid Account";}
	    }
		else if(holdUserID == "")
		     strMsg = "You Need To Log In To Enter This Area";
	}
	

/***************************************************************/
			          
 /*                validate password field(s)               */
       function validatePassword(frmElement){
	    if(frmElement.name.toUpperCase() == "PASSWORD"){
		  holdPasswordName = frmElement;
		  holdPassword = frmElement.value;
		 }
	      if(frmElement.value == "")
		     missingField(frmElement);
	        if(frmElement.name == "Confirm"){
		      if(holdPassword != frmElement.value){
			     strMsg = strMsg + "\tPassword and Confirm are not the Same" + "\n";
			     holdPasswordName.select();
			   }
			 }
	 }
  
 /**************************************************************/
 
 
 

 /*  validate required select box data chosen - NameFromList
     is needed on some page headings so it is looked for and
	 set in this function                                     */
  
   function getSelectedItem(frmElement){  
      itemSelected = frmElement.options[frmElement.selectedIndex].value;
      txtToInsert = frmElement.options[frmElement.selectedIndex].text;
	  if(frmElement.name.toUpperCase() == "NAMEFROMLIST" ||
	     frmElement.name.toUpperCase() == "ITEMFROMLIST" ||
		 frmElement.name.toUpperCase() == "PAYMENTTYPE"  ||
		 frmElement.name.toUpperCase() == "CARDTYPE"){
	     switch(txtToInsert.toUpperCase()){
	        case       "MY CART": chosenText = "";
			                      break;
		   case "CHOOSE A NAME" : strMsg = strMsg + "\tPlease Choose A " +
			                      "Name From The List\n";
								  break;
		        case "CATEGORY1": strMsg = strMsg + "\tPlease Choose An " +
		                          "Item From The List\n";
								  break;
      case "CHOOSE PAYMENT TYPE": strMsg = strMsg + "\tPlease Choose A " +
		                          "Payment Type\n";
								  break;
	  case     "CHOOSE CARD TYPE":strMsg = strMsg + "\tPlease Choose A " +
		                          "Card Type\n";
								  break;
	                     default: chosenText = txtToInsert;
						          break;
	     }
		}
	 else{
	   if(itemSelected == ""){
	       if(frmElement.name != "Grade")
	      missingField(frmElement);
	   }
	  }
	  return creditCardType;
 }

 /**************************************************************/
 
 /* generate quantity missing when adding to cart messages */
 
 function addToCartMsg(frmElement){
     strMsg = strMsg + "Quantity for Item Must Be Greater Than Zeroe";
	}
 
 /***************************************************************/
 
 /* build error message string */
 
 function missingField(frmElement){
      if(pageMsg){
	  pageMsgArray[arrCntr] = frmElement.name;
	  arrCntr = arrCntr + 1;
	  }
	  else
      strMsg = strMsg + "\t" + frmElement.name + " Missing\n ";
	}

/****************************************************************/

/* set session id to be passed by links (for error messages only) */

  function setToken(frmToSub){
       actionStr = "" + frmToSub.action + "" 	 
	   startPos = actionStr.indexOf("?")
	   urlToken = actionStr.substring(startPos,actionStr.length)
	   return urlToken;
	}
	
/******************************************************************/
	
 /*All forms requiring validation will be submitted through this function */
 
 function subForm(frmToSub, msgType, dbAction){

      dbAction = "" + dbAction + "";
	  msgType = "" + msgType + ""
      if(msgType == "" || msgType == "undefined"){msgType = 'alertMsg';}
       else if(msgType == "pageMsg"){pageMsg = true;
	           arrCntr = 0; pageMsgArray.length=0;}
        strMsg = "";
		 var cntr = frmToSub.elements.length;
		  for(i=0; i < cntr; i++){
		     if(frmToSub.elements[i].type == 'select-one')
			   getSelectedItem(frmToSub.elements[i]);
			 else if(frmToSub.elements[i].type =='text')
			   validateForm(frmToSub.elements[i]);
			 else if(frmToSub.elements[i].type == 'password')
			   validatePassword(frmToSub.elements[i]);
			 else if(frmToSub.elements[i].type == 'hidden'){
			   if(dbAction != "undefined")
			      setHiddenAction(frmToSub.elements[i], dbAction);
			    else
			      validateHidden(frmToSub.name, frmToSub.elements[i]);
			 }
	
	       }
		 
		  if(strMsg == "" && pageMsgArray.length == 0){   
	              frmToSub.submit();
		   }
		    else if(pageMsg && pageMsgArray.length > 0){
			   setToken(frmToSub);
		      if(frmToSub.refererID.value != ""){
			   frmToSub.action = frmToSub.name + ".cfm"+urlToken+"&errMsg=error&refererID=" 
			   + frmToSub.refererID.value;}
			  else /* msgID is the ID number of the error message to be generated */
			   {frmToSub.action = frmToSub.name + ".cfm"+urlToken+"&errMsg=error&" + frmToSub.msgID.value;}
			 frmToSub.submit();
			 }
		   else if(strMsg != "" && dbAction == "D")
		      alert(strMsg)
		   else
		      alert("The Following Error(s) Have Ocurred:\n" + strMsg)
 }
 
 /***************************************************************/