/* Copyright (c) 2009 Alvaro A. Lima Jr http://alvarojunior.com/jquery/joverlay.html
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Version: 0.2 (Mar 18, 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 imgLoading = options.imgLoading ?
						"<img id='jOverlayLoading' src='" + options.imgLoading + "' alt='loading...' title='loading...' border='0' />"
						: "";

		var html = isIE6 ? "<iframe id='jOverlayIframe'></iframe><div id='jOverlay'></div><div id='jOverlayContent'>" + imgLoading + "</div>"
						 : "<div id='jOverlay'></div><div id='jOverlayContent'>" + imgLoading + "</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'
			}).html(
				this.hide()
					.clone()
					.attr('id','jOverlayClone')
					.show('show')
			);

		}

		// AJAX LOAD
		if (this.is('*') && options.url) {
			$("#jOverlayClone").html(imgLoading);
			$("#jOverlayClone").load(options.url, options.data);

		} else {

			// AJAX - GET or POST
			if (options.url) {

				$.ajax({
					type: options.method,
					data: options.data,
					url: options.url,
					success: function(response){

						$("#jOverlayContent").hide().html(response);

						if (options.center) {
							$.center("#jOverlayContent");
						}

						$("#jOverlayContent").show('show');
					}
				});

			} else if ( !this.is('*') ) {
				$('#jOverlayContent').html("<div style='background:#FFF;'>Element not found!<br/>Press ESC!</div>");
			}

		}

		if (isIE6) {
			$('#jOverlayIframe').css({
				backgroundColor: '#FFF',
				border: 'none',
				filter: 'alpha(opacity=0)', // IE =(
				opacity: 0, // Good Browser =D
				position: 'absolute',
				top: '0px',
				left: '0px',
				zIndex: '100',
				width: overlayWidth + 'px',
				height: overlayHeight + 'px'
			}).show();
		}

		$('#jOverlay').css({
			backgroundColor : options.color,
			display: 'block',
			position: 'absolute',
			top: '0px',
			left: '0px',
			filter : 'alpha(opacity='+ (options.opacity * 100) +')', // IE =(
			opacity : options.opacity, // Good Browser =D
			zIndex: options.zIndex,
			width: overlayWidth + 'px',
			height: overlayHeight + 'px'
		});

		// 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 : '#000',
		opacity : '0.6',
		zIndex : 9999,
		center : true,
		imgLoading : ''
	};

	// Close
	$.closeOverlay = function() {
		$('#jOverlayClone, #jOverlayContent, #jOverlayIframe, #jOverlay').remove();
	};

})(jQuery);

