general.namespace('SW');

(function () {

    /*
        example item:
        {
            // second arg to handlers is the selected item
            element: ,  // defines bounding box to receive events; passed as first arg to all handlers
            selected: , // triggered when item has been selected (and wasn't already currently selected)
            unselected: , // triggered when another item has been selected
            mouseover: ,// called on hover over the item when it is currently selected
            mouseout: , // called on hover hover the item when it is currently selected
            click:  // called on mousedown, not click 
        }
    */
    var FancyMenu = SW.FancyMenu = function (items, handlerContainer, clickHandler, mouseoverHandler, mouseoutHandler, /*opt*/ selectedItem) {
        this.handlerContainer = handlerContainer; // the element with the handlers attached (mouseout, mouseover, click, mousedown)
        this.items = items; // the elements to identify when mouseover, mouseout, and click occurs
        this.clickHandler = clickHandler;
        this.mouseoverHandler = mouseoverHandler;
        this.mouseoutHandler = mouseoutHandler;
        this.selectedItem = selectedItem; // the element of the item currently selected
        
        if (this.selectedItem) {
        
        }
        
        var me = this;
        
        general.addListener(this.handlerContainer, 'mousedown', function (evt) {
            var target = evt.target || evt.srcElement;
            
            var clickedItem;
            for (var i = 0; i < me.items.length; i++) {
                var item = me.items[i];
                if (general.isNodeOrChildOf(target, item.element, me.handlerContainer)) {
                    clickedItem = item;
                }
            }
            
            if (clickedItem) {
                me.selectedItem = clickedItem;
                for (var i = 0; i < me.items.length; i++) {
                    var item = me.items[i];
                    if (item.click) {
                        item.click(item, clickedItem);
                    }
                    else {
                        clickHandler(item, clickedItem);
                    }
                }
            }
            
            YAHOO.util.Event.preventDefault(evt);
            return false;        
        });
        
        /* swallows click to avoid interference with mousedown */
        general.addListener(this.handlerContainer, 'click', function (evt) {
            var target = evt.target || evt.srcElement;            
            YAHOO.util.Event.preventDefault(evt);
            return false;
        });
        
        general.addListener(this.handlerContainer, 'mouseover', function (evt) {
            var entered = evt.target || evt.toElement;
            var exited = evt.relatedTarget || evt.fromElement;
            
            var mouseoverItem;
            for (var i = 0; i < me.items.length; i++) {
                var item = me.items[i];
                if (general.isNodeOrChildOf(entered, item.element, me.handlerContainer)
                    && !general.isNodeOrChildOf(exited, item.element, me.handlerContainer)) {
                    mouseoverItem = item;
                    break;
                }
            }
            if (mouseoverItem) {
                if (mouseoverItem.mouseover) {
                    mouseoverItem.mouseover(mouseoverItem, me.selectedItem);
                }
                else {
                    mouseoverHandler(mouseoverItem, me.selectedItem);
                }
            }           
        });
        
        general.addListener(this.handlerContainer, 'mouseout', function (evt) {
            var entered = evt.relatedTarget || evt.toElement;
            var exited = evt.target || evt.fromElement;
            
            var mouseoutItem;            
            for (var i = 0; i < me.items.length; i++) {
                var item = me.items[i];
                if (general.isNodeOrChildOf(exited, item.element, me.handlerContainer)
                    && !general.isNodeOrChildOf(entered, item.element, me.handlerContainer)) {
                    mouseoutItem = item;
                    break;
                }
            }
            
            if (mouseoutItem) {
                if (mouseoutItem.mouseout) {
                    mouseoutItem.mouseout(mouseoutItem, me.selectedItem);
                }
                else {
                    mouseoutHandler(mouseoutItem, me.selectedItem);
                }
            }
        });
        
        
    };
    FancyMenu.prototype.constructor = FancyMenu;
    
   
})();
        