﻿/// <reference path="jquery.intellisense.js"/>
$(document).ready(function()
{
	var requestUrl = new parseUri(window.location.href);
	if (window.enableAjaxTransitions && requestUrl.anchor)
	{
		App.executeAjaxLink(requestUrl.anchor);
	}
	else
	{
		App.bind();
	}
});

var App =
{
	isIE6: ($.browser.msie && $.browser.version < 7),
	
	bind: function()
	{
		App.bindAjaxLinks();
		App.bindNav();
		App.bindVenueFinder();

		$("#OverlayPanel img").click(function()
		{
			$("#OverlayPanel, #Overlay").hide();
		});
	},

	bindNav: function()
	{
		if (App.isIE6)
		{
			$("#Nav li.NavHover").hover(function()
			{
				$(this).css("background-position", "0px 0px");
			}, function()
			{
				$(this).css("background-position", "156px 0px");
			});
		}
		else
		{
			$("#Nav li.NavHover").css(
			{
				backgroundPosition: '-156px 0px'
			}).hover(function()
			{
				$(this).stop().animate({ backgroundPosition: "0px 0px" });
			}, function()
			{
				$(this).stop().animate({ backgroundPosition: "-156px 0px" });
			});
		}
	},

	bindAjaxLinks: function()
	{
		if (window.enableAjaxTransitions)
		{
			$("a.Ajax").click(function()
			{
				App.executeAjaxLink(this.href);
				return false;
			});
		}
	},

	executeAjaxLink: function(url)
	{
		if (window.enableAjaxTransitions)
		{
			// Set overlay
			$("#WrapperOverlay").width($("#WrapperInner").width()).height($("#WrapperInner").height()).show();

			// Set dummy URL for bookmarking etc
			var parsedUrl = new parseUri(url);
			window.location.href = "#" + new parseUri(url).relative;

			// Scrape content
			url = url + (url.indexOf("?") < 0 ? "?" : "&") + "Ajax=1&T=" + new Date().valueOf();
			$.ajax(
			{
				type: "GET",
				url: url,
				dataType: "json",
				success: function(newPage)
				{
					$("#WrapperOverlay").hide();
					$("body").attr("class", newPage.bodyCssClass);
					$("#WrapperInner").html(newPage.content);
					App.setBackground(newPage.category);
					document.title = newPage.title.replace(/&amp;/, "&");
					App.bind();
				},
				error: App.ajaxError
			});
			return false;
		}
	},

	bindVenueFinder: function()
	{
		$("#VenueFinderTrigger").click(function()
		{
			$("#VenueFinderPanel").slideToggle("normal", function()
			{
			});
		});

		var setButton = function()
		{
			var configSelector = $("#VenueFinderConfiguration select");
			var searchButton = $("#VenueFinderFooter img");
			if (configSelector.val())
			{
				searchButton.removeClass("Disabled");
			}
			else
			{
				searchButton.addClass("Disabled");
			}
		};

		$("#VenueFinderType select, #VenueFinderCapacity select").change(function()
		{
			var typeSelector = $("#VenueFinderType select");
			var capacitySelector = $("#VenueFinderCapacity select");
			var configSelector = $("#VenueFinderConfiguration select");
			if (typeSelector.val() && capacitySelector.val())
			{
				var data = { eventTypeID: parseInt(typeSelector.val()), venueCapacityID: parseInt(capacitySelector.val()) };
				App.ajax("GetVenueConfigurations", data, function(configurations)
				{
					configSelector.find("option").remove("[value!='']");
					$(configurations).each(function(index)
					{
						configSelector.append("<option value=\"" + this.ID + "\">" + this.Name + "</option>")
					});
					configSelector.removeAttr("disabled");
					configSelector.removeClass("Disabled");
					setButton();
				});
			}
			else
			{
				configSelector[0].selectedIndex = 0;
				setButton();
				configSelector.attr("disabled", "disabled");
				configSelector.addClass("Disabled");
			}
		})
		$("#VenueFinderConfiguration select").change(setButton);
		$("#VenueFinderFooter img").click(function()
		{
			if (!$(this).hasClass("Disabled"))
			{
				var typeSelector = $("#VenueFinderType select");
				var capacitySelector = $("#VenueFinderCapacity select");
				var configSelector = $("#VenueFinderConfiguration select");
				window.location.href = "/Venues.aspx?EventTypeID=" + typeSelector.val() + "&CapacityID=" + capacitySelector.val() + "&ConfigurationID=" + configSelector.val();
			}
		});
	},

	setBackground: function(category, bodyCssClass)
	{
		if (!App.isIE6)
		{
			var imageUrl = "/Images/BgBody" + (category ? category : "") + ".jpg";
			var background = $("#Background");
			var backgroundFader = $("#BackgroundFader");
			backgroundFader.css("background-image", background.css("background-image")).show();
			background.css("background-image", "url(" + imageUrl + ")");
			backgroundFader.fadeOut();
		}
	},

	showModalOverlay: function(config)
	{
		if (config && config.html)
		{
			if (!config.width) config.width = 600;
			if (!config.height) config.height = 400;
			if (!config.top) config.top = ($(window).height() / 2 - 200) + "px";
			if (!config.left) config.left = ($(window).width() / 2 - 300) + "px";
			$("#OverlayContent").html(config.html);
			var pageDimensions = App.getPageDimensions();
			$("#Overlay").width(pageDimensions.width).height(pageDimensions.height).show();
			$("#OverlayPanel").width(config.width).height(config.height).css("top", config.top).css("left", config.left).show();
		}
	},

	hideModalOverlay: function()
	{
		$("#Overlay").hide();
	},

	changeHero: function(config)
	{
		$("#HeroContent").css("background-image", "url(" + config.imageUrl + ")");
		if (config.transitionBegin) config.transitionBegin();
		$("#HeroContent img.HeroImage").stop().animate({ opacity: 0 }, 1000, "linear", function()
		{
			var img = $(this);
			img.attr("src", config.imageUrl);
			if (App.isIE6)
			{
				// Because IE6 is no fun.
				window.setTimeout("$('#" + img[0].id + "').css('opacity', 1)", 50);
			}
			else
			{
				img.css("opacity", 1);
			}
		});

		// Change caption/title (if necessary)
		config.title = (config.title ? config.title : null);
		if ($("#TitleCell h2").html() != config.title || $("#CaptionCell").html() != config.caption)
		{
			$("#CaptionBarOverlay").show().css("opacity", 1);
			$("#TitleCell h2").html(config.title ? config.title : "");
			$("#CaptionCell").html(config.caption ? config.caption : "");
			$("#CaptionBarOverlay").stop().animate({ opacity: 0 }, 1000, "linear", function()
			{
				$(this).hide();
			});
		}
		if (config.transitionEnd) config.transitionEnd();
	},

	openWindow: function(url, name, width, height, resizable, scrollbars, statusbar, menubar, toolbar, location)
	{
		var win = null;
		var optionString = "";
		if (width) optionString += "width=" + width + ",";
		if (height) optionString += "height=" + height + ",";
		if (resizable) optionString += "resizable=1,";
		if (scrollbars) optionString += "scrollbars=1,";
		if (statusbar) optionString += "status=1,";
		if (menubar) optionString += "menubar=1,";
		if (toolbar) optionString += "toolbar=1,";
		if (location) optionString += "location=1,";
		if (optionString != "") optionString = optionString.substr(0, optionString.length - 1);
		win = window.open(url, name, optionString);
		win.focus();
		return win;
	},
	
	ajax: function(methodName, data, successHandler, errorHandler)
	{
		if (!data) data = {};
		if (!successHandler) successHandler = function(data, textStatus) { return true; }
		if (!errorHandler) errorHandler = App.ajaxError;
		return jQuery.ajax(
		{
			type: "POST",
			url: "/AjaxHandler.axd/" + methodName,
			contentType: "application/json; charset=utf-8",
			dataType: "json",
			processData: false,
			data: JSON.stringify(data),
			success: function(data, textStatus)
			{
				if (data.d) data = data.d;
				successHandler(data, textStatus);
			},
			error: errorHandler
		});
	},

	ajaxError: function(xhr, textStatus, errorThrown)
	{
		try
		{
			var errorJson = eval("(" + xhr.responseText + ")");
			var msg = "";
			if (errorJson.ExceptionType)
			{
				msg += errorJson.ExceptionType + "\n";
			}
			if (errorJson.Message)
			{
				msg += errorJson.Message + "\n";
			}
			if (errorJson.StackTrace)
			{
				msg += "\nStack Trace:\n" + errorJson.StackTrace;
			}
			if (msg)
			{
				alert(msg);
				return;
			}
		}
		catch (ex) { }
		alert(textStatus + "\nResponse status code: " + xhr.status);
	},

	getPageDimensions: function()
	{
		var dimensions = { width: 0, height: 0 };
		if (App.isIE6)
		{
			if (document.body.scrollHeight > document.body.offsetHeight)
			{
				dimensions.width = document.body.scrollWidth;
				dimensions.height = document.body.scrollHeight;
			}
			else
			{
				dimensions.width = document.body.offsetWidth;
				dimensions.height = document.body.offsetHeight;
			}
		}
		else
		{
			var doc = $(document);
			dimensions.width = doc.width();
			dimensions.height = doc.height();
		}
		return dimensions;
	}
};
