var Basket = function() {
	var products;
	var domFullCount, domFullCost;
	this.isOrder = false;
	
	var countChanges = [];
	var hChangeTimer = null;
	
	function updateFull() {
		var count = 0;
		var cost = 0;
		for(var id in products) {
			if(products[id] === null)
				continue;
			count += products[id].count;
			cost  += products[id].count * products[id].price;
		}
		domFullCount.innerHTML = count;
		domFullCost.innerHTML = cost;
	}
	
	function setUpdateCountTimer() {
		if(hChangeTimer !== null) 
			clearTimeout(hChangeTimer);
		hChangeTimer = setTimeout(sendUpdateCount, 500);
	}
	
	function sendUpdateCount() {
		var oSend = {};
		for(var id in countChanges)
			oSend["count["+id+"]"] = countChanges[id];
		$.post(ajaxUrl('basket','update_count'), oSend, onLoadBasket, "json");
		
		countChanges = [];
		hChangeTimer = null;
	}
	
	function updateProductCount(productId, count) {
		var oProd = products[productId];
		oProd.count = count;
		if(count > 0) 
			oProd.jCount.text(count);
		else {
			oProd.dom.parentNode.removeChild(oProd.dom);
			products[productId] = null; 
		}
		countChanges[productId] = count;
		
		updateFull();
		setUpdateCountTimer();
	}
	
	this.add = function(productId) {
		if(products[productId] === undefined) {
			$.post(ajaxUrl('basket','add_product'), {product_id: productId}, onLoadBasket, "json");
		} else {
			updateProductCount(productId, products[productId].count+1);
		}
		return false;
	};

	this.minus = function(productId) {
		if(products[productId] === undefined)
			return false;
		updateProductCount(productId, products[productId].count-1);
		return false;
	};
	
	function addAll() {
		var cnt;
		for(var id in products) {
			if(products[id] === null)
				continue;
			cnt = ++products[id].count;
			countChanges[id] = cnt;
			products[id].jCount.text(cnt);
		}
		updateFull();
		setUpdateCountTimer();
		return false;
	}
	
	function minusAll() {
		var cnt;
		for(var id in products) {
			if(products[id] === null)
				continue;
			cnt = --products[id].count;
			if(cnt < 0) cnt = 0;
			countChanges[id] = cnt;
			if(cnt > 0)
				products[id].jCount.text(cnt);
			else {
				$(products[id].dom).remove();
				products[id] = null; 
			}
		}
		updateFull();
		setUpdateCountTimer();
		return false;
	}
	
	function onLoadBasket(result) {
		if(result.content) {
			if(this.isOrder){
				window.location.reload();
			} else {
				$("#basket").replaceWith(result.content);
				initBasket();
			}
		}
	}
	
	function onAddClick() {
		g_basket.add(this.objIndex);
		return false;
	}
	
	function onMinusClick() {
		g_basket.minus(this.objIndex);
		return false;
	}

	function initBasket() {		
		//список продуктов
		products = [];
		var jItems = $("#basket_items li");
		var oProd, prodId, oElt;
		for(var i=0; i<jItems.length; i++) {
			prodId = fromClass(jItems[i], 'id_');
			if(prodId === false)
				continue;
			oProd = {};
			oProd.dom = jItems[i];
			//данные о продукте
			oProd.price = parseInt($(".j_price",jItems[i]).text());
			oProd.jCount = $(".j_count",jItems[i]);
			oProd.count = parseInt(oProd.jCount.text());
			//добавить
			oElt = $(".j_add", jItems[i])[0];
			if(oElt) {
				oElt.objIndex = prodId;
				oElt.onclick = onAddClick;
			}
			//убавить
			oElt = $(".j_minus", jItems[i])[0];
			if(oElt) {
				oElt.objIndex = prodId;
				oElt.onclick = onMinusClick;
			}
			
			products[prodId] = oProd;
		}
		domFullCount = $("#basket_full_count")[0];
		domFullCost = $("#basket_full_cost")[0];
		//обработчики добавить/убавить всё
		$("#basket_add_all").click(addAll);
		$("#basket_minus_all").click(minusAll);
	}
	
	$(document).ready(initBasket);
}

var g_basket = new Basket();
