// 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;
 }

// Application specific shop functions
 var portrait = "";
 function setFrames(offOn, item)
 { // Sets the display of photos & tripanels to appear with varying types of frame

   switch (offOn)
   {
     case "unframed":
       setFrame1 ("off", item);     // Set 1" Frame off
       setFrame2 ("off", item);     // Set 2" Frame off
     break;

     case "1B":
       setFrame1 ("onB", item);     // Set 1" Black Frame on
       setFrame2 ("off", item);     // Set 2" Frame off
     break;

     case "1S":
       setFrame1 ("onS", item);     // Set 1" Silver Frame on
       setFrame2 ("off", item);     // Set 2" Frame off
     break;

     case "2B":
       setFrame1 ("onB", item);     // Set 1" Black Frame on
       setFrame2 ("onB", item);     // Set 2" Black Frame on
     break;

     case "2S":
       setFrame1 ("onS", item);     // Set 1" Silver Frame on
       setFrame2 ("onS", item);     // Set 2" Silver Frame on
     break;

     case "1BR":
       setFrame1 ("onBR", item);     // Set 1" Brown Frame on
       setFrame2 ("off", item);     // Set 2" Frame off
     break;

     case "2BR":
       setFrame1 ("onBR", item);     // Set 1" Brown Frame on
       setFrame2 ("onBR", item);     // Set 2" Brown Frame on
     break;
   }
   setMount(offOn, item);                  // Set mount colour according to frame
   var f = getElement("panoramicForm");
   if (f) {f.frame.value = offOn;}
  }

  function setFrame1 (onOff, item)
  {
     if (item=="tripanel")
     {
       if (onOff=="off") {var side="tripanelDisplayF1SideOff"; var top="tripanelDisplayF1Off";}
       else {var side="tripanelDisplayF1SideOn"; var top="tripanelDisplayF1On";}
     }
     else
     {
       switch (onOff)
       {
         case "off":
           var side="photoDisplayF1SideOff" + portrait;
           var top="photoDisplayF1Off" + portrait;
         break;

         case "onB":
           var side="photoDisplayF1SideOn" + portrait;
           var top="photoDisplayF1On" + portrait;
         break;

         case "onS":
           var side="photoDisplayF1SideOnSilver" + portrait;
           var top="photoDisplayF1OnSilver" + portrait;
         break;

         case "onBR":
           var side="photoDisplayF1SideOnBrown" + portrait;
           var top="photoDisplayF1OnBrown" + portrait;
         break;
       }
     }

     var e=getElement("f1Top");
     e.className=top;
     e=getElement("f1Left");
     e.className=side;
     e=getElement("f1Right");
     e.className=side;
     e=getElement("f1Bottom");
     e.className=top;
  }

  function setFrame2 (onOff, item)
  {
     if (item=="tripanel")
     {
       if (onOff=="off") {var side="tripanelDisplayF2SideOff"; var top="tripane2DisplayF1Off";}
       else {var side="tripane2DisplayF1SideOn"; var top="tripane2DisplayF1On";}
     }
     else
     {

       switch (onOff)
       {
         case "off":
           var side="photoDisplayF2SideOff" + portrait;
           var top="photoDisplayF2Off" + portrait;
         break;

         case "onB":
           var side="photoDisplayF2SideOn" + portrait;
           var top="photoDisplayF2On";
         break;

         case "onS":
           var side="photoDisplayF2SideOnSilver" + portrait;
           var top="photoDisplayF2OnSilver" + portrait;
         break;

         case "onBR":
           var side="photoDisplayF2SideOnBrown" + portrait;
           var top="photoDisplayF2OnBrown" + portrait;
         break;
       }
     }
     var e=getElement("f2Top");
     e.className=top;
     e=getElement("f2Left");
     e.className=side;
     e=getElement("f2Right");
     e.className=side;
     e=getElement("f2Bottom");
     e.className=top;
  }

  function setMount(offOn, item)
  {
    if (item != "Colour")  { return;}
    var top = getElement("mountTop");
    var left = getElement("mountLeft");
    var right = getElement("mountRight");
    var bottom = getElement("mountBottom");
    var sig = getElement("signature");

    if (top && left && right && bottom && sig)
    {
      switch (offOn)
      {
        case "1BR":
          top.className = "mountTopColourBrown";
          left.className = "mountLeftColourBrown";
          right.className = "mountRightColourBrown";
          bottom.className = "mountBottomColourBrown";
          sig.src = "images/signaturecream2.gif";
        break;

        case "2BR":
          top.className = "mountTopColourBrown";
          left.className = "mountLeftColourBrown";
          right.className = "mountRightColourBrown";
          bottom.className = "mountBottomColourBrown";
          sig.src = "images/signaturecream2.gif";
        break;

        default:
          top.className = "mountTopColour";
          left.className = "mountLeftColour";
          right.className = "mountRightColour";
          bottom.className = "mountBottomColour";
          sig.src = "images/sigsm.gif";
      }
    }
  }

  function changeMainImage(mainPath, newText, newID)
  {
    var e=getElement('mainItemPicture');
    e.src=mainPath;

    if (newText != null)
    {
      e = getElement('mainText');
      if (e) {e.innerHTML = newText;}
    }

    if (newID != null)
    {
      e = getElement('mainLink');
      if (e) {e.href = "displayFullBaseItem.php?baseItemID=" + newID;}
      var  f = getElement('panoramicForm');
      if (f)
      {
        var linkText = getElement("colourLink");
        if (linkText) {linkText.innerHTML = "View Black & White";}
        f.colourbw.value = "Colour";
        f.baseItemID.value = newID;
      }
    }

  }


  function changeColour()
  {
    var  f = getElement('panoramicForm');
    if (f)
    {
     var SRC = "photos/baseItem" + f.baseItemID.value + ".JPG";
     var greySRC = "photos/baseItem" + f.baseItemID.value + "Grey.JPG";
     var e=getElement('mainItemPicture');
     if (e)
     {
       var linkText = getElement("colourLink");
       if (f.colourbw.value != "Black & White")
       {
         e.src = greySRC;
         linkText.innerHTML = "View Colour";
         f.colourbw.value = "Black & White";
       }
       else
       {
         e.src = SRC;
        linkText.innerHTML = "View Black & White";
         f.colourbw.value = "Colour";
       }
     }
    }

  }

  function changePanoramicImage(pageOffset)
  {
    var newID = baseItemIDArray[pageOffset];
    var  f = getElement('panoramicForm');
    if (f)
    {
      var linkText = getElement("colourLink");
      if (linkText) {linkText.innerHTML = "View Black & White";}
      f.colourbw.value = "Colour";
      f.baseItemID.value = newID;
    }
    var e=getElement('mainItemPicture');
    e.src = imageArray[pageOffset];
    var td = getElement('imageNameTD');
    if (td) {td.innerHTML = imageNameArray[pageOffset];}
    td = getElement('imageCodeTD');
    if (td)
    {
      if (baseItemCodeArray[pageOffset] != "") {td.innerHTML = "(Code " + baseItemCodeArray[pageOffset] + ")";}
      else {td.innerHTML = "";}
    }
    currentOffset = pageOffset;
  }

  function nextImage()
  {
    var newOffset = currentOffset + 1;
    if (newOffset > imageArray.length - 1) {newOffset = 0;}
    changePanoramicImage(newOffset)
  }

  function prevImage()
  {
    var newOffset = currentOffset - 1;
    if (newOffset < 0 ) {newOffset = imageArray.length - 1;}
    changePanoramicImage(newOffset)
  }