var Menu = Base.extend({

	constructor: function(rootEl, config) {
		this.root = $(rootEl);
		Menu.all.push(this);
	},

	_items: [],
	
	_getActivator: function(n) {
		while(n.previousSibling) {
			n=n.previousSibling;
			if ( n.nodeName=="A" ) return n;
		} return null;
	},
	
	root: null,
	
	config: {
		active: 'active',
		selected: 'sel',
		menu: 'menu',
		closeDelay: 75,
		openDelay: 300
	},
	
	addMenu: function(el, parent) {
		if ( !el.parentNode ) this.root.appendChild( el );
		var p = el.parentNode;
		DOM.addClass(p,'parent');
		var a = this._getActivator(el);
		DOM.addClass(a,'trigger');
		var mi = { menu:el, parent:p, activator:a, timer:null }
		this._items.push(mi);
		return mi;
	},
	
	closeAll: function() {
		this._items.forEach( this.closeMenu, this);
	},
	
	onactivate: function (mi) {
		if (mi.timer) { mi.timer = this.clearTimer( mi.timer ); }
		mi.timer = setTimeout( function() { this.openMenu(mi) }.bind(this), this.config.openDelay );
	},
	
	ondeactivate: function(mi) {
		if (mi.timer) { mi.timer = this.clearTimer( mi.timer ); }
		mi.timer = setTimeout( function() { this.closeMenu(mi) }.bind(this), this.config.closeDelay );
	},
	
	openMenu: function (mi) {
		DOM.addClass( mi.parent, this.config.active );
		DOM.addClass( mi.menu, this.config.menu );
		DOM.addClass( mi.activator, this.config.selected );
		
	},
	
	closeMenu: function (mi) {
		DOM.removeClass(mi.parent,this.config.active);
		DOM.removeClass(mi.menu,this.config.menu);
		DOM.removeClass(mi.activator,this.config.selected);
		mi.timer = this.clearTimer(mi.timer);
	},
	
	clearTimer: function(t) {						
		clearTimeout(t);
		return t = null;
	}
	

},{ //begin static interface
	all: []
});


var DropDown = Menu.extend({
    constructor: function (el, config) {
        var uls = $Aris(el).getElementsByTagName('UL');
        $A(uls).forEach(function (ul) {
            this.addMenu(ul);
            var ua = navigator.userAgent;
            if (!(/Firefox/i.test(ua) && !/Windows/i.test(ua) && window.location.pathname.toLowerCase() == '/default.aspx'))
                DOM.setOpacity(ul, .85)
        }, this);
        this.base();
    },

    addMenu: function (el, parent) {
        var mi = this.base(el, parent);
        Event.add(mi.parent, 'mouseover', function (ev) { this.onactivate(mi); }, this);
        Event.add(mi.parent, 'mouseout', function (ev) { this.ondeactivate(mi); }, this);
    }

}, {
    pageLoad: function () {
        DOM.getElementsByClass('dropdown').forEach(function (ddmenu) {
            return new DropDown(ddmenu);
        });
    }
});

