var _qtySetDelay = null;
var _qtySetQueue = {};

(function($) {
	$.fn.textDropShadow = function() {
		$(this).html('<span class="shadow">' + $(this).html() + '</span><span>' + $(this).html() + '</span>');
		return $(this);
	};

	$.fn.maxLength = function(maxChars) {
		return this.each(function() {
            var ignore = [8,9,13,33,34,35,36,37,38,39,40,46];
			var $me = $(this);
			$me.bind('keypress', function(e) {
				return ($me.val().length < maxChars || $.inArray(e.keyCode, ignore) !== -1);
			});
			$me.bind('keydown keyup', function() {
				if($me.val().length > maxChars) {
					$me.val($me.val().substr(0, maxChars));
				}
			});
		});
	};

	$.fn.spinEdit = function(options) {
		options = $.extend({
			minValue: 1,
			maxValue: 100,
			change: $.noop
		}, options);

		var $editor = $("<table border='0' cellpadding='0' cellspacing='0' style='border:0;border-collapse:separate;width:100%;line-height:14px;'><tr>"
			+ "<td class='unselectable spinedit-left' onselectstart='return false;'>&laquo;</td>"
			+ "<td style='width:100%;border:0;text-align:center;'></td>"
			+ "<td class='unselectable spinedit-right' onselectstart='return false;'>&raquo;</td>"
			+ "</tr></table>");

		var $leftCell = $editor.find("td:eq(0)"),
		    $midCell = $editor.find("td:eq(1)"),
		    $rightCell = $editor.find("td:eq(2)");

		$leftCell.mousedown(function() {
			var v = parseInt($midCell.html(), 10) - 1;
			if (v >= options.minValue) {
				$midCell.html(v);
				options.change($(this).closest("table").parent(), v);
			}
		});
		$rightCell.mousedown(function() {
			var v = parseInt($midCell.html(), 10) + 1;
			if (v <= options.maxValue) {
				$midCell.html(v);
				options.change($(this).closest("table").parent(), v);
			}
		});

		return this.each(function() {
			$(this).mouseenter(function() {
				var v = $(this).html();
				$midCell.html(v);
				$(this).html($editor);
			}).mouseleave(function() {
				$editor.detach();
				$(this).html($midCell.html());
			});
		});
	};
})(jQuery);

$(function() {
    attachErrorHandler();

    $.ajaxSetup({
        cache: false,
        error: function() { showErrorMessage(true) }
    });
	$('html').ajaxStart(function() { $(this).addClass('wait') })
        .ajaxStop(function() { $(this).removeClass('wait') });

	$('#secondary-nav a').each(function() { $(this).textDropShadow(); });

    attachBasketEvents();

	var $basket = $("#basket-panel");
	$("#trigger").click(function() {
		if ($basket.is(':empty')) {
			$basket.append("<div style='text-align:center;color:#D0D0D0;'><img src='/images/loading.gif'/>&nbsp;<i>Загрузка</i></div>");
			$basket.load('/cart/load', function() { attachSpinEdit() });
		}		

		if ($basket.is(':visible')) {
			$("#trigger > span").removeClass("toggled");
		} else {
			$('div.popup-panel').hide();
			$("#trigger > span").addClass("toggled");
		}
		$basket.slideToggle("fast");

		return false;
	});

	$('#basket-panel, div.add-to-basket').click(function(e) { 
		e.stopPropagation(); 
	});

	$(document).click(function() {
		if ($basket.is(':visible')) {
			$("#trigger > span").removeClass("toggled");
			$basket.fadeOut('fast');
		}

		if ($("div.popup-panel").is(':visible')) {
			$("div.popup-panel").fadeOut('fast');
		}
	});

	$("div.add-to-basket > a").click(function() {
		var $el = $(this).parent();
		var matches = $el.prop('class').match(/id(\d+)/);
		if (matches.length == 2) {
			var id = matches[1];

			if ($el.hasClass("in-basket")) {
				showButtonHint($el, "basket");
			} else if ($el.hasClass("in-wishlist")) {
			} else if ($el.hasClass("to-wishlist")) {
				showButtonHint($el, "wishlist");
			} else {
				$.getJSON("/cart/add", { id: id }, function(data) {
					if (data && data.success) {
						$el.addClass("in-basket");

						$("#trigger").fadeOut(100).fadeIn(100);

						if (!$basket.is(':empty')) {
							basketReloadContent();
						} else {
							var qty = parseInt($('#basket-total-qty').text().replace(/[^0-9]/g, ''), 10);
							$('#basket-total-qty').html("[" + (qty + 1) + "]");
						}

						if (!$basket.is(':visible')) {
							showButtonHint($el, "basket");
						}
					} else if (data.msg) {
						showMessageBox(data.msg);
					} else {
						showErrorMessage();
					}
				});
			}
		}
	});

	$("p.news > a").click(function() {
		var $pnt = $(this).parent();
		var $el = $pnt.next("div.news-content");
		if (!$el.html()) {
			$el = $("<div class='news-content'></div>");
			$el.insertAfter($pnt);

			var matches = $(this).prop('href').match(/id=(\d+)/);
			$el.load("/news.php", { id: matches[1] }, function() {
				$el.show('fast');
			});
		} else {
			$el.toggle('fast');
		}
		return false;
	});

    // Wrap in try...catch block because of undefined error in some browsers (needs investigation)
    try {
        $(".item-pic a[href], #image-gallery a[href]").colorbox({
            opacity: 0.50,
            initialWidth: 120,
            initialHeight: 120
        });
    } catch(err) {}

	document.getElementById("search").setAttribute("autocomplete", "off");
	$('#search').autocomplete({
		serviceUrl: '/autocomplete.php',
		onSelect: function(name, id) {
			$('#search-form input[name="exact"]').val(id);
			$('#search-form').submit();
		}
	});

	$('<div class="bottomtext"></div>').appendTo("body").append($("div.spoiler"));

	attachHotkeys();

    //$('#header').snowfall({ flakeCount: 75 });
});

function attachBasketEvents() {
    var $basket = $("#basket-panel");

	$basket.delegate('#basket-select-all', 'click', function() {
		var isChk = $(this).is(":checked") && $('#basket-content input[name="del_check[]"]').length > 0;
		$('#basket-content input[name="del_check[]"]').prop('checked', isChk);
		$('#basket-del-selected').prop("disabled", !isChk);
	});

	$basket.delegate('#basket-content input[name="del_check[]"]', 'click', function() {
		var chkCnt = 0,
            totalChk = 0;

		$('#basket-content input[name="del_check[]"]').each(function() {
			totalChk++;
			chkCnt += $(this).is(":checked") ? 1 : 0;
		});
		$("#basket-del-selected").prop("disabled", !chkCnt);
		$("#basket-select-all").prop("checked", totalChk == chkCnt);
	});

    $basket.delegate('#basket-del-selected', 'click' ,function() {
        var ids = [];
        $basket.find('input[name="del_check[]"]:checked').each(function() {
            ids.push($(this).val());
        });
        if(ids.length > 0) {
            var $button = $(this);
            $button.prop("disabled", true);

            $.getJSON("/cart/delete", { ids: ids }, function(data) {
                $button.prop("disabled", false);

                if (data && data.success) {
                    for (var id in ids) {
                        $('.add-to-basket.id' + ids[id]).removeClass("in-basket");
                    }
                    basketReloadContent();
                } else {
                    showErrorMessage();
                }
            });
        }
    });

    $basket.delegate('#basket-make-order', 'click', function() { loadOrderForm() });
}

function attachSpinEdit() {
    $('#basket-content tr').find("td:eq(3)").spinEdit({
        change: function(obj, qty) {
            var id = obj.parent().find('input[name="del_check[]"]').val();
            _qtySetQueue[id] = qty;

            if (_qtySetDelay) {
                clearTimeout(_qtySetDelay);
            }
            _qtySetDelay = setTimeout(function() {
                setQty(_qtySetQueue);
                _qtySetQueue = {};
            }, 1000);
        }
    });
}

function basketReloadContent() {
	$("#basket-content").load('/cart/load #basket-content tr', function() {
        attachSpinEdit();

		var items = 0;
		$("#basket-content tr").find("td:eq(3)").each(function() {
            items += parseInt($(this).html(), 10);
        });

		$('#basket-total-qty').html("[" + items + "]");
		$("#basket-make-order").prop('disabled', !items);
		$("#basket-del-selected").prop('disabled', true);
	});
}

function setQty(params) {
	$.getJSON("/cart/setQty", { params: params }, function(data) {
		if (data && data.success) {
			basketReloadContent();
		} else {
			showErrorMessage();
		}
	});
}

function checkPhone(phone) {
    return !(phone.length < 5 || phone.match(/[^0-9\(\)\+ \-]/));
}

function checkEmail(email) {
    return email.match(/^(\w+)([\-+.'][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/);
}

function validateWishlist() {
	var emailValidated = true,
        phoneValidated = true;

	var $emailObj = $("#wishlist-email"),
        email = $.trim($emailObj.val()),
        emailEmpty = email == "";

	var $phoneObj = $("#wishlist-phone"),
        phone = $.trim($phoneObj.val()),
	    phoneEmpty = phone == "";

	if (!emailEmpty && !checkEmail(email)) {
		$emailObj.addClass("invalidField");
		emailValidated = false;
	}

	if (!phoneEmpty && !checkPhone(phone)) {
		$phoneObj.addClass("invalidField");
		phoneValidated = false;
	}

	if (phoneEmpty && emailEmpty) {
		alert("Заполните хотя бы одно поле!");
	} else if (emailValidated && phoneValidated) {
		return true;
	}

	return false;
}

function validateOrder() {
	var $obj,
        $order = $("#order-panel"),
        validated = true;

	// Required not empty
	$obj = $order.find('input[name="order[fio]"]');
	if (!$.trim($obj.val()).length) {
		$obj.addClass("invalidField");
		validated = false;
	}

	$obj = $('input[name="order[tel]"]');
	if (!checkPhone($.trim($obj.val()))) {
		$obj.addClass("invalidField");
		validated = false;
	}

	$obj = $('input[name="order[address]"]');
	if (!$.trim($obj.val()).length && $('select[name="order[delivery_type]"]').val() == 1) {
		$obj.addClass("invalidField");
		validated = false;
	}

	// Optional
	$obj = $('input[name="order[email]"]');
	if ($.trim($obj.val()).length > 0 && !checkEmail($.trim($obj.val()))) {
		$obj.addClass("invalidField");
		validated = false;
	}

	return validated;
}

function loadOrderForm() {
	$.get('/cart/loadOrder', function(data) {
		if ($("#basket-panel").is(':visible')) {
			$('#trigger').click();
		}

		showDialog(data, false);
        
		var $order = $("#order-panel");

		$order.find(".required").each(function() {
			$(this).html("<span style='color:red;font-size:1em;float:none;'>*</span>&nbsp;" + $(this).html());
		});

		$order.find('textarea[name="order[comments]"]').maxLength(1000);
		$order.find('select[name="order[delivery_type]"]').change(function() {
			if ($(this).val() == 2) {
				$("#delivery-address").hide();
			} else {
				$("#delivery-address").show();
			}
		});
		$order.find('select[name="order[delivery_type]"]').trigger("change");
		$order.find('select[name="order[pay_type]"]').change(function() {
			if ($(this).val() == 2) {
				$("#pay-type-noncash-info").show();
			} else {
				$("#pay-type-noncash-info").hide();
			}
		});
		$order.find('select[name="order[pay_type]"]').trigger("change");

        $order.submit(function(e) {
            e.preventDefault();

            $order.find('*[name*="order"]').removeClass("invalidField");
            if (!validateOrder()) {
                return false;
            }

            $order.find(':submit, :button').prop('disabled', true);
            
            $.post($order.prop('action'), $order.serialize(), function(data) {
                if (data && data.success) {
                    window.location = '/order';
                } else {
                    for (var n in data.errors) {
                        $order.find('*[name*="' + data.errors[n] + '"]').addClass("invalidField");
                    }
                }
            }, 'json')
                .complete(function() {
                    $order.find(':submit, :button').prop('disabled', false);
                });
        });
	});
}

function attachHotkeys() {
    $(document.documentElement).bind('keydown', function(event) {
        if (event.ctrlKey) {
            var href;
            switch (event.keyCode) {
				case 0x27:
                    event.preventDefault();
					href = $('#link-next-page').attr('href');
					break;
				case 0x25:
                    event.preventDefault();
					href = $('#link-prev-page').attr('href');
					break;
			}
            if (href) {
                $(document.documentElement).unbind('keydown');
                window.location = href;
            }
        }
    });
}

function attachErrorHandler() {
    window.onerror = function(msg, url, line) {
        // Workaround for 'Script error' that is caused by browsers addons.
        if (url != '') {
            $.post('/logerror.php', { 'error[]': [ msg, url, line ] });
        }
    };
}

function showButtonHint(el, type) {
	if ($("#basket-panel").is(':visible')) {
		$("#trigger > span").removeClass("toggled");
		$("#basket-panel").fadeOut('fast');
	}

	$('div.popup-panel').hide();
	var $t = $('div.popup-panel.' + type);
	if (!$t.size()) {
		if (type == "basket") {
			$t = $('<div class="popup-panel basket">'
				+ '<a class="pseudolink" href="javascript:showBasket(true)">Перейти в корзину</a><br/>'
				+ '<a class="pseudolink" href="javascript:loadOrderForm()">Оформить заказ</a><br/>'
				+ '<a class="pseudolink" href="javascript:void(0)">Продолжить покупку</a>'
				+ '<div class="arrow-border"></div><div class="arrow"></div>'
				+ '</div>');
            $t.children('a').click(function() { $t.fadeOut('fast'); });
		} else if (type == "wishlist") {
			$t = $('<div class="popup-panel wishlist">'
				+ '<p>Введите E-Mail или телефон:</p>'
				+ '<label for="wishlist-email">E-Mail:</label>'
				+ '<input type="text" id="wishlist-email" maxlength="60"/><br/>'
				+ '<label for="wishlist-phone">Тел.:</label>'
				+ '<input type="text" id="wishlist-phone" maxlength="13"/><br/>'
				+ '<a id="add-to-wishlist" class="pseudolink" href="javascript:void(0)">Уведомить</a><br/>'
				+ '<div class="arrow-border"></div><div class="arrow"></div>'
				+ '</div>');
			$t.children("input").cookieBind();

			$t.children("#add-to-wishlist").click(function(e) {
                $t.children("input").removeClass("invalidField");
                if (!validateWishlist()) {
                    return false;
                }

				var $el = $(this).parents("div.add-to-basket"),
				    matches = $el.prop('class').match(/id(\d+)/);
				if (matches.length == 2) {
					$.post('/cart/addWishlist', { id: matches[1], email: $("#wishlist-email").val(), phone: $("#wishlist-phone").val() }, function(data) {
						if (data && data.success) {
                            $t.fadeOut('fast');
							$el.addClass("in-wishlist");
							showMessageBox("Товар успешно добавлен в список ожидания, как только он будет доступен к заказу, Вы получите уведомление на указанный e-mail.");
						} else {
                            for (var n in data.errors) {
                                $t.find('#' + data.errors[n]).addClass("invalidField");
                            }
                        }
					}, 'json');
				}
			});
		}
	}

	$t.detach().appendTo(el);
	$t.css('top', -($t.innerHeight() - el.innerHeight()) / 2);
	$t.fadeIn('fast');
}

function showBasket(scrl) {
	if (scrl) {	$(this).scrollTop(0); }
	$('#trigger').click();
}

function showDialog(tpl, overlayClose) {
	$.modal(tpl, {
		overlayClose: overlayClose == undefined ? true : overlayClose,
		onOpen: function (dialog) {
			dialog.overlay.fadeIn('fast', function () {
				dialog.data.hide();
				dialog.container.fadeIn('fast', function () {
					dialog.data.slideDown('fast');
				});
			});
		},
		onShow: function(dialog) {
			dialog.container.css('height', 'auto'); 
		}
	});
}

function showMessageBox(msg) {
	var tpl = '<p style="width: 300px;">' + msg + '</p>'
		+ '<input class="simplemodal-close" type="button" value="Закрыть"/>';
	showDialog(tpl);
}

function showErrorMessage(isAlert) {
    var msg = "Произошла ошибка при обращении к серверу.\nПожалуйста, повторите операцию позже.";
    if (isAlert) {
        alert(msg);
    } else {
	    showMessageBox(msg);
    }
}
