
//==============================================================//
// Cart Class
//==============================================================//
function cCart()
{
  this.form_name = "action_form_cart";
  this.add_mode  = "Replace";

  this.product     = new Array();
  this.certificate = new Array();

  this.product_list     = new Array();
  this.certificate_list = new Array();

  this.dynamic_carts    = new Array();

  this.error_str = "";

  this.product_removed     = new Array();
  this.certificate_removed = new Array();

  // methods
  this.load_from_cookie      = cCart_load_from_cookie;
  this.save_to_cookie        = cCart_save_to_cookie;
  this.add_product           = cCart_add_product;
  this.add_certificate       = cCart_add_certificate;
  this.del                   = cCart_del;
  this.add                   = cCart_add;
  this.recalculate           = cCart_recalculate;
  this.submit_form           = cCart_submit_form;
  this.is_innerHTML          = cCart_is_innerHTML;
  this.refresh_dynamic_carts = cCart_refresh_dynamic_carts;
  this.change_ProductOptios  = cCart_change_ProductOptios;
}

//==============================================================//
// Cart Item Class
//==============================================================//
function cCartItem()
{
  this.id    = 0;
  this.qty   = 0;
  this.ProductOptionID    = 0;
  this.price = 0;
  this.total = 0;
  this.prsnt = 1;
}
//==============================================================//

//==============================================================//
// Product Item Class
//==============================================================//
function cCartProductItem()
{
  this.id                 = 0;
  this.Price              = 0;
  this.Quantity           = 0;
  this.MinimumOrderAmount = 0;
  this.Name               = "";
  this.SKU                = "";
  this.QuantityDiscounts  = new Array();
  this.ProductOptions     = new Array();
}
//==============================================================//

//==============================================================//
// Product Option Class
//==============================================================//
function cCartProductOption(optID, optName, optPrice)
{
  this.id                 = optID;
  this.Name               = optName;
  this.Price              = optPrice;
}
//==============================================================//

//==============================================================//
// Product Item Class
//==============================================================//
function cCartCertificateItem()
{
  this.id       = 0;
  this.Price    = 0;
  this.Quantity = 0;
  this.Name     = "";
  this.SKU      = "";
}
//==============================================================//


//----------------------------------------------------------
// Cookies functions
//----------------------------------------------------------
function cCart_load_from_cookie()
{
  this.product     = new Array();
  this.certificate = new Array();

  var id    = GetCookie("cart_id"   ).split(",");
  var type  = GetCookie("cart_type" ).split(",");
  var qty   = GetCookie("cart_qty"  ).split(",");
  var opt   = GetCookie("cart_opt"  ).split(",");
  var price = GetCookie("cart_price").split(",");
  var total = GetCookie("cart_total").split(",");
  var prsnt = GetCookie("cart_prsnt").split(",");

  var cart_item;

  for(var i in id)
  {
    cart_item = new cCartItem();
    cart_item.id    = id[i];
    cart_item.qty   = qty[i];
    cart_item.price = price[i];
    cart_item.total = total[i];
    cart_item.prsnt = prsnt[i];

    if(type[i] == "product") {
      optID = opt[i];
      itemID = cart_item.id;
      if (optID > 0) {
      	itemID = itemID + "_" + optID;
      } else {
      	if (this.product_list[cart_item.id].ProductOptions.length > 0 && this.product_list[cart_item.id].ProductOptions[0].id > 0) {
      		itemID = itemID + "_" + this.product_list[cart_item.id].ProductOptions[0].id;
      	};
      };
      this.product[itemID] = cart_item;
      this.product[itemID].ProductOptionID = optID;

    } else if(type[i] == "certificate") {
      this.certificate[cart_item.id] = cart_item;
    };
  }
}

function cCart_save_to_cookie()
{
  var id    = new Array();
  var type  = new Array();
  var qty   = new Array();
  var opt = new Array();
  var price = new Array();
  var total = new Array();
  var prsnt = new Array();
  for(var i in this.product)
  {
    id.push(   this.product[i].id   );
    type.push( "product"            );
    qty.push(  this.product[i].qty  );
    opt.push(this.product[i].ProductOptionID);
    price.push(this.product[i].price);
    total.push(this.product[i].total);
    prsnt.push(this.product[i].prsnt);
  }
  for(var i in this.certificate)
  {
    id.push(   this.certificate[i].id   );
    type.push( "certificate"            );
    qty.push(  this.certificate[i].qty  );
    opt.push(0);
    price.push(this.certificate[i].price);
    total.push(this.certificate[i].total);
    prsnt.push(this.certificate[i].prsnt);
  }
  SetCookie("cart_id",    id.join(",")   , null, "/");
  SetCookie("cart_type",  type.join(",") , null, "/");
  SetCookie("cart_opt",   opt.join(",")  , null, "/");
  SetCookie("cart_qty",   qty.join(",")  , null, "/");
  SetCookie("cart_price", price.join(","), null, "/");
  SetCookie("cart_total", total.join(","), null, "/");
  SetCookie("cart_prsnt", prsnt.join(","), null, "/");

  // removed items statistic
  var removed_id   = new Array();
  var removed_type = new Array();
  for(var i in this.product_removed)
  {
    removed_id.push(this.product_removed[i]);
    removed_type.push("product");
  }
  for(var i in this.certificate_removed)
  {
    removed_id.push(this.certificate_removed[i]);
    removed_type.push("certificate");
  }
  SetCookie("cart_removed_id",    removed_id.join(",")   , null, "/");
  SetCookie("cart_removed_type",  removed_type.join(",") , null, "/");
}
//----------------------------------------------------------


//----------------------------------------------------------
// cart functions
//----------------------------------------------------------
function cCart_add_product(id, qty, optID)
{
  qty = parseInt(qty);

  var error_str = "";

  id = ''+id+'';
  if (id.indexOf('_') > 0) {
  	arg = id.split('_');
  	id = arg[0];
  	optID = arg[1];
  };

  if(this.product_list[id] != null)
  {
    itemID = id;
    if (optID > 0) {
    	itemID = id + "_" + optID
    } else {
    	if (this.product_list[id].ProductOptions.length > 0 && this.product_list[id].ProductOptions[0].id > 0) {
    		itemID = id + "_" + this.product_list[id].ProductOptions[0].id;
    	};
    };

    if(this.product[itemID] == null)
    {
      this.product[itemID] = new cCartItem();
      this.product[itemID].id = id;
    }
    this.product[itemID].ProductOptionID = optID;

    // Qty Check BEGIN
    var new_qty = (this.add_mode == "Add") ? parseInt(this.product[itemID].qty) + qty : qty;

    var p = new Array();
    p["item"] = "'"+this.product_list[id].SKU+"'";

    if(EnableMinimumOrderAmountOfAProduct && new_qty < this.product_list[id].MinimumOrderAmount && new_qty > 0)
    {
      p["val"] = this.product_list[id].MinimumOrderAmount;
      error_str = parse1(cart_shortage_qty_message, p) + "\n";
    }
    if(EnableProductInventory && new_qty > this.product_list[id].Quantity)
    {
      p["val"] = this.product_list[id].Quantity;
      error_str = parse1(cart_excess_qty_message, p) + "\n";
    }
    // Qty Check END

    // Quantity Discount BEGIN
    new_price = this.product_list[id].Price;

    if(EnableQuantityDiscount)
    {
      for(var i in this.product_list[id].QuantityDiscounts)
      {
        var qd = this.product_list[id].QuantityDiscounts[i];
        if((qd.from <= new_qty || qd.from == 0) && (qd.to >= new_qty || qd.to == 0))
        {
          new_price = qd.value;
          break;
        }
      }
    }
    // Quantity Discount END

    if(error_str == "")
    {
      this.product[itemID].qty   = new_qty;
      this.product[itemID].price = new_price;
      this.product[itemID].total = new_qty * new_price;
    }

    if(this.product[itemID].qty <= 0) this.del("product", id);
  }

  return error_str;
}

function cCart_add_certificate(id, qty)
{
  qty = parseInt(qty);
	
  var error_str = "";

  if(this.certificate_list[id] != null)
  {
    if(this.certificate[id] == null)
    {
      this.certificate[id] = new cCartItem();
      this.certificate[id].id = id;
    }

    // Qty Check BEGIN
    var new_qty = (this.add_mode == "Add") ? parseInt(this.certificate[id].qty) + qty : qty;

    var p = new Array();
    p["item"] = "'"+this.certificate_list[id].SKU+"'";

    if(new_qty > this.certificate_list[id].Quantity)
    {
      p["val"] = this.certificate_list[id].Quantity;
      error_str = parse1(cart_excess_qty_message, p) + "\n";
    }
    // Qty Check BEGIN

    new_price = this.certificate_list[id].Price;

    if(error_str == "")
    {
      this.certificate[id].qty   = new_qty;
      this.certificate[id].price = new_price;
      this.certificate[id].total = new_qty * new_price;
    }

    if(this.certificate[id].qty <= 0) this.del("certificate", id);
  }
  return error_str;
}


function cCart_add(type, id, qty, optID)
{
  this.load_from_cookie();

  this.error_str = "";

  switch(type)
  {
    case "product":
      this.error_str += this.add_product(id, qty, optID);
      break;

    case "certificate":
      this.error_str += this.add_certificate(id, qty);
      break;

    case "selected":
      var checkbox, qtybox;

      for(var i in this.product_list)
      {
        checkbox = document.forms[this.form_name].elements["product_item["+i+"]"];
        qtybox   = document.forms[this.form_name].elements["product_qty["+i+"]"];

        if(checkbox && checkbox.checked)
          this.error_str += this.add_product(i, qtybox ? qtybox.value : 1);
      }

      for(var i in this.certificate_list)
      {
        checkbox = document.forms[this.form_name].elements["certificate_item["+i+"]"];
        qtybox   = document.forms[this.form_name].elements["certificate_qty["+i+"]"];

        if(checkbox && checkbox.checked)
          this.error_str += this.add_certificate(i, qtybox ? qtybox.value : 1);
      }
      break;
  }

  if(this.error_str == "") {
    this.save_to_cookie();
    if(cart_quick_add_message && EnableQuickAdd) {
      alert(cart_quick_add_message);
	}
  }
}

function cCart_del(type, id)
{
  this.load_from_cookie();

  switch(type)
  {
    case "product":
      this.product_removed.push(id);
      delete this.product[id];
      break;

    case "certificate":
      this.certificate_removed.push(id);
      delete this.certificate[id];
      break;

    case "selected":
      var checkbox, qtybox;

      for(var i in this.product)
      {
        checkbox = document.forms[this.form_name].elements["product_item["+i+"]"];

        if(checkbox && checkbox.checked) {
          this.del("product", i);
        };
      }

      for(var i in this.certificate_list)
      {
        checkbox = document.forms[this.form_name].elements["certificate_item["+i+"]"];

        if(checkbox && checkbox.checked)
          this.del("certificate", i);
      }
      break;
  }

  if(this.error_str == "") this.save_to_cookie();
}

function cCart_recalculate()
{
  var checkbox, qtybox;

  this.load_from_cookie();

  this.error_str = "";

  var mode = this.add_mode;
  this.add_mode = "Replace";

  for(var i in this.product)
  {
    qtybox = document.forms[this.form_name].elements["product_qty["+i+"]"];

    if(qtybox) {
      this.error_str += this.add_product(i, parseInt(qtybox.value));
    };
  }
  for(var i in this.certificate_list)
  {
    qtybox = document.forms[this.form_name].elements["certificate_qty["+i+"]"];

    if(qtybox)
      this.error_str += this.add_certificate(i, parseInt(qtybox.value));
  }

  this.add_mode = mode;

  this.change_ProductOptios();

  if(this.error_str == "") this.save_to_cookie();
}
//----------------------------------------------------------

//----------------------------------------------------------
function cCart_change_ProductOptios() {
	for(var i in this.product) {
		optionsSelect = document.forms[this.form_name].elements["ProductOptions_"+i];

		id = this.product[i].id;
		qty = this.product[i].qty;
		new_optID = 0;

		if(optionsSelect) {
			new_optID = optionsSelect.options[optionsSelect.selectedIndex].value;

			if (new_optID != this.product[i].ProductOptionID) {
				if (this.product[id+'_'+new_optID]) {
					delete this.product[i];
					this.error_str += this.add_product(id, qty, new_optID);
				} else {
					this.product[i].ProductOptionID = new_optID;
				};
			};
		};
	};
}
//----------------------------------------------------------


//----------------------------------------------------------
// Dynamic cart functions
//----------------------------------------------------------

function cCart_is_innerHTML()
{
  if(document.body.innerHTML)
    return true;
  else
    return false;
}

function cCart_refresh_dynamic_carts()
{
  var div, list, itm, res, p;

  for(dc_name in this.dynamic_carts)
  {
    list = "";
    for(var i in this.product)
    {
      itm = this.dynamic_carts[dc_name].product_item;
      p = new Array();
      p["qty"]      = this.product[i].qty;
      p["price"]    = formatPrice(this.product[i].price);
      p["total"]    = formatPrice(this.product[i].total);
      p["SKU"]      = this.product_list[this.product[i].id].SKU;
      p["ItemName"] = this.product_list[this.product[i].id].Name;

      productInfo = this.product_list[this.product[i].id];
      if (
      	this.product[i].ProductOptionID > 0
      	&& productInfo
      	&& productInfo.ProductOptions
      ) {
      	for (j in productInfo.ProductOptions) {
      	  prod_option = productInfo.ProductOptions[j];
      	  if (prod_option.id == this.product[i].ProductOptionID) {
      	  	p["price"] = parseFloat(p["price"]) + prod_option.Price;
      	  	p["ItemName"] += " (" + prod_option.Name + ")";
      	  	break;
      	  };
      	};
      };

      itm = parse1(itm, p);
      list += itm
    }
    for(var i in this.certificate)
    {
      itm = this.dynamic_carts[dc_name].certificate_item;
      p = new Array();
      p["qty"]      = this.certificate[i].qty;
      p["price"]    = formatPrice(this.certificate[i].price);
      p["total"]    = formatPrice(this.certificate[i].total);
      p["SKU"]      = this.certificate_list[i].SKU;
      p["ItemName"] = this.certificate_list[i].Name;
      itm = parse1(itm, p);
      list += itm
    }
    if(!list) list = this.dynamic_carts[dc_name].empty_item;

    div = document.getElementById(dc_name + "_div");
    res = div.innerHTML+"";
    res = res.replace(/<!--list-->(?:.|[\r\n])*<!--list-->/, "<!--list-->"+list+"<!--list-->");
    div.innerHTML = res;
  }
}

//----------------------------------------------------------
// Action Form functions
//----------------------------------------------------------

function cCart_submit_form(submit_function)
{
  if(this.error_str != "")
  {
    alert(this.error_str);
  }
  else
  {
    if(EnableQuickAdd)
    {
      if(this.is_innerHTML() && array_length(this.dynamic_carts) > 0) {
        this.refresh_dynamic_carts();
      } else {
        if(cart_quick_add_message) {
          alert(cart_quick_add_message);
		}
	  }
    }
    else
    { /*
      if(submit_function != null)
      {
        submit_function();
      }
      else if(document[this.form_name])
      {
        document[this.form_name].submit();
      }*/
	  location.href=script_url+'?ap=cart/cart';
    }
  }
}

//==============================================================//
// Cart Class End
//==============================================================//

var cart = new cCart();
cart.add_mode = Cart_AddMode;

if(!navigator.cookieEnabled && cart_cookie_disable_message) alert(cart_cookie_disable_message);
