function getETarget(e) {
    e = e || window.event;
    var elem = (e.target) ? e.target : ((e.srcElement) ? e.srcElement : null);
    if (elem.nodeType == 3) elem = elem.parentNode; // defeat Safari bug
    return elem;
}

/**
 * приводим к старому форматы json
 */
function fromOldMainmenuFormat(menu_array) {
	var menu_object = {}, item
	for (var i=0; i<menu_array.length; i++) {
		item = menu_array[i]
		if (item['items'])
			item['items'] = fromOldMainmenuFormat(item['items'])
		menu_object[item['id']] = item
	}
	return menu_object
}

function MenuHandler(menu_structure) {
    this.structure = fromOldMainmenuFormat(menu_structure);
    this.structure = menu_structure;
    this.activeLevel1 = '';
    this.activeLevel2 = '';
    this.activeLevel3 = '';
    this.hideTimeout = 1300;
    this.hideHandle = null;
    this.cache = new Array();
    this.layer1 = null;
    this.layer2 = null;
    this.layer3 = null;
    this.currentLevel1 = '';
    this.currentLevel2 = '';
    this.currentLevel3 = '';
    this.isMouseOverMenu = false;
}

MenuHandler.prototype.hide = function(show_initial_data)
{
    if (this.hideHandle) {
        clearTimeout(this.hideHandle);
        this.hideHandle = null;
        if (show_initial_data /*&& !this.isMouseOverMenu*/) {
            var currentPath = this.activeLevel1;
            this.expandLevel(currentPath, this, true);
            if (this.activeLevel2) {
                currentPath += '/' + this.activeLevel2;
                this.expandLevel(currentPath, this, true);
            }
            if (this.activeLevel3) {
                currentPath += '/' + this.activeLevel3;
                this.expandLevel(currentPath, this, true);
            }
        }
    }
}

MenuHandler.prototype.setCurrentLevels = function (l1, l2, l3)
{
    this.activeLevel1 = l1;
    this.activeLevel2 = l2;
    this.activeLevel3 = l3;
}

MenuHandler.prototype.setLevelLayers = function (l1, l2, l3)
{
    this.layer1 = l1;
    this.layer2 = l2;
    this.layer3 = l3;
}

MenuHandler.prototype.getLevel = function (ar_path)
{
    if (ar_path[2]) {
        return 3;
    } else if (ar_path[1]) {
        return 2;
    } else {
        return 1;
    }
}

MenuHandler.prototype.getStructureNode = function (levels)
{
    var node;
    if (levels[2]) {
        node = this.structure[levels[0]]['items'][levels[1]]['items'];
    } else if (levels[1]) {
        node = this.structure[levels[0]]['items'];
    } else {
        node = this.structure;
    }
    return node;
}

MenuHandler.prototype.splitPath = function (path)
{
    var arPath = ['', '', ''];
    var i, tmp = path.split('/');
    for (i = 0; i < tmp.length; i++) {
        arPath[i] = tmp[i];
    }
    return arPath;
}

MenuHandler.prototype.setActive = function (ul, node, item)
{
    var i, a = ul.getElementsByTagName('a');
    for (i = 0; i < a.length; i++) {
        if (a[i].firstChild.nodeValue == node[item]['name']) {
            a[i].parentNode.className = 'active';
        } else {
            a[i].parentNode.className = '';
        }
    }

}


MenuHandler.prototype.getObject = function (path)
{
    var levels = this.splitPath(path);
    var tmpObject = this;
    var currentLevel = this.getLevel(levels);
    var key, layer, cache_key;
    var liItemPath;

    if (currentLevel == 1) {
        key = levels[0];
        cache_key = levels[0]
        layer = this.layer1;
        liItemPath = path;
    } else if (currentLevel == 2) {
        cache_key = levels[0] + '_submenu';
        key = levels[1];
        layer = this.layer2;
        liItemPath = levels[0];
    } else {
        key = levels[2];
        cache_key = levels[0] + '_' + levels[1] + '_' + 'submenu';
        layer = this.layer3;
        liItemPath = levels[0] + '/' + levels[1];
    }
    if (typeof this.cache[cache_key] == 'undefined') {
        var obj = document.getElementById(layer);
        var structureNode = this.getStructureNode(levels);

        if (currentLevel == 1) {
            var newTable, table = obj.getElementsByTagName('table')[0];
            newTable = table.cloneNode('true');

            var i = 0,  nodeKey, objA, columns = newTable.getElementsByTagName('td');
            for (; i< columns.length; i++) {
                if (columns[i].className) {
                    if (columns[i].className == 'menuitem active') {
                        columns[i].className = 'menuitem';
                    } else if (columns[i].className.substr(columns[i].className.length - 2) == '_a') {
                        columns[i].className = columns[i].className.substr(0, columns[i].className.length - 2);
                    }
                    if (columns[i].className == 'menuitem') {
                        tmp = columns[i].getElementsByTagName('a')[0];

                        for (nodeKey in this.structure) {
                            if (tmp.firstChild.nodeValue == this.structure[nodeKey]['name']) {
                                break;
                            }
                        }
                        objA = tmp;//columns[i];
                        objA.itemPath = nodeKey;
                        objA.onmouseover = function (e) {
                            var targ = getETarget(e);
                            if (targ.nodeName.toLowerCase() == 'a') {
                                tmpObject.expandLevel(targ.itemPath, tmpObject, false);
                            }
                        }

                        objA.onmouseout = function(e) {
                            if (getETarget(e).nodeName.toLowerCase() == 'a') {
                                tmpObject.release(tmpObject);
                            }
                        };

                        if (tmp.firstChild.nodeValue == structureNode[key]['name']) {
                            columns[i - 1].className = 'm_left_a';
                            columns[i].className = 'menuitem active';
                            columns[i + 1].className = 'm_right_a';
                            i++;
                        }
                    }
                }
            }
            this.cache[cache_key] = newTable;
        } else {
            var item, li, a, text, ul = document.createElement('ul');
            var cnt = 0;
            for (item in structureNode) {
                li = document.createElement('li');
                li.className = '';
                a = document.createElement('a');
                text = document.createTextNode(structureNode[item]['name']);
                a.setAttribute('href', structureNode[item]['url']);
                a.setAttribute('title', structureNode[item]['title']);
                a.appendChild(text);
                a.itemPath = liItemPath + '/' + item;
                a.onmouseover = function (e) {
                    var targ = getETarget(e);
                    if (targ.nodeName.toLowerCase() == 'a') {
                        tmpObject.expandLevel(targ.itemPath, tmpObject, false);
                    }
                }

                a.onmouseout = function(e) {
                    var targ = getETarget(e);
                    if (targ.nodeName.toLowerCase() == 'a') {
                        tmpObject.release(tmpObject);
                    }
                };
                li.appendChild(a);
                ul.appendChild(li);
            }
            ul.id = cache_key;
            this.cache[cache_key] = ul;
        }
    }
    return this.cache[cache_key];
}

MenuHandler.prototype.init = function ()
{
    //this.currentLevel1 = this.activeLevel1;
    //this.currentLevel2 = this.activeLevel2;
    //this.currentLevel3 = this.activeLevel3;
    var currentPath = this.activeLevel1;
    this.expandLevel(currentPath, this, true);
    if (this.activeLevel2) {
        currentPath += '/' + this.activeLevel2;
        this.expandLevel(currentPath, this, true);
    }
    if (this.activeLevel3) {
        currentPath += '/' + this.activeLevel3;
        this.expandLevel(currentPath, this, true);
    }
}

MenuHandler.prototype.expandLevel = function (path, current_object, init_mode)
{
    if (current_object.hideHandle) {
        current_object.hide(false);
    }
    if (!init_mode) {
        current_object.isMouseOverMenu = true;
    }
    var levels = current_object.splitPath(path);

    var currentItem, nextItem, tmp, currentLevel = current_object.getLevel(levels);
    var structureNode = current_object.getStructureNode(levels);

    if (levels[2]) {
        currentItem = levels[2];
    } else if (levels[1]) {
        currentItem = levels[1];
    } else {
        currentItem = levels[0];
    }

    // display
    if (currentLevel == 1) {
        if (current_object.currentLevel1 != levels[0]) {
            current_object.currentLevel1 = currentItem;
            var obj = document.getElementById(current_object.layer1);
            var oldTable = obj.getElementsByTagName('table')[0];
            var table = current_object.getObject(path);
            obj.replaceChild(table, oldTable);
        }
        document.getElementById(current_object.layer2).style.display = 'none';
        document.getElementById(current_object.layer3).style.display = 'none';
    } else if (currentLevel == 2) {
        var obj = document.getElementById(current_object.layer2);
        var oldUl = obj.getElementsByTagName('ul')[0];
        var list = oldUl;
        if (oldUl.id != levels[0] + '_submenu') {
            var ul = current_object.getObject(path);
            list = ul;
            obj.replaceChild(ul, oldUl);
        }
        if (current_object.currentLevel2 != currentItem) {
            current_object.setActive(list, structureNode, currentItem);
            current_object.currentLevel2 = currentItem;
        }
        document.getElementById(current_object.layer2).style.display = '';
        document.getElementById(current_object.layer3).style.display = 'none';
    } else {
        var obj = document.getElementById(current_object.layer3);
        var oldUl = obj.getElementsByTagName('ul')[0];
        var list = oldUl;
        if (oldUl.id != levels[0] + '_' + levels[1] + '_' + 'submenu') {
            var ul = current_object.getObject(path);
            list = ul;
            obj.replaceChild(ul, oldUl);
        }
        if (current_object.currentLevel3 != currentItem) {
            current_object.setActive(list, structureNode, currentItem);
            current_object.currentLevel3 = currentItem;
        }
        document.getElementById(current_object.layer3).style.display = '';
    }

    if (typeof structureNode[currentItem]['items'] == 'undefined') {
        return;
    }
    for (tmp in structureNode[currentItem]['items']) {
        nextNode = path + '/' + tmp;
        break;
    }
    if (init_mode) {
        return;
    }
    current_object.expandLevel(nextNode, current_object, init_mode);
}

MenuHandler.prototype.release = function (obj)
{
    //obj.isMouseOverMenu = false;

    if (obj.hideHandle) {
        obj.hide(false);
    }
    obj.hideHandle = window.setTimeout(function() {obj.hide(true);}, obj.hideTimeout);
}
