;var PopupMessage = function() {
	// If the context is global, return a new object, if we don't already have a views object. (1 views only)
	if ( window == this ) {
		return window.___popupMessage ? window.___popupMessage : new PopupMessage();
	}
	
	window.___popupMessage = this;

	$(function() {
		$("<div id=\"dimmer\" title=\"Click to close\" style=\"cursor: pointer; position: absolute; left: 0; top: 0; width: 100%; background: #000; z-index:100; display:none;\"></div>")
			.appendTo('body')
			.click(function() {
				PopupMessage().hide();
			});
	});
};

PopupMessage.prototype = {
	settings: {
		emptyOnHide: false
	},
	
	set: function(settings) {
		$.extend(this.settings, settings);
	},
	
	// helper function to show a message (html) inside a 'lightbox'
	showMessage: function(message, options) {
		options = options || {};
		var $$ = $('#myMessageBoxHelper');
		if (!($$.length)) {
			$$ = $('<div id="myMessageBoxHelper" style="position: absolute; width: 100%; display: none; text-align: center; left: 0;"><div id="myMessageBox" style="margin: auto; position: relative;"></div></div>').appendTo('body');
		};
		var d = {width: '', height: ''};
		if ($.metadata) {
			var data = $(message).metadata();
			d.width = data.width || d.width;
			d.height = data.height || d.height;
		}
		$$.find(':first-child').css(d).html(message);
		this.show('myMessageBoxHelper', options.onShow, options);
	},
	
	show: function(controlID, callback, options) {
		options = options || {};
		var self = this;
		$('embed, object, select').css({ 'visibility' : 'hidden'});
		var temp = $('#' + controlID);
		if (!temp.length) return;
		else {
			this.controlID = controlID;
			this.control = temp;
		}
		if (callback) options.onShow = callback;
		if ($('#dimmer').is(':hidden')) {
			$('#dimmer').css({opacity: '0.5', zIndex: 900}).animate({opacity: 'show'}, 200, function() {
				self._show(temp, options);
			});
		} else this._show(temp, options);
		return this;
	},
	
	_show: function(control, options) {
		var self = this;
		this._setHeight();
		control.css({zIndex: 1000, position: 'absolute'}).animate({opacity: 'show'}, 200, function() {
			$(window).bind('resize.popupmessage scroll.popupmessage', window.___popupMessage._setHeight);
			$(document).bind('keyup.popupmessage', function(e) {
				var prevent = true;
				if (e.keyCode == 27) self.hide();
				else prevent = false;
				// If we don't do this, we stop the animated GIF as well
				if (prevent) e.preventDefault();
			});
			if ($.isFunction(options.onShow)) options.onShow.apply(control);
		});
		if ($.isFunction(options.onHide)) $$.one('hide.popupmessage', options.onHide);
	},
	
	hide: function(controlID) {
		$(window).add(document).unbind('.popupmessage');
		var controlID = typeof controlID == 'string' ? controlID : window.___popupMessage.controlID;
		var $$ = $('#' + controlID).trigger('hide').fadeOut();
		
		if (this.settings.emptyOnHide) {
			if ($.browser.msie) $$.find('embed,object').remove();
			$$.find(this.settings.emptyOnHide.constructor != Boolean ? this.settings.emptyOnHide : ':first-child').empty();
		}
		
		$('#dimmer').animate({opacity: 'hide'}, 300, function() {
			$('embed, object, select').css({ 'visibility' : 'visible'});
		});
		return this;
	},
	
	_setHeight: function(e) {
		var control = $('#' + window.___popupMessage.controlID);
		var $win = $(window);
		var scrolltop = $win.scrollTop();
		var location = $win.scrollTop() + ($win.height() / 2) - (control.height() / 2);
		if (location > scrolltop) control.stop(true).animate({top: location}, 'fast', 'easeout');
		else if (!e) control.animate({top: scrolltop + 10}, 'fast', 'easeout');
		$('#dimmer').height($(document).height());
	}
};