$(function() {
	popupHandler = pathPrefix + '/Ajax/popupPopup'
	popup.handler = popupHandler;
});

var popupHandler = null;
var popup = {
		
	// Properties
	handler: null,
	template: 	$('<div id="popupContainer">' +
			'<table cellspacing="0" cellpadding="0">' +
				'<tr>' +
					'<td class="tl" />' +
					'<td class="t" />' +
					'<td class="tr" />' +
				'</tr>' +
				'<tr>' +
					'<td class="l" />' + 
					'<td class="c">' +
						'<div id="popupContainerInner">' +
							'<form class="popupForm">' +
								'<div class="popupTitle">' +
									'<div class="popupTitleInner" />' +
								'</div>' +
								'<div class="popupContent">' +
									'<div class="popupContentInner" />' +
								'</div>' +
								'<div class="popupButtons">' +
									'<div class="popupButtonsInner" />' +
								'</div>' +
							'</form>' +
						'</div>' +
					'</td>' +
					'<td class="r" />' +
				'</tr>' +
				'<tr>' +
					'<td class="bl" />' +
					'<td class="b" />' +
					'<td class="br" />' +
				'</tr>' +
			'</table>' +
		'</div>'),
				
	// Current popup
	currentPopupType: null,
	currentPopupAction: null,
	currentPopupParams: null,
	currentPopupData: {},
		
	// Functions
	show: function(type, params)
	{
		// Check if prerequisites are loaded
		if(!$.isFunction($.fn.ajaxForm))
		{
			$.getScript("js/jquery/jquery.form.js");
		}
		
		// Check popup type
		if($.isPlainObject(type))
		{
			// Unset current popup
			popup.currentPopupType = null;
			popup.currentPopupAction = null;
			popup.currentPopupParams = {};
			
			// This is an anonymous popup, not yet implemented!
			popup.renderBackground();
			popup.render(type);
		}
		else
		{
			var action = "";
			if(type.indexOf("::") > -1)
			{
				var temp = type.split("::");
				type = temp[0];
				action = temp[1];
			}
			
			// Set current popup
			popup.currentPopupType = type;
			popup.currentPopupAction = action;
			popup.currentPopupParams = (params ? params : {});
			
			// Load popup
			popup.renderBackground();
			$.post(popup.handler, {
				params: popup.currentPopupParams,
				type: type,
				action: action
			}, popup.parseResponse, "json");
		}
		
	},
	
	parseResponse: function(data)
	{
		if(data.type == "popup")
		{
			popup.render(data.data);
		}
		else if(data.type == "reload")
		{
			window.location.reload();
		}
		else if(data.type == "redirect")
		{
			window.location.href = data.url;
		}
		else if(data.type == "javascript")
		{
			var javascript = data.data.javascript;
			var close = data.data.close;
			
			if(close)
			{
				popup.close();
			}
			
			if(javascript)
			{
				eval(javascript);
			}
		}
	},

	render:	function(data)
	{
		popup.currentPopupData = data;
		
		var container = this.template.clone(true);
		var form = container.find("form.popupForm");
		var containerTitle = form.children("div.popupTitle");
		var containerTitleInner = containerTitle.children("div.popupTitleInner");
		var containerButtons = form.find("div.popupButtonsInner");
		var containerContent = form.children("div.popupContent");
		var containerContentInner = containerContent.children("div.popupContentInner");
		
		// Popup title
		if(data.title)
		{
			containerTitleInner.html(data.title);
		}
		else
		{
			containerTitle.remove();
		}
		
		// Padding
		if(data.padding == undefined)
		{
			containerContentInner.css("padding", 10);
		}
		else
		{
			containerContentInner.css("padding", data.padding);
		}
		
		// Width
		if(data.width == undefined) 
		{
			container.width(500);
		}
		else
		{
			container.width(data.width);
		}
		
		// Popup buttons
		if($.isArray(data.buttons) && data.buttons.length > 0)
		{
			$.each(data.buttons, function() {
				
				var buttonDefinition = this;
				
				// Create button
				var button = $('<button type="button" />').html(buttonDefinition.label);
				
				// Check for JavaScript
				if(buttonDefinition.javascript)
				{
					button.click(function() {
						if($.isFunction(buttonDefinition.javascript))
						{
							buttonDefinition.javascript();
						}
						else
						{
							eval(buttonDefinition.javascript);
						}
					});
				}
				
				// Check for action
				if(buttonDefinition.action)
				{
					var type = popup.currentPopupType;
					var action = buttonDefinition.action;
					if(action.indexOf("::") > -1)
					{
						var temp = action.split("::");
						type = temp[0];
						action = temp[1];
					}
					button.click(function() {
						// Create data array
						var data = {
							type: type,
							action: action
						};
						
						// Add all values
						$.each(popup.currentPopupParams, function(key, value) {
							data["params[" + key + "]"] = value;
						});
						$.each(buttonDefinition.params, function(key, value) {
							data["params[" + key + "]"] = value;
						});
						
						// Submit the form
						// @TODO: Check if ajaxSubmit() is fixed. Did not serialize nested arrays correctly!
						$.extend(data, form.data("additionalData"));
						
						// Call submit of popup form because components like fuhHelper register to this event!
						form.submit(function() {
							return false;
						});
						form.submit();
						
						form.find("textarea, input").each(function() {
							if((this.type == "checkbox" || this.type == "radio") && !this.checked)
							{
								return;
							}
							data[this.name] = this.value;
						});
						
						$.ajax({
							url: popupHandler,
							data: data,
							dataType: "json",
							type: "POST",
							success: popup.parseResponse
						});
					});
				}
				
				// Check for close action
				if(buttonDefinition.close)
				{	
					button.click(function() {
						popup.close();
					});
				}
					
				// Append button
				containerButtons.append(button);
			});
		}
		else
		{
			form.children("div .popupButtons").remove();
		}
		
		// Show popup
		$("#popupContainer").remove();
		$("body").append(container);
		
		// Popup content
		if(data.content)
		{
			/*
			 * Since jQuery executes javascript code before elements of data.content
			 * are added to the DOM tree we have to do a dirty hack here. We extract
			 * all embedded script elements, then add the rest, then execute these
			 * scripts.
			 * 
			 * This is also the reason why this whole code block has to be executed
			 * AFTER the popup is shown!
			 * 
			 * Clean (not working) version would be this:
			 * containerContentInner.html(data.content);
			 */
			
			var contentContainer = containerContentInner[0];
			
			if($.browser.msie)
			{
				// Set with jQuery in IE
				$(contentContainer).html(data.content);
			}
			else
			{
				// Set innerHTML with native JavaScript to avoid script execution
				contentContainer.innerHTML = data.content;
				
				// Find all script tags
				var scripts = contentContainer.getElementsByTagName("script");
				
				// Execute all script tags globally
				$.each(scripts, function(i, element) {
					if(element.src)
					{
						$.ajax({
							url: element.src,
							dataType: "script",
							async: false,
							ifModified: true
						});
					}
					else
					{
						$.globalEval(element.innerHTML);
					}
				});
			}
		}
		else
		{
			containerContent.remove();
		}
		
		// Move forms to body (used by fuhHelper)
		containerContentInner.find("form").appendTo("body");
		
		// Fix popup positioning
		popup.fixPositioning();
	},
	
	fixPositioning: function()
	{
		var scroll = {
			top: 0,
			left: 0
		};
		
		if($.browser.msie && $.browser.version.substring(0, 1) == "6")
		{
			$("#popupBackground, #popupContainer").css("position", "absolute");
			// Set to scroll amount because we are using position: absolute
			scroll = {
				top: $(window).scrollTop(),
				left: $(window).scrollLeft()
			};
		}
		
		// Get window dimensions
		var windowSize = {
			width: $(window).width(),
			height: $(window).height()
		};

		// Fix background positioning
		$("#popupBackground").css(scroll).css(windowSize);
		
		var popupContainer = $("#popupContainer");
		
		if(popupContainer.length > 0)
		{
			var popupContent = popupContainer.find("div.popupContent");
			
			// Unset popup height
			popupContent.height("auto");
			
			// Get height difference
			var heightDifference = popupContainer.height() - popupContent.height();
			
			if(popup.currentPopupData.fullscreen)
			{
				popupContent.css("height", windowSize.height - 50 - heightDifference);
				popupContainer.css({
					width: windowSize.width - 50,
					top: 25 + scroll.top,
					left: 25 + scroll.left
				});
			}
			else
			{
				// Check if popup height is too big
				if(popupContent.height() > windowSize.height - 50 - heightDifference)
				{
					popupContent.height(windowSize.height - 50 - heightDifference);
				}
				
				// Get popup size
				var popupSize = {
					width: popupContainer.width(),
					height: popupContainer.height()
				};
				
				// Check if popup width is too big
				if(popupSize.width > windowSize.width - 50)
				{
					popupContainer.width(windowSize.width - 50);
				}
				
				// Calculate offsets
				var offsets = {
					top: (windowSize.height - popupSize.height) / 2 + scroll.top,
					left: (windowSize.width - popupContainer.width()) / 2 + scroll.left
				};
				popupContainer.css(offsets);
			}
		}
	},
	
	renderBackground: function()
	{
		$("body").append($('<div id="popupBackground" />').css({
			width: $(window).width() + "px",
			height: $(window).height() + "px",
			opacity: 0.5
		}));
		
		// Fix popup positioning
		popup.fixPositioning();
		
		// Attach positioning event
		$(window).bind("scroll", popup.fixPositioning).bind("resize", popup.fixPositioning);
	},
	
	close: function() 
	{
		// Unset current popup
		popup.currentPopupType = null;
		popup.currentPopupAction = null;
		popup.currentPopupParams = null;
		
		// Close the facebox
		$("#popupContainer, #popupBackground").remove();
		
		// Unbind positioning event
		$(window).unbind("scroll", popup.fixPositioning).unbind("resize", popup.fixPositioning);
	}
		
};
