/*
	TODO:
	-combine Browser.ie6 || Browser.ie7 into one var eg lecacyIE
	
	Note: used to generate left menu & country menu on wow.com (EU)
*/
var menuCreator = {
	HOVER_DELAY: 350, //in ms
	BOX_MINLENGTH: 115,
   
    appendSubMenu: function (item, list, parentUl) {
		if (parentUl) jq(parentUl).append(list);
        
		var newList = menuCreator.createSubMenu(item[2]);

		menuCreator.adjustBoxWidth(newList);

		list.append(newList);
	},
 
    /*
    attaches LI to new or passed through UL element,
    runs recursively (for "no submenu limit")
    */
    createSubMenu: function  (list, ulElem) {
        ulElem = ulElem || jq('<ul />').hide();      
 
        jq.each(list, function(i, item) {
            var hasSubmenu = menuCreator.hasSubMenu(item),
            listItem = menuCreator.createMenuEntry(item, hasSubmenu);
           
            if (hasSubmenu)  
                menuCreator.appendSubMenu(item, listItem, ulElem);
            else 
                ulElem.append(listItem);
        })                    
		return ulElem;               
    },
 
    /*
    constructs <li><a /></li>,
    attaches class="multi" to "a" & "li" if submenu found,
    appends submenus on-demand,
    handles timeouts, also handles li, a styles during hover (reliably cross-browser)
    */
    createMenuEntry: function (entry, multiLevel) {

        var $listElem = jq('<li />'), timeoutId;
		if (multiLevel) timeoutId = Math.random(); 
	    
		if (entry[1]) {
			$listElem.prepend(
					jq("<a>").attr('href', entry[1]).text(entry[0])
				).hover(
				function () {
					if (multiLevel) {
						Timers.set("timer", function () {
							if (!jq("ul", $listElem)[0]) {
								menuCreator.appendSubMenu( ($listElem.data("pointer")) ? $listElem.data("pointer"): entry, $listElem );
								$listElem.data("pointer", null); //detach data storage from built element
							}
							if ((Browser.ie) && $listElem.parent().hasClass('mainNav')) // all IE: set parentUl postion: relative to address z-index, postion overlapping issues
								$listElem.parent().css("position", "relative");
							$listElem.css("position", "relative").find('ul:first').show();
						}, menuCreator.HOVER_DELAY)
						Timers.clear(timeoutId);                                               
					}
					
					if(!$listElem.parent().hasClass("menuCountry"))
						$listElem.css("backgroundColor", (Browser.ie6 || Browser.ie7) ? "#232949" : "#131627"); // little brighter scroll over effect for legacyIE
					else $listElem.css("backgroundPosition", "0 -21px");  
					
					$listElem.children('a:first').css("color", "#FFF");
				},
				function () {
				if (multiLevel) {
						Timers.clear("timer");
						Timers.set(timeoutId, function () {
							$listElem.css("position", "static").children('ul').hide();
							if ((Browser.ie) && $listElem.parent().hasClass("mainNav"))
								$listElem.parent().css("position", "static");
						}, menuCreator.HOVER_DELAY)
					}
					
					if(!$listElem.parent().hasClass("menuCountry"))
						$listElem.css("backgroundColor", "");
					else
						$listElem.css("backgroundPosition", "0 0");  
					
					$listElem.children('a:first').css("color", "#F4C400");
				}
			)
	    } else $listElem.prepend('<span>' + entry[0] + '</span>') //used in menuCountry
		
		if(multiLevel) {
		   $listElem.attr("class", "multi");
		   $listElem.children("a").attr("class", "multi");
		}
        return $listElem;
    },
   
    /*
    searches longest link in a UL and sets UL's width accordingly if in range (BOX_MINLENGTH - BOX_MAXLENGTH)
    TODO: optimize formula for length
    */
    adjustBoxWidth: function (ulElem) {
        var $list = jq(ulElem).attr('id', 'current'),
        $links = $list.find("a").filter(function () {
			return jq(this).parent().parent().attr('id') == 'current'
			}),
        maxLength = 0;
		
        $links.each(function () {
			var $link = jq(this),
            textLength = $link.text().length;
	   
            if (textLength > maxLength) maxLength = textLength;
        })

        $list.removeAttr('id')
		
		maxLength = (maxLength * 6) + 35; 
		$list.css("width", (maxLength < menuCreator.BOX_MINLENGTH) ? menuCreator.BOX_MINLENGTH : maxLength + "px");
    },
   
    /*
    checks for submenu
    */
    hasSubMenu: function (item) {
        return !!item[2];
    },
   
	/*
	creates mainUl per Menu,
	saves Array index on LI for on-demand building
	*/
    init: function (name){
        var ul = jq("<ul />").attr('class', (name != 'menuCountry') ? 'mainNav' : 'mainNav menuCountry'), hasSubMenu; 
       
        jq.each(Menu[name], function(i, entry) {
            hasSubmenu = menuCreator.hasSubMenu(entry),
            listElement = menuCreator.createMenuEntry(entry, hasSubmenu);
           
            if (hasSubmenu) listElement.data("pointer", entry);
			
			(ul).append(listElement);                                     
				   
			if(jq(ul).hasClass('menuCountry')) //country menu
				jq("#" + name).append(ul);
			else
				jq("#" + name).find(".leftMenu-cnt").append(ul); //leftMenus
        })
    }
}

