isMultiMenu = true;

//
// Displays side menu.
//
// NOTES:
//
// . The flag isMenuSortable. It is used
//   to disable the drag & drop of sidebar 
//   menu pages. 
//
//   Disalbling is peformed at site map and 
//   other non-page screens.
//
// . LI IDs start with 'C', as to differentiate
//   them from IDs of LIs of site map. 
//   Otherwise, site map will malfunction.
//
function DisplaySidebarMenu(cats, selAncLibName, isMenuSortable)
{               
    var str = '';
    var url;
    var isSel;
    var classStr;
    var t;
    
    var first = true;
    var levelDiff;
    var formerLevel;
    var isSameLevelAsFormer;
    var isCloseSubTree;
    var isOpenSubTree;
    var isTopLevel;
    
    //
    // Set a flag for multi menu display.
    // It will be false for IE < 7.
    //
    if ($.browser.msie)
    {
        var version = parseInt($.browser.version.substr(0,1));
        
        if (version < 7)
        {
            isMultiMenu = false;
        }
    }      
        
    //
    // Display the home page (displayed seperately 
    // from dragable links).
    //
    t = cats[0].split("-");
    
    currentLevel = t[0];
    catId = t[1];
    libName = t[2];
    catStatus = t[3];
    t.shift();    
    t.shift();    
    t.shift();
    t.shift();
    title = t.join("-");
          
    if (isHtmlMode)
    {
        url = '../';
    }
    
    else
    {
        url = AppendUrl(JS_MODULE_WLIB_CATEGORY+'?'+catId);
    }
    
    isSel = (libName == selAncLibName);
    
    classStr = (isSel) ? 'class="selected"' : '';
    
    str += '<ul><li><a '+classStr+' href="'+url+'">'+title+'</a></li></ul>';   
    
    //
    // Display non homepage menu links.
    //
    str += '<ul id="UlSidebarMenu">';
    
    for (i=1; i<cats.length; i++)
    {
        t = cats[i].split("-");
        
        //
        // Parse category data:
        //
        // . ID.
        // . Library name.
        // . Title.
        //
        currentLevel = t[0];
        catId = t[1];
        libName = t[2];
        catStatus = t[3];
        t.shift();
        t.shift();
        t.shift();
        t.shift();
        title = t.join("-");
        
        isTopLevel = (currentLevel == 0);
        isSel = (libName == selAncLibName);
        
        //
        // Genereate page URL, either relative
        // (html page) or admin URL.
        //
        if (isHtmlMode)
        {
            url = '../'+libName;
        }
        
        else
        {
            url = AppendUrl(JS_MODULE_WLIB_CATEGORY+'?'+catId);
        }
        
        //
        // Append HTML menu item to string.
        //
        classStr = '';
        
        if (isSel && isTopLevel)
        {
            classStr = 'class="selected handle"';
        }
        else if (isSel)
        {
            classStr = 'class="selected"';
        }
        else if (isTopLevel)
        {
            classStr = 'class="handle"';
        }
        
        //
        // Case first element.
        //
        if (first)
        {
            first = false;
            formerLevel = currentLevel;

            str += '<li id="C'+catId+'"><a '+classStr+' href="'+url+'"><span id="side-menu'+libName+'">'+title+'</span></a>';
        }
        
        //
        // Case other elements.
        //
        else                                   
        {
            //
            //
            //
            if (!isMultiMenu && (currentLevel != 0))
            {
                continue;
            }
            
            //
            // Set level difference.
            //
            levelDiff = currentLevel - formerLevel;
            formerLevel = currentLevel;
            
            isSameLevelAsFormer = (levelDiff == 0);
            isOpenSubTree = (levelDiff == 1);
            isCloseSubTree = (levelDiff <= -1);

            //
            // Case close former element.
            //
            // NOTE that former element remains open 
            // if it contains a sub-tree.
            //
            if ((isSameLevelAsFormer) || (isCloseSubTree))
            {
                str += '</li>'; 
            }
            
            //
            // Case close sub-tree.
            //
            if (isCloseSubTree)
            {
                for (j=0; j<(-1*levelDiff); j++)
                {
                    str += '</ul></li>';
                } 
            }
            
            //
            // Case open a new sub-tree.
            //
            if (isOpenSubTree)
            {
                str += '<ul>';
            }
            
            //
            // Start display current tree element.
            //          
            str += '<li id="C'+catId+'"><a '+classStr+' href="'+url+'"><span id="side-menu'+libName+'">'+title+'</span></a>';
        }
    }
    
    //    
    // End last element
    //
    str += '</li>';

    //
    // End sub-trees.
    //
    if (isMultiMenu)
    {
        for (i=0; i<currentLevel; i++)
        {
            str += '</ul></li>';
        } 
    }

    //
    // End main UL.
    //
    str += '</ul>';

    //
    // Append hover image hidden item, in order 
    // to load hover image on page load.
    //
    str += '<ul style="display: none"><li><a class="hover">Hello</a></li></ul>';
    
    //
    // Update sidebar menu.
    //
    $('#BoxAlphaMenu').html(str);
    
    //    
    // jQuery for making transitions smooth.
    //
    $("#UlSidebarMenu ul").css({display: "none"}); // Opera Fix
    $("#UlSidebarMenu li").hover
    (
        function()
        {
            $(this).find('ul:first').css({visibility: "visible",display: "none"}).show(400);
        },
        
        function()
        {
            $(this).find('ul:first').css({visibility: "hidden",display: "none"}).hide();
        }
    );
    
    //
    // jQuery for making side menu sortable.
    //
    // See: http://docs.jquery.com/UI/Sortable
    //
    if (isMenuSortable)
    {
        $("#UlSidebarMenu").sortable(
        { 
            handle : '.handle', 
            update : function () 
            { 
                var order = $('#UlSidebarMenu').sortable('toArray'); 
                xajax_ajax_update_same_level_cat_order(order);
            } 
        }); 
    }
}
