/*  JavaScript Context Menu 0.1 alpha 1
 *  (c) 2005 Nicolas Schmitt
 *
 *  This file is freely distributable under the terms of an MIT-style license.
 *
/*--------------------------------------------------------------------------*/

 var ContextMenu = Class.create();

ContextMenu.prototype = {
    _currentMenu : null,
	initialize: function(elt, mnu) {
        this.options = Object.extend({
            allowed: null,
            duration: 0.3
        }, arguments[2] || {});
		this.element = $(elt);
        this.menu = $(mnu);
        this.index = 0;
        //~ this.active = false;
        var lis = this.menu.getElementsByTagName("LI");
        for (var idx = 0; idx < lis.length; idx++) {
            lis[idx].menuIndex = idx;
            Element.addClassName(lis[idx], "menuitem");
            if (this.options.allowed != null && !this.options.allowed[idx]) {
                Element.hide(lis[idx]);
            }
        }
        this.entryCount = lis.length;
        this.onclicklistener = this.onclick.bindAsEventListener(this);
        Event.observe(this.element, "contextmenu", this.onrightclick.bindAsEventListener(this));
        Event.observe(this.menu, "mouseover", this.onhover.bindAsEventListener(this));
	},
    hide: function() {
        ContextMenu._currentMenu = null;
        Element.hide(this.menu);
        //~ this.active = false;
    },
    onrightclick: function(event) {
        if (ContextMenu._currentMenu != null) {
            ContextMenu._currentMenu.hide();
        }
        this.index = 0;
        //~ this.active = true;
        ContextMenu._currentMenu = this;
        this.menu.style.left = Event.pointerX(event) + 'px';
        this.menu.style.top = Event.pointerY(event) + 'px';
        Effect.Appear(this.menu, {duration : this.options.duration});
        Event.observe(document, "click", this.onclicklistener);
        Event.stop(event);
    },
    onhover: function(event) {
        var element = Event.findElement(event, 'LI');
        if (this.index != element.menuIndex) {
            this.index = element.menuIndex;
            this.render();
        }
        Event.stop(event);
    },
    onclick: function(event) {
        Event.stopObserving(document, "click", this.onclicklistener);
        this.hide();
    },
    render: function() {
        //~ if (this.active) {
            var lis = this.menu.getElementsByTagName("LI");
            for (var idx = 0; idx < lis.length; idx++) {
                if (this.index == idx) {
                    Element.addClassName(lis[idx],"selected");
                } else {
                    Element.removeClassName(lis[idx],"selected");
                }
            }
        //~ }
    }
}

