123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
- // (C) Copyright 2003-2007 Jonathan Turkanis
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
- //--------------Event-handlers------------------------------------------------//
- function toggle(id) { get_tree().find(id).toggle(); }
- function blur_tree()
- {
- if ( window.event &&
- window.event.srcElement &&
- window.event.srcElement.blur &&
- window.event.srcElement != document.body )
- window.event.srcElement.blur();
- else if (target_frame())
- target_frame().window.focus();
- }
- document.onclick = blur_tree;
- //--------------Netscape 4.x-specific-----------------------------------------//
- window.saved_width = window.outerWidth;
- function reload_tree()
- {
- if (window.outerWidth != window.saved_width)
- window.location.reload();
- }
- if (window.Event && Event.RESIZE) {
- window.captureEvents(Event.RESIZE);
- window.onResize = reload_tree;
- }
- //--------------Functions for browser-sniffing--------------------------------//
- function major_version(app)
- {
- var index = navigator.userAgent.indexOf(app);
- if (index == -1)
- return -1;
- return parseInt(navigator.userAgent.charAt(index + app.length + 1));
- }
- function dom_support()
- {
- if (dom_support.cache == null)
- dom_support.cache = dom_support_impl();
- return dom_support.cache;
- }
- function dom_support_impl()
- {
- var version;
- if ( (version = major_version("Mozilla")) != -1 &&
- navigator.userAgent.indexOf("compatible") == -1 )
- return version > 4;
- if ((version = major_version("Opera")) != -1)
- return version > 6;
- if ((version = major_version("Konqueror")) != -1)
- return version > 2;
- if ((version = major_version("Links")) != -1)
- return false;
- return document.getElementById || document.all;
- }
- //--------------Utility functions---------------------------------------------//
- function target_frame()
- {
- return get_tree() ? top.frames[get_tree().target] : null;
- }
- function get_tree() { return document.tree_control; }
- function static_display() { return !dom_support() || get_tree().dump_html; }
- function elt_by_id(id)
- {
- return document.all ?
- document.all[id] :
- document.getElementById ?
- document.getElementById(id) :
- null;
- }
- function replace_query(url, query)
- {
- var pos;
- if ((pos = url.indexOf("?")) != -1)
- url = url.substring(0, pos);
- return url + "?" + query;
- }
- //--------------Functions for HTML-generation---------------------------------//
- function icon_char(state)
- {
- return state == tree_node.expanded ?
- "-" :
- state == tree_node.collapsed ?
- "+" :
- " ";
- }
- function html_list(id, display, margin)
- {
- return "<div id='" + id + "' style='white-space:nowrap;display:" +
- display + "'>";
- }
- function html_list_item(content)
- {
- return "\n<div class='tree-item'>" + content + "</div>";
- }
- function html_anchor(content, cl, href, target)
- {
- return "<a class='" + cl + "' onfocus='blur_tree()" +
- "' href='" + href + "'" +
- (target ? " target='" + target + "'" : "") +
- ">" + content + "</a>";
- }
- //--------------Definition of class tree_node---------------------------------//
- function tree_node__add(text_or_node, link_or_hide, hide)
- {
- if (this.state == tree_node.neutral)
- this.state = tree_node.collapsed;
- var k;
- if (text_or_node.length != null) {
- k = new tree_node(text_or_node, link_or_hide);
- k.hide_kids = hide != null ? hide : false;
- } else {
- k = text_or_node;
- k.hide_kids = link_or_hide != null ? link_or_hide : false;
- }
- k.mom = this;
- if (this.kids == null)
- this.kids = new Array();
- this.kids[this.kids.length] = k;
- return k;
- }
- function tree_node__level()
- {
- var level;
- var node;
- for (node = this.mom, level = -1; node; node = node.mom, ++level)
- ;
- return level;
- }
- function tree_node__parent() { return this.mom; }
- function tree_node__print()
- {
- var icon =
- !static_display() ?
- "<span style='font-family:monospace' class='tree-icon' id='icon" +
- this.id + "'>" + icon_char(this.state) + "</span> " :
- "";
- var handler =
- !static_display() && this.kids ?
- "javascript:toggle(\"id" + this.id + "\")" :
- "";
- var text = "<span class='tree-text'>" + this.text + "</span>"
- var tree = get_tree();
- var indent = tree.indent * this.level();
- return html_list_item(
- "<div style='margin-left:" + (2 * indent) +
- ";text-indent:-" + indent + "'>" +
- ( !tree.dump_html ?
- this.kids ?
- html_anchor(icon, "tree-icon", handler) :
- icon :
- "" ) +
- ( tree.numbered ?
- "" + "<span class='tree-label'>" +
- this.id.substring(1) + "</span>" :
- "" ) +
- " " +
- ( this.link ?
- html_anchor( text, "tree-text", this.link,
- tree.target ) :
- text ) +
- "</div>" +
- this.print_kids()
- );
- }
- function tree_node__print_kids(margin)
- {
- var result = "";
- if (this.kids != null && (!static_display() || !this.hide_kids)) {
- if (margin == null)
- margin = get_tree().indent;
- result += html_list( "list" + this.id,
- this.state == tree_node.collapsed &&
- !static_display()
- ? "none" : "",
- margin );
- for (var z = 0; z < this.kids.length; ++z) {
- var k = this.kids[z];
- k.id = this.id + "." + (z + 1);
- result += k.print();
- }
- result += "</div>";
- }
- return result;
- }
- function tree_node__toggle(expand)
- {
- if ( static_display() ||
- this.kids == null ||
- expand != null && expand ==
- (this.state == tree_node.expanded) )
- {
- return;
- }
- this.state =
- this.state == tree_node.expanded ?
- tree_node.collapsed :
- tree_node.expanded;
- elt_by_id("icon" + this.id).innerHTML =
- icon_char(this.state);
- elt_by_id("list" + this.id).style.display =
- this.state == tree_node.expanded ?
- "" :
- "none";
- }
- function add_methods(obj)
- {
- obj.add = tree_node__add;
- obj.level = tree_node__level;
- obj.parent = tree_node__parent;
- obj.print = tree_node__print;
- obj.print_kids = tree_node__print_kids;
- obj.toggle = tree_node__toggle;
- }
- function tree_node(text, link)
- {
- // Member data
- this.text = text;
- this.link = link;
- this.mom = null;
- this.kids = null;
- this.id = null;
- this.state = 0; // Neutral.
- if (!add_methods.prototype)
- add_methods(this);
- }
- tree_node.neutral = 0;
- tree_node.expanded = 1;
- tree_node.collapsed = 2;
- if (tree_node.prototype)
- add_methods(tree_node.prototype);
-
- //--------------Definition of class tree_control------------------------------//
- function tree_control__add(text, link, hide)
- {
- return this.root.add(text, link, hide);
- }
- function tree_control__draw()
- {
- var tree = get_tree();
- var dom = dom_support();
- var element = dom ? elt_by_id('tree_control') : null;
- if (element || !dom || tree.drawn) {
- var html = tree.html();
- if (tree.dump_html) {
- var pat = new RegExp("<", "g");
- html = "<pre>" + html.replace(pat, "<") + "</pre>";
- if (document.body.innerHTML)
- document.body.innerHTML = html;
- else
- document.write(html);
- } else if (dom) {
- element.innerHTML = html;
- } else {
- document.open();
- document.write(
- "<body>" + html +
- ( major_version("MSIE") == 3 ?
- "<noscript>" :
- document.layers ?
- "<layer visibility='hide'>" :
- "<table width=0 height=0 style='" +
- "visibility:hidden;display:none'><tr><td>" )
- );
- document.close();
- }
- tree.drawn = true;
- tree.load();
- } else {
- var t = navigator.userAgent.indexOf("Clue") != -1 ? 500 : 100;
- setTimeout("tree_control__draw()", t);
- }
- }
- function tree_control__find(id)
- {
- var indices = id.split(".");
- var node = this.root;
- for (var z = 1; z < indices.length; ++z)
- node = node.kids[indices[z] - 1];
- return node;
- }
- function tree_control__html()
- {
- return "<table><tr><td align='left'><table width=150><tr><td>" +
- "<h1 class=tree-caption>" + this.caption + "</h1></td></tr>" +
- ( !static_display() ?
- "<tr><td><p class='tree-sync'><a title='reload current " +
- "page with a url suitable for bookmarking' class=" +
- "'tree-sync' href='javascript:get_tree().sync()'>" +
- "[link to this page]</a></p></td></tr>" :
- "" ) +
- "</table></td></tr><tr><td>" + this.root.print_kids(0) +
- "</td></tr></table>";
- }
- function load_target(url)
- {
- var target;
- if ((target = target_frame()) && target.location.href != url)
- target.location.replace(url);
- else {
- setTimeout("load_target('" + url + "')", 100);
- }
- }
- function tree_control__load()
- {
- var query;
- if ((query = top.location.search).length == 0)
- return;
- query = query.substring(1);
- var eq;
- if ((eq = query.indexOf("=")) != -1) {
- if (query.substring(0, 4) == "page") {
- load_target(unescape(query.substring(eq + 1)));
- return;
- }
- query = query.substring(eq + 1);
- }
- var indices = query.split(".");
- if (!indices.length)
- return;
- this.reset();
- var node = this.root;
- for (var z = 0; z < indices.length; ++z) {
- var i = parseInt(indices[z]) - 1;
- if (!node.kids || i < 0 || node.kids.length <= i)
- break;
- node = node.kids[i];
- node.toggle(/*z != indices.length - 1*/);
- }
- if (node.link)
- load_target(node.link);
- }
- function tree_control__recurse(op)
- {
- var stack = new Array();
- stack[stack.length] = this.root;
- while (stack.length) {
- var node = stack[stack.length - 1];
- stack.length -=1 ; // Konqueror 2.
- op(node);
- if (node.kids)
- for (var z = 0; z < node.kids.length; ++z)
- stack[stack.length] = node.kids[z];
- }
- }
- function tree_control__reset()
- {
- if (!dom_support())
- return;
- this.recurse(new Function("x", "if (x.parent()) x.toggle(false);"));
- }
- function sync_node(node)
- {
- if (!node.link)
- return;
- var tgt = target_frame().location.href;
- var pos;
- if ((pos = tgt.indexOf("?")) != -1)
- tgt = tgt.substring(0, pos);
- if (node.link.indexOf("://") != -1) {
- if (node.link != tgt)
- return;
- } else {
- var base = window.location.href;
- if ((pos = base.lastIndexOf("/")) != -1)
- base = base.substring(0, pos + 1);
- if (base + node.link != tgt)
- return;
- }
- window.success = true;
- var href = replace_query( get_tree().top_url,
- "path=" + node.id.substring(1) );
- top.location.replace(href);
- }
- function tree_control__sync()
- {
- if (!dom_support() || self == top)
- return;
- window.success = false;
- get_tree().recurse(sync_node);
- if (!window.success)
- top.location.replace(
- replace_query( get_tree().top_url,
- "page=" + escape(target_frame().location.href) )
- );
- }
- function tree_control(target)
- {
- // Member data
- this.root = new tree_node("");
- this.target = target ? target : "_self";
- this.dump_html = false;
- this.caption = "Contents";
- this.numbered = true;
- this.indent = 15;
- this.drawn = false;
- this.top_url = top.location.href; // For Opera.
- this.root.state = tree_node.expanded;
- this.root.id = "";
- // Member functions
- this.add = tree_control__add;
- this.draw = tree_control__draw;
- this.find = tree_control__find;
- this.html = tree_control__html;
- this.load = tree_control__load;
- this.recurse = tree_control__recurse;
- this.reset = tree_control__reset;
- this.sync = tree_control__sync;
- document.tree_control = this;
- }
- tree_control.sync = tree_control__sync;
|