(function($) {

	var obj;
	
	function init(options) {
	
		if(!options.autoClose)
			options.autoClose = false;
		
		if(!options.prompt)
			options.prompt = {};
		
		if(!options.position)
		    options.position = "fixed";
		
		if(!options.speed)
			options.speed = 600;
		
		if(!options.zIndex)
			options.zIndex = 1000;
		
		if(!options.prompt.speed)
			options.prompt.speed = "slow";
				
		if(!options.prompt.position)
			options.prompt.position = options.position;
			
		if(!options.prompt.opacity)
			options.prompt.opacity = 1;
		
		if(!options.prompt.zIndex)
			options.prompt.zIndex = 1001;
			
		if(!options.opacity)
			options.opacity = .75;
		
		if(!options.background)	
			options.background = "#000";
		
		if(!options.height)
			options.height = "100%";
		
		if(!options.width)
			options.width = "100%"
			
		if(!options.left)
			options.left = 0;
			
		if(!options.right)
			options.right = 0;
			
		if(!options.top)
			options.top = 0;
			
		if(!options.bottom)
			options.bottom = 0;
			
		if(!options.zIndex)
			options.zIndex = "1000";
			
		if(!options.id)
			options.id = "__dimmer";
					
		if(!options.scroll)
		   	options.scroll = false;
		   				
		if(!options.timeOut)
			options.timeOut = 0;			
		
		return options;
	}
	
	$.fn.extend({
		
		center: function(options, callback) {
			
			obj = $(this);
			
			if(typeof options == "functions")
				callback = options;
			
			if(!options) var options = {};
			
			options = init(options);
						
			var window = {
				height : $(options.parent).height(),
				width : $(options.parent).width()
			}
										
			var prompt = {
				height : obj.height(),
				width : obj.width()
			}
			
			var x = (window.height - prompt.height) / 2;
			var y = (window.width - prompt.width) / 2;

			if(options.position == "fixed") {				
				
				if(x < 0) x = 0;
				if(y < 0) y = 0;
							
			} else {
				try {
					if(options.parent.css("position") == "static")
						options.parent.css("position", "relative");
				} catch(e) {}
			}
			
			x+=options.top; x+=options.bottom;
			y+=options.left; y+=options.right;
							
			obj.css({
				position: options.prompt.position,
				top:x,
				left:y,
				"z-index":options.prompt.zIndex
			});	
		
			
			return this;
		},
		
		close: function(options, callback) {
			
			if(typeof options == "function")
				callback = options;
				
			if(!options) var options = {};
			
			options = init(options);
			
			obj.fadeOut(options.prompt.speed, function() {
				$.close(options, function() {
					if(typeof callback == "function")
						callback();
				});
			});		
			
			return this;
		},
		
		dim: function(options, callback) {
			
			if(typeof options == "function")
				callback = options;
				
			if(!options) var options = {};		
			
			options = init(options);
						
			if(options.position == "absolute" && !options.parent)
				options.parent = $(this).parent();
				
			else if(options.position == "fixed" && !options.parent)
				options.parent = document.body;
			
			$.dim(options, function() {
				
				if(typeof callback == "function")
					callback();
			})
			
			return this;
		},
		
		prompt: function(options, callback) {
						
			obj = $(this);
			
			if(typeof options == "function")
				callback = options;
			
			if(!options) var options = {};
				options = init(options);
			
			if(options.position == "absolute" && !options.parent)
				options.parent = $(this).parent();
				
			else if(options.position == "fixed" && !options.parent)
				options.parent = window;
			
			obj.dim(options, function() {
				obj.center(options).fadeTo(options.prompt.speed, options.prompt.opacity, function() {
				
					if(typeof callback == "function")
						callback();
				});
			});
		},
		
		startProgress: function(src, callback) {
			obj = $(this);
			
			if(typeof options == "function")
				callback = options;
			
			if(!options) var options = {};
				options = init(options);
			
			options.parent = obj;
			options.position = "absolute";
			options.prompt.position = "absolute";
			
			var img = "<img src=\""+src+"\" alt=\"Loading...\" id=\"__loading\" />";
			
			obj.append(img);
									
			$("#__loading").center(options);
			
			if(typeof callback == "function")
				callback();
		}
	});
	
	$.extend({
		close: function(options, callback) {
			
			if(typeof options == "function")
				callback = options;
				
			if(!options) var options = {};
			
			options = init(options);
			
			if(options.scroll == false)
		    	$(document.body).css("overflow", "visible");
		    	
			var dimmer = $("#"+options.id).fadeOut(options.speed, function() {
				$("#"+options.id).remove();
				if(typeof callback == "function")
					callback();
			});		
			
			return this;
		},		
		
		dim: function(options, callback) {
		
			if(typeof options == "function")
				callback = options;
				
			if(!options) var options = {};			
			
			options = init(options);
			
			var append = options.parent;
			
			if(options.parent == window)
				append = document.body;
				
			$.dimmer(options).appendTo(append).fadeTo(options.speed, options.opacity, function() {
					
				if(typeof callback == "function")
					callback();
			});
			
			return this;
			
		},
		
		dimmer: function(options) {
			
			if(!options)
				var options = {};
			
			options = init(options);
						
			var dimmer = $("<div></div>").attr({
				id:options.id,
				speed:options.speed
			}).css({				
			    background: options.background,
			    height: options.height,
			    opacity: options.opacity,
			    position: options.position,
			    top: 0,
			    left: 0,
			    width: options.width,
			    zIndex: options.zIndex,
			    display:"none"
			});
							
			if(options.position == "absolute" && $(options.parent).css("position") == "static") {
				$(options.parent).css("position", "relative");
			}
				
		    if(options.scroll == false)
		    	$(document.body).css("overflow", "hidden");
		    	
		    if(options.autoClose == true)
		    	dimmer.attr("onClick", "$('"+obj.selector+"').close()");
			
			return dimmer;
		}
	});
	
})(jQuery);
