/* 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.5 (Abr 22, 2009)
 * Requires: jQuery 1.3+
 */

(function($) {

	var isIE6 = $.browser.msie && parseInt($.browser.version) == 6; // =(
	var jOverlayTimer = null;
	$.fn.jOverlay = function(options) {

		if (jOverlayTimer != null) {
			clearTimeout( jOverlayTimer );
		}

		// Set Options
		var options = $.extend({}, $.fn.jOverlay.options, options);

		var imgLoading = options.imgLoading ?
						"<img id='jOverlayLoading' src='" + options.imgLoading + "' />"
						: '';

		var html = imgLoading + "<div id='jOverlay'></div><div id='jOverlayContent' style='display:none;'></div>";
		html = isIE6 ? "<iframe id='jOverlayIframe'></iframe>" + html : html;

		var overlayWidth = $(window).width();
		var overlayHeight = $(document).height();
		var position = isIE6 ? 'absolute' : 'fixed';

		$('body').prepend(html);

		$('#jOverlayLoading').css({
			position: position,
			zIndex: options.zIndex + 50
		}).load(function(){
			if (options.center) {
				$.center(this);
			}
		});

		$('#jOverlayContent').css({
			position: position,
			zIndex: options.zIndex + 1
		}).show();

		// Element
		if ( this.is('*') ) {

			$('#jOverlayContent').css({
				height: this.height(),
				width: this.width()
			}).html( this.addClass('jOverlayChildren').show() ).show();

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

		// Element + AJAX LOAD
		if (this.is('*') && options.url) {

			$(this).load(options.url, options.data, function(responseText){
				
				$('#jOverlayLoading').fadeOut(600);
				
				// Execute callback
				if ($.isFunction( options.success )) {
					options.success(responseText);
				}
			});

		} else {

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

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

						$('#jOverlayLoading').fadeOut(600);

						$('#jOverlayContent').html(responseText).show();

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

						// Execute callback
						if ($.isFunction( options.success )) {
							options.success(responseText);
						}
					}
				});

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

				// Execute callback
				if ($.isFunction( options.success )){
					options.success( this.html() );
				}
			}

		}

		// "hack" for IE 6
		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: options.zIndex - 5,
				width: overlayWidth + 'px',
				height: overlayHeight + 'px'
			}).show();
		}

		// Overlay Style
		$('#jOverlay').css({
			backgroundColor : options.color,
			position: position,
			top: '0px',
			left: '0px',
			filter : 'alpha(opacity='+ (options.opacity * 100) +')', // IE =(
			opacity : options.opacity, // Good Browser =D
			zIndex: options.zIndex,
			width: overlayWidth + 'px',
			height: !isIE6 ? $(window).height() + 'px' : overlayHeight + 'px'
		}).show('fast');

		// Window scroll
		if (isIE6) {
			$(window).scroll(function(){
				if (options.center) {
					$.center('#jOverlayContent');
				}
			});
		}

		// Window resize
		$(window).resize(function(){

			var oWidth = $(window).width();
			var oHeight = $(document).height();

			if (isIE6) {
				$('#jOverlayIframe').css({
					width: oWidth + 'px',
					height: oHeight + 'px'
				});
			
			}
			
			$('#jOverlay').css({
				width: oWidth + 'px',
				height: oHeight + 'px'
			});
			
			if (options.center) {
				$.center('#jOverlayContent');
			}
		});

		// Press ESC to close
		$(document).keydown(function(event){
			if (event.keyCode == 27) {
				$.closeOverlay();
			}
		});

		// Click to close
		if (options.bgClickToClose) {
			$('#jOverlay').click($.closeOverlay);
		}

		// Timeout (auto-close)
		if (Number(options.timeout) > 0) {
			
			// time in millis to wait before auto-close
			// set to 0 to disable
			jOverlayTimer = setTimeout( $.closeOverlay, Number(options.timeout));
			
		}
	};

	$.center = function(element) {

		var 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 - scrollTop;
		var	l = offLeft - scrollLeft;

		if (isIE6) {
			t = ((offTop != null && offTop > 0) ? offTop : '0');
			l = ((offLeft != null && offLeft > 0) ? offLeft : '0');
		}

		element.css({top :t + 'px' , left: l + 'px'});
	};

	// Options default
	$.fn.jOverlay.options = {
		method : 'GET',
		data : '',
		url : '',
		color : '#000',
		opacity : '0.6',
		zIndex : 9999,
		center : true,
		imgLoading : '',
		bgClickToClose : true,
		success : null,
		timeout : 0
	};

	// Close
	$.closeOverlay = function() {
		$('#jOverlayContent .jOverlayChildren').hide().prependTo( $('body') );
		$('#jOverlayLoading, #jOverlayContent, #jOverlayIframe, #jOverlay').remove();
	};

})(jQuery);
