/** * Version 2.0 * Author: Rob Perez * Date: August 20, 2010 * * Usage: * * Set a flag at the beginning of generateLeftNav to modify expansion behavior of the nav if desired. * * Somewhere prior to including the nav, set either noLeftNavExpansion or parentUrl var. * * * * */ generateLefNav = function(){ generateLeftNav(); } generateLeftNav = function(){ var hasParentUrl = false; var urlMatch = false; var myLocation = "" + window.location; var tempLocation = myLocation.split("?"); if (typeof (noLeftNavExpansion) != 'undefined'){ return false; // the no left nav expansion flag has been set. No expansion. We are done. } if (typeof (parentUrl) != 'undefined'){ parentUrl = buildFullPath(parentUrl); // goes where you go, works where you work! hasParentUrl = true; //there is a parent url set. We'll attempt to expand the parent category of this page. } $("div#leftnav ul a").each(function(i){ if (hasParentUrl) { if (this.href == parentUrl || this.href == parentUrl+"index.html") { $(this).parents("li:eq(0):not([class='main'])").addClass("activechild"); return true; // a match to the parent. Menu expanded. } } else myLocation = tempLocation[0]; // ignore any params when checking the url... if (this.href == myLocation || this.href + "index.html" == myLocation || stripIndex(this.href)== myLocation) { if ($(this).parents().length > 1) { $(this).parents("li:eq(1):not([class='main'])").addClass("activechild"); } $(this).parents("li:eq(0):not([class='main'])").addClass("active"); $(this).css("cursor", "text"); $(this).css("textDecoration", "none"); $(this).click(function(){ return false; }); urlMatch = true; return true; // a match with this page's URL; menu expanded. And...we're done. } }); if(hasParentUrl){ return false; // if we've tried to match a parent and failed, pull the ripcord to avoid lots of unwanted recursion. } if(!urlMatch){ // if there's no match for the current location, try to derive and set a parentUrl and go once more. parentUrl = deriveParent(); if(parentUrl){ generateLeftNav(); } } } /** * deriveParent() breaks up and re-assembles the current URL as it iterates through our ordered lists to find its parents. * In a nutshell, if it finds a parent that has children it has a match. BUT it continues to iterate until there are no more matches. * Then it returns the last match it found a.k.a. its closest parent with children a.k.a. the category to which it belongs. * * Example: ssl -> ssl-information-center -> ssl-licencing or /ssl/ssl-information-center/ssl-licensing/index.html * * Will: * * 1. Match SSL and set the "match" equal to that item * 2. Keep iterating * 3. Match SSL Information Center and set the "match" url equal to that, clobbering our first match * 4. Keep iterating and find no further matches since ssl-licencing does not have children and is therefore not a "category" that we need to expand * 5. Returns the last "match" var which is ssl-information-center * 6. That gets fed back into generateLeftNav for proper expansion. * 7. The SSL Information Center category is expanded. * */ deriveParent = function(){ var match = false; pathArray = window.location.pathname.split( '/' ); newPathname = ""; for ( i = 0; i < pathArray.length; i++ ) { if (i != 0) { newPathname += "/"; } newPathname += pathArray[i]; fullPathname = buildFullPath(newPathname); $("div#leftnav ul a").each(function(i){ if ((this.href == fullPathname || this.href == fullPathname+"/index.html")&&$(this).parent().siblings("li").find("ul").length>0){ match = newPathname + "/"; } }); } return match; } buildFullPath = function(myPathName){ return window.location.protocol + "//" + window.location.host + myPathName; } stripIndex = function(myUrl){ return myUrl.replace(/index.html/i, ""); }