$(function(){
	var Overlay = function(opts){
		var obj = this;
		var defaults = {};
		this.ovl           = undefined; // the overlay node
		this.dialog_obj    = undefined; // the dialog node
		this.buttons_obj   = undefined; // the dialog buttons node
		this.inited        = false;		// wether dialog has been initialized		
		defaults.opacity       = 0.4; 		// ranges from 0 to 1, gets automatically set for IE
		defaults.effect_time   = 300;		// delay for toggling overlay
		defaults.overlay_id    = 'overlay';
		defaults.overlay_class = 'overlay';
		defaults.dialog_id     = 'dialog';
		defaults.dialog_class  = 'dialog';		
		
		// merge options with defaults
		this.opts = $.extend({}, defaults, opts);	

		this.init = function(css){
			if(obj.inited) return false;
			
			var ovl = $(document.createElement('div'));
			ovl.attr('id', obj.opts.overlay_id);
			ovl.attr('class', obj.opts.overlay_class);
			
			// sets required css properties
			ovl.css({
				opacity:				obj.opts.opacity,
				filter:                 'alpha(opacity=' + (obj.opts.opacity * 100) + ')',
				position: 				'absolute',
				display:  				'none',
				top:	  				'0px',
				left:	  				'0px',
				height:					'100%',
				'z-index':  			990
			});
			
			//if defined, set the user defined properties
			if(typeof css == 'object'){
				ovl.css(css);
			// sets some standard css properties
			}else{
				ovl.css({
					'background-color':		'#000'
				});		
			}		
			
			var adapt_dimension = function(){
				$.Overlay.ovl.css({
					width: 	  ($(window).scrollLeft() > 0? $(window).scrollLeft() + $(window).width(): $(window).width()),
					height:   ($(window).scrollTop() > 0? $(window).scrollTop() + $(window).height(): $(window).height())
				});		
			}
			
			// if window is resized then reposition the overlay box
			$(window).scroll(adapt_dimension);	
			$(window).resize(adapt_dimension);	
			
			$('body').append(ovl);
			obj.ovl = $('#' + obj.opts.overlay_id);
			obj.inited = true;
		};
		
		this.show = function(){
			if(typeof obj.ovl == 'undefined') return false;
			
			obj.ovl.css({
				width: 	  ($(window).scrollLeft() > 0? $(window).scrollLeft() + $(window).width(): $(window).width()),
				height:   ($(window).scrollTop() > 0? $(window).scrollTop() + $(window).height(): $(window).height())			
			});
			
			obj.ovl.show();
			obj.ovl.fadeIn(obj.opts.delay);
		};
		
		this.hide = function(){
			if(typeof obj.ovl == 'undefined') return false;
			
			obj.ovl.fadeOut(obj.opts.delay);
		};
		
		this.dialog = function(html, css){		
			var dialog_obj = $(document.createElement('div'));
			dialog_obj.attr('id', obj.opts.dialog_id);
			dialog_obj.attr('class', obj.opts.dialog_class);	
			dialog_obj.html(html);

			dialog_obj.css({
				position: 				'absolute',		
				'z-index':  			991,			
				opacity:				'none'
			});
			
			//if defined, set the user defined properties
			if(typeof css == 'object'){
				dialog_obj.css(css);
			}else{
				dialog_obj.css({
					'background-color':		'#fff',
					width:					'500px'
				});		
			}
			
			var buttons_obj = $(document.createElement('div'));
			buttons_obj.attr('id', obj.opts.dialog_id + '_buttons');
			buttons_obj.attr('class', obj.opts.dialog_id + '_buttons');
			dialog_obj.append(buttons_obj);
			
			obj.show();
			$('body').append(dialog_obj);				
			obj.dialog_obj  = $('#' + obj.opts.dialog_id);						
			
			//sets margins according to user-defined size and scroll
			var adapt_position = function(){
				if(typeof $.Overlay.dialog_obj == 'undefined') return false;
				var left = (($(window).width() - $.Overlay.dialog_obj.outerWidth()) / 2) + $(window).scrollLeft();
				var top  = (($(window).height() - $.Overlay.dialog_obj.outerHeight()) / 2) + $(window).scrollTop();	
				$.Overlay.dialog_obj.animate({ left: left + 'px', top: top + 'px' }, 100);
			}
			
			// if window is resized then reposition the overlay box
			adapt_position();
			$(window).scroll(adapt_position);	
			$(window).resize(adapt_position);	

			// add a click event to the close tooltip link, if any
			if($('.js_tooltip_close', obj.dialog_obj).length > 0){
				$('.js_tooltip_close').click(function(){ 
					$.Overlay.hide();
					$.Overlay.dialog_obj.remove(); 
					$.Overlay.dialog_obj = undefined;
					$.Overlay.buttons_obj = undefined;
				});
			}				
			
			obj.buttons_obj = $('#' + obj.opts.dialog_id + '_buttons');				
			obj.dialog_action('Proceed', function(){
				$.Overlay.hide();
				$.Overlay.dialog_obj.remove(); 
				$.Overlay.dialog_obj = undefined;
				$.Overlay.buttons_obj = undefined;
			});
		};
		
		this.dialog_action = function(label, fn, css){
			if(typeof label    != 'string')  label = "Undo";
			if(typeof fn       != 'function') return false;		
			var button = $(document.createElement('button'));
			button.text(label);
			if(typeof css == 'object') button.css(css);
			button.click(fn);
			obj.buttons_obj.append(button);
			return true;
		};
	};
	
	$.extend({
		// expose overlay into jquery
		Overlay: new Overlay()
	});	
	
	// auto load
	$.Overlay.init();
});
