/*
 * Extends jQueryUI Dialog
 * Loads IFRAME inside dialog
 * Loads AJAX inside dialog
 * Extra methods
 */

(function($, undefined) {
	var preloadDefaults = {
		method : 'ajax',
		url : '',
		open : false,
		width : 300,
		height : 'auto',
		draggable : false,
		resizable : false,
		modal : false,
		event_trigger : 'click',
		preload_message : 'Carregando',
		preload_opts : {
			title : 'Por favor, aguarde...',
			resizable : false,
			draggable : false
		}
	},
	extendDefaults = {
		create : false,
		open : false,
		close : false,
		noTitle : false,
		sticky : false,
		noClose : false,
		closeOnEsc : true
	},
	preloadOpen,
	preloadInit,
	$preload,
	$preloadText;
	
	$.preloadDialog = $.fn.preloadDialog = function(options) {
		var $this = this, $holder, autoOpen;
		
		if (!$this[0] && $this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.
			return $this;
		}
		
		options = $.extend(preloadDefaults, options || {});
		
		if ( options.method !== 'ajax' && options.method !== 'iframe' ) {
			throw "Preload Dialog - Invalid method";
		}		
		
		if (!$this[0] || $this.selector === undefined) { // detects $.colorbox() and $.fn.colorbox()
			$this = $("<a />");
			options.open = true; // assume an immediate open
		}
		
		options.holder = $('<div style="display: none;"></div>').appendTo("body");
		
		if ( options.method === 'iframe' ) {
			$('<iframe frameborder="0"></iframe>')
				.css({ width : options.width, height : options.height })
				.appendTo(options.holder);
		}
		
		if ( options.open ) {
			preloadOpen.call($this, options);
		} else {
			$this.bind(options.event_trigger,function(ev) { ev.preventDefault(); preloadOpen.call($this, options); });
		}
		
		$this.data('dialogHolder', options.holder);	
		
		return $this;
	};
	
	preloadOpen = function(options) {
		var $caller = $(this), 
			$holder = options.holder,
			preloadOpts = options.preload_opts,
			url = options.url;

		preloadOpts.autoOpen = true;
		preloadOpts.modal = options.modal;

		options.autoOpen = true;
		
		$preloadText = options.preload_message;
		$preload.dialog(preloadOpts);
		
		if ( $.isFunction(url) ) {
			url = url.call($caller);
		}
		
		if ( options.method === 'ajax' ) {
			$holder.load(url, null, function(data) {
				$preload.dialog('close');
				$holder.dialogExt(options).show();
			});
		} else {
			$holder.children().attr('src', url);

			$holder.children().load(function() {
				// Sets auto width/height to adjust to iframe
				$preload.dialog('close');
				$holder.dialogExt($.extend(options, { width : 'auto', height : 'auto' })).show();
			});			
		}
	};
	
	preloadInit = function() {
		$preload = $('<div id="dlg_preload"><div id="dlg_preload_text"></div></div>').hide().appendTo("body");
		$preloadText = $preload.children();
	};
	
	$(preloadInit);
	
	// Dialog Extensions
	
	$.fn.dialogExt = function(options) {
		var $this = this;
		
		if (!$this[0] && $this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.
			return $this;
		}
		
		options = $.extend(extendDefaults, options);
		
		var createCallback = options.create,
			openCallback = options.open,
			closeCallback = options.close;
		
		options.create = function(e,ui) {
			var $dlg = $(this).dialog('widget');
			
			if ( options.noTitle === true && options.noClose == true ) {
				$dlg.children(".ui-dialog-titlebar").remove();
			} else if ( options.noTitle === true ) {
				$dlg.children(".ui-dialog-titlebar")
						.removeClass("ui-widget-header").removeClass("ui-corner-all")
					.children(".ui-dialog-title").remove();
			} else if ( options.noClose === true ) {
				$dlg.children(".ui-dialog-titlebar-close").remove();
			}
			
			if ( options.sticky === true ) {
				$dlg.css('position','fixed');
			}
						
			if ( $.isFunction(createCallback) ) {
				createCallback.call(this);
			}
		};
		
		options.open = function() {
			var $dlg = $(this).dialog('widget');
			
			if ( options.closeOnEsc === true ) {
				/*$(document).bind('keydown.dialogExt',function(e) {
					
				});*/
			}
		
			if ( $.isFunction(openCallback) ) {
				openCallback.call(this);
			}
		};
		
		options.close = function() {
			var $dlg = $(this).dialog('widget');
			
			if ( $.isFunction(closeCallback) ) {
				closeCallback.call(this);
			}
		};		
		
		return $this.dialog(options);
	};

}(jQuery));
