document.observe('dom:loaded', function() {  
    $$('#sli_search_1', '#add_email').each(function(elem) {
        var txtOnLoad = $F(elem);
        elem.observe('focus', function(event) {
            event.stop();
            var elem = event.element();
            if ($F(elem) === txtOnLoad) { elem.clear(); }
        });
        elem.observe('blur', function(event) {
            event.stop();
            var elem = event.element();
            if (!elem.present()) { elem.setValue(txtOnLoad); }
        });
    });
    $$('th:first-child', 'td:first-child', 'li:first-child').invoke('addClassName', 'first-child');
    $$('th:last-child', 'td:last-child', 'li:last-child').invoke('addClassName', 'last-child');
    $$('tr:nth-child(odd)').invoke('addClassName', 'odd');  
    $$('tr:nth-child(even)').invoke('addClassName', 'even'); 
});

// 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 = []; }
  var j = d.imgs.length, i;
  for (i = 0; i < arguments.length; i++) {
    d.imgs[j] = new Image();
    d.imgs[j].src = arguments[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.
 /////////////////////////////////////////////////////////////////////////////////////////////

var qty, num2;
  if(oper === 'dynamic') {
    // Get the qty value:
    num2 = 0;
    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:
    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:
    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:
    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("$");
  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 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 = [];  // 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;
  }
}

//////////////////////////////////////////////////////////////////////////////////////////
// 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.
//////////////////////////////////////////////////////////////////////////////////////////

function addressCopy_Billing() {
	document.ship_form.s_firstname1.value = document.ship_form.first_name.value;
	document.ship_form.s_lastname1.value = document.ship_form.last_name.value;
	document.ship_form.s_address11.value = document.ship_form.billing_address1.value;
	document.ship_form.s_address21.value = document.ship_form.billing_address2.value;
	if (typeof document.ship_form.shipping_type2 != 'undefined') {
		selected=0;
		for(i=0;i<document.ship_form.shipping_type2.length;i++) {
			if (document.ship_form.shipping_type2[i].checked) {
				document.ship_form.shipping_type1[i].checked=true;
				setShipType(document.ship_form.shipping_type1[i],'shipping','1');
				break;
			}
		}
	}
	document.ship_form.s_state1.value = document.ship_form.billing_state.value;
	document.ship_form.s_city1.value = document.ship_form.billing_city.value;
	document.ship_form.s_zip1.value = document.ship_form.billing_zip.value;
	document.ship_form.s_country1.value = document.ship_form.billing_country.value;
	document.ship_form.s_title1.value = document.ship_form.title.value;
	document.ship_form.s_company1.value = document.ship_form.company.value;
	/*document.ship_form.s_phone1.value = document.ship_form.phone.value;*/
	getInfo('limit_shipping_method','Shipping_Class','limitMethods',document.ship_form.s_country1);
}


function fullScreen(theURL) {
	window.open(theURL, '', 'fullscreen=yes, scrollbars=auto');	
}

function openVIPBooks() {
	document.getElementById("divVIPBooks").style.display = '';
}

function closeVIPBooks() {
	document.getElementById("divVIPBooks").style.display = 'none';      
}

function openVideoPreview() {
	document.getElementById("divVideoPreview").style.display = '';
}

function closeVideoPreview() {
	document.getElementById("divVideoPreview").style.display = 'none';      
}


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 Shipping Costs' : 'Click Here to Calculate Shipping Costs';
}

function validateDropship(intcheck) {
	if (intcheck == 1 && document.ship_form.shipType1i.checked){
		alert('One or more products in your cart cannot be shipped outside of the US.');
		return false;
	}
}

// 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 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;

  }

}



//////////////////////////////////////////////////////////////////////////////////////////

// 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.

//////////////////////////////////////////////////////////////////////////////////////////



function addressCopy_Billing() {

    document.ship_form.s_firstname1.value = document.ship_form.first_name.value;

    document.ship_form.s_lastname1.value = document.ship_form.last_name.value;

    document.ship_form.s_address11.value = document.ship_form.billing_address1.value;

    document.ship_form.s_address21.value = document.ship_form.billing_address2.value;

    if (typeof document.ship_form.shipping_type2 != 'undefined') {

        selected=0;

        for(i=0;i<document.ship_form.shipping_type2.length;i++) {

            if (document.ship_form.shipping_type2[i].checked) {

                document.ship_form.shipping_type1[i].checked=true;

                setShipType(document.ship_form.shipping_type1[i],'shipping','1');

                break;

            }

        }

    }

    document.ship_form.s_state1.value = document.ship_form.billing_state.value;

    document.ship_form.s_city1.value = document.ship_form.billing_city.value;

    document.ship_form.s_zip1.value = document.ship_form.billing_zip.value;

    document.ship_form.s_country1.value = document.ship_form.billing_country.value;

    document.ship_form.s_title1.value = document.ship_form.title.value;

    document.ship_form.s_company1.value = document.ship_form.company.value;

    /*document.ship_form.s_phone1.value = document.ship_form.phone.value;*/

    getInfo('limit_shipping_method','Shipping_Class','limitMethods',document.ship_form.s_country1);

}





function fullScreen(theURL) {

    window.open(theURL, '', 'fullscreen=yes, scrollbars=auto'); 

}



function openVIPBooks() {

    document.getElementById("divVIPBooks").style.display = '';

}



function closeVIPBooks() {

    document.getElementById("divVIPBooks").style.display = 'none';      

}



function openVideoPreview() {

    document.getElementById("divVideoPreview").style.display = '';

}



function closeVideoPreview() {

    document.getElementById("divVideoPreview").style.display = 'none';      

}





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 Shipping Costs' : 'Click Here to Calculate Shipping Costs';

}



function validateDropship(intcheck) {

    if (intcheck == 1 && document.ship_form.shipType1i.checked){

        alert('One or more products in your cart cannot be shipped outside of the US.');

        return false;

    }

}
