// ---------------------------------------------------------------- // NAVIGATION TREE STATE function NavigationNodeState() { this.hasKids = false; this.selected = false; this.collapsed = true; this.last = false; this.level = 0; this.cssStyle = ''; this.getContainerStyle = function() { var styleClass = this.selected ? "selected" : ""; styleClass += " "; styleClass += this.hasKids ? this.getStyleClass() : "level" + this.level + (this.last ? " last" : ""); if (this.cssStyle != '') styleClass += " " + this.cssStyle; return styleClass; }; this.getHitAreaStyle = function() { return "hitarea hitarea-" + this.getStyleClass(); }; this.getLinkStyle = function() { return this.selected ? "selected" : ""; }; this.getStyleClass = function() { return (this.collapsed ? "expandable" : "collapsable") + (this.last ? "-last" : "") + (this.selected ? " selected" : "") + (" level" + this.level); } ; }; // ---------------------------------------------------------------- // COOKIE MANAGER function CookieManager(prefix) { this.prefix = prefix; this.addNode = function(nodeUrl) { if (this.isNodeIn(nodeUrl)) return; var array = this.getCookiesArray(); array.push(nodeUrl); this.setCookiesArray(array); } this.removeNode = function(nodeUrl) { var array = jQuery.grep(this.getCookiesArray(), function (cookieNodeUrl) { return cookieNodeUrl != nodeUrl; }); this.setCookiesArray(array); } this.isNodeIn = function(nodeUrl) { return jQuery.inArray(nodeUrl, this.getCookiesArray()) > -1; } this.getCookiesArray = function() { var cookies = $.cookie(this.prefix); if (cookies == null) return []; return cookies.split("###"); } this.isEmpty = function() { var cookiesArray = this.getCookiesArray(); return cookiesArray == null || cookiesArray.length == 0; } this.setCookiesArray = function(theArray) { $.cookie(this.prefix, theArray.join("###"), {path: '/'}); } } // ---------------------------------------------------------------- // NAVIGATION TREE function NavigationTree(prefix) { prefix = prefix ? prefix : 'bm_b2b_selectedNodes'; var self = this; self.currentNodeUrl = getCurrentRelativeUrl(); self.cookieManager = new CookieManager(prefix); function createNavigationNodeState(subNodes, nodeRelativeUrl, isLastInList, level, cssStyle) { var result = new NavigationNodeState(); result.hasKids = subNodes.length > 0; result.selected = self.currentNodeUrl == nodeRelativeUrl; result.collapsed = ! self.cookieManager.isNodeIn(nodeRelativeUrl); result.last = isLastInList; result.level = level; result.cssStyle = cssStyle; return result; } function createNavigationTreeNode(nodeItem, isLastInList, level) { var subNodes = nodeItem[2]; var cssStyle = nodeItem[4]; var state = createNavigationNodeState(subNodes, nodeItem[1], isLastInList, level, cssStyle); var isChildSelected = false; var subNodesList; if (state.hasKids) { subNodesList = createSubNodesList(subNodes, state, level); isChildSelected = $(subNodesList).css("display") == "block"; } if (isChildSelected) state.collapsed = false; var htmlNode = createContainer(state); if (state.hasKids) htmlNode.appendChild(createHitArea(state)); htmlNode.appendChild(createLink(nodeItem, state)); if (subNodesList != undefined) htmlNode.appendChild(subNodesList); return htmlNode; } function createContainer(state) { var htmlNode = document.createElement("li"); htmlNode.className = state.getContainerStyle(); return htmlNode; } function createHitArea(state) { var hitArea = document.createElement("div"); hitArea.className = state.getHitAreaStyle(); $(hitArea).bind("click", {}, toggleTreeBranchFunction); return hitArea; } function createLink(nodeItem, state) { var link = document.createElement("a"); link.setAttribute("href", nodeItem[1]); link.appendChild(document.createTextNode(nodeItem[0])); link.className = state.getLinkStyle()+" treeItem"; link.setAttribute("id_treedetail", nodeItem[3]); return link; } function createSubNodesList(subNodes, state, level) { var subHtmlNode = document.createElement("ul"); $(subHtmlNode).addClass("treeview"); var isCollapsed = true; var nextLevel = level + 1; for (var i = 0; i < subNodes.length; i++) { var isNewNodeLast = (i + 1) == subNodes.length; var newNode = createNavigationTreeNode(subNodes[i], isNewNodeLast, nextLevel); if ((newNode.className.indexOf("selected") > -1) || (newNode.className.indexOf("collapsable") > -1)) isCollapsed = false; subHtmlNode.appendChild(newNode); } $(subHtmlNode).css({display: isCollapsed && state.collapsed ? "none" : "block"}); return subHtmlNode; } function getCurrentRelativeUrl() { var re = new RegExp("http://[^/]*(/.*)", "ig"); var arr = re.exec(document.URL); return RegExp.$1; } function toggleTreeBranchFunction() { var wereExpanded = this.className.indexOf("collapsable") != -1; var wereLast = this.className.indexOf("last") != -1; var wereSelected = this.className.indexOf("selected") != -1; var state = new NavigationNodeState(); state.selected = wereSelected; state.collapsed = wereExpanded; state.last = wereLast; state.level = jQuery(this).parents("li").size(); var hitArea = this; var wholeElement = this.parentNode; hitArea.className = state.getHitAreaStyle(); wholeElement.className = state.getStyleClass(); var kidsList = $(wholeElement).find(">ul"); kidsList.css({display: wereExpanded ? "none" : "block"}); //initialize COOKIES var nodeUrl = $(this.parentNode).find(">a").get(0).getAttribute("href"); if (state.collapsed) self.cookieManager.removeNode(nodeUrl); else self.cookieManager.addNode(nodeUrl); } //---------------- initialization ---------------- this.expandFirstLevelIfNew = function(level) { if (!self.cookieManager.isEmpty()) { return this; } for (var i = 0; i < self.nodes.length; i++) { var node = self.nodes[i]; self.cookieManager.addNode(node[1]); } return this; } this.setCurrentNavigationNodeUrl = function(theUrl) { self.currentNodeUrl = theUrl; return this; } this.setNodes = function(theNodes) { self.nodes = theNodes; return this; } this.create = function() { var result = createSubNodesList(self.nodes, {collapsed: false}, 0); $(result).addClass("root"); return result; } } // ---------------------------------------------------------------- // MAIN FUNCTION function createNavigationTree() { var navigationTree = new NavigationTree(); return navigationTree .setNodes(treeItems[0][2]) .setCurrentNavigationNodeUrl(currentNavigationNodeUrl) .create(); } function createNavigationTreeExpanded() { var navigationTree = new NavigationTree(); return navigationTree .setNodes(treeItems[0][2]) .setCurrentNavigationNodeUrl(currentNavigationNodeUrl) .expandFirstLevelIfNew() .create(); }