
var cart_http_req = false;

var cart_dflt_thumb_src = "img/cart_dflt.png";


function set_item_count( inp_num )
{
  var class_id = inp_num.getAttribute("class_id");
  var prod_id = inp_num.getAttribute("prod_id");
  var count = parseInt(inp_num.value);
  if (count > 0)
  {
    var req_href = "set_cart_item_count.php?class_id=" + encodeURIComponent(class_id)
                 + "&prod_id=" + encodeURIComponent(prod_id)
                 + "&count=" + count;

    cart_do_request("Updating Shopping Cart", req_href);
  }
  else
  {
    alert("Please enter a number greater than zero for the item.");
    var orig_value = inp_num.getAttribute("orig_value");
    if (orig_value != "")  inp_num.value = orig_value;
    inp_num.focus();
    inp_num.select();
  }

} // set_item_count()


function remove_item( class_id, class_name, prod_id, prod_name )
{
  if ( confirm( "Is it really OK to remove the item\n'" + class_name + " - " + prod_name
              + "'\nfrom your shopping cart?" ) )
  {
    var req_href = "remove_from_cart.php?class_id=" + encodeURIComponent(class_id)
                  + "&prod_id=" + encodeURIComponent(prod_id);

    cart_do_request("Updating Shopping Cart", req_href);
  }
} // remove_item()


function empty_cart()
{
  if ( confirm( "Is it really OK to remove all items from your shopping cart?" ) )
  {
    cart_do_request("Emptying Shopping Cart", "empty_cart.php");
  }
} // remove_item()


function fetch_cart_data()
{
  cart_do_request("Fetching Shopping Cart", "fetch_cart_data.php");
}


function cart_do_request( heading, req_href )
{
  cart_http_req = createXMLHttpRequest();

  if (cart_http_req)
  {
    // initialize the XMLHttpRequest
    cart_http_req.onreadystatechange = cart_http_req_readychange;
    cart_http_req.open("GET", req_href, true);

    cart_http_req.send(null);

    var tr = document.getElementById("tr_process_err");
    if (tr)  tr.style.display = "none";
    tr = document.getElementById("tr_process_button");
    if (tr)  tr.style.display = "none";

    process_set_heading(heading);

    var element = document.getElementById("div_cart");
    if (element)  element.style.display = "none";
    element = document.getElementById("table_submitted");
    if (element)  element.style.display = "none";
    element = document.getElementById("table_process");
    if (element)  element.style.display = "";

  }
  else // if (cart_http_req)
  {
    alert("Unable to create XMLHttpRequest. You may need to update your browser.");
  }

} // cart_do_request()


function cart_http_req_readychange()
{
  if (cart_http_req)
  {
    var status_msg = "", err_msg = "", ready_state = cart_http_req.readyState;

    if (ready_state == 4)
    {
      var http_status = cart_http_req.status;
      if (http_status == 200)
      {
        // HTTP request completed successfully
        var xml_doc = cart_http_req.responseXML;
        if (xml_doc)
        {
          var cart_return = xml_doc.getElementsByTagName("cart-op-return").item(0);
          if (cart_return)
          {
            var op_status = cart_return.getElementsByTagName("op-status").item(0);
            if (op_status)
            {
              var err_code = op_status.getAttribute("error");

              if (err_code == "0")
              {
                // process completed without error
                cart_setup(cart_return);

                // hide the process table and reshow the shopping cart
                var element = document.getElementById("table_process");
                if (element)  element.style.display = "none";
                element = document.getElementById("div_cart");
                if (element)  element.style.display = "";
              }
              else
              {
                // server side error, retriever server error message
                err_msg = op_status.firstChild.data;
              }
            }
            else // if (op_status)
            {
              err_msg = "Could not get the op-status element from the response XML document.";
            }
          }
          else // if (cart_return)
          {
            err_msg = "Could not get the cart-op-return element from the response XML document.";
          }
        }
        else // if (xml_doc)
        {
          err_msg = "Could not get the response XML document.";
        }
      }
      else // if ( http_status == 200 )
      {
        err_msg = "HTTP error #" + http_status;  // http error
      }
      cart_http_req = false;
    }
    else if ( ready_state < 2 )
      status_msg = "Contacting Server...";
    else if ( ready_state == 2 )
      status_msg = "Server processing request...";
    else if ( ready_state == 3 )
      status_msg = "Receiving response from server...";
    else
      status_msg = "Status unknown!";

    if (status_msg != "")
    {
      process_set_status(status_msg);
    }
    if (err_msg != "")
    {
      process_set_err(err_msg);
      if (status_msg == "")
        process_set_status("An error occured preventing the shopping cart from being updated. The error message was:");
    }
  } // if (cart_http_req)
}


function cart_process_continue()
{
  var element = document.getElementById("table_process");
  if (element)  element.style.display = "none";
  element = document.getElementById("table_submitted");
  if (element)  element.style.display = "none";
  element = document.getElementById("div_cart");
  if (element)  element.style.display = "";
}


function cart_empty_on_page()
{
  var n, tr, tr1, el, par;

  tr = document.getElementById("tr_cart_is_empty");
  if (tr)
  {
    // remove any existing item rows, these are the rows between the
    // "tr_cart_is_empty" row and the "tr_cart_foot" row
    par = tr.parentNode;
    tr1 = tr.nextSibling;
    while (tr1)
    {
      if (tr1.id == "tr_cart_foot")  break;
      par.removeChild(tr1);
      tr1 = tr.nextSibling;
    }
    tr.style.display = "";  // show the cart is empty message row
    // set order total to 0.00
    el = document.getElementById("td_cart_grand_total");
    if (el)
    {
      while (el.firstChild)  el.removeChild(el.firstChild);
      el.appendChild(document.createTextNode("0.00"));
    }
    // hide delivery opts
    el = document.getElementById("table_delivery_opt");
    if (el)  el.style.display = "none";
  } // if (tr) - "tr_cart_is_empty"
} // cart_empty_on_page()


function cart_setup(cart_op_ret_doc)
{
  var n, tr, tr1, el, el1, par, grand_total = 0.0;
  var cart_items = cart_op_ret_doc.getElementsByTagName("cart-item");

  tr = document.getElementById("tr_cart_is_empty");
  if (!tr)
  {
    alert("Error: could not setup shopping cart table.");
    return;
  }

  // remove any existing item rows, these are the rows between the
  // "tr_cart_is_empty" row and the "tr_cart_foot" row
  par = tr.parentNode;
  tr1 = tr.nextSibling;
  while (tr1)
  {
    if (tr1.id == "tr_cart_foot")  break;
    par.removeChild(tr1);
    tr1 = tr.nextSibling;
  }
  // tr is the "tr_cart_is_empty" row;  tr1 is either null or the "tr_cart_foot" row

  // hide the "tr_cart_is_empty" row and add the item rows if there are any
  // or show the "tr_cart_is_empty" row if there are no cart items
  n = cart_items.length;
  if (n != 0)
  {
    var item, class_id, class_name, prod_id, prod_name, number, price, thumb_src;
    var i, row, total, regx_apos = new RegExp("'", "g");

    tr.style.display = "none";  // hide the "tr_cart_is_empty" row

    for (i=0; i<n; i++)
    {
      row = i+1;
      tr = document.getElementById("tr_cart_tmpl");
      if (!tr)
      {
        alert("Error: could not find shopping cart row template.");
        return;
      }
      tr = tr.cloneNode(true);
      if (!tr)
      {
        alert("Error: could not create new shopping cart row.");
        return;
      }
      tr.id = "tr_cart_item_" + row;
      tr.setAttribute("class", (row & 1) ? "cart_odd" : "cart_even" );

      item = cart_items.item(i);
      class_id = item.getAttribute("class_id");
      class_name = item.getAttribute("class_name");
      prod_id = item.getAttribute("prod_id");
      prod_name = item.getAttribute("prod_name");
      number = parseInt(item.getAttribute("number"));
      price = parseFloat(item.getAttribute("price"));
      thumb_src = item.getAttribute("thumb_src");
      total = number * price;
      grand_total += total;
      if (thumb_src == "")  thumb_src = cart_dflt_thumb_src;

      for (el=tr.firstChild; el; el = el.nextSibling)
      {
        switch (el.id)
        {
        case "td_cart_thumb_tmpl":
          el1 = el.getElementsByTagName("img").item(0);
          if (el1)
          {
            el1.setAttribute("src", thumb_src);
            el1.id = "img_cart_thumb_" + row;
          }
          el.id = "td_cart_thumb_" + row;
          break;

        case "td_cart_item_tmpl":
          while (el.firstChild)  el.removeChild(el.firstChild);
          el.appendChild(document.createTextNode(class_name + " - " + prod_name));
          el.id = "td_cart_item_" + row;
          break;

        case "td_cart_number_tmpl":
          el1 = el.getElementsByTagName("input").item(0);
          if (el1)
          {
//            el1.setAttribute("onchange", "set_item_count('" + class_id + "','" + prod_id + "',this)");
            el1.onchange = function () { set_item_count(this); };
            el1.value = number.toFixed(0);
            el1.id = "inp_cart_number_" + row;
            el1.setAttribute("class_id", class_id);
            el1.setAttribute("prod_id", prod_id);
            el1.setAttribute("orig_value", number.toFixed(0));
          }
          el.id = "td_cart_number_" + row;
          break;

        case "td_cart_price_tmpl":
          while (el.firstChild)  el.removeChild(el.firstChild);
          el.appendChild(document.createTextNode(format_price(price)));
          el.id = "td_cart_price_" + row;
          break;

        case "td_cart_total_tmpl":
          while (el.firstChild)  el.removeChild(el.firstChild);
          el.appendChild(document.createTextNode(format_price(total)));
          el.id = "td_cart_total_" + row;
          break;

        case "td_cart_remove_tmpl":
          el1 = el.getElementsByTagName("a").item(0);
          if (el1)
          {
            el1.setAttribute("href", "javascript:remove_item('" + class_id + "','"
                                    + class_name.replace(regx_apos, "") + "','" + prod_id + "','"
                                    + prod_name.replace(regx_apos, "") + "')");
            el1.id = "a_cart_remove_" + row;
          }
          el.id = "td_cart_remove_" + row;
          break;

        } // switch()
      } // for (el=...)
      par.insertBefore(tr, tr1);
    } // for (i...)

    el = document.getElementById("table_delivery_opt");
    if (el)  el.style.display = "";
  }
  else // if (n != 0)
  {
    // cart is empty, show the "tr_cart_is_empty" row (tr)
    tr.style.display = "";
    el = document.getElementById("table_delivery_opt");
    if (el)  el.style.display = "none";
  }

  el = document.getElementById("td_cart_grand_total");
  if (el)
  {
    while (el.firstChild)  el.removeChild(el.firstChild);
    el.appendChild(document.createTextNode(format_price(grand_total)));
  }

} // cart_setup()

