// класс для работы с корзиной
// данные хранятся в виде ID_ТОВАРА1|Количество1|Цена1=ID_ТОВАРА2|Количество2|Цена2=...
// требуется common.js

function CartClass(sCookieName){
	this.Init(sCookieName);
}

CartClass.prototype.sCookieName=COOKIE_NAME; //имя cookie
CartClass.prototype.iTTL=0; //время жизни сookie, в часах; 0 - живет в течение сессии
CartClass.prototype.length=0; //количество уникальных элементов в корзине
CartClass.prototype.iTotal=0; //количество товаров в корзине
CartClass.prototype.iCost=0; //стоимость всех товаров
CartClass.prototype.iDuration=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={};

	sCookieData = unescape(sCookieData);
	sCookieData = sCookieData.replace(/\+/g,' ');

	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[2]);



			if(this.oData[aTrio[0]])
			{
				var sName = aTrio[1];
				sName=sName.replace('+',' ');
				this.oData[aTrio[0]].Id = aTrio[0];
				this.oData[aTrio[0]].Name = sName;
				this.oData[aTrio[0]].Qty += iQty;
				this.oData[aTrio[0]].Dur = parseInt(aTrio[4]);
			}
			else
			{
				var sName = aTrio[1];
				this.oData[aTrio[0]] = {Dur: parseInt(aTrio[4]), Qty: iQty, Name: sName, Cost: this.ValidQty(aTrio[3]), Id: aTrio[0]};
			}
		}
		this.UpdateInfo();
	}
}

CartClass.prototype.Save=function(){
	var aTemp=[];
	for(var s in this.oData)
		if(this.oData[s])
	{
			aTemp.push(s+'|'+this.oData[s].Name+'|'+this.oData[s].Qty+'|'+this.oData[s].Cost+'|'+this.oData[s].Dur);
	}

	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, sName, iCost, iQty, iDur){
	if( (iQty = this.ValidQty(iQty)) )
		this.Set(sID, sName, iCost, iQty + ( (this.oData[sID]) ? this.oData[sID].Qty : 0 ), iDur);
}

CartClass.prototype.Set=function(sID, sName, iCost, iQty, iDur){
	if( (iQty = this.ValidQty(iQty, true)) ){
		if(this.oData[sID] == null)
			this.oData[sID]={};

		this.oData[sID].Id = sID;
		this.oData[sID].Name = sName;
		if(iCost != null) this.oData[sID].Cost = iCost;
		this.oData[sID].Qty = iQty;
		this.oData[sID].Dur = iDur;
	}
	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 = this.iDuration = 0;
	for(var s in this.oData){
		this.length += 1;

		this.Name += this.oData[s].Name;

		this.iTotal += this.oData[s].Qty;
		this.iCost  += this.oData[s].Qty * this.oData[s].Cost;

		this.iDuration += this.oData[s].Dur;
	}
}

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;
}
