/**
 *
 * Base class for expanding menus
 * @class Base class for expanding menus
 * <p>Usage: var mainnav = new W.Menu('mainnav', mainnav_rollovers);</p>
 * @requires W
 * @requires W.Event
 * @requires W.Dom
 * @constructor
 * @param {String}	menu	for the div that contains the menu
 * @param {Object}	object	Preload object (optional)
*/

W.Menu = function(menu, rollover)
{
	this.menu		= menu;
	this.rollover	= false || rollover;
	this.rollOn		= false;
	var self		= this;

	W.Event.add(window, 'load', function() { self.init(); });
};



W.Menu.prototype = {

	menu 			: null,
	timers			: null,
	overDelay		: 0,
	outDelay		: 50,
	isMacIE			: null,



	init : function() 
	{
		this.timers		= {};
		this.isMacIE 	= (navigator.userAgent.indexOf('MSIE') != -1 && navigator.userAgent.indexOf('PowerPC') != -1);
		
		this.attachEvents();
	},
	
	
	
	attachEvents : function()
	{
		var uls			= W.$(this.menu).getElementsByTagName('ul');
		
		if (!uls.length) return;
		
		var lis			= uls[0].getElementsByTagName('li');
		var node		= null;
		var self		= this;
		
		for (var i = 0, max = lis.length; i < max; ++i) {
			node = lis[i];
			if (node.nodeName.toLowerCase() == 'li' && node.getElementsByTagName('ul').length > 0) {
				W.Event.add(node, 'mouseover', self.getMoverFor(node), false);
				W.Event.add(node, 'mouseout', self.getMoutFor(node), false);
			}
		}
	},
	
	
	
	getMoverFor : function(node)
	{
		var self = this;
		
		return function(e) { self.mover(e, node); };
	},
	
	
	
	getMoutFor : function(node)
	{
		var self = this;
		
		return function(e) { self.mout(e, node); };
	},
	
	
	
	mover : function(e, targetElement)
	{
		var el		= W.Event.target(e, targetElement);
		var self	= this;
		if (el && el.timer) clearTimeout(el.timer);
		
		
		if (this.rollover) { this.setRollover(el, true); }
		
		if (!el) { return; }
		
		this.mover2(el);
	},
	
	
	
	mover2 : function(el)
	{
		var node	= null;
		
		//W.$('debug').innerHTML = W.$('debug').innerHTML +  el.outTimeout + '<br>';


		for (var i = 0, max = el.childNodes.length; i < max; ++i) {
			node = el.childNodes[i];
			if (node.nodeName.toLowerCase() == 'ul') { node.style.display = 'block'; }
		}
	},
	
	
	
	mout : function(e, targetElement)
	{
		var el		= W.Event.target(e, targetElement);
		var self	= this;
		

		if (!el) { return; }
		
		if (this.isMacIE) {
			self.mout2(el);
		} else {
			el.timer = setTimeout(function() { self.mout2(el); }, this.outDelay);
		}
	},
	
	
	
	mout2 : function(el)
	{
		var node	= null;
		
		for (var i = 0, max = el.childNodes.length; i < max; ++i) {
			node = el.childNodes[i];
			if (node.nodeName.toLowerCase() == 'ul') {
				node.style.display = 'none';
			}
		}
		
		if (this.rollover) this.setRollover(el, false);
	},
	
	
	
	setRollover : function(el, state)
	{
		var img = el.getElementsByTagName('img')[0];	// el is the <li> that contains the rollover image, and the nested <ul> submenu
														// assume the first <img> in <li> is the rollover image
		if (img.name !== '') { this.rollover.rollover(img.name, state); }
	},
	
	
	
	rolloverOff : function()
	{
		
	}
};