/**
 * @author: Otávio Avila
 * @version: 0.5 beta
 *
 */

(function($) {
	var openedPopups = [];
	var popupLayerSL = false;
    var focusableElement = [];

	$.openPopupLayer = function(settings) {
		if (!checkIfItExists(settings.name)) {
			settings = jQuery.extend({
				width: "auto",
				height: "auto",
				parameters: {},
                target: "",
				callback: function(){},
                onclose: function(){}
			}, settings);
   
			loadPopupLayerContent(settings, true);
   
			return this;
		}
	}
	
	$.closePopupLayer = function(name, callback) {
		if (name) {
			for (var i = 0; i < openedPopups.length; i++) {
				if (openedPopups[i].name == name) {
					$("#popupLayer_" + name).hide().remove();

                    openedPopups[i].onclose();

					openedPopups.splice(i,1);

                    hideScreenLocker();

                    focusableElement.pop();

                    if (focusableElement.length > 0)
                        $(focusableElement[focusableElement.length-1]).focus();

					if (callback)
						callback();
   
					break;
				}
			}
		} else {
			if (openedPopups.length > 0)
				$.closePopupLayer(openedPopups[openedPopups.length-1].name);
		}
		
		return this;
	}
	
	$.reloadPopupLayer = function(name) {
		if (name) {
			for (var i = 0; i < openedPopups.length; i++) {
				if (openedPopups[i].name == name) {
					
					loadPopupLayerContent(openedPopups[i], false);

					break;
				}
			}
		} else {
			if (openedPopups.length > 0)
				$.reloadPopupLayer(openedPopups[openedPopups.length-1].name);
		}
		
		return this;
	}
	
	function setSLSize() {
		if (popupLayerSL) {
			$('#popupLayerScreenLocker').width($(document).width() + "px");
			$('#popupLayerScreenLocker').height($(document).height() + "px");
		}
	}
	
	function checkIfItExists(name) {
		if (name) {
			for (var i = 0; i < openedPopups.length; i++) {
				if (openedPopups[i].name == name) {
					return true;
				}
			}
		}
		
		return false;
	}
	
	function showScreenLocker() {
		if ($("#popupLayerScreenLocker").length) {
			if (openedPopups.length == 1) {
				popupLayerSL = true;
				setSLSize();
				$('#popupLayerScreenLocker').fadeIn();
			}
   
			if ($.browser.msie && $.browser.version < 7)
				$("select").css("visibility","hidden");
   			
			$('#popupLayerScreenLocker').css("z-index",parseInt(openedPopups.length == 1 ? 999 : $("#popupLayer_" + openedPopups[openedPopups.length - 2].name).css("z-index")) + 1);
		} else {
			$("body").append("<div id='popupLayerScreenLocker'><!-- --></div>");
			$("#popupLayerScreenLocker").css({
				position: "absolute",
				background: "#123354",
				left: "0",
				top: "0",
				opacity: "0.8",
				display: "none"
			});
			showScreenLocker();

            $("#popupLayerScreenLocker").click(function(){
                $.closePopupLayer();
            });
		}
	}
	
	function hideScreenLocker() {
		if (openedPopups.length == 0) {
			screenlocker = false;
			$('#popupLayerScreenLocker').fadeOut();
		} else {
			$('#popupLayerScreenLocker').css("z-index",parseInt($("#popupLayer_" + openedPopups[openedPopups.length - 1].name).css("z-index")) - 1);
		}
   
		if ($.browser.msie && $.browser.version < 7)
				$("select").css("visibility","visible");
	}
	
	function setPopupLayersPosition(popupElement, animate) {
		if (popupElement) {
            if (popupElement.width() < $(window).width())
				var leftPosition = (document.documentElement.offsetWidth - popupElement.width()) / 2;
			else
				var leftPosition = document.documentElement.scrollLeft + 5;

			if (popupElement.height() < $(window).height())
				var topPosition = document.documentElement.scrollTop + ($(window).height() - popupElement.height()) / 2;
			else
				var topPosition = document.documentElement.scrollTop + 5;
			
			var positions = {
					left: leftPosition + "px",
					top: topPosition + "px"
				};
			
			if (!animate) {
				popupElement.css(positions);
			} else {
				popupElement.animate(positions, "slow");
			}
                        
            setSLSize();
		} else {
			for (var i = 0; i < openedPopups.length; i++) {
				setPopupLayersPosition($("#popupLayer_" + openedPopups[i].name), true);
			}
		}
	}

    function showPopupLayerContent(popupObject, newElement, data) {
        openedPopups.push(popupObject);

        if (newElement)
            showScreenLocker();

        var idElement = "popupLayer_" + popupObject.name;

        if (newElement)
            $("body").append("<div id='" + idElement + "'><!-- --></div>");

        var popupElement = $("#" + idElement);

        popupElement.css({
            visibility: "hidden",
            width: popupObject.width + "px",
            height: popupObject.height == "auto" ? "" : popupObject.height + "px",
            position: "absolute",
            "z-index": parseInt(openedPopups.length == 1 ? 1000 : $("#popupLayer_" + openedPopups[openedPopups.length - 2].name).css("z-index")) + 2
        });

        var xxx = "<a href='#' class='link-at-top' style='position:absolute; left:-9999px;'>A</a>";
        var sss = "<a href='#' class='link-at-bottom' style='position:absolute; left:-9999px;'>B</a>";

        popupElement.html(xxx + data + sss);

        $("#" + idElement + " .link-at-top, " +
          "#" + idElement + " .link-at-bottom").focus(function(){
            $(focusableElement[focusableElement.length-1]).focus();
        });

        setPopupLayersPosition(popupElement);

        popupElement.css("display","none");
        popupElement.css("visibility","visible");
        popupElement.show();

        

        $("#" + idElement + " *:visible").each(function(){
            if (!$(this).hasClass("link-at-top") && !$(this).hasClass("link-at-bottom")) {
                if (this.tagName == "A" ||
                    (this.tagName == "INPUT" && this.type == "text") ||
                    this.tagName == "SELECT" ||
                    this.tagName == "BUTTON" ||
                    this.tagName == "TEXTAREA") {
                        focusableElement.push(this);
                        return false;
                }
            }
        });


        $(focusableElement[focusableElement.length-1]).focus();

        popupObject.callback();
    }

    function isInsideThePopup(obj, idElement) {
        while (obj != document.documentElement) {
            if (obj.id == idElement)
                return true;
            
            obj = obj.parentNode;
        }

        return false;
    }
	
	function loadPopupLayerContent(popupObject, newElement) {		
		if (popupObject.target != "") {
            showPopupLayerContent(popupObject, newElement, $("#" + popupObject.target).html());
        } else {
            popupObject.parameters["_"] = Math.round(Math.random() * 100000000);

            $.ajax({
                url: popupObject.url,
                data: popupObject.parameters,
                dataType: "html",
                method: "GET",
                success: function(data) {
                    showPopupLayerContent(popupObject, newElement, data);
                }
            });
		}
	}
	
	$(window).resize(function(){
		setSLSize();
		setPopupLayersPosition();
	});
	
	$(document).keydown(function(e){
		if (e.keyCode == 27) {
			$.closePopupLayer();
		}
	});
})(jQuery);
