/**
* Sitefactor Rich Internet Application standart library, v 1.0 [Catalogs karkas classes]
* require RIA.js library ! Pattern singleton 
* реализация объект ВСЕГДА называется Catalog !!!
*/
function delAlerts(){ // очистка алертов
	var al = document.getElementById('alerter');
	var als = al.childNodes; for(var i=0; i < als.length; i++) al.removeChild(als.item(i));
}
function onerror(txt){ // обработчик ошибки запроса к серверу
	document.body.style.cursor = 'default'; Debug.alert(txt, 'alarm'); 
}

var CATALOG_DATA = [];		// данные текущей выборки каталога (ПОЛЕ ГЛОБАЛЬНОЕ ДЛЯ УПРОЩЕНИЯ ЖИЗНИ)
var _CATALOG_DATA = null;	// буфер начальных данных при загрузке страницы

// прототип объекта Catalog для работы с каталогами различных типов, но идентичного поведени
var Catalog = new function(){
	this.module = '';		// класс модуля, предоставляющего RIA-методы каталога
	this.imgc = '';			// каталог с превьюшками изображений товаров каталога в формате jpg
	this.imgf = '';			// каталог с полноформатными изображениями товаров каталога в формате jpg
	this.cards = null;		// доступ к итератору миникарточек
	
	this.init = function(moduleNS, previewDir, photoDir, eshp){ // объявление объектов интерфейса каталога
		// настройка модуля реализации, путей к картинкам, списка позиций страницы каталога etc
		this.module = moduleNS;
		this.imgc = previewDir;
		this.imgf = photoDir;
		// определение миникарточек товарных позиций на странице
		cards = this.getMinicards(); LIMIT = cards.length; this.cards = cards;
		// определяем параметры скроллера и инитим скроллер
		scroll_prev = document.getElementById('scroll_prev');	
		scroll_s = document.getElementById('scroll_s');		
		scroll_po = document.getElementById('scroll_po');		
		scroll_all = document.getElementById('scroll_all');	scroll_all.innerHTML = CATALOG_DATA.length;	
		scroll_next = document.getElementById('scroll_next');	
		initScroll();
		// определяем поля карточки с подробной информацией о товарной позиции
		card = document.getElementById('card');
		card_photo = document.getElementById('card_photo');
		card_text = document.getElementById('card_text');
		_CATALOG_DATA = CATALOG_DATA;
	}
	this.getMinicards = function(){ // возвращает список миникарточек
		return document.getElementById('catalog').getElementsByTagName('DIV');
	}
	// скроллер страниц текущей выборки
	this.arrowScroll = function(event){ // скролл стрелками курсора с клавиатуры
		if(!document.getElementById) return; 
		if(window.event) event = window.event;
		if(event.ctrlKey){
			switch (event.keyCode ? event.keyCode : event.which ? event.which : null){
				case 0x25: Catalog.scrollPrev(); break;
				case 0x27: Catalog.scrollNext(); break;
			} 
		}			
	}
	this.scrollNext = function(){ // скролл вперед
		if(scroll_next.className != 'active') return; // блокируем переход
		for(var i = 0; i < LIMIT; i++){ // перерисовываем миникарточки
			if(this.redrawCards(i, scroll_next_v)) scroll_next_v++;
			scroll_prev_v++; 
		} 
		scroll_s.innerHTML = scroll_prev_v + 1;  scroll_prev.className = 'active';
		scroll_po.innerHTML = scroll_next_v; if(scroll_next_v >= scroll_all_v) scroll_next.className = ''; 
	}
	this.scrollPrev = function(){ // скролл назад
		if(scroll_prev.className != 'active') return; // блокируем переход 
		for(var i = LIMIT - 1; i >= 0; i--){ // перерисовываем миникарточки
			if(this.redrawCards(i, scroll_prev_v - 1)) scroll_prev_v--; 
			scroll_next_v = scroll_prev_v + LIMIT;
		} 
		scroll_s.innerHTML = scroll_prev_v + 1; if(scroll_prev_v == 0) scroll_prev.className = '';
		scroll_po.innerHTML = scroll_next_v; scroll_next.className = 'active'; 
	}
	this.redrawCards = function(i, index){ // на входе объект карточки и индекс в CATALOG_DATA
		try{
			var minicard = cards.item(i);
			var obj = CATALOG_DATA[index];
			minicard.setAttribute('item', index);										// id товара карточки
			minicard.getElementsByTagName('IMG')[1].src = this.imgc + obj.id + '.jpg';	// превьюшка
			minicard.getElementsByTagName('SPAN')[0].innerHTML = obj.hint;				// описание карточки
			minicard.style.visibility = 'visible'; return true;
		}catch(e){ // скрытие карточки, если на странице их меньше лимита
			minicard.style.visibility = 'hidden'; return false;
		}
	}
	
	// карточка с подробной информацией
	this.cardShow = function(i){ // карточка подробной информации о позиции в поп-апе
		i = this.getItem(i).getAttribute('item'); 
		card_photo.src = this.imgf + CATALOG_DATA[i].id + '.jpg';
		card_text.innerHTML = this.set_card_text(CATALOG_DATA[i]);
		card.style.display = 'block';
	}
	this.set_card_text = function(item){ // вывод текста карточки (обычно получаем с сервера plain html
		return item.hint; 
	}
	this.cardClose = function(){ // скрытие карточки с описанием товара
		card.style.display = 'none'; card_photo.src = '/sitefactor/0.gif';
	}

	// выборка позиций по фильтру
	this.getFilter = function(){ // получение объекта параметров фильтра
		return {}; // определяется реализацией каталога !
	}
	this.applyFilter = function(noCache){ // запрашивает с сервера данные согласно фильтру, перерисовывает каталог
		var q = this.getFilter(); delAlerts(); // запрос GET !
		if(q) RIA.query(this.module, 'applyFilter', q, applyFilterCallback, onerror, true, noCache);
	}
	this.resetFilter = function(){ // сброс всех условий фильтра
		delAlerts(); applyFilterCallback(_CATALOG_DATA);
	}
	this.setSpecFilter = function(type, force){ // фильтр по фаворитам или корзине
		var tmp = [];
		for(var i = 0; i < _CATALOG_DATA.length; i++){
			var id = _CATALOG_DATA[i].id;
			switch(type){
				case 'favor': if(Eshop.isInFavor(id)) tmp.push(_CATALOG_DATA[i]); break;
				case 'cart': if(Eshop.isInCart(id)) tmp.push(_CATALOG_DATA[i]); break;
				default:
			}
		} delAlerts(); applyFilterCallback(tmp);
	}

	// внешний интерфейс для использования в модуле магазина и прочих
	this.getItem = function(i, asPosition){ // возвращает элемент карточки 
		return (asPosition) ? cards.item(i).getAttribute('item') : cards.item(i);
	}

	var cards;			// итератор миникарточек с позициями страницы каталога
	var LIMIT = 0;		// количество карточек на странице

	var scroll_prev;	// объект скроллера - листалка назад
	var scroll_s;		// объект скроллера - показано с
	var scroll_po;		// объект скроллера - показано по 
	var scroll_all;		// объект скроллера - хинт всего найдено позиций в фильтре
	var scroll_next;	// объект скроллера - листалка вперед
	var scroll_all_v;	// всего позиций в текущей выборке
	var scroll_next_v;	// текущая позиция курсора для скролла вперед
	var scroll_prev_v;	// текущая позиция курсора для скролла назад
	function initScroll(){ // установка начальных значений скроллера для новой выборки
		scroll_next_v = LIMIT; scroll_prev_v = 0; scroll_all_v = CATALOG_DATA.length;
		scroll_s.innerHTML = 1; scroll_po.innerHTML = (scroll_all_v <= LIMIT) ? scroll_all_v : LIMIT; 
		scroll_all.innerHTML = scroll_all_v; 
		scroll_prev.className = ''; scroll_next.className = (scroll_all_v > LIMIT) ? 'active' : '';
	}
	
	var card;			// объект всплывающей карточки товарной позиции с подробной информацией
	var card_photo;		// объект фотографии товара во всплывающей карточке
	var card_text;		// объект текстового поля с описанием товара во всплывающей карточке (html - с сервера !)

	function applyFilterCallback(obj){ // перерисовка миникарточек с пост-фильтрами по корзине и фаворитам
		if(obj) CATALOG_DATA = obj; else onerror("Данных не найдено", 'alert');
		initScroll(); 
		for(var i = 0; i < LIMIT; i++) Catalog.redrawCards(i, i);
		if(!CATALOG_DATA.length){
			Debug.alert('Данных не найдено !\nИзмените условия поиска и нажмите кнопку "применить"\nДля отмены действия параметра поиска - выберите пункт "все".', 'alert');
		}
	}
	
}

var Eshop = new function(){
	this.module = 'Site_Eshop';	// серверный модуль
	this.currency = 'RUR';		// текущая валюта представляения цен
	this.eid = 0;				// идентификатор текущего заказа пользователя
	
	this.init = function(mod){
		if(mod) this.module = mod;
		cart_kol = document.getElementById('cart_kol');
		cart_summ = document.getElementById('cart_summ');
		this.getFavoritesAndCart();
	}
	
	this.getFavoritesAndCart = function(){ // извлечение списка фаворитов, корзины и курсов валют из сессии юзера
		RIA.query(this.module, 'getFavoritesAndCart', null, getFavoritesAndCartCallback, onerror, true);
	}
	this.changeFavorite = function(mark, i){ // добавление/удаление товара в списке фаворитов
		mark.className = (mark.className == 'infavor') ? 'favor' : 'infavor';
		var q = { id:CATALOG_DATA[Catalog.getItem(i, true)].id };
		delAlerts(); RIA.query(this.module, 'changeFavorite', q, changeFavoriteCallback, onerror, true, true);
	}
	this.setMarkers = function(i, id){ // расставляет маркеры наличия в фаворитах и в заказе, можно перекрыть
		document.getElementById('favor_' + i).className = (FAVORS[id]) ? 'infavor' : 'favor';
		var inp = document.getElementById('cart_' + i);
		if(CART[id] && CART[id].kol){
			inp.className = 'incart'; inp.value = CART[id].kol;
		} else {
			inp.className = 'cart'; inp.value = 0;
		}
	}
	this.updateCart = function(input, i){ // добавление/изменение/удаление позиции в заказе
		var kol = parseFloat(input.value.replace(',', '.'));
		if(kol < 0){ alert('Количество - это число, большее или равное нулю !'); return false; }
		var crd = CATALOG_DATA[Catalog.getItem(i, true)];
		var rq = { id:crd.id, kol:kol, price:crd.price, currency:Currency.name, tag:"", name:crd.title, measure:crd.m||'шт.' };
//		try{ rq.name = document.getElementById('hint_' + i).innerHTML; }catch(e){}
		RIA.query(this.module, 'updateCart', rq, updateCartCallback, onerror, false, true);
		input.className = 'incart';
	}
	// внешний интерфейс для каталога
	this.isInFavor = function(id){ return (FAVORS[id]) ? true : false; }
	this.isInCart = function(id){ 
		return ((CART[id] && CART[id].kol && CART[id].kol != '0')) ? true : false;
	}

	function getFavoritesAndCartCallback(params){ 
		if(params){
			Eshop.eid = params.eid || 0; FAVORS = params.favors || {}; CART = params.cart || {}; 
			showCartInfo(); // пересчитываем информер корзины
			var mmc = Catalog.getMinicards().length;
			for(var i = 0; i < mmc; i++) Eshop.setMarkers(i, CATALOG_DATA[i].id); 
		} 
	}
	function changeFavoriteCallback(id){ // обработчик добавления/удаления фаворитов
		if(id) FAVORS[id] = (FAVORS[id]) ? null : id;
	}
	function updateCartCallback(obj){ // обработчик операции в корзине
		try	{
			if(obj && obj.id){
				if(!CART[obj.id]) CART[obj.id] = {};
				CART[obj.id].kol = obj.kol; CART[obj.id].price = obj.price; CART[obj.id].currency = obj.currency;
			} showCartInfo();	
		} catch (e)	{
			alert(e)
		}
	}

	var cart_kol, cart_summ, cart_currency;
	function showCartInfo(){ // перерисовка информера корзины 
		var kol = 0; var summ = 0; 
		for(var i in CART){ 
			var fc = parseFloat(CART[i].kol); kol += fc; 
			summ += Currency.calc(CART[i].price * fc, CART[i].currency); 
		} cart_kol.innerHTML = kol; cart_summ.innerHTML = summ.toFixed(2); 
	}
	
	var FAVORS = {};	// список фваоритов как хеш id -> id
	var CART = {};		// список корзины как хеш по id предмета (количество, прайс, валюта)

}
// управление отображением в различных валютах (валютный калькулятор)
var CURRENCY_DATA = { RUR:1 };		// глобальное поле с курсами валют	
var Currency = new function(){
	
	this.name = 'RUR';	// текущая валюта представления цен

	this.init = function(val){ // задает текущую валюту
		if(val) this.name = val;
		for(var curr in CURRENCY_DATA) CURRENCY_DATA[curr] = parseFloat(CURRENCY_DATA[curr]);
		CURRENCY_DATA['RUR'] = 1;
	}
	this.calc = function(val, sour, targ){ // пересчет цены val из валюты sour в валюту targ
		return parseFloat(val) * (CURRENCY_DATA[sour] / CURRENCY_DATA[targ||Currency.name]);
	}
	this.setOrderCurrency = function(type, callback){ // фиксация валюты заказа через интерфейс Site_Eshop
		RIA.query(Eshop.module, 'SetOrderCurrency', { type:type||this.name }, callback, onerror, true);
	}

}

// управление заказами в текущей корзине
var ECart = new function(){
	this.module = 'Site_Eshop';	// серверный модуль
	this.currency = 'RUR';		// валюта представления заказа

	this.init = function(aMod){ // формирует исходные данные заказа из шаблона, считает итоги
		this.module = aMod;
			var tlist = document.getElementById('cartlist');
		try{ // если заказ пуст ...
			this.currency = tlist.getAttribute('currency') || "RUR";
		}catch(e){ return true; }
		var tlist = tlist.getElementsByTagName('TR'); 
		for(var i = 0; i < tlist.length; i++){
			if(tlist.item(i).getAttribute('item')){
				itogo += parseFloat(document.getElementById('summ_' + i).innerHTML);
				list.push(tlist.item(i));
			}
		}
		itogo_field = document.getElementById('itogo');
		itogo_field.innerHTML = itogo.toFixed(2);
	}
	this.update = function(input, i){ // изменение/удаление позиции в заказе
		var rq = { id:0, kol:parseFloat(input.value.replace(',', '.')), price:0, currency:this.currency, tag:"" };
		if(rq.id < 0){ alert('Количество - это число, большее или равное нулю !'); return false; }
		var item = input.getAttribute('item');
		rq.id = input.getAttribute('produce'); 
		rq.price = document.getElementById('price_' + item).innerHTML;
		RIA.query(this.module, 'updateCart', rq, updateCallback, onerror, false, true);
	}
	this.comment = function(id, text){ // добавление комментария к позиции заказа
		if(text) RIA.query(this.module, 'CommentCart', { comment:text||"", id:id }, dummy, onerror, false, true);
	}

	var list = [];		// список строк заказа

	var itogo = 0;		// текущая сумма заказа
	var itogo_field;	// элемент с текущей суммой
	
	function dummy(){} // заглушка асинхронности
	function updateCallback(flag){ // обработчик изменения позиции в заказе
		if(flag){
			itogo = 0;
			for(var i = 0; i < list.length; i++){ // проход по всем строкам, пересчет сумм, убиение нулевых
				var price = parseFloat(document.getElementById('price_' + i).innerHTML);
				var kol = parseFloat(document.getElementById('kol_' + i).value);
				summ = price * kol; itogo += summ;
				document.getElementById('summ_' + i).innerHTML = summ.toFixed(2);
				if(kol == 0) list[i].style.display = 'none';
			}
			itogo_field = itogo.toFixed(2);
		}
	}
}
