/**
 * @author Sergey Chikuyonok (sc@design.ru)
 * @author Stepan Reznikov (stepan@design.ru)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 */

var layout = {};

$(function () {

	/**
	 * Functions to save, read and erase cookies
	 */

	function createCookie(name, value, days) {
		var date, expires;
		if (days) {
			date = new Date();
			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
			expires = "; expires=" + date.toGMTString();
		}
		else {
			expires = "";
		}
		document.cookie = name + "=" + value + expires + "; path=/";
	}

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		var i, c;
		for (i = 0; i < ca.length; i += 1) {
			c = ca[i];
			while (c.charAt(0) === ' ') {
				c = c.substring(1, c.length);
			}
			if (c.indexOf(nameEQ) === 0) {
				return c.substring(nameEQ.length, c.length);
			}
		}
		return null;
	}

	function eraseCookie(name) {
		createCookie(name, "", -1);
	}


	/**
	 * Добавляет внутрь элемента <code>elem</code> уголки.
	 * Если <code>elem</code> не является элементом, то используется <code>this</code>
	 * 
	 * @param {Element} elem Элемент в который нужно добавить уголки
	 * @param {String} [prefix] Префикс для имен классов уголоков
	 */
	function wrapInCorners(elem, prefix) {
		elem = (elem && elem.nodeType) ? elem : this;
		var p = (typeof prefix === 'string') ? prefix + '-' : '';

		$(elem)
			.append('<ins class="' + p + 'cn ' + p + 'tl" /><ins class="' + p + 'cn ' + p + 'tr" />')
			.append('<ins class="' + p + 'cn ' + p + 'bl" /><ins class="' + p + 'cn ' + p + 'br" />');
	}

	// делаем уголки для элементов
	$('.frame').each(wrapInCorners);

	// делаем специальные уголки для корзины и табов
	$('.products_cart > li, .products_list > li, dl.tabs .button').each(function () {
		wrapInCorners(this, 'crt');
	});

	$('dl.tabs > dd').each(function () {
		wrapInCorners(this, 'tab');
	});
	
	//выносим обрамлялку наружу
	layout.wrapInCorners = wrapInCorners;


	/**
	 * Навешивает на элемент <code>elem</code> события для отслеживания ховера.
	 * Если <code>elem</code> не является элементом, то используется <code>this</code>
	 * 
	 * @param {Element} elem Элемент на который нужно навесить события
	 * @param {String} [prefix] Префикс для имен классов ховера
	 */
	function makeHover(elem, prefix) {
		elem = (elem && elem.nodeType) ? elem : this;
		var p = (typeof prefix === 'string') ? prefix + '_' : '';

		$(elem).bind('mouseover focus', function () {
			$(this).addClass(p + 'hover');
		});

		$(elem).bind('mouseout blur', function () {
			$(this).removeClass(p + 'hover');
			$(this).removeClass(p + 'down');
		});
	}

	/**
	 * Навешивает на элемент <code>elem</code> события для отслеживания нажатия.
	 * Если <code>elem</code> не является элементом, то используется <code>this</code>
	 * 
	 * @param {Element} elem Элемент на который нужно навесить события
	 * @param {String} [prefix] Префикс для имен классов нажатия
	 */
	function makeDown(elem, prefix) {
		elem = (elem && elem.nodeType) ? elem : this;
		var p = (typeof prefix === 'string') ? prefix + '_' : '';

		$(elem).mousedown(function () {
			$(this).addClass(p + 'down');
		});
		$(elem).keydown(function (event) {
			if (event.keyCode === 13) {
				$(this).addClass(p + 'down');
			}
		});

		$(elem).mouseup(function () {
			$(this).removeClass(p + 'down');
		});
		$(elem).keyup(function (event) {
			if (event.keyCode === 13) {
				$(this).removeClass(p + 'down');
			}
		});
	}

	// навешиваем ховеры и нажатия на кнопки
	$('.frame_button_1, .frame_button_2').each(function () {
		makeHover(this, 'frame_button');
		makeDown(this, 'frame_button');
	});


	/**
	 * Эмулирует поведение input type="search" как в Сафари
	 * 
	 * @param {Element} elem Поле ввода
	 * @param {String} [class_empty] Класс для пустого поля ввода
	 */
	function makePlaceholder(elem, class_empty) {
		class_empty = (typeof class_empty === 'string') ? class_empty : 'empty';

		$(elem).focus(function () {
			if (this.value === $(this).attr('placeholder')) {
				this.value = '';
			}
			$(this).removeClass(class_empty);
		});

		$(elem).blur(function () {
			if (!this.value.length) {
				this.value = $(this).attr('placeholder');
				$(this).addClass(class_empty);
			}
		});

		if (!elem.value.length) {
			$(elem).blur();
		}
	}

	// В Сафари placeholder и так работает
	if (!$.browser.safari) {
		$('input[placeholder]').each(function () {
			makePlaceholder(this);
		});
	}


	/**
	 * Баланс пользователя
	 */
	var makeUserBalance = function () {

		var balance = $('#user_balance');

		if (readCookie('balance') === 'disabled') {
			balance.addClass('disabled');
		}

		balance.find('.switcher').click(function () {
			if (balance.hasClass('disabled')) {
				balance.removeClass('disabled');
				eraseCookie('balance');
			}
			else {
				balance.addClass('disabled');
				createCookie('balance', 'disabled', 365);
			}
		});

	}();


	/**
	 * Продукты в футере
	 */
	var makeFooterProducts = function () {

		var footer = $('#footer.products_tape');
		var items = footer.find('.switch li');
		var selected_item = items.filter('.selected');
		var images = footer.find('.images');

		items.each(function () {
			var that = $(this);
			$(this).find('a').click(function () {

				if (selected_item.hasClass('framed')) {

					selected_item.removeClass('framed selected');
					selected_item.children('span').removeClass('frame frame1 r10');

					that.addClass('framed selected');
					that.children('span').addClass('frame frame1 r10');

					that.append(selected_item.children('ins'));
					that.children('span').append(selected_item.children('span').children('ins'));

				}
				else {

					selected_item.removeClass('selected');
					that.addClass('selected');
					that.append(selected_item.children('ins'));

				}

				selected_item = that;

				images.load('/footer-products/', {type: $(that).attr('product-type')});

				return false;
			});
		});

	}();
});