﻿// Questo file potrebbe richiamare alcune funzioni presenti in default.js

var menus;
var menuField = { Id: 0, Name: 1, Level: 2, PlaceOrder: 3, IdParent: 4, HtmlCode: 5 };
var me;
var menuArgsEnum = { sender: 0, target: 1, url: 2 };


function getMenus() {

    var crt = document.getElementById('mainMenu_caronte');
    var strcaronte = crt.value;

    var menuarray = strcaronte.split('$$$');
    menus = new Array;
    for (i = 0; i < menuarray.length; i++) {
        var name = menuarray[i].split(';', 2)[menuField.Name];
        menus[name] = menuarray[i];
    }
    me = document.getElementById('smContainer'); //menu
    /*menus.*/

}
getMenus();


var clickHandler = baseClickHandler;
function baseClickHandler(sender, targetMenu, url, newWindow, parentMenu) {
    if (url != null) {
        if (!newWindow)
            ShowBody(url, newWindow);
        else
            window.open(url);
    }
    menuClickHandler(sender, targetMenu, parentMenu);
}

function menuClickHandler(sender, targetMenu, idParentMenu) {
    // ---- Non invertire l'ordine! ------
    var newLevel = selectItem(sender);
    if (newLevel <= 0 && idParentMenu > 0) {
        getMenuStack(idParentMenu, sender);
    }

    showMenu(targetMenu, newLevel);
    // -----------------------------------
}

function getMenuStack(idParentMenu, item) {
    var stackMenu = new Array();

    if (menus == null) 
        getMenus();

    var newidparent = idParentMenu;
    if (item) {
        stackMenu.push(item.replace('item_', ''));
        while (newidparent > 0) {
            var oldidparent = newidparent;
            newidparent = getParent('submenu_' + oldidparent);
            stackMenu.push(oldidparent);
        }
    }


    var num = stackMenu.length -1;
    var subm = 'item_';
    var item = 'item_';

    var id = stackMenu.pop();
    var mItem = menus['item_' + id];
    var args = getMenuArgsFromMenuItem(mItem);
    if (args) {
        menuClickHandler(args[menuArgsEnum.sender], args[menuArgsEnum.target]);
    }
    var oid = id;

    for (var i = 0; i < num; i++) {
        id = stackMenu.pop();
        mItem = menus['submenu_' + oid];

        args = getSubItemMenuArgsFromMenuItem(mItem, 'item_' + id);
        if (args) {
            menuClickHandler(args[menuArgsEnum.sender], args[menuArgsEnum.target]);
        }
        oid = id;
    }
    
}
function getParent(name) {
    var menustring = menus[name];
    if (menustring != null) {
        var mymenu = sSplit(menustring, ';', 6);
        var idparent = parseInt(mymenu[menuField.IdParent]);
        return idparent;
    }
}


function selectItem(name) {
    // Restituisce il livello del nuovo menu
    var newElement = document.getElementById(name);
    var newLevel = -1;
    var elements = $('.selected');
    if (newElement != null) {
        newLevel = parseInt(newElement.getAttribute('level'));
        for (i = 0; i < elements.length; i++) {
            var oldLevel = parseInt(elements[i].getAttribute('level'));
            if (oldLevel >= newLevel) { $(elements[i]).removeClass('selected'); }
            if (newLevel == 2 && oldLevel == 2) { $(elements[i].parentNode).removeClass('selectedTab'); }
        }
        $(newElement).addClass('selected');
        if (newLevel == 2) { $(newElement.parentNode).addClass('selectedTab'); }
    }
    else {
        $(elements).removeClass('selected');
        $('.selectedTab').removeClass('selectedTab');
    }

    return newLevel;
}
function showMenu(name, newlevel) {

    if (menus == null) {
        getMenus();
    }
    if (me == null) {
        me = document.getElementById('smContainer'); //menu
    }

    var menustring = menus[name];
    if (menustring != null) {
        var mymenu = sSplit(menustring, ';', 6);
        newlevel = parseInt(mymenu[menuField.Level]);
        ClearMenu(newlevel);

        emenu = document.createElement('DIV');
        emenu.setAttribute('class', 'dummy');
        emenu.innerHTML = mymenu[menuField.HtmlCode];
        me.appendChild(emenu);

        // Questo ciclo è necessario per i menu su più colonne, lasciarlo dopo AppendChild
        for (var i = 0; i < emenu.childNodes.length; i++) {
            if (emenu.childNodes[i].nodeType == 1) {
                var id = emenu.childNodes[i].id;
                var lv = emenu.childNodes[i].getAttribute('level');
                setSubmenuBackground(id, lv);
            }
        }

        //if (newlevel == 2) { AlignMenu(emenu); }
        AlignMenu();
        SetHeight();
    }
    else if (name == 'submenu_0') {
        ClearMenu(2);
    }
    else if (newlevel >= 0) {
        ClearMenu(newlevel);
    }
}


function AlignMenu() {

    var sMenus = $('#smContainer ul');

    var lsm = 0; // Larghezza Sub Menu (totale)
    sMenus.each(function () {
        lsm += $(this).outerWidth(true);
    });

    var sTab = $('.selectedTab'); // Tab Selezionata: voce di menù di primo livello
    //var msx = sTab.position().left; // Margine Sinistro

    var msx = sTab.offset().left; // Margine sinistro assoluto (con MainMenu position:absolute)
    msx -= $('#sitecontainer').offset().left; // Margine sinistro relativo al contenitore

    // Imposta larghezza minima sottomenù
    if (lsm < sTab.outerWidth()) {
        var padding = sMenus.innerWidth() - sMenus.width();
        sMenus[0].style.width = (sTab.innerWidth() - padding) + "px";
    }

    me.style.marginLeft = 0; // Resetto il margine del contenitore PRIMA di calcolarne la larghezza.
    var lcont = $('#mainmenu').offset().left + $('#mainmenu').outerWidth(); // Larghezza del contenitore lorda
    lcont -= $('#sitecontainer').offset().left; // Larghezza del contenitore al netto del margine sinistro


    if (lsm > (lcont - msx)) {
        // Allineamento a destra
        var mdx = msx + sTab.innerWidth();
        me.style.marginLeft = mdx - lsm + "px";
    }
    else {
        // Allineamento a sinistra
        me.style.marginLeft = msx + "px";
    }

}


function SetHeight(value) {
    var max = 0;

    if (value == null) {
        $(".submenu").each(function () {
            if ($(this).height() > max) { max = $(this).height(); }
        });
    }
    else {
        max = value;
    }
    $(".submenu").height(max);
}

function ClearMenu(fromLevel) {

    var visibleLevel;
    var visiblemenus = $('ul');

    for (var i = 0; i < visiblemenus.length; i++) {
        visibleLevel = parseInt(visiblemenus[i].getAttribute('level'));
        if (visibleLevel >= fromLevel) {
            $('#' + visiblemenus[i].id).parent().remove();
        }
    }

    SetHeight('auto');
    SetHeight();
}


function sSplit(text, separator, numelements) {
    var myarray = text.split(separator);
    var newarray = new Array();

    numelements--;

    for (i = 0; i < numelements; i++) {
        newarray[i] = myarray[i];
    }
    newarray[numelements] = '';
    var newseparator = '';
    for (i = numelements; i < myarray.length; i++) {
        newarray[numelements] += newseparator + myarray[i];
        newseparator = separator;
    }

    return newarray;
}


function setSubmenuBackground(menuid, level) {

    var trasp = 0.25 + (level - 1) * 0.2;
    var myElement = document.getElementById(menuid);

    if (myElement != null) {
        if (isExplorer()) {
            var traspHex = Math.floor(trasp * 255).toString(16) + '051044';
            var myFilter = 'progid:DXImageTransform.Microsoft.gradient(startColorstr=#' + traspHex + ', endColorstr=#' + traspHex + ')';
            myElement.style.backgroundColor = 'transparent';
            myElement.style.filter = myFilter;
        }
        else {
            myElement.style.backgroundColor = 'rgba(5, 16, 68, ' + trasp + ')';
        }
    }
    
}


// Data una determinata url restituisce gli argomenti per effettuare manualmente una chiamata al metodo clickHandler
function getMenuArgsFromUrl(url) {
    var iUrlPos = -1;
    var newUrl = getRelativeUrl(url);
    var mItem = menus.search(newUrl);
    var args = null;
    if (mItem != null) iUrlPos = mItem.indexOf(newUrl); //trovo il primo punto che contiene la mia url
    if (iUrlPos >= 0) {
        args = getMenuArgsFromMenuItem(mItem, iUrlPos);
    }
    if (args == null) {
        args = new Array ('item_1', 'submenu_0', 'home.aspx'); //Home
    }
    return args;
}

// Da un menuItem estrae e restituisce gli argomenti per effettuare manualmente una chiamata al metodo clickHandler
function getMenuArgsFromMenuItem(mItem, rtlStartPos) {
    var args = null;
    if (mItem) {
        if (!rtlStartPos) { rtlStartPos = mItem.length; }

        var iStart = mItem.lastIndexOf('clickHandler', rtlStartPos); //punto di inizio della chiamata a clickHandler
        var iEnd = mItem.indexOf(')', iStart) + 1; //punto di fine della chiamata a clickHandler
        if (iStart >= 0 && iEnd > 0) { //iEnd è solo > e non >= perchè è stato calcolato con + 1
            mItem = mItem.slice(iStart, iEnd); //estraggo la chiamata a clickHandler
            iStart = mItem.indexOf('(') + 1; //punto di inizio degli argomenti di clickHandler
            iEnd = mItem.indexOf(')'); //punto di fine degli argomenti di clickHandler
            var sArgs = null;
            if (iStart > 0 && iEnd >= 0) { //iStart è solo > e non >= perchè è stato calcolato con + 1
                mItem = mItem.slice(iStart, iEnd); //estraggo gli argomenti della chiamata a clickHandler
                sArgs = mItem.replace(/'|\s/gi, "");
            }
            if (sArgs != null) {
                args = sArgs.split(',');
            }
        }
    }
    return args;
}

// Da un MenuItem, restituisce gli argomenti per effettuare manualmente una chiamata al metodo clickHandler di una voce figlia
function getSubItemMenuArgsFromMenuItem(subm, itemName) {
    var args = null;
    if (subm) {
        var pos = subm.indexOf(itemName);
        //if (!rtlStartPos) { rtlStartPos = mItem.length; }

        var iStart = subm.lastIndexOf('(', pos) + 1; //punto di inizio della chiamata del subitem
        var iEnd = subm.indexOf(')', pos); //punto di fine della chiamata a del subitem
        
        var sArgs = null;
        if (iStart > 0 && iEnd >= 0) { //iStart è solo > e non >= perchè è stato calcolato con + 1
            subm = subm.slice(iStart, iEnd); //estraggo gli argomenti della chiamata a clickHandler
            sArgs = subm.replace(/'|\s/gi, "");
        }
        if (sArgs != null) {
            args = sArgs.split(',');
        }
    }
    return args;
}

// Imposta il menu che punta ad una determinata url
function setMenuFromUrl(url) {
    var args = getMenuArgsFromUrl(url);
    if (args != null && args.length >= 2)
        clickHandler(args[menuArgsEnum.sender], args[menuArgsEnum.target]);
}


