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 (num == '') {
    num = document.getElementById('hidden_price_' + id).value;
  } 
  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,name) {

 // 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(name);
  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 Cart\' button before continuing.');
      return false;
    }
  }
}

/* ** 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("Needle 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;
  }
}

/* ************************
   * validateForgotForm() *
   * Checks for a valid   *
   * email before submit  *
   *                      *
   * ~Michael - 20060905  *
   ************************ */
function validateForgotForm(theForm) {
  var theEmail=theForm.email;
  var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
  if((theEmail.value==null)||(theEmail.value=="")) {
    document.getElementById('errorMsg').innerHTML="<br />Please enter a valid e-mail address before continuing.";
    theEmail.focus();
    return false;
  } else {
    if(!filter.test(theEmail.value)) {
      document.getElementById('errorMsg').innerHTML="<br />Please enter a valid e-mail address before continuing.";
      theEmail.value="";
      theEmail.focus();
      return false;
    }
  }
  return true;
}

function hideShowCalc(recip) {
 recip = (recip != '') ? '_'+recip : '';
 if (document.getElementById('cart_ship_estimator'+recip) != null && typeof document.getElementById('cart_ship_estimator'+recip) != 'undefined') {
   var div = document.getElementById('cart_ship_estimator'+recip);
   var link = document.getElementById('hideShowCalc'+recip);
 } else {
   return false;
 }
 div.style.display = (div.style.display == 'block') ? 'none' : 'block';
 link.innerHTML = (div.style.display == 'block') ? 'Hide Details' : 'Show Details';
} 

//////////////////////////////////////////////////////////////////////////////////////////
// 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.
//////////////////////////////////////////////////////////////////////////////////////////


/* Gift Message Functions */

function concatGiftMsg(num) {
  for (var i=1,n=num;i<=num;i++) {
/* Changed to code block below to see if we can get rid of the extra space before the pipe
    var g1 = (document.getElementById('g1'+i).value != ' ') ? document.getElementById('g1'+i).value + ' ' : '';
    var g2 = (document.getElementById('g2'+i).value != ' ') ? document.getElementById('g2'+i).value + ' ' : '';
    var g3 = (document.getElementById('g3'+i).value != ' ') ? document.getElementById('g3'+i).value + ' ' : '';
    var g4 = (document.getElementById('g4'+i).value != ' ') ? document.getElementById('g4'+i).value + ' ' : '';
    var g5 = (document.getElementById('g5'+i).value != ' ') ? document.getElementById('g5'+i).value + ' ' : '';
    var g6 = (document.getElementById('g6'+i).value != ' ') ? document.getElementById('g6'+i).value + ' ' : '';
*/
    var g1 = (document.getElementById('g1'+i).value != ' ') ? document.getElementById('g1'+i).value : '';
    var g2 = (document.getElementById('g2'+i).value != ' ') ? document.getElementById('g2'+i).value : '';
    var g3 = (document.getElementById('g3'+i).value != ' ') ? document.getElementById('g3'+i).value : '';
    var g4 = (document.getElementById('g4'+i).value != ' ') ? document.getElementById('g4'+i).value : '';
    var g5 = (document.getElementById('g5'+i).value != ' ') ? document.getElementById('g5'+i).value : '';
    var g6 = (document.getElementById('g6'+i).value != ' ') ? document.getElementById('g6'+i).value : '';
    //added in the delivery date to the end of the message
    
    var g7 = (document.getElementById('DeliveryDate'+i).value != ' ') ? document.getElementById('DeliveryDate'+i).value : '';

    var gm = g1 + '|' + g2 + '|' + g3 + '|' + g4 + '|' + g5 + '|' + g6 + '|' + g7;
    document.getElementById('gm'+i).value = gm;
    /*for (var x=1,z=6;x<=z;x++) {
      var cName = 'g'+x;
      setCookie(cName+i,document.getElementById(cName+i).value);
    }*/
  }
}

function clearGiftMsgs(num) {
  for (var i=1,n=num;i<=num;i++) {
    for (var x=1,z=6;x<=z;x++) {
      var cName = 'g'+x;
      setCookie(cName+i,'');
    }
  }
}

/* Clear Gift Messages */

/* Calendar on checkout shipping address */
function fixShipDate(from,to,method) {
  if (document.getElementById(from) == null) {
    return false;
  }
  var chosen_date = document.getElementById(from).value;
  if (chosen_date == '') {
    var new_date = chosen_date;
  } else {
    var splitdate = chosen_date.split('-');
    var nd = new Date();
    if (method == 'UPS 2nd Day Air') {
      nd.setFullYear(splitdate[0],splitdate[1]-1,splitdate[2]-2);
    } else if (method == 'UPS Next Day Air') {
      nd.setFullYear(splitdate[0],splitdate[1]-1,splitdate[2]-1);
    } else {
      nd.setFullYear(splitdate[0],splitdate[1]-1,splitdate[2]);
    }
    var new_month = nd.getMonth()+1;
    if (new_month < 10) {
      new_month = '0'+new_month;
    }
    var new_day = nd.getDate();
    if (new_day < 10) {
      new_day = '0'+new_day;
    }
    var new_date = nd.getFullYear()+'-'+new_month+'-'+new_day;
  }
  document.getElementById(to).value=new_date;
}

function hideShowCalc(recip) {
 recip = (recip != '') ? '_'+recip : '';
 if (document.getElementById('cart_ship_estimator'+recip) != null && typeof document.getElementById('cart_ship_estimator'+recip) != 'undefined') {
   var div = document.getElementById('cart_ship_estimator'+recip);
   var link = document.getElementById('hideShowCalc'+recip);
 } else {
   return false;
 }
 div.style.display = (div.style.display == 'block') ? 'none' : 'block';
 link.innerHTML = (div.style.display == 'block') ? 'Hide Details' : 'Show Details';
}

var arTabs = new Array('tab1','tab2','tab3','tab4');

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';
      }
    }
  }
}

function togglePaymentFields(type) {
  if (type == 'creditcard') {
    for (var i = 1; i <= 4; i++) {
      document.getElementById('cc_star'+i).style.display = '';
    }
    document.getElementById('gc_star').style.display = 'none';
  } else if(type == 'giftcertificate') {
    for (var i = 1; i <= 4; i++) {
      document.getElementById('cc_star'+i).style.display = 'none';
    }
    document.getElementById('gc_star').style.display = '';
  }
}

function limitShipMeths(promo,state,num) {
  var promo = promo.toUpperCase();
  if (promo == 'CAKE' || promo == 'DAD') {
    var arAKHIMeths = new Array('Second Day','Next Day');
    var arDomMeths = new Array('Free Shipping','Standard','Second Day','Next Day');
  } else {
    var arAKHIMeths = new Array('Second Day','Next Day');
    var arDomMeths = new Array('Standard','Second Day','Next Day');
  }
  if (state == 'HI' || state == 'AK') {
    var arMeths = arAKHIMeths;
  } else {
    var arMeths = arDomMeths;
  }
  document.getElementById('s_method'+num).options.length = 0;

  for (var i = 0; i < arMeths.length; i++) {
    document.getElementById('s_method'+num).options[i] = new Option(arMeths[i],arMeths[i]);
  }
}

function verify_hear() {

  var ddlHowHeader = document.getElementById("cust_hear_db1"); 
 
 if ( ddlHowHeader.value == '' )
  {
   /*alert ( "Please tell us how you heard about us." );
   valid = false;
   return false;*/
   ddlHowHeader.selectedIndex = 16;
   return true;
  }
}

/********************* START SHIPPING CALENDAR FUNCTIONS AND CODE *************************************/

var arTodays;  // "Today" Dates that break shipping date rules, so they have their own associated change date
var arChanges; // Associated by key with arTodays to give the soonest ship-on date
var days = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');

function changeShipDate(num) {

  for (var i = 1; i <= num; i++) {
    var dateElements = document.getElementById('s_shipon'+i).value;
    var date = stringToDate(dateElements);
    document.getElementById('s_shipon_real'+i).value = dateToString('y',date);
    var day = days[date.getDay()];

    /* Uncomment this block when the regular rules are back in play
    if (in_dateArray(date,arChanges) < 0 && (day == 'Friday' || day == 'Saturday' || day == 'Sunday')) {
      alert('Our orders ship Monday through Thursday only.  Please ensure all requested ship dates fall on one of those days.');
      return false;
    }
    */

    /* Delete this block when the regular rules are back in play */
    if (day == 'Saturday' || day == 'Sunday') {
      alert('Our orders ship Monday through Friday only.  Please ensure all requested ship dates fall on one of those days.');
      return false;
    }


  }
}
function getSoonestShipDate(shipTos,todays,changes) {
  arTodays = todays;
  arChanges = changes;

  // Get today's and tomorrow's dates
  var today = new Date();
  var nextday = new Date();
  nextday.setDate(nextday.getDate()+1);

  // Find next available day if tomorrow is no good
  var flag = false;
  while(!flag) {
    var day = nextday.getDay();
    if (day != '1' && day != '2' && day != '3' && day != '4') {
      nextday.setDate(nextday.getDate()+1);
    } else {
      flag = true;
    }
  }

  // Find out if today has a particular shipping date which breaks the rules...
  var index = in_dateArray(today,arTodays);

  if (index > -1) { // today breaks the rules, set custom ship date
    var fulldate = dateToString('m',arChanges[index]);
  } else { // today does not break rules, set date according to rules
    var fulldate = dateToString('m',nextday);
  }

  // Set nextday into the appropriate display places
  for (var i = 1; i <= shipTos; i++) {
    document.getElementById('datelabel'+i).innerHTML = fulldate;
    if (document.getElementById('s_shipon'+i).value == '') {
      document.getElementById('s_shipon'+i).value = fulldate;
    }
  }
}

/* ***************************************
   * setDeliveryDate function.           *
   * sets an estimated delivery date     *
   * based upon method, date, and state  *
   *                                     *
   * ~DEB - 20111012                     *
   *************************************** */

function setDeliveryDate(num){

            //This is the code for calculating the shipping info
            var msg = document.getElementById('shipMessage'+num);
            var dateText = document.getElementById('s_shipon'+num).value;

            if (dateText != '') {
              //take the picker date and turn it into a js date 
              var yr = dateText.substring(6,10);
              var mo = dateText.substring(0,2);
              var dy = dateText.substring(3,5);
              var dtString = mo+'/'+dy+'/'+yr;
              var deliveryDate = new Date(dtString);

              
              //get the shipping method out of the drop down
              var method = document.getElementById("s_method1"); 
              if (method.value == 'Standard') {
                 deliveryDate.setDate(deliveryDate.getDate()+8);
              } else if (method.value == '3 Day') {
                 deliveryDate.setDate(deliveryDate.getDate()+3);
              } else if (method.value == 'Second Day') {
                 deliveryDate.setDate(deliveryDate.getDate()+2);
              } else if (method.value == 'Next Day') {
                 deliveryDate.setDate(deliveryDate.getDate()+1);
              } 

              //See if the estimated day is a saturday or sunday, if so, push to the following Monday
              var shipWeekDay = deliveryDate.getDay();
              if (shipWeekDay == 6){
                //saturday, add 2
                deliveryDate.setDate(deliveryDate.getDate()+2);
              } else if (shipWeekDay == 0){
                //sunday, add 1
                deliveryDate.setDate(deliveryDate.getDate()+1);
              } 

            //turn it back into a string
              var shipMo = deliveryDate.getMonth()+1;
              var shipDay = deliveryDate.getDate();
              var shipYr = deliveryDate.getYear();               
              var shipDate = shipMo+'/'+shipDay +'/'+shipYr ;
              msg.innerHTML = "Expected Delivery Date: " + shipDate ;
            } else {
              msg.innerHTML = "";
          
           }
         }


/* ***************************************
   * in_dateArray() function.            *
   * checks to see if a date object is in*
   * an array of date objects.  If yes,  *
   * returns index, if no, returns -1    *
   *                                     *
   * ~Patrick - 20081105                 *
   *************************************** */
function in_dateArray(needle,haystack) {
  var nMonth = leadingZero(needle.getMonth()+1);
  var nDate = leadingZero(needle.getDate());
  var nYear = needle.getFullYear();

  for (var i = 0; i < haystack.length; i++) {
    var hMonth = leadingZero(haystack[i].getMonth()+1);
    var hDate = leadingZero(haystack[i].getDate());
    var hYear = haystack[i].getFullYear();
    if (nMonth == hMonth && nDate == hDate && nYear == hYear) {
      return i;
    }
  }
  return -1;
}

/* ***************************************
   * stringToDate() function.            *
   * Converts a javascript string        *
   * (mm-dd-yyyy) to a javascript date   *
   * object.                             *
   *                                     *
   * ~Patrick - 20081105                 *
   *************************************** */
function stringToDate(string) {
  string = string.split("-");
  var date = new Date();
  date.setFullYear(string[2],string[0]-1,string[1]);
  return date;
}

/* ***************************************
   * dateToString() function.            *
   * Converts a javascript date object to*
   * a javascript string.                *
   *                                     *
   * ~Patrick - 20081105                 *
   * ~Updated to return mm-dd-yyyy and   *
   *  yyyy-mm-dd formats                 *
   *************************************** */
function dateToString(format,date) {
  var month = date.getMonth()+1;
  var day = date.getDate();
  var year = date.getFullYear();
  if (format == 'm') {
    var string = leadingZero(month) + '-' + leadingZero(day) + '-' + year;
  } else {
    var string = year + '-' + leadingZero(month) + '-' + leadingZero(day);
  }
  return string;
}

/* ***************************************
   * dateToArray() function.             *
   * Converts a javascript date object to*
   * a javascript array.                 *
   *   array[0] = month                  *
   *   array[1] = date                   *
   *   array[2] = fullyear               *
   *                                     *
   * ~Patrick - 20081105                 *
   *************************************** */
function dateToArray(date) {
  var array = new Array();
  array[0] = leadingZero(date.getMonth()+1);
  array[1] = leadingZero(date.getDate());
  array[2] = date.getFullYear();
  return array;
}

/* ***************************************
   * leadingZero() function.             *
   * Ensures all digits 1-9 are returned *
   * with a zero prepended (i.e. '09').  *
   *                                     *
   * ~Patrick - 20081105                 *
   *************************************** */
function leadingZero(x) {
  if (x < 10) {
    x = '0' + x;
  }
  return x;
}


/********************* END SHIPPING CALENDAR FUNCTIONS AND CODE *************************************/





//|-----------------------|//
//|   AUTO SIZING POPUP   |//
//|-----------------------|//

// Script Source: CodeLifter.com
// Copyright 2003
// Do not remove this notice.

// SETUPS:
// ===============================

// Set the horizontal and vertical position for the popup

PositionX = 100;
PositionY = 100;

// Set these value approximately 20 pixels greater than the
// size of the largest image to be used (needed for Netscape)

defaultWidth  = 600;
defaultHeight = 600;

// Set autoclose true to have the window close automatically
// Set autoclose false to allow multiple popup windows

var AutoClose = true;

// Do not edit below this line...
// ================================
if (parseInt(navigator.appVersion.charAt(0))>=4){
var isNN=(navigator.appName=="Netscape")?1:0;
var isIE=(navigator.appName.indexOf("Microsoft")!=-1)?1:0;}
var optNN='scrollbars=no,width='+defaultWidth+',height='+defaultHeight+',left='+PositionX+',top='+PositionY;
var optIE='scrollbars=no,width=150,height=100,left='+PositionX+',top='+PositionY;
function popImage(imageURL,imageTitle){
if (isNN){imgWin=window.open('about:blank','',optNN);}
if (isIE){imgWin=window.open('about:blank','',optIE);}
with (imgWin.document){
writeln('<html><head><title>Loading...</title><style>body{margin:0px;}</style>');writeln('<sc'+'ript>');
writeln('var isNN,isIE;');writeln('if (parseInt(navigator.appVersion.charAt(0))>=4){');
writeln('isNN=(navigator.appName=="Netscape")?1:0;');writeln('isIE=(navigator.appName.indexOf("Microsoft")!=-1)?1:0;}');
writeln('function reSizeToImage(){');writeln('if (isIE){');writeln('window.resizeTo(300,300);');
writeln('width=300-(document.body.clientWidth-document.images[0].width);');
writeln('height=300-(document.body.clientHeight-document.images[0].height);');
writeln('window.resizeTo(width,height);}');writeln('if (isNN){');       
writeln('window.innerWidth=document.images["George"].width;');writeln('window.innerHeight=document.images["George"].height;}}');
writeln('function doTitle(){document.title="'+imageTitle+'";}');writeln('</sc'+'ript>');
if (!AutoClose) writeln('</head><body bgcolor=ffffff scroll="no" onload="reSizeToImage();doTitle();self.focus()">')
else writeln('</head><body bgcolor=ffffff scroll="no" onload="reSizeToImage();doTitle();self.focus()" onblur="self.close()">');
writeln('<img name="George" src='+imageURL+' style="display:block"></body></html>');
close();		
}}

function optionCheck(theForm) {
	for( i=0;i<theForm.elements.length;i++ ) {
		if( ( theForm.elements[i].type == "select-one" ) && ( theForm.elements[i].selectedIndex == 0 ) 
&& (theForm.elements[i].name.substring(0,6) == 'option')) {
		       var option_len= theForm.elements[i].options[0].text.length;
                        var option_name = theForm.elements[i].options[0].text.substring(10,option_len-3);
                        var message = "Please Choose A " + option_name ;
                        alert( message );
			return false;
		}
	}
	return true;
}

function CheckHowHeard() {
   //check the value of the how heard box, if catalog, expose the catalog table
   var ddlHowHeader = document.getElementById("cust_hear_db1"); 
   var trCatalogCode = document.getElementById("catalog_code"); 

   if (ddlHowHeader.value == 'Catalog') {
     trCatalogCode.style.display = ''; 
   }else{   
     trCatalogCode.style.display = 'none'; 
   }   

}


