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

function AJAXDialog(containerSelector, url, options) {

	var container = $(containerSelector);
	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,
			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>');
		});
	}
	
}

