﻿/// <reference path="firebug.js" />
/// <reference path="jquery-1.3.2-vsdoc.js" />
/// <reference path="jquery.metadata.js" />
/// <reference path="jquery.form.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.mousewheel-vsdoc.js" />
/// <reference path="additional-methods.js" />
/// <reference path="modal.js" />

// Preamble
//#region
$.ajaxSetup({ cache: false });

var c_outerOffset = 116;
var c_mainOffset = 24;

var preventDefault = function(evt) { evt.preventDefault(); };

var urlEncode = function(str) {
	return escape(str).replace(/\+/g, "%2B").replace(/%20/g, "+").replace(/\*/g, "%2A").replace(/\//g, "%2F").replace(/@/g, "%40");
};

var urlDecode = function(str) {
	return unescape(str.replace(/\+/g, " "));
};
//#endregion

// Event Handlers
//#region
var bar_mousedown = function(evt) {
	evt.preventDefault();

	var $bar = $(this);

	var clientY = evt.clientY;
	var barTop = $bar.position().top;

	var startingPosition = clientY - barTop;

	$bar
		.data("down", startingPosition)
		.addClass("selected");

	$(document)
		.mousemove(document_mousemove)
		.one("mouseup", document_mouseup)
		.data("bar", $bar);
};

var document_mouseup = function(evt) {
	var $bar = $(document).data("bar");
	if ($bar == null)
		return;
		
	$bar
		.removeClass("selected")
		.data("down", false);

	$(document)
		.unbind("mousemove", document_mousemove);
};

var document_mousemove = function(evt) {
	var $bar = $(document).data("bar");
	if ($bar == null)
		return;

	var $track = $bar.parent();
	var $container = $track.parent();
	var $overflow = $container.find(".scroll-overflow:first");

	var startingPosition = $bar.data("down");
	var clientY = evt.clientY;
	var trackHeight = $track.height();
	var barHeight = $bar.height();
	var totalHeight = $overflow[0].scrollHeight;
	var visibleHeight = $overflow.height();

	var trackDiff = trackHeight - barHeight;

	if (startingPosition) {
		var position = clientY - startingPosition;
		position = position > trackDiff ? trackDiff : position < 0 ? 0 : position;

		var infoTop = ((position / trackDiff) * (totalHeight - visibleHeight));
		$overflow.scrollTop(infoTop);

		$bar.css({ top: position });
	}
};

var overflow_mousewheel = function(evt, delta) {
	var $overflow = $(this);
	var $track = $overflow.parent().find(".scroll-track");
	var $bar = $overflow.parent().find(".scroll-bar");

	var trackHeight = $track.height();
	var barHeight = $bar.height();
	var trackDiff = trackHeight - barHeight;

	var totalHeight = $overflow[0].scrollHeight;
	var visibleHeight = $overflow.height();
	var wrapperOffset = totalHeight - visibleHeight;

	var scrollTop = $overflow.scrollTop();
	var calcTop = delta > 0 ? scrollTop - 20 : scrollTop + 20;
	var newTop = $overflow.scrollTop(calcTop).scrollTop();
	newTop = (newTop / wrapperOffset) * trackDiff;

	if (isFinite(newTop) && !isNaN(newTop))
		$bar.css({ top: newTop });
};
//#endregion

// Binders
//#region
var bindRegistrationForm = function() {
	$("#modal .registration-form").validate({
		submitHandler: function(form) {
			$(form).ajaxSubmit({
				target: "#modal",
				success: bindRegistrationForm
			});
		}
	});
};

var bindBasicForms = function () {
	$("#modal .basic-form").validate({
		submitHandler: function (form) {
			$(form).ajaxSubmit({
				target: "#modal",
				success: function (response, textStatus, xhr, callee) {
					if (response == "ok") {
						if (callee.hasClass("password-form"))
							$(".licensee-details-container").load("/Licensee.ic/LicenseeDetails/?keepItFresh=" + new Date().getTime(), function () { bindModalLinks(".licensee-details-container"); });
						else if (callee.hasClass("venue-class-form"))
							$(".licensee-venues-container").load("/Licensee.ic/LicenseeVenues/?keepItFresh=" + new Date().getTime(), function () { bindModalLinks(".licensee-venues-container"); });
						else if (callee.hasClass("royalty-payment-form"))
							$(".licensee-royalty-container").load("/Licensee.ic/ListRoyaltyPayments/?keepItFresh=" + new Date().getTime(), function () { bindModalLinks(".licensee-royalty-container"); });

						$.modalClose();

					}
					else if (response == "logoff")
						window.location.assign("/Licensee.ic/Login");
					else bindBasicForms();
				}
			});
		}
	});

	$("#royaltyOption").trigger("change");
};

var bindAddProductForm = function() {
	$("#modal .add-product-form")
		.append("<span class=\"product-added\">PRODUCT ADDED</span>")
		.validate({
			submitHandler: function(form) {
				$(form).ajaxSubmit({
					success: function(result) {
						var message = "PRODUCT ADDED";
						if (result != true)
							message = "An error occured.";

						$(".product-added")
								.text(message)
								.css({ display: "inline" });

						$(".shopping-bag-module")
								.parent()
									.load(_ep);
					}
				});
			}
		});
};

var bindDeliveryDropDowns = function() {
	$(".delivery-details .js-replace").css({ display: "none" });
	$(".delivery-details select").change(function(evt) {
		$(".delivery-details form").ajaxSubmit({
			success: bindDeliveryDropDowns,
			target: ".delivery-details"
		});
	});
};

var bindBillingDropDowns = function() {
	$(".billing-details .js-replace").css({ display: "none" });
	$(".billing-details select").change(function(evt) {
		$(".payment-form").ajaxSubmit({
			success: bindBillingDropDowns,
			target: ".billing-details"
		});
	});
};

var bindShoppingBag = function() {
	$(".shopping-bag .js-replace").css({ display: "none" });

	$("#PostageLocation").change(function(evt) {
		$(".shopping-bag form").ajaxSubmit({
			success: bindShoppingBag,
			target: ".shopping-bag"
		});
	});

	$(".shopping-bag form").validate({
		submitHandler: function(form) {
			$(form).ajaxSubmit({
				success: bindShoppingBag,
				target: ".shopping-bag"
			});
		}
	});
};

var bindResize = function() {
	var timeout = "resize_timeout";
	var $window = $(window);

	if ($.browser.msie && $.browser.version < 7) {
		$window.resize(function() {
			if (!$window.data(timeout)) {
				$window.data(timeout, setTimeout(function() {
					var $checkout = $(".checkout-process");
					if ($checkout.length > 0)
						$checkout.width($(document).width() - 500);

					$window.data(timeout, false);
				}, 500));
			}
		});
		return;
	}

	var resize = function() {
		if (!$window.data(timeout)) {
			$window.data(timeout, setTimeout(function() {
				$("#main").height($window.height() - c_outerOffset);

				// Scroll
				$(".scroll-container").each(function() {
					var $this = $(this);

					if ($this.parents().is(".scroll-container"))
						return;

					var $overflow = $this.find(".scroll-overflow:first");
					var $track = $this.find(".scroll-track");
					var $bar = $this.find(".scroll-bar");

					var newHeight = $(window).height();
					newHeight -= c_outerOffset;

					if ($this.parent().is(".index-categories")) {
						newHeight -= c_mainOffset;
						newHeight -= $(".welcome-text").outerHeight(true);
						newHeight -= $(".index-categories-header").outerHeight(true);
					}
					else if ($this.is(".navigation-section, .context-section")) {
						newHeight -= c_mainOffset;
					}
					else if ($this.is(".product-list")) {
						newHeight -= c_mainOffset;
						newHeight -= 30;
						newHeight -= $(".product-filter").outerHeight(true);
						newHeight -= $(".product-list-header").outerHeight(true);
					}
					else if ($this.parents().is("#main")) {
						newHeight -= c_mainOffset;
					}
					else if ($this.parents().is("#modal")) {
						if ($this.is(".product-details"))
							newHeight = 155;
						else newHeight = 540;
					}

					$overflow.height(newHeight);

					$track.height(newHeight);

					var totalHeight = $overflow[0].scrollHeight;
					var visibleHeight = $overflow.height();
					var scrollTop = $overflow.scrollTop();

					var barTop = (scrollTop / totalHeight) * visibleHeight;
					barTop = isNaN(barTop) ? 0 : barTop;
					var barHeight = totalHeight != 0 ? ((visibleHeight / totalHeight) * visibleHeight) : 0;
					var barImagePosition = (barHeight / 2) - 11;
					 
					$bar.css({
						height: barHeight,
						top: barTop
					}).css('background-position', '3px ' + barImagePosition + 'px');

					var display = "none";
					var width = $this.width();
					if (barHeight < $track.height()) {
						display = "block";
						width -= 10;
					}
					else {
						$overflow.scrollTop(0);
					}

					$track.css({
						display: display
					});

					$overflow.css({
						width: width
					});
				});

				$window.data(timeout, false);
			}, 1));
		}
	};

	bindScroll();

	$("#main").css({ overflow: "hidden" });

	$window.resize(resize);
	resize();
};

var bindScroll = function() {
	$(".scroll-container").each(function() {
		var $this = $(this);

		if ($this.parents().is(".scroll-container"))
			return;

		var $overflow = $this.find(".scroll-overflow:first");

		$overflow
			.css({ "overflow": "hidden" })
			.mousewheel(overflow_mousewheel);

		if ($this.find(".scroll-track").length == 0) {
			var $track = $("<div class=\"scroll-track\"></div>")
				.appendTo($this);

			var $bar = $("<div class=\"scroll-bar\"></div>")
				.mousedown(bar_mousedown)
				.bind("dragstart", preventDefault)
				.bind("selectstart", preventDefault)
				.appendTo($track);
		}
	});
};

var bindRecentlyViewed = function() {
	$(".recently-viewed-container form")
		.each(function() {
			$(this).validate({
				submitHandler: function(form) {
					$(form).ajaxSubmit({
						target: ".recently-viewed-container",
						success: function() {
							bindModalLinks();
							bindRecentlyViewed();
						}
					});
				}
			});
		});
};

var bindModalLinks = function(scope) {
	if (!scope)
		scope = "";
	else scope += " ";

	var loadCallback = function(isReg, textStatus, url) {
		bindBasicForms();
		if (isReg) {
			bindRegistrationForm();
		}
		else {
			bindAddProductForm();
			bindRecentlyViewed();
			$.modal("#modal .modal, #modal .product-link", loadCallback);
		}

		bindScroll();
		$(window).triggerHandler("resize");

		_gaq.push(["_trackPageview", url]);
	};
	$.modal(scope + ".modal, .product-link, " + scope + " .registration-link", loadCallback);
};
//#endregion

$(document).ready(function() {
	bindModalLinks();
	bindRecentlyViewed();
	bindRegistrationForm();

	// Checkout
	bindDeliveryDropDowns();
	bindBillingDropDowns();
	bindShoppingBag();

	bindResize();

	$("a.print").click(function(evt) {
		evt.preventDefault();
		window.print();
	});

	$("a.ajax-royalty").click(function(evt) {
		evt.preventDefault();

		$(".licensee-royalty-container").load($(this).attr("href"));
	});
});