PINT.vs = { menus : [{'title':'Connect', 'href':'#',items: [{'title':'Activity Partner', 'href':'categories.php?cat=4'},{'title':'Groups', 'href':'categories.php?cat=6'},{'title':'Singles', 'href':'categories.php?cat=5'}]},{'title':'Roommates', 'href':'categories.php?cat=2'},{'title':'Events', 'href':'categories.php?cat=3'}], _createMenu : function (items, level, genealogy) { // Find the menu element var div = document.getElementById('menu_'+level); // Begin the links inside our menu var menuId = 'submenu_'+genealogy.join('_'); var html = '
'; //html = html + ''; //alert(html); div.innerHTML = html; // Make the last div scrollable and then hide it (quirkiness of flexcroll) if (level == 3 && items.length > 6) { // Creates the scroller and hides it (it has to be shown at first to get calculations right) div.style.display = 'block'; CSBfleXcroll(menuId); div.style.display = 'none'; } // Add listeners to the A tags if (level < 3) YAHOO.util.Event.on(div.getElementsByTagName('a'), 'mouseover', PINT.vs._showNextMenu); }, _prepareMenu : function(e) { var isLast = false; // Get the menu containing the link that was moused over. var menu = this.parentNode.parentNode.parentNode.parentNode; // Remove any previous selections YAHOO.util.Dom.removeClass(menu.getElementsByTagName('a'), 'selected'); // Build out the genealogy of the current menu var genealogy = menu.id.split('_'); genealogy = genealogy.slice(1,4); // Find the current menu level var level = menu.className.split('_')[1]; // Find the level of the link (when added into the genealogy, we can figure out the menu to be shown) var nextLevel = this.className.split(' ')[0].split('_')[1]; if (genealogy[0] == 0) genealogy[0] = nextLevel; else if (genealogy[1] == 0) genealogy[1] = nextLevel; else if (genealogy[2] == 0) genealogy[2] = nextLevel; else isLast = true; if (!isLast) { // Select the link if it is a parent if (YAHOO.util.Dom.hasClass(this, 'parent')) YAHOO.util.Dom.addClass(this, 'selected'); var genealogyId = 'menu_' + genealogy.join('_'); // Hide previous divs by checking to see if they are a higher level than our current level AND making sure the next divToShow is not already showing var checkLevel = function(el) { return (el.className.split(' ')[0].split('_')[1] > level && el.id != genealogyId); } var divsToHide = YAHOO.util.Dom.getElementsBy(checkLevel, 'div', 'menu'); YAHOO.util.Dom.setStyle(divsToHide, 'display', 'none'); // Check to see if the next menu exists and that it's not currently showing var divToShow = YAHOO.util.Dom.get(genealogyId); // If it does, we show it if (divToShow && divToShow.style.display != 'block') PINT.vs._showMenu(divToShow, level); } }, _showNextMenu : function() { var isLast = false; // Get the menu containing the link that was moused over. var menu = this.parentNode.parentNode.parentNode.parentNode; // Remove any previous selections YAHOO.util.Dom.removeClass(menu.getElementsByTagName('a'), 'selected'); // Build out the genealogy of the current link var genealogy = this.id.split('_'); genealogy = genealogy.slice(1,5); // Figure out the next level var nextLevel = 0; if (genealogy[1] == 0) { nextLevel = 1; } else if (genealogy[2] == 0) { nextLevel = 2; } else if (genealogy[3] == 0) { nextLevel = 3; } var items = []; if (nextLevel >= 1) items = PINT.vs.menus[(genealogy[0]-1)].items; if (nextLevel >= 2 ) items = items[[(genealogy[1]-1)]].items; if (nextLevel >= 3) items = items[[(genealogy[2]-1)]].items; if (items && items.length) { PINT.vs._createMenu(items, nextLevel, genealogy); PINT.vs._showMenu(YAHOO.util.Dom.get('menu_'+nextLevel), nextLevel); } else { nextLevel--; } // Select the link if it is a parent if (YAHOO.util.Dom.hasClass(this, 'parent')) YAHOO.util.Dom.addClass(this, 'selected'); // Hide divs from last to first for (var i=4; i>nextLevel; i--) { YAHOO.util.Dom.setStyle('menu_'+i, 'display', 'none'); } }, _showMenu : function(menu, level) { // by/from value default var position = [0,0]; // Hardcoded by/from values if (level == 1) position = [141,0]; else if (level == 2) position = [182, 172]; else if (level == 3) position = [182, 354]; var slide = new YAHOO.util.Anim(menu, { left: { by : position[0], from : position[1] } }, .25, YAHOO.util.Easing.easeOut); slide.onStart.subscribe(function() { menu.style.left = position[1] + 'px'; menu.style.display = 'block'; }); slide.animate(); // Remove any pre-selections YAHOO.util.Dom.removeClass(menu.getElementsByTagName('a'), 'selected'); }, init : function() { PINT.vs.menuContainer = YAHOO.util.Dom.get('menu'); PINT.vs._createMenu(PINT.vs.menus, 0, [0,0,0,0]); PINT.vs.menu = new PINT.MenuCreator({ delay:200, menus:[ //{ id: 'menu', trigger: 'productsMenuLink' } { id: 'menu', trigger: 'categorymnulink' } //{ id: 'menu_shop', trigger: 'shopMenuLink' }, //{ id: 'menu_support', trigger: 'supportMenuLink' }, //{ id: 'menu_company', trigger: 'companyMenuLink' } ], show:function(trigger,menu) { if (trigger.parentNode.className.substr(trigger.parentNode.className.length-6) !== '_hover') { trigger.parentNode.className += '_hover'; } YAHOO.util.Dom.setStyle(menu, 'display', 'block'); if (menu.id == 'menu') YAHOO.util.Dom.setStyle(YAHOO.util.Dom.getChildren(menu)[0], 'display', 'block'); YAHOO.util.Dom.removeClass(menu.getElementsByTagName('a'), 'selected'); }, hide:function(trigger,menu) { if (trigger.parentNode.className.substr(trigger.parentNode.className.length-6) === '_hover') { trigger.parentNode.className = trigger.parentNode.className.substr(0, trigger.parentNode.className.length-6); } if (menu.id == 'menu') YAHOO.util.Dom.setStyle(YAHOO.util.Dom.getChildren(menu), 'display', 'none'); YAHOO.util.Dom.setStyle(menu, 'display', 'none'); } }); // Removes the IE6 flicker during animation if (PINT.util.browser.bIe6) try { document.execCommand("BackgroundImageCache", false, true); } catch(err) {} } }; // This function creates a show/hide relationship between a trigger and menu object. PINT.MenuCreator = function(obj) { for (var oMenu in obj.menus) { (function(index, total) { var trigger = (obj.menus[index].trigger) ? YAHOO.util.Dom.get(obj.menus[index].trigger) : YAHOO.util.Dom.get(obj.menus[index]); var menu = (obj.menus[index].id) ? YAHOO.util.Dom.get(obj.menus[index].id) : YAHOO.util.Dom.get(obj.menus[index]).lastChild; var timeout; if (!trigger || !menu || !obj.show || !obj.hide) return; function enterLink(e) { clearTimeout(timeout); clearMenus(); obj.show(trigger,menu); YAHOO.util.Event.stopEvent(e); YAHOO.util.Event.on(document.body, 'mouseout', exitField); } function exitLink(e) { if (!e) var e = window.event; if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; var relTarg = e.relatedTarget || e.toElement; if (relTarg && relTarg != menu && relTarg.parentNode != menu && relTarg.parentNode.parentNode != menu) { timeout = setTimeout(function() {obj.hide(trigger, menu);},obj.delay); YAHOO.util.Event.removeListener(document.body, 'mouseout', exitField); return false; } YAHOO.util.Event.stopEvent(e); } function enterField(e) { clearTimeout(timeout); } function exitField(e) { if (!e) var e = window.event; var tg = (window.event) ? e.srcElement : e.target; if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement; while (reltg&& reltg != tg && reltg.nodeName != 'BODY' && reltg.nodeName != 'HTML') { if (reltg == this) return; reltg = reltg.parentNode } if (reltg == tg) return; YAHOO.util.Event.removeListener(document.body, 'mouseout', exitField); YAHOO.util.Event.stopEvent(e); timeout = setTimeout(function() {obj.hide(trigger, menu);},obj.delay); } function clearMenus() { for (var i=0; i