﻿Type.registerNamespace("OmniWeb");

OmniWeb.Menu = function(element)
{
    OmniWeb.Menu.initializeBase(this, [element]);

    /* Client Properties */
    this._isIE6 = false;
    this._timerCookie = null;

    /* Server Properties */
    this._MenuGroupDefaultCss = null;
    this._MenuGroupHoverCss = null;
    this._MenuLinkDefaultCss = null;
    this._MenuLinkHoverCss = null;
    this._MenuTimeout = 100;
    this._OnClientSelect = null;
    this._SubMenuCss = null;
    this._SubMenuLinkDefaultCss = null;
    this._SubMenuLinkHoverCss = null;
    this._Zindex = 1000000;

    /* Handlers */
    this._menuClickHandler = null;
    this._menuOverHandler = null;
    this._menuOutHandler = null;
    this._submenuOverHandler = null;
    this._submenuOutHandler = null;
    this._frameOverHandler = null;
    this._frameOutHandler = null;
    this._menuTimeoutHandler = null;
}

OmniWeb.Menu.prototype =
{
    initialize: function()
    {
        OmniWeb.Menu.callBaseMethod(this, 'initialize');

        this._isIE6 = Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7;

        this._menuClickHandler = Function.createDelegate(this, this._onMenuClick);
        this._menuOverHandler = Function.createDelegate(this, this._onMenuOver);
        this._menuOutHandler = Function.createDelegate(this, this._onMenuOut);
        this._submenuOverHandler = Function.createDelegate(this, this._onSubMenuOver);
        this._submenuOutHandler = Function.createDelegate(this, this._onSubMenuOut);
        this._frameOverHandler = Function.createDelegate(this, this._onFrameOver);
        this._frameOutHandler = Function.createDelegate(this, this._onFrameOut);
        this._menuTimeoutHandler = Function.createDelegate(this, this._onMenuTimeout);

        var cntrl = this.get_element();
        var data = eval(cntrl.id + "_data");
        for (var x = 0; x < data.length; x++) {
            var cell = $get(data[x].Id);
            cell._index = x;
            if (data[x].NavigateUrl) {
                cell._navigate = data[x].NavigateUrl;
                cell._onClientSelect = data[x].OnClientSelect;
                $addHandler(cell, "click", this._menuClickHandler);
            }
            $addHandler(cell, 'mousemove', this._menuOverHandler);
            $addHandler(cell, 'mouseover', this._menuOverHandler);
            $addHandler(cell, 'mouseout', this._menuOutHandler);
            if (data[x].Items) {
                var sub = $get(cntrl.id + "_sub_" + x);
                if (sub) {
                    var posn = $OmniWeb.GetElementPosition(cell);
                    sub.style.left = posn.x + "px";
                    sub.style.top = (posn.y + cell.offsetHeight) + "px";
                    sub.style.zIndex = this._Zindex;
                    var menu = $get(cntrl.id + "_sub_" + x + "_menu");
                    if (menu) {
                        $addHandler(menu, "mouseover", this._frameOverHandler);
                        $addHandler(menu, "mouseout", this._frameOutHandler);
                        menu.style.zIndex = 1;
                    }
                    for (var y = 0; y < data[x].Items.length; y++) {
                        var item = $get(data[x].Items[y].Id);
                        if (data[x].Items[y].NavigateUrl) {
                            item._navigate = data[x].Items[y].NavigateUrl;
                            item._onClientSelect = data[x].Items[y].OnClientSelect;
                            $addHandler(item, "click", this._menuClickHandler);
                        }
                        $addHandler(item, "mouseover", this._submenuOverHandler);
                        $addHandler(item, "mouseout", this._submenuOutHandler);
                    }
                    if (this._isIE6) {
                        var frame = document.createElement("IFRAME");
                        frame.id = cntrl.id + "_sub_" + x + "_frame";
                        frame.src = "about:blank";
                        frame.style.position = "absolute";
                        frame.style.left = "0px";
                        frame.style.top = "0px";
                        frame.scrolling = "no";
                        frame.frameBorder = 0;
                        sub.appendChild(frame);
                    }
                }
            }
        }
    },

    dispose: function()
    {
        this._CancelTimer();

        var cntrl = this.get_element();
        var data = eval(cntrl.id + "_data");
        for (var x = 0; x < data.length; x++) {
            $clearHandlers($get(data[x].Id));
            if (data[x].Items) {
                var menu = $get(cntrl.id + "_sub_" + x + "_menu");
                if (menu) $clearHandlers(menu);
                for (var y = 0; y < data[x].Items.length; y++) {
                    var item = $get(data[x].Items[y].Id);
                    if (item) $clearHandlers(item);
                }
            }
        }

        if (this._menuClickHandler) delete this._menuClickHandler;
        if (this._menuOverHandler) delete this._menuOverHandler;
        if (this._menuOutHandler) delete this._menuOutHandler;
        if (this._submenuOverHandler) delete this._submenuOverHandler;
        if (this._submenuOutHandler) delete this._submenuOutHandler;
        if (this._frameOverHandler) delete this._frameOverHandler;
        if (this._frameOutHandler) delete this._frameOutHandler;
        if (this._menuTimeoutHandler) delete this._menuTimeoutHandler;

        OmniWeb.Menu.callBaseMethod(this, 'dispose');
    },

    set_MenuGroupDefaultCss: function(value)
    {
        this._MenuGroupDefaultCss = value;
    },
    get_MenuGroupDefaultCss: function()
    {
        return this._MenuGroupDefaultCss;
    },
    set_MenuGroupHoverCss: function(value)
    {
        this._MenuGroupHoverCss = value;
    },
    get_MenuGroupHoverCss: function()
    {
        return this._MenuGroupHoverCss;
    },

    set_MenuLinkDefaultCss: function(value)
    {
        this._MenuLinkDefaultCss = value;
    },
    get_MenuLinkDefaultCss: function()
    {
        return this._MenuLinkDefaultCss;
    },
    set_MenuLinkHoverCss: function(value)
    {
        this._MenuLinkHoverCss = value;
    },
    get_MenuLinkHoverCss: function()
    {
        return this._MenuLinkHoverCss;
    },

    set_MenuTimeout: function(value)
    {
        this._MenuTimeout = value;
    },
    get_MenuTimeout: function()
    {
        return this._MenuTimeout;
    },

    set_OnClientSelect: function(value)
    {
        this._OnClientSelect = value;
    },
    get_OnClientSelect: function()
    {
        return this._OnClientSelect;
    },

    set_SubMenuCss: function(value)
    {
        this._SubMenuCss = value;
    },
    get_SubMenuCss: function()
    {
        return this._SubMenuCss;
    },

    set_SubMenuLinkDefaultCss: function(value)
    {
        this._SubMenuLinkDefaultCss = value;
    },
    get_SubMenuLinkDefaultCss: function()
    {
        return this._SubMenuLinkDefaultCss;
    },
    set_SubMenuLinkHoverCss: function(value)
    {
        this._SubMenuLinkHoverCss = value;
    },
    get_SubMenuLinkHoverCss: function()
    {
        return this._SubMenuLinkHoverCss;
    },

    set_Zindex: function(value)
    {
        this._Zindex = value;
    },
    get_Zindex: function()
    {
        return this._Zindex;
    },

    _CancelTimer: function()
    {
        if (this._timerCookie) {
            window.clearTimeout(this._timerCookie);
            this._timerCookie = null;
        }
    },

    _onMenuClick: function(event)
    {
        if (event.target._navigate) {
            var flag = true;
            if (this._OnClientSelect) {
                eval("function _test(){" + this._OnClientSelect + ";return true;}flag=_test();");
            }
            if (flag && event.target._onClientSelect) {
                eval("function _test(){" + event.target._onClientSelect + ";return true;}flag=_test();");
            }
            if (flag) window.location.href = event.target._navigate;
        }
    },

    _onMenuOver: function(event)
    {
        this._CancelTimer();
        var cntrl = this.get_element();
        var data = eval(cntrl.id + "_data");
        var index = event.target._index;
        for (var x = 0; x < data.length; x++) {
            var cell = $get(data[x].Id);
            if (!data[x].Items) {
                cell.className = x == index ? this._MenuLinkHoverCss : this._MenuLinkDefaultCss;
            } else {
                cell.className = x == index ? this._MenuGroupHoverCss : this._MenuGroupDefaultCss;
                var submenu = $get(cntrl.id + "_sub_" + x);
                if (submenu) {
                    if (x != index) {
                        $OmniWeb.SetDisplay(submenu, false);
                    } else {
                        var posn = $OmniWeb.GetElementPosition(cell);
                        submenu.style.left = posn.x + "px";
                        submenu.style.top = (posn.y + cell.offsetHeight) + "px";
                        $OmniWeb.SetDisplay(submenu, true);
                        if (this._isIE6) {
                            var frame = $get(cntrl.id + "_sub_" + x + "_frame");
                            if (frame) {
                                var menu = $get(cntrl.id + "_sub_" + x + "_menu");
                                frame.style.height = menu.offsetHeight + "px";
                                frame.style.width = menu.offsetWidth + "px";
                            }
                        }
                    }
                }
            }
        }
        event.stopPropagation();
    },

    _onMenuOut: function(event)
    {
        this._timerCookie = window.setTimeout(this._menuTimeoutHandler, this._MenuTimeout);
        event.stopPropagation();
    },

    _onSubMenuOver: function(event)
    {
        this._CancelTimer();
        event.target.className = this._SubMenuLinkHoverCss;
        event.stopPropagation();
    },

    _onSubMenuOut: function(event)
    {
        event.target.className = this._SubMenuLinkDefaultCss;
        this._timerCookie = window.setTimeout(this._menuTimeoutHandler, this._MenuTimeout);
        event.stopPropagation();
    },

    _onFrameOver: function(event)
    {
        this._CancelTimer();
        event.stopPropagation();
    },

    _onFrameOut: function(event)
    {
        this._timerCookie = window.setTimeout(this._menuTimeoutHandler, this._MenuTimeout);
        event.stopPropagation();
    },

    _onMenuTimeout: function()
    {
        this._CancelTimer();
        var cntrl = this.get_element();
        var data = eval(cntrl.id + "_data");
        for (var x = 0; x < data.length; x++) {
            var cell = $get(data[x].Id);
            if (!data[x].Items) {
                cell.className = this._MenuLinkDefaultCss;
            } else {
                cell.className = this._MenuGroupDefaultCss;
                var submenu = $get(cntrl.id + "_sub_" + x);
                if (submenu) $OmniWeb.SetDisplay(submenu, false);
            }
        }
    }

}

OmniWeb.Menu.registerClass('OmniWeb.Menu', Sys.UI.Control);

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();