/* * WebFXCookie class */ function WebFXCookie() { if (document.cookie.length) { this.cookies = ' ' + document.cookie; } } WebFXCookie.prototype.setCookie = function (key, value) { document.cookie = key + "=" + escape(value) + "; path=/"; } WebFXCookie.prototype.getCookie = function (key) { if (this.cookies) { var start = this.cookies.indexOf(' ' + key + '='); if (start == -1) { return null; } var end = this.cookies.indexOf(";", start); if (end == -1) { end = this.cookies.length; } end -= start; var cookie = this.cookies.substr(start,end); return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1)); } else { return null; } } function jsioCoolTree(element, imagePaths, defaultPageForPartURL) { /* Based on a vbscript IE only HTC component by Stedy Eddy Converted to a cross browser standards compliant javascript include by Simon Greaves 2005 Keyboard navigation improved for Accessibility 2009 */ //API... //collapseChildren() //expandChildren() //collapseAll() //expandAll() //setSelectedItem() //getSelectedItem() // spg:: assume index.htm unless defaultPage is specified // When tree attempts to synch on init it will look // for defaultPage if a partial url was used to get to page defaultPageForPartURL = (defaultPageForPartURL ? defaultPageForPartURL : "index.htm"); var childNodeImageUrl; var parentNodeCollapsedImageUrl; var parentNodeExpandedImageUrl; var defaultParentImageUrl; var defaultChildImageUrl; var expandedParentImageUrl; var objLI_Current; // is actually a reference to the current A tag var me = this; var sessionCookie = new WebFXCookie(); objLI_Current = null; this.init = function () { element.onclick = coolTreeOnClick; // spg removed double click functionality // element.ondblclick = coolTreeOnDblClick; element.onmouseover = coolTreeOnMouseOver; element.onmouseout = coolTreeOnMouseOut; element.onmousedown = coolTreeOnMouseDown; element.onmouseup = coolTreeOnMouseUp; element.onkeydown = coolTreeOnKeyDown; childNodeImageUrl = imagePaths.childNodeImageUrl; parentNodeCollapsedImageUrl = imagePaths.parentNodeCollapsedImageUrl; parentNodeExpandedImageUrl = imagePaths.parentNodeExpandedImageUrl; defaultParentImageUrl = imagePaths.defaultParentImageUrl; defaultChildImageUrl = imagePaths.defaultChildImageUrl; expandedParentImageUrl = imagePaths.expandedParentImageUrl; parentNodeCollapsedImageAlt = "Open Folder"; parentNodeExpandedImageAlt = "Close Folder"; setTreeBorder(); // setRootParents(); setTreeNodeImages(); if (element.getAttribute("width")) { element.style.width = element.getAttribute("width"); } if (element.getAttribute("height")) { element.style.height = element.getAttribute("height"); } var lastSelectedItem = sessionCookie.getCookie("lastSelectedItem"); var pathFrag = document.location.pathname.split('/').reverse()[2] + '/' + document.location.pathname.split('/').reverse()[1] + '/' + document.location.pathname.split('/').reverse()[0]; pathFrag = (pathFrag == document.location.pathname.split('/').reverse()[1] + '/' ? pathFrag + defaultPageForPartURL : pathFrag); //traverse all LIs var liTags = element.getElementsByTagName("LI"); var hiDone = false; for (var i=0;i < liTags.length;i++) { //spg modified character used to join liTags[i].id = element.id + '_' + i; if (i==0) { //need to set up a handler on the first focusable element in tree to support keyboard navigation to the tree var firstTabTarget = getHtmlElement(liTags[i], "IMG",2); firstTabTarget.onfocus = function () {selectNode(this.nextSibling,true)}; //assumes A tag is next sibling } //spg //highlight the first li that has an a tag that has an href that contains the pathFrag of the current document //and expand to root any others that match var aTag = getHtmlElement(liTags[i], "A"); if (aTag) { if (aTag.href.indexOf(pathFrag) != -1) { if (!hiDone) { //highlightNode(aTag); selectNode(aTag, true); hiDone = true; } expandToRoot(liTags[i]); } } //pre expand nodes if declared in markup if ((liTags[i].className.indexOf("expanded") != -1 && sessionCookie.getCookie(liTags[i].id) != "0") || sessionCookie.getCookie(liTags[i].id) == "1") { toggleNode(liTags[i]); } } if (lastSelectedItem) { //selectNode(getHtmlElement(document.getElementById(lastSelectedItem), "A"), true); //highlightNode(getHtmlElement(document.getElementById(lastSelectedItem), "A")); } setTabBehaviour(); } function setTreeBorder() { //spg return; switch(parseInt(element.getAttribute("borderStyle"))) { case 0: element.style.border = ""; break; case 1: element.style.border = "1px solid black"; break; case 2: element.style.border = "1px inset window"; break; case 3: element.style.border = "2px inset window"; break; default: element.style.border = ""; break; } } //spg /* function setRootParents() { var allRootParents = getChildElements(element,"LI"); for (var i = 0; i < allRootParents.length ; i++) { allRootParents[i].className = allRootParents[i].className + " topLevelFolder"; } } */ function setTreeNodeImages() { var el; var saveNodeType; var i; var liTags; var aTags; var newEl; aTags = element.getElementsByTagName("A"); for (i = 0; i < aTags.length ; i++) { el = aTags[i]; el.hideFocus = true; } el = null; liTags = element.getElementsByTagName("LI"); //spg ie6 bug with injected images not being sourced from cache so //need images declared in markup instead /* //inject the pict and icon images for all LI elements for (i = 0; i < liTags.length ; i++) { //pict img el = liTags[i]; newEl = document.createElement("IMG"); el.insertBefore(newEl,el.firstChild); //icon img newEl = document.createElement("IMG"); el.insertBefore(newEl,el.firstChild); } */ for (i = 0; i < liTags.length ; i++) { el = liTags[i]; var elChildren = getChildElements(el); //spg /* saveNodeType = elChildren[0].className.toUpperCase(); setIconProperties(saveNodeType, elChildren[0]); setPictProperties(saveNodeType, elChildren[1].className.toUpperCase(), elChildren[1]); */ //spg elChildren[0].className = "icon"; elChildren[1].className = "pict"; } } function setIconProperties(nodeType, el) { var strImageURL; if (nodeType == "ICON") { el.style.height = "16px"; el.style.width = "16px"; } else { //if its parent LI doesn't have any child ULs then its a leaf if (getHtmlElement(el.parentNode,"UL")) { strImageURL = parentNodeCollapsedImageUrl; } else { strImageURL = childNodeImageUrl; } //spg /* switch(nodeType) { case "PARENTNODE": strImageURL = parentNodeCollapsedImageUrl; break; case "CHILDNODE": strImageURL = childNodeImageUrl; break; default: strImageURL = childNodeImageUrl; break; } */ el.setAttribute("src", strImageURL); el.style.height = "16px"; el.style.width = "16px"; el.className = "icon"; } } function setPictProperties(nodeType, pictType, el) { var strImageURL; if (pictType == "PICT") { el.style.height = "16px"; el.style.width = "16px"; } else { //if its parent LI doesn't have any child ULs then its a leaf if (getHtmlElement(el.parentNode,"UL")) { strImageURL = defaultParentImageUrl; } else { strImageURL = defaultChildImageUrl; } //spg /* switch(nodeType) { case "PARENTNODE": strImageURL = defaultParentImageUrl; break; case "CHILDNODE": strImageURL = defaultChildImageUrl; break; default: strImageURL = defaultChildImageUrl; break; } */ el.setAttribute("src", strImageURL); el.style.height = "16px"; el.style.width = "16px"; el.className = "pict"; } } function coolTreeOnClick(evt) { var objUnknown; var bHrefTarget = false; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; /* if (window.event){ evt.cancelBubble = true; evt.returnValue = false; } else { evt.stopPropagation(); evt.preventDefault(); } */ switch(objUnknown.tagName.toUpperCase()) { case "A": //spg handle selecting items with no active link if (objUnknown.href != "") { selectNode(objUnknown, false); bHrefTarget = true; } break; //spg handle case where there is an aconym embedded within the a tag that has a target case "ACRONYM": if (objUnknown.parentNode.tagName.toUpperCase()=="A" && objUnknown.parentNode.href != ""){ selectNode(objUnknown.parentNode, false); bHrefTarget = true; } break; case "IMG": if (isFolder(objUnknown.parentNode)) { if ((objUnknown.className.toUpperCase()) == "ICON") { toggleNode(objUnknown.parentNode); //spg ignore highlighting inactive items if (getHtmlElement(objUnknown.parentNode, "A").href != "") { selectNode(objLI_Current, false); } } else { //spg ignore highlighting inactive items if (getHtmlElement(objUnknown.parentNode, "A").href != "") { //spg - deviate from original //spg //selectNode(getHtmlElement(objUnknown.parentNode, "A"), true); } } } else { //spg ignore highlighting inactive items if (getHtmlElement(objUnknown.parentNode, "A").href != "") { //spg - deviate from original //spg //selectNode(getHtmlElement(objUnknown.parentNode, "A"), true); } } break; default: //spg ignore highlighting inactive items if (getHtmlElement(objUnknown.parentNode, "A").href != "") { selectNode(objLI_Current, false); } break; } if (!bHrefTarget) { if (window.event){ evt.cancelBubble = true; evt.returnValue = false; } else { evt.stopPropagation(); evt.preventDefault(); } } objUnknown = null; evt = null; } function coolTreeOnDblClick(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; if (window.event){ evt.cancelBubble = true; evt.returnValue = false; } else { evt.stopPropagation(); evt.preventDefault(); } if(objUnknown.tagName.toUpperCase()=="IMG") { if (isFolder(objUnknown.parentNode)) { if ((objUnknown.className.toUpperCase()) == "PICT") { toggleNode(objUnknown.parentNode); selectNode(objLI_Current, false); } } } objUnknown = null; evt = null; } function coolTreeOnMouseOver(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; //spg handle the case when an ACRONYM exists within an A tag if ((objUnknown.tagName.toUpperCase()) == "ACRONYM" && (objUnknown.parentNode.tagName.toUpperCase()) == "A") { objUnknown = objUnknown.parentNode; } if ((objUnknown.tagName.toUpperCase()) == "A") { //objUnknown.className = "clsMouseOver"; var newClassStr = objUnknown.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objUnknown.className = newClassStr; objUnknown.className = objUnknown.className + " clsMouseOver "; //spg /* if ((objUnknown.offsetLeft + objUnknown.offsetWidth) >= element.offsetWidth) { element.title = objUnknown.firstChild.nodeValue; } */ //spg if (objUnknown == objLI_Current) { objUnknown.className = objUnknown.className + " clsCurrentHasFocusFont "; } } objUnknown = null; } function coolTreeOnMouseOut(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; //spg handle the case when an ACRONYM exists within an A tag if ((objUnknown.tagName.toUpperCase()) == "ACRONYM" && (objUnknown.parentNode.tagName.toUpperCase()) == "A") { objUnknown = objUnknown.parentNode; } if (objUnknown != objLI_Current) { if ((objUnknown.tagName.toUpperCase()) == "A") { //objUnknown.className = ""; element.title = ""; var newClassStr = objUnknown.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objUnknown.className = newClassStr; } } else { if ((objUnknown.tagName.toUpperCase()) == "A") { //objUnknown.className = "clsCurrentHasFocus"; var newClassStr = objUnknown.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objUnknown.className = newClassStr; objUnknown.className = objUnknown.className + " clsCurrentHasFocus "; } } objUnknown = null; } function coolTreeOnMouseDown(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; //spg handle the case when an ACRONYM exists within an A tag if ((objUnknown.tagName.toUpperCase()) == "ACRONYM" && (objUnknown.parentNode.tagName.toUpperCase()) == "A") { objUnknown = objUnknown.parentNode; } //spg ignore items with inactive links if ((objUnknown.tagName.toUpperCase()) == "A" && (objUnknown.href != "")) { //objUnknown.className = "clsMouseDown"; var newClassStr = objUnknown.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objUnknown.className = newClassStr; objUnknown.className = objUnknown.className + " clsMouseDown "; //spg if (objUnknown == objLI_Current) { objUnknown.className = objUnknown.className + " clsCurrentHasFocusFont "; } } objUnknown = null; } function coolTreeOnMouseUp(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; //spg handle the case when an ACRONYM exists within an A tag if ((objUnknown.tagName.toUpperCase()) == "ACRONYM" && (objUnknown.parentNode.tagName.toUpperCase()) == "A") { objUnknown = objUnknown.parentNode; } if ((objUnknown.tagName.toUpperCase()) == "A") { //objUnknown.className = "clsMouseOver"; var newClassStr = objUnknown.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objUnknown.className = newClassStr; objUnknown.className = objUnknown.className + " clsMouseOver "; //spg if (objUnknown == objLI_Current) { objUnknown.className = objUnknown.className + " clsCurrentHasFocusFont "; } } objUnknown = null; } function coolTreeHandleDown(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; if (window.event){ evt.cancelBubble = true; evt.returnValue = false; } else { evt.stopPropagation(); evt.preventDefault(); } if ((objUnknown.className.toUpperCase()) == "PICT") { objUnknown = getHtmlElement(objUnknown.parentNode, "A"); } if ((objUnknown.tagName.toUpperCase()) == "A") { selectNode (objUnknown, false); if (element.menu != "") { showMenu(); } } objUnknown = null; evt = null; } function coolTreeOnKeyDown(evt) { var objUnknown; evt = (evt) ? evt : ((window.event) ? window.event : null); objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null; //don't handle the tab key specifically - let it take its course if (evt.keyCode == 9){ return;} //dont handle the return key specifically - let it take its course if (evt.keyCode == 13) { return;} if (window.event){ evt.cancelBubble = true; evt.returnValue = false; } else { evt.stopPropagation(); evt.preventDefault(); } if (!objLI_Current) { var defaultLIText = getDefaultLIText(); if (defaultLIText != "") { me.setSelectedItem(defaultLIText); } else { return; } } switch(evt.keyCode) { case 9: //tab key //not handled specifically /* if (evt.shiftKey) {movePrevious();} else {moveNext();} */ break; case 13: //enter key //not handled specifically //coolTreeOnClick(); //if (objUnknown.nodeName.toUpperCase() == "A") {objUnknown.click();} break; case 37: //left arrow key moveLeft(); break; case 38: //up arrow key moveUp(); break; case 39: //right arrow key moveRight(); break; case 40: //down arrow key moveDown(); break; case 188: //"<" key movePrevious(); break; case 190: //">" key moveNext(); break; } evt = null; } function moveNext() { var objLI_Temp; var objLI_New; var objIMG; objIMG = getHtmlElement(objLI_Current.parentNode, "IMG"); if ((objIMG.src).indexOf(imagePaths.parentNodeExpandedImageUrl.split('/').reverse()[0]) != -1) { objLI_New = getFirstChild(objLI_Current.parentNode); selectNode (getHtmlElement(objLI_New, "A"), false); } else { if (isFolder(objLI_Current.parentNode)) { expandNode(objLI_Current.parentNode, objIMG); objLI_New = getFirstChild(objLI_Current.parentNode); if (objLI_New != null) { selectNode (getHtmlElement(objLI_New, "A"), false); } } else { objLI_Temp = objLI_Current.parentNode; objLI_New = getNextSibling(objLI_Temp); while (objLI_New == null) { objLI_Temp = getParent(objLI_Temp); if (objLI_Temp == null) { objLI_New = objLI_Current.parentNode; } else { objLI_New = getNextSibling(objLI_Temp); } } selectNode(getHtmlElement(objLI_New, "A"), false); } } objLI_New = null; objLI_Temp = null; objIMG = null; } function movePrevious() { moveUp(); } function moveUp() { var objLI_New; var objIMG; objLI_New = getPreviousSibling(objLI_Current.parentNode); if (objLI_New != null) { objIMG = getHtmlElement(objLI_New, "IMG"); if (objIMG.src.indexOf(imagePaths.parentNodeExpandedImageUrl.split('/').reverse()[0]) != -1) { objLI_New = getLastChildEx(objLI_New); // objLI_New = getLastChild(objLI_New); } selectNode(getHtmlElement(objLI_New, "A"), false); } else { objLI_New = getParent(objLI_Current.parentNode); if (objLI_New != null) { selectNode(getHtmlElement(objLI_New, "A"), false); } } objIMG = null; objLI_New = null; } function moveDown() { var objLI_New; var objLI_Temp; var objIMG; objIMG = getHtmlElement(objLI_Current.parentNode, "IMG"); if (objIMG.src.indexOf(imagePaths.parentNodeExpandedImageUrl.split('/').reverse()[0]) != -1) { objLI_New = getFirstChild(objLI_Current.parentNode); selectNode(getHtmlElement(objLI_New, "A"), false); } else { objLI_Temp = objLI_Current.parentNode; objLI_New = getNextSibling(objLI_Temp); while (objLI_New == null) { objLI_Temp = getParent(objLI_Temp); if (objLI_Temp == null) { objLI_New = objLI_Current.parentNode; } else { objLI_New = getNextSibling(objLI_Temp); } } selectNode(getHtmlElement(objLI_New, "A"), false); } objLI_New = null; objLI_Temp = null; objIMG = null; } function moveLeft() { var objLI_New; var objIMG; objIMG = getHtmlElement(objLI_Current.parentNode, "IMG"); if (objIMG.src.indexOf(imagePaths.parentNodeExpandedImageUrl.split('/').reverse()[0]) != -1) { toggleNode(objLI_Current.parentNode); } else { objLI_New = getParent(objLI_Current.parentNode); if (objLI_New != null) { selectNode(getHtmlElement(objLI_New, "A"), false); } } objLI_New = null; objIMG = null; } function moveRight() { var objLI_New; var objIMG; objIMG = getHtmlElement(objLI_Current.parentNode, "IMG"); if (objIMG.src.indexOf(imagePaths.parentNodeExpandedImageUrl.split('/').reverse()[0])!= -1) { moveDown(); } else { if (isFolder(objLI_Current.parentNode)) { toggleNode(objLI_Current.parentNode); } } objLI_New = null; objIMG = null; } function toggleNode(objLI,toState) { var objIMG; objIMG = getHtmlElement(objLI, "IMG"); var stringToFind = parentNodeCollapsedImageUrl.substr(parentNodeCollapsedImageUrl.lastIndexOf("/") + 1); if (objIMG.src.indexOf(stringToFind) == -1) { collapseNode(objLI, objIMG); } else { expandNode(objLI, objIMG); } objIMG = null; } function collapseNode(objLI, objIMG) { var objUL; var objFolderIMG; objUL = getHtmlElement(objLI, "UL"); if (objUL != null) { if (objIMG != null) { objIMG.setAttribute("src", parentNodeCollapsedImageUrl); //spg objIMG.setAttribute("alt", parentNodeCollapsedImageAlt); objUL.style.display = "none"; } objFolderIMG = getHtmlElement(objLI,"IMG",2); if (objFolderIMG != null) { objFolderIMG .setAttribute("src", defaultParentImageUrl); } //spg sessionCookie.setCookie(objLI.id, "0"); } objUL = null; } function expandNode(objLI, objIMG) { var objUL; objUL = getHtmlElement(objLI, "UL"); var objFolderIMG; if (objUL != null) { if (objIMG != null) { objIMG.setAttribute("src", parentNodeExpandedImageUrl); //spg objIMG.setAttribute("alt", parentNodeExpandedImageAlt); //objUL.style.filter = "blendTrans(duration=0.50)" //objUL.filters.blendTrans.apply(); objUL.style.display = "list-item"; //objUL.style.visibility = "visible"; //objUL.filters.blendTrans.play(); } objFolderIMG = getHtmlElement(objLI,"IMG",2); if (objFolderIMG != null) { objFolderIMG .setAttribute("src", expandedParentImageUrl); } //spg sessionCookie.setCookie(objLI.id, "1"); } objUL = null; } function selectNode(objLI, blnRunExpando, withoutScroll) { //spg objLI is actually the A tag highlightNode(objLI); if (withoutScroll) { expandToRoot(objLI.parentNode); } else { scrollIntoView(objLI, blnRunExpando); } if(objLI && objLI.parentNode && objLI.parentNode.id) { sessionCookie.setCookie("lastSelectedItem",objLI.parentNode.id); } } function highlightNode(objLI) { //spg objLI is actually expected to be the A tag if (objLI != null) { //objLI.className = "clsCurrentHasFocus"; var newClassStr = objLI.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objLI.className = newClassStr; objLI.className = " clsCurrentHasFocus " + " clsCurrentHasFocusFont " + objLI.className; //spg - avoid normal highlighting when link has no target if (objLI.href == "") {objLI.style.background = "ccc";} if (objLI != objLI_Current) { if (objLI_Current != null) { //objLI_Current.className = ""; var newClassStr = objLI_Current.className.replace(/clsMouseDown/gi,""); newClassStr = newClassStr.replace(/clsMouseOver/gi,""); newClassStr = newClassStr.replace(/clsCurrentHasFocus/gi,""); objLI_Current.className = newClassStr; //spg - avoid normal highlighting when link has no target if (objLI_Current.href == "") {objLI_Current.style.background = "fff";} } } objLI_Current = objLI; } } function scrollIntoView(objLI, blnRunExpando) { if (objLI != null) { if (blnRunExpando == true) { expandToRoot(objLI.parentNode); } try { objLI.focus(); } catch (e) {} } } this.expandAll = function() { var i; var liCol = new Array(); var childItem; var objIMG; liCol = element.getElementsByTagName("LI"); for (i = 0; i < liCol.length; i++) { childItem = liCol[i]; if (isFolder(childItem)) { objIMG = getHtmlElement(childItem, "IMG"); expandNode(childItem, objIMG); objIMG = null; } } liCol = null; } this.collapseAll = function() { var liCol; var childItem; var objIMG; liCol = element.getElementsByTagName("LI"); for (var i = 0; i < liCol.length; i++) { childItem = liCol[i]; if (isFolder(childItem)) { objIMG = getHtmlElement(childItem, "IMG"); collapseNode(childItem, objIMG); objIMG = null; } } liCol = null; } function expandToRoot(objStart) { var objParent; var objIMG; objParent = objStart; do { if (isFolder(objParent)) { if (objParent != objStart) { objIMG = getHtmlElement(objParent, "IMG"); expandNode(objParent, objIMG); objIMG = null; } } objParent = objParent.parentNode; } while (objParent != element); objParent = null; } this.expandChildren = function() { var childItem; var objIMG; if (objLI_Current != null) { objIMG = getHtmlElement(objLI_Current.parentNode, "IMG"); expandNode(objLI_Current.parentNode, objIMG); objIMG = null; var elChildren = getChildElements(objLI_Current.parentNode); for ( var i = 0; i < elChildren.length; i++) { childItem = elChildren[i]; if ((childItem.tagName.toUpperCase()) == "UL") { expandSubChildren(childItem); } } } } function expandSubChildren(objUL) { var childItem; var objIMG; var elChildren = getChildElements(objUL); for ( var i = 0; i < elChildren.length; i++) { childItem = elChildren[i]; if (isFolder(childItem)) { objIMG = getHtmlElement(childItem, "IMG"); expandNode(childItem, objIMG); objIMG = null; } if ((childItem.tagName.toUpperCase) == "UL") { expandSubChildren(childItem); } } } this.collapseChildren = function() { var childItem; var objIMG; if (objLI_Current != null) { objIMG = getHtmlElement(objLI_Current.parentNode, "IMG"); collapseNode (objLI_Current.parentNode, objIMG); objIMG = null; var elChildren = getChildElements(objLI_Current.parentNode); for (var i = 0; i < elChildren.length ; i++) { childItem = elChildren[i]; if ((childItem.tagName.toUpperCase) == "UL") { collapseSubChildren(childItem); } } } } function collapseSubChildren(objUL) { var childItem; var objIMG; var elChildren = getChildElements(objUL); for ( var i = 0; i < elChildren.length; i++) { childItem = elChildren[i]; if (isFolder(childItem)) { objIMG = getHtmlElement(childItem, "IMG"); collapseNode(childItem, objIMG); objIMG = null; } if (childItem.tagName.toUpperCase() == "UL") { collapseSubChildren(childItem); } } } this.getSelectedItem = function () { if (objLI_Current != null) { return objLI_Current.firstChild.nodeValue; } else { return null; } } this.setSelectedItem = function(strItem, isPathFrag, withoutScroll) { var childItem; var elChildren = getChildElements(element); for (var i = 0; i < elChildren.length; i++) { childItem = elChildren[i]; var elChildrensChildren = getChildElements(childItem); if (elChildrensChildren.length > 0) { if (setSelectedItemInChildren(childItem, strItem, isPathFrag, withoutScroll)) { return; } } } } function setSelectedItemInChildren(nodeItem, strItem, isPathFrag, withoutScroll) { var childItem; var elChildren = getChildElements(nodeItem); for (var i = 0; i < elChildren.length ; i++) { childItem = elChildren[i]; var elChildrensChildren = getChildElements(childItem); if (elChildrensChildren.length > 0) { if (setSelectedItemInChildren(childItem, strItem, isPathFrag, withoutScroll)) { return true; } } else { //spg: extension to set by url path frag if ((isPathFrag && childItem.href && childItem.href.indexOf(strItem) != -1) || (!isPathFrag && childItem.firstChild && childItem.firstChild.nodeType == 3 && childItem.firstChild.nodeValue == strItem)) // 3= TEXT_NODE { selectNode(childItem, true, withoutScroll); return true; } } } return false; } function getHtmlElement(objParent, strChildTagName) { var i; var objRetVal; var oChildren; objRetVal = null; var nth = 1; var j = 1; if (arguments.length > 2) { nth = arguments[2]; } if (objParent != null) { oChildren = getChildElements(objParent); if (oChildren != null) { for (i = 0; i < oChildren.length; i++) { if ((oChildren[i].tagName.toUpperCase()) == (strChildTagName.toUpperCase())) { if (j==nth) { objRetVal = oChildren[i]; break; } else { j++; } } } } } oChildren = null; return objRetVal; } function getNextSibling(objLI) { var i; var objSiblings; var objRetVal; objRetVal = null; objSiblings = getSiblings(objLI); if (objSiblings != null) { for(i = 0; i < objSiblings.length; i++) { if ((objSiblings[i] == objLI) && (i < (objSiblings.length - 1))) { objRetVal = objSiblings[i + 1]; break; } } } objSiblings = null; return objRetVal; } function getPreviousSibling(objLI) { var i; var objSiblings; var objRetVal; objRetVal = null; objSiblings = getSiblings(objLI); if (objSiblings != null) { for(i = 0; i < objSiblings.length; i++) { if ((objSiblings[i] == objLI) && (i > 0)) { objRetVal = objSiblings[i - 1]; break; } } } objSiblings = null; return objRetVal; } function getFirstChild(objLI) { var i; var objChildren; var objRetVal; objRetVal = null; objChildren = getChildren(objLI); if (objChildren != null) { for (i = 0; i < objChildren.length; i++) { if (objChildren[i].tagName.toUpperCase() == "LI") { objRetVal = objChildren[i]; break; } } } objChildren = null; return objRetVal; } //spg //extended version of getLastChild to get last child of last expanded child function getLastChildEx(objLI) { var objLI_New = getLastChild(objLI); var objIMG; if (objLI_New != null) { objIMG = getHtmlElement(objLI_New, "IMG"); if (objIMG.src.indexOf(imagePaths.parentNodeExpandedImageUrl.split('/').reverse()[0]) != -1) { objLI_New = getLastChildEx(objLI_New); } } return objLI_New; } function getLastChild(objLI) { var i; var objChildren; var objRetVal; objRetVal = null; objChildren = getChildren(objLI); if (objChildren != null) { for (i = objChildren.length - 1; i >= 0; i--) { if (objChildren[i].tagName.toUpperCase() == "LI") { objRetVal = objChildren[i]; break; } } } objChildren = null; return objRetVal; } function getParent(objLI) { var objRetVal; if (objLI != null) { if (objLI.parentNode != null) { objRetVal = objLI.parentNode.parentNode; } } return objRetVal; } function getSiblings(objLI) { var i; var objUL; var objLI_Parent; var objRetVal; objLI_Parent = getParent(objLI); if (objLI_Parent != null) { objUL = objLI.parentNode; var elChildren = getChildElements(objUL); for(i = 0; i < elChildren.length; i++) { if (elChildren[i].tagName.toUpperCase() == "LI") { objRetVal = getChildElements(objUL); break; } } } else { objRetVal = getChildren(objLI_Parent); } objLI_Parent = null; objUL = null; return objRetVal; } function getChildren(objLI) { var i; var j; var objUL; var objRetVal; objRetVal = null; if (objLI != null) { var elChildren = getChildElements(objLI); for (i = 0; i < elChildren.length; i++) { if (elChildren[i].tagName.toUpperCase() == "UL") { objUL = elChildren[i]; var elChildrensChildren = getChildElements(objUL); for (j = 0; j < elChildrensChildren.length; j++) { if (elChildrensChildren[j].tagName.toUpperCase() == "LI") { objRetVal = getChildElements(objUL); break; } } } } } objUL = null; return objRetVal; } function isFolder(objLI) { // element is a folder if it contains a ul element var objUL; objUL = getHtmlElement(objLI, "UL"); if (objUL == null) {return false;} else {return true;} } function getChildElements (el) { //return a collection containing references to all element child nodes //optionally if an extra arg is passed it is treated as an element tag name selector var childElements = []; var j = 0; var childItem; var tag = ""; if (arguments.length > 1) { tag = arguments[1].toUpperCase(); } for (var i = 0; i < el.childNodes.length; i++) { childItem = el.childNodes[i]; if (childItem.nodeType == 1 && ((tag == "") ? childItem.tagName.toUpperCase() : tag) == childItem.tagName.toUpperCase()) {//ELEMENT_NODE = 1 childElements[j] = childItem; j++; } } return childElements; } function getDefaultTabTarget() { var allRootParents; var allTargets; var result = null; allRootParents = getChildElements(element,"LI"); if (allRootParents.length > 0) { var allTargets = getChildElements(allRootParents[0],"IMG"); if (allTargets.length > 0) { result = allTargets[1]; } } return result; } function getDefaultLIText() { var allRootParents; var allTargets; var result = ""; allRootParents = getChildElements(element,"LI"); if (allRootParents.length > 0) { var allTargets = getChildElements(allRootParents[0],"A"); if (allTargets.length > 0) { result = allTargets[0].firstChild.nodeValue; } } return result; } function setTabBehaviour() { var allRootParents; var allTargets; var defaultTarget = null; element.tabIndex = "-1"; //prevent tab to overall widget // prevent tab to all contained elements allElements = element.getElementsByTagName("*"); for (var i=0;i < allElements.length;i++) { allElements[i].tabIndex = "-1"; } //make first parent in root tabable defaultTarget = getDefaultTabTarget() if (defaultTarget) {defaultTarget.tabIndex = "0"}; } }