/**
 * Plugin for jQuery UI Dialog which gets data using AJAX
 *
 * @copyright	Copyright (c) 2010 Kukko - Marek Bukovský
 */

jQuery.extend(
{
	/**
	 * Default values (settings) for jQuery UI Dialog
	 *
	 * Additional Option for ajaxDialog: 
	 *   - loadFromUrl (SELECTOR to input hidden) or to any element with attribute value within this element
	 *   - autoReloadPrevious Bool - if more modal windows are opened do you want to reload previous window after closing this one, now also works with only one dialog window closed
	 *   - submitClassAutoClose - class of submit for autoclosing dialog after submit
	 *   - keepFlashMessage - indicates whether to keep Flash Message or not
	 *   - reloadSnippetCallback - callback function called after closing dialog (only called when there are no other dialogs opened anymore), default action is refreshSnippets signal
	 */
	ajaxDialogOptions:
	{
		autoOpen: false,
		height: 480,
		width: 640,
		modal: true,
		loadFromUrl: null,
		autoReloadPrevious: true,
		submitClassAutoClose: "ajaxDialogAutoClose",
		keepFlashMessage: false,
		reloadSnippetCallback: function()
		{
			//var loc = window.location.href + "?do=RefreshSnippets";
			//$.get(loc);
		}
	},
	/**
	 * Number of opened windows
	 */
	ajaxDialogOpenedWindows: 0,
	/**
	 * Array of URLs to opened windows
	 */
	ajaxDialogOpenedWindowsUrl: new Array(),
	/**
	 * Array of Snippet-names
	 */
	ajaxDialogOpenedWindowsSnippetNames: new Array(),
	/**
	 * Array of options for opened dialogs
	 */
	ajaxDialogOpenedWindowsOptions: new Array(),
	/**
	 * Called when there is ajax form submitted in top ajaxDialog
	 *
	 * @param Array array of data sent by PHP portal
	 */
	ajaxDialogTopFormSubmit: function(data)
	{
		if($.ajaxDialogOpenedWindows == 0)
		{
			return;
		}
		
		if(data["close"] == true)
		{
			var current_dialog = $.ajaxDialogOpenedWindowsSnippetNames[$.ajaxDialogOpenedWindowsSnippetNames.length - 1];
			$.ajaxDialogOpenedWindowsOptions[$.ajaxDialogOpenedWindowsSnippetNames.length - 1]["keepFlashMessage"] = true;
			$("div#" + current_dialog).dialog('close');
		}
	}
});

jQuery.fn.extend(
{
	/**
	 * Register jQuery UI Dialog with AJAX data loading on click
	 *
	 * @param String snippet name
	 * @param JSON Object of options for Dialog
	 */
	ajaxDialog: function(snippet_name, options)
	{
		var current_options;//options for this ajaxDialog
		var snippet_name_div = "snippet--" + snippet_name;//"dialog_content_div"
		current_options = $.extend({}, $.ajaxDialogOptions);//copy of default options
		
		//if missing snippet name
		if(!snippet_name || snippet_name.length == 0)
		{
			return this;
		}

		//if there is not already div with snippet name
		if($("div#" + snippet_name_div).length < 1)
		{
			$("<div id='" + snippet_name_div + "' style='display:none;'></div>").appendTo("body");
		}
		
		//if there is not helpfull div for flashes
		if($("div#snippet--flashes--prefix").length < 1)
		{
			$("<div id='snippet--flashes--prefix'></div>").insertBefore("div#snippet--flashes");
		}

		//if there are options specified in parameter, merge them with default
		if(options)
		{
			$.extend(current_options, options)
		}

		snippet_name = "snippet--" + snippet_name;

		//stores URL for each element in selector
		if(current_options['loadFromUrl'])
		{
			this.each(function()
			{
				$.data(document.body, $(this).elementFullPath(), current_options['loadFromUrl']);
			});
			
			current_options['loadFromUrl'] = null;
		}
		
		//registers click event for this element
		this.live("click", function()
		{
			var load_data_from;//contains url from which are data loaded
			var id = "";
			var dialog_content_div_name;
			var content_div;
			var snippet_flashes;
			var nearest_dialog;
			var all_dialogs;
			
			//sets URL to load from according options
			if((load_data_from = $.data(document.body, $(this).elementFullPath())) == null)
			{
				load_data_from = this.href;
			}
			else
			{
				load_data_from = $(this).find(load_data_from).attr("value");
			}
			
			//if there is more opened windows
			if($.ajaxDialogOpenedWindows > 0)
			{
				id = $.ajaxDialogOpenedWindows + 1;
				
				//if there is no div with specific snippet name
				if($("div#" + snippet_name_div).length < 1)
				{
					$("<div id='" + snippet_name_div + "' style='display:none;'></div>").appendTo("body");
				}
			}
			
			dialog_content_div_name = "div#" + snippet_name_div;
			content_div = $(dialog_content_div_name);
			
			content_div.children().remove();
			$('<div id="ajax-spinner"></div>').appendTo(content_div);
			
			//Obtains data
			$.getJSON(load_data_from, function(data)
			{
				//If there was redirect
				if(data['redirect'] != null)
				{
					var redirect = data['redirect'];
					
					//Obtains redirection data
					$.getJSON(redirect, function(data)
					{
						var html = data['snippets']['snippet--flashes'];
						$("div#snippet--flashes").html(html);
						$(dialog_content_div_name).html("");
					});
				}//else set data to dialog
				else
				{
					var html = data["snippets"][snippet_name];
					$(dialog_content_div_name).html(html);
					
					//loads onload scripts
					var on_load_scripts = data["snippets"]["snippet--onloadScripts"];
					$(on_load_scripts).appendTo("head");
					//console.log(on_load_scripts);
					
					//registers autoclose for each submit element with specified class in submitClassAutoClose
					$("input." + current_options["submitClassAutoClose"] + ":submit").live("ajaxDialogSubmitClose",function(event, cancelClosing)
					{
						if(cancelClosing)
						{
							return;
						}
						
						var current_div = $.ajaxDialogOpenedWindowsSnippetNames[$.ajaxDialogOpenedWindowsSnippetNames.length - 1];
						
						if(current_div == snippet_name_div)
						{
							current_options["keepFlashMessage"] = true;
							$("div#" + current_div).dialog('close');
						}
					});
				}
				
				//inserts created window
				$.ajaxDialogOpenedWindows++;	
				$.ajaxDialogOpenedWindowsUrl.push(load_data_from);
				$.ajaxDialogOpenedWindowsSnippetNames.push(snippet_name);
				$.ajaxDialogOpenedWindowsOptions.push(current_options);//array of arrays
			});

			content_div = $(dialog_content_div_name);
			content_div.dialog(current_options);
			content_div.dialog('open');
			
			all_dialogs = $("div:has(div.ui-dialog-titlebar)");
			nearest_dialog = $(all_dialogs.get(all_dialogs.length - 1)).find("div.ui-dialog-titlebar");
			
			snippet_flashes = $("div#snippet--flashes");
			snippet_flashes.children().detach();
			snippet_flashes.insertAfter(nearest_dialog);

			//registers before close
			$(dialog_content_div_name).bind("dialogbeforeclose", function(event, ui)
			{
				$.ajaxDialogOpenedWindows--;
				
				//if there is keeping flash messages
				if(!current_options['keepFlashMessage'])
				{
					$("div#snippet--flashes").children().detach();
				}
				
				if($.ajaxDialogOpenedWindows > 0)
				{
					var dialog_content_div_id = $.ajaxDialogOpenedWindows == 1 ? "" : $.ajaxDialogOpenedWindows;
					var snip_name = $.ajaxDialogOpenedWindowsSnippetNames[$.ajaxDialogOpenedWindowsSnippetNames.length - 2];
					
					all_dialogs = $("div:has(div.ui-dialog-titlebar)");
					nearest_dialog = $(all_dialogs.get(all_dialogs.length - 2)).find("div.ui-dialog-titlebar");
					
					if(current_options["autoReloadPrevious"])
					{
						$.getJSON($.ajaxDialogOpenedWindowsUrl[$.ajaxDialogOpenedWindowsUrl.length - 2], function(data)
						{
							var html = data["snippets"][snip_name];
							//nearest_dialog.siblings("div#dialog_content_div" + dialog_content_div_id).html(html);
							nearest_dialog.siblings("div#" + snip_name).html(html);
						});
					}
					
					$("div#snippet--flashes").insertAfter(nearest_dialog);
				}
				else
				{
					if(current_options["autoReloadPrevious"])
					{
						if($.isFunction(current_options.reloadSnippetCallback))
						{
							current_options.reloadSnippetCallback();
						}
					}
					
					$("div#snippet--flashes").insertAfter("div#snippet--flashes--prefix");
				}
				
				content_div.die("ajaxDialogSubmitClose");
				$.ajaxDialogOpenedWindowsUrl.pop();
				$.ajaxDialogOpenedWindowsSnippetNames.pop();
				$.ajaxDialogOpenedWindowsOptions.pop();
				$(this).unbind(event);
			})

			return false;
		});

		return this;
	},
	/**
	 * Gets full path of element
	 */
	elementFullPath: function(index)
	{
		var full_path = "";
		var current_index = (index == null ? 0 : index)
		var element = this.get(current_index);
		
		while(element.parentNode.nodeName != "HTML")
		{
			full_path = element.nodeName + "/" + full_path;
			element = element.parentNode;
		}
		
		full_path = "HTML/" + full_path;
		return full_path;
	}
});

