﻿var ModalDialog = (function() {
    var iModalCount = 0;

    function fnModalDialogConstructor(sId, sNewHeaderText, oLeftButton, oRightButton, oContent, oFooter, sCSS) {
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                 Private Variables                */
        /*                                                  */
        /*                                                  */
        /****************************************************/
        var iModalNumber;

        var sHiddenClassName = "Hidden";
        var oInstance, oOverlay, oDialogBox, oDisabledOverlay;
        var sHeaderText, sLeftButtonURL, sRightButtonURL, sContentURL, sFooterURL;

        var iLoadedFrames = 0;
        var hInitializeArguments = $H();
        var hEvents = $H();

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                  Event Handlers                  */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        function frame_onLoad(event) {
            //This code is commented out due to a bug in Firefox 2 that will not allow the iframe reference to be passed onload
            /*var oElement = Event.element(event);
            var sFrameName = oElement.getAttribute("name");
            var oFrame = window[sFrameName];
            oFrame.oParent = oInstance;
            oFrame.initialize(hInitializeArguments.get(sFrameName));*/
            if (++iLoadedFrames == 4) {
                var oFrame;
                var aKeys = hInitializeArguments.keys();
                var sKey;
                for (var iKey = 0; iKey < aKeys.length; iKey++) {
                    sKey = aKeys[iKey];
                    oFrame = window[sKey];
                    oFrame.oParent = oInstance;
                    oFrame.initialize(hInitializeArguments.get(sKey));
                }
                oInstance.dispatchEvent("Load", {});
            }
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*            Event Dispatcher Interface            */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.attachEventListener = function(sEventName, fnEventListener) {
            var aEventListeners = hEvents.get(sEventName);
            if (aEventListeners)
                aEventListeners.unshift(fnEventListener);
            else {
                aEventListeners = $A();
                aEventListeners.push(fnEventListener);
                hEvents.set(sEventName, aEventListeners);
            }
        }

        this.detachEventListener = function(fnEventListener) {
            var aEvents = hEvents.values();
            var aEventListeners;
            EventLoop:
            for (var iEvent = 0; iEvent < aEvents.length; iEvent++) {
                aEventListeners = aEvents[iEvent];
                for (var iEventListener = 0; iEventListener < aEventListeners.length; iEventListener++) {
                    oEventListener = aEventListeners[iEventListener];
                    if (oEventListener == fnEventListener) {
                        aEventListeners.splice(iEventListener, 1);
                        break EventLoop;
                    }
                }
            }
        }

        this.dispatchEvent = function(sEventName, oEvent) {
            var aEventListeners = hEvents.get(sEventName);
            if (aEventListeners) {
                var fnEventListener;
                for (var iEventListener = aEventListeners.length - 1; iEventListener >= 0; iEventListener--) {
                    fnEventListener = aEventListeners[iEventListener];
                    try {
                        fnEventListener(oEvent);
                    }
                    catch (eException) {
                        aEventListeners.splice(iEventListener, 1);
                    }
                }
            }
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*          Class Level Priveleged Methods          */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.disable = function() {
            this.dispatchEvent("Enable", {});
        }

        this.enable = function() {
            this.dispatchEvent("Enable", {});
        }

        this.hide = function() {
            oOverlay.addClassName(sHiddenClassName);
            oDialogBox.addClassName(sHiddenClassName);
            $$("html").first().setStyle({ overflow: "auto" });
            this.dispatchEvent("Hide", {});
        }

        this.show = function() {
            $$("html").first().setStyle({ overflow: "hidden" });
            var iScrollTop = $$("body").first().cumulativeScrollOffset().top;
            oOverlay.setStyle({ top: iScrollTop + "px" });
            oDialogBox.setStyle({ top: iScrollTop + (document.viewport.getHeight() - oDialogBox.getHeight()) / 2 + "px" });
            oOverlay.removeClassName(sHiddenClassName);
            oDialogBox.removeClassName(sHiddenClassName);

            this.dispatchEvent("Show", {});
        }

        this.hideFrame = function(sClassName) {
            oDialogBox.down("iframe." + sClassName).addClassName(sHiddenClassName);
        }

        this.showFrame = function(sClassName) {
            oDialogBox.down("iframe." + sClassName).removeClassName(sHiddenClassName);
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                Accessors/Mutators                */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.getHeaderText = function() {
            return sHeaderText;
        }

        this.setHeaderText = function(sText) {
            if (sText) {
                oDialogBox.down("div.Header > h1").innerHTML = sText;
                sHeaderText = sText;
            }
        }

        this.getLeftButtonURL = function() {
            return sLeftButtonURL;
        }

        this.setLeftButtonURL = function(sURL) {
            if (sURL) {
                var oFrame = oDialogBox.down("iframe.LeftButton");
                oFrame.src = sURL;
                sLeftButtonURL = sURL;
            }
        }

        this.getRightButtonURL = function() {
            return sRightButtonURL;
        }

        this.setRightButtonURL = function(sURL) {
            if (sURL) {
                var oFrame = oDialogBox.down("iframe.RightButton");
                oFrame.src = sURL;
                sRightButtonURL = sURL;
            }
        }

        this.getContentURL = function() {
            return sContentURL;
        }

        this.setContentURL = function(sURL) {
            if (sURL) {
                var oFrame = oDialogBox.down("iframe.Content");
                oFrame.src = sURL;
                sContentURL = sURL;
            }
        }

        this.getFooterURL = function() {
            return sFooterURL;
        }

        this.setFooterURL = function(sURL) {
            if (sURL) {
                var oFrame = oDialogBox.down("iframe.Footer");
                oFrame.src = sURL;
                sFooterURL = sURL;
            }
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*            Class Level Private Methods           */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        function attachEvents() {
            var aFrames = oDialogBox.select("iframe");
            var oFrame;
            for (var iFrame = 0; iFrame < aFrames.length; iFrame++) {
                oFrame = aFrames[iFrame];
                Event.observe(oFrame, "load", frame_onLoad);
            }
        }

        function initialize() {
            iModalNumber = iModalCount++;

            var oBody = $$("body").first();
            var oHead = $$("head").first();
            /*var oLink = document.createElement("link");
            var aScripts = $$("script");
            var sSource;
            for (var iScript = 0; iScript < aScripts.length; iScript++) {
                sSource = aScripts[iScript].src;
                if (sSource.indexOf("ModalDialog.js") != -1) {
                    //oLink.setAttribute("href", sSource.substring(0, sSource.lastIndexOf("/") + 1) + "styles/BaseStyle.css");
                    break;
                }
            }
            oLink.setAttribute("rel", "stylesheet");
            oLink.setAttribute("type", "text/css");
            //oHead.appendChild(oLink);

            
            if (sCSS) {
                oLink = document.createElement("link");
                oLink.setAttribute("rel", "stylesheet");
                oLink.setAttribute("type", "text/css");
                oLink.setAttribute("href", sCSS);
                oHead.appendChild(oLink);
            }*/

            oOverlay = $(document.createElement("div"));
            oOverlay.addClassName("Overlay");
            oOverlay.addClassName("Semi-Transparent");
            oOverlay.addClassName(sHiddenClassName);
            oBody.appendChild(oOverlay);

            var sModalNumber = iModalNumber.toString();

            oDialogBox = $(document.createElement("div"));
            oDialogBox.setAttribute("id", sId);
            oDialogBox.addClassName("DialogBox");
            oDialogBox.addClassName(sHiddenClassName);
            oDialogBox.innerHTML = "<div class=\"Header\"><iframe name=\"LeftButton" + sModalNumber + "\" class=\"LeftButton\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"no\"></iframe><iframe name=\"RightButton" + sModalNumber + "\" class=\"RightButton\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"no\"></iframe><h1></h1></div><iframe name=\"Content" + sModalNumber + "\" class=\"Content\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"no\"></iframe><iframe name=\"Footer" + sModalNumber + "\" class=\"Footer\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"no\"></iframe>";
            oInstance.setHeaderText(sNewHeaderText);
            
            initializeFrames();

            oBody.appendChild(oDialogBox);

            oDisabledOverlay = $(document.createElement("div"));
            oDisabledOverlay.addClassName("Overlay");
            oDisabledOverlay.addClassName(sHiddenClassName);
            oBody.appendChild(oDisabledOverlay);
        }

        function initializeFrameDisplay() {
            var aArguments = ModalDialog.arguments;
            var aArgumentNames = ModalDialog.argumentNames();
            var sFrameName;
            var sInstanceFrameName;
            var sModalCount = iModalNumber.toString();
            for (var iArgument = 2; iArgument < aArguments.length - 1; iArgument++) {
                oArgument = aArguments[iArgument];
                sFrameName = aArgumentNames[iArgument].substr(1);
                sInstanceFrameName = sFrameName + sModalCount;
                hInitializeArguments.set(sInstanceFrameName, oArgument.arguments);
                //hInitializeArguments.set(sFrameName, oArgument.arguments);
                /*if (!oArgument.display)
                    oInstance.hideFrame(sFrameName);*/
                    
                oInstance["set" + sFrameName + "URL"](oArgument.url);
            }
        }

        function initializeFrames() {
            attachEvents();
            initializeFrameDisplay();
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                 Initialize Class                 */
        /*                                                  */
        /*                                                  */
        /****************************************************/
        oInstance = this;
        initialize.bind(oInstance)();
    }

    return fnModalDialogConstructor;
})();