var days = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');

function checkDate(date) {
 var theMonth = leadingZero(date.getMonth() + 1);
 var theDate = leadingZero(date.getDate());
 var theDay = today.getDay();
 var noShip = new Array(
   '05/25','07/03','07/04','09/07','11/25','11/26','11/27','12/24','12/25','12/31','01/01');

 if (in_array(theMonth + '/' + theDate,noShip) || theDay == '6' || theDay == '0') {
   return false;
 } else {
   return true;
 }
}

function setShippingDropdown(day) {
  var chosenMeth = document.getElementById('s_method1').value;
  if (days[day] == 'Monday' || days[day] == 'Tuesday' || days[day] == 'Wednesday') {
    var selected = document.getElementById('s_method1').value;
    document.getElementById('s_method1').options.length = 0;
    document.getElementById('s_method1').options[0] = new Option('Standard','Standard');
    document.getElementById('s_method1').options[1] = new Option('Overnight','Overnight');
    document.getElementById('s_method1').options[2] = new Option('Overnight a.m. delivery','Overnight a.m. delivery');
    //document.getElementById('s_method1').options[3] = new Option('UPS 2nd Day Air','UPS 2nd Day Air');
    if (selected == 'Overnight') {
      document.getElementById('s_method1').options[1].selected = true;
    } else if (selected == 'UPS 2nd Day Air') {
      document.getElementById('s_method1').options[3].selected = true;    
    } else if (selected == 'Overnight a.m. delivery') {
      document.getElementById('s_method1').options[2].selected = true;
    }
  } else {
    //document.getElementById('s_method1').options.length = 0;
    //document.getElementById('s_method1').options[0] = new Option('Overnight','Overnight');
    //document.getElementById('s_method1').options[1] = new Option('Overnight a.m. delivery','Overnight a.m. delivery');
  }
}


function setShipping(date) {

  // Messages
  var msg1 = "Standard shipping is only available on Monday through Wednesday.  If you would like to receive your order this week, please press Cancel and select Overnight shipping from the pull down.  If shipping next week is OK, press OK and your ship date will be reset to next Monday.";
  var msg2 = "We do not ship on weekends.  Click OK to have your ship date updated to the following Monday or Cancel to make another choice.";
  var msg3 = "We cannot ship via Standard Shipping on your selected date.  Click OK to choose another shipping method or another shipping date.";

  // Store the shipping method chosen by the customer
  var shipMethod = document.getElementById('s_method1').value;

  // Set up a date object and set it to the chosen date
  var oSelDate = new Date();
  var tokens = date.split("/");
  var sel_month = tokens[0];
  var sel_date = tokens[1];
  var sel_year = tokens[2];
  oSelDate.setFullYear(sel_year,sel_month-1,sel_date);

  // Find out what the day of the week is for the selected date
  var sel_day = oSelDate.getDay();

  // If Monday, Tuesday, or Wednesday is chosen, allow both shipping meths
  if (days[sel_day] == 'Monday' || days[sel_day] == 'Tuesday' || days[sel_day] == 'Wednesday') {
    var selected = document.getElementById('s_method1').value;
    document.getElementById('s_method1').options.length = 0;
    document.getElementById('s_method1').options[0] = new Option('Standard','Standard');
    document.getElementById('s_method1').options[1] = new Option('Overnight','Overnight');
    document.getElementById('s_method1').options[2] = new Option('Overnight a.m. delivery','Overnight a.m. delivery');
    //document.getElementById('s_method1').options[3] = new Option('UPS 2nd Day Air','UPS 2nd Day Air');
    if (selected == 'Overnight') {
      document.getElementById('s_method1').options[1].selected = true;
    } else if (selected == 'UPS 2nd Day Air') {
      document.getElementById('s_method1').options[3].selected = true;
    } else if (selected == 'Overnight a.m. delivery') {
      document.getElementById('s_method1').options[2].selected = true;
    }
  }

  // If Thursday and standard is chosen, either change ship date to next Monday 
  // with standard shipping or upgrade them to overnight depending on customer choice
  if (days[sel_day] == 'Thursday' && shipMethod == 'Standard') {
    var answer = confirm(msg1);

    if (answer) {
      oSelDate.setDate(oSelDate.getDate() + 4);
      while(!checkDate(oSelDate)) {
        oSelDate.setDate(oSelDate.getDate() + 1);
      }
      
      var m = leadingZero(oSelDate.getMonth() + 1);
      var da = leadingZero(oSelDate.getDate());
      var y = oSelDate.getFullYear();
      document.getElementById('txtShipOn').value = m + '/' + da + '/' + y;
    } else {
       document.getElementById('s_method1').options.length = 0;
       document.getElementById('s_method1').options[0] = new Option('Overnight','Overnight');
       document.getElementById('s_method1').options[1] = new Option('Overnight a.m. delivery','Overnight a.m. delivery');
    }
  }

  // If Friday and standard is chosen, either change ship date to next Monday 
  // with standard shipping or upgrade them to overnight depending on customer choice
  if (days[sel_day] == 'Friday' && shipMethod == 'Standard') {
    var answer = confirm(msg1);

    if (answer) {
      oSelDate.setDate(oSelDate.getDate() + 3);
      while(!checkDate(oSelDate)) {
        oSelDate.setDate(oSelDate.getDate() + 1);
      }
      var m = leadingZero(oSelDate.getMonth() + 1);
      var da = leadingZero(oSelDate.getDate());
      var y = oSelDate.getFullYear();
      document.getElementById('txtShipOn').value = m + '/' + da + '/' + y;
    } else {
       document.getElementById('s_method1').options.length = 0;
       document.getElementById('s_method1').options[0] = new Option('Overnight','Overnight');
       document.getElementById('s_method1').options[2] = new Option('Overnight a.m. delivery','Overnight a.m. delivery');
    }
  }


  if (days[sel_day] == 'Saturday' || days[sel_day] == 'Sunday') {
    var answer = confirm(msg2);

    if (answer) {
      var inc = (days[sel_day] == 'Saturday')? 2 : 1;
      oSelDate.setDate(oSelDate.getDate() + inc);
      var m = leadingZero(oSelDate.getMonth() + 1);
      var da = leadingZero(oSelDate.getDate());
      var y = oSelDate.getFullYear();
      document.getElementById('txtShipOn').value = m + '/' + da + '/' + y;
    }
  }

  var no2DayShip = new Array('11/25','12/22','12/23','12/30');
  if (in_array(sel_month+'/'+sel_date,no2DayShip) && selected == 'Standard') {
    alert(msg3);
    return false;
  }
}

/* ************** */

function com_stewartspeak_replacement() {
  /*
    Dynamic Heading Generator
    By Stewart Rosenberger
    http://www.stewartspeak.com/headings/

    This script searches through a web page for specific or general elements
    and replaces them with dynamically generated images, in conjunction with
    a server-side script.
  */

  // replaceSelector(selector, phpfile, wordwrap, fontfile, size, background, foreground, store)
  // replaceSelector("h4","/services/heading.php",false,"font.ttf","12","FFFFFF","999999","build200501");

  var testURL = "/images/test.png" ;
  var doNotPrintImages = false;
  var printerCSS = "/replacement-print.css";
  var hideFlicker = false;
  var hideFlickerCSS = "/replacement-screen.css";
  var hideFlickerTimeout = 1000;

  /* ---------------------------------------------------------------------------
      For basic usage, you should not need to edit anything below this comment.
      If you need to further customize this script's abilities, make sure
      you're familiar with Javascript. And grab a soda or something.
  */

  var items;
  var imageLoaded = false;
  var documentLoaded = false;

  function replaceSelector(selector,url,wordwrap,font,size,foreground,background,store) {
    if(typeof items == "undefined") {
      items = new Array();
    }
    items[items.length] = {selector: selector, url: url, wordwrap: wordwrap, font: font, size: size, foreground: foreground, background: background, store: store};
  }

  if(hideFlicker) {    
    document.write('<link id="hide-flicker" rel="stylesheet" media="screen" href="' + hideFlickerCSS + '" />');    
    window.flickerCheck = function() {
      if(!imageLoaded) {
        setStyleSheetState('hide-flicker',false);
      }
    };
    setTimeout('window.flickerCheck();',hideFlickerTimeout)
  }

  if(doNotPrintImages) {
    document.write('<link id="print-text" rel="stylesheet" media="print" href="' + printerCSS + '" />');
  }

  var test = new Image();
  test.onload = function() { imageLoaded = true; if(documentLoaded) replacement(); };
  test.src = testURL + "?date=" + (new Date()).getTime();

  addLoadHandler(function(){ documentLoaded = true; if(imageLoaded) replacement(); });


  function documentLoad() {
    documentLoaded = true;
    if(imageLoaded) {
      replacement();
    }
  }

  function replacement() {
    if(items) {
      for(var i=0;i<items.length;i++) {
        var elements = getElementsBySelector(items[i].selector);
        if(elements.length > 0) for(var j=0;j<elements.length;j++) {
          if(!elements[j]) {
            continue;
          }

          var text = extractText(elements[j]);
          while(elements[j].hasChildNodes()) {
            elements[j].removeChild(elements[j].firstChild);
          }

          var tokens = items[i].wordwrap ? text.split(' ') : [text] ;
          for(var k=0;k<tokens.length;k++) {
            var url = items[i].url + "?text="+ escape(tokens[k]+' ')+ "&selector="+ escape(items[i].selector)+ "&font="+ escape(items[i].font)+ "&size="+ escape(items[i].size)+ "&foreground="+ escape(items[i].foreground)+"&background="+ escape(items[i].background)+ "&store="+escape(items[i].store);
            var image = document.createElement("img");
            image.className = "replacement";
            image.alt = tokens[k] ;
            image.src = url;
            elements[j].appendChild(image);
          }

          if(doNotPrintImages) {
            var span = document.createElement("span");
            span.style.display = 'none';
            span.className = "print-text";
            span.appendChild(document.createTextNode(text));
            elements[j].appendChild(span);
          }
        }
      }

      if(hideFlicker) {
        setStyleSheetState('hide-flicker',false);
      }
    }
  }

  function addLoadHandler(handler) {
    if(window.addEventListener) {
      window.addEventListener("load",handler,false);
    } else if(window.attachEvent) {
      window.attachEvent("onload",handler);
    } else if(window.onload) {
      var oldHandler = window.onload;
      window.onload = function piggyback() {
        oldHandler();
        handler();
      };
    } else {
      window.onload = handler;
    }
  }

  function setStyleSheetState(id,enabled) {
    var sheet = document.getElementById(id);
    if(sheet) {
      sheet.disabled = (!enabled);
    }
  }

  function extractText(element) {
    if(typeof element == "string") {
      return element;
    } else if(typeof element == "undefined") {
      return element;
    } else if(element.innerText) {
      return element.innerText;
    }

    var text = "";
    var kids = element.childNodes;
    for(var i=0;i<kids.length;i++) {
      if(kids[i].nodeType == 1) {
        text += extractText(kids[i]);
      } else if(kids[i].nodeType == 3) {
        text += kids[i].nodeValue;
      }
    }

    return text;
  }

  /*
    Finds elements on page that match a given CSS selector rule. Some
    complicated rules are not compatible.
    Based on Simon Willison's excellent "getElementsBySelector" function.
    Original code (with comments and description):
    http://simon.incutio.com/archive/2003/03/25/getElementsBySelector
  */
  function getElementsBySelector(selector) {
    var tokens = selector.split(' ');
    var currentContext = new Array(document);
    for(var i=0;i<tokens.length;i++) {
      token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
      if(token.indexOf('#') > -1) {
        var bits = token.split('#');
        var tagName = bits[0];
        var id = bits[1];
        var element = document.getElementById(id);
        if(tagName && element.nodeName.toLowerCase() != tagName)
          return new Array();
        currentContext = new Array(element);
        continue;
      }
      if(token.indexOf('.') > -1) {
        var bits = token.split('.');
        var tagName = bits[0];
        var className = bits[1];
        if(!tagName) {
          tagName = '*';
        }

        var found = new Array;
        var foundCount = 0;
        for(var h=0;h<currentContext.length;h++) {
          var elements;
          if(tagName == '*') {
            elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
          } else {
            elements = currentContext[h].getElementsByTagName(tagName);
          }
          for(var j=0;j<elements.length;j++) {
            found[foundCount++] = elements[j];
          }
        }

        currentContext = new Array;
        var currentContextIndex = 0;
        for(var k=0;k<found.length;k++) {
          if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
            currentContext[currentContextIndex++] = found[k];
          }
        }
        continue;
      }

      if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
        var tagName = RegExp.$1;
        var attrName = RegExp.$2;
        var attrOperator = RegExp.$3;
        var attrValue = RegExp.$4;
        if(!tagName) {
          tagName = '*';
        }

        var found = new Array;
        var foundCount = 0;
        for(var h=0;h<currentContext.length;h++) {
          var elements;
          if(tagName == '*') {
            elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
          } else {
            elements = currentContext[h].getElementsByTagName(tagName);
          }

          for(var j=0;j<elements.length;j++) {
            found[foundCount++] = elements[j];
          }
        }

        currentContext = new Array;
        var currentContextIndex = 0;
        var checkFunction;
        switch(attrOperator) {
          case '=':
            checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
          break;
          case '~':
            checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
          break;
          case '|':
            checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
          break;
          case '^':
            checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
          break;
          case '$':
            checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
          break;
          case '*':
            checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
          break;
          default :
            checkFunction = function(e) { return e.getAttribute(attrName); };
          break;
        }

        currentContext = new Array;
        var currentContextIndex = 0;
        for(var k=0;k<found.length;k++) {
          if(checkFunction(found[k])) {
            currentContext[currentContextIndex++] = found[k];
          }
        }
        continue;
      }

      tagName = token;
      var found = new Array;
      var foundCount = 0;
      for(var h=0;h<currentContext.length;h++) {
        var elements = currentContext[h].getElementsByTagName(tagName);
        for(var j=0;j<elements.length; j++) {
          found[foundCount++] = elements[j];
        }
      }

      currentContext = found;
    }

    return currentContext;
  }
}

// end of scope, execute code
if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i)) {
  com_stewartspeak_replacement();
}

// Used for search by rating and search by price menus.
function go(form) {
   window.location = form.range.options[form.range.selectedIndex].value;
}

// Standard preload function
function preload_images () {
  var d = document;
  if (!d.imgs) { d.imgs = new Array(); }
  var j = d.imgs.length, args = preload_images.arguments, i;
  for (i = 0; i < args.length; i++) {
    d.imgs[j] = new Image;
    d.imgs[j].src = args[i];
    j++;
  }
}

// Standard bookmark function
function bookmark(title) {
  var urlAddress = location.href;
  var pageName = title;
  var browser = navigator.appName;
  if (browser == 'Microsoft Internet Explorer') {
    window.external.AddFavorite(urlAddress,pageName)
  } else if (browser == 'Netscape') { 
    alert("Your browser does not support this feature.  Use CTRL-D to bookmark this page");
  } else { 
   alert("Your browser does not support this feature.");
  }
}

/* The functions below are cookie functions which can be used for anything site-wide but
   are intended (at the moment) to be used for the dynamic cart quantities */

function getCookie(Name) {
  var search = Name + "=";
  var returnvalue = "";
  if(document.cookie.length > 0) {
    offset = document.cookie.indexOf(search)
    // if cookie exists
    if(offset != -1) { 
      offset += search.length
    }
    // set index of beginning of value
    end = document.cookie.indexOf(";", offset);
    // set index of end of cookie value
    if(end == -1) {
      end = document.cookie.length;
    }
    returnvalue=unescape(document.cookie.substring(offset, end))
  }
  return returnvalue;
}

function setCookie(name,num) {
 //set document cookie
 document.cookie=name+"="+num;
}

function isCookied(name,num) {
 if (getCookie(name)!=num) {
  return true;
 } else {
  return false;
 }
}

/* End Cookie Functions */

/* Dynamic Quantities JavaScript Below */

function priceChange(id,oper,num) {
 // Price Change v1.2:
 // id = the id of the product (so we know what qty box and price to update).
 // oper = what operation to use: dynamic:add:sub:dropdown
 // num = the original price of the product
 //
 // --[ Revisions ]--
 // 20050603 - v1 - Original Script Creation ~Michael@ColorMaria
 // 20050620 - v1.1 - Modified Script to Support Drop-Down Quantity Boxes ~Michael@ColorMaria
 // 20051215 - v1.2 - Added a fix for commas.
 /////////////////////////////////////////////////////////////////////////////////////////////

  if(oper == 'dynamic') {
    // Get the qty value:
    var num2 = 0;
    var qty = document.getElementById('qty_' + id).value;
    // Make sure they didn't go below 1:
    if(qty < 1 || qty == '') {
      document.getElementById('price_' + id).value = '$' + num;
    } else {
      // If they're above one or at 1, do the math for the price:
      num2 = num.replace(',','') * document.getElementById('qty_' + id).value;
      document.getElementById('price_' + id).value = '$' + num2.toFixed(2);
    }
  }
  if(oper == 'add') {
    // Increment the qty box:
    ++document.getElementById('qty_' + id).value;
    // Set qty equal to the new value:
    var qty = document.getElementById('qty_' + id).value;
    if(qty < 1) {
      // Probably not gonna happen, but just in case:
      document.getElementById('qty_' + id).value = '1';
      document.getElementById('price_' + id).value = '$' + num;
    } else {
      // Do the math for the new price:
      num2 = num.replace(',','') * document.getElementById('qty_' + id).value;
      document.getElementById('price_' + id).value = '$' + num2.toFixed(2);
    }
  }
  if(oper == 'sub') {
    // Decrement the value of the qty box:
    --document.getElementById('qty_' + id).value;
    // Set qty = to the new value:
    var qty = document.getElementById('qty_' + id).value;
    if(qty < 1) {
      // Set qty back to 1 if they try to go below 1:
      document.getElementById('qty_' + id).value = '1';
      document.getElementById('price_' + id).value = '$' + num;
    } else {
      // If they're above one or at 1 then do the math for the price:
      num2 = num.replace(',','') * document.getElementById('qty_' + id).value;
    }
  }
  if(oper == 'dropdown') {
    // Set qty = to the new value:
    var qty = document.getElementById('qty_' + id).value;
    if(qty < 1) {
      // Not sure how this will happen, but you never know:
      document.getElementById('qty_' + id).value = '1';
      document.getElementById('price_' + id).value = '$' + num;
    } else {
      // If they're above one or at 1 then do the math for the price:
      num2 = num.replace(',','') * document.getElementById('qty_' + id).value;
    }
  }
  // Some people like to do weird things, like enter letters for a quantity amount, let's not let them:
  if(num2 != '') {
    if(!isNaN(num2)) {
      // if num wasn't NaN then a letter wasn't entered
      document.getElementById('price_' + id).value = '$' + num2.toFixed(2);
    } else {
      // if num was NaN, fix it.
      document.getElementById('price_' + id).value = '$' + num;
      document.getElementById('qty_' + id).value = '';
    }
  }
}

function cartChange(id,num,qty,total) {
 // Cart Change v1.4:
 // id = an id to represent the price and qty (so we know what qty box and price to update).
 // num = the original cost of the item(s) (if there were 3x a 10-dollar item, num would = 30.00).
 // qty = the original quantity that existed in the cart before modification
 // total = the original total of the cart items before modification.
 // 
 // --[ Revisions ]--
 // 20050620 - Original Script Creation ~Michael@ColorMaria
 // 20050629 - Added a line to change the color of the update cart message ~Michael@ColorMaria
 // 20050705 - Added code (accompanied by cookies) to check the quantities of items in the cart
 //          - to see whether they match what the user entered for better checking to see if 
 //          - the update cart button needs to be pressed.
 //          - 
 //          - Please note: This update requires the cookie functions above the priceChange
 //          - function. ~Michael@ColorMaria
 // 20050722 - Added error handling for NaN errors.
 // 20051215 - Fixed a bug with commas
 ///////////////////////////////////////////////////////////////////////////////////////////////
 // Setup our Variables:
  var num2 = 0;
  var qty2 = document.getElementById('qty_' + id).value;
  if(isNaN(qty2)) { // If qty2 isNaN that means someone's made a typo and hit a letter or other non-number key
    document.getElementById('qty_' + id).value = '';
    qty2 = '';
  }
  var num3 = document.getElementById('price_' + id).value.split("$");
  var num3 = num3[1].replace(',','');
  // Check to see if we're dividing by 0:
  if(qty != '0' || !qty) {
    // If not, get the real price (rPrice):
    var rPrice = num.replace(',','') / qty;
  } else {
    // If we are, set the total price for that item to 0:
    document.getElementById('price_' + id).value = '$0.00';
  }
  // Setup our new prices:
  num2 = (rPrice * qty2);
  document.getElementById('price_' + id).value = '$' + num2.toFixed(2);
  // We gotta do this differently depending on if the total we're modifying 
  // is the REAL total or if it's one that was previously modified.
  if(total == document.getElementById('total').value) {
    // If we are modifying the current REAL total, do it this way:
    // Figure out what total would be if the item we're modifying didn't exist.
    total = total - num3;
    // Add the new value to the total:
    total = total + num2;
    document.getElementById('total').value = '$' + total.toFixed(2);
  } else {
    // Setup our fake_total variable so we can essentially do the same 
    // thing we did with the real total
    var fake_total = document.getElementById('total').value.split("$");
    fake_total = fake_total[1].replace(',','');
    // Figure out what the total would be without this product.
    total = fake_total - num3;
    // Readd the new value to the total.
    total = total + num2;
    document.getElementById('total').value = '$' + total.toFixed(2);
  }
  // Just in case they think this will automagically update the real prices for them,
  // setup a fail safe the function below will read and evaluate:
  var nQty = getCookie('quantities');
  arQty = nQty.split('|');
  // Note: the last element of the array will be empty, so ignore it.
  cntQty = arQty.length - 1;
  for(i=0;i<cntQty;i++) {
    arID = arQty[i].split(','); // Hoo Hoo (owl)
    if(document.getElementById('qty_'+arID[0]).value == arID[1]) {
      // It equals the default quantity, yay! No need to update cart.
      document.getElementById('hasUpdated').value = '1';
      // Change the color of the update cart message.
      document.getElementById('update_msg').style.color = '#000';
      continue;
    } else {
      // It doesn't, they need to update.  No need to check further since if one hasn't been updated
      // the whole cart needs to be updated.
      document.getElementById('hasUpdated').value = '0';
      // Change the color of the update cart message so it stands out after a change to the qty is made.
      document.getElementById('update_msg').style.color = '#F00';
      // Break the loop.
      break;
    }
  }
}

function hasUpdated() {
 // Small function to verify that the cart has been updated
 // before checking out or using the continue shopping button.
 //
 // 20060403 - Added fix for when 'hasUpdated' doesn't exist. ~Michael
 ///////////////////////////////////////////////////////////////
  if(typeof document.getElementById('hasUpdated') != 'undefined') {
    var hUpdated = document.getElementById('hasUpdated').value;
    if(hUpdated != '1') {
      alert('You have not updated your cart since last changing your quantities.\nPlease press the \'Update Basket\' button before continuing.');
      return false;
    }
    window.location = '/checkout';
  }
}

/* ** END Dynamic Quantities JS ** */


/* ***************************************
   * verifyRecipients() function.        *
   * Checks the checkout_shippingdetail  *
   * page to ensure that a shipping      *
   * recipient was chosen for each       *
   * product and that there weren't any  *
   * missed recipients.  If gives the    *
   * customer the option of ignoring     *
   * missed ship-tos since that doesn't  *
   * break the checkout it just causes   *
   * blank spaces in some spots.         *
   *                                     *
   * ~Michael - 20060111                 *
   *************************************** */

function verifyRecipients(theForm) {
  var intLength = theForm.length;            // Grab the total length of the form.
  var firstStep = 1, shipTos = new Array();  // Initialize a couple vars to be used later.
  for(var i=0;i<intLength;i++) {             // Loop through the form elements.
    if(firstStep && theForm.elements[i].name.substr(0,4) == 'recp') {
      // If it's the first dropdown setup the number of ship-tos it contains to compare later
      var numShipTos = +theForm.elements[i].options.length - 1;
      // Turn this off so it doesn't repeat this step (it won't hurt anything but would waste processing power).
      firstStep = 0;
    }
    if(theForm.elements[i].name.substr(0,4) == 'recp' && theForm.elements[i].value == '') {
      // If we encounter a dropdown that hasn't had a ship-to selected..
      alert('You must choose a recipient for each of the products you are purchasing.');
      return false;
    } else if (theForm.elements[i].name.substr(0,4) == 'recp') {
      // Otherwise add the item to an array to compare later.
      var shipTo = theForm.elements[i].selectedIndex;
      if(!in_array(shipTo, shipTos)) {
        // If the ship-to isn't in the array already, add it.
        var stLen = shipTos.length;
        shipTos.push(shipTo);
      }
    }
  }
  if(shipTos.length != numShipTos) {
    // If the # of ship-tos in the array don't match the number of ship-tos that exist, prompt the user
    var verifyShipTos = confirm("Some of your shipping address do not have products assigned to them.\n\nDo you wish to continue anyway?");
    if(verifyShipTos) {
      // User says it's OK
      return true;
    } else {
      // User says it's not OK
      return false;
    }
  }
  // If we've gotten this far, everything on the form has checked out OK.
  return true;
}

/* ***************************************
   * in_array() function for JS.         *
   * Works the same as the PHP function. *
   *                                     *
   * ~Michael - 20060111                 *
   * ~Michael - Fixed undefined vars     *
   *            20060111                 *
   *************************************** */

function in_array(needle, haystack) {
  if(typeof needle == undefined) {
    // If needle is undefined:
    alert("Needle is undefined.\nError: in_array");
    return false;
  } else if(typeof haystack == undefined) {
    alert("Haystack is undefined.\nError: in_array");
    return false;
  }
  for(i=0,n=haystack.length;i<n;i++) {
    // Loop through the array.
    if(haystack[i] == needle) {
      // If the needle was found:
      return true;
    }
  }
  // If the code reaches this point, needle wasn't found:
  return false;
}

/* ************************
   * noHammer() function  *
   * Prevents form submit *
   * button hammering.    *
   *                      *
   * ~Michael - 20060403  *
   ************************ */

function noHammer(theForm) {
  if(typeof theForm.submit != 'undefined') {
    theForm.submit.disabled = true;
    theForm.submit.value = 'Wait...';
    return true;
  }
}

/* ****************************
   * checkShipDate() function *
   * Checks to be sure the    *
   * users do not enter a     *
   * ship date that cannot be *
   * met (holidays, etc.)     *
   *                          *
   * ~Michael - 20060822      *
   **************************** */

var arShipDates = new Array();
arShipDates[0]  = '05/26';
arShipDates[1]  = '07/03';
arShipDates[2]  = '07/04';
arShipDates[3]  = '09/04';
arShipDates[4]  = '11/22';
//arShipDates[5]  = '11/23';
arShipDates[5]  = '12/25';
arShipDates[6]  = '01/01';

var arDays = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var strDate = new Date();
var curYear = parseInt((strDate.getYear() % 100) + 2000);
var curDay = leadingZero(strDate.getDate());
var curMonth = leadingZero(strDate.getMonth() + 1);
var curHours = leadingZero(strDate.getHours());
var curMinutes = leadingZero(strDate.getMinutes());
var curDayName = arDays[strDate.getDay()];

function checkShipDate(gc) {
  var txtShipOn = document.getElementById('txtShipOn');
  if(checkShipDateFormat(txtShipOn)) {
    if(checkIfHoliday(txtShipOn,gc)) { 
      createRealDate(txtShipOn);
      return true;
    }
  }
  return false;
}

function checkShipDateFormat(txtShipOn) {
  if(txtShipOn.value != '') {
    var arDateItems = txtShipOn.value.split('/');
    var intMonth = arDateItems[0];
    var intDay = arDateItems[1];
    var intYear = arDateItems[2];
    if(intMonth.length != 2 || intMonth > 12) {
      // if invalid character length and month greater than 12
      alert('Invalid ship date format.\n\nPlease use the following format: MM/DD/YYYY');
      return false;
    } else if(intDay.length != 2 || intDay > 31) {
      // if invalid character length and day greated than 31
      alert('Invalid ship date format.\n\nPlease use the following format: MM/DD/YYYY');
      return false;
    } else if(intYear.length != 4) {
      // if invalid character length
      alert('Invalid ship date format.\n\nPlease use the following format: MM/DD/YYYY');
      return false;
    } else if((intMonth < curMonth || (intDay < curDay && intMonth == curMonth)) && intYear == curYear) {
      // if month is less than current month or day is less than current while but year and month are OK
      alert('The date you have entered has already passed.\n\nPlease enter another ship date.');
      return false;
    } else if(parseInt(intYear) < parseInt(curYear)) {
      // if year is in the past
      alert('The date you have entered has already passed.\n\nPlease enter another ship date.');
      return false;
    } else if((curHours > 10 || curHours  == 10 && curMinutes > 30) && (intMonth == curMonth &&
              intDay == curDay && intYear == curYear)) {
      // if time is past 10:30am and they're trying to ship today
      alert('We are unable to ship orders same-day unless the orders are placed before 10:30 A.M.');
      return false;
    }
  } else {
    alert('Please select a ship date.');
    return false;
  }
  return true;
}

function checkIfHoliday(txtShipOn,gc) {
  if(txtShipOn.value != '') {
    var arDateItems = txtShipOn.value.split('/');
    var intMonth = arDateItems[0];
    var intDay = arDateItems[1];
    var intYear = arDateItems[2];
    for(var i=0,n=arShipDates.length;i<n;i++) {
      var arHolidayItems = arShipDates[i].split('/');
      var intHMonth = arHolidayItems[0];
      var intHDay = arHolidayItems[1];
      if(intHMonth == intMonth && intHDay == intDay) {
        alert('You have entered an invalid requested shipping date.\n\nWe do not ship on Saturdays, Sundays, 5/26, 7/3, 7/4, 9/4, 11/22, 12/23, 12/25 or 1/01.');
        return false;
      }
    }
    var newDate = strDate.setFullYear(intYear,intMonth-1,intDay);
    var newDate = new Date(newDate);
    var newDateDay = arDays[newDate.getDay()];
    if(newDateDay == 'Sunday' || newDateDay == 'Saturday') {
      alert('You have entered an invalid requested shipping date.\n\nWe do not ship on Saturdays, Sundays, 5/26, 7/3, 7/4, 9/4, 11/22, 12/23, 12/25 or 1/01.');
      return false;
    } else if(newDateDay == 'Friday' && gc == '0') {
      if(confirm('You have requested a Friday as your shipping date.\n\nUPS charges an additional $20 fee for overnight deliveries placed on Friday.\n\nPlease click OK to confirm or Cancel to choose another date.')) {
        return true;
      } else {
        return false;
      }
    }
  }
  return true;
}

function createRealDate(txtShipOn) {
  var realDateBox = document.getElementById('txtHiddenShipDate');
  if(txtShipOn.value != '') {
    var arDateItems = txtShipOn.value.split('/');
    var intMonth = arDateItems[0];
    var intDay = arDateItems[1];
    var intYear = arDateItems[2];
    realDateBox.value = intYear+'-'+intMonth+'-'+intDay;
  }
}

function createFakeDate(txtShipOn) {
  var fakeDateBox = document.getElementById('txtShipOn');
  if(txtShipOn != '') {
    var arDateItems = txtShipOn.split('-');
    var intMonth = arDateItems[1];
    var intDay = arDateItems[2];
    var intYear = arDateItems[0];
    fakeDateBox.value = intMonth+'/'+intDay+'/'+intYear;
  }
}

function leadingZero(x) {
  if(x < 10) {
    return "0" + x;
  }
  return x;
}

//////////////////////////////////////////////////////////////////////////////////////////
// DreamWeaver's functions.

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

// End DreamWeaver's functions.
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
// START - Tabbed Panels Code
var arTabs = new Array('Tdesc','Tcust1');

function tabOn(id) {
  for (var i=0,n=arTabs.length;i<n;i++) {
    if (document.getElementById(arTabs[i]) != null && typeof document.getElementById(arTabs[i]) != 'undefined') {
      if (arTabs[i] == id) {
        var item = document.getElementById(arTabs[i]);
        var tab = document.getElementById(arTabs[i]+'_tab');
        tab.style.backgroundImage = tab.style.backgroundImage.replace('off','on');
        tab.className = tab.className.replace('off','on');
        item.style.display = 'block';
      } else {
        var item = document.getElementById(arTabs[i]);
        var tab = document.getElementById(arTabs[i]+'_tab');
        tab.style.backgroundImage = tab.style.backgroundImage.replace('on','off');
        tab.className = tab.className.replace('on','off');
        item.style.display = 'none';
      }
    }
  }
}
// END - Tabbed Panels Code
//////////////////////////////////////////////////////////////////////////////////////////

// This code was written by Tyler Akins and has been placed in the
// public domain.  It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}
