/*******************************************************************************
* shoppingcart.js - Shopping cart
*
* $Source: H:\CVS\cvsrepo/Moonedge Javascripts/shoppingcart.js,v $
* $Revision: 1.2 $
* $Date: 2007/10/31 09:14:53 $
* $Author: Markus $
*
* Copyright (C) 2007 Moonedge E-Business GmbH, http://www.moonedge.ch
*******************************************************************************/

var shoppingCart = {
  monSym: 'Fr. ',
  paypalCurrency: 'CHF',
  blnShowNote: true,
  blnShowShipCol: true,
  blnShowShipRow: true,
  blnShowTaxCol: true,
  blnShowTaxRow: true,
  TaxRate: 0.076,
  TaxRateShip: 0.076,
  TaxIncluded: true,
  DefaultShipPrice: 0.0,

  cartSummaryID: '',

  g_TotalCost: 0,

  // URLs for shopping cart and checkout
  urlShowCart: 'showcart.html',
  urlCheckOut: 'checkout.html',

  // text constants for messages
  txtEmpty: "Ihr Einkaufskorb ist leer.",
  txtMax: "Ihr Einkaufskorb ist voll. Schliessen Sie bitte Ihre Bestellung ab.",
  txtAdded: "Der/die Artikel wurden zu Ihrem Einkaufskorb hinzugefügt.",
  txtRemove: "Klicken Sie 'Ok' um den Artikel aus Ihrem Einkaufskorb zu entfernen.",
  txtSum1: "Ihr Einkaufskorb enthält",
  txtSum2: "Artikel im Wert von",

  // text constants for buttons
  txtBtnAdd: "In den Einkaufskorb",
  txtBtnBack: "Zurück zum Shop",
  txtBtnCheckout: "Bestellung abschliessen",
  txtBtnShowCart: "Einkaufskorb anzeigen",
  txtBtnRemove: "Entfernen",

  // text constants for table headers
  txtLabAdd: "Anzahl",
  txtLabID: "Artikel",
  txtLabNam: "Beschreibung",
  txtLabQty: "Menge",
  txtLabPriUni: "Einzelpreis",
  txtLabPri: "Preis",
  txtLabShip: "Versand",
  txtLabTax: "MwSt",
  txtLabSubTot: "Zwischentotal",
  txtLabShipTot: "Versand",
  txtLabTaxTot: "MwSt",
  txtLabTot: "Total",
  txtLabOpt: "Optionen",

  txtErrQty: "Ungültige Menge.",

  /*** check quantity ***/
  chkQuantity: function(s) {
    var q = "";
    for (i = 0; i < s.length; i++) {
      ch = s.substring(i,i+1);
      if ((ch >= "0" && ch <= "9")) { q += ch; }
      if ((ch == "." || ch == ",")) { break; }
    }
    if (q.length < 1) { q = "1"; }
    return(q);
  },

  /*** format money ***/
  fmtMoney: function(c) {
    var val = Math.floor(c);
    var tmp = new String(c);
    for (var i = 0; i < tmp.length; i++ ) {
      if (tmp.charAt(i) == ".")
        break;
    }
    var frac = ""+Math.round(c * 100);
    frac = frac.substring(frac.length-2, frac.length)
    val += ((tmp.charAt(i+2) == "9")&&(frac == "00"))? 1 : 0;
    if (frac == "0") frac = "00";
    if (frac.length == 1) frac = "0"+frac;
    return(val+"."+frac);
  },

  /*** create the form to add an item ***/
  createItem: function(num,nam,price,ship,ship2,tax) {
    var strOut = "";
    strOut += "<div class=\"scAdd\">";
    strOut += "<form name=\"order"+num+"\" method=\"POST\" action=\""+shoppingCart.urlShowCart+"\" onSubmit=\"shoppingCart.add(this);return(true);\">";
    strOut += "<span>"+shoppingCart.txtLabAdd+"</span> <input type=\"text\" class=\"text\" size=\"2\" name=\"ItemQuantity\" onChange=\"this.value=shoppingCart.chkQuantity(this.value)\" value=\"1\">";
    strOut += "<input type=\"submit\" class=\"submit\" value=\""+shoppingCart.txtBtnAdd+"\">";
    if (num) strOut += "<input type=\"hidden\" name=\"ItemNumber\" value=\""+num+"\">";
    if (nam) strOut += "<input type=\"hidden\" name=\"ItemName\" value=\""+nam+"\">";
    if (price) strOut += "<input type=\"hidden\" name=\"ItemPrice\" value=\""+price+"\">";
    if (ship) strOut += "<input type=\"hidden\" name=\"ItemShipping\" value=\""+ship+"\">";
    if (ship2) strOut += "<input type=\"hidden\" name=\"ItemShipping2\" value=\""+ship2+"\">";
    if (tax) strOut += "<input type=\"hidden\" name=\"ItemTax\" value=\""+tax+"\">";
    strOut += "</form>";
    strOut += "</div>";
    document.write(strOut);
  },

  /*** add item to cart ***/
  add: function(frm) {
    var intNum = 0;
    var blnInCart = false;
    var strNot = "";
    var arrOrd = new Array(6);
    arrOrd[0] = (frm.ItemNumber) ? frm.ItemNumber.value : "";
    arrOrd[1] = (frm.ItemQuantity) ? frm.ItemQuantity.value : "1";
    arrOrd[2] = (frm.ItemPrice) ? frm.ItemPrice.value : "0.00";
    arrOrd[3] = (frm.ItemName) ? frm.ItemName.value : "";
    arrOrd[4] = (frm.ItemShipping) ? frm.ItemShipping.value : "0.00";
    arrOrd[5] = (frm.ItemAdd) ? frm.ItemAdd[frm.ItemAdd.selectedIndex].value : "";
    arrOrd[5] += (frm.ItemAdd2) ? ";"+frm.ItemAdd2[frm.ItemAdd2.selectedIndex].value : "";
    arrOrd[5] += (frm.ItemAdd3) ? ";"+frm.ItemAdd3[frm.ItemAdd3.selectedIndex].value : "";
    arrOrd[5] += (frm.ItemAdd4) ? ";"+frm.ItemAdd4[frm.ItemAdd4.selectedIndex].value : "";
    arrOrd[6] = (frm.ItemTax) ? frm.ItemTax.value : shoppingCart.TaxRate.toString();
    arrOrd[7] = (frm.ItemShipping2) ? frm.ItemShipping2.value : "0.00";

    if (parseFloat(arrOrd[1])<=0) return;

    intNum = shoppingCart.getCtrl("ItemCount"); if (!intNum) intNum = 0;

    // save the actual page address as "back to shop" address
    shoppingCart.setCtrl('BackURL',location.href);

    // loop over all existing items
    for (i = 1; i <= intNum; i++) {
      strItem = shoppingCart.getItem(i);
      if (strItem) {
        arrFld = strItem.split('|');
        if (arrFld[0] == arrOrd[0] && arrFld[2] == arrOrd[2] && arrFld[3] == arrOrd[3] && arrFld[5] == arrOrd[5]) {
          blnInCart = true;
          arrOrd[1] = (parseInt(arrOrd[1])+parseInt(arrFld[1]));
          shoppingCart.setItem(i,arrOrd.join('|'));
          strNot = shoppingCart.txtAdded;
          break;
        }
      }
    }

    // create new item
    if (!blnInCart) {
      intNum++;
      if (intNum > 15) { alert(shoppingCart.txtMax); return; }
      shoppingCart.setItem(intNum,arrOrd.join('|'));
      strNot = shoppingCart.txtAdded;
    }
    if (shoppingCart.blnShowNote) { alert(strNot); }
  },

  /*** update quantity of an item ***/
  update: function(id,q) {
    if (isNaN(q)) { alert(shoppingCart.txtErrQty); return; }
    if (q > 0) {
      strItem = shoppingCart.getItem(id);
      if (strItem) {
        arrFld = strItem.split('|');
        arrFld[1] = q;
        shoppingCart.setItem(id,arrFld.join('|'));
      }
    } else {
      shoppingCart.remove(id);
    }
    location.href = location.href;
  },

  /*** remove item from cart ***/
  remove: function(id) {
    if (confirm(shoppingCart.txtRemove)) {
      shoppingCart.removeItem(id);
      location.href = location.href;
    }
  },

  /*** remove all items from the cart ***/
  clearCart: function() {
    shoppingCart.setCookie('scItems','');
    shoppingCart.setCtrl('ItemCount',0);
  },

  /*** calulate the prices of an item ***/
  calcPrices: function(arr) {
    dTot = parseInt(arr[1])*parseFloat(arr[2]);
    dShip = parseFloat(arr[4])+(parseInt(arr[1])-1)*parseFloat(arr[7]);
    if (shoppingCart.TaxIncluded) {
      // tax is included
      dTax = (dTot*parseFloat(arr[6])/(1+parseFloat(arr[6])));
      dTax += (dShip*shoppingCart.TaxRateShip/(1+shoppingCart.TaxRateShip));
    } else {
      // tax is not included
      dTax = (dTot*parseFloat(arr[6]));
      dTax += (dShip*shoppingCart.TaxRateShip);
    }
    return { quantity: parseInt(arrFld[1]), price: dTot, ship: dShip, tax: dTax }
  },

  /*** calulate the sums ***/
  calcSums: function() {
    var intNum = 0;
    var intItems = 0;
    var dblTot = 0;
    var dblTax = 0;
    var dblShip = 0;

    intNum = shoppingCart.getCtrl("ItemCount"); if (!intNum) intNum = 0;
    if (intNum == 0) {
      return { items: intItems, price: dblTot, ship: dblShip, tax: dblTax }
    }

    // loop over all items
    dblShip = shoppingCart.DefaultShipPrice;
    for (i = 1; i <= intNum; i++) {
      strItem = shoppingCart.getItem(i);
      if (strItem) {
        arrFld = strItem.split('|');
        objItem = shoppingCart.calcPrices(arrFld);
        intItems += objItem.quantity;
        dblTot += objItem.price;
        dblShip += objItem.ship;
        dblTax += objItem.tax;
      }
    }
    return { items: intItems, price: dblTot, ship: dblShip, tax: dblTax }
  },

  /*** show contents of shopping cart ***/
  showCart: function(bEdit) {
    var intNum = 0;
    var strTot = "";
    var strTax = "";
    var strShip = "";
    var objSum = shoppingCart.calcSums();
    var strOut = "";

    strOut += "<div class=\"scCart\">";
    if (bEdit) {
      strOut += "<form name=\"shoppingcart\" method=\"POST\" action=\""+shoppingCart.urlCheckOut+"\">";
    }

    intNum = shoppingCart.getCtrl("ItemCount"); if (!intNum) intNum = 0;
    strOut += "<table><tr>" +
              "<th nowrap>"+shoppingCart.txtLabID+"</th>" +
              "<th nowrap>"+shoppingCart.txtLabNam+"</th>" +
              "<th nowrap>"+shoppingCart.txtLabQty+"</th>" +
              "<th nowrap>"+shoppingCart.txtLabPriUni+"</th>" +
              "<th nowrap>"+shoppingCart.txtLabPri+"</th>" +
              (shoppingCart.blnShowShipCol?"<th nowrap>"+shoppingCart.txtLabShip+"</th>":"") +
              (shoppingCart.blnShowTaxCol?"<th nowrap>"+shoppingCart.txtLabTax+"</th>":"") +
              (bEdit?"<th nowrap></th>":"");
    if (intNum == 0) {
      strOut += "<tbody class=\"empty\">";
      strOut += "<tr><td colspan=7>"+shoppingCart.txtEmpty+"</td></tr>";
      strOut += "</tbody>";
    }

    // loop over all items
    for (i = 1; i <= intNum; i++) {
      strItem = shoppingCart.getItem(i);
      if (strItem) {
        arrFld = strItem.split('|');
        objItem = shoppingCart.calcPrices(arrFld);
        strOut += "<tbody class=\"item\">";
        strOut += "<tr><td class=\"id\">"+arrFld[0]+"</td>";
        if (arrFld[5] == "")
          strOut += "<td class=\"name\">"+arrFld[3]+"</td>";
        else
          strOut += "<td class=\"name\">"+arrFld[3]+"<br>"+shoppingCart.txtLabOpt+" "+arrFld[5]+"</td>";
        if (bEdit) {
          strOut += "<td class=\"qty\"><input type=\"text\" name=\"Q\" size=\"2\" value=\""+arrFld[1]+"\" onChange=\"this.value=shoppingCart.chkQuantity(this.value);shoppingCart.update("+i+",this.value);\"></td>";
        } else {
          strOut += "<td class=\"qty\">"+arrFld[1]+"</td>";
        }
        strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+shoppingCart.fmtMoney(arrFld[2])+"</td>";
        strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+(shoppingCart.fmtMoney(objItem.price))+"</td>";
        if (shoppingCart.blnShowShipCol) {
          strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+shoppingCart.fmtMoney(objItem.ship)+"</td>";
        }
        if (shoppingCart.blnShowTaxCol) {
          strOut += "<td nowrap class=\"tax\">"+shoppingCart.fmtMoney(arrFld[6]*100)+"%</td>";
        }
        if (bEdit) {
          strOut += "<td class=\"remove\"><input type=button value=\" "+shoppingCart.txtBtnRemove+" \" onClick=\"shoppingCart.remove("+i+")\"></td></tr>";
        }
        strOut += "</tbody>";
      }
    }

    strTot = shoppingCart.fmtMoney(objSum.price);
    strShip = shoppingCart.fmtMoney(objSum.ship);
    strTax = shoppingCart.fmtMoney(objSum.tax);

    strOut += "<tbody class=\"sumsubtotal\">";
    strOut += "<tr><td colspan=4>"+shoppingCart.txtLabSubTot+"</td>";
    strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+strTot+"</td>";
    strOut += "<td colspan=2></td>";
    strOut += "</tr>";
    strOut += "</tbody>";
    if (shoppingCart.blnShowShipRow) {
      strOut += "<tbody class=\"sumship\">";
      strOut += "<tr><td colspan=4>"+shoppingCart.txtLabShipTot+"</td>";
      strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+strShip+"</td>";
      strOut += "<td colspan=2></td>";
      strOut += "</tr>";
      strOut += "</tbody>";
    }
    if (shoppingCart.blnShowTaxRow && !shoppingCart.TaxIncluded) {
      strOut += "<tbody class=\"sumtax\">";
      strOut += "<tr><td colspan=4>"+shoppingCart.txtLabTaxTot+"</td>";
      strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+strTax+"</td>";
      strOut += "<td colspan=2></td>";
      strOut += "</tr>";
      strOut += "</tbody>";
    }

    if (shoppingCart.TaxIncluded) {
      strTot = shoppingCart.monSym+shoppingCart.fmtMoney((objSum.price+objSum.ship))
    } else {
      strTot = shoppingCart.monSym+shoppingCart.fmtMoney((objSum.price+objSum.ship+objSum.tax))
    }

    strOut += "<tbody class=\"sumtotal\">";
    strOut += "<tr><td colspan=4>"+shoppingCart.txtLabTot+"</td>";
    strOut += "<td nowrap class=\"price\">"+strTot+"</td>";
    strOut += "<td colspan=2></td>";
    strOut += "</tr>";
    strOut += "</tbody>";

    if (shoppingCart.blnShowTaxRow && shoppingCart.TaxIncluded) {
      strOut += "<tbody class=\"sumtax\">";
      strOut += "<tr><td colspan=4>"+shoppingCart.txtLabTaxTot+"</td>";
      strOut += "<td nowrap class=\"price\">"+shoppingCart.monSym+strTax+"</td>";
      strOut += "<td colspan=2></td>";
      strOut += "</tr>";
      strOut += "</tbody>";
    }
    strOut += "</table>";

    if (bEdit) {
      if (shoppingCart.getCtrl('BackURL')) {
        strOut += "<button onclick=\"location.href=shoppingCart.getCtrl('BackURL'); return(false);\">"+shoppingCart.txtBtnBack+"</button>";
      }
      if (objSum.items > 0) {
        strOut += "<input type=\"submit\" value=\""+shoppingCart.txtBtnCheckout+"\">";
      }
      strOut += "</form>";
    } else {
      strOut += "<button onclick=\"location.href='"+shoppingCart.urlShowCart+"'; return(false);\">"+shoppingCart.txtBtnShowCart+"</button>";
    }
    strOut += "</div>";

    shoppingCart.g_TotalCost = (objSum.price+objSum.ship+objSum.tax);
    document.write(strOut);
    document.close();
  },

  /*** show contents of shopping cart as summary ***/
  showCartSummary: function() {
    var intNum = 0;
    var objSum = shoppingCart.calcSums();
    var strOut = "";
    strOut += "<div class=\"scCartSum\">";
    intNum = shoppingCart.getCtrl("ItemCount"); if (!intNum) intNum = 0;
    if (intNum == 0) {
      strOut += shoppingCart.txtEmpty;
    } else {
      if (shoppingCart.TaxIncluded) {
        strTot = shoppingCart.monSym+shoppingCart.fmtMoney((objSum.price+objSum.ship))
      } else {
        strTot = shoppingCart.monSym+shoppingCart.fmtMoney((objSum.price+objSum.ship+objSum.tax))
      }
      strOut += shoppingCart.txtSum1+" "+objSum.items+" "+shoppingCart.txtSum2+" "+strTot+" ";
      strOut += "<a href=\""+shoppingCart.urlShowCart+"\">"+shoppingCart.txtBtnShowCart+"</a>";
    }  
    strOut += "</div>";
    document.write(strOut);
    document.close();
  },

  /*** show contents of shopping cart as summary ***/
  createCheckOutFields: function(bPayPal) {
    var intNum = 0;
    var objSum = shoppingCart.calcSums();
    var strOut = "";

    intNum = shoppingCart.getCtrl("ItemCount"); if (!intNum) intNum = 0;

    if (bPayPal) {
      strOut += "<input type=hidden name=\"cmd\" value=\"_cart\">";
      strOut += "<input type=hidden name=\"upload\" value=\"1\">";
      strOut += "<input type=hidden name=\"currency_code\" value=\""+shoppingCart.paypalCurrency+"\">";
      if (shoppingCart.DefaultShipPrice > 0) {
        strOut += "<input type=hidden name=\"handling_cart\" value=\""+shoppingCart.DefaultShipPrice+"\">";
      }
    }

    // loop over all items
    for (i = 1; i <= intNum; i++) {
      strItem = shoppingCart.getItem(i);
      if (strItem) {
        arrFld = strItem.split('|');
        if (bPayPal) { // create fields for PayPal
          strOut += "<input type=hidden name=\"item_number_"+i+"\" value=\""+arrFld[0]+"\">";
          strOut += "<input type=hidden name=\"quantity_"+i+"\" value=\""+arrFld[1]+"\">";
          strOut += "<input type=hidden name=\"amount_"+i+"\" value=\""+arrFld[2]+"\">";
          strOut += "<input type=hidden name=\"item_name_"+i+"\" value=\""+arrFld[3]+"\">";
          if (parseFloat(arrFld[4])>0) strOut += "<input type=hidden name=\"shipping_"+i+"\" value=\""+arrFld[4]+"\">";
          if (parseFloat(arrFld[7])>0) strOut += "<input type=hidden name=\"shipping2_"+i+"\" value=\""+arrFld[7]+"\">";
          if (arrFld[5] != '') {
            strOut += "<input type=hidden name=\"on0_"+i+"\" value=\""+shoppingCart.txtLabOpt+"\">";
            strOut += "<input type=hidden name=\"os0_"+i+"\" value=\""+arrFld[5]+"\">";
          }
        } else {
          strOut += "<input type=hidden name=\"ItemNumber_"+i+"\" value=\""+arrFld[0]+"\">";
          strOut += "<input type=hidden name=\"ItemQuantity_"+i+"\" value=\""+arrFld[1]+"\">";
          strOut += "<input type=hidden name=\"ItemPrice_"+i+"\" value=\""+arrFld[2]+"\">";
          strOut += "<input type=hidden name=\"ItemName_"+i+"\" value=\""+arrFld[3]+"\">";
          if (parseFloat(arrFld[4])>0) strOut += "<input type=hidden name=\"ItemShipping_"+i+"\" value=\""+arrFld[4]+"\">";
          if (parseFloat(arrFld[7])>0) strOut += "<input type=hidden name=\"ItemShipping2_"+i+"\" value=\""+arrFld[7]+"\">";
          if (arrFld[5]) strOut += "<input type=hidden name=\"ItemAdd_"+i+"\" value=\""+arrFld[5]+"\">";
          if (parseFloat(arrFld[6])>0) strOut += "<input type=hidden name=\"ItemTax_"+i+"\" value=\""+arrFld[6]+"\">";
        }
      }
    }
    if (!bPayPal) {
      strOut += "<input type=hidden name=\"OrderTotal\" value=\""+shoppingCart.fmtMoney(objSum.price)+"\">";
      strOut += "<input type=hidden name=\"OrderShipping\" value=\""+shoppingCart.fmtMoney(objSum.ship)+"\">";
      if (shoppingCart.TaxIncluded) {
        strOut += "<input type=hidden name=\"OrderTax\" value=\"included\">";
      } else {
        strOut += "<input type=hidden name=\"OrderTax\" value=\""+shoppingCart.fmtMoney(objSum.tax)+"\">";
      }
    }
    document.write(strOut);
    document.close();
  },

  /*** functions to handle cookies ***/
  getCtrl : function(nam) {
    var c = shoppingCart.getCookie('scCart'); if (!c) return('');
    var arr = c.split('|'); var len = arr.length;
    for (var i = 0; i < len; i++) {
      fld = arr[i].split(' = ',2);
      if (fld[0] == nam) return(fld[1]);
    }
    return('');
  },
  setCtrl : function(nam,val) {
    var c = shoppingCart.getCookie('scCart'); 
    if (!c) { shoppingCart.setCookie('scCart',nam+' = '+val); return; } 
    var arr = c.split('|'); var len = arr.length;
    for (var i = 0; i < len; i++) {
      fld = arr[i].split(' = ',2);
      if (fld[0] == nam) { 
        arr[i] = nam+' = '+val; 
        shoppingCart.setCookie('scCart',arr.join('|'));
        return;
      }
    }
    arr[arr.length] = nam+' = '+val;
    shoppingCart.setCookie('scCart',arr.join('|'));  
  },
  getItem : function(item) {
    var c = shoppingCart.getCookie('scItems'); if (!c) return('');
    var arr = c.split('$$');
    if (item <= arr.length) { return(arr[item-1]); } else { return(''); }
  },
  setItem : function(item,val) {
    var c = shoppingCart.getCookie('scItems');
    if (!c) {
      shoppingCart.setCookie('scItems',val);
      shoppingCart.setCtrl('ItemCount',1);
      return;
    }
    var arr = c.split('$$'); var len = arr.length;
    if (item <= arr.length) { arr[item-1] = val; } else { arr[arr.length] = val; }
    shoppingCart.setCookie('scItems',arr.join('$$'));
    shoppingCart.setCtrl('ItemCount',arr.length);
  },
  removeItem : function(item) {
    var c = shoppingCart.getCookie('scItems');
    if (!c) {
      shoppingCart.setCtrl('ItemCount',0); return;
    }
    var arr = c.split('$$'); var len = arr.length;
    for (var i = item-1; i < len; i++) {
      arr[i] = arr[i+1];
    }
    arr.length--;
    shoppingCart.setCookie('scItems',arr.join('$$'));
    shoppingCart.setCtrl('ItemCount',arr.length);
  },
  getCookie : function(nam) {
    var prefix = nam+"=";
    var begin = document.cookie.indexOf(prefix);
    if (begin == -1) return null;
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(begin+prefix.length, end));
  },
  setCookie : function(nam,val,exp,pat,dom,sec) {
    document.cookie = nam+"="+escape(val) +
                      ((exp) ? "; expires="+exp.toGMTString() : "") +
                      ((pat) ? "; path="+pat : "") +
                      ((dom) ? "; domain="+dom : "") +
                      ((sec) ? "; secure" : "");
  },
  removeCookie : function(nam,pat,dom) {
    if (shoppingCart.getCookie(nam)) {
      document.cookie = nam+"=" +
                        ((pat) ? "; path="+pat : "") +
                        ((dom) ? "; domain="+dom : "") +
                        "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
  }
}