var site = {};

site.productsToCompare = new Array();

site.arraySearch = function(needle, haystack) {
	var count = haystack.length;

	for (var i = 0; i < count; i++) {
		if (haystack[i] == needle) {
			return i;
		}
	}

    return -1;
};

site.initExternalLinks = function() {
	$('A[rel="external"]').live('click', function() {
		this.target = '_blank';
	});
};

site.initExternalLinks();

site.initLightbox = function() {
	$('A.lightbox').lightBox();
};

/**
 * Не используется.
 */
site.getTabsTitles = function(group) {
	var titleObjs = $('DT.tab', group);
	var titles = new Array;

	$.each(titleObjs, function() {
		titles[titles.length] = $(this).text();
	});

	return titles;
};

site.getElementClasses = function(el) {
	var str = el.className;
	str = str.replace(/\s+/g, ' ');
	str = $.trim(str);
	var classes = str.split(' ');

	return classes;
};

site.getParamFromElementClass = function(param, el) {
	var classes = site.getElementClasses(el);
	var count   = classes.length;
	var length  = param.length;
	var item;

	for (var i = 0; i < count; i++) {
		item = classes[i];

		if (item.substr(0, length) == param && item.substr(length, 1) == '-' && item.length > length + 1) {
			return item.substr(length + 1);
			break;
		}
	}

	return false;
};

site.showTab = function(a) {
	var i  = site.getParamFromElementClass('item', a);
	var li = a.parentNode;
	var ul = li.parentNode;

	$('A', ul).removeClass('cur before-cur');

	var liPrev = li.previousSibling;

	while (liPrev) {
		$('A', liPrev).addClass('before-cur');
		liPrev = liPrev.previousSibling;
	}

	$(a).addClass('cur');
	var dd = $('DL.tabs DD.tab-item-' + i); // здесь почему-то возвращается ноль элементов.
	var dl = dd.get(0).parentNode;
	var hclass = 'tab-hidden';
	$('DD.tab', dl).addClass(hclass)
	dd.removeClass(hclass);
	return false;
};

site.generateTabsNav = function(dl) {
	var dts = $('DT.tab', dl);
	var dds = $('DD.tab', dl);

	var dlCount = dts.length;

	if (dlCount) {
		dts.addClass('tab-hidden');
		dds.addClass('tab-hidden');
		dds.eq(0).removeClass('tab-hidden');

		var ul = document.createElement('ul');
		$(ul).addClass('tabs');

		var dtCount = dts.length;

		for (var i = 0; i < dtCount; i++) {
			var li  = document.createElement('li');
			var a   = document.createElement('a');
			a.href  = '#';
			var num = site.getParamFromElementClass('tab-item', dds.get(i));
			$(a).addClass('item-' + num);
			var txt = document.createTextNode(dts.eq(i).text());

			a.appendChild(txt);
			li.appendChild(a);
			ul.appendChild(li);

			dl.parentNode.insertBefore(ul, dl);

			$(a).click(function() {
				try {
					site.showTab(this);
				}
				catch(e) {};

				return false;
			});
		}

		try {
			$('A', ul).eq(0).addClass('cur');
		}
		catch(e) {};
	}

	return ul;
};

site.initSearchTabs = function(dl) {
	var form  = $('FORM.catalog-search').eq(0);

	if (!form.length) {
		return;
	}

	var items = $('DIV.tabs H2 A', form);

	var item_1_a = items.eq(0);
	var item_2_a = items.eq(1);

	item_1_a.click(function() {
		form.removeClass('extended');
		form.get(0).elements['Extended'].value = '';

		var item_1 = $(this.parentNode);
		var item_2 = $('H2', $(this).parents('DIV').eq(0)).eq(1);

		item_1.addClass('cur item-1-cur').removeClass('item-1-before-cur');
		item_2.removeClass('cur item-2-cur').addClass('item-2-after-cur');

		return false;
	});

	item_2_a.click(function() {
		form.addClass('extended');
		form.get(0).elements['Extended'].value = 1;

		var item_2 = $(this.parentNode);
		var item_1 = $('H2', $(this).parents('DIV').eq(0)).eq(0);

		item_1.removeClass('cur item-1-cur').addClass('item-1-before-cur');
		item_2.addClass('cur item-2-cur').removeClass('item-2-after-cur');

		return false;
	});
};

site.initTabs = function() {
	var dds = $('DL.tabs DD.tab');
	var count = dds.length;

	if (count) {
		for (var i = 0; i < count; i++) {
			dds.eq(i).addClass('tab-item-' + i);
		};

		var dls = $('DL.tabs');

		$.each(dls, function() {
			site.generateTabsNav(this);
		});
	}
};

site.showProductImage = function(link) {
	var url = link.href;
	var ul  = link.parentNode.parentNode;
	var dl  = ul.parentNode.parentNode;
	var num = $(link).text();//.firstChild.nodeValue

	var picDiv = $('DD.pic DIV', dl).eq(0);
	var picImg = $('IMG', picDiv).eq(0);

	picDiv.css('background-image', 'url(' + url + ')');
	picImg.attr('src', url);

	var bigUrl = $(link).attr('data-big');

	$('A', picDiv).eq(0).attr('href', bigUrl);

	var links = $('A', ul);
	links.removeClass('cur');
	$(link).addClass('cur');

	return false;
};

site.initProductImages = function() {
	var dl = $('DL.product-images');

	$('DD.nav A', dl).click(function() {
		return site.showProductImage(this);
	});

	var heightDl = $('DL', dl).eq(0);
	var heightSpan = $('DD SPAN', heightDl).eq(0);
	var height = heightSpan.text();
	var heightPx = (height * 1.1).toFixed(0);
	heightDl.css('bottom', 29 + parseInt(heightPx) + 'px');
	var heightBr = $('SPAN.height-br', dl).eq(0);
	heightBr.css('height', heightPx + 'px');
};

/**
 * Used in postDataToUrl()
 */
site.getObjectKeysAndValues = function(data) {
	var keys   = new Array();
	var values = new Array();
	var i = 0;
	for (key in data) {
		keys[i]   = key;
		values[i] = data[key];
		i++;
	}
	return {keys: keys, values: values};
}

/**
 * data = {testName: 'testValue', oneMoreTestName: 'oneMoreTestValue', ...};
 */
site.postDataToUrl = function(url, data, wndName) {
	var frm = document.createElement('form');
	frm.action = url;
	frm.method = 'post';

	var data  = site.getObjectKeysAndValues(data);
	var count = data.keys.length;
	var inp;

	for (var i = 0; i < count; i++) {
		inp = document.createElement('input');
		inp.type  = 'hidden';
		inp.name  = data.keys[i];
		inp.value = data.values[i];
		frm.appendChild(inp);
	}

	document.getElementsByTagName('body').item(0).appendChild(frm);

	if (typeof wndName != 'undefined') {
		site.openWindow(url, wndName, 200, 100);
		frm.target = wndName;
	}

	frm.submit();

	return false;
}

site.submitDataToUrl = function(url, data, wndName) {
	var frm = document.createElement('form');
	frm.action = url;
	frm.method = 'get';

	var data  = site.getObjectKeysAndValues(data);
	var count = data.keys.length;
	var inp;

	for (var i = 0; i < count; i++) {
		inp = document.createElement('input');
		inp.type  = 'hidden';
		inp.name  = data.keys[i];
		inp.value = data.values[i];
		frm.appendChild(inp);
	}

	document.getElementsByTagName('body').item(0).appendChild(frm);

	if (typeof wndName != 'undefined') {
		if ('_blank' != wndName) {
			site.openWindow(url, wndName, 200, 100);
		}

		frm.target = wndName;
	}

	frm.submit();

	return false;
}

site.openWindow = function(url, wndName, width, height) {
	var left = (screen.availWidth - width) / 2;
	var top  = (screen.availHeight - height) / 2;
	window.open(url, wndName,'toolbar=no,scrollbars=no,directories=no,status=no,menubar=no,resizable=no,width='
	            + width + ',height=' + height + ',left=' + left + ',top=' + top);

	return false;
};

site.addToCart = function(id) {
	var url = '/add-to-cart.mhtml?Com=AddToBasket';

	var data = {
		'Count':   1,
		'GoodsID': id
	};

	site.postDataToUrl(url, data, 'cartWindow');

	return false;
};

/**
 * Запускается из нового окна, являющегося результатом отправки POST-данных
 * для добавления товара в корзину.
 * Обновляет счётчик числа товаров (DL#cart) в основном окне.
 */
site.updateCartCount = function(count, closeWindow) {
	var opener = window.opener;

	var wnd = opener
	        ? opener
	        : window;

	$('#cart DD', wnd.document).text(count);

	if (typeof closeWindow != 'undefined' && closeWindow && opener) {
		window.close();
	}
};

site.initCart = function() {
	$('.home-products .cart A, .to-cart A').click(function() {
		site.addToCart(site.getParamFromElementClass('id', this));
		return false;
	});
};

site.initAutofocus = function() {
	$('.autofocus').eq(0).focus();
};

site.addProductToCompare = function(productId) {
	var products = site.productsToCompare;

	if (-1 == $.inArray(productId, products)) {
		products[products.length] = productId;
		//site.updateCompareCounter();
	}
};

site.removeProductFromCompare = function(productId) {
	var products = site.productsToCompare;

	if (-1 != $.inArray(productId, products)) {
		var index = site.arraySearch(productId, products);

		if (index != -1) {
			products.splice(index, 1);
		}

		//site.updateCompareCounter();
	}
};

site.inArray = function(needle, haystack) {
	var count = haystack.length;

	for (var i = 0; i < count; i++) {
		if (haystack[i] == needle) {
			return true;
		}
	}

	return false;
};

site.arrayUnique = function(arr) {
	var count = arr.length;
	var arrFiltered = new Array();

	for (var i = 0; i < count; i++) {
		var item = arr[i];

		if (!site.inArray(item, arrFiltered)) {
			arrFiltered[arrFiltered.length] = item;
		}
	}

	return arrFiltered;
};

site.deleteEmptyArrayItems = function(arr) {
	var count = arr.length;

	var arrFiltered = new Array();

	for (var i = 0; i < count; i++) {
		var item = arr[i];

		if (item) {
			arrFiltered[arrFiltered.length] = item;
		}
	}

	return arrFiltered;
};

/**
 * Возвращает список идентификаторов сохранённых в куках товаров для сравнения.
 * 
 * @version 2010-03-25 В разработке.
 */
site.getCompareList = function() {
	var value = $.cookie('comparelist');
	var items;

	if (value) {
		items = value.split('a');
		items = site.deleteEmptyArrayItems(items);
		items = site.arrayUnique(items);
	}
	else {
		items = new Array;
	}
	
	return items;
};

/**
 * Сохраняет cookie, содержащую список идентификаторов выбранных для сравнения
 * товаров.
 * 
 * @version 2010-03-24 В разработке.
 */
site.saveCompareList = function() {
	/*
	var oldValue = '' + $.cookie('comparelist');
	var oldItems;

	if (oldValue.length) {
		oldItems = oldValue.indexOf('a') == -1
		         ? new Array(oldValue)
		         : oldValue.split('a');
	}
	else {
		oldItems = new Array();
	}

	oldItems = site.deleteEmptyArrayItems(oldItems);
	*/
	oldItems = site.getCompareList();

	var newItems = oldItems.concat(site.productsToCompare);
	newItems = site.arrayUnique(newItems);

	var newValue = newItems.join('a');
	$.cookie('comparelist', newValue, {expires: 180, path: '/'});
};

site.setProductCompareStatus = function(productId, status) {
	if (status) {
		site.addProductToCompare(productId);
	}
	else {
		site.removeProductFromCompare(productId);
	}
};

site.updateCompareCounter = function() {
	var ids = site.getCompareList();
	var count = ids.length;
	$('#app-1 .blk.compare DD').text(count);
};

site.initCompare = function() {
	$('INPUT[type="checkbox"][name ^= "compare-"]').click(function() {
		var productId = this.name.substr(8);
		var status = this.checked;
		site.setProductCompareStatus(productId, status);
	});

	$('#app-1 .blk.compare A, .catalog-serv-after .compare A').click(function() {
		if (site.productsToCompare.length) {
			site.saveCompareList();
			site.productsToCompare = new Array;
			site.updateCompareCounter();//2010-03-25 18:31
			return window.confirm('Товары добавлены к сравнению. Открыть страницу сравнения?');
		}

		return true;

		/*
		var data = {'GoodsIDs': site.productsToCompare.join(' ')};
		site.submitDataToUrl(this.href, data);
		*/
	});

	$('A').filter(':not([href="#"], #app-1 .blk.compare A, .catalog-serv-after .compare A)').click(function() {
		if (site.productsToCompare.length
		    && window.confirm('На текущей странице есть выбранные для сравнения товары. '
		    + 'Добавить их в список сравнения?'))
		{
			site.saveCompareList();
		}
	});

	site.updateCompareCounter();
};

site.initCompareInGroup = function() {
	var blocks = $('FORM.compare-blk');

	blocks.submit(function() {
		try {
			var inputs = $('INPUT[type="checkbox"]', this);

			var ids = new Array();

			$.each(inputs, function() {
				if (this.checked) {
					ids[ids.length] = this.name.substr(8);
				}
			});

			var data = {'GoodsIDs': ids.join(' ')};
			site.submitDataToUrl(this.action, data, '_blank');
		}
		catch(e) {};
		return false;
	});

	$('.clear INPUT', blocks).click(function() {
		var frm = this.form;
		var url = window.location.pathname;
		var data = {'ParentPart': frm.elements['ParentPart'].value};
		site.submitDataToUrl(url, data);
	});
};

site.initCompareSelectAll = function() {
	$('.catalog-serv-after .actions .select A').click(function() {
		var inputs = $('UL.catalog-items LI.compare INPUT');

		$.each(inputs, function() {
			var productId = this.name.substr(8);
			var status = 'checked';
			this.checked = status;
			site.setProductCompareStatus(productId, status);
		})

		return false;
	});
};

site.initCheckboxesSelectAll = function(container) {
	var items = $('INPUT:checkbox', container).filter(':not(.all)');
	var count = items.length;
	var allItem = $('INPUT.all', container).eq(0);

	allItem.click(function() {
		var state = this.checked;

		$.each(items, function() {
			this.checked = state;
		});
	});

	items.click(function() {
		var curCount = $('INPUT:checkbox', container).filter(':not(.all):checked').length;

		allItem.get(0).checked = (curCount < count)
		                       ? ''
		                       : 'checked';
	});
};

site.initCatalogSearchBrandsSelectAll = function() {
	site.initCheckboxesSelectAll($('FORM.catalog-search .brands').eq(0));
};

$(document).ready(function() {
	site.initTabs();
	site.initSearchTabs();
	site.initLightbox();
	site.initProductImages();
	site.initCart();
	site.initAutofocus();
	site.initCompare();
	site.initCompareInGroup();
	site.initCompareSelectAll();
	site.initCatalogSearchBrandsSelectAll();
});
