﻿function popupPanels(browserRef)
{
    this.browserRef = browserRef;
    
    var divNames = new Array();
    
    this.headerValue = 'Header';
    this.contentValue = 'Content';
    
    this.popupPanel = popupPanel;
    this.hidePanel = hidePanel;
    this.registerPanel = registerPanel;
    this.getDivIndex = getDivIndex;
    this.disableSelection = disableSelection;
    this.setTopest = setTopest;
    this.getAllPopupPanels = getAllPopupPanels;
    this.isAnyPopupPanelOpen = isAnyPopupPanelOpen;

    function popupPanel(divID, afterFinishFunction)
    {
        var divRef = $(divID);

        var durationValue = 0.5;
        if (this.browserRef.isNS)
            durationValue = 0.1;

        Effect.Queues.get('popupPanelEffect' + divID).invoke('cancel');
        divRef.style.width = '';
        divRef.style.height = '';
        
        new Effect.Grow(
                            divRef,
                            {
                                direction: 'center',
                                duration: durationValue,
                                queue: {scope: 'popupPanelEffect' + divID},
                                afterUpdate: function()
                                {
                                    divRef.style.left = getLeftSpaceForCentering(divRef) + getScrollCoordinatesX() + 'px';
                                    divRef.style.top = getTopSpaceForCentering(divRef) + getScrollCoordinatesY() + 'px';
                                },
                                afterFinish: function()
                                {
                                    divRef.style.width = divRef.offsetWidth + 'px';
                                    divRef.style.height = divRef.offsetHeight + 'px';
                                    divRef.style.left = getLeftSpaceForCentering(divRef) + getScrollCoordinatesX() + 'px';
                                    divRef.style.top = getTopSpaceForCentering(divRef) + getScrollCoordinatesY() + 'px';

                                    if (afterFinishFunction)
                                        afterFinishFunction();
                                },
                                beforeStart: function()
                                {
                                    divRef.style.width = '';
                                    divRef.style.height = '';
                                }
                            }
                        );

        this.setTopest(divID);
    }

    function hidePanel(divID)
    {
        var divRef = $(divID);
        
        if (divRef.style.display == 'none')
            return;

        var durationValue = 0.5;
        if (this.browserRef.isNS)
            durationValue = 0.1;

        Effect.Queues.get('popupPanelEffect' + divID).invoke('cancel');
        new Effect.Shrink(
                            divRef,
                            {
                                direction: 'center',
                                duration: durationValue,
                                queue: { scope: 'popupPanelEffect' + divID },
                                beforeStart: function()
                                {
                                    divRef.style.width = '';
                                    divRef.style.height = '';
                                },
                                afterFinish: function()
                                {
                                    divRef.style.width = '';
                                    divRef.style.height = '';
                                }
                            }
                        );
    }

    function registerPanel(divID)
    {
        var divRef = document.getElementById(divID);
        divNames.push(divID);
        this.disableSelection(divID);
    }

    function getDivIndex(divID)
    {
        var divIndex;

        for (var i = 0; i < divNames.length; i++)
        {
            if (divNames[i] == divID)
            {
                divIndex = i;
                break;
            }
        }

        return divIndex;
    }

    function disableSelection(divID)
    {
        var divHeaderRef = document.getElementById(divID + this.headerValue);

        divHeaderRef.onselectstart = function() { return false; };
        divHeaderRef.unselectable = "on";
        divHeaderRef.style.MozUserSelect = "none";
    }

    function setTopest(divID)
    {
        var divRef = $(divID);
        var allPopupPanels = new Array();
        for (var i = 0; i < divNames.length; i++)
            allPopupPanels[i] = $(divNames[i]);

        allPopupPanels.sort(function(elem1, elem2) { return elem1.style.zIndex - elem2.style.zIndex });

        for (var i = 0; i < allPopupPanels.length; i++)
        {
            if (allPopupPanels[i] != divRef)
                allPopupPanels[i].style.zIndex = i;
        }
        divRef.style.zIndex = ++i;
    }

    function getAllPopupPanels()
    {
        var allPopupPanels = new Array();
        for (var i = 0; i < divNames.length; i++)
            allPopupPanels.push(document.getElementById(divNames[i]));

        return allPopupPanels;
    }

    function isAnyPopupPanelOpen()
    {
        var isOpen = false;
        var allPopupPanels = getAllPopupPanels();        
        for (var i = 0; i < allPopupPanels.length; i++)
        {
            if (allPopupPanels[i].style.display != 'none')
            {
                isOpen = true;
                break;
            }
        }

        return isOpen;
    }
}
