﻿//- SimpleMenu -//
if (typeof Instinct == 'undefined') { Instinct = {}; }
Instinct.SimpleMenu = Class.create();
Object.extend(Instinct.SimpleMenu, {
    instances: []
    //	findByMenuId: function(id) {
    //		return Instinct.SimpleMenu.instances.find(function(menu) {
    //			return menu.links.find(function(link) {
    //				return link.key == id;
    //			});
    //		});
    //	}
});
Object.extend(Instinct.SimpleMenu.prototype,
{
    initialize: function(menuContainer, options) {
        this.activeContainer = false;
        this.activeMenu = false;
        this.containers = new Hash();
        this.menus = [];
        Instinct.SimpleMenu.instances.push(this);
        this.options = {
            //beforeExpand: Prototype.emptyFunction,
            //afterExpand: Prototype.emptyFunction,
            activeMenuClassName: 'active',
            firstChildClassName: 'firstChild',
            hideFunction: Element.hide,
            isHover: false,
            isSetClassOnContainer: false,
            lastChildClassName: 'lastChild',
            menuSelector: '> li',
            mouseOverClassName: 'mouseOver',
            menuItemLeftOffset: 0,
            menuItemTopOffset: 0,
            showFunction: Element.show
        };
        menuContainer = $(menuContainer);
        Object.extend(this.options, options || {});
        (typeof (this.options.menuSelector == 'string')
			? $$('#' + menuContainer.id + ' ' + this.options.menuSelector)
			: this.options.menuSelector(menuContainer)
		).findAll(function(menu) {
            var menuIdPrefix = menu.up().id + '-';
            return (menu.id.startsWith(menuIdPrefix) && (menu.id.substring(menuIdPrefix.length).match(/^\w+$/)));
        }).each(function(menu) {
            this.addMenu(menu);
        } .bind(this));
        this.containers.values().each(function(menu) {
            var subMenuArray = menu.getElementsByTagName('UL');
            for (var subMenuIndex = 0; subMenuIndex < subMenuArray.length; subMenuIndex++) {
                this.options.hideFunction(subMenuArray[subMenuIndex]);
            };
        } .bind(this));
        Event.observe(document, 'click', function() {
            this.hideMenuItem(menuContainer);
        } .bind(this));
        Event.observe(window, 'load', function() {
            //+ calc menu's right position
            var menuOffset = menuContainer.viewportOffset();
            var menuWidth = menuContainer.getWidth();
            var menuRightPosition = menuOffset[0] + menuWidth;
            this.menus.each(function(menu) {
                menu.select('UL').each(function(subMenu) {
                    subMenu.absolutize();
                    var parentSubMenuItem = subMenu.up();
                    if (parentSubMenuItem.isSimpleMenuItem == true) {
                        //+ next lines added to handle the case where prototypes XOffset() functions return [0, 0] for hidden element's
                        //+ solution is to use parent's offset as the offset to the subMenu
                        var parentSubMenuItemOffset = parentSubMenuItem.viewportOffset();
                        //+ cleared height/width so that they can be filled with the correct values
                        subMenu.setStyle({ width: '', height: '' });
//                        subMenu.style.height = '';
//                        subMenu.style.width = '';
                        //+
                        subMenu.clonePosition(parentSubMenuItem, { setLeft: true, setTop: true, setWidth: false, setHeight: false, offsetLeft: this.options.menuItemLeftOffset, offsetTop: parentSubMenuItem.getHeight() + this.options.menuItemTopOffset });
                        var subMenuLeftPosition = parentSubMenuItemOffset[0] + this.options.menuItemLeftOffset;
                        var subMenuRightPosition = subMenuLeftPosition + subMenu.getWidth();
                        if (subMenuRightPosition > menuRightPosition) {
                            subMenu.style.left = (subMenuLeftPosition - (subMenuRightPosition - menuRightPosition)) + 'px';
                        }
                    }
                } .bind(this));
            } .bind(this));
        } .bind(this));
    },
    addMenu: function(menu) {
        this.menus.push(menu);
        menu.key = menu.id
        menu.isSimpleMenuItem = true;
        this.containers.set(menu.key, menu);
        //+ prepare menu
        if (!menu.previous('LI')) {
            menu.addClassName(this.options.firstChildClassName);
        }
        else if (!menu.next('LI')) {
            menu.addClassName(this.options.lastChildClassName);
        }
        this.bindEvent(menu, 0);        
//        var selectMenuFunction = this.selectMenu.bind(this);
//        Event.observe(menu, 'click', selectMenuFunction);
        menu.select('UL > LI').each(function(subMenuItem) {
            this.bindEvent(subMenuItem, 1);
        } .bind(this));
        //+
        menu.select('UL').each(function(subMenu) {
            this.options.hideFunction(subMenu);
        } .bind(this));
    },
    bindEvent: function(menuItem, depth) {
        var selectMenuFunction = this.selectMenu.bind(this);
        Event.observe(menuItem, 'mouseover', function(e) {
            e.element().addClassName(this.options.mouseOverClassName);
        } .bind(this));
        Event.observe(menuItem, 'mouseout', function(e) {
            e.element().removeClassName(this.options.mouseOverClassName);
        } .bind(this));
        Event.observe(menuItem, ((!depth) && (this.options.isHover) ? 'mouseover' : 'click'), selectMenuFunction);
        //+ anchor
        var textContainerElement = menuItem.down(0);
        if ((textContainerElement) && (textContainerElement.tagName == 'A')) {
            Event.observe(textContainerElement, 'click', selectMenuFunction);
            Event.observe(textContainerElement, 'mouseover', function(e) {
                e.element().up().addClassName(this.options.mouseOverClassName);
            } .bind(this));
            Event.observe(textContainerElement, 'mouseout', function(e) {
                e.element().up().removeClassName(this.options.mouseOverClassName);
            } .bind(this));
        }
    },
    selectMenu: function(e) {
        var sender = e.element();
        Event.stop(e);
        //+
        if (sender) {
            this.setActiveMenu(sender.up('li'));
        }
        //var menu;
        //var parentMenu;
        //if (sender.tagName == 'A') {
        //    menu = sender.up();
        //}
        //else {
        //    menu = sender;
        //}
        //this.setActiveMenu(menu);
        return false;
    },
    setActiveMenu: function(menu) {
        if (!menu) { return; }
        if (typeof (menu) == 'string') {
            this.menus.each(function(_menu) {
                if (_menu.key == menu) {
                    this.setActiveMenu(_menu);
                    throw $break;
                }
            } .bind(this));
        }
        else {
            if (this.activeContainer) {
                this.hideMenuItem(this.activeContainer);
            }
            //+
            var subMenu = menu.down('UL', 0);
            if (subMenu) {
                //this.notify('beforeExpand', this.activeContainer);
                (this.options.isSetClassOnContainer ? $(menu.parentNode) : menu).addClassName(this.options.activeMenuClassName);
                this.activeContainer = this.containers.get(menu.key);
                this.activeMenu = subMenu;
                this.options.showFunction(this.activeMenu);
                //this.notify('afterExpand',this.containers.get(menu.key));
            }
            else {
                var aElement = menu.down(0);    //+ first child needs to be <a>
                if ((aElement) && (aElement.tagName == 'A')) { location.href = aElement.href; }
            }
            return false;
        }
    },
    //	notify: function(event_name)
    //	{
    //		try{
    //			if (this.options[event_name]) { return [this.options[event_name].apply(this.options[event_name],$A(arguments).slice(1))]; }
    //		}
    //		catch(e)
    //		{
    //			if (e != $break) { throw e; }
    //			else { return false; }
    //		}
    //	},
    hideMenuItem: function(menuItem) {
        this.menus.each(
		    function(item) { (this.options.isSetClassOnContainer ? $(item.parentNode) : item).removeClassName(this.options.activeMenuClassName); } .bind(this)
		);
        menuItem.select('UL').each(function(subMenu) {
            this.options.hideFunction(subMenu);
        } .bind(this));
    }
});
if (typeof Object.Event != 'undefined') { Object.Event.extend(Instinct.SimpleMenu); }