gnm.CATEGORY_NAV_IS_ACTIVE = true

gnm.topCatInfos = {}
gnm.subCatInfos = {}

gnm.expandedTopCatIds = []
gnm.selectedSubCatId = '0'
gnm.currSubCatElem = null

gnm.animatingNav = false

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

function setNavCookies()
{
    var s = gnm.expandedTopCatIds.join(',')
    if (s.length == 0) s = '0'
    setCookie('gnm_expanded_top_cats',s)
    setCookie('gnm_selected_sub_cat',gnm.selectedSubCatId)
}

// Toggle the open/closed state of a top-level nav category
function toggleNavCatagoryOpenState(liElement,id)
{
    var aElement = liElement.down('a')
    aElement.toggleClassName('opened')
    
    var ulElement = liElement.down('ul')
    
    gnm.animatingNav = true
    if (aElement.hasClassName('opened'))
    {
        gnm.expandedTopCatIds.push(id)
        
        new Effect.Opacity(ulElement,{duration:0.5,from:0.0,to:1.0})
        new Effect.BlindDown(ulElement,{duration:0.5, afterFinish: function() { gnm.animatingNav = false } })
    }
    else
    {
        gnm.expandedTopCatIds = gnm.expandedTopCatIds.without(id)
        
        new Effect.Opacity(ulElement,{duration:0.5,from:1.0,to:0.0})
        new Effect.BlindUp(ulElement,{duration:0.5, afterFinish: function() { gnm.animatingNav = false } })
    }
}

// User clicked on a top level category in the left nav.  Toggle expand/collapse
function onTopCatClick(event)
{
    var clickedElement = event.element()
    var liElement = clickedElement.parentNode
    var idStr = liElement.id
    var id = idStr.match(/[0-9]+$/)
    if (id === null) return
    
    event.stop()

    // Toggle the top level category unless one of its subcategories is currently selected
    // (effectively this only prevents closing it since we can't go to the state where it's
    // closed), or it's currently animating
    if (gnm.selectedSubCatId != 0 && gnm.subCatInfos[gnm.selectedSubCatId].top_category_id == id) return
    if (gnm.animatingNav) return
    
    toggleNavCatagoryOpenState(liElement,id)
    setNavCookies()
}

// User clicked on a subcategory in the left nav.  Move the cursor to the new subcategory
// (there is typically a delay before the new page loads in the browser; we want the visual
// state to update immediately)
function onSubCatClick(event)
{
    var clickedElement = Event.element(event)       // TODO: event.element()
    var liElement = clickedElement.parentNode
    var idStr = liElement.id
    var id = idStr.match(/[0-9]+$/)
    if (id === null) return
    
    // Un-highlight previous subcategory, if any
    if (gnm.currSubCatElem !== null) gnm.currSubCatElem.down('a').removeClassName('current_subcat')
    
    // Highlight new subcategory
    var elem = $('sub_nav_' + id)
    elem.down('a').addClassName('current_subcat')
    gnm.currSubCatElem = elem
    
    setNavCookies()
}

function initCategoryNav()
{
    var navElement = $('nav')
    
    var topNavElements = navElement.childElements()
    topNavElements.each(function(topElement)
    {
        var id = topElement.id.match(/[0-9]+/)[0]
        var aElement = topElement.childElements()[0]
        var name = aElement.innerHTML
        var url = aElement.getAttribute('href')
        gnm.topCatInfos[id] = { id:id, name:name, url:url, sub_category_ids: []}
        var topCatInfo = gnm.topCatInfos[id]
        
        var subNavElements = topElement.select('li')
        subNavElements.each(function(subElement)
        {
            var id = subElement.id.match(/[0-9]+/)[0]
            var aElement = subElement.childElements()[0]
            var name = aElement.innerHTML
            var url = aElement.getAttribute('href')
            
            topCatInfo.sub_category_ids.push(id)
            
            gnm.subCatInfos[id] = { id:id, name:name, url:url, top_category_id:topCatInfo.id }
        })
    })
    
    // Extract expand/collapse state data from the DOM
    var a = navElement.select('a.opened')
    a = a.collect(function(elem) { return elem.parentNode.id })
    gnm.expandedTopCatIds = a.collect(function(str) { return str.match(/[0-9]+/)[0] })
    //trace('gnm.expandedTopCatIds: ' + gnm.expandedTopCatIds.join(' '))
    
    a = navElement.select('a.current_subcat')
    if (a.length == 0) gnm.selectedSubCatId = '0'
    else gnm.selectedSubCatId = a[0].parentNode.id.match(/[0-9]+/)[0]
    //trace('gnm.selectedSubCatId: ' + gnm.selectedSubCatId)
    
    // Register observers for all top categories
    var topCatIds = $H(gnm.topCatInfos).keys()
    for (var i = 0; i < topCatIds.length; i++)
    {
        var topCatInfo = gnm.topCatInfos[topCatIds[i]]
        var elem = $('top_nav_' + topCatInfo.id)
        elem.down('a').observe('click',onTopCatClick)
    }
    
    // Register observers for all subcategories
    var subCatIds = $H(gnm.subCatInfos).keys()
    for (var i = 0; i < subCatIds.length; i++)
    {
        var subCatInfo = gnm.subCatInfos[subCatIds[i]]
        var elem = $('sub_nav_' + subCatInfo.id)
        var aElem = elem.down('a').observe('click',onSubCatClick)
        if (aElem.hasClassName('current_subcat')) gnm.currSubCatElem = elem
    }
}
