| /* |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /* |
| Required variables: see lenyatree.js |
| */ |
| |
| /****************************************** |
| * NavNode |
| ******************************************/ |
| |
| function NavNode(id, parent) { |
| this.id = id; |
| this.parent = parent; |
| this.items = {}; |
| this.isfolder = false; |
| this.uuid = ''; |
| this.href = ''; |
| this.label = ''; |
| this.area = ''; |
| this.path = ''; |
| this.isprotected = true; |
| this.existsChosenLanguage = true; |
| this.langSuffix = ''; |
| }; |
| |
| NavNode.prototype = new LenyaNode; |
| |
| NavNode.prototype.createNewNode = function(node) |
| { |
| var newItem = new NavNode(node.getAttribute('id'), this); |
| newItem.init(); |
| |
| newItem.isfolder = isNodeFolder(node); |
| newItem.area = this.area; |
| newItem.path = node.getAttribute('path'); |
| newItem.uuid = node.getAttribute('uuid'); |
| newItem.isprotected = isNodeProtected(node); |
| newItem.href = node.getAttribute('href'); |
| newItem.label = getLabel(node); |
| newItem.existsChosenLanguage = existsChosenLanguage(node); |
| newItem.langSuffix = node.getAttribute('language-suffix'); |
| |
| return newItem; |
| } |
| |
| NavNode.prototype.getBasePath = function() { |
| var path = this.path != '/' ? this.path : '' ; |
| return path; |
| } |
| |
| NavNode.prototype.getLoadSubTreeURL = function() { |
| area = this.area; |
| var path = this.getBasePath(); |
| return encodeURI(AREA_BASE_PATH + PIPELINE_PATH + '?area='+area+'&path='+path+'&language='+CHOSEN_LANGUAGE+'&areas='+ALL_AREAS+'&lenya.module=sitetree'); |
| } |
| |
| NavNode.prototype.getStyle = function() { |
| if (this.tree.root == this) { |
| return 'lenya-info-root'; |
| } else if (this.parent == this.tree.root) { |
| return 'lenya-info-area'; |
| } else if (this.isprotected) { |
| return 'lenya-info-protected'; |
| } else if (this.path == CUT_DOCUMENT_ID) { |
| return 'lenya-info-cut'; |
| } else if (!this.existsChosenLanguage) { |
| return 'lenya-info-nolanguage'; |
| } else { |
| return 'treenode_label'; |
| } |
| } |
| |
| function getLabel(node) { |
| var cs = node.childNodes; |
| var l = cs.length; |
| // lenya generates the xml and is responsible to insert the label |
| // of the correct language |
| for (var i = 0; i < l; i++) { |
| if (getTagName(cs[i]) =='nav:label') { |
| if (cs[i].hasChildNodes()) { |
| return cs[i].firstChild.nodeValue; |
| } |
| else { |
| return "[no title]"; |
| } |
| } |
| } |
| return ''; |
| } |
| |
| function isNodeProtected(node) { |
| var prot = node.getAttribute('protected'); |
| if (prot == 'true') return true; |
| return false; |
| } |
| |
| function isNodeFolder(node) { |
| var isfolder = node.getAttribute('folder'); |
| if (isfolder == 'true') return true; |
| return false; |
| } |
| |
| // check if the node has a label of the chosen language |
| function existsChosenLanguage(node) { |
| var children = node.childNodes; |
| for (var i = 0; i < children.length; i++) { |
| var lang = children[i].getAttribute('xml:lang'); |
| if (!lang) { |
| var lang = children[i].getAttribute('lang'); |
| } |
| if (getTagName(children[i]) == 'nav:label' && lang == CHOSEN_LANGUAGE) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /****************************************** |
| * NavTree |
| ******************************************/ |
| |
| function NavTree(doc, treeElement) { |
| this.doc = doc; |
| this.treeElement = treeElement; |
| this.selected = null; |
| }; |
| |
| NavTree.prototype = new LenyaTree; |
| |
| NavTree.prototype.init = function(id, label) { |
| this.root = new NavNode(id); |
| this.root.tree = this; |
| this.root.depth = 0; |
| this.root.reopen = false; |
| this.root.isprotected = false; |
| this.root.isfolder = true; |
| this.root.label = label; |
| this._currentId = 0; |
| }; |
| |
| NavTree.prototype.loadInitialTree = function(area, path) { |
| var url = encodeURI(AREA_BASE_PATH + PIPELINE_PATH + '?area='+area+'&path='+path+'&language='+CHOSEN_LANGUAGE+'&initial=true&areas='+ALL_AREAS+'&lenya.module=sitetree'); |
| |
| callback = function(fragment, param) { |
| var tree = param[0]; |
| var area = param[1]; |
| var path = param[2]; |
| tree.initialTreeLoaded(fragment); |
| var selectedItem = tree.getItemByPath(PUBLICATION_ID+'/'+area+path) |
| if (selectedItem != false) { |
| tree.select(selectedItem); |
| } |
| } |
| |
| var param = new Array(this, area, path); |
| loadAsyncXML(url, callback, param); |
| }; |
| |
| NavTree.prototype.initialTreeLoaded = function(xml) |
| { |
| var root = xml.documentElement; |
| var children = root.childNodes; |
| var items=[]; |
| var item; |
| for (var i = 0; i < children.length; i++) { |
| if (getTagName(children[i]) == "nav:site") { |
| item = this.addLoadedSite(children[i]); |
| items.push(item); |
| item.addNodesRec(children[i]); |
| } |
| } |
| this.root.addItems(items); |
| this.root.open(); |
| } |
| |
| NavTree.prototype.addLoadedSite = function(site) |
| { |
| var langSuffix = ''; |
| if (CHOSEN_LANGUAGE!=DEFAULT_LANGUAGE) langSuffix = '_'+CHOSEN_LANGUAGE; |
| |
| var siteArea = site.getAttribute('area'); |
| var newSite = new NavNode(siteArea, this.root); |
| newSite.init(); |
| |
| newSite.isfolder = isNodeFolder(site); |
| newSite.area = siteArea; |
| newSite.path = '/'; |
| newSite.isprotected = isNodeProtected(site); |
| newSite.href = site.getAttribute('href') + "/" + langSuffix; |
| newSite.langSuffix = langSuffix; |
| newSite.label = site.getAttribute('label'); |
| |
| return newSite; |
| } |
| |
| NavTree.prototype.handleItemClick = function(item, event) { |
| if (!item.isprotected) { // && item.root!=item) { |
| href = encodeURI(item.href + "?lenya.usecase=tab.overview"); |
| window.location = href; |
| } |
| }; |
| |
| /* |
| overriding this function because of a bug in lenya: |
| the area cannot be clickable because lenya expects |
| a document for the area. |
| */ |
| NavTree.prototype.createItemHtml = function(item) { |
| var div = this.doc.createElement('div'); |
| div.className = 'treenode'; |
| |
| // place a reference to the item on the div |
| div.treeitem = item; |
| |
| var table = this.doc.createElement('table'); |
| div.appendChild(table); |
| var tbody = this.doc.createElement('tbody'); |
| table.appendChild(tbody); |
| var tr = this.doc.createElement('tr'); |
| tbody.appendChild(tr); |
| |
| // add the lines: |
| this.addLines(item, tr); |
| |
| // add the opensign |
| var td1 = this.doc.createElement('td'); |
| tr.appendChild(td1); |
| item.opensign = this.getCloseSign(item); |
| item.opensign.className = 'treenode_sign'; |
| |
| if (this.getSignType(item) == 'T') { |
| // if the label of this item is too long the line will wrap |
| // by setting the background image we get a continuos line |
| td1.style.backgroundImage = 'url('+IMAGE_PATH+'vertical-line.gif)'; |
| } |
| |
| td1.appendChild(item.opensign); |
| |
| // add the label |
| var td2 = this.doc.createElement('td'); |
| tr.appendChild(td2); |
| td2.className = 'lenya-info-label-td'; |
| var line = this.createItemLine(item); |
| td2.appendChild(line); |
| |
| // make root node not clickable |
| if (item.depth > 0) { |
| addEventHandler(line, 'click', this.handleItemClick, this, item); |
| } |
| addEventHandler(item.opensign, 'click', this.handleItemSignClick, |
| this, item); |
| |
| if (this.selected == item.getPath()) { |
| this.unselect(); |
| this.select(item); |
| div.className = 'selected_node'; |
| }; |
| |
| return div; |
| }; |
| |