
$(document).ready(function()
	{
		$('.AJAXDialog').each(function()
			{
				new AJAXDialog(this, this.title);
			});
	});

function AJAXDialog(containerSelector, url, options)
{
	var container = $(containerSelector);
	this.url = url;
	
	var default_options = {
		show: true,
		position: 'inline',
		positionOptions: false,
		modal: false,
		draggable: false,
		showTriggerSelector: false,
		trackFieldSelector: false,
		onSubmitted: false,
		hideAfterSubmit: false,
		updateDialogs: false
	};
	
	container.hide();
	
	if (typeof options == 'undefined')
		options = default_options;
	else
	{
		for (var op in default_options)
			if (typeof options[op] == 'undefined')
				options[op] = default_options[op];
	}
	
	if (options.position != 'inline' || options.draggable)
		container.css({position: 'absolute', zIndex: '100'});
	
	if (options.show)
		load();
	
	if (options.draggable)
		container.draggable(
			{
				cursor: 'move',
				cancel: '.DragPrevent, a, p, input, textarea, button, select, option, img'
			});
	
	if (options.showTriggerSelector)
		$(options.showTriggerSelector).click(function(event)
			{
				event.preventDefault();
				load(this); 
			});
	
	this.show = show;
	function show()
	{
		if (options.modal)
		{
			var w = $(window);
			jQuery.blockUI(
				{
					message: container,
					css:
					{
						border: 'none',
						backgroundColor: 'transparent',
						textAlign: '',
						width: '',
						top: ((w.height() - container.height()) / 2) + 'px',
						left: ((w.width() - container.width()) / 2) + 'px',
						cursor: '',
						color: ''
					},
					overlayCSS:
					{  
						backgroundColor: '#000',  
						opacity: '0.3'  
					}
				});
		}
		else
		{
			if ($.browser.msie)
				container.show();
			else
				container.fadeIn();
		}
	}
	
	this.hide = hide;
	function hide()
	{
		if (options.modal)
		{
			jQuery.unblockUI({fadeOut: 0});
		}
		else
		{
			if ($.browser.msie)
				container.slideUp();
			else
				container.fadeOut();
		}
	}
	
	this.load = load;
	function load(trigger, properties, updatedOptions)
	{
		//container.load(url, properties, function(){
		
		if (updatedOptions)
			for (var op in updatedOptions)
				options[op] = updatedOptions[op];
		
		$.ajax(
			{
				type: options.type ? options.type : 'GET',
				url: url,
				cache: false,
				data: properties,
				traditional: options.traditional ? options.traditional : false,
				error: function (XMLHttpRequest, textStatus, errorThrown)
				{
					if (errorThrown)
						alert("Error: " + errorThrown.message);
				},
				success: function(html)
				{
					container.html(html);
					
					container.find('form.AJAXForm').each(function ()
					{
						prepareAJAXForm(this, options);
					});
		
					prepareContainer(container);
					
					show();
					
					if (!options.modal)
					{
						if (options.position == 'center')
						{
							var w = $(window);
							
							container.css('top', (w.scrollTop() + (w.height() - container.height()) / 2) + 'px');
							container.css('left', (w.scrollLeft() + (w.width() - container.width()) / 2) + 'px');
							
							/*
							var center = getScreenCenter();
							
							var top = parseInt(center.y - container.height() / 2);
							var left = parseInt(center.x - container.width() / 2);
							
							alert("conainer = " + container);
							alert("height = " + container[0].offsetHeight + " width = " + container[0].offsetWidth);
							alert("top = " + top + " left = " + left);
							
							container.css('top', top + 'px');
							container.css('left', left + 'px');
							*/
						}
						else if (options.position == 'trigger' && trigger)
						{
							var w = $(window);
							var t = $(trigger);
							var tp = t.position();
							var left = tp.left + (t.width() - container.width()) / 2;
							
							if (left < 0)
								left = tp.left;
							
							if (left + container.width() > w.width())
								left = w.width() - container.width();
							
							container.css('top', (tp.top + t.height()) + 'px');
							container.css('left', left + 'px');
						}
					}
				}
			});
	}
	
	function prepareContainer(container)
	{
		container.find('.CloseTrigger').each(function()
			{
				$(this).click( function() { hide(); });
			});
	}
	
	function prepareAJAXForm(form)
	{
		var form = $(form);
		form.ajaxForm(function(data)
			{
				if (options.onSubmitted)
					options.onSubmitted(data);
				
				if (!options.hideAfterSubmit)
				{
					container.html(data);
		
					prepareContainer(container);
					
					container.find('form.AJAXForm').each(function()
						{
							prepareAJAXForm(this);
						});
				}
				else
					hide();
				
				if (options.updateDialogs)
					for (var d in options.updateDialogs)
						options.updateDialogs[d].load();
			});
		
		form.submit(function()
			{
				var h = form.height();
				var w = form.width();
	
				form.height(h);
				form.width(w);
	
				form.children().hide();
	
				form.append('<div style="width: 100%; vertical-align: center; text-align: center;"><img src="/images/spinner.gif" style="margin: auto; margin-top: ' + (h / 2 - 30) + 'px;"/></div>');
			});
	}
	
}


