// CREDIT CARD VALIDATION FUNCTIONS

  function ccValidate(f)
  { // Validates the credit card form used in classCredit
    var errMessage="";
    var errFound=false;

    if (empty(f.ccName.value))
    {
      errMessage+="Please enter your Name\n";
      if (!errFound) {f.ccName.focus(); errFound=true;}
    }

    e=f.cardNumber;
    var opt=f.cardType.selectedIndex; // Get index of selected option
    var ccType=f.cardType[opt].text;  // Retrieve displayed text of selected option

    if (e.value=="" || e.value==null || isblank(e.value))
    {
      errMessage+="Please enter your Card number\n";
      if (!errFound) {f.cardNumber.focus(); errFound=true;}
    }

    else
    {
      var z=IsCCNumberValid(e.value, ccType);
      if (z==0)
      {
        errMessage+="The Card number is invalid for that type\n";
        if (!errFound) {f.cardNumber.select(); errFound=true;}
      }
    }

    if (!empty(f.cardSecurityNo.value) && !isNumeric(f.cardSecurityNo.value))
    {
      errMessage+="The Card Security number must be numeric\n";
      if (!errFound) {f.cardSecurityNo.focus(); errFound=true;}
    }

    var ccTypeOption=f.cardType.selectedIndex;
    var ccTypeValue=f.cardType.options[ccTypeOption].text;

    if (ccTypeValue=="Switch" || ccTypeValue=="Solo")
    {
      if (empty(f.cardIssueNo.value))
      {
        errMessage+="Please enter your Card Issue number\n";
        if (!errFound) {f.cardIssueNo.focus(); errFound=true;}
      }
      else
      {
        if (!isNumeric(f.cardIssueNo.value))
        {
          errMessage+="The Card Issue number must be numeric\n";
          if (!errFound) {f.cardIssueNo.focus(); errFound=true;}
        }
      }
    }

    if (f.cardEndYear.value<f.cardStartYear.value ||(f.cardEndYear.value==f.cardStartYear.value && f.cardEndMonth.value<=f.cardStartMonth.value))
    {
      errMessage+="Card End date must be later than card Start date\n";
      if (!errFound) {f.cardEndMonth.focus(); errFound=true;}
    }

    if (errMessage!="")
    {
     alert (errMessage);
     return false;
    }
    else return true;
  }


  function IsCCNumberValid(ccNumber, cardType)
  { // Validates a credit card number for Mastercard, Visa, Amex & Diners Club
    ccNumber=ccNumber.replace(/ /g,"");  // Remove any blanks before validating
    if (ccNumber=="M1111") {return 1;}  // Value for testing
     var retval=0;
    if(cardType!=null)
    {
      if(cardType == "Mastercard"){retval = isMCRD(ccNumber);}
      else if(cardType == "Visa"){retval = isVISA(ccNumber);}
      else if(cardType == "American Express"){retval = isAMEX(ccNumber);}
      else if(cardType == "Diners Club"){retval = isDCCB(ccNumber);}
      else
      { // Don't know algorithm, so just ensure length> 11 & numeric
        if (ccNumber.length<12) {retval=0;}
        else {retval=isNumeric(ccNumber);}
      }
    }
    else
    {
       if(!retval){retval = isMCRD(ccNumber);}
       if(!retval){retval = isVISA(ccNumber);}
       if(!retval){retval = isAMEX(ccNumber);}
       if(!retval){retval = isDCCB(ccNumber);}
    }
    return retval;
  }

  function isMCRD(ccNum)
  { // Validates a Mastercard number
    var preFix = ccNum.substr( 0, 2);
    if(preFix == "51" ||
       preFix == "52" ||
       preFix == "53" ||
       preFix == "54" ||
       preFix == "55")
    {
      if(ccNum.length == 16){return  modTen(ccNum);}
      else {return 0;}
    }
    else
    {
      return 0;
    }
  }

  function isVISA(ccNum)
  { // Validates a Visa number
    var preFix = ccNum.substr(0, 1);
    if(preFix == "4")
    {
      if(ccNum.length == 13 || ccNum.length == 16){return  modTen(ccNum);}
    }
    else
    {
       return 0;
    }
  }

  function isAMEX(ccNum)
  { // Validates an Amex number
    var preFix = ccNum.substr(0, 2);
    if(preFix == "34" || preFix == "37")
    {
      if(ccNum.length == 15){return  modTen(ccNum);}
      else {return 0;}
    }
    else
    {
       return 0;
    }
  }

  function isDCCB(ccNum)
  { // Validates a Diners Club number
    preFix = ccNum.substr(0, 3);
    if(preFix == "300" ||
       preFix == "301" ||
       preFix == "302" ||
       preFix == "303" ||
       preFix == "304" ||
       preFix == "305")
    {
       if(ccNum.length == 14){return  modTen(ccNum);}
       else {return 0;}
    }
    preFix = ccNum.substr(0, 2);
    if(preFix == "36" || preFix == "38")
    {
      if(ccNum.length == 14) {return  modTen(ccNum);}
      else {return 0;}
    }
    else
    {
       return 0;
    }
  }


  function modTen(ccNum)
  { // Modulus 10 calculator used by all credit cards
    var numLen = ccNum.length;
    var tot=0;
    for(var x = numLen; x > 0; x-=2)
    {
      var a=ccNum.substr(x - 1, 1)-0;  // Extract alternate digits as numbers
      tot=tot+a; // and add to the checksum
    }
    for(x = numLen - 1; x > 0; x-=2)
    {
       var y = (ccNum.substr(x - 1, 1)-0) * 2;  // Extract the other alternate digits as numbers, double
                                                // and add each digit of the result to the checksum
       var z=y+"";
       if(z.length == '1'){tot+=y;}
       if(z.length == '2'){tot=tot+1; tot=tot+y-10; }
    }
    tot=tot+"";
    if(tot.substr(tot.length - 1, 1) == '0'){return 1;}
    else{return 0;}
  }


// GENERAL PURPOSE SHOP FUNCTIONS

 var selectedCat;
 function changeCategoryButton(td, categoryLevel, OnOff)
 {
   var fullLength=td.className.length;
   if (td.className.substr(fullLength-8)=="Selected") {return;}
   var newClass="categoryButton" + categoryLevel + OnOff;
   td.className=newClass;
 }

  function checkForm(f)
  {
//  alert ("Here in checkForm");
//  alert ("Name=" + f.name);

/*   To test the chosen option in a Select statement:
              var opt=f.selectname.selectedIndex;
                  var field=f.selectname.options[opt].text;

 (Can use value instead of text if the option statements have a value clause)
*/
    if (f.buttonPressed.value=="Cancel" || f.buttonPressed.value=="Back") {return true;}
    if (f.buttonPressed.value=="Delete" || f.buttonPressed.value=="MultipleDelete")
    {
      var confirmMsg = "Are you really sure you want to delete this record?";
      if (f.buttonPressed.value=="MultipleDelete") {confirmMsg = "Are you really sure you want to delete these records?";}
      if (confirm(confirmMsg))
      {return true;}
      else {return false;}
    }
    var errMsg="";

    var confirmMessage="";

    switch (f.name)
    {

      case "addressForm":
        if (empty(f.forename.value))
        {
          if (errMsg=="") {f.forename.focus();}
          errMsg+="Please enter your Forename\n";
        }

        if (empty(f.surname.value))
        {
          if (errMsg=="") {f.surname.focus();}
          errMsg+="Please enter your Surname\n";
        }
        if (empty(f.address1.value) && empty(f.address2.value) &&
            empty(f.address3.value) && empty(f.address4.value))
        {
          if (errMsg=="") {f.address1.focus();}
          errMsg+="Please enter your Address\n";
        }
        if (empty(f.postcode.value))
        {
          if (errMsg=="") {f.postcode.focus();}
          errMsg+="Please enter your Postcode\n";
        }

        if (empty(f.phone.value))
        {
          if (errMsg=="") {f.phone.focus();}
          errMsg+="Please enter your Telephone number\n";
        }
        else
        {
          var num=f.phone.value.replace(/ /g,"");

          if (num.length<11 || !isNumeric(num))
          {
            if (errMsg=="") {f.phone.focus();}
            errMsg+="Phone numbers must comprise at least 11 digits\n";
          }
        }

        if (empty(f.email.value))
        {
          if (errMsg=="") {f.email.focus();}
          errMsg+="Please enter your Email address\n";
        }
        else
        {
          if (!checkEmail(f.email.value))
          {
            if (errMsg=="") {f.email.focus();}
            errMsg+="That Email address is invalid\n";
          }
        }
      break;

      case "baseItemForm":
        if (empty(f.baseItemName.value))
        {
          if (errMsg=="") {f.baseItemName.focus();}
          errMsg+="Please enter the Item Name\n";
        }

        /*
        if (empty(f.baseItemDescription.value))
        {
          if (errMsg=="") {f.baseItemDescription.focus();}
          errMsg+="Please enter the Item Description\n";
        }
        */
        if (empty(f.baseItemPrice.value))
        {
          if (errMsg=="") {f.baseItemPrice.focus();}
          errMsg+="Please enter the Item Price\n";
        }
        else
        {
          if (!isNumeric(f.baseItemPrice.value, 2))
          {
            if (errMsg=="") {f.baseItemPrice.focus();}
            errMsg+="The Item Price must be numeric with a maximum of 2 decimal places\n";
          }
        }

        if (empty(f.baseItemCartridgeNumber.value))
        {
          if (errMsg=="") {f.baseItemCartridgeNumber.focus();}
          errMsg+="Please enter the Cartridge Number\n";
        }

        var opt=f.baseItemSpecialOffer.selectedIndex;
        var specialOffer=f.baseItemSpecialOffer.options[opt].value;

        if ((empty(f.baseItemSpecialOfferPrice.value) || f.baseItemSpecialOfferPrice.value==0) && specialOffer=="Y")
        {
          if (errMsg=="") {f.baseItemSpecialOfferPrice.focus();}
          errMsg+="Please enter the Item Special Offer Price\n";
        }
        else
        {
          if (!empty(f.baseItemSpecialOfferPrice.value) && !isNumeric(f.baseItemSpecialOfferPrice.value, 2))
          {
            if (errMsg=="") {f.baseItemSpecialOfferPrice.focus();}
                errMsg+="The Item Special Offer Price must be numeric, maximum 2 decimal places\n";
          }
        }


        if(f.includedInCategoryCount.value==0) {confirmMessage="There are no Categories selected for this Item. Proceed?";}
        else {confirmMessage="";}
      break;

      case "contactForm":
        if (empty (f.contactName.value))
        {
           if (errMsg=="")  {f.contactName.focus();}
           errMsg+="Please enter your Name\n";
        }

        /*
        if (empty (f.company.value))
        {
           if (errMsg=="")  {f.company.focus();}
           errMsg+="Please enter your Company Name\n";
        }


        // if (empty (f.address1.value) && empty (f.address2.value) && empty (f.address3.value))
        if (empty (f.address1.value))
        {
           if (errMsg=="")  {f.address1.focus();}
           errMsg+="Please enter your Address\n";
        }

        if (empty (f.postcode.value))
        {
           if (errMsg=="")  {f.postcode.focus();}
           errMsg+="Please enter your Postcode\n";
        }
        */
        if (empty (f.phone.value) && empty (f.email.value))
        {
           if (errMsg=="")  {f.phone.focus();}
           errMsg+="Please enter either your Telephone number or Email Address\n";
        }
        else
        {
          if (!empty (f.email.value) && !checkEmail (f.email.value))
          {
            if (errMsg=="")  {f.email.focus();}
            errMsg+="That Email address is not valid\n";
          }
        }

        if (empty (f.comments.value))
        {
           if (errMsg=="")  {f.comments.focus();}
           errMsg+="Please enter details of your Enquiry\n";
        }
        /*
        if (empty (f.fax.value))
        {
           if (errMsg=="")  {f.fax.focus();}
           errMsg+="Please enter your fax\n";
        }

        if (empty (f.spare02.value))
        {
           if (errMsg=="")  {f.spare02.focus();}
           errMsg+="Please enter your spare02\n";
        }

        if (empty (f.spare03.value))
        {
           if (errMsg=="")  {f.spare03.focus();}
           errMsg+="Please enter your spare03\n";
        }

        if (empty (f.spare04.value))
        {
           if (errMsg=="")  {f.spare04.focus();}
           errMsg+="Please enter your spare04\n";
        }

        if (empty (f.spare05.value))
        {
           if (errMsg=="")  {f.spare05.focus();}
           errMsg+="Please enter your spare05\n";
        }

        if (empty (f.spare06.value))
        {
           if (errMsg=="")  {f.spare06.focus();}
           errMsg+="Please enter your spare06\n";
        }

        if (empty (f.spare07.value))
        {
           if (errMsg=="")  {f.spare07.focus();}
           errMsg+="Please enter your spare07\n";
        }

        if (empty (f.spare08.value))
        {
           if (errMsg=="")  {f.spare08.focus();}
           errMsg+="Please enter your spare08\n";
        }

        if (empty (f.spare09.value))
        {
           if (errMsg=="")  {f.spare09.focus();}
           errMsg+="Please enter your spare09\n";
        }

        if (empty (f.spare10.value))
        {
           if (errMsg=="")  {f.spare10.focus();}
           errMsg+="Please enter your spare10\n";
        }

        if (empty (f.spare11.value))
        {
           if (errMsg=="")  {f.spare11.focus();}
           errMsg+="Please enter your spare11\n";
        }

        if (empty (f.spare12.value))
        {
           if (errMsg=="")  {f.spare12.focus();}
           errMsg+="Please enter your spare12\n";
        }

        if (empty (f.spare13.value))
        {
           if (errMsg=="")  {f.spare13.focus();}
           errMsg+="Please enter your spare13\n";
        }

        if (empty (f.spare14.value))
        {
           if (errMsg=="")  {f.spare14.focus();}
           errMsg+="Please enter your spare14\n";
        }

        */
      break;

      case "faqForm":
        if (empty(f.question.value))
        {
          if (errMsg=="") {f.question.focus();}
          errMsg+="Please enter the Question\n";
        }

        if (empty(f.answer.value))
        {
          if (errMsg=="") {f.answer.focus();}
          errMsg+="Please enter the Answer\n";
        }

        if (!empty(f.sequence.value) && !isNumeric(f.sequence.value))
        {
          if (errMsg=="") {f.sequence.focus();}
          errMsg+="If entered, the Sequence No. must be numeric\n";
        }

        /*
        if (empty(f.field05.value))
        {
          if (errMsg=="") {f.field05.focus();}
          errMsg+="Please enter the field05\n";
        }

        if (empty(f.field06.value))
        {
          if (errMsg=="") {f.field06.focus();}
          errMsg+="Please enter the field06\n";
        }
        */
       break;

      case "linkForm":
        if (empty(f.linkName.value))
        {
          if (errMsg=="") {f.linkName.focus();}
          errMsg+="Please enter the Link Name\n";
        }

        if (empty(f.description.value))
        {
          if (errMsg=="") {f.description.focus();}
          errMsg+="Please enter the Description\n";
        }

        if (empty(f.webAddress.value))
        {
          if (errMsg=="") {f.webAddress.focus();}
          errMsg+="Please enter the Web Address\n";
        }
        else
        {
          if (!checkURL(f.webAddress.value))
          {
            if (errMsg=="") {f.webAddress.focus();}
            errMsg+="That Web Address is not valid\n";
          }
        }

      break;

      case "orderdetailForm":
        if (empty(f.orderdetailItem.value))
        {
          if (errMsg=="") {f.orderdetailItem.focus();}
          errMsg+="Please enter the Item ordered\n";
        }

        if (empty(f.orderdetailQty.value))
        {
          if (errMsg=="") {f.orderdetailIQty.focus();}
          errMsg+="Please enter the Quantity ordered\n";
        }
        else
        {
          if (!isNumeric(f.orderdetailIQty.value))
          {
            if (errMsg=="") {f.orderdetailIQty.focus();}
            errMsg+="The Quantity ordered must be numeric\n"
          }
        }

        if (empty(f.orderdetailPrice.value))
        {
          if (errMsg=="") {f.orderdetailPrice.focus();}
          errMsg+="Please enter the Order Price\n";
        }
        else
        {
          if (!isNumeric(f.orderdetailPrice.value,2))
          {
            if (errMsg=="") {f.orderdetailPrice.focus();}
            errMsg+="The Order Price must be numeric, maximum 2 decimal places\n"
          }
        }

        if (dateEntered(f, "orderdetailDespatchDate"))
        {
          if (!validateDate(f, "orderdetailDespatchDate"))
          {
            if (errMsg=="") {f.orderdetailDespatchDate.focus();}
            errMsg+="Please enter your orderdetailDespatchDate\n";
          }
        }
        /*
        if (empty(f.orderdetailField08.value))
        {
          if (errMsg=="") {f.orderdetailField08.focus();}
          errMsg+="Please enter your orderdetailField08\n";
        }

        if (empty(f.orderdetailField09.value))
        {
          if (errMsg=="") {f.orderdetailField09.focus();}
          errMsg+="Please enter your orderdetailField09\n";
        }

        if (empty(f.orderdetailField10.value))
        {
          if (errMsg=="") {f.orderdetailField10.focus();}
          errMsg+="Please enter your orderdetailField10\n";
        }
        */
      break;

      case "orderhdrForm":

        if (empty(f.orderhdrReference.value))
        {
          if (errMsg=="") {f.orderhdrReference.focus();}
          errMsg+="Please enter the Order Reference\n";
        }

        if (!validateDate(f, "orderhdrOrderDate"))
        {
          if (errMsg=="") {f.orderhdrOrderDateDay.focus();}
          errMsg+="The Date of Order is not a valid date\n";
        }

        if (dateEntered(f, "orderhdrDespatchDate"))
        {
          if (!validateDate(f, "orderhdrDespatchDate"))
          {
            if (errMsg=="") {f.orderhdrDespatchDateDay.focus();}
            errMsg+="The Despatch Date is not a valid date\n";
          }
        }

        /*
        if (empty(f.orderhdrField07.value))
        {
          if (errMsg=="") {f.orderhdrField07.focus();}
          errMsg+="Please enter the orderhdrField07\n";
        }

        if (empty(f.orderhdrField08.value))
        {
          if (errMsg=="") {f.orderhdrField08.focus();}
          errMsg+="Please enter the orderhdrField08\n";
        }
        */
      break;

      case "postageForm":
        if (empty(f.postageOrderValueUpTo.value))
        {
          if (errMsg=="") {f.postageOrderValueUpTo.focus();}
          errMsg+="Please enter the Maximum Order Value\n";
        }
        else
        {
          if (!isNumeric(f.postageOrderValueUpTo.value,2))
          {
            if (errMsg=="") {f.postageOrderValueUpTo.focus();}
            errMsg+="The Maximum Order Value must be numeric, maximum 2 decimal places\n"
          }
        }

        if (empty(f.postage.value))
        {
          if (errMsg=="") {f.postage.focus();}
          errMsg+="Please enter the Postage\n";
        }
        else
        {
          if (!isNumeric(f.postage,2))
          {
            if (errMsg=="") {f.postage.focus();}
            errMsg+="The Postage must be numeric, maximum 2 decimal places\n"
          }
        }

      break;

      case "cartridgeSearchForm":
        if (empty(f.cartridgeNumber.value))
        {
          if (errMsg=="") {f.cartridgeNumber.focus();}
          errMsg+="Please enter the Cartridge Number\n";
        }
        else
        {
          var cartridgeNo = f.cartridgeNumber.value.replace(/ /g, "");
          var cartridgeNo = cartridgeNo.replace(/\./g, "");
          if (!checkAlphameric(cartridgeNo))
          {
            if (errMsg=="") {f.cartridgeNumber.focus();}
            errMsg+="Cartridge Number may only contain letters, numbers, spaces and full stops\n";
          }
        }
      break;

      case "printerSearchForm":
        if (empty(f.printerNumber.value))
        {
          if (errMsg=="") {f.printerNumber.focus();}
          errMsg+="Please enter the Printer Model\n";
        }

        else
        {
          var printerNo = f.printerNumber.value.replace(/ /g, "");
          var printerNo = printerNo.replace(/\./g, "");
          if (!checkAlphameric(printerNo))
          {
            if (errMsg=="") {f.printerNumber.focus();}
            errMsg+="Printer Number may only contain letters, numbers, spaces and full stops\n";
          }
        }

      break;

      default:
      return true;
    }

    if (errMsg!="")
    {
      alert(errMsg);
      return false;
    }
    else
    {
       if (confirmMessage!="")
       {
         if (confirm(confirmMessage)) {return true;}
         else {return false;}
       }
       else {return true;}
    }

  }

 function updateInCategoryCount(thisCheckbox)
 {
   // Updates a count of the number of Categories this item is included in so that a warning message can be given
   var e=getElement("baseItemForm");
   var catCount=Number(e.includedInCategoryCount.value);
   if (thisCheckbox.checked) {catCount++;}
   else {catCount--;}
   e.includedInCategoryCount.value=catCount;
 }