(function($) {

	$.fn.sysmessage = function(message, options, callback) {
	
		var opts = $.extend({}, $.fn.sysmessage.defaults, options);
		
		return this.each(function() {
			$this = $(this);
			var o = $.metadata ? $.extend({}, opts, $this.metadata()) : opts;
			
			var contentElm = document.createElement('div');
			$(contentElm).addClass(o.baseClass);
			if(o.type) $(contentElm).addClass(o.type);
			
			var backgroundElm = document.createElement('div');
			$(backgroundElm).addClass(o.baseClass+"-bg").appendTo(contentElm);
			
			if(o.appendClose) {
				var closeElm = document.createElement('div');
				$(closeElm).append('<a href="#">Close</a>');
				$(closeElm).click(function() {
					killSysmessage($(contentElm), o.type, callback);
				});
				$(closeElm).addClass(o.baseClass+"-close").appendTo(contentElm);
				$(contentElm).hover(function() { $(closeElm).show();}, function() {$(closeElm).hide();});
				
			}
			
			var messageElm = document.createElement('div');
			var messageText = document.createTextNode(message);			
			$(messageElm).append(messageText).addClass(o.baseClass+"-message").appendTo(contentElm);
			
			var posTop;
			
			if($(document).find("."+o.baseClass).size() > 0) {
				posTop = parseInt($(document).find("."+o.baseClass+":last").css("top"),10) + parseInt($(document).find("."+o.baseClass+":last").height(),10) + o.margin;
			}
			
			$this.append(contentElm);
			/*$(contentElm).css({
				top: 	posTop ? posTop : o.position.top,
				right: 	o.position.right,
				bottom: o.position.bottom,
				left: 	o.position.left,
				opacity: 0
			}).animate({
				opacity: 1
			});*/
			$(contentElm).animate({ opacity: 1 });
			
			if(o.appendClose) {
				$(closeElm).hide();
			}
			
			var timeout = setTimeout(function() { killSysmessage($(contentElm), o.type, callback); }, o.timeout);
			
			$(contentElm).hover(function() {
				clearTimeout(timeout);
				timeout = setTimeout(function() { killSysmessage($(contentElm), o.type, callback); }, o.timeout+4000);
			}, function() {
				timeout = setTimeout(function() { killSysmessage($(contentElm), o.type, callback); }, o.timeout);
			});
			
			$('body').triggerHandler("open.sysmessage", [o.type, $(contentElm)]);
	
		});

	};
	
	function killSysmessage($obj, type, callback) {
		$obj.animate({
			opacity: 0
		}, function() {
			$(this).remove();
			$('body').triggerHandler("close.sysmessage", [type, $obj]);
		});
		
		if(callback && typeof(callback) == 'function')
			callback();
	};
	
	$.fn.sysmessage.defaults = {
		baseClass: "sysmessage",
		type:	"",
		timeout:	5000,
		pauseOnHover:	true,
		appendClose:	true,
		position: {
			top: "15px",
			right: "15px",
			bottom: "",
			left: ""
			},
		margin: -5
	};
	
	$.ax = $.ax || { };
	$.ax.sysmessageInline = function(selector) {
		$(selector).each(function() {
			var opts = $.metadata ? $(this).metadata() : {};
			$("body").sysmessage($(this).html(),opts);
		});
	};
	$.ax.sysmessageListner = function() {
		$("body").bind('error.sysmessage', function(e, message) {
			e.target.sysmessage(message, {type: 'error'});
		});
		$("body").bind('warning.sysmessage', function(e, message) {
			e.target.sysmessage(message, {type: 'warning'});	
		});
		$("body").bind('confirmation.sysmessage', function(e, message) {
			e.target.sysmessage(message, {type: 'confirmation'});
		});	
	};

}) (jQuery);