/* Copyright (c) 2009 Alvaro A. Lima Jr http://alvarojunior.com
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Version: 0.1b (Fev 20, 2009)
 * Requires: jQuery 1.3+
 */
 
(function($) {

	$.fn.jOverlay = function(options) {
		
		var isIE6 = $.browser.msie && parseInt($.browser.version) == 6; // =(
		
		// Set Options
		var options = $.extend({}, $.fn.jOverlay.options, options);

		var html = isIE6 ? "<iframe id='jOverlayIframe'></iframe><div id='jOverlay'></div><div id='jOverlayContent'></div>"
						 : "<div id='jOverlay'></div><div id='jOverlayContent' style='opacity: .6;'></div>";

		var overlayWidth = $(window).width();
		var overlayHeight = $(document).height();
		
		$('body').prepend(html);

		$("#jOverlayContent").css({
			position: 'absolute',
			zIndex: options.zIndex + 1
		});
		
		// Element
		if ( this.is('*') ) {
			
			$('#jOverlayContent').css({
				height: this.height() + 'px',
				width: this.width() + 'px'
			}).append(
				this.fadeOut()
				.clone()
				.attr('id','jOverlayClone')
				.fadeIn()
			);
			
		}
		
		// AJAX LOAD
		if (this.is('*') && options.url) {
			
			$("#jOverlayClone").load(options.url, options.data);
			
		} else {
			
			// AJAX
			if (options.url) {
				$.ajax({
					type: options.method,
					data: options.data,
					url: options.url,
					success: function(response){

						$("#jOverlayContent").fadeOut().html(response);
						
						if (options.center) {
							$.center("#jOverlayContent");
						}
						
						$("#jOverlayContent").fadeIn();
					}
				});
				
			} else if ( !this.is('*') ) {
				$('#jOverlayContent').append("<div style='background:#FFF;'>Element not found!<br/>Press ESC!</div>");
			}
			
		}
		
		if (isIE6) {
			$('#jOverlayIframe').css({
				backgroundColor: '#FFFFFF',
				border: 'none',
				filter: 'alpha(opacity=0)', // IE
				position: 'absolute',
				top: '0px',
				left: '0px',
				zIndex: '100',
				width: overlayWidth + 'px',
				height: overlayHeight + 'px'
			}).fadeIn();
		}
		$('#jOverlay').css({
			backgroundColor : options.color,
			display: 'block',
			position: 'absolute',
			top: '0px',
			left: '0px',
			opacity : options.opacity, // Good Browser =D
			zIndex: options.zIndex,
			width: overlayWidth + 'px',
			height: overlayHeight + 'px'
		}).fadeIn();
		
		// SCROLL
		$(window).scroll(function(){
			if (options.center) {
				$.center('#jOverlayContent');
			}
		});
		
		// Window resize
		$(window).resize(function(){
			
			overlayWidth = $(window).width();
			overlayHeight = $(document).height();
			
			if (isIE6) {
				$('#jOverlayIframe').css({
					width: overlayWidth + 'px',
					height: overlayHeight + 'px'
				});
			}
			
			$('#jOverlay').css({
				width: overlayWidth + 'px',
				height: overlayHeight + 'px'
			});
			
			if (options.center) {
				$.center('#jOverlayContent');
			}
		});
		
		// ESC - Close
		$(document).keydown(function(event){
			if (event.keyCode == 27) {
				$.closeOverlay();
			}
		});
		
		if (options.center) {
			$.center('#jOverlayContent');
		}
	};
	
	$.center = function(element) {

		element = $(element);

		var elemHeight = element.height();
		var elemWidth = element.width();
		
		var winWidth = $(window).width();
		var winHeight =  $(window).height();
		var scrollLeft = $(window).scrollLeft();
		var scrollTop = $(window).scrollTop();
		
		var offLeft = (scrollLeft + Math.floor((winWidth-elemWidth)/2));
		var offTop = (scrollTop + Math.floor((winHeight-elemHeight)/2));
		
		var t = ((offTop != null && offTop > 0) ? offTop : '0')	+ 'px';
		var l = ((offLeft != null && offLeft > 0) ? offLeft : '0') + 'px';
		
		element.css({top :t , left: l, position: 'absolute'});
	};

	// Options default
	$.fn.jOverlay.options = {
		method : 'GET',
		data : '',
		url : '',
		color : '#000000',
		opacity : .6,
		zIndex : 9999,
		center : true
	};
	
	// Close
	$.closeOverlay = function() {
		$('#jOverlayClone, #jOverlayContent, #jOverlayIframe, #jOverlay').remove();
	};

})(jQuery);
