ASPxClientNavBar = _aspxCreateClass(ASPxClientControl, {
	constructor: function(name){
		this.constructor.prototype.constructor.call(this, name);
    
        this.animationOffset = 10;
        this.animationDelay = 10;
        this.animationMaxDelay = 400;
        this.autoCollapse = false;
        this.allowExpanding = true;
        this.allowSelectItem = false;
        this.cookieName = "";
        this.groupCount = 0;
        this.enableAnimation = false;
        this.groups = [];
        this.groupsExpanding = new Array();
        
        this.ItemClick = new ASPxClientEvent();
        this.ExpandedChanged = new ASPxClientEvent();
        this.ExpandedChanging = new ASPxClientEvent();
        this.HeaderClick = new ASPxClientEvent();
    },    
    Initialize: function(){
        if(this.allowSelectItem){
            var inputElement = this.GetSelectedItemInputElement();
            if(inputElement != null){
                var element = this.GetItemTextElementByIndexPath(inputElement.value);
                if(element != null)
                    aspxGetStateController().SelectElementBySrcElement(element);
            }
        }
        this.constructor.prototype.Initialize.call(this);
    },
    InitializeCallBackData: function(){
        for(var i = 0; i < this.GetGroupCountCore(); i ++){
            if(this.groupsExpanding[i]){
                var element = this.GetGroupContentElement(i);
                if(element != null) element.loaded = true;
            }
        }
    },    
    GetClickableGroupHeaderElement: function(index) {
        var isDisplayed = false;
        var element = this.GetGroupHeaderExpandedElement(index);
        if (element != null) isDisplayed = !_aspxGetElementDisplay(element) || !this.allowExpanding ;
        
        if (!isDisplayed)
            element = this.GetGroupHeaderCollapsedElement(index);
        return element;
    },
    GetGroupHeaderExpandedElement: function(index){
        return this.GetChild("_GHE" + index);
    },
    GetGroupHeaderCollapsedElement: function(index){
        return this.GetChild("_GHC" + index);
    },
    GetGroupContentElement: function(index){
        return this.GetChild("_GC" + index);
    },
    GetGroupContentAnimationElement: function(index){
        return this.GetChild("_GCA" + index);
    },
    GetRowElement: function(cellElement){
        return _aspxGetParentNode(cellElement);
    },
    GetItemElement: function(groupIndex, itemIndex){
        return this.GetChild("_I" + this.GetIndexPath(groupIndex, itemIndex) + "_");
    },
    GetItemTextElementByIndexPath: function(indexPath){
        return this.GetChild("_I" + indexPath + "_T");
    },
    GetItemImageElementByIndexPath: function(indexPath){
        return this.GetChild("_I" + indexPath + "_I");
    },

    GetGroupStateInputElement: function(index){
        return _aspxGetElementById(this.name + "GS");
    },
    GetSelectedItemInputElement: function(){
        return _aspxGetElementById(this.name + "SI");
    },
    
    DoItemClick: function(groupIndex, itemIndex, hasItemLink, htmlEvent){
        var processOnServer = this.autoPostBack || this.IsServerEventAssigned("ItemClick");
        if(_aspxIsExists(this.RaiseItemClick))
            processOnServer = this.RaiseItemClick(groupIndex, itemIndex, htmlEvent);
        if(processOnServer && !hasItemLink)
            this.SendPostBack("CLICK:" + this.GetIndexPath(groupIndex, itemIndex));
    },
    SetExpandedInternal: function(groupIndex, expanded){
        if(expanded == this.groupsExpanding[groupIndex]) return;
        
        var processingMode = this.autoPostBack ? "Server" : "Client";
        if(_aspxIsExists(this.RaiseExpandedChanging))
            processingMode = this.RaiseExpandedChanging(groupIndex);
        if(processingMode == "Client"){
            if(expanded || !this.autoCollapse){
                if(this.autoCollapse){
                    for(var i = 0; i < this.GetGroupCountCore(); i ++){
                        if(i != groupIndex && this.groupsExpanding[i])
                            this.ChangeExpanding(i, false);
                    }
                }
                this.ChangeExpanding(groupIndex, expanded);
            }
        }
        else if(processingMode == "Server")
            this.SendPostBack("EXPAND:" + groupIndex);
    },
    ChangeExpanding: function(groupIndex, expanded){
        var element = this.GetGroupContentElement(groupIndex);
        if(expanded && _aspxIsFunction(this.callBack)  && element != null && !element.loaded){
            this.DoChangeExpanding(groupIndex, expanded, false);
            if(!element.loading){
                element.loading = true;
                this.CreateLoadingPanelInsideContainer(this.GetGroupContentElement(groupIndex));
                this.CreateCallback(groupIndex);
            }
        }
        else{
            this.DoChangeExpanding(groupIndex, expanded, this.enableAnimation);
            
            if(!this.enableAnimation && _aspxIsExists(this.RaiseExpandedChanged))
                this.RaiseExpandedChanged(groupIndex);
        }
    },
    DoChangeExpanding: function(groupIndex, expanded, doAnimation){
        if(doAnimation){
            var element = this.GetGroupContentAnimationElement(groupIndex);
            var contentElement = this.GetGroupContentElement(groupIndex);
            if(element != null && contentElement != null){
                if(expanded){
                    element.style.height = "0px";
                    _aspxSetElementDisplay(this.GetRowElement(contentElement), true);
                    if(__aspxNS && !__aspxFirefox){
                        var innerElement = _aspxGetChildByTagName(element, "TABLE", 0);
                        if(innerElement != null)
                            element.style.width = innerElement.offsetWidth + "px";
                        else{
                            innerElement = _aspxGetChildByTagName(element, "UL", 0);
                            if(innerElement != null)
                                element.style.width = element.clientWidth + "px";
                        }
                    }
                }
                else{
                    element.style.height = element.offsetHeight + "px";
                }
                element.style.overflow = "hidden";
                element.expanding = expanded;
                element.animationCount = 1;
                element.animationStart = new Date();
                element.timerID = window.setTimeout("aspxNBAnimT(\"" + this.name + "\", " + groupIndex + ")", this.animationDelay);
            }
            else
                this.ChangeGroupExpandState(groupIndex, expanded);
        }
        else
            this.ChangeGroupExpandState(groupIndex, expanded);
    },
    ChangeGroupExpandState: function(groupIndex, expanded){
        var element = this.GetGroupContentElement(groupIndex);
        if(element != null) _aspxSetElementDisplay(this.GetRowElement(element), expanded);
        element = this.GetGroupHeaderExpandedElement(groupIndex);
        if(element != null) _aspxSetElementDisplay(this.GetRowElement(element), expanded);
        element = this.GetGroupHeaderCollapsedElement(groupIndex);
        if(element != null) _aspxSetElementDisplay(this.GetRowElement(element), !expanded);
        
        this.groupsExpanding[groupIndex] = expanded;
        this.UpdateGroupStateInputElement();
        this.UpdateGroupStateCookie();
    },
    
    GetGroupCountCore: function(){
        return (this.groups.length > 0) ? this.groups.length : this.groupCount;
    },
    GetIndexPath: function(groupIndex, itemIndex){
        return (groupIndex != -1 && itemIndex != -1) ? groupIndex + __aspxItemIndexSeparator + itemIndex : "";
    },
    GetGroupIndex: function(indexPath){
        var indexes = indexPath.split(__aspxItemIndexSeparator);
        return (indexes.length > 0) ? indexes[0] : -1;
    },
    GetItemIndex: function(indexPath){
        var indexes = indexPath.split(__aspxItemIndexSeparator);
        return (indexes.length > 1) ? indexes[1] : -1;
    },
    
    GetGroupState: function(){
        var state = "";
        for(var i = 0; i < this.GetGroupCountCore(); i ++) {
            state += this.groupsExpanding[i] ? "1" : "0";
            if(i < this.GetGroupCountCore() - 1) state += ";";
        }
        return state;
    },
    UpdateGroupStateCookie: function(){
        if(this.cookieName == "") return;

        _aspxDelCookie(this.cookieName, this.GetGroupState());
        _aspxSetCookie(this.cookieName, this.GetGroupState());
    },
    UpdateGroupStateInputElement: function(){
        var element = this.GetGroupStateInputElement();
        if(element != null) element.value = this.GetGroupState();
    },
    
    UpdateHoverState: function(groupIndex){
        var element = this.groupsExpanding[groupIndex] ? this.GetGroupHeaderExpandedElement(groupIndex) : 
            this.GetGroupHeaderCollapsedElement(groupIndex);
        if(element != null) aspxGetStateController().SetCurrentHoverElementBySrcElement(element);
    },
    SetSelectedItemInternal: function(groupIndex, itemIndex, modifyHotTrackSelection){
        if(modifyHotTrackSelection)
            this.SetHoverElement(null);
        var indexPath = this.GetIndexPath(groupIndex, itemIndex);
        if(this.allowSelectItem){
            var inputElement = this.GetSelectedItemInputElement();
            if(inputElement != null){
                var element = this.GetItemTextElementByIndexPath(inputElement.value);
                if(element != null)
                    aspxGetStateController().DeselectElementBySrcElement(element);
                inputElement.value = indexPath;
                element = this.GetItemTextElementByIndexPath(inputElement.value);
                if(element != null)
                    aspxGetStateController().SelectElementBySrcElement(element);
            }
        }
        if(modifyHotTrackSelection){
            var element = this.GetItemTextElementByIndexPath(indexPath);
            if(element != null) this.SetHoverElement(element);
        }
    },
    SetHoverElement: function(element){
        aspxGetStateController().SetCurrentHoverElementBySrcElement(element);
    },
    
    OnAnimationTimer: function(groupIndex){
        var element = this.GetGroupContentAnimationElement(groupIndex);
        if(element != null){
            window.clearTimeout(element.timerID);
            
            var animationOffset = this.animationOffset * element.animationCount;
            var height = element.offsetHeight + (element.expanding ? animationOffset : -animationOffset);
            var innerElement = _aspxGetChildByTagName(element, "TABLE", 0);
            if(innerElement == null)
                innerElement = _aspxGetChildByTagName(element, "UL", 0);
            var finished = (element.expanding ? (height >= innerElement.offsetHeight) : (height <= 0)) ||
                (new Date() - element.animationStart > this.animationMaxDelay);
            if(finished){
                this.ChangeGroupExpandState(groupIndex, element.expanding);
                    
                element.style.overflow = "";
                element.style.height = "";
                element.style.width = "";
            
                if(_aspxIsExists(this.RaiseExpandedChanged))
                    this.RaiseExpandedChanged(groupIndex);
            }
            else{
                element.style.height = height + "px";
                element.animationCount ++;
                element.timerID = window.setTimeout("aspxNBAnimT(\"" + this.name + "\", " + groupIndex + ")", this.animationDelay);
            }
        }
    },
    OnHeaderClick: function(groupIndex, evt){
        var processingMode = this.autoPostBack || this.IsServerEventAssigned("HeaderClick") ? "Server" : "Client";
        if(_aspxIsExists(this.RaiseHeaderClick))
            processingMode = this.RaiseHeaderClick(groupIndex, evt);
            
        var isLinkClicked = (_aspxGetParentByTagName(_aspxGetEventSource(evt), "A") != null);
        if(!isLinkClicked){
            if(processingMode == "Client" && this.allowExpanding){
                var expanded = this.groupsExpanding[groupIndex];
                this.SetExpandedInternal(groupIndex, !expanded);
                this.UpdateHoverState(groupIndex);
            }
            else if(processingMode == "Server")
                this.SendPostBack("HEADERCLICK:" + groupIndex);
        }
    },
    OnItemClick: function(groupIndex, itemIndex, evt){
        var element = this.GetItemElement(groupIndex, itemIndex);
        var isLinkClicked = (_aspxGetParentByTagName(_aspxGetEventSource(evt), "A") != null);
        var linkElement = (!isLinkClicked && element != null) ? _aspxGetChildByTagName(element, "A", 0) : null;

        this.SetSelectedItemInternal(groupIndex, itemIndex, true);
        this.DoItemClick(groupIndex, itemIndex, isLinkClicked || (linkElement != null), evt);

        if(linkElement != null) 
            _aspxNavigateUrl(linkElement.href, linkElement.target);
    },
    OnCallbackInternal: function(result, isError){
        var pos = result.indexOf(__aspxCallBackSeparator);
        if(pos > -1){
            var callBackGroupIndex = parseInt(result.substr(0, pos));
            var element = this.GetGroupContentElement(callBackGroupIndex);
            if(element != null){
                result = result.substring(pos + __aspxCallBackSeparator.length);
                if(result != ""){
                    element.innerHTML = result;
                    element.loaded = true;
                    element.loading = false;
                    
                    if(!isError && _aspxIsExists(this.RaiseExpandedChanged))
                        this.RaiseExpandedChanged(callBackGroupIndex);
                }
                else
                    this.SendPostBack("");
            }
        }
    },
    OnCallback: function(result){
        this.OnCallbackInternal(result, false);
    },
    OnCallbackError: function(result){
        this.OnCallbackInternal(result, true);
    }
});

function aspxNBAnimT(name, groupIndex){
    var nb = aspxGetControlCollection().Get(name);
    if(nb != null) nb.OnAnimationTimer(groupIndex);
}
function aspxNBHClick(evt, name, groupIndex){
    var nb = aspxGetControlCollection().Get(name);
    if(nb != null) nb.OnHeaderClick(groupIndex, evt);
    evt.cancelBubble = true;
    return true;
}
function aspxNBIClick(evt, name, groupIndex, itemIndex){
    var nb = aspxGetControlCollection().Get(name);
    if(nb != null) nb.OnItemClick(groupIndex, itemIndex, evt);
    evt.cancelBubble = true;
    return true;
}