
var MAIN_PREFIX = 'jsm_main_';
var SUB_PREFIX = 'jsm_sub_';

function kmpMenu() {
    
    this.subMenus = new Array();
    this.outTimeout = 500;
    this.activeMainItem = '';
    this.activeSubItem = '';
    
    this.getElementPosition = function (obj) {
        var offsetTrail = obj;
        var offsetLeft = 0;
        var offsetTop = 0;

        while (offsetTrail) {
            offsetLeft += offsetTrail.offsetLeft;
            offsetTop += offsetTrail.offsetTop;
            offsetTrail = offsetTrail.offsetParent;
        }
        if (navigator.userAgent.indexOf("Mac") != -1 && typeof document.body.leftMargin != "undefined") {
            offsetLeft += document.body.leftMargin;
            offsetTop += document.body.topMargin;
        }

        return {x:offsetLeft, y:offsetTop};
    }

    this.getSubMenu = function(menuId) {
        return document.getElementById(SUB_PREFIX + menuId);
    }
    
    this.getParentMenu = function(menuId) {
        return document.getElementById(MAIN_PREFIX + menuId);
    }
    
    this.getHeight = function(obj) {
        return obj.offsetHeight;
    }
    
    this.setActiveItem = function(main, sub) {
        this.activeMainItem = main;
        this.activeSubItem = sub;
    }
    
    this.initMainMenuItem = function(menuId) {
        // onmouseover
        var wev_mouseover = new bx_helpers_contextfixer(this.e_mainItemOver, this, menuId);
        bx_helpers.addEventListener(this.getParentMenu(menuId), 'mouseover', wev_mouseover.execute);

        // onmouseout
        var wev_mouseout = new bx_helpers_contextfixer(this.e_mainItemOut, this, menuId);
        bx_helpers.addEventListener(this.getParentMenu(menuId), 'mouseout', wev_mouseout.execute);
        
        // onresize
        var wev_resize = new bx_helpers_contextfixer(this.e_onResize, this);
        //bx_helpers.addEventListener(window, 'resize', wev_resize.execute);
        window.onresize = wev_resize.execute;
        
    }
    
    this.e_onResize = function() {
        //alert('resize!');
        for(var i=0; i<this.subMenus.length; i++) {
            this.alignSubMenu(this.subMenus[i]);
        }
    }

    this.initSubMenu = function(menuId) {
        var subMenu = this.getSubMenu(menuId);
        
        if(this.activMainItem != '' && menuId == this.activeMainItem) {
            this.showSubMenu(menuId);
        } else {
            this.hideSubMenu(menuId);
        }
        
        this.alignSubMenu(menuId);
        
        this.subMenus.push(menuId);
        this.initMainMenuItem(menuId);
        this.initSubMenuItems(subMenu, menuId);
    }
    
    this.alignSubMenu = function(menuId) {
        var parent = this.getParentMenu(menuId);
        var parentPos = this.getElementPosition(parent);
        var subMenu = this.getSubMenu(menuId);

        subMenu.style.top =  parentPos.y + this.getHeight(parent) + 'px';
        subMenu.style.left = parentPos.x + 'px';
    }
    
    this.initSubMenuItems = function(subMenu, menuId) {
        var subItemsNS = subMenu.getElementsByTagName('div');
        for(var i=0; i<subItemsNS.length; i++) {
            this.initSubMenuItem(subItemsNS[i], menuId);
        }
    }
    
    this.initSubMenuItem = function(subItem, menuId) {
        // onmouseover
        var wev_mouseover = new bx_helpers_contextfixer(this.e_mainItemOver, this, menuId);
        bx_helpers.addEventListener(subItem, 'mouseover', wev_mouseover.execute);

        // onmouseout
        var wev_mouseout = new bx_helpers_contextfixer(this.e_mainItemOut, this, menuId);
        bx_helpers.addEventListener(subItem, 'mouseout', wev_mouseout.execute);
        
        var subItemName = subItem.id.substr(SUB_PREFIX.length, subItem.id.length)
        if(subItemName != '' && this.activeSubItem == subItemName) {
            subItem.className = 'jsm_subItemActive';
        } else {
            subItem.className = 'jsm_subItem';
        }
    }
    
    this.showSubMenu = function(menuId) {
        var sm = this.getSubMenu(menuId);
        var pm = this.getParentMenu(menuId);
        sm.style.visibility = 'visible';
        pm.className = 'jsm_mainItemActive';
    }
    
    this.hideSubMenu = function(menuId) {
        var m = this.getSubMenu(menuId);
        var pm = this.getParentMenu(menuId);
        m.style.visibility = 'hidden';
        pm.className = 'jsm_mainItem';
    }
    
    this.hideOtherSubMenus = function(menuId) {
        for(var i=0; i<this.subMenus.length; i++) {
            if(this.subMenus[i] != menuId) 
                this.hideSubMenu(this.subMenus[i]);
        }
    }
    
    this.showActiveSubMenu = function() {
        if(this.activeMainItem != '')
            this.showSubMenu(this.activeMainItem);
    }
    
    this.e_mainItemOver = function(menuId) {
        if(this._mainItemOutTimeout)
            window.clearTimeout(this._mainItemOutTimeout);
        this.showSubMenu(menuId);
        this.hideOtherSubMenus(menuId);
    }
    
    this.e_mainItemOut = function(menuId) {
        var wev_outtimeout = new bx_helpers_contextfixer(this.e_mainItemOutTimeout, this, menuId);
        this._mainItemOutTimeout = window.setTimeout(wev_outtimeout.execute, this.outTimeout);
    }
    
    this.e_mainItemOutTimeout = function(menuId) {
        this.hideSubMenu(menuId);
        this.showActiveSubMenu();
    }
    
    /*  subItem mouse events are currently linked to mainitem mouse events. 
        the following methods are unused.
    */
    this.e_subItemOver = function(menuId) {
    }
    
    this.e_subItemOut = function(menuId) {
    }

    this.e_subItemOutTimeout = function(menuId) {
    }
    
}


