/* Base Js */

//Dimension Select
var dimensionsSelect = function(lmnt, stage, totalStages, prodRef, offerCode, async) {
  // alert("dimensionsSelect");
  // dimension selected

  dimSelection = lmnt.value;
  // alert('dimSelection = ' + dimSelection + "\nstage=" + stage + "\ntotalStages=" + totalStages + "\nprodRef=" + prodRef + "\nofferCode=" + offerCode);

  if (dimSelection != '') {
    // a valid dimension selected
    if (stage < (totalStages - 1)) {
      // start with the common parms
      var parms = "&dim=" + (stage + 1) + "&refid=" + prodRef;
      // add any label text parms
      for (var i = 0; i <= stage; i++) {
        var labeltext = $("#labeldimension" + i + prodRef).text();
        if (labeltext != null && labeltext != '' && labeltext != undefined) {
          parms += "&dim" + i + "=" + labeltext;
        }
      }
      // add any select value parms
      for (var i = 0; i <= stage; i++) {
        var selecttext = $("#selectdimension" + i + prodRef).val();
        if (selecttext != null && selecttext != '' && selecttext != undefined) {
          parms += "&dim" + i + "=" + selecttext;
        }
      }
      if (offerCode != null && offerCode != '') {
        parms += "&offerCode=" + offerCode;
      }
      //$("#proddimension" + (stage + 1)).html('<div class="loading"></div>' + $("#proddimension" + (stage + 1)).html());
      $('#dimensionsloadimg' + prodRef).css('display','inline');
      $.ajax({
        url: "/za/STST/product/includes/selection-dimensions.jsp", 
        data: parms, 
        async: async,
        success: function(data){
        $('#dimensionsloadimg' + prodRef).css('display','none');
        $("#proddimension" + (stage + 1) + prodRef).html(data);
        var nextSel = document.getElementById("selectdimension"+(stage+1) + prodRef);
        if (nextSel != null) {
          var whatToDo = String(nextSel.getAttribute("onchange"));
          var one = whatToDo.split(",")[1];
          var two = whatToDo.split(",")[2];
          dimensionsSelect(nextSel,one,two,prodRef,offerCode);
        }
        
      }});



    } 
    else {
      var skuRefId = lmnt.options[lmnt.selectedIndex].getAttribute("skuref");
      updateSkuInfo(prodRef,skuRefId,offerCode, null);

    }
  }
}

var updateSkuInfo = function(prodRef, skuRef, offerCode, singlesku) {
  
  var refId = skuRef;
  var imgDir = "/images/product/zoom";

  $('#cartimgsrc').val(prodRef + '_' + colorRG[skuRef] + '.jpg');
  $('img.prodimage').attr('src','/images/product/detail/' + prodRef + '_' + colorRG[skuRef] + '.jpg');
  $('img.prodimage').parent().attr('href','/images/product/zoom/' + prodRef + '_' + colorRG[skuRef] + '.jpg');
  
  //show inventory
  var qoInventoryMsg = $("#proddimensions" + prodRef + " select:last option:selected").attr("inventory_message");
  if(qoInventoryMsg) {
    $('#availdate' + prodRef).html('<div class="msg">' + $("#proddimensions" + prodRef + " select:last option:selected").attr("inventory_message") + '</div>');
  }
  else {
    $('#availdate' + prodRef).empty();
  }
  //show price
  var price = $("#proddimensions" + prodRef + " select:last option:selected").attr("price");
  var price2 = $("#proddimensions" + prodRef + " select:last option:selected").attr("price2");
  var priceformat = $("#proddimensions" + prodRef + " select:last option:selected").attr("priceformat");


  if (singlesku != null && singlesku == 'true') {
    price = $("#singleskuinfo" + prodRef).attr("price");
    price2 = $("#singleskuinfo" + prodRef).attr("price2");
    priceformat = $("#singleskuinfo" + prodRef).attr("priceformat");
    qoInventoryMsg = $("#singleskuinfo" + prodRef).attr("inventoryMessage");
    if (qoInventoryMsg) {
      $('#availdate' + prodRef).html('<div class="msg">' + qoInventoryMsg + '</div>');
    }
  }

  if (priceformat != null && priceformat != '') {
    if (priceformat == 'special') {
      $('#price' + prodRef).html('<del>' + price + '</del>' + ' <span>' + price2 + '</span>' );
    } else if (priceformat == 'discount') {
      $('#price' + prodRef).html(price + ' <span>' + price2 + '</span>' );
    }
  } else {
    $('#price' + prodRef).html(price);
  }

}

var allDimensionsSelected = function(prodRefId) {
  var status = true;
  $("#proddimensions" + prodRefId + " select").each(function(i) {
    if (this.value == '') {
      alert("error at " + i)
      status = false;
      return false;
    }
  });

  return status;
}
var addtocart = function(prodRefId) {

  var outofstockmsg = "We're sorry this item is currently out of stock. Please check back for availability.";

  if (prodRefId == null || prodRefId == '') {
    alert('addtocart: no prodRefId passed in');
    return false;
  }

  //check if we have a single label sku as the last selection
  var skuidfromsingleskulabel = $("#singleskulabel" + prodRefId).text();
  if (skuidfromsingleskulabel != null && skuidfromsingleskulabel != '') {
    var invtemp = $("#singleskulabel" + prodRefId).attr("inventory_status");
    if ($("#singleskulabel" + prodRefId).attr("inventory_status") == "OUTOFSTOCK") {
      alert(outofstockmsg);
      return false;
    }
    $('#skuid' + prodRefId).val(skuidfromsingleskulabel);
    return true;
  } else if ($("#proddimensions" + prodRefId + " select:last").length == 0) {//check if we have no picklists at all.. (if so, the skuid in the form is taken care of by the jsp)
    // no selects
    if ($('#skuid' + prodRefId).attr("inventory_status") == "OUTOFSTOCK") {
      alert(outofstockmsg);
      return false;
    }
    return true;
  } else {
    var skuid = $("#proddimensions" + prodRefId + " select:last option:selected").val();
//    alert('addtocart(): skuid = '+skuid);

    if (skuid == '') {
      // first option (nothing) selected
      alert('Please make your selections');
      return false;
    } else {
      // at the last dimension
      if (allDimensionsSelected(prodRefId)) {
        // all dimensions selected

        if ($("#proddimensions" + prodRefId + " select:last option:selected").attr("inventory_status") == "OUTOFSTOCK") {
          alert(outofstockmsg);
          return false;
        }

        $('#skuid' + prodRefId).val(skuid);
        return true;
      }
      else {
        alert("Please make your selections");
      }
    }
  }

  return false;
}

var setDimSelectValue = function(selectid, dim) {
  //alert('In setDimSelectValue for select=' + selectid + ", dim=" + dim + ', setting #zoi_value_DIM_SELECTED_' + dim + '-1=' + $('#' + selectid).val());
  $('#zoi_value_DIM_SELECTED_' + dim + '-1').val($('#' + selectid).val());
}

var promptForContactUs = function() {
  
  $.fancybox({
    'href' : '/includes/contact-us/',
    'padding' : '30px',
    'width'   : '300px',
    'scrolling' : 'no',
    'showCloseButton' : true,
    'hideOnOverlayClick' : false,
    'hideOnContentClick' : false
  });

}

var handleContactUs = function() {
	if ( !validateEmail($('#contactusemail').val())) {
		 alert('Sorry, this email address does not appear to be valid.');
		 return false;
	}
  $('#contactusthanksloading').css('display','inline');
  $.ajax({
    url: "/za/STST/includes/contact-us-thanks.jsp", 
    data: $('#commentquestionform').serialize(), 
    async: true,
    success: function(data){
    $("#contactusthanks").html(data);
    }
  });
  return false;
}
var promptForShipCart = function(showCloseButton) {
  
  $.fancybox({
    'href' : '/includes/ship-prompt/',
    'padding' : '30px',
    'width'   : '300px',
    'scrolling' : 'no',
    'showCloseButton' : showCloseButton,
    'hideOnOverlayClick' : false,
    'hideOnContentClick' : false,
    'onComplete' : setupDatePicker
  });

}
var setupDatePicker = function() {
	$( "#datepicker" ).datepicker({ dateFormat: 'yymmdd', minDate: new Date()  });
}
var updateCheckoutStates = function(countryID, stateID, stateCode, addressType, altShipMethod){
  countryCode = $('#' + countryID).val();
  $('#' + stateID).html("<option value=''>Loading . . .</option>");
  var parms = "selectedCountryCode=" + countryCode + "&selectedStateCode=" + stateCode;
  $('#' + stateID).load('/includes/load-states/', parms, function() {
    // activateShipping(addressType,altShipMethod);
  });
  /*
    $('#' + stateID).load('/includes/load-states/', {
      selectedCountryCode:countryCode,
      selectedStateCode:stateCode
    });
  */
}
function shipAsBill() {
  if ($('#shipbillbox').attr('checked')) {
    copyBillingAddressToShipping();
  }
}
function billingChanged() { 
  if ($('#shipbillbox').attr('checked')) {
    // copy billing to shipping
    copyBillingAddressToShipping();
  }
}
var showCopy = function(siteCopyCode) {
  $.fancybox({
    'href' : '/copy/' + siteCopyCode + '/',
    'padding' : '30px',
    'width'   : '300px',
    'scrolling' : 'no',
    'showCloseButton' : true,
    'hideOnOverlayClick' : false,
    'hideOnContentClick' : false
  });
}
function copyBillingAddressToShipping() { 
  // pass all the values to the shipping address
  $('#usershipfirstname').val($('#userbillfirstname').val());
  $('#usershiplastname').val($('#userbilllastname').val());
  $('#usershipcompany').val($('#userbillcompany').val());
  $('#usershipstreet1').val($('#userbillstreet1').val());
  $('#usershipstreet2').val($('#userbillstreet2').val());
  $('#usershipcity').val($('#userbillcity').val());
  $('#usershipzip').val($('#userbillzip').val());
  $('#usershipphonedaytime').val($('#userbillphonedaytime').val());
  $('#usershipphoneevening').val($('#userbillphoneevening').val());
  $('#usershippingstateselect').val($('#userbillingstateselect').val());
}
var Cards = new makeArray(8);
Cards[0] = new CardType("MASTERCARD", "51,52,53,54,55", "16");
var MASTERCARD = Cards[0];
Cards[1] = new CardType("VISA", "4", "13,16");
var VISA = Cards[1];
Cards[2] = new CardType("AMEX", "34,37", "15");
var AMEX = Cards[2];
Cards[3] = new CardType("DINERS", "30,36,38", "14");
var DINERS = Cards[3];
Cards[4] = new CardType("DISCOVER", "6011", "16");
var DISCOVER = Cards[4];
Cards[5] = new CardType("ENROUTE", "2014,2149", "15");
var ENROUTE = Cards[5];
Cards[6] = new CardType("JCB", "3088,3096,3112,3158,3337,3528", "16");
var JCB = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/
function CheckCardNumber(form) {
  var tmpyear;
  var tmpmonth;
  var retval = "";
  var i = 0;
  
  if (form.elements['zop_account_number-1'].value.length == 0) {
    retval = "Please enter a Card Number.\n";

    return retval;
  }
  for (i = 0; i < form.elements['zop_account_number-1'].value.length; i++) {
    if (form.elements['zop_account_number-1'].value.substring(i, i + 1) < '0' ||
        form.elements['zop_account_number-1'].value.substring(i, i + 1) > '9') {
      return "Credit Card Number contains extraneous characters.  Enter only numbers.  Do not enter dashes or spaces.\n";
    }
  }
  
  tmpyear = form.elements['cc_exp_year'].options[form.elements['cc_exp_year'].selectedIndex].value;
  tmpmonth = form.elements['cc_exp_month'].options[form.elements['cc_exp_month'].selectedIndex].value;

  if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
    retval = "Credit Card Expiration Date is in the past.\n";
    return retval;
  }
  if (form.elements['zop_payee_name-1'].value.replace(/^\s*/, "").replace(/\s*$/, "").length == 0) {
    retval = "Name on Credit Card is not filled in.\n";
  }
  if (form.elements['zop_card_code-1'].value.replace(/^\s*/, "").replace(/\s*$/, "").length == 0) {
    retval += "Credit Card Security Code is not filled in.\n";
  }
  form.elements['zop_cc_exp_date-1'].value = tmpmonth + "/" + tmpyear;
  // The cardnumber has the valid luhn checksum, but we want to know which
  // cardtype it belongs to.
  cardname = "";
  for (var n = 0; n < Cards.size; n++) {
    if (Cards[n].checkCardNumber(form.elements['zop_account_number-1'].value, tmpyear, tmpmonth)) {
      cardname = Cards[n].getCardType();
      form.elements['zop_card_type-1'].value = cardname;
      break;
    }
  }
  if (cardname.length == 0) {
    retval = "Credit Card number is not valid.\n";
  }

  return retval;
}

/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year, 
                                        int month])
cardtype    : type of card, eg: MASTERCARD, VISA, etc.
rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
len         : valid length of cardnumber, eg: "16,19", "13,16".
year        : year of expiry date.
month       : month of expiry date.
eg:
var VISA = new CardType("VISA", "4", "16");
var AMEX = new CardType("AMEX", "34,37", "15");
\*************************************************************************/
function CardType() {
  var n;
  var argv = CardType.arguments;
  var argc = CardType.arguments.length;
  
  this.objname = "object CardType";
  
  var tmpcardtype = (argc > 0) ? argv[0] : "CardObject";
  var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
  var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";
  
  this.setCardNumber = setCardNumber;  // set CardNumber method.
  this.setCardType = setCardType;  // setCardType method.
  this.setLen = setLen;  // setLen method.
  this.setRules = setRules;  // setRules method.
  this.setExpiryDate = setExpiryDate;  // setExpiryDate method.
  
  this.setCardType(tmpcardtype);
  this.setLen(tmplen);
  this.setRules(tmprules);
  if (argc > 4)
    this.setExpiryDate(argv[3], argv[4]);
  
  this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
  this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
  this.getCardType = getCardType;  // getCardType method.
  this.isCardNumber = isCardNumber;  // isCardNumber method.
  this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
  this.luhnCheck = luhnCheck;// luhnCheck method.
  return this;
}

/*************************************************************************\
boolean checkCardNumber([String cardnumber, int year, int month])
return true if cardnumber pass the luhncheck and the expiry date is
valid, else return false.
\*************************************************************************/
function checkCardNumber() {
  var argv = checkCardNumber.arguments;
  var argc = checkCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  var year = (argc > 1) ? argv[1] : this.year;
  var month = (argc > 2) ? argv[2] : this.month;
  
  this.setCardNumber(cardnumber);
  this.setExpiryDate(year, month);
  
  if (!this.isCardNumber())
    return false;
  if (!this.isExpiryDate())
    return false;
  
  return true;
}
/*************************************************************************\
String getCardType()
return the cardtype.
\*************************************************************************/
function getCardType() {
  return this.cardtype;
}
/*************************************************************************\
String getExpiryDate()
return the expiry date.
\*************************************************************************/
function getExpiryDate() {
  return this.month + "/" + this.year;
}
/*************************************************************************\
boolean isCardNumber([String cardnumber])
return true if cardnumber pass the luhncheck and the rules, else return
false.
\*************************************************************************/
function isCardNumber() {
  var argv = isCardNumber.arguments;
  var argc = isCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  if (!this.luhnCheck())
    return false;
  
  for (var n = 0; n < this.len.size; n++)
    if (cardnumber.toString().length == this.len[n]) {
      for (var m = 0; m < this.rules.size; m++) {
        var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
        if (headdigit == this.rules[m])
          return true;
      }
      return false;
    }
  return false;
}

/*************************************************************************\
boolean isExpiryDate([int year, int month])
return true if the date is a valid expiry date,
else return false.
\*************************************************************************/
function isExpiryDate() {
  var argv = isExpiryDate.arguments;
  var argc = isExpiryDate.arguments.length;
  
  year = argc > 0 ? argv[0] : this.year;
  month = argc > 1 ? argv[1] : this.month;
  
  if (!isNum(year + ""))
    return false;
  if (!isNum(month + ""))
    return false;
  today = new Date();
  expiry = new Date(year, month);
  if (today.getTime() > expiry.getTime())
    return false;
  else
    return true;
}

/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else return false.
\*************************************************************************/
function isNum(argvalue) {
  argvalue = argvalue.toString();
  
  if (argvalue.length == 0)
    return false;
  
  for (var n = 0; n < argvalue.length; n++)
    if (argvalue.substring(n, n + 1) < "0" || argvalue.substring(n, n + 1) > "9")
      return false;
  
  return true;
}

/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
  var argv = luhnCheck.arguments;
  var argc = luhnCheck.arguments.length;
  
  var CardNumber = argc > 0 ? argv[0] : this.cardnumber;
  
  if (!isNum(CardNumber)) {
    return false;
  }
  
  var no_digit = CardNumber.length;
  var oddoeven = no_digit & 1;
  var sum = 0;
  
  for (var count = 0; count < no_digit; count++) {
    var digit = parseInt(CardNumber.charAt(count));
    if (!((count & 1) ^ oddoeven)) {
      digit *= 2;
      if (digit > 9)
        digit -= 9;
    }
    sum += digit;
  }
  if (sum % 10 == 0)
    return true;
  else
    return false;
}

/*************************************************************************\
ArrayObject makeArray(int size)
return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
  this.size = size;
  return this;
}

/*************************************************************************\
CardType setCardNumber(cardnumber)
return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
  this.cardnumber = cardnumber;
  return this;
}

/*************************************************************************\
CardType setCardType(cardtype)
return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
  this.cardtype = cardtype;
  return this;
}

/*************************************************************************\
CardType setExpiryDate(year, month)
return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
  this.year = year;
  this.month = month;
  return this;
}

/*************************************************************************\
CardType setLen(len)
return the CardType object.
\*************************************************************************/
function setLen(len) {
  // Create the len array.
  if (len.length == 0 || len == null)
    len = "13,14,15,16,19";
  
  var tmplen = len;
  n = 1;
  while (tmplen.indexOf(",") != -1) {
    tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
    n++;
  }
  this.len = new makeArray(n);
  n = 0;
  while (len.indexOf(",") != -1) {
    var tmpstr = len.substring(0, len.indexOf(","));
    this.len[n] = tmpstr;
    len = len.substring(len.indexOf(",") + 1, len.length);
    n++;
  }
  this.len[n] = len;
  return this;
}

/*************************************************************************\
CardType setRules()
return the CardType object.
\*************************************************************************/
function setRules(rules) {
  // Create the rules array.
  if (rules.length == 0 || rules == null)
    rules = "0,1,2,3,4,5,6,7,8,9";
  
  var tmprules = rules;
  n = 1;
  while (tmprules.indexOf(",") != -1) {
    tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
    n++;
  }
  this.rules = new makeArray(n);
  n = 0;
  while (rules.indexOf(",") != -1) {
    var tmpstr = rules.substring(0, rules.indexOf(","));
    this.rules[n] = tmpstr;
    rules = rules.substring(rules.indexOf(",") + 1, rules.length);
    n++;
  }
  this.rules[n] = rules;
  return this;
}

function checkReadReturnPolicy(form) {
  var errMsg = "";
  if(!form.elements['READ_RETURN_POLICY'].checked) {
    errMsg = "The Order Policy must be read, and the checkbox \ntitled 'I have read the order policy' \nmust be checked.\n";
  }
  return errMsg;
}

// check to make sure that all input fields have been filled in
function checkAddressPaymentInputValues() {
  var errMsg = "";
  
  errMsg += CheckCardNumber(document.addressform);
  
  // errMsg += checkReadReturnPolicy(form);
  
  // if (document.form1.elements['x_Card_Code'].value.length < 1) {
  //   errMsg += "You must enter a Card Code.\n";
  // }
  
  if (errMsg.length != 0) {
    alert("The following problems were found with your input:\n\n" + errMsg);
  }
  else {
    document.addressform.submit();
  }
}

function handleOrderSubmit(shipMethodRequired) {
  if (shipMethodRequired && $('input:radio[name=zo_shipping_method_id]:checked').val() == undefined) {
    alert('You must choose a shipping method.');
  }
  else {
    $('#shippingform').submit();
  }
}

function handleCommentSizeCount() {
  var commentSize = $('#zoc_comment').val().length;
  var charactersLeft = 250 - commentSize;
  
  if (charactersLeft >= 0) {
    $('#commentsizeinfo').html(charactersLeft + ' characters remaining.');
  }
  else {
    $('#zoc_comment').val($('#zoc_comment').val().substring(0, 250));
    $('#commentsizeinfo').html('<span style="color: red;">' + 0 + ' characters remaining.</span>');
  }
}

function validateEmail($email) {
  var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
  if (!emailReg.test($email)) {
    return false;
  } 
  else {
    return true;
  }
}

