var Menu = function(){

    var DOM = (document.getElementById) ? 1 : 0;
    var IE = (navigator.userAgent.indexOf('MSIE') > -1) ? 1 : 0;
    var loaded = 0;
    var timeoutFlag;
    var layersList = new Array();
    var layersLength = 0;
    var layersParent = new Array();
    var layerPoppedUp = '';
    var toBeHidden = new Array();
    var layersRef = new Array();
    var layers;
    
    // Window: width, heigth, offset
    
    function getWindowWidth(){
        return (window.innerWidth);
    }
    
    function getWindowHeight(){
        var value = 0;
        if (DOM && !IE) {
            value = window.innerHeight;
        }
        else {
            if (document.documentElement &&
            document.documentElement.clientHeight) {
                value = document.documentElement.clientHeight;
            }
            else 
                if (document.body) {
                    value = document.body.clientHeight;
                }
        }
        return (value);
    }
    
    function getWindowXOffset(){
        return (window.pageXOffset);
    }
    
    function getWindowYOffset(){
        var value = 0;
        if (DOM && !IE) {
            value = window.pageYOffset;
        }
        else {
            if (document.documentElement && document.documentElement.scrollTop) {
                value = document.documentElement.scrollTop;
            }
            else 
                if (document.body) {
                    value = document.body.scrollTop;
                }
        }
        return (value);
    }
    
    // Layer: offset
    
    function getOffsetTop(layer){
        var value = 0;
        var object = document.getElementById(layer);
        value = object.offsetTop;
        while (object.tagName != 'BODY' && object.offsetParent) {
            object = object.offsetParent;
            value += object.offsetTop;
        }
        return (value);
    }
    
    function getOffsetLeft(layer){
        var value = 0;
        object = document.getElementById(layer);
        value = object.offsetLeft;
        while (object.tagName != 'BODY' && object.offsetParent) {
            object = object.offsetParent;
            value += object.offsetLeft;
        }
        return (value);
    }
    
    function getOffsetWidth(layer){
        return (document.getElementById(layer).offsetWidth);
    }
    
    function getOffsetHeight(layer){
        return (document.getElementById(layer).offsetHeight);
    }
    
    // Layer: move
    
    function setTop(layer, y){
        document.getElementById(layer).style.top = y + 'px';
    }
    
    function setLeft(layer, x){
        document.getElementById(layer).style.left = x + 'px';
    }
    
    function moveLayerY(layer){
        var newY = 0;
        var layerHeight = 0;
        var windowHeight = 0;
        var windowYOffset = 0;
        var vertical = false;
        if (layer == 'L0') {
            vertical = true;
        }
        if (!loaded || (isVisible(layer) && layer != layerPoppedUp)) {
            return
        };
        moveLayer(layer, vertical);
        newY = getOffsetTop(layer, vertical);
        layerHeight = getOffsetHeight(layer);
        windowHeight = getWindowHeight();
        windowYOffset = getWindowYOffset();
        if (newY + layerHeight > windowHeight + windowYOffset) {
            if (layerHeight > windowHeight) {
                newY = windowYOffset;
            }
            else {
                newY = windowHeight + windowYOffset - layerHeight;
            }
        }
        if (Math.abs(getOffsetTop(layer) - newY) > 1) {
            setTop(layer, newY);
        }
    }
    
    function moveLayer(layer, vertical){
        if (vertical) {
            setTop(layer, getOffsetTop(layers[layer].ref) + 18);
            setLeft(layer, getOffsetLeft(layers[layer].ref));
        }
        else {
            setTop(layer, getOffsetTop(layers[layer].ref) - 2);
            setLeft(layer, getOffsetLeft(layers[layer].ref) + getOffsetWidth(layers[layer].ref) - 1);
        }
    }
    
    // Layer: popup
    
    function LMPopUpL(layer, on){
        //if (on && layer != 'L0') {
        if (on) {
            moveLayerY(layer)
        };
        setVisibility(layer, on);
    }
    
    function setVisibility(layer, on){
        if (on) {
            document.getElementById(layer).style.visibility = 'visible'
        }
        else {
            document.getElementById(layer).style.visibility = 'hidden'
        }
    }
    
    function isVisible(layer){
        document.getElementById(layer).style.visibility == 'visible';
    }
    
    function seeThroughWorkaround(layer, on){
        for (i = 0; i < toBeHidden.length; i++) {
            if (layersOverlap(layer, i)) {
                if (on) {
                    toBeHidden[i].style.visibility = 'hidden';
                }
                else {
                    toBeHidden[i].style.visibility = 'visible';
                }
            }
        }
    }
    
    function layersOverlap(layer, i){
        xa1 = layerLeft[layer];
        xa2 = xa1 + getOffsetWidth(layer);
        ya1 = layerTop[layer];
        ya2 = ya1 + getOffsetHeight(layer);
        xb1 = toBeHiddenLeft[i];
        xb2 = xb1 + toBeHidden[i].offsetWidth;
        yb1 = toBeHiddenTop[i];
        yb2 = yb1 + toBeHidden[i].offsetHeight;
        if (xb1 > xa1) 
            xa1 = xb1;
        if (xb2 < xa2) 
            xa2 = xb2;
        if (yb1 > ya1) 
            ya1 = yb1;
        if (yb2 < ya2) 
            ya2 = yb2;
        return (xa2 > xa1 && ya2 > ya1);
    }
    
    return {
    
        init: function(json){
            layers = json;
            loaded = 1;
        },
        
        setLMTO: function(){
            timeoutFlag = setTimeout('Menu.shutdown()', 250);
        },
        
        clearLMTO: function(){
            clearTimeout(timeoutFlag);
        },
        
        shutdown: function(){
            if (layerPoppedUp == '') {
                return;
            }
            for (layer in layers) {
                LMPopUpL(layer, false);
            }
            layerPoppedUp = '';
        },
        
        LMPopUp: function(layer, on){
            if (!loaded || layer == layerPoppedUp || (isVisible(layer) && !on)) {
                return;
            }
            if (layerPoppedUp != "" && layer == layers[layerPoppedUp].parent) {
                LMPopUpL(layerPoppedUp, false);
            }
            else 
                if (layers[layer].parent == layerPoppedUp) {
                    LMPopUpL(layer, true);
                    seeThroughWorkaround(layer, true);
                }
                else {
                    Menu.shutdown();
                    foobar = layer;
                    do {
                        LMPopUpL(foobar, true);
                        seeThroughWorkaround(foobar, true);
                        foobar = layers[foobar].parent;
                    }
                    while (foobar != '');
                }
            layerPoppedUp = layer;
        }
    }
}();

// No pertenece al menú pero por ahora lo meto acá

function seleccionar(campo){
    campo.value = "";
}

function deseleccionarBuscar(campo){
    if (campo.value == '') {
        campo.value = 'Buscar';
    }
}

$(document).ready(function(){
    var vpHeight = $(document).height();
    var bdHeight = $('#wrapper').height();
    if (bdHeight < vpHeight) {
        var colHeight = $('#tdCont').height();
        $('#tdCont').height(colHeight + (vpHeight - bdHeight));
    }
});
