/* SVN $Id: cart.js 338 2011-09-01 15:17:03Z Onno $ */
/* SVN $URL: file:///T:/SOURCE_SVN/NetShop_Cart/trunk/httpdocs/js/cart.js $ */

/*###########################################################################*/
/*# SNIP_NAW */

  function NAW_Initialize()
  {
    var oCompanyOrderCheckbox    = WHITE_GetElementFlex('company_order');
    var oBillingCompanyNameField = WHITE_GetElementFlex('billing_companyname');
    var oCustomDeliveryCheckbox  = WHITE_GetElementFlex('custom_shippingaddress');
    var oShippingCountrySelect   = WHITE_GetElementFlex('shipping_country_code');
    var oBillingCountrySelect    = WHITE_GetElementFlex('billing_country_code');
    var oOrderRemarkTextarea     = WHITE_GetElementFlex('order_remark');
    var oSecPaymethodHead        = WHITE_GetElementFlex('secpaymethod');
    var oSecPaymethodFoldOut     = WHITE_GetElementFlex('secpaymethod_foldout');

    WHITE_InitializeFolds();

    if (oCompanyOrderCheckbox && oBillingCompanyNameField)
    {
      oCompanyOrderCheckbox.checked = WHITE_IsFormFieldSet(oBillingCompanyNameField);
    }
    if (oCompanyOrderCheckbox && !oCompanyOrderCheckbox.checked)
    {
      WHITE_FoldIn('company');
    }
    else
    {
      WHITE_FoldOut('company');
    }

    if (oCustomDeliveryCheckbox && !oCustomDeliveryCheckbox.checked)
    {
      WHITE_FoldIn('delivery');
    }
    else
    {
      WHITE_FoldOut('delivery');
    }

    if (oOrderRemarkTextarea && '' == oOrderRemarkTextarea.value)
    {
      WHITE_FoldIn('orderremark');
    }
    else
    {
      WHITE_FoldOut('orderremark');
    }

    if (oSecPaymethodHead && oSecPaymethodFoldOut)
    {
      var oChildRadios = WHITE_GetElementsByClass(oSecPaymethodFoldOut,'radio', 'input');
      var bRadioChecked = false;
      for (var iRa=0;iRa<oChildRadios.length;iRa++)
      {
        if (oChildRadios[iRa] && oChildRadios[iRa].checked)
        {
          bRadioChecked = true;
        }
      }
      if (!bRadioChecked)
      {
        WHITE_FoldIn(oSecPaymethodHead);
      }
    }

    WHITE_AddEvent(oCustomDeliveryCheckbox, 'click',    Cart_CountryChange);
    WHITE_AddEvent(oCustomDeliveryCheckbox, 'change',   Cart_CountryChange);
    
    WHITE_AddEvent(oShippingCountrySelect,  'click',    Cart_CountryChange);
    WHITE_AddEvent(oShippingCountrySelect,  'change',   Cart_CountryChange);
    WHITE_AddEvent(oShippingCountrySelect,  'keypress', Cart_CountryChange);
    
    WHITE_AddEvent(oBillingCountrySelect,   'click',    Cart_CountryChange);
    WHITE_AddEvent(oBillingCountrySelect,   'change',   Cart_CountryChange);
    WHITE_AddEvent(oBillingCountrySelect,   'keypress', Cart_CountryChange);
    
    WHITE_AddEvent(oCompanyOrderCheckbox,   'click',    Cart_CompanyOrderChangeEvent);
    WHITE_AddEvent(oCompanyOrderCheckbox,   'change',   Cart_CompanyOrderChangeEvent);

    var oChildRadios = WHITE_GetElementFlex('data[paymethod_code]');
    for (var iRa=0;iRa<oChildRadios.length;iRa++)
      {
        if (oChildRadios[iRa])
        {
          WHITE_AddEvent(oChildRadios[iRa], 'click', Cart_PayMethodChange);
        }
      }
    
    Cart_CountryChange();
    Cart_PayMethodChange();
  }

  if ('function' == typeof WHITE_AddBodyLoadFunction)
  {
    WHITE_AddBodyLoadFunction(NAW_Initialize);
  }
  
  /* Aid function for Cart_CountryChange */
  function in_array(needle, haystack, argStrict)
  {
      var key = '',        strict = !! argStrict;
   
      if (strict) {
          for (key in haystack) {
              if (haystack[key] === needle) {                return true;
              }
          }
      } else {
          for (key in haystack) {            if (haystack[key] == needle) {
                  return true;
              }
          }
      } 
      return false;
  }
  
    function Cart_PayMethodChange(oEvent)
  {
   if (typeof(aComboS2P) != "undefined")
   {
     var sSelectedSendMethodCode = WHITE_GetFormFieldValue('data[sendmethod_code]' , 'orderform');
     
     // check paymethods
     if ((aPayMethods.length > 0) && (sSelectedSendMethodCode.length > 0) && (sSelectedSendMethodCode != 0))
     {
      for (sPayMethodCode in aPayMethods)
       {
         if (!in_array(sPayMethodCode, aComboS2P[sSelectedSendMethodCode]))
         {
           Cart_DisablePayMethod("paymethod_code-" + sPayMethodCode, "paymethodrow_" + sPayMethodCode);
         }
         else
         {
           Cart_EnablePayMethod("paymethod_code-" + sPayMethodCode, "paymethodrow_" + sPayMethodCode);
         }
       }
     }

     // check sendmethods (when a paymethod changes)
     var sSelectedPayMethodCode = WHITE_GetFormFieldValue('data[paymethod_code]' , 'orderform');
     if ((aSendMethods.length > 0) && (sSelectedPayMethodCode.length > 0) && (sSelectedPayMethodCode != 0))
     {
       for (sSendMethodCode in aSendMethods)
       {
         if (!in_array(sSendMethodCode, aComboP2S[sSelectedPayMethodCode]))
         {
           Cart_DisableSendMethod("sendmethod_code-" + sSendMethodCode, "sendmethodrow_" + sSendMethodCode);  
         }
         else
         {
           Cart_EnableSendMethod("sendmethod_code-" + sSendMethodCode, "sendmethodrow_" + sSendMethodCode);  
         }
       }
     }
   }
  }

  function Cart_CountryChange(oEvent)
  {
    var oOrderForm = WHITE_GetElementFlex('orderform');

    if (oOrderForm)
    {
     if (typeof(aPayMethods) != "undefined")
     {
       if (aPayMethods.length > 0)
       {
         var sPayMethodCode    = ''; 
         
         var sBillingCountry   = WHITE_GetFormFieldValue('billing_country_code', 'orderform');
         var sShippingCountry  = CartCustom_GetAddressCountryCode();
         
         var bBillingOk  = true;
         var bShippingOk = true;
         for (sPayMethodCode in aPayMethods)
         {
           bBillingOk = true; bShippingOk = true;
           if (aPayCheckBilling[sPayMethodCode]  && !(in_array(sBillingCountry , aPayMethods[sPayMethodCode], false))) bBillingOk = false; 
           if (aPayCheckShipping[sPayMethodCode] && !(in_array(sShippingCountry, aPayMethods[sPayMethodCode], false))) bShippingOk = false;
           
           if (!bBillingOk || !bShippingOk) { Cart_DisablePayMethod("paymethod_code-" + sPayMethodCode, "paymethodrow_" + sPayMethodCode); }
                                       else { Cart_EnablePayMethod("paymethod_code-" + sPayMethodCode, "paymethodrow_" + sPayMethodCode); }
         }
       }
     }
     
     if (typeof(aSendMethods) != "undefined")
     {
       if (aSendMethods.length > 0)
       {
         var sSendMethodCode    = ''; 
         
         var sBillingCountry   = WHITE_GetFormFieldValue('billing_country_code', 'orderform');
         var sShippingCountry  = CartCustom_GetAddressCountryCode();
         var bBillingOk  = true;
         var bShippingOk = true;
         
         for (sSendMethodCode in aSendMethods)
         {
           bBillingOk = true; bShippingOk = true;
           if (aSendCheckBilling[sSendMethodCode]  && !(in_array(sBillingCountry , aSendMethods[sSendMethodCode], false))) bBillingOk = false; 
           if (aSendCheckShipping[sSendMethodCode] && !(in_array(sShippingCountry, aSendMethods[sSendMethodCode], false))) bShippingOk = false;
           
           if (!bBillingOk || !bShippingOk) { Cart_DisableSendMethod("sendmethod_code-" + sSendMethodCode, "sendmethodrow_" + sSendMethodCode); }
                                       else { Cart_EnableSendMethod("sendmethod_code-" + sSendMethodCode, "sendmethodrow_" + sSendMethodCode); }
         }
       }
     }
    }
  }
  
  function Cart_DisablePayMethod(sRadioButton, sPaymentRow)
  {
      var oRadio = WHITE_GetElementFlex(sRadioButton);
      if (oRadio)
      {
        oRadio.checked = false;
        oRadio.disabled = true;
      }
      
      var aRows = WHITE_GetElementFlex(sPaymentRow);
      if (aRows)
      {
        WHITE_AddRemoveClassName(aRows,'hidden', true);
      }  
  }
  
  function Cart_EnablePayMethod(sRadioButton, sPaymentRow)
  {
    var oRadio = WHITE_GetElementFlex(sRadioButton);
    if (oRadio)
      {
        oRadio.disabled = false;
      }
      
     var aRows = WHITE_GetElementFlex(sPaymentRow);
     if (aRows)
      {
        WHITE_AddRemoveClassName(aRows,'hidden', false);
      } 
  }

  function Cart_DisableSendMethod(sButton, sSendRow)
  {
    var oButton = WHITE_GetElementFlex(sButton);
    if (oButton)
    {
      oButton.disabled = true;
      WHITE_AddRemoveClassName(oButton, 'disabled', true);
      
      // hook (to enable custom js)
      if (typeof Cart_AfterDisableSendMethod == 'function')
      {
        Cart_AfterDisableSendMethod(oButton);
      }
    }
    
    var aRows = WHITE_GetElementFlex(sSendRow);
    if (aRows)
      {
        WHITE_AddRemoveClassName(aRows,'hidden', true);
      } 
  }
  
  function Cart_EnableSendMethod(sButton, sSendRow)
  {
    var oButton = WHITE_GetElementFlex(sButton);
    if (oButton)
    {
      oButton.disabled = false;
      WHITE_AddRemoveClassName(oButton, 'disabled', false);
      
      // hook
      if (typeof Cart_AfterEnableSendMethod == 'function')
      {
        Cart_AfterEnableSendMethod(oButton);
      }
    }
    
    var aRows = WHITE_GetElementFlex(sSendRow);
    if (aRows)
      {
        WHITE_AddRemoveClassName(aRows,'hidden', false);
      } 
  }
  
  function CartCustom_GetAddressCountryCode()
  {
    sResult = false;
    oCustomDeliveryCheckbox = WHITE_GetElementFlex('custom_shippingaddress');
    oUseCountrySelect = false;
    if (oCustomDeliveryCheckbox && oCustomDeliveryCheckbox.checked)
    {
      oUseCountrySelect  = WHITE_GetElementFlex('shipping_country_code');
    }
    else
    {
      oUseCountrySelect = WHITE_GetElementFlex('billing_country_code');
    }
    if (oUseCountrySelect)
    {
      if (oUseCountrySelect.options && oUseCountrySelect.options[oUseCountrySelect.selectedIndex])
      {
        sResult = oUseCountrySelect.options[oUseCountrySelect.selectedIndex].value;
      }
    }
    return sResult;
  }

  function Cart_CompanyOrderChangeEvent(oEvent)
  {
    var oBillingCompanyNameField = WHITE_GetElementFlex('billing_companyname');
    var oBillingVatNumberField   = WHITE_GetElementFlex('billing_vatnumber');

    if (this.checked)
    {
      WHITE_AddClassName(oBillingCompanyNameField,'required');
    }
    else
    {
      WHITE_RemoveClassName(oBillingCompanyNameField,'required');
      oBillingCompanyNameField.value = '';
      oBillingVatNumberField.value   = '';
      WhiteForm_FieldUpdate(oBillingCompanyNameField);
    }
  }

/*# /SNIP_NAW */
/*############################################################################*/
/*# NON-SNIPPET-STUFF */

function Cart_FieldFocus(oEvent)
{
  WHITE_AddClassName(this,'focus');
  WHITE_RemoveClassName(this.id+'_help','hidden');
}

function Cart_FieldBlur(oEvent)
{
  WhiteForm_FieldUpdate(this.id);
}

function Cart_FormSubmitEvent(oEvent)
{
  document.body.style.cursor = 'wait';
}

function Cart_ItemCountChangeEvent(oEvent)
{
  var iebody=(document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body

  var dsoctop=document.all? iebody.scrollTop : pageYOffset

  document.body.style.cursor = 'wait';
  var oCartForm = WHITE_GetElementFlex('CartForm');
  oCartForm.redir.value='cartlist&scrollinview=' + dsoctop;
  oCartForm.submit();
}

function Cart_ProcessLinkClickEvent(oEvent)
{
  document.body.style.cursor = 'wait';
  return true;
}

function Cart_ButtonClickEvent(oEvent)
{
  document.body.style.cursor = 'wait';
  this.style.cursor = 'wait';
  return true;
}

//### Function called by hook 'WHITE_FoldHeadAfterUpdate'
function Cart_FoldHeadAfterUpdate(oParam)
{
  var oResult = new Object;
  if ( 'object' == typeof oParam['oHeadElement']
       && 'boolean' == typeof oParam['bIsOpen'] )
  {
    //### If opened customshipbar
    if ( 'customshipbar' == oParam['oHeadElement'].id
         && oParam['bIsOpen'] )
    {
      var oBillLastname = WHITE_GetElementFlex('billing_lastname');
      var oShipLastname = WHITE_GetElementFlex('shipping_lastname');
      var oBillTitle = WHITE_GetElementFlex('billing_title');
      var oShipTitle = WHITE_GetElementFlex('shipping_title');
      var oBillCountry = WHITE_GetElementFlex('billing_country_code');
      var oShipCountry = WHITE_GetElementFlex('shipping_country_code');
      if ( oShipLastname && '' == oShipLastname.value)
      {
        if ( oShipLastname && oBillLastname )
        {
          oShipLastname.value = oBillLastname.value;
          WhiteForm_FieldUpdate(oShipLastname);
        }
        if ( oBillTitle && oShipTitle )
        {
          oShipTitle.value = oBillTitle.value;
          WhiteForm_FieldUpdate(oShipTitle);
        }
        if ( oBillCountry && oShipCountry )
        {
          oShipCountry.value = oBillCountry.value;
          WhiteForm_FieldUpdate(oShipCountry);
        }
      }
    }

    //### If opened orderremark
    if ('orderremark' == oParam['oHeadElement'].id
         && oParam['bIsOpen'] )
    {
      var oOrderRemark = WHITE_GetElementFlex('order_remark');
      if (oOrderRemark)
      {
        oOrderRemark.focus();
      }
    }
  }
  return oResult;
}

function Cart_ReplaceDynamics()
{
  // BEZIG:
  if ('function' == typeof WHITE_RegisterHook)
  {
    WHITE_RegisterHook('WHITE_FoldHeadAfterUpdate',Cart_FoldHeadAfterUpdate);
  }
  if ('function' == typeof WHITE_AddEventToElement)
  {
    //WHITE_AddEventToElement('billing_country_code','change',Cart_UpdatePayMethodFolds, 'select');
    WHITE_AddEventToElement('CartForm','submit',Cart_FormSubmitEvent, 'form');
  }
  if ('function' == typeof WHITE_AddEventToElement)
  {
    WHITE_AddEventToClass(document,'order','mousedown',Cart_FieldFocus, 'input'); // doing this beside of focus fixes problem with select box
    WHITE_AddEventToClass(document,'order','focus',Cart_FieldFocus, 'input');
    WHITE_AddEventToClass(document,'order','blur',Cart_FieldBlur, 'input');
    WHITE_DisableSelectClass(document,'foldhead', 'li');
    WHITE_AddEventToClass(document,'itemcount','change',Cart_ItemCountChangeEvent, 'select');
    WHITE_AddEventToClass(document,'itemcount','click',Cart_ItemCountChangeEvent, 'input');
    WHITE_AddEventToClass(document,'processlink','click',Cart_ProcessLinkClickEvent, 'a');
  }
  if ('function' == typeof Cart_UpdatePayMethodFolds)
  {
    //Cart_UpdatePayMethodFolds();
  }
  if ('function' == typeof WHITE_InitializeFolds)
  {
    WHITE_InitializeFolds();
  }


}

///// EXECUTE ON SCRIPT LOAD

var o_bCart_ShippingInfoChanged = new Object;

if ('function' == typeof WHITE_AddBodyLoadFunction)
{
  WHITE_AddBodyLoadFunction(Cart_ReplaceDynamics);
}

/////

/****** CART FUNCTIONS ******/

function Cart_SetBillingShippingInfoChanged(oEvent)
{
  if ('object' == typeof this)
  {
    var aInfoFromElement = Cart_GetBillingShippingInfoFromElement(this);
    if ('billing' == aInfoFromElement[0])
    {
      var sShippingId = 'shipping_' + aInfoFromElement[1];
      var oShippingElement = WHITE_GetElementFlex(sShippingId);
      if ('object' == typeof oShippingElement)
      {
        if (!o_bCart_ShippingInfoChanged[aInfoFromElement[1]])
        {
          oShippingElement.value = this.value;
        }
      }
    }

    //// uncomment next 'if' if ShippingInfoChanged can only be set from shipping fields
    //// now shippinginfochanged is set to false as billing info is changed to shipping values

    // else if ('shipping' == aInfoFromElement[0])
    // {
    var sBillingId       = 'billing_' + aInfoFromElement[1];
    var oBillingElement  = WHITE_GetElementFlex(sBillingId);

    var sShippingId      = 'shipping_' + aInfoFromElement[1];
    var oShippingElement = WHITE_GetElementFlex(sShippingId);

    if ('object' == typeof oBillingElement && 'object' == typeof oShippingElement)
    {
      o_bCart_ShippingInfoChanged[aInfoFromElement[1]] = (oShippingElement.value != oBillingElement.value);
    }
    // }
  }
}

function Cart_GetBillingShippingInfoFromElement(oElement)
{
  var sReg = /data\[(.+)\]/;
  var sType = '';
  var sElementName = '';

  if ('undefined' != typeof oElement.name)
  {
    var sRealElementName = oElement.name.replace(sReg, '$1');
    var aNameParts = sRealElementName.split(/_/);
    if (aNameParts.length > 1)
    {
      var sFirstPartOfId = aNameParts[0];
      if ('billing' == sFirstPartOfId)
      {
        sElementName = sRealElementName.substring(8);
        sType = 'billing';
      }
      else if ('shipping' == sFirstPartOfId)
      {
        sElementName = sRealElementName.substring(9);
        sType = 'shipping';
      }
    }
  }
  return new Array(sType, sElementName);
}

function Cart_InitToCopyFields()
{
  var aInputsWithinForm  = WHITE_GetElementsByTagName('orderform', 'input');
  var aOptionsWithinForm = WHITE_GetElementsByTagName('orderform', 'select');


  var aElementsWithinForm = aInputsWithinForm.concat(aOptionsWithinForm);

  var aBillingElements  = new Object();
  var aShippingElements = new Object();


  for(var i = 0; i < aElementsWithinForm.length; i++)
  {
    var oElement = aElementsWithinForm[i];
    if ('object' == typeof oElement)
    {
      var aInfoFromElement = Cart_GetBillingShippingInfoFromElement(oElement);
      if ('' != aInfoFromElement[0])
      {
        if ('billing' == aInfoFromElement[0])
        {
          aBillingElements[aInfoFromElement[1]] = oElement;
        }
        else if ('shipping' == aInfoFromElement[0])
        {
          aShippingElements[aInfoFromElement[1]] = oElement;
        }
      }
    }
  }

  for (var sFieldname in aBillingElements)
  {
    if ('undefined' != typeof aShippingElements[sFieldname])
    {
      // shipping element exists so add event to billing element

      WHITE_AddEventToElement(aBillingElements[sFieldname],  'change', Cart_SetBillingShippingInfoChanged);
      WHITE_AddEventToElement(aShippingElements[sFieldname], 'change', Cart_SetBillingShippingInfoChanged);
    }
  }
}

function Cart_CheckScrollIntoView()
{
  var aLocationParts = document.location.toString().split(/&/);
  var iScrollTop = -1;
  for(var i = 0; i < aLocationParts.length; i++)
  {
    var aArgumentParts = aLocationParts[i].toString().split(/=/);
    if (aArgumentParts[0] == 'scrollinview')
    {
      iScrollTop = aArgumentParts[1];
    }
  }

  if (!isNaN(iScrollTop) && iScrollTop > -1)
  {
    window.scrollTo(0, iScrollTop);
  }
  else
  {
    var oElement = WHITE_GetElementFlex(iScrollTop);
    if ('object' == typeof oElement)
    {
      if (!InView(oElement))
      {
        oElement.scrollIntoView(true);
      }
    }
  }
}

// http://www.xs4all.nl/~zanstra/logs/jsLog.htm
function InView(element,margin) {
  if(!margin) margin=0;
  var Top=GetTop(element), ScrollTop=GetScrollTop();
  return !(Top<ScrollTop+margin||
    Top>ScrollTop+GetWindowHeight()-element.offsetHeight-margin);
}
function ScrollIntoView(element,bAlignTop,margin) {
  if(!margin) margin=0;
  var posY=GetTop(element);
  if(bAlignTop) posY-=margin;
  else posY+=element.offsetHeight+margin-GetWindowHeight();
  window.scrollTo(0, posY);
}

function GetWindowHeight() {
  return window.innerHeight||
    document.documentElement&&document.documentElement.clientHeight||
    document.body.clientHeight||0;
}
function GetScrollTop() {
  return window.pageYOffset||
    document.documentElement&&document.documentElement.scrollTop||
    document.body.scrollTop||0;
}
function GetTop(element) {
  var pos=0;
  do pos+=element.offsetTop
  while(element=element.offsetParent);
  return pos;
}

if ('function' == typeof WHITE_AddBodyLoadFunction)
{
  WHITE_AddBodyLoadFunction(Cart_InitToCopyFields);
  WHITE_AddLoadEvent(Cart_CheckScrollIntoView);
}

/******* BACKWARDS COMPATABILITY FUNCTIONS ******/
function PopUpWindow(Wurl,Wname,Wtoolbar,Wlocation,Wdirectories,Wstatus,Wmenubar,Wscrollbars,Wresizable,Wcopyhistory,_width,_height)
{
  var Wtop  = (document.body.clientHeight-_height)/2;
  var Wleft = (document.body.clientWidth-_width)/2
  var nw = window.open(Wurl,Wname,"height="+_height+",width="+_width+",top="+Wtop+",left="+Wleft+",resizable="+Wresizable+",scrollbars="+Wscrollbars+",toolbar="+Wtoolbar+",menubar="+Wmenubar+",location="+Wlocation+",status="+Wstatus+",directories="+Wdirectories);
}

/******** Cart Cookie Detection *******/

function Cart_Js2Session()
{
  if (document.images && '/cart.php'==document.location.pathname) // do not run on ogone pages etc
  {
    var sJs2SessionUrl = '/cart.php?process=js2session&show=spacer';
    if ( 'undefined' != typeof pageTracker
         && 'function' == typeof pageTracker._getLinkerUrl )
    {
      var sTestUrl = 'http://www.extsite.com/';
      var sTrackParam = pageTracker._getLinkerUrl(sTestUrl);
      if (sTrackParam)
      {
        sTrackParam = sTrackParam.substring(sTestUrl.length+1);
        sJs2SessionUrl += sJs2SessionUrl+'&extreturnadd='+escape(sTrackParam);
      }
    }
    document['oWhiteJsImage'] = document.createElement('image');
    document['oWhiteJsImage'].src = sJs2SessionUrl;
  }
}

if ('function' == typeof WHITE_AddBodyLoadFunction)
{
  WHITE_AddBodyLoadFunction(Cart_Js2Session);
}

/******* EXECUTE ON LOAD OF THIS FILE ******/

if ('function' == typeof WHITE_AddBodyLoadFunction)
{
  if ('function' == typeof WhiteForm_InstallDynamics)
  {
    WHITE_AddBodyLoadFunction(WhiteForm_InstallDynamics);
  }
}
if ('function' == typeof WHITE_AddLoadEvent)
{
  if ('function' == typeof ncTracking)
  {
    WHITE_AddLoadEvent(ncTracking);
  }
}




