/**
 * @file
 * @author Shannon M. Rause <shannon.rause@creativeflavor.com>
 * @version $Revision: 1.25 $
 * @version $Name: ZEBRAMATS_2010-10-06_4 $
 * @version $Id: Ecommerce.js,v 1.25 2009/10/23 18:03:07 smr Exp $
 *
 * These files are copyrighted to Creative Flavor Inc. and are
 * subject to the terms of the applicable Service Agreement.
 * If no service agreement is available you must contact us at
 * legal@creativeflavor.com or 303-379-9450.
 * 
 * These files may be watermarked to ensure traceability.
 */
/**
 * Ecommerce class.
 */
function Ecommerce()
{
} // Ecommerce


/**
 * Adds (displays) a new catalog item price point row.
 *
 * @param max  Maximum number of rows.
 */
Ecommerce.addAdminCatalogItemPricePointRow = function(max)
{
   Ecommerce._addAdminRow(max,
                          'catalogItemPricePoint');
} // addAdminConferenceItemOptionRow


/**
 * Adds (displays) a new conference item option row.
 *
 * @param max  Maximum number of rows.
 */
Ecommerce.addAdminConferenceItemOptionRow = function(max)
{
   Ecommerce._addAdminRow(max,
                          'conferenceItemOption');
} // addAdminConferenceItemOptionRow


/**
 * Adds (displays) a new conference item registration row for admin.
 *
 * @param max  Maximum number of rows.
 */
Ecommerce.addAdminConferenceItemRegistrationRow = function(max)
{
   Ecommerce._addAdminRow(max,
                          'conferenceItemRegistration');
} // addAdminConferenceItemRegistrationRow


/**
 * Changes the catalog item admin custom tab's information.
 *
 * @param select  Type select control.
 */
Ecommerce.changeCatalogItemAdminCustomTab = function(select)
{
   var div = document.getElementById('custom');

   if (div)
   {
      var divs = div.getElementsByTagName('div');

      for (var i = 0; i < divs.length; i++)
      {
         if (divs[i].id.substr(0, 6) == 'custom')
         {
            divs[i].style.display = 'none';
         } // if
      } // for

      document.getElementById('custom' + select.value).style.display = 'block';
   } // if
} // changeCatalogItemAdminCustomTab


/**
 * Called when the catalog item payment type select control is changed.
 *
 * @param select  Payment type select.
 */
Ecommerce.changeCatalogItemPaymentType = function(select)
{
   if (select.value == 'pricePoints')
   {
      var ppDiv = 'block';
      var singleDiv = 'none';
      var singleRow = 'none';
   } // if
   else
   {
      var ppDiv = 'none';
      var singleDiv = 'block';
      var singleRow = '';
   } // else

   var i = 0;
   var elem = document.getElementById('catalogItemSinglePricingRow' + i);

   while (elem)
   {
      elem.style.display = singleRow;
      i++;
      elem = document.getElementById('catalogItemSinglePricingRow' + i);
   } // while

   document.getElementById('catalogItemPricePointsPricingDiv').style.display = ppDiv;
   document.getElementById('catalogItemPricePointsPricingDirections').style.display = ppDiv;
   document.getElementById('catalogItemSinglePricingDirections').style.display = singleDiv;
} // changeCatalogItemPaymentType


/**
 * Enables/disables the other amount text input as necessary.
 */
Ecommerce.changeDonationAmount = function(rb)
{
   var elem = document.getElementById('donationAmounts');

   if (elem)
   {
      if (rb.value == 'other')
      {
         var disabled = '';
      } // if
      else
      {
         var disabled = 'disabled';
      } // else

      var inputs = elem.getElementsByTagName('input');

      for (var i = 0; i < inputs.length; i++)
      {
         if (inputs[i].type == 'text')
         {
            inputs[i].disabled = disabled;
            inputs[i].value = '';
         } // if
      } // for
   } // if
} // changeDonationAmount


/**
 * Enable/disable catalog item inventory fields as appropriate.
 *
 * @param rb   Enabled radion button.
 */
Ecommerce.enableCatalogItemInventoryFields = function(rb)
{
   if (rb.value == 1)
   {
      var disabled = '';
   } // if
   else
   {
      var disabled = 'disabled';
   } // else

   document.getElementById('inventoryAvailable').disabled = disabled;
   document.getElementById('inventoryBackorderLevel').disabled = disabled;
   document.getElementById('inventoryUnavailableLevel').disabled = disabled;
   document.getElementById('inventoryEmailLevel').disabled = disabled;
} // enableCatalogItemInventoryFields


/**
 * Export to SCA.
 */
Ecommerce.exportToSca = function()
{
   if (document.location.search == '?cmd=adminSearch')
   {
      document.location = '/admin/list/_td/purchase/export/sca/search/1/';
   } // if
   else
   {
      document.location = '/admin/list/_td/purchase/export/sca/search/0/';
   } // else
} // exportToSca


/**
 * Show print purchase window.
 *
 * @param id   Purchase id.
 */
Ecommerce.printPurchase = function(id)
{
   window.open('/print/purchase/invoice/id/' + id, 'Purchase_' + id, 'height=550,width=600,location=no,menubar=no,resizeable=yes,scrollbars=yes,titlebar=no,toolbar=no');
} // printPurchase


/**
 * Shows hides payment tables as appropriate.
 *
 * @param select  Payment type select.
 */
Ecommerce.showCheckoutPaymentTables = function(select)
{
   for (var i = 0; i < select.options.length; i++)
   {
      var id = select.options[i].value;
      
      if (document.getElementById(id))
      {
         if (select.options[i].selected)
         {
            document.getElementById(id).style.display = '';
         } // if
         else
         {
            document.getElementById(id).style.display = 'none';
         } // else
      } // if
   } // for
} // showCheckoutPaymentFields


/**
 * Update the other price inputs (i.e. membership, wholesale) if availables when the
 * price is changed.
 *
 * @param input   Price input.
 */
Ecommerce.updateCatalogItemOtherPrices = function(input)
{
   var elem = document.getElementById('memberPrice');

   if ((elem) &&
       (!elem.value))
   {
      elem.value = input.value;
   } // if

   elem = document.getElementById('wholesalePrice');

   if ((elem) &&
       (!elem.value))
   {
      elem.value = input.value;
   } // if
} // updateCatalogItemOtherPrices


/**
 * Updates the conference item's total price based on the change to 
 * the option (or registration type) price.
 *
 * @param select  Option (or registration type) select control that just changed.
 */
Ecommerce.updateConferenceItemOptionPrice = function(select)
{
   var cur = parseFloat(document.getElementById(select.name + 'Price' + select.selectedIndex).value);

   var lastElem = document.getElementById(select.name + 'PriceLast');
   var last = parseFloat(lastElem.value);
   lastElem.value = cur;

   var totalElem = document.getElementById('totalPrice');
   var total = parseFloat(totalElem.firstChild.nodeValue);

   total = total - last + cur;
   total = Utils.formatPrice(total,
                             false);
   Utils.removeChildren(totalElem);
   totalElem.appendChild(document.createTextNode(total));
} // updateConferenceItemOptionPrice


/**
 * Updates the conference item's total price when page is loaded (onload).
 */
Ecommerce.updateConferenceItemTotalPrice = function()
{
   var form = document.forms['conferenceRegisterOptionsForm'];
   var total = 0.0;

   for (var i = 0; i < form.elements.length; i++)
   {
      var name = form.elements[i].name;
      var elem = document.getElementById(name + 'PriceLast');

      if (elem)
      {
         total += parseFloat(elem.value);
      } // if
   } // for

   var totalElem = document.getElementById('totalPrice');
   total = Utils.formatPrice(total,
                             false);
   Utils.removeChildren(totalElem);
   totalElem.appendChild(document.createTextNode(total));
} // updateConferenceItemTotalPrice


/**
 * Updates a single shipping field when the corresponding billing field updated.
 *
 * @param control    Input or select that changed.
 * @param formName   Name of shipping for (null for 'addressesForm').
 */
Ecommerce.updateShippingField = function(control,
                                         formName)
{
   var sameAsBill = document.getElementById('sameAsBill').checked;
   
   if (sameAsBill)
   {
      if (control.name.substr(0, 5) == 'bill_')
      {
         if ((formName == null) ||
             (formName == undefined))
         {
            formName = 'addressesForm';
         } // if

         var form = document.forms[formName];
         var name = 'ship_' + control.name.substring(5);

         for (var i = 0; i < form.elements.length; i++)
         {
            if (name == form.elements[i].name)
            {
               form.elements[i].value = control.value;
            } // if
         } // for
      } // if
   } // if
} // updateShippingField


/**
 * Updates shipping fields based on the sameAsBill flag.
 *
 * @param sameAsBill true if same as billing, false if not.
 * @param withZips   Array of countries with ZIP Codes.
 * @param formName   Name of shipping for (null for 'addressesForm').
 */
Ecommerce.updateShippingFields = function(sameAsBill,
                                          withZips,
                                          formName)
{
   if ((withZips == null) ||
       (withZips == undefined))
   {
      withZips = new Array();
   } // if

   if ((formName == null) ||
       (formName == undefined))
   {
      formName = 'addressesForm';
   } // if

   var form = document.forms[formName];
   var fields = {
      'salutation'      : '',
      'firstName'       : '',
      'lastName'        : '',
      'company'         : '',
      'position'        : '',
      'country'         : '',
      'street1'         : '',
      'street2'         : '',
      'street3'         : '',
      'city'            : '',
      'state'           : '',
      'zip'             : '',
      'region'          : '',
      'caProvince'      : '',
      'intlRegion'      : '',
      'postalCode'      : '',
      'caPostalCode'    : '',
      'intlPostalCode'  : '',
      'phone1'          : '',
      'phone2'          : '',
      'phone3'          : '',
      'fax'             : ''
   };

   var country = null;

   for (var i = 0; i < form.elements.length; i++)
   {
      if (form.elements[i].name.substr(0, 5) == 'ship_')
      {
         var name = form.elements[i].name.substring(5);

         if (name in fields)
         {
            if (sameAsBill == '1')
            {
               var billName = 'bill_' + name;

               for (j = 0; j < form.elements.length; j++)
               {
                  if (form.elements[j].name == billName)
                  {
                     form.elements[i].value = form.elements[j].value;
                     break;
                  } // if
               } // for

               form.elements[i].disabled = 'disabled';

               if (name == 'country')
               {
                  Core.onChangeCountry(form.elements[i], withZips, 'ship_');
               } // if
            } // if
            else
            {
               form.elements[i].disabled = '';
            } // else
         } // if
      } // if
   } // for
} // updateShippingFields


/**
 * Adds (displays) a new row in admin.
 *
 * @param max  Maximum number of rows.
 */
Ecommerce._addAdminRow = function(max,
                                  prefix)
{
   var i = 1;
   var elem = document.getElementById(prefix + 'Row' + i++);

   while (elem)
   {
      if (elem.style.display == 'none')
      {
         elem.style.display = '';
         break;
      } // if

      elem = document.getElementById(prefix + 'Row' + i++);
   } // while

   if (i >= max)
   {
      document.getElementById(prefix + 'AddRow').style.display = 'none';
   } // if
} // _addAdminRow



