<$ var args = context.param(0, {}); var pageId = args["pageId"]; var maxDepth = parseInt(args["maxDepth"]) || 0; var ulClass = args["ulClass"] || ""; var liClass = args["liClass"] || ""; var activeClass = args["activeClass"] || "active"; var showHiddenPages = args["showHiddenPages"] || false; var startLevel = args["startLevel"] || 0; var idContainsActive = args["idContainsActive"] || []; var wrapper = args["wrapper"] || ["",""]; var showDescription = args["showDescription"] || false; var openClass = args["openClass"] || ""; var ulAttribs = ""; if ( ulClass ){ ulAttribs = ' class="' + ulClass + '"'; } var p = isNull(pageId) ? page : project.getPage(pageId); // This shows parentpages starting with Level "StartLevel" and not only sub-pages of the current page. // Typically used by submenues called from within default.html with the startLevel-Parameter // e.g. in Contemporay Resp., Smart Resp and Textile Resp. if ( !isNull(p) && startLevel !== 0 && p.level >= startLevel ){ while ( !isNull(p) && p.level >= startLevel && p.level > 1 ) { p = project.getPage(p.parentPageId); } startLevel = 0; // prevents calling this block over and over again below, where we call the partial recursively } var childPages = isNull(p) ? page.projectFolder.pages : p.pages; if ( childPages.count<=0 || !hasVisibleChildPages(p.id) && !showHiddenPages || maxDepth !== 0 && p.level > maxDepth-1 ){ return; } $> <$= wrapper[0] $> > <$ for ( var i = 0; i < childPages.count; ++i ) { var childPage = childPages.item(i); var activeLinkClass = ""; var containsActiveClass = ""; if ( childPage.active && (childPage.visible || showHiddenPages) ) { var liClassAddition = ""; var cssClass = ""; if ( hasVisibleChildPages(childPage.id) ){ cssClass += "haschilds "; if ( liClass === "dropdown" ) { liClassAddition = "-submenu" ; } } cssClass += liClass+liClassAddition; if ( childPage.id === page.id && activeClass !== "" ){ cssClass += " " + activeClass; activeLinkClass = 'class="' + activeClass + '" '; } else if ( hasActiveChildPage(childPage.id) ){ cssClass += " " + activeClass + " " + openClass; } if ( childPage.id in oc(idContainsActive) ){ containsActiveClass = " hasactive"; } cssClass = cssClass.replace(/^\s+|\s+$/gm,''); // like trim() var liAttribs = ""; if ( cssClass || containsActiveClass ){ liAttribs = ' class = "' + cssClass + containsActiveClass + '"'; } $> > <$= system.partial("zppagelink-expanded.html", childPage.id) $>><$= childPage.name.replace(/& /g,'& ') $> <$ if ( showDescription && childPage.description !== "" ) { $> <$= childPage.description $> <$ } $> <$= system.partial("submenu.html", { "pageId":childPage.id, "maxDepth":maxDepth, "ulClass":ulClass, "liClass":liClass, "activeClass":activeClass, "showHiddenPages":showHiddenPages, "startLevel":startLevel, "idContainsActive":idContainsActive, "wrapper":wrapper, "showDescription":showDescription, "openClass":openClass} ) $> <$ } } $> <$= wrapper[1] $> <$ function hasVisibleChildPages(pageId) { var p = project.getPage(pageId); if ( !isNull(p) ) { var cps = p.pages; for ( var i = 0; i < cps.count; ++i ) { var cp = cps.item(i); if ( cp.visible && cp.active ){ return true; } } } return false; } function hasActiveChildPage(pageId) { var p = project.getPage(pageId); var childPages = p.pages; for ( var i = 0; i < childPages.count; ++i ) { var childPage = childPages.item(i); if ( childPage.id === page.id || hasActiveChildPage(childPage.id) ){ return true; } } return false; } // from http://snook.ca/archives/javascript/testing_for_a_v // can convert an array to an object, so we can use the JS "in" operator to search the array function oc(a) { var o = {}; for( var i=0; i