var alertInstance = {
	state: false,
	visible: false,
	instance: '#jquery-alert',

	init: function(){
		
		$('body').append('<div id="jquery-alert"><div class="jquery-alert-helper"></div><div class="jquery-alert-overlay"><div class="jquery-alert-container"></div></div></div>');

		alertInstance.reset();

		$(this.instance).find('.jquery-alert-helper').click(function(){
			alertInstance.hide();
		});
		
		this.state = true;
	},

	onCloseCallbacks: new Array(),

	onClose: function(callback){
		for (var i=0; i<this.onCloseCallbacks; i++)
		{
			if (this.onCloseCallbacks[i] === callback)
			{
				return this;
			}
		}
		
		this.onCloseCallbacks.push(callback);
		return this;
	},

	reset: function(){
		this.visible = false;
		$('.flashcontainer *').css('visibility', 'visible');
		
		$(this.instance).css({
			display: 'none',
			position: 'absolute',
			top: '0',
			left: '0',
			width: '100%'
		});

		$(this.instance).find('.jquery-alert-overlay').css({
			position: 'fixed',
			top: '45%',
			left: '50%',
			width: '20px',
			height: '20px',
			padding: '10px',
			'margin-left': '-10px',
			'margin-top': '-10px',
			overflow: 'hidden'
		});

		$(this.instance).find('.jquery-alert-container').css({
			position: 'absolute'
		});

		$(this.instance).find('.jquery-alert-helper').css({
			position: 'absolute',
			width: '100%',
			bottom: '0',
			top: '0',
			left: '0',
			right: '0'
		});

		var height =  parseInt($('body').height())+20;
		if (height < $(window).height())
		{
			height = $(window).height();
		}

		$(this.instance).find('.jquery-alert-helper').css({
			height: height
		});

		$(this.instance).css({
			height: height
		});
	},

	repaint: function(callback, animate){
		var width = parseInt($(this.instance).find('.jquery-alert-container').width());
		var height = parseInt($(this.instance).find('.jquery-alert-container').height());
		var paddingX = parseInt($(this.instance).find('.jquery-alert-overlay').css('padding-left'))
					 + parseInt($(this.instance).find('.jquery-alert-overlay').css('padding-right'));

		var paddingY = parseInt($(this.instance).find('.jquery-alert-overlay').css('padding-top'))
					 + parseInt($(this.instance).find('.jquery-alert-overlay').css('padding-bottom'));

		if (animate)
		{
			$(this.instance).fadeIn(function(){
				$(alertInstance.instance).find('.jquery-alert-overlay').animate({
				'margin-top': -(paddingY/2),
				'margin-left': -(paddingX/2)
				}, 100, function(){
					$(alertInstance.instance).find('.jquery-alert-overlay').animate({
					'margin-top': -((height/2)+(paddingY/2)),
					'margin-left': -((width/2)+(paddingX/2)),
					'width': width+paddingX,
					'height': height+paddingY
					}, 500, function(){
						if (callback)
						{
							callback();
						}
					});
				});
			});
		}
		else
		{
			$(this.instance).show();
			$(alertInstance.instance).find('.jquery-alert-overlay').css({
				'margin-top': -(paddingY/2),
				'margin-left': -(paddingX/2),
				'margin-top': -((height/2)+(paddingY/2)),
				'margin-left': -((width/2)+(paddingX/2)),
				'width': width+paddingX,
				'height': height+paddingY
			});
			if (callback)
			{
				callback();
			}
		}
	},

	show: function(content, callback, animate, cssClass){
		if(!this.state)
		{
			this.init();
		}

		this.visible = true;
		this.hideFlash();
		
		$(this.instance).find('.jquery-alert-container').html(content);
		$(this.instance).addClass(cssClass);

		if (animate)
		{
			$(this.instance).fadeIn('slow', function(){
				alertInstance.repaint(true);

				if (callback)
				{
					callback();
				}
			});
		}
		else
		{
			$(this.instance).show();
			alertInstance.repaint(false);
			if (callback)
			{
				callback();
			}
		}
	},
	
	hide: function(animate){
		$(this.instance).removeClass();
		if (animate)
		{
			$(this.instance).fadeOut(function(){
				alertInstance.reset();
				for(var i=0; i<alertInstance.onCloseCallbacks.length;i++)
				{
					alertInstance.onCloseCallbacks[i]();
				}
			});
		}
		else
		{
			$(this.instance).hide();
			alertInstance.reset();
			for(var i=0; i<alertInstance.onCloseCallbacks.length;i++)
			{
				alertInstance.onCloseCallbacks[i]();
			}
		}
	},

	hideFlash: function() {
		if (this.visible)
		{
			$('.flashcontainer *').css('visibility', 'hidden');
			setTimeout(function(){ alertInstance.hideFlash(); }, 200);
		}
	}
};

jQuery.alert = function(content, callback, animate, cssClass)
{
	alertInstance.show(content, callback, animate, cssClass);
	
	return alertInstance;
};

