var aspxMIIdSuffix = "_DXI";
var aspxMMIdSuffix = "_DXM";
var aspxMMFIdSuffix = "_DXMIF";

ASPxClientMenuBase = _aspxCreateClass(ASPxClientControl, {
	constructor: function(name){
		this.constructor.prototype.constructor.call(this, name);

        this.allowSelectItem = false;
        this.appearAfter = 300;
        this.disappearAfter = 500;
        this.lockHoverEvents = false;
        this.rootItem = null;
        
        this.rootSubMenuFIXOffset = 0;
        this.rootSubMenuFIYOffset = 0;
        this.rootSubMenuLIXOffset = 0;
        this.rootSubMenuLIYOffset = 0;
        this.rootSubMenuXOffset = 0;
        this.rootSubMenuYOffset = 0;
        this.subMenuFIXOffset = 0;
        this.subMenuFIYOffset = 0;
        this.subMenuLIXOffset = 0;
        this.subMenuLIYOffset = 0;
        this.subMenuXOffset = 0;
        this.subMenuYOffset = 0;
        
        this.ItemClick = new ASPxClientEvent();
        this.PopUp = new ASPxClientEvent();
        this.CloseUp = new ASPxClientEvent();
        
        aspxGetMenuCollection().Add(this);
    },
    Initialize: function(){
        if(this.allowSelectItem){
            var inputElement = this.GetSelectedItemInputElement();
            if(inputElement != null){
                var element = this.GetItemTextCell(inputElement.value);
                if(element != null)
                    aspxGetStyleController().SelectElementBySrcElement(element);
            }
        }
        this.constructor.prototype.Initialize.call(this);
    },
	
    GetMenuElement: function(indexPath){
        return _aspxGetElementById(this.name + aspxMMIdSuffix + indexPath + "_");
    },
    GetMenuIFrameElement: function(indexPath){
        var level = this.GetMenuLevel(indexPath);
        return _aspxGetElementById(this.name + aspxMMFIdSuffix + level);
    },
    GetMenuMainCell: function(element){
        return element.rows[0].cells[0];
    },
    GetItemElement: function(indexPath){
        return _aspxGetElementById(this.name + aspxMIIdSuffix + indexPath + "_");
    },
    GetItemTemplateCell: function(indexPath){
        return _aspxGetElementById(this.name + aspxMIIdSuffix + indexPath + "_ITC");
    },
    GetItemImageCell: function(indexPath){
        return _aspxGetElementById(this.name + aspxMIIdSuffix + indexPath + "_I");
    },
    GetItemIndentCell: function(indexPath){
        return _aspxGetElementById(this.name + aspxMIIdSuffix + indexPath + "_N");
    },
    GetItemTextCell: function(indexPath){
        return _aspxGetElementById(this.name + aspxMIIdSuffix + indexPath + "_T");
    },
    GetItemPopOutImageCell: function(indexPath){
        return _aspxGetElementById(this.name + aspxMIIdSuffix + indexPath + "_P");
    },
    
    GetSelectedItemInputElement: function(){
        return _aspxGetElementById(this.name + "SI");
    },
    
    GetSubMenuXPosition: function(indexPath, menuElement){
        var position = 0;
        if(this.IsVertical(indexPath)){
            var imageElement = this.GetItemImageCell(indexPath);
            var textElement = this.GetItemTextCell(indexPath);
            var popOutImageElement = this.GetItemPopOutImageCell(indexPath);
            if(imageElement != null || textElement != null || popOutImageElement != null){
                position = -1;
                var element = null;
                if(imageElement != null){
                    var imagePos = _aspxGetAbsoluteX(imageElement);
                    if(position < imagePos){
                        position = imagePos;
                        element = imageElement;
                    }
                }
                if(textElement != null){
                    var textPos = _aspxGetAbsoluteX(textElement);
                    if(position < textPos){
                        position = textPos;
                        element = textElement;
                    }
                }
                if(popOutImageElement != null){
                    var popOutImagePos = _aspxGetAbsoluteX(popOutImageElement);
                    if(position < popOutImagePos){
                        position = popOutImagePos;
                        element = popOutImageElement;
                    }
                }

                if(__aspxNS || __aspxSafari || __aspxOpera9)
                    position = _aspxGetAbsoluteX(element) + element.clientWidth;
                else
                    position = _aspxGetAbsoluteX(element) + element.clientWidth + this.GetMenuMainCell(menuElement).clientLeft;
            }
        }
        else{
            var imageElement = this.GetItemImageCell(indexPath);
            var textElement = this.GetItemTextCell(indexPath);
            var popOutImageElement = this.GetItemPopOutImageCell(indexPath);
            if(imageElement != null || textElement != null || popOutImageElement != null){
                position = 10000;
                var element = null;
                if(imageElement != null){
                    var imagePos = _aspxGetAbsoluteX(imageElement);
                    if(position > imagePos){
                        position = imagePos;
                        element = imageElement;
                    }
                }
                if(textElement != null){
                    var textPos = _aspxGetAbsoluteX(textElement);
                    if(position > textPos){
                        position = textPos;
                        element = textElement;
                    }
                }
                if(popOutImageElement != null){
                    var popOutImagePos = _aspxGetAbsoluteX(popOutImageElement);
                    if(position > popOutImagePos){
                        position = popOutImagePos;
                        element = popOutImageElement;
                    }
                }
                if(!(__aspxNS || __aspxSafari || __aspxOpera9)){
                    if(element.clientLeft > 0)
                        position += this.GetMenuMainCell(menuElement).clientLeft;
                    else if(this.IsRootItem(indexPath))
                        position += this.GetMenuMainCell(this.GetMainElement()).clientLeft;
                }
            }
        }
        if(__aspxSafari){
            if(!this.IsRootItem(indexPath))
                position -= document.body.offsetLeft;
        }
        return position;
    },
    GetSubMenuYPosition: function(indexPath, menuElement){
        var position = 0;
        if(this.IsVertical(indexPath)){
            var element = this.GetItemTextCell(indexPath);
            if(element != null){
                if(__aspxNS || __aspxOpera9)
                    position = _aspxGetAbsoluteY(element);
                else if(__aspxSafari){
                    position = _aspxGetAbsoluteY(element);
                    if(element.offsetTop > 0 && this.IsRootItem(indexPath))
                        position --;
                }
                else
                    position = _aspxGetAbsoluteY(element) + this.GetMenuMainCell(menuElement).clientTop;
            }
        }
        else{
            var element = this.GetItemTextCell(indexPath);
            if(element != null){
                if(__aspxNS || __aspxOpera9)
                    position = _aspxGetAbsoluteY(element) + element.offsetHeight + (element.clientHeight - element.offsetHeight) / 2;
                else if(__aspxSafari)
                    position = _aspxGetAbsoluteY(element) + element.offsetHeight + element.offsetTop + (element.clientHeight - element.offsetHeight) / 2;
                else{
                    position = _aspxGetAbsoluteY(element) + element.clientTop + element.clientHeight;
                    
                    if(element.clientTop + element.clientHeight < element.offsetTop)
                        position += this.GetMenuMainCell(menuElement).clientTop;
                    else if(this.IsRootItem(indexPath))
                        position += this.GetMenuMainCell(this.GetMainElement()).clientTop;
                }
            }
        }
        if(__aspxSafari){
            if(!this.IsRootItem(indexPath))
                position -= document.body.offsetTop;
        }
        return position;
    },
    GetCorrectedMenuXPosition: function(element, x, indexPath){
        var itemWidth = 0;
        var itemOffsetWidth = 0;
        var imageElement = (indexPath != "") ? this.GetItemImageCell(indexPath) : null;
        if(imageElement != null){
            itemWidth += imageElement.clientWidth;
            itemOffsetWidth += imageElement.offsetWidth;
        }
        var indentElement = (indexPath != "") ? this.GetItemIndentCell(indexPath) : null;
        if(indentElement != null){
            itemWidth += indentElement.clientWidth;
            itemOffsetWidth += indentElement.offsetWidth;
        }
        var textElement = (indexPath != "") ? this.GetItemTextCell(indexPath) : null;
        if(textElement != null){
            itemWidth += textElement.clientWidth;
            itemOffsetWidth += textElement.offsetWidth;
        }
        var popOutImageElement = (indexPath != "") ? this.GetItemPopOutImageCell(indexPath) : null;
        if(popOutImageElement != null){
            itemWidth += popOutImageElement.clientWidth;
            itemOffsetWidth += popOutImageElement.offsetWidth;
        }
        var menuWidth = this.GetMenuMainCell(element).offsetWidth;
        
        var left = x - _aspxGetDocumentScrollLeft();
        var right = left + menuWidth;
        var bodyWidth = _aspxGetDocumentClientWidth();
        if(bodyWidth == 0)
            bodyWidth = document.body.clientWidth;
        if(this.IsVertical(indexPath)){
            if(right > bodyWidth && left - menuWidth - itemWidth > bodyWidth - right)
                return x - menuWidth - itemWidth - this.GetSubMenuXOffset(indexPath);
        }
        else{
            menuWidth -= itemOffsetWidth;
            if(right > bodyWidth && left - menuWidth > bodyWidth - right)
                return x - menuWidth - this.GetSubMenuXOffset(indexPath);
        }
        return x + this.GetSubMenuXOffset(indexPath);
    },
    GetCorrectedMenuYPosition: function(element, y, indexPath){
        var textElement = (indexPath != "") ? this.GetItemTextCell(indexPath) : null;
        var itemHeight = (textElement != null) ? textElement.clientHeight : 0;
        var itemOffsetHeight = (textElement != null) ? textElement.offsetHeight : 0;
        var menuHeight = this.GetMenuMainCell(element).offsetHeight;
        
        var top = y - _aspxGetDocumentScrollTop();
        var bottom = top + menuHeight;
        var bodyHeight = _aspxGetDocumentClientHeight();
            
        if(this.IsVertical(indexPath)){
            menuHeight -= itemOffsetHeight - itemHeight;
            if(bottom > bodyHeight && top - menuHeight + itemHeight > bodyHeight - bottom)
                return y - menuHeight + itemHeight - this.GetSubMenuYOffset(indexPath);
        }
        else{
            if(bottom > bodyHeight && top - menuHeight - itemHeight > bodyHeight - bottom)
                return y - menuHeight - itemHeight - this.GetSubMenuYOffset(indexPath);
        }
        return y + this.GetSubMenuYOffset(indexPath);
    },
    
    HasChildren: function(indexPath){
        return (this.GetMenuElement(indexPath) != null);
    },
    IsVertical: function(indexPath){
        return true;
    },
    IsRootItem: function(indexPath){
        return this.GetMenuLevel(indexPath) <= 1;
    },
    
    GetItemIndexPath: function(indexes){
        return aspxGetMenuCollection().GetItemIndexPath(indexes);
    },
    GetItemIndexes: function(indexPath){
        return aspxGetMenuCollection().GetItemIndexes(indexPath);
    },
    GetItemIndexPathById: function(id){
        return aspxGetMenuCollection().GetIndexPathById(id, false);
    },
    GetMenuIndexPathById: function(id){
        return aspxGetMenuCollection().GetIndexPathById(id, true);
    },
    GetIndexPathById: function(id, checkMenu){
        var indexPath = this.GetItemIndexPathById(id);
        if(indexPath == "" && checkMenu) 
            indexPath = this.GetMenuIndexPathById(id);
        return indexPath;
    },
    GetMenuLevel: function(indexPath){
        return aspxGetMenuCollection().GetMenuLevel(indexPath);
    },
    
    GetParentIndexPath: function(indexPath){
        var indexes = this.GetItemIndexes(indexPath);
        indexes.length --;
        return (indexes.length > 0) ? this.GetItemIndexPath(indexes) : ""; 
    },
    IsLastItem: function(indexPath){
        if(this.IsVertical(indexPath)){
            var itemElement = this.GetItemElement(indexPath);
            return (!_aspxIsExists(itemElement.nextSibling) || !_aspxIsExists(itemElement.nextSibling.tagName));
        }    
        else{
            var textCell = this.GetItemTextCell(indexPath);
            if(!_aspxIsExists(textCell.nextSibling) || !_aspxIsExists(textCell.nextSibling.tagName))
                return true;
            else{
                var popOutImageCell = this.GetItemPopOutImageCell(indexPath);
                if(popOutImageCell == textCell.nextSibling)
                    return (!_aspxIsExists(popOutImageCell.nextSibling) || !_aspxIsExists(popOutImageCell.nextSibling.tagName));
                return false;
            }
        }
    },
    IsFirstItem: function(indexPath){
        if(this.IsVertical(indexPath)){
            var itemElement = this.GetItemElement(indexPath);
            return (!_aspxIsExists(itemElement.previousSibling) || !_aspxIsExists(itemElement.previousSibling.tagName));
        }    
        else{
            var textCell = this.GetItemTextCell(indexPath);
            if(!_aspxIsExists(textCell.previousSibling) || !_aspxIsExists(textCell.previousSibling.tagName))
                return true;
            else{
                var imageCell = this.GetItemImageCell(indexPath);
                if(imageCell == textCell.previousSibling)
                    return (!_aspxIsExists(imageCell.previousSibling) || !_aspxIsExists(imageCell.previousSibling.tagName));
                return false;
            }
        }
    },
    
    GetSubMenuXOffset: function(indexPath){
        if(indexPath == "")
            return 0;
        else if(this.IsRootItem(indexPath)){
            if(this.IsFirstItem(indexPath))
                return this.rootSubMenuFIXOffset;
            else if(this.IsLastItem(indexPath))
                return this.rootSubMenuLIXOffset;
            else
                return this.rootSubMenuXOffset;
        }
        else{
            if(this.IsFirstItem(indexPath))
                return this.subMenuFIXOffset;
            else if(this.IsLastItem(indexPath))
                return this.subMenuLIXOffset;
            else
                return this.subMenuXOffset;
        }
    },
    GetSubMenuYOffset: function(indexPath){
        if(indexPath == "")
            return 0;
        else if(this.IsRootItem(indexPath)){
            if(this.IsFirstItem(indexPath))
                return this.rootSubMenuFIYOffset;
            else if(this.IsLastItem(indexPath))
                return this.rootSubMenuLIYOffset;
            else
                return this.rootSubMenuYOffset;
        }
        else{
            if(this.IsFirstItem(indexPath))
                return this.subMenuFIYOffset;
            else if(this.IsLastItem(indexPath))
                return this.subMenuLIYOffset;
            else
                return this.subMenuYOffset;
        }
    },
    
    ClearAppearTimer: function(){
        aspxGetMenuCollection().ClearAppearTimer();
    },
    ClearDisappearTimer: function(){
        aspxGetMenuCollection().ClearDisappearTimer();
    },
    IsAppearTimerActive: function(){
        return aspxGetMenuCollection().appearTimerID > -1;
    },
    IsDisappearTimerActive: function(){
        return aspxGetMenuCollection().disappearTimerID > -1;
    },
    SetAppearTimer: function(indexPath){
        aspxGetMenuCollection().SetAppearTimer(this.name, indexPath, this.appearAfter);
    },
    SetDisappearTimer: function(){
        aspxGetMenuCollection().SetDisappearTimer(this.name, this.disappearAfter);
    },
    
    DoItemClick: function(indexPath, hasItemLink){
        var processOnServer = this.autoPostBack;
        if(_aspxIsExists(this.RaiseItemClick))
            processOnServer = this.RaiseItemClick(indexPath);
        if(processOnServer && !hasItemLink)
            this.SendPostBack("CLICK:" + indexPath);
        else{
            this.ClearDisappearTimer();
            this.ClearAppearTimer();
            if(!this.HasChildren(indexPath)) 
                aspxGetMenuCollection().HidePopupMenus(-1, this.name, false, "");
            else
                this.ShowSubMenu(indexPath);           
        }
    },
    DoShowPopupMenu: function(element, x, y, indexPath){
        if(__aspxNS){
            element.style.left = "-1000px";
            element.style.top = "-1000px";
        }
        element.savedParent = _aspxGetParentNode(element);
        _aspxGetServerForm().appendChild(element);
            
        _aspxSetElementDisplay(element, true);
        
        x = (x < 0) ? this.GetSubMenuXPosition(indexPath, element) : x;
        y = (y < 0) ? this.GetSubMenuYPosition(indexPath, element) : y;
        
        x = this.GetCorrectedMenuXPosition(element, x, indexPath);
        y = this.GetCorrectedMenuYPosition(element, y, indexPath);
        
        element.style.left = x + "px";
        element.style.top = y + "px";
        
        _aspxSetElementVisibility(element, true);
        
        if(__aspxIE){
            var iFrame = element.overflowElement;
            if(!_aspxIsExists(iFrame)){
                iFrame = this.GetMenuIFrameElement(indexPath);
                element.overflowElement = iFrame;
            }
            if(_aspxIsExists(iFrame)){
                iFrame.savedParent = _aspxGetParentNode(iFrame);
                _aspxGetServerForm().appendChild(iFrame);

                var cell = this.GetMenuMainCell(element);
                iFrame.style.width = cell.offsetWidth + "px";
                iFrame.style.height = cell.offsetHeight + "px";
                iFrame.style.left = x + "px";
                iFrame.style.top = y + "px";
                _aspxSetElementDisplay(iFrame, true);
            }
        }
        aspxGetMenuCollection().RegisterVisiblePopupMenu(this.name, element.id);
        
        if(_aspxIsExists(this.RaisePopUp))
            this.RaisePopUp(indexPath);
    },
    DoHidePopupMenu: function(element){
        if(__aspxIE){
            var iFrame = element.overflowElement;
            if(_aspxIsExists(iFrame)){
                _aspxSetElementDisplay(iFrame, false);
                iFrame.savedParent.appendChild(iFrame);
            }
        }
        _aspxSetElementVisibility(element, false);
        _aspxSetElementDisplay(element, false);
        element.savedParent.appendChild(element);
        
        this.CancelSubMenuItemHoverItem(element);
        aspxGetMenuCollection().UnregisterVisiblePopupMenu(this.name, element.id);

        var indexPath = this.GetIndexPathById(element.id, true);
        if(_aspxIsExists(this.RaiseCloseUp))
            this.RaiseCloseUp(indexPath);
    },
    SetHoverElement: function(element){
        this.lockHoverEvents = true;
        aspxGetStyleController().SetCurrentHoverElementBySrcElement(element);
        this.lockHoverEvents = false;
    },
    ApplySubMenuItemHoverItem: function(element, hoverItem, hoverElement){
        if(_aspxGetElementDisplay(element) && !_aspxIsExists(element.hoverItem)){
            var newHoverItem = hoverItem.Clone();
            element.hoverItem = newHoverItem;
            element.hoverElement = hoverElement;
            newHoverItem.Apply(hoverElement);
        }
    },
    CancelSubMenuItemHoverItem: function(element){
        if(_aspxIsExists(element.hoverItem)){
            element.hoverItem.Cancel(element.hoverElement);
            element.hoverItem = null;
            element.hoverElement = null;
        }
    },
    ShowSubMenu: function(indexPath){
        var element = this.GetMenuElement(indexPath);
        if(element != null){
            var level = this.GetMenuLevel(indexPath);
            aspxGetMenuCollection().HidePopupMenus(level - 1, this.name, false, element.id);

            this.DoShowPopupMenu(element, -1, -1, indexPath);
        }    
        this.ClearAppearTimer();
    },
    SetSelectedItemInternal: function(indexPath, modifyHotTrackSelection){
        if(modifyHotTrackSelection)
            this.SetHoverElement(null);
        if(this.allowSelectItem){
            var inputElement = this.GetSelectedItemInputElement();
            if(inputElement != null){
                var element = this.GetItemTextCell(inputElement.value);
                if(element != null){
                    var hoverItem = null;
                    var hoverElement = null;
                    var menuElement = this.GetMenuElement(inputElement.value);
                    if (menuElement != null && _aspxIsExists(menuElement.hoverItem)){
                        hoverItem = menuElement.hoverItem;
                        hoverElement = menuElement.hoverElement;
                        this.CancelSubMenuItemHoverItem(menuElement);
                    }
                    aspxGetStyleController().DeselectElementBySrcElement(element);
                    if(menuElement != null && hoverItem != null)
                        this.ApplySubMenuItemHoverItem(menuElement, hoverItem, hoverElement);
                }
                inputElement.value = indexPath;
                element = this.GetItemTextCell(inputElement.value);
                if(element != null)
                    aspxGetStyleController().SelectElementBySrcElement(element);
            }
        }
        if(modifyHotTrackSelection){
            var element = this.GetItemTextCell(indexPath);
            if(element != null) this.SetHoverElement(element);
        }
    },
    
    OnItemClick: function(indexPath){
        var element = this.GetItemTextCell(indexPath);
        var linkElement = (element != null) ? _aspxGetChildByTagName(element, "A", 0) : null;
        
        this.SetSelectedItemInternal(indexPath, true); 
        this.DoItemClick(indexPath, (linkElement != null));
        
        if(linkElement != null) 
            _aspxNavigateUrl(linkElement.href, linkElement.target);
    },
    OnItemLinkClick: function(indexPath){
        this.SetSelectedItemInternal(indexPath, true);
        this.DoItemClick(indexPath, true);
    },
    OnAfterItemOver: function(hoverItem, hoverElement){
        if(hoverItem.name == "" || this.lockHoverEvents) return;
        
        this.ClearDisappearTimer();
        this.ClearAppearTimer();

        var indexPath = this.GetMenuIndexPathById(hoverItem.name, false);
        if(indexPath == ""){
            indexPath = this.GetIndexPathById(hoverItem.name, true);
            var level = this.GetMenuLevel(indexPath);
            var menuElement = this.GetMenuElement(indexPath);
            var id = (menuElement != null) ? menuElement.id : "";
            aspxGetMenuCollection().HidePopupMenus(level - 1, this.name, false, id);

            this.SetAppearTimer(indexPath);
        }
    },
    OnBeforeItemOver: function(hoverItem, hoverElement){
        var indexPath = this.GetItemIndexPathById(hoverItem.name);
        var element = this.GetMenuElement(indexPath);
        if(_aspxIsExists(element)) this.CancelSubMenuItemHoverItem(element);
    },
    OnItemOverTimer: function(indexPath){
        if(this.IsAppearTimerActive()){
            this.ClearAppearTimer();
            if(this.GetItemImageCell(indexPath) != null || this.GetItemIndentCell(indexPath) != null ||
                this.GetItemTextCell(indexPath) != null || this.GetItemPopOutImageCell(indexPath) != null){
                this.ShowSubMenu(indexPath);
            }
        }
    },
    OnAfterItemOut: function(hoverItem, hoverElement){
        if(hoverItem.name == "" || this.lockHoverEvents) return;
        
        this.ClearDisappearTimer();
        this.ClearAppearTimer();
        this.SetDisappearTimer();
        
        var indexPath = this.GetItemIndexPathById(hoverItem.name);
        var element = this.GetMenuElement(indexPath);
        if(element != null) 
            this.ApplySubMenuItemHoverItem(element, hoverItem, hoverElement);
    },
    OnItemOutTimer: function(){
        if(this.IsDisappearTimerActive()){
            this.ClearDisappearTimer();
            if(aspxGetMenuCollection().CheckFocusedElement())
                this.SetDisappearTimer();
            else
                aspxGetMenuCollection().HidePopupMenus(0, this.name, true, "");
        }
    }
});

ASPxClientMenuCollection = _aspxCreateClass(ASPxClientCollection, {
	constructor: function(){
		this.constructor.prototype.constructor.call(this);

        this.appearTimerID = -1;
        this.disappearTimerID = -1;
        this.visibleSubMenusMenuName = "";
        this.visibleSubMenuIds = new Array();
    },

    RegisterVisiblePopupMenu: function(name, id){
        _aspxArrayPush(this.visibleSubMenuIds, id);
        this.visibleSubMenusMenuName = name;
    },
    UnregisterVisiblePopupMenu: function(name, id){
        _aspxArrayRemove(this.visibleSubMenuIds, id);
        if(this.visibleSubMenuIds.length == 0)
            this.visibleSubMenusMenuName = "";
    },

    GetMenu: function(id){
        return this.Get(this.GetMenuName(id));
    },
    GetMenuName: function(id){
        var pos = id.lastIndexOf(aspxMMIdSuffix);
        if(pos == -1) 
            pos = id.lastIndexOf(aspxMIIdSuffix);
        if(pos > -1) 
            return id.substring(0, pos);
        return id;
    },
    GetMenuLevel: function(indexPath){
        if(indexPath == "")
            return 0;
        else{
            var indexes = this.GetItemIndexes(indexPath);
            return indexes.length;
        }
    },
    GetMenuLevelById: function(id, isMenu){    
        var indexPath = this.GetIndexPathById(id, isMenu);
        return this.GetMenuLevel(indexPath);
    },
    GetIndexPathById: function(id, isMenu){
        var idSuffix = isMenu ? aspxMMIdSuffix : aspxMIIdSuffix;
        var pos = id.lastIndexOf(idSuffix);
        if(pos > -1){
            id = id.substring(pos + idSuffix.length);
            pos = id.lastIndexOf("_");
            if(pos > -1) 
                return id.substring(0, pos);
        }
        return "";
    },
    GetItemIndexPath: function(indexes){
        var indexPath = "";
        for(var i = 0; i < indexes.length; i ++){
            indexPath += indexes[i];
            if(i < indexes.length - 1)
                indexPath += __aspxItemIndexSeparator;
        }
        return indexPath;
    },
    GetItemIndexes: function(indexPath){
        return indexPath.split(__aspxItemIndexSeparator);
    },
    
    ClearAppearTimer: function(){
        if(this.appearTimerID > -1){
            window.clearTimeout(this.appearTimerID);
            this.appearTimerID = -1;
        }        
    },
    ClearDisappearTimer: function(){
        if(this.disappearTimerID > -1){
            window.clearTimeout(this.disappearTimerID);
            this.disappearTimerID = -1;
        }        
    },
    SetAppearTimer: function(name, indexPath, timeout){
        this.appearTimerID = window.setTimeout("aspxMIMOverTimer(\"" + name + "\", \"" + indexPath + "\")", timeout);
    },
    SetDisappearTimer: function(name, timeout){
        this.disappearTimerID = window.setTimeout("aspxMIMOutTimer(\"" + name + "\")", timeout);
    },
    GetMouseDownMenuLevel: function(evt){
        var srcElement = _aspxGetEventSource(evt);
        if(this.visibleSubMenusMenuName != ""){
            var element = _aspxGetParentById(srcElement, this.visibleSubMenusMenuName);
            if(element != null) return 1;
        }
        for(var i = 0; i < this.visibleSubMenuIds.length; i ++){
            var element = _aspxGetParentById(srcElement, this.visibleSubMenuIds[i]);
            if(element != null)
                return this.GetMenuLevelById(this.visibleSubMenuIds[i], true) + 1;
        }
        return -1;
    },
    CheckFocusedElement: function(){
        if(document.activeElement != null){
            for(var i = 0; i < this.visibleSubMenuIds.length; i ++){
                var menuElement = _aspxGetElementById(this.visibleSubMenuIds[i]);
                if(menuElement != null && _aspxGetIsParent(menuElement, document.activeElement))
                    return true;
            }
        }
        return false;
    },
    HidePopupMenus: function(level, name, leavePopups, exceptId){
        for(var i = 0; i < this.visibleSubMenuIds.length; i ++){
            var menu = this.GetMenu(this.visibleSubMenuIds[i]);
            if(menu != null){
                var menuLevel = this.GetMenuLevelById(this.visibleSubMenuIds[i], true);
                if((!leavePopups || menuLevel > 0) && exceptId != this.visibleSubMenuIds[i]){
                    if(menuLevel > level || (menu.name != name && name != "")){
                        var element = _aspxGetElementById(this.visibleSubMenuIds[i]);
                        if(element != null)
                            menu.DoHidePopupMenu(element);
                        i --;
                    }
                }
            }
        }
    },
    
    OnMouseDown: function(e){
        var menuLevel = this.GetMouseDownMenuLevel(e);
        this.HidePopupMenus(menuLevel, "", false, "");	
    }
});

var __aspxMCollection = null;
function aspxGetMenuCollection(){
    if(__aspxMCollection == null)
        __aspxMCollection = new ASPxClientMenuCollection();
    return __aspxMCollection;
}

ASPxClientMenu = _aspxCreateClass(ASPxClientMenuBase, {
	constructor: function(name){
		this.constructor.prototype.constructor.call(this, name);
        this.isVertical = false;
    },

    IsVertical: function(indexPath){
        return this.isVertical || (indexPath.indexOf(__aspxItemIndexSeparator) > -1);
    }
});

function aspxMIClick(name, indexPath){
    var menu = aspxGetMenuCollection().Get(name);
    if(menu != null) menu.OnItemClick(indexPath);
    return true;
}
function aspxMILClick(evt, name, indexPath){
    var menu = aspxGetMenuCollection().Get(name);
    if(menu != null) menu.OnItemLinkClick(indexPath);
    evt.cancelBubble = true;
}
function aspxAMIMOver(source, args){
    var menu = aspxGetMenuCollection().GetMenu(args.item.name);
    if(menu != null) menu.OnAfterItemOver(args.item, args.element);
}
function aspxBMIMOver(source, args){
    var menu = aspxGetMenuCollection().GetMenu(args.item.name);
    if(menu != null) menu.OnBeforeItemOver(args.item, args.element);
}
function aspxMIMOverTimer(name, indexPath){
    var menu = aspxGetMenuCollection().Get(name);
    if(menu != null) menu.OnItemOverTimer(indexPath);
}
function aspxAMIMOut(source, args){
    var menu = aspxGetMenuCollection().GetMenu(args.item.name);
    if(menu != null) menu.OnAfterItemOut(args.item, args.element);
}
function aspxMIMOutTimer(name){
    var menu = aspxGetMenuCollection().Get(name);
    if(menu != null) menu.OnItemOutTimer();
}
function aspxMContextMenu(evt){
    evt.cancelBubble = true;
    return false;
}

_aspxAttachEventToElement(window, "load", aspxMenuWindowOnLoad);
function aspxMenuWindowOnLoad(evt){
    aspxAddAfterSetHoverState(aspxAMIMOver);
    aspxAddAfterClearHoverState(aspxAMIMOut);
    aspxAddBeforeSetHoverState(aspxBMIMOver);
}
_aspxAttachEventToDocument("mousedown", aspxMenuDocumentMouseDown);
function aspxMenuDocumentMouseDown(evt){
    return aspxGetMenuCollection().OnMouseDown(evt);	
}