// ///// NAVIGATION BASE var AbstractBrowser = function () { // ///// STATIC AbstractBrowser.AGENT_MZ = 1; AbstractBrowser.AGENT_OP = 2; AbstractBrowser.AGENT_IE = 3; AbstractBrowser.AGENT_SF = 4; AbstractBrowser.AGENT_UNKNOWN = 0; AbstractBrowser.CLASS_CSS2 = 1; AbstractBrowser.CLASS_UNKNOWN = 0; AbstractBrowser.SYSTEM_WIN = 1; AbstractBrowser.SYSTEM_MAC = 2; AbstractBrowser.SYSTEM_UNKNOWN = 0; // ///// MEMBERS this.agent = null; this.version = null; this.system = null; // ///// CONSTRUCTOR // get agent name if(document.layers || navigator.appVersion.match(/MSIE 4/gi)) { this.agent = AbstractBrowser.AGENT_UNKNOWN; this.version = 0; } else if(navigator.userAgent.match(/gecko/gi) || navigator.userAgent.match(/netscape/gi)) { this.agent = AbstractBrowser.AGENT_MZ; this.version = 7; } else if(navigator.userAgent.match(/safari/gi)) { this.agent = AbstractBrowser.AGENT_SF; this.version = 7; } else if(navigator.userAgent.match(/opera/gi) && navigator.userAgent.match(/7\./gi)) { if(parseInt(navigator.userAgent.charAt(navigator.userAgent.indexOf("/") + 1)) < 7) { this.agent = AbstractBrowser.AGENT_UNKNOWN; this.version = 0; } else { this.agent = AbstractBrowser.AGENT_OP; this.version = 7; } } else if(navigator.userAgent.match(/msie/gi)) { this.agent = AbstractBrowser.AGENT_IE; this.version = (navigator.appVersion.match(/MSIE 5/gi))? 5 : 6; } else { this.agent = AbstractBrowser.AGENT_UNKNOWN; this.version = 0; } // get system name if(navigator.platform.match(/win/gi)) { this.system = AbstractBrowser.SYSTEM_WIN; } else if(navigator.platform.match(/mac/gi)) { this.system = AbstractBrowser.SYSTEM_MAC; } else { this.system = AbstractBrowser.SYSTEM_UNKNOWN; } // ///// METHODS // getCurrentStyle this.getCurrentStyle = function(node, prop) { if(this.agent == AbstractBrowser.AGENT_MZ && this.system == AbstractBrowser.SYSTEM_WIN) { try { return window.getComputedStyle(node, null)[prop]; } catch(e) { return null; } } if(this.agent == AbstractBrowser.AGENT_IE) { return node.currentStyle[prop]; } return null; }; // print this.print = function(win) { if(!win) win = window.top; if(this.agent == AbstractBrowser.AGENT_IE) win.document.execCommand("Print"); else win.print(); }; // getNextNode this.getNextNode = function(node) { while(node.nextSibling) { node = node.nextSibling; if(node.nodeName != "#text") return node; } }; // getPreviousNode this.getPreviousNode = function(node) { while(node.previousSibling) { node = node.previousSibling; if(node.nodeName != "#text") return node; } }; // getNextNodeByTagName this.getNextNodeByTagName = function(node, tagname) { while(node.nextSibling) { node = node.nextSibling; if(node.nodeName.toUpperCase() == tagname.toUpperCase()) return node; } }; // getEvent this.getEvent = function(args) { // args: arguments object of event-handler function if(this.agent == AbstractBrowser.AGENT_IE) { return (window.event)? window.event : null; } else { return (args && args[0] && args[0].eventPhase)? args[0] : null; } }; // getEventSource this.getEventSource = function(e) { if(this.agent == AbstractBrowser.AGENT_IE) { return (e.srcElement)? e.srcElement : null; } else { var src = e.target; // event.target may be text node on early mozillas if(src && src.nodeName == "#text") src = src.parentNode; return (src)? src : null; } }; }; var browser = new AbstractBrowser(); // //////////////////////////////////////////////////////////////////////////// var Navigation = function(id, treerootid, treewritedelegate, activeitemid) { // ///// MEMBERS this.id = id; this.isinit = false; this.browser = null; this.treerootid = treerootid; this.treeroot = null; this.treewritedelegate = (typeof treewritedelegate == "function")? treewritedelegate : null; this.views = new Object(); this.activeitemid = activeitemid; this.activeitem = null; // ///// CONSTRUCTOR if(!window.browser || !this.id) { throw new Error("Navigation: (id:\"" + this.id + "\") missing critical args!"); } this.browser = window.browser; // register nav in global navs array if(!Navigation.navs) Navigation.navs = new Object(); Navigation.navs[this.id] = this; // register load handler for navigation start if(Navigation.isinit != true) { var loadhandler = function() { Navigation.initAll(true); }; if(typeof window.addEventListener != 'undefined' || typeof document.addEventListener != 'undefined') { var base = (typeof window.addEventListener != 'undefined')? window : document; base.addEventListener('load', loadhandler, false); } else if(typeof window.attachEvent != 'undefined') { window.attachEvent('onload', loadhandler); } else if(browser.agent == AbstractBrowser.AGENT_IE && browser.system == AbstractBrowser.SYSTEM_MAC) { if(typeof window.onload == "function") { var oldhandler = window.onload; var newhandler = function() { oldhandler(); loadhandler(); }; window.onload = newhandler; } else { window.onload = loadhandler; } } Navigation.isinit = true; } // ///// METHODS this.init = function(mustdraw) { if(this.isinit == false) { // link treeroot if(this.treerootid) { // if treerootid is an array, the first element will be the id of the treeroot (this will be used also for url matching) if(this.treerootid.constructor.toString().toLowerCase().indexOf("array") > -1) { var treeroot = document.getElementById(this.treerootid[0]); } else { var treeroot = document.getElementById(this.treerootid); } if(treeroot) { this.treeroot = treeroot; } } // write nav tree this.write(); // get active nav item this.activeitem = this.getActiveItem(); // init nav views for(var viewid in this.views) { this.views[viewid].init(); } // draw navigation if(mustdraw) { this.draw(); } } }; this.getViewById = function(id) { for(var viewid in this.views) { if(viewid == id) return this.views[viewid]; } return null; }; this.addView = function(viewid, view) { view.nav = this; view.id = viewid; this.views[viewid] = view; if(view.addcssurl && view.addcssurl != "") { document.write('\n'); } }; this.draw = function() { for(var viewid in this.views) { this.views[viewid].draw(); } }; this.write = function() { if(this.treeroot && this.treewritedelegate && typeof this.treewritedelegate == "function") { this.treewritedelegate(this.treeroot); } }; this.getActiveItem = function() { // url matching heuristics var directoryIndexes = new Array("index.html", "index.jsp", "default.asp"); var node = null; // if activeitemid is an array, the first element will be the id of the activeitem if(this.activeitemid && this.activeitemid.constructor.toString().toLowerCase().indexOf("array") > -1) { var aid = this.activeitemid[0]; } else var aid = this.activeitemid; // loads this.activeitemid if it is just the NAME of the variable with the real id if(window[aid]) aid = window[aid]; if(aid) { if(!node) node = document.getElementById(aid); } // try to map it based on the page url if(!node && this.treeroot) { var node = null; var rexpHost = new RegExp(document.location.protocol + "//" + document.location.host); var docPath = document.location.href.replace(rexpHost, ""); docPath = docPath.replace(/\#.*/, ""); docPath = docPath.replace(/\?.*/, ""); var navlinks = this.treeroot.getElementsByTagName("a"); for(var i = 0; i < navlinks.length; i++) { if(browser.agent == AbstractBrowser.AGENT_IE || browser.agent == AbstractBrowser.AGENT_OP) { var rexpEmptyHref = new RegExp(/(\#)/); rexpEmptyHref.exec("#"); // reset RegExp object var rexpHref = new RegExp(/<[aA][^>]+href=["]{0,1}([^"|^\s]+)/); rexpHref.exec(navlinks[i].outerHTML); var lnkPathBIS = navlinks[i].outerHTML.match(/<[aA][^>]+href=["]{0,1}([^"|^\s]+)/gi); var lnkPath = RegExp.$1; if(lnkPath.charAt(lnkPath.length - 1) == "#" || lnkPath.charAt(lnkPath.length - 1) == "?") { lnkPath = lnkPath.replace(new RegExp(document.location.href), ""); } lnkPath = lnkPath.replace(rexpHost, ""); } else { lnkPath = navlinks[i].getAttribute("href").replace(rexpHost, ""); } if(lnkPath != "#") { lnkPath = lnkPath.replace(/\#.*/, ""); lnkPath = lnkPath.replace(/\?.*/, ""); if(docPath == lnkPath) { return navlinks[i].parentNode; } if(lnkPath.indexOf(docPath) == 0 && lnkPath.lastIndexOf("/") == docPath.lastIndexOf("/")) { for(var j = 0; j < directoryIndexes.length; j++) { var al = (lnkPath.lastIndexOf("/") == lnkPath.length - 1)? lnkPath + directoryIndexes[j] : lnkPath; var dl = (docPath.lastIndexOf("/") == docPath.length - 1)? docPath + directoryIndexes[j] : docPath; if(al == dl) { return navlinks[i].parentNode; } } } } } } return node; }; return this; }; Navigation.initAll = function(mustdraw) { if(Navigation.navs) { for(var navid in Navigation.navs) { Navigation.navs[navid].init(mustdraw); } } if(Page.adjustLayout && typeof Page.adjustLayout == "function") Page.adjustLayout(); }; Navigation.getById = function(id) { for(var navid in Navigation.navs) { if(navid == id) return Navigation.navs[navid]; } return null; }; // //////////////////////////////////////////////////////////////////////////// var NavigationView = function(viewportid, delegates, constants, addcssurl) { // ///// MEMBERS this.id = null; this.nav = null; this.isinit = false; this.viewportid = viewportid; this.viewport = null; this.delegates = new Array(); this.addcssurl = addcssurl; this.constants = constants; // ///// METHODS this.init = function() { if(this.viewportid) { var viewport = document.getElementById(this.viewportid); if(viewport) { this.viewport = viewport; this.isinit = true; } } }; this.delegates = delegates; this.draw = function() { if(this.isinit) { if(this.delegates["draw"]) this.delegates["draw"](this); } }; }; // //////////////////////////////////////////////////////////////////////////// // ///// MAIN NAVIGATION // delegates var funcs_tab = new Array(); funcs_tab["draw"] = function(viewref) { var consts = viewref.constants; var navid = viewref.nav.id; var viewid = viewref.id; // check for double lines var brs = viewref.viewport.getElementsByTagName("br"); for(var i = 0; i < brs.length; i++) { var items = brs[i].parentNode.parentNode.parentNode.getElementsByTagName("a"); for(var j = 0; j < items.length; j++) { if(items[j].getElementsByTagName("br").length == 0) { items[j].innerHTML = items[j].innerHTML + "
 "; } } } // set active item if(viewref.nav.activeitem) { var node = viewref.nav.activeitem; while(node != viewref.viewport) { node.className = consts.LAYOUT_CLASSNAME_CURRENT; node = node.parentNode.parentNode; } } }; // constants var consts_tab = new Array(); consts_tab["LAYOUT_CLASSNAME_CURRENT"] = "current"; // ///// CONTENT NAVIGATION // delegates var funcs_lefthand = new Array(); funcs_lefthand["draw"] = function(viewref) { // get Click on hole Nav viewref.viewport.onclick = function() { var src = browser.getEventSource(browser.getEvent(arguments)); var name = src.nodeName.toLowerCase(); if(name == "li") { var link = src.getElementsByTagName("a")[0]; if(link.onclick) { link.onclick(); } else { window.location.href = link; } } }; // setup nav var items = viewref.viewport.getElementsByTagName("a"); for(var i = 0; i < items.length; i++) { items[i].navview = viewref; if(items[i].parentNode.className.indexOf("title") != -1) { switch (i) { case 4: items[i].setAttribute("href", "equities.do"); break; case 31: items[i].setAttribute("href", "warrants.do"); break; case 37: items[i].setAttribute("href", "fixed-income.do"); break; case 54: items[i].setAttribute("href", "commodity.do"); break; case 65: items[i].setAttribute("href", "foreign-exchange.do"); break; default: items[i].setAttribute("href", "javascript:void(0)"); }; items[i].onclick = viewref.delegates["title_CLICK"]; } } // pre open var activenode = viewref.nav.activeitem; if(activenode) { activenode.className += "Active"; while(activenode.parentNode.className != "level3") { activenode = activenode.parentNode; activenode.className += "Active"; } // TO EAXPAND THE LIST AFTER THE CLICK ON THE TITLES SUCH AS EQUITY for (var j=0;j < activenode.childNodes.length;j++) if (activenode.childNodes[j].className) activenode.childNodes[j].className += "Active"; } }; funcs_lefthand["title_CLICK"] = function() { var collapseAll = function(navview) { var items = navview.viewport.getElementsByTagName("li"); for(var i = 0; i < items.length; i++) { if(items[i].className.indexOf("Active") != -1 && items[i].id != navview.nav.activeitemid) { items[i].className = items[i].className.substr(0, items[i].className.length - 6); } } var items = navview.viewport.getElementsByTagName("ul"); for(var i = 0; i < items.length; i++){ if(items[i].className.indexOf("Active") != -1) { items[i].className = items[i].className.substr(0, items[i].className.length - 6); } } }; var item = this.parentNode; var childNode = item.childNodes[2]; if (childNode.className == null || childNode.className == "undefined") { childNode = item.childNodes[3]; } if(item.className.indexOf("Active") != -1) { if (item.id.length > 3) { childNode.className = childNode.className.substr(0, childNode.className.length - 6); item.className = item.className.substr(0, item.className.length-6) } else { collapseAll(this.navview); } } else { collapseAll(this.navview); childNode.className += "Active"; item.className += "Active"; while(item.parentNode.className != "level3") { item = item.parentNode; item.className += "Active"; } } if(Page.adjustLayout && typeof Page.adjustLayout == "function") Page.adjustLayout(); }; // ///// RUNTIME tabnav = new Navigation("tabnav", "tabNavRoot", null, "L1_ID"); tabnav.addView("tabmenu", new NavigationView("tabNavRoot", funcs_tab, consts_tab, null)); lefthandnav = new Navigation("lefthandnav", "lefthandNavRoot", null, "L3_ID"); lefthandnav.addView("lefthandmenu", new NavigationView("lefthandNavRoot", funcs_lefthand, null, null));