// Node definition
function treeNode(info, level, label, children, url, image) 
{
    this.info = info;
    this.level = level;
    this.label = label;
    this.image = image;
    this.children = children;
    this.url = url;
}


// Variables
var catalogTreeArray = [null, null];

var catalogTree;
                
var selectedNodeArray = [null, null];

var maxLabelChars = [31, 31, 31, 31];

var cookieNameArray = ["treeLavoraConNoi0","treeLavoraConNoi1"];

iconOpen = new Image();
iconOpen.src = "/portalWeb/resources/images/coopVoce/openBranch.gif";

iconClosed = new Image();
iconClosed.src = "/portalWeb/resources/images/coopVoce/closedBranch.gif";


// Tree functions
function cutLabel(label, maxLabelChars)
{
    if (label.indexOf("grave;") != -1)
        var lungh = label.length - 7;
    else
        var lungh = label.length;

    if (lungh <= maxLabelChars)
        return label;
    else
        return label.substr(0, maxLabelChars) + "..." ;
}


function replaceAll(str, from, to)
{
    var idx = str.indexOf(from);

    while (idx > -1)
    {
        str = str.replace(from, to); 
        idx = str.indexOf(from);
    }

    return str;
}


function HTMLescape(label)
{
    label = replaceAll(label, "<", "&lt;");
    label = replaceAll(label, ">", "&gt;");
    label = replaceAll(label, "\"", "&quot;");

    //label = label.replace("\"/g", "quote");

    return label;
}


function getNodeByIndexes(indexes, maxLevel , indice)
{
    // First 0 is catalogTree, must remove it
    //alert("getnodeIndex prima: "+indexes)
    indexes = indexes.substr(3);
    // 29/10/2007
    //alert("getNodeByIndexes dopo :"  + indexes);
    if (typeof(indice) != "undefined")
    {
        //alert("cisono");
        catalogTree = catalogTreeArray[indice]
    }
    return getNodeByIndexes2(catalogTree, indexes, maxLevel);
}


function getNodeByIndexes2(tree, indexes, maxLevel)
{
    if (indexes == "")
        return tree;
    
    if (maxLevel > -1)
    {
        if (tree.level >= maxLevel)
            return tree;
    }

    var index = "";
    //alert("getnode2 index :"+indexes);
    if (indexes.indexOf("-") >= 0)
    {
        index = indexes.substr(0, indexes.indexOf("-"));
        var remainingIndexes = indexes.substr(indexes.indexOf("-") + 1);

        return getNodeByIndexes2(tree.children[index], remainingIndexes, maxLevel);
    }    
    else
    {
        index = indexes;
        
        return tree.children[index];
    }
}


function cutIndexesByLevel(indexes, maxLevel)
{
    //alert("CUTINDEXESBYLEVEL");
    var index = "";
    var remainingIndexes = "";
    
    var i = indexes.indexOf("-");
    
    if (i >= 0)
    {
        index = indexes.substr(0, i);
        remainingIndexes = indexes.substr(i + 1);
    }
    else
        index = indexes;
    
    //alert("indexes= " + indexes + ", index: " + index + ", remainingIndexes: " + remainingIndexes + ", maxLevel= " + maxLevel);

    if (maxLevel == 0 || remainingIndexes == "")
        return index;
    else
        return index + "-" + cutIndexesByLevel(remainingIndexes, maxLevel - 1);
}


function getLevelByIndexes(indexes)
{
    //alert("GETLEVELBYINDEXES, indexes: " + indexes);
    if (indexes.indexOf("-") >= 0)
    {
        var remainingIndexes = indexes.substr(indexes.indexOf("-") + 1);
        //alert("getLevelByIndexes, remainingIndexes: " + remainingIndexes);

        return 1 + getLevelByIndexes(remainingIndexes);
    }
    else
        return 0;
}


function getGroupLevelByIndexes(indexes)
{
    if (indexes.lastIndexOf("-") >= 0)
    {
        var remainingIndexes = indexes.substr(0, indexes.lastIndexOf("-"));
        
        return remainingIndexes + "-0";
    }
    else
        return "0"; 
}


function commonIndexes(index1, index2)
{
    // If one is longer, cut the longest to have the same length
    if (index1.length > index2.length)
        index1 = index1.substr(0, index2.length);
    
    if (index2.length > index1.length)
        index2 = index2.substr(0, index1.length);

    // Try all possible lengths starting from the original value till empty string
    while (index1.length > 0)
    {
        if (index1.indexOf(index2) == 0)
            break;
        
        index1 = index1.substr(0, index1.length - 1);
        index2 = index2.substr(0, index2.length - 1);
    }

    return index1;
}

function doShowDocument(indexes)
{
    var node;
    
    var categoryPath = "";
    
    for (var i = 1; i <= 2 ; i++)
    {
        if (categoryPath != "")
            categoryPath += " > ";
        
        node = getNodeByIndexes(indexes, i);

        categoryPath += node.label;
    }
    
    //alert(node.url);
    document.location.href = node.url;
}

function doShowArticles(indexes)
{
    var node;
    
    var categoryPath = "";

    for (var i = 1; i <= 3 ; i++)
    {
        if (categoryPath != "")
            categoryPath += " > ";
        
        node = getNodeByIndexes(indexes, i);

        categoryPath += node.label;
    }

    node = getNodeByIndexes(indexes, -1);

    var showArticlesLink = "/portalWeb/portlets/workArea/viewChildren.do?SELECTED_LEVEL_ID="
    showArticlesLink += node.info;
    //09-03-2005 FIX FOR accented characters
    //showArticlesLink +="&categoryPath=" + escape(categoryPath);
    showArticlesLink +="&categoryPath=" + encodeURIComponent(categoryPath);
    showArticlesLink +="&jpfScopeID=frame_right"

    try
    {
       //03-02-2005 FIX EXPLORER ERROR REMOVING SCRIPT TAG
       var html = 
            '<html>\n<head>\n<title>Ricerca in corso ...</title>\n</head>\n\n' + 
            '<body style="background-color: #FFFFFF;">\n' + 
            '<div style="margin-top: 100px; width: 520px; text-align: center; ' + 
            'font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px;">' + 
            '<span style="text-decoration: blink; font-weight: bold;">Ricerca in corso ...</span>' + 
            '<br><br>Attendere prego</div>\n\n' +
            '</body>\n</html>';
        
        parent.frame_right.document.write(html);    
    }
    catch(e)
    {
    }

    parent.frame_right.location.href = showArticlesLink;
}

function applyActionToSingleNodeAndSubLevel(indexes, level, itemStatus,  subLevelStatus, indice)
{
    // Input
    // itemStatus: "on", "off"
    // subLevelStatus: "show", "hide", "invert"
    
    // STEO 2007-10-30
    indice = indexes.substr(0,1);
    
    // Item
    var indexesLevel = getLevelByIndexes(indexes);
    var itemIndexes;
    if (indexesLevel > level)
        itemIndexes = cutIndexesByLevel(indexes, level);
    else 
        if (indexesLevel < level)
        for (var i = 0; i < level ; i++)
            itemLevel += "-0";
        else
            itemIndexes = indexes;
    
    //GIBI 2007-10-30
    //alert("applyActionToSingleNodeAndSubLevel: "+(document.getElementById("item" + itemIndexes).className));
    var oldClassName = document.getElementById("item" + itemIndexes).className;
    
    // STEO 2007-10-30h
    // Subtree and icon
    var node = getNodeByIndexes(itemIndexes, -1 , indice);

    if (node.url != null && subLevelStatus == "show")
        document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-' + itemStatus;
    
    if (node.url != null && subLevelStatus == "hide")
        document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-' + itemStatus;                
        
    if (node.children != null)
    {
        //alert("applyActionToSingleNodeAndSubLevel: sono nel if "+subLevelStatus);
        var groupIndexes = "group" + itemIndexes + '-0';
        
        if (subLevelStatus == "invert")
        {   
                var currentStatus = document.getElementById(groupIndexes).style.display;
                
                if (oldClassName.substr(oldClassName.indexOf("-")+1, oldClassName.length) == "on")
                {
                    //alert(document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-off');
                    document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-off';
                }
                else
                {
                    //alert(document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-on');
                    document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-on';
                }
                
                document.getElementById(groupIndexes).style.display = 
                    (currentStatus == 'block' ? 'none' : 'block');
                
        }
        else
            if (subLevelStatus == "show")
            {
                document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-' + itemStatus;        
                document.getElementById(groupIndexes).style.display = 'block';
                //document.images["icon" + itemIndexes].src = iconOpen.src;
            }
            else
            {
                document.getElementById("item" + itemIndexes).className = 'item_' + indice + '_' + level + '-' + itemStatus;        
                document.getElementById(groupIndexes).style.display = 'none';
                //document.images["icon" + itemIndexes].src = iconClosed.src;
            }
    }
}



function doAction(indexes, execute, indice)
{
    
    catalogTree = catalogTreeArray[indice];
    //alert("DOACTION indexes" + indexes);
    
    var oldSelectedNodeIndexes = selectedNodeArray[indice];
    var oldLevel = getLevelByIndexes(oldSelectedNodeIndexes);
    //alert("oldSelectedNodeIndexes: " + oldSelectedNodeIndexes);
    //alert("oldLevel: " + oldLevel);

    var newSelectedNodeIndexes = indexes;
    var newLevel = getLevelByIndexes(newSelectedNodeIndexes);
    //alert("newSelectedNodeIndexes: " + newSelectedNodeIndexes);
    //alert("newLevel: " + newLevel);
    
    var node = getNodeByIndexes(indexes, -1);

    // Root: it's not allowed to select it => no action
    if (newLevel == 0)
        return;
                    
    // Same node, do something only is it's a leaf
    if (oldSelectedNodeIndexes == newSelectedNodeIndexes)
    {
    
        //alert("Same node");
        if ((newLevel == 2 || newLevel == 1) && execute && node.url != null)
        {        
            doShowDocument(newSelectedNodeIndexes);
        }
        else
        {
            // Close if opened and viceversa
            // Hide / show sub level
            
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "invert", indice);
            
            //Cancello cookie per nn aprire l'albero al ricaricamento della pagina
            setCookie(cookieNameArray[indice], "0", null, "/portalWeb", null, null);
            
            return;
        }
    }
    
    if (oldLevel == 2)
    {
        if (newLevel == 2)
        {
            // Can't be the same
            // Level 2: switch off old item
            applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, oldLevel, "off",  "", indice);
            // Level 2: switch on new item
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "", indice);

            // Show articles
            if (execute && node.url != null)
                doShowDocument(newSelectedNodeIndexes);
        }
               
        if (newLevel == 1)
        {
            if (oldSelectedNodeIndexes.indexOf(newSelectedNodeIndexes) == 0)
            {
                // Level 2: switch off old item
                applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, oldLevel, "off",  "", indice);
                // Level 2: hide level containing the old item
                // Level 1: switch on new item
                applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "hide", indice);
                
                /* Show articles
                if (execute && node.url != null)
                    doShowDocument(newSelectedNodeIndexes);
                */
                
            }
            else
            {
                // Level 2: switch off old item
                applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, oldLevel, "off",  "", indice);
                // Level 2: hide level containing the old item
                // Level 1: switch off old item
                applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, newLevel, "off",  "hide", indice);
                // Level 1: switch on new item
                // Level 1: show sub level of the new item 
                applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "show", indice);
            }
        }
    }
    else if (oldLevel == 1)
    {
        if (newLevel == 2)
        {
            // Level 1: switch on old item
            applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, oldLevel, "on",  "show", indice);
            // Level 2: switch off on item
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "", indice);

            // Show articles
            if (execute && node.url != null)
                doShowDocument(newSelectedNodeIndexes);
        }
        
        if (newLevel == 1)
        {
            if (oldSelectedNodeIndexes.indexOf(newSelectedNodeIndexes) == 0)
            {
                // Level 1: switch off old item
                applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, oldLevel, "off",  "");
                // Level 1: hide level containing the old item
                // Level 0: switch on new item
                applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "hide");
                setCookie(cookieNameArray[indice], "0", null, "/portalWeb", null, null);
                return;
            }
            else
            {
                // Can't be the same
                // Level 2: hide sub level of the old item
                // Level 1: switch off old item
                applyActionToSingleNodeAndSubLevel(oldSelectedNodeIndexes, oldLevel, "off",  "hide", indice);
                // Level 1: switch on new item
                // Level 2: show sub level of the new item
                applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "show", indice);
                // Show articles
                if (execute && node.url != null)
                    doShowDocument(newSelectedNodeIndexes);
            }
        }
    }
    else if (oldLevel == 0)
    {
        // New level can be only 1
        if (newLevel == 1)
        {
            // Level 1: switch on new item
            // Level 2: show sub level of new item
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "show", indice);
            //alert("dentro");
            if (execute && node.url != null)
                doShowDocument(newSelectedNodeIndexes);
        }
        
    }

    // Finally store new selected node
    selectedNodeArray[indice] = indexes;
    setCookie(cookieNameArray[indice], selectedNodeArray[indice], null, "/portalWeb", null, null);
}

function expandePath(indexes, indice)
{
    
    //alert("EXPANDEPATH: indexes= " + indexes);
    
    var maxLevel = getLevelByIndexes(indexes);
    
    for (i = 1; i <= maxLevel; i++)
    {
        var partialIndexes = cutIndexesByLevel(indexes, i);
                
        doAction(partialIndexes, false, indice);
    }
}


function renderNode(tree, indexes, order, indice)
{
    //alert("indice in RENDERNODE "+indice);
    var html = "";

    if (tree == null)
        return html;
    
    var spaces = "";
    for (var i = 0; i < tree.level ; i++)
        spaces += "&nbsp;&nbsp;";
    
    var url = "";
    
    if (tree.level > 0)
    {
        url = "<a href=\"javascript:void(false);\" " + 
            "onClick=\"javascript:doAction(" +
            "'" + indexes + "', true, '"+ indice +"');return false;\"";
        //alert("url: "+url) ;
        
        if (tree.image != null)
        {
            url += "> <img src=\""+ tree.image + "\" border=\"0\" >";
        }
        else
        {
            url += " title=\"" + tree.label + "\">";
            url += "&nbsp;" + cutLabel(tree.label, maxLabelChars[tree.level]);
        }
        
        
        /*if (tree.level > 1){
            url += "<img src=\""+ iconClosed.src + "\" border=\"0\" id=\"icon" + indexes + "\">";
        }*/

        url += "</a>";
        //alert("url: "+url) ;
    }
    else
        url = cutLabel(tree.label, maxLabelChars[tree.level]);
    
    html + "\n";
    html += "<div";
    html += " id=\"item" + indexes + "\"";
    html += " class=\"item_" + indice + "_" + tree.level + "-off\"";
    html += ">";
    //alert(html);
    html += spaces + url;

    html += "</div>";
    html += "\n";

    //alert(html);

    if (tree.children != null && tree.children.length > 0)
    {
        var clss = "class=\"level_" + indice + "_" + (tree.level + 1) + "\"";
        //alert(clss);
    
        html += "\n";
        html += "<div id=\"group"+ indexes + (indexes == "" ? "" : "-") + "0" + "\" " + clss + ">";
        //alert(html);

        for (var i = 0; i < tree.children.length ; i++)
            html += renderNode(tree.children[i], indexes + (indexes == "" ? "" : "-") + i, i, indice)

        html += "</div>";
        html += "\n";
    }

    return html;    
}


function renderTree(targetDiv,indice)
{
    //alert("RENDERTREE");
    var html = "\n" + "<div id=\"group" + indice + "0\" class=\"level_" + indice + "_0\">";
    
    //Setto l'albero da renderizzare
    catalogTree = catalogTreeArray[indice];
    
    html += renderNode(catalogTree, indice+"0", 0, indice);
    
    html += "</div><br>"/* + "\n"*/;

    if (targetDiv != null && targetDiv != "")
        document.getElementById(targetDiv).innerHTML = html;
    else
        document.write(html);
        
    selectedNodeArray[indice] = "0";
    
    var selectedNodeCookie = getCookie(cookieNameArray[indice]);
    //alert("selectedNodeCookie in RENDERTREE= " + selectedNodeCookie + " " + selectedNodeArray[indice] + " TREE " + indice);
    
    if (selectedNodeCookie != null && selectedNodeCookie != "" && selectedNodeCookie != "0")
    {
        expandePath(selectedNodeCookie, indice);
    }
    else
        setCookie(cookieNameArray[indice], selectedNodeArray[indice], null, "/portalWeb", null, null);
    //alert("selectedNode= " + selectedNode);
}


function expandBranch(indexes)
{
    var tree = getNodeByIndexes(indexes, -1);
    
    //alert("Tree in ESPANDBRACH: "+tree);

    if (tree.children != null)
    {
        //alert("indexes in EXPANDBRANCH: "+indexes);
    
        var groupIndexes = "group" + indexes + '-0';
        //alert("Group in EXPANDBRANCH: "+groupIndexes);
        document.getElementById(groupIndexes).style.display = "block";

        for (var i = 0; i < tree.children.length; i++)
            expandBranch(indexes + "-" + i);
    }
}


function collapseBranch(indexes)
{
    var tree = getNodeByIndexes(indexes, -1);
    
    if (tree.children != null)
    {
        //alert(indexes);
        
        for (var i = 0; i < tree.children.length; i++)
            collapseBranch(indexes + "-" + i);
    
        var groupIndexes = "group" + indexes + '-0';
            
        document.getElementById(groupIndexes).style.display = "none";

    }
}
