var Basket = function() {
	this.curId = -1;
	this.sendTimeout = 500;	
	
	this.productsList = {};	
	this.initBasketElements(false);
	this.initBasket();
	this.initProductsCount();	
	this.initBasketWarnings();
}

Basket.prototype.initBasket = function() {
	this.initBasketElements(true);
	this.initDateTime();
	this.initPersonsCount();	
}


//установка обработчиков событий
Basket.prototype.initBasketElements = function(isBasket) {
	//список элементов
	if(isBasket)
		var jBasketItems = $("#basket_cont .j_basket_count");
	else
		var jBasketItems = $("#products_list .j_basket_count");
		
	for(var i=0; i<jBasketItems.length; i++) {
		var domItem = jBasketItems[i];
		//ID продукта
		var productId = fromClass(domItem, "id_");
		if(productId === false)
			return;
		//инициализируем элемент
		if(this.productsList[productId] === undefined) {
			this.productsList[productId] = {
				id: productId,
				count: 0
			}
		}
		var product = this.productsList[productId];
		//находим инпут
		var domInput = domItem.getElementsByTagName("input")[0];
		if(domInput) {
			//запоминаем
			product[isBasket ? 'basketInput' : 'listInput' ] = domInput;
			//вешаем на него обработчики
			domInput.productId = productId;
			domInput.obj = this;
			domInput.onkeyup = this._onChangeProductInput;
			domInput.onchange = this._onChangeProductInput;				
		}		
		//находим кнопку вверх и вниз
		var domUpDown = domItem.getElementsByTagName("a");
		//вешаем на них обработчики
		if(domUpDown.length == 2) {
			domUpDown[0].productId = productId;
			domUpDown[0].isUp = true;
			domUpDown[0].obj = this;
			domUpDown[0].onclick = this._onUpDownClick;
			
			domUpDown[1].productId = productId;
			domUpDown[1].isUp = false;
			domUpDown[1].obj = this;
			domUpDown[1].onclick = this._onUpDownClick;
		}		
	}
	//в корзине поставим обработчики на кнопку "Удалить"
	if(isBasket) {
		$(".j_basket_del").click(function(){
			var productId = fromClass(this, "id_");
			g_basket.changeCount(productId, 0, this, true);			
			return false;
		});
		if($("#basket_area_select")[0] != undefined)
			$("#basket_area_select")[0].onchange = this._onSelectArea;
	}
	//если корзина пустая - отменить пердумпеждения о потере заказа
	if(this.isAddWarning) {
		var isEmpty = $("#basket_cont .j_empty").length > 0;
		if(isEmpty)
			this.isAddWarning = false;
	}
	
}

//получает кол-во продуктов на момент загрузки страницы
Basket.prototype.initProductsCount = function() {
	var jCounts = $("#basket_cont .j_basket_count");
	if(!jCounts.length)
		jCounts = $("#products_list .j_basket_count");
	for(var i=0; i<jCounts.length; i++) {
		var productId = fromClass(jCounts[i], "id_");
		var domInput = jCounts[i].getElementsByTagName("input")[0];
		if(domInput) {
			var value = domInput.value;
			if(!isNaN(value) && value>0)
				this.productsList[productId].count = value;
		}
	}
}

Basket.prototype.initBasketWarnings = function() {
	//выводить ли предупреждение при добавлении продукта
	var jMsg = $("#basket_cont .j_warning_add");
	this.isAddWarning = jMsg.length > 0;
	if(this.isAddWarning) {
		this.addWarningText = jMsg.text();
	}
}
//изменение кол-ва продуктов при помощзи инпута
//в контексте элемента DOM
Basket.prototype._onChangeProductInput = function() {
	var productId = this.productId;
	var ths = this.obj;
	var value = this.value;
	
	if(!isNaN(value) && value >= 0) {
		ths.changeCount(productId, value, this);
	}
}

//изменение района
Basket.prototype._onSelectArea = function() {	
	$.post(base_url+"/ajax/basket/selectarea",{
		area : $("#basket_area_select").val()
	}, g_basket._onLoadBasket);
}

//изменение кол-ва продуктов при помощзи кнопок вверх/вних
//в контексте элемента DOM
Basket.prototype._onUpDownClick = function() {
	var productId = this.productId;
	var ths = this.obj;
	
	var count = ths.getProductCount(productId);	
	if(this.isUp) {
		//увеличение кол-ва
		count++;
	} else {
		//уменьшение кол-ва
		if(isNaN(count) || count <= 0)
			return false;
		count--;
	}
	ths.changeCount(productId, count, this);
	
	return false;
}

Basket.prototype.changeCount = function(productId, newValue, curChanger, isIntermediate) {
	//получим информацию о продукте
	var product = this.productsList[productId];
	//HACK: на некоровые продукты аминимальынй заказ = 3
	if(productId == 1690 || productId == 1691 || productId == 1692) {
		if(newValue > 0 && newValue < 3) {
			newValue = product.count > 0 ? 0 : 3;
		}
	}
	//пердупреждение о потере заказа
	var isNew = !product || product.count == 0;
	if(this.isAddWarning && isNew) {
		var res = confirm(this.addWarningText);		
		if(!res) {
			//пользователь не захотел терять заказ
			return false;
		} else {
			//повторно не спрашивать
			this.isAddWarning = false;
		}
		 
	}
	//редактируется ли сейчас какая-либо позиция?
	if(this.curId != -1) {
		//редактируется текущая позиция?
		if(this.curId == productId)
			clearTimeout(this.curTimeout);
		else
			this.sendCurrentChange();
	}
	//запомним изменяемые значения
	this.curId = productId;
	this.curValue = newValue;		
	//обновить значение в инпутах
	if(product) {
		var pr = this.productsList[productId];
		if(pr.listInput && pr.listInput != curChanger) {
			pr.listInput.value = newValue;
		}
		if(pr.basketInput && pr.basketInput != curChanger)
			pr.basketInput.value = newValue;
	}
	//установим таймаут
	if(isIntermediate)
		this._sendCurrentChange();
	else
		this.curTimeout = setTimeout(this._sendCurrentChange, this.sendTimeout);	
}

Basket.prototype.getProductCount = function(productId) {
	//является ли текущим редактируемым
	if(productId == this.curId)
		return this.curValue;
	//сохранённое значение
	if(this.productsList[productId] !== undefined)
		return this.productsList[productId].count;
	//продукт не найден
	return 0;
}

Basket.prototype._sendCurrentChange = function() {
	g_basket.sendCurrentChange();
}

Basket.prototype.sendCurrentChange = function() {
	//если нично не редактировалось - ничего не посылать
	if(this.curId == -1)
		return;
	//отправляем запрос
	$.post(base_url+"/ajax/basket/add",{
		id: 	this.curId,
		count:	this.curValue
	}, this._onLoadBasket);
	//запомним изменение
	this.productsList[this.curId].count = this.curValue;
	this.curId = -1;
}
//в глобальном контексте
Basket.prototype._onLoadBasket = function(res) {
	if(res.length) {
		//редирект
		if(res.substr(0,2) == 'R:') {
			window.location.href = res.substr(2);
			return;
		}
		//удаляем ссылки на старые инпуты
		for(var i=0; i<g_basket.productsList.length; i++) {
			g_basket.productsList[i].basketInput = null;
		}
		//показываем новое сожержимое
		$("#basket_cont").html(res);
		//устанавливаем обработчики событий
		g_basket.initBasket();
	}
}

//обработка изменения даты и времени
//все изменения записываем в куки
Basket.prototype.initDateTime = function() {
	//измение дня
	$("#basket_day_select").change(function(){
		var value = this.options[this.selectedIndex].value;
		document.cookie = "basket_set_date="+value+";path=/";
		//обновим корзину
		$.post(base_url+"/ajax/basket/show",{}, g_basket._onLoadBasket);

	});
	//изменение времени
	$("#basket_time_select").change(function(){
		var value = this.options[this.selectedIndex].value;
		document.cookie = "basket_set_time="+value+";path=/";
	});
}

//обработка изменения кол-ва персо
//все изменения записываем в куки
Basket.prototype.initPersonsCount = function() {
	//получаем элементы
	var oCont = document.getElementById('basket_persosns_count');
	if(!oCont)
		return;
	var oInput = oCont.getElementsByTagName('input')[0];
	var arUpDown = oCont.getElementsByTagName('a');
	//вспомогательные функции
	var getValue = function() {
		if(isNaN(oInput.value) || oInput.value.length == 0)
			return 0;
		else
			return parseInt(oInput.value);
	}
	var setValue = function(value, setInputVal) {
		document.cookie = "basket_set_persons="+value+";path=/";
		if(setInputVal)
			oInput.value = value;
	}
	//обработка измениния в input-е
	oInput.onchange = function() {
		setValue(this.value);
	}
	//стрлочка вверх
	arUpDown[0].onclick = function() {
		var value = getValue();
		setValue(value + 1, true);
		return false;
	}
	//стрлочка вниз
	arUpDown[1].onclick = function() {
		var value = getValue();
		if(value > 1)
			setValue(value - 1, true);		
		return false;
	}
}


//полёты во сне и наяву
var domFly;
var flyTop = 0;

function initFlyBasked() {
	domFly = document.getElementById('basket_cont');
	if(domFly) {
		//domFly.className = '';
		
		var o = domFly;
		flyTop = domFly.offsetTop;
		while(o = o.offsetParent) {
			flyTop += o.offsetTop;
		}
		/*if($.browser.msie &&navigator.appVersion.match(/MSIE\s*(\d+)/)[1] < 8) {
			flyTop += 109;
		}*/		
		onScrollWindow();
	}
}

function onScrollWindow() {
	if(!domFly)
		return;
	
	var scrollTop = self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
	if((flyTop - scrollTop) > 15) {
		if($(domFly).hasClass('basket-fly')) {
			$(domFly).removeClass('basket-fly')
			if(!$.browser.msie || navigator.appVersion.match(/MSIE\s*(\d+)/)[1] != 7)
				domFly.style.width = 'auto';
		}
	} else {
		if($(domFly).hasClass('basket-fly') == false) {
			$(domFly).addClass('basket-fly');
			domFly.style.width = domFly.parentNode.offsetWidth + 'px';			
		}			
	}
}	

var g_basket;
$().ready(function(){
	//инициализация корзины
	g_basket = new Basket();
	
	onscroll = onScrollWindow;
	initFlyBasked();
});

