function xopen_window(source, width, height, scrolling, subwindow)
{
  if(!width)
    width = 400;
  if(!height)
    height = 160;
  if(!source)
    source = "";
  var left = 0;
  var top = 0;
  window_element = window;
  if(subwindow)
    window_element = parent.window;
  if(subwindow == 2)
    window_element = parent.parent.window;
  if(typeof(window_element.innerWidth) == "number") {
    left = window_element.innerWidth;
    top = window_element.innerHeight;
  }
  else {
    if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
      left = document.documentElement.clientWidth;
      top = document.documentElement.clientHeight;
    }
    else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
      left = document.body.clientWidth;
      top = document.body.clientHeight;
    }
  }
  if(typeof(window.screenLeft) == "number") {
    left = (left / 2) + window_element.screenLeft;
    top = (top / 2) + window_element.screenTop;
  }
  else {
    left = (left / 2) + window_element.screenX;
    top = (top / 2) + window_element.screenY;
  }
  left -= width / 2;
  top -= height / 2;
  if(navigator.userAgent.indexOf("Opera") != -1)
    top /= 2;
  obj = window_element.open(source, "_support", "height=" + height + ",width=" + width + ",left=" + left + ",top=" + top + ",toolbar=no,menubar=no,scrollbars=" + (scrolling?"yes":"no") + ",resizable=no,location=no,directories=no,status=no");
  obj.focus();
  return(obj);
}

function filter_nonnumeric(str)
{
  return(str.replace(/[^0-9]/g, ""));
}

var image_preloads = new Array(
"/graphics/newlogo2.gif",  // header
"/graphics/menu/home2.gif",  // menu
"/graphics/menu/search2.gif",
"/graphics/menu/faq2.gif",
"/graphics/menu/downloads2.gif",
"/graphics/menu/about_us2.gif",
"/graphics/menu/forums2.gif",
"/graphics/menu/contact_us2.gif",
"/graphics/menu/your_account2.gif",
"/graphics/menu/view_cart2.gif",
"/graphics/menu/checkout2.gif",
"/graphics/buttons/side_search2.gif",  // side grey
"/graphics/buttons/side_log_in2.gif",
"/graphics/buttons/side_log_out2.gif",
"/graphics/buttons/side_view_account2.gif",
"/graphics/back_to_top2.gif",  // footer
"/graphics/buttons/green/small_shipping_quotes2.gif",  // cart window / products
"/graphics/cart_window_icon2.gif",
"/graphics/products/page_arrow_start2.gif",  // collection
"/graphics/products/page_arrow_left2.gif",
"/graphics/products/page_arrow_right2.gif",
"/graphics/products/page_arrow_end2.gif",
"/graphics/buttons/green/minus2.gif",  // collection / product
"/graphics/buttons/green/plus2.gif",
"/graphics/buttons/green/small_add_to_cart2.gif",
"/graphics/buttons/green/small_adding.gif",
"/graphics/buttons/green/view_cart2.gif"
);

function image_preload(images)
{
  if(typeof(images) == "string")
    images = new Array(images);
  for(i in images)
    image_preloads.push(images[i]);
}

function preload_images()
{
  if(image_preloads != null) {
    for(i in image_preloads)
      if(image_preloads[i]) {
        image = new Image();
        image.src = image_preloads[i];
      }
  }
}

/* images */

function _mover(element)
{
  if(element.src.substr(element.src.length - 5, element.src.length) != "2.gif")
    element.src = element.src.substr(0, element.src.length - 4) + "2.gif";
}

function _mout(element)
{
  if(element.src.substr(element.src.length - 5, element.src.length) == "2.gif")
    element.src = element.src.substr(0, element.src.length - 5) + ".gif";
}

/* element classes */

function _mover_class(element)
{
  if(element.className.substr(element.className.length - 1, element.className.length) != "2")
    element.className += "2";
}

function _mout_class(element)
{
  if(element.className.substr(element.className.length - 1, element.className.length) == "2")
    element.className = element.className.substr(0, element.className.length - 1);
}

/* left (and index right) login box */

var log_in_enabled = 0;

function rethink_log_in()
{
  if(log_in_enabled) {
    if((document.forms.log_in.email && !document.forms.log_in.email.value) || !document.forms.log_in.glassbird.value) {
      log_in_enabled = 0;
      if(obj = document.getElementById("log_in_image"))
        obj.src = "graphics/button_log_in0.gif";
    }
  }
  else if(document.forms.log_in.email && document.forms.log_in.email.value && document.forms.log_in.glassbird.value) {
    log_in_enabled = 1;
    if(obj = document.getElementById("log_in_image"))
      obj.src = "graphics/button_log_in.gif";
  }
}

function login_check_submit(quick)
{
  rethink_log_in();
  if(quick && (!window.event || window.event.keyCode != 13))
    return(true);
  if(document.forms.log_in.email && !document.forms.log_in.email.value) {
    if(!quick) {
      error = "Please enter your email address.";
      if(Logger = parent.window.frames.control.document.forms.Logger) {
        Logger.log_file.value = "runtime_access";
        Logger.text.value = "login: [identity] from [location] received alert: " + error;
        Logger.submit();
      }
      alert(error);
      document.forms.log_in.email.focus();
    }
    return(false);
  }
  if(!document.forms.log_in.glassbird.value) {
    if(!quick) {
      error = "Please enter your password.";
      if(Logger = parent.window.frames.control.document.forms.Logger) {
        Logger.log_file.value = "runtime_access";
        Logger.text.value = "login: [identity] from [location] received alert: " + error;
        Logger.submit();
      }
      alert(error);
      document.forms.log_in.glassbird.focus();
    }
    return(false);
  }
  document.forms.log_in.submit();
  return(true);
}

/* left search */

function validate_quick_search()
{
  if(!document.forms.quickSearch.term.value) {
    alert("Please provide a term to search for.");
    document.forms.quickSearch.term.focus();
    return(false);
  }
  return(true);
}

/* collection and product page cart window interaction */

var cart_adds = 0;

function add_to_cart(code, cidx, name, href, quantity, price, quick, added_by)
{
  if(frames.cart_window != null && frames.cart_window.frames.cart_window_products != null && frames.cart_window.frames.cart_window_products.fully_loaded)
    frames.cart_window.frames.cart_window_products.add_to_cart(code, cidx, name, href, quantity, price, quick, added_by);
  else {  // page is not fully loaded, so cache and dispense
    if(!cart_adds)
      cart_adds = new Array();
    cart_queue = new Array(code, cidx, name, href, quantity, price, quick, added_by);
    cart_adds.push(cart_queue);
  }
}

function add_to_cart_mover(element, code, product_type)
{
  _mover(element);
  if(product_type == "featured") {
    if(document.forms.featuredproduct && (options_select = document.forms.featuredproduct.options))
      options_select.className = "thinsethighlight";
  }
  else if(product_type == "monthlyspecials") {
    if(document.forms.monthlyspecials && (options_select = document.forms.monthlyspecials[code + " options"]))
      options_select.className = "thinsethighlight";
  }
  else {
    if(document.forms.Form && (options_select = document.forms.Form[code + " options"]))
      options_select.className = "thinsethighlight";
    if(document.forms[code + "Form"] && (options_select = document.forms[code + "Form"]["options"]))
      options_select.className = "thinsethighlight";
  }
}

function add_to_cart_mout(element, code, product_type)
{
  _mout(element);
  if(product_type == "featured") {
    if(document.forms.featuredproduct && (options_select = document.forms.featuredproduct.options))
      options_select.className = "thinset";
  }
  else if(product_type == "monthlyspecials") {
    if(document.forms.monthlyspecials && (options_select = document.forms.monthlyspecials[code + " options"]))
      options_select.className = "thinset";
  }
  else {
    if(document.forms.Form && document.forms.Form[code + " options"] != null && (options_select = document.forms.Form[code + " options"]))
      options_select.className = "thinset";
    if(document.forms[code + "Form"] && (options_select = document.forms[code + "Form"]["options"]))
      options_select.className = "thinset";
  }
}

function dispense_cart_queue()  // called from the cart window on its load - no need to initiate
{
  if(cart_adds && cart_adds.length && frames.cart_window != null && frames.cart_window.add_to_cart != null) {
    cart_add = cart_adds.pop();
    frames.cart_window.add_to_cart(cart_add[0], cart_add[1], cart_add[2], cart_add[3], cart_add[4], cart_add[5], cart_add[6], cart_add[7]);
    if(cart_adds.length)
      window.setTimeout("dispense_cart_queue", 500);
  }
}

function added_to_cart(code, quantity)
{
  parts = code.split("|");
  subcodes = 0;
  if(parts.length > 1) {
    code = parts[0];
    subcodes = 1;
  }
  if(obj = document.getElementById("box_" + code)) {
    obj.className = "productInfoBoxSelected";
  }
  if(obj = document.getElementById("add_" + code))
    obj.src = "/graphics/buttons/green/small_add_to_cart.gif";
  if(obj = document.getElementById("qty_" + code))
    obj.value = "1";
  if(obj = document.getElementById("cart_spacer_" + code))
    if(obj.innerHTML == "")
      obj.innerHTML = "&nbsp;";
  if(obj = document.getElementById("cart_box_" + code))
    obj.className = "inCartBox";
  if(obj = document.getElementById("cart_qty_" + code)) {
    if(obj.innerHTML == "")
      obj.innerHTML = quantity;
    else obj.innerHTML = "" + (parseInt(obj.innerHTML) + parseInt(quantity));
  }
  if(obj = document.getElementById("cart_phrase_" + code))
    if(obj.innerHTML == "")
      obj.innerHTML = "&nbsp; IN CART";
  if(obj = document.getElementById("action_box_" + code)) {
    if(obj.innerHTML == "") {
      obj.innerHTML = "<a href='/cart.php'><img class='button' src='/graphics/buttons/green/view_cart_flash.gif' style='margin-top: 5px; width: 105px; height: 21px' onmouseover='_mover(this)' onmouseout='_mout(this)'></a>";
      window.setTimeout("unflash_view_cart(\"" + code + "\")", 4000);
    }
  }
}

function unflash_view_cart(code)
{
  if(obj = document.getElementById("action_box_" + code))
    obj.innerHTML = "<a href='/cart.php'><img class='button' src='/graphics/buttons/green/view_cart.gif' style='margin-top: 5px; width: 105px; height: 21px' onmouseover='_mover(this)' onmouseout='_mout(this)'></a>";
}

/* cart */

function start_flashing_update_button()
{
  if(element = document.getElementById("update_cart_button")) {
    if(element.src.substr(element.src.length - 45, element.src.length) != "/graphics/buttons/green/update_cart_flash.gif")
      element.src = "/graphics/buttons/green/update_cart_flash.gif";
  }
}

/* color fade effect */

function dec2hex(dec)
{
  return(("0" + dec.toString(16)).substr(dec.toString(16).length - 1, 2));
}

function hex2dec(hex)
{
  return(parseInt(hex, 16));
}

function mix_colors(start, end, percent)
{
  if(start.charAt(0) == "#")
    start = start.substr(1, start.length);
  if(end.charAt(0) == "#")
    end = end.substr(1, end.length);
  var r1 = hex2dec(start.slice(0, 2));
  var g1 = hex2dec(start.slice(2, 4));
  var b1 = hex2dec(start.slice(4, 6));
  var r2 = hex2dec(end.slice(0, 2));
  var g2 = hex2dec(end.slice(2, 4));
  var b2 = hex2dec(end.slice(4, 6));
  var pc = percent / 100;
  r = Math.floor(r1 + (pc*(r2 - r1)) + .5);
  g = Math.floor(g1 + (pc*(g2 - g1)) + .5);
  b = Math.floor(b1 + (pc*(b2 - b1)) + .5);
  return("#" + dec2hex(r) + dec2hex(g) + dec2hex(b));
}

function fade_element_color(element_id, start_hex, stop_hex, color_type, steps, delay, initial_delay, completion_function_name, current_step)
{
  var new_color = 0;
  if(color_type != "custom" && !(element = document.getElementById(element_id)))
    return;
  if(current_step == null)
    current_step = 0;
  if(current_step++ < steps) {
    percent = ((current_step - 1) * 100) / steps;
    new_color = mix_colors(start_hex, stop_hex, percent);
    window.setTimeout(str = "fade_element_color(\"" + element_id + "\", \"" + start_hex + "\", \"" + stop_hex + "\", \"" + color_type + "\", " + steps + ", " + delay + ", 0, \"" + completion_function_name + "\", " + current_step + ")", initial_delay?initial_delay:delay);
  }
  else new_color = stop_hex;
  if(new_color)
    switch(color_type) {
      case "background":
        element.style.backgroundColor = new_color;
        break;
      case "border":
        element.style.borderColor = new_color;
        break;
      case "custom":
        window[element_id](new_color);
        break;
      default:
        element.style.color = new_color;
    }
  if(current_step > steps)
    if(completion_function_name && window[completion_function_name])
      window[completion_function_name]();
}

