// класс для работы с корзиной
// данные хранятся в виде ID_ТОВАРА1|Количество1|Цена1=ID_ТОВАРА2|Количество2|Цена2=...
// требуется common.js

function CartClass(sCookieName){
	this.Init(sCookieName);
}

CartClass.prototype.sCookieName="CART"; //имя cookie
CartClass.prototype.iTTL=3; //время жизни сookie, в часах; 0 - живет в течение сессии
CartClass.prototype.length=0; //количество уникальных элементов в корзине
CartClass.prototype.iTotal=0; //количество товаров в корзине 
CartClass.prototype.iCost=0; //стоимость всех товаров
CartClass.prototype.bAutosave=true; //автосохранение состояния корзины при любых манипуляциях с ней

CartClass.prototype.Init=function(sCookieName){
	if(sCookieName != null)
		this.sCookieName = sCookieName;
	this.oData={};
	this.Parse();
}

CartClass.prototype.Parse=function(){
	var sCookieData = getCookie(this.sCookieName);
	this.oData={};
	
	if(sCookieData){
		var aSplit=sCookieData.split('=');
		var aTrio=[], iQty=0;
		for(var i=0; i<aSplit.length; i++){
			aTrio=aSplit[i].split('|');
			iQty = this.ValidQty(aTrio[1]);
			if(this.oData[aTrio[0]])
				this.oData[aTrio[0]].Qty += iQty;
			else
				this.oData[aTrio[0]] = {Qty: iQty, Cost: this.ValidQty(aTrio[2])};
		}
		this.UpdateInfo();
	}
}

CartClass.prototype.Save=function(){
	var aTemp=[];
	for(var s in this.oData)
		if(this.oData[s])
			aTemp.push(s+'|'+this.oData[s].Qty+'|'+this.oData[s].Cost);
	setCookie(this.sCookieName, aTemp.join('='), this.TTL(), '/');
}

CartClass.prototype.Get=function(sID){
	return (this.oData[sID]) ? this.oData[sID] : null;
}

CartClass.prototype.Add=function(sID, iCost, iQty){
	if( (iQty = this.ValidQty(iQty)) )
		this.Set(sID, iCost, iQty + ( (this.oData[sID]) ? this.oData[sID].Qty : 0 ));
}

CartClass.prototype.Set=function(sID, iCost, iQty){
	if( (iQty = this.ValidQty(iQty, true)) ){
		if(this.oData[sID] == null)
			this.oData[sID]={};
		
		if(iCost != null) this.oData[sID].Cost = iCost;
		this.oData[sID].Qty = iQty;
	}
	else
		this.Remove(sID);

	this.UpdateInfo();
	if(this.bAutosave)
		this.Save();
}

CartClass.prototype.Remove=function(sID){
	if(this.oData[sID]){
		delete this.oData[sID];
		this.UpdateInfo();
		if(this.bAutosave)
			this.Save();
	}
}

CartClass.prototype.UpdateInfo=function(){
	this.length = this.iTotal = this.iCost = 0;
	for(var s in this.oData){
		this.length += 1;
		this.iTotal += this.oData[s].Qty;
		this.iCost  += this.oData[s].Qty * this.oData[s].Cost;
	}
}

CartClass.prototype.ValidQty=function(sQty, bPositive){
	var iQty=parseInt(sQty);
	return fnIsNaN(iQty) ? 0 : ( (bPositive) ? Math.max(0, iQty) : iQty);
}

CartClass.prototype.TTL=function(){
	var dt=new Date();
	if(this.iTTL){
		dt.setHours(dt.getHours() + this.iTTL);
		return dt;
	}
	else
		return null;
}