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


// Variables
var catalogTree = new treeNode(null, 0, "",
                [         
                    new treeNode('9950000000001',1, "L'Offerta" ,
                    [
                        new treeNode('9950000000022',2, "Tariffe" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_tariffe&titoloFinestra=Tariffe%20CoopVoce&history=no&coopVsID=0"),
                        new treeNode('9950000000023',2, "Promozioni" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_promozioni&titoloFinestra=Promozioni%20CoopVoce&history=no&coopVsID=0"),
                        new treeNode('9950000000024',2, "Solo Con I Punti Coop" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_punti_coop&titoloFinestra=Solo%20Con%20I%20Punti%20Coop&history=no&coopVsID=0"),
                        new treeNode('9950000000025',2, "Attivare CoopVoce" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_come_attivare&titoloFinestra=Come%20Attivare%20CoopVoce&history=no&coopVsID=0"),
                        new treeNode('9950000000026',2, "Per l'Estero" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_roaming&titoloFinestra=Copertura%20E%20Costi%20Roaming%20Internazionale%20CoopVoce&history=no&coopVsID=0")
                    ], null),
                    new treeNode('9950000000002',1, "I Servizi" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_i_servizi&titoloFinestra=I%20Servizi%20CoopVoce&history=no&coopVsID=0"),
                    new treeNode('9950000000003',1, "L'Assistenza" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_assistenza&titoloFinestra=Assistenza%20CoopVoce&history=no&coopVsID=0"),
                    new treeNode('9950000000004',1, "Documenti" , null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_documenti&titoloFinestra=Documenti%20CoopVoce&history=no&coopVsID=0"),
                    new treeNode('9950000000005',1, "Domande Pi&ugrave; Frequenti" ,null, "/portalWeb/portlets/ssbRicarica/documento.jsp?ambiente=COOP&oggetto=coopVoce_FAQ&titoloFinestra=FAQ%20CoopVoce&history=no&coopVsID=0")
                ], null);
                
var selectedNode;

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

var cookieName = "treeCoopVoce";

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)
{
    // First 0 is catalogTree, must remove it
    indexes = indexes.substr(2);
    
    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 = "";

    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)
{
    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.urlSpalla);
    document.location.href = node.urlSpalla;
}

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)
{
    // Input
    // itemStatus: "on", "off"
    // subLevelStatus: "show", "hide", "invert"

    // 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;
    
    //alert("item" + itemIndexes + "= " + 'item' + level + '-' + itemStatus);
    document.getElementById("item" + itemIndexes).className = 'item' + level + '-' + itemStatus;

    // Subtree and icon
    var node = getNodeByIndexes(itemIndexes, -1);

    if (node.children != null)
    {
        var groupIndexes = "group" + itemIndexes + '-0';
        
        //var currentStatus = document.getElementById(groupIndexes).style.display;
        //alert(groupIndexes + " now is " + currentStatus);
        
        if (subLevelStatus == "invert")
        {
            var currentStatus = document.getElementById(groupIndexes).style.display;

            document.getElementById(groupIndexes).style.display = 
                (currentStatus == 'block' ? 'none' : 'block');

            //document.images["icon" + itemIndexes].src = 
                (currentStatus == 'none' ? iconOpen.src : iconClosed.src);;
        }
        else
            if (subLevelStatus == "show")
            {
                document.getElementById(groupIndexes).style.display = 'block';
                //document.images["icon" + itemIndexes].src = iconOpen.src;
            }
            else
            {
                document.getElementById(groupIndexes).style.display = 'none';
                //document.images["icon" + itemIndexes].src = iconClosed.src;
            }
    }
}


function doAction(indexes, execute)
{
    //alert("doAction, indexes:" + indexes);
   
    var oldSelectedNodeIndexes = selectedNode;
    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;
        
    if (newLevel == 1 && node.children == null && execute){
        doShowDocument(newSelectedNodeIndexes);
    }
            
    // Same node, do something only is it's a leaf
    if (oldSelectedNodeIndexes == newSelectedNodeIndexes)
    {
        //alert("Same node");
        if (newLevel == 2 && execute)
            doShowDocument(newSelectedNodeIndexes);
        else
        {
            // Close if opened and viceversa

            // Hide / show sub level
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "invert");
            //Cancello cookie per nn aprire l'albero al ricaricamento della pagina
            setCookie(cookieName, "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",  "");
            // Level 2: switch on new item
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "");

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

            // Show articles
            if (execute)
                doShowDocument(newSelectedNodeIndexes);
        }

        if (newLevel == 1)
        {
            // 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");
            // Level 1: switch on new item
            // Level 2: show sub level of the new item
            applyActionToSingleNodeAndSubLevel(newSelectedNodeIndexes, newLevel, "on",  "show");
        }
    }
    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");
        }
        
    }

    // Finally store new selected node
    selectedNode = indexes;
    setCookie(cookieName, selectedNode, null, "/portalWeb", null, null);
}


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


function renderNode(tree, indexes, order)
{
    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);return false;\"";
            
        url += " title=\"" + tree.label + "\">";
        
        if (tree.level > 1){
            url += "<img src=\""+ iconClosed.src + "\" border=\"0\" id=\"icon" + indexes + "\">";
        }

        url += "&nbsp;" + cutLabel(tree.label, maxLabelChars[tree.level]);

        url += "</a>";
    }
    else
        url = cutLabel(tree.label, maxLabelChars[tree.level]);
    
    html + "\n";
    html += "<div";
    html += " id=\"item" + indexes + "\"";
    html += " class=\"item" + 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" + (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)

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

    return html;    
}


function renderTree(targetDiv)
{
    var html = "\n" + "<div id=\"group0\" class=\"level0\">";

    html += renderNode(catalogTree, "0", 0);
    
    html += "</div><br>" + "\n";

    if (targetDiv != null && targetDiv != "")
        document.getElementById(targetDiv).innerHTML = html;
    else
        document.write(html);
        
    selectedNode = "0";

    var selectedNodeCookie = getCookie(cookieName);

    //alert("selectedNodeCookie= " + selectedNodeCookie + " " + selectedNode);
    
    if (selectedNodeCookie != null && selectedNodeCookie != "" && selectedNodeCookie != "0")
    {
        expandePath(selectedNodeCookie);
    }
    else
        setCookie(cookieName, selectedNode, null, "/portalWeb", null, null);

    //alert("selectedNode= " + selectedNode);
}


function expandBranch(indexes)
{
    var tree = getNodeByIndexes(indexes, -1);

    if (tree.children != null)
    {
        //alert(indexes);
    
        var groupIndexes = "group" + indexes + '-0';

        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";

    }
}