newxtree.js´úÂë

¡¡¡¡/*=========================================

¡¡¡¡Powered by Fason

¡¡¡¡Email: [email protected]

¡¡¡¡HomePage:http://fason.nease.net

¡¡¡¡Version:3.0

¡¡¡¡=========================================*/

¡¡¡¡var TreeConfig = {

¡¡¡¡TreeIcon            :{

¡¡¡¡root                :'root.gif',

¡¡¡¡folderopen            :'folderopen.gif',

¡¡¡¡folder                :'folder.gif',

¡¡¡¡file                :'file.gif',

¡¡¡¡Rplus                :'Rplus.gif',

¡¡¡¡Rminus                :'Rminus.gif',

¡¡¡¡join                :'T.gif',

¡¡¡¡joinbottom            :'L.gif',

¡¡¡¡plus                :'Tplus.gif',

¡¡¡¡plusbottom            :'Lplus.gif',

¡¡¡¡minus                :'Tminus.gif',

¡¡¡¡minusbottom            :'Lminus.gif',

¡¡¡¡blank                :'blank.gif',

¡¡¡¡line                :'I.gif'

¡¡¡¡},

¡¡¡¡defaultText            :"New",

¡¡¡¡defaultHref            :"javascript:void(0)",

¡¡¡¡defaultTarget        :"_blank",

¡¡¡¡loadingText            :"Loading...",

¡¡¡¡unavaibleText        :"Unavaible",

¡¡¡¡useCookie            :true,

¡¡¡¡contextmenu            :null

¡¡¡¡};

¡¡¡¡var TreeHandler = {

¡¡¡¡id                    :0,

¡¡¡¡all                    :{},

¡¡¡¡getId                :function (obj, key) {

¡¡¡¡var ID = key == null ? this.id :key;

¡¡¡¡this.all[ID] = obj;

¡¡¡¡return key==null ? this.id++ : key;

¡¡¡¡},

¡¡¡¡setImagePath        :function(sPath){

¡¡¡¡for (i in TreeConfig.TreeIcon) {

¡¡¡¡var tem = new Image();

¡¡¡¡tem.src = sPath + TreeConfig.TreeIcon[i];

¡¡¡¡TreeConfig.TreeIcon[i] = tem.src;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡};

¡¡¡¡//*************

¡¡¡¡//    WebCookie

¡¡¡¡//*************

¡¡¡¡var WebCookie = new function () {

¡¡¡¡this.setValue = function (sName, sValue, sExpire, sPath, sDomain, sSecure) {

¡¡¡¡var cookie = sName + "=" + escape(sValue);

¡¡¡¡if (sExpire) cookie += "; expires=" + sExpire.toGMTString();

¡¡¡¡if (sPath) cookie += "; path=" + sPath;

¡¡¡¡if (sSecure) cookie += "; secure";

¡¡¡¡document.cookie = cookie;

¡¡¡¡};

¡¡¡¡this.getValue = function (sName) {

¡¡¡¡var c = document.cookie.split("; ");

¡¡¡¡for (var i=0; i<c.length; i++) {

¡¡¡¡var cItem = c[i].split("=");

¡¡¡¡if (cItem[0] == sName) return unescape(cItem[1]);

¡¡¡¡}

¡¡¡¡return null;

¡¡¡¡};

¡¡¡¡this.delCookie = function (sName) {

¡¡¡¡var cVal = this.getValue(sName);

¡¡¡¡if (cVal != null) {

¡¡¡¡var d = new Date();d.setTime(d.getTime()-1);

¡¡¡¡this.setValue(sName, cVal, d);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡};

¡¡¡¡//**************

¡¡¡¡// TreeNode

¡¡¡¡//**************

¡¡¡¡Array.prototype.Remove = function(o){

¡¡¡¡for (var i=0; i<this.length; i++) {

¡¡¡¡if (this[i] == o) break;

¡¡¡¡}

¡¡¡¡if (i != this.length) return this.slice(0,i).concat(this.slice(i+1,this.length));

¡¡¡¡return this;

¡¡¡¡};

¡¡¡¡function TreeNode(sKey, sText, sHref, sTarget, sTitle, sIcon, sOpenIcon, sXMLSrc) {

¡¡¡¡this.id            = TreeHandler.getId(this, sKey);

¡¡¡¡this.level        = 0;

¡¡¡¡this.text        = sText ? sText : TreeConfig.defaultText;

¡¡¡¡this.href        = sHref ? sHref : TreeConfig.defaultHref;

¡¡¡¡this.target        = sHref ? (sTarget ? sTarget : TreeConfig.defaultTarget) : "_self";

¡¡¡¡this.title        = sTitle ? sTitle : this.text;

¡¡¡¡this.childNodes    = new Array();

¡¡¡¡this.parentNode    = null;

¡¡¡¡this.open        = TreeConfig.useCookie ? this.getOpen() : 0;

¡¡¡¡this.shown        = false;

¡¡¡¡this.icon        = sIcon;

¡¡¡¡this.openIcon    = sOpenIcon;

¡¡¡¡this.src        = sXMLSrc;

¡¡¡¡this._tree        = null;

¡¡¡¡this.onexpand    = null;

¡¡¡¡this.oncollapse    = null;

¡¡¡¡this.onselect    = null;

¡¡¡¡this.toElement();

¡¡¡¡if (sXMLSrc) {

¡¡¡¡this.open = 0;

¡¡¡¡this.loader = new this.constructor(null, TreeConfig.loadingText, null, null, null);

¡¡¡¡this.add(this.loader);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.toElement = function () {

¡¡¡¡var f = typeof(this.href) == "function";

¡¡¡¡var oThis = this;

¡¡¡¡this._item = document.createElement("div");

¡¡¡¡this._item.className = "TreeNode";

¡¡¡¡this._item.noWrap = true;

¡¡¡¡this._item.onselectstart = function(){ return false;}

¡¡¡¡this._handler = document.createElement("img");

¡¡¡¡this._handler.align = "absmiddle";

¡¡¡¡this._handler.onclick = function(){ oThis.toggle();};

¡¡¡¡this._item.appendChild(this._handler);

¡¡¡¡this._icon = document.createElement("img");

¡¡¡¡this._icon.align = "absmiddle";

¡¡¡¡//this._icon.onclick = function(){ oThis.select(true); };

¡¡¡¡this._icon.onclick = function(){ oThis.toggle(); };   //superjÐ޸쬵¥»÷ͼ±êΪչ¿ª

¡¡¡¡this._icon.ondblclick = function(){ oThis.toggle(); };

¡¡¡¡this._item.appendChild(this._icon);

¡¡¡¡this._anchor = document.createElement("a");

¡¡¡¡this._anchor.className = "TreeNode-Anchor"

¡¡¡¡this._anchor.innerHTML = this.HTMLtoText(this.text);

¡¡¡¡this._anchor.target = f ? "_self" : this.target;

¡¡¡¡this._anchor.href = f ? TreeConfig.defaultHref : this.href;

¡¡¡¡this._anchor.title = this.title;

¡¡¡¡//this._anchor.onmousedown = function(e){ return oThis.contextMenu(e); };

¡¡¡¡this._anchor.onmousedown = function(){ oThis.toggle(); };   //superjÐ޸쬵¥»÷±êǩΪչ¿ª

¡¡¡¡this._anchor.onfocus = function(){ oThis.focus(); }

¡¡¡¡this._anchor.onblur = function(){ oThis.blur(); };

¡¡¡¡this._anchor.onkeydown = function(e){ return oThis.KeyDown(e);}

¡¡¡¡this._item.appendChild(this._anchor);

¡¡¡¡this._container = document.createElement("div");

¡¡¡¡this._container.style.display = this.open ? "" : "none";

¡¡¡¡this._item.appendChild(this._container);

¡¡¡¡};

¡¡¡¡TreeNode.prototype.HTMLtoText = function (s) {

¡¡¡¡return String(s).replace(/&/g, "&").replace(/\"/g, '"').replace(/</g,'<').replace(/>/g, '>');

¡¡¡¡};

¡¡¡¡TreeNode.prototype.isLast = function () {

¡¡¡¡var p = this.parentNode;

¡¡¡¡if (p == null) return false;

¡¡¡¡return p.childNodes[p.childNodes.length - 1] == this;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.indent = function () {

¡¡¡¡for (var i=0; i<this.childNodes.length; i++) { this.childNodes[i].indent(); }

¡¡¡¡var t = this._item, iv = this.level;

¡¡¡¡if (iv) while (--iv) { t.removeChild(t.firstChild); }

¡¡¡¡var node = this.parentNode, v = 0, _root = this.getRoot();

¡¡¡¡while (node) {

¡¡¡¡v++;

¡¡¡¡if (node == _root) break;

¡¡¡¡var m = document.createElement("img");

¡¡¡¡m.align = "absmiddle";

¡¡¡¡m.src = node.isLast() ? TreeConfig.TreeIcon.blank : TreeConfig.TreeIcon.line;

¡¡¡¡t.insertBefore(m, t.firstChild);

¡¡¡¡node = node.parentNode;

¡¡¡¡}

¡¡¡¡this.level = v;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.recalIndent = function (nLevel, b) {

¡¡¡¡for (var i = 0; i<this.childNodes.length; i++) {

¡¡¡¡this.childNodes[i]._item.childNodes[nLevel-1].src = b ? TreeConfig.TreeIcon.blank : TreeConfig.TreeIcon.line;

¡¡¡¡this.childNodes[i].recalIndent(nLevel, b);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.reloadIcon = function () {

¡¡¡¡var l = this.isLast(), o = this.open, m = TreeConfig.TreeIcon;

¡¡¡¡if (this.parentNode) {

¡¡¡¡this._handler.src = this.childNodes.length>0 ? (o ? (l ? m.minusbottom : m.minus) : (l ? m.plusbottom : m.plus)) : (l ? m.joinbottom : m.join);

¡¡¡¡}

¡¡¡¡this._icon.src = this.childNodes.length>0 ? (o ? (this.openIcon ? this.openIcon : (this.icon ? this.icon : m.folderopen)) : (this.icon ? this.icon : m.folder)) : (this.icon ? this.icon : m.file);

¡¡¡¡};

¡¡¡¡TreeNode.prototype.addXMLNodeLoop = function (doc) {

¡¡¡¡var c = doc.childNodes;

¡¡¡¡for (var i = 0; i < c.length; i++) {

¡¡¡¡var o = c[i];

¡¡¡¡if (o.nodeType == 1) {

¡¡¡¡var X = this.constructor;

¡¡¡¡var node = new X(o.getAttribute("id"), o.getAttribute("text"), o.getAttribute("href"), o.getAttribute("target"), o.getAttribute("title"), o.getAttribute("icon"), o.getAttribute("openicon"), o.getAttribute('src'));

¡¡¡¡this.add(node);

¡¡¡¡if (!o.getAttribute("src")) {

¡¡¡¡node.addXMLNodeLoop(o);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.XMLHttpCallBack = function () {

¡¡¡¡if (this._xmlhttp.readyState != 4) return;

¡¡¡¡var oLoad = this.loader;

¡¡¡¡var doc = this._xmlhttp.responseXML;

¡¡¡¡var sXML = String(this._xmlhttp.responseText).replace(/<\?xml[^\?]*\?>/i, "");

¡¡¡¡if (window.DOMParser) {

¡¡¡¡doc = (new DOMParser()).parseFromString(sXML, 'text/xml');

¡¡¡¡} else {

¡¡¡¡doc.loadXML(sXML);

¡¡¡¡}

¡¡¡¡if (doc.documentElement) {

¡¡¡¡var oRoot = doc.getElementsByTagName("Tree")[0];

¡¡¡¡if (oRoot.childNodes.length == 0) { this.setText(TreeConfig.unavaibleText); }

¡¡¡¡else {

¡¡¡¡var s = this._tree.getSelectedNode() == oLoad;

¡¡¡¡this.addXMLNodeLoop(oRoot);

¡¡¡¡oLoad.remove();

¡¡¡¡this.async();

¡¡¡¡this.loader = null;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡else {

¡¡¡¡oLoad.setText(TreeConfig.unavaibleText);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getXML = function () {

¡¡¡¡var oLoad = this.loader;

¡¡¡¡var oThis = this;

¡¡¡¡this._xmlhttp = null;

¡¡¡¡try{

¡¡¡¡if (window.XMLHttpRequest)

¡¡¡¡this._xmlhttp = new XMLHttpRequest();

¡¡¡¡else if (window.ActiveXObject)

¡¡¡¡this._xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

¡¡¡¡}catch (e){}

¡¡¡¡if (this._xmlhttp == null) throw new Error('Your browser doesn\'t support!');

¡¡¡¡this._xmlhttp.onreadystatechange = function () { oThis.XMLHttpCallBack(); };

¡¡¡¡try {

¡¡¡¡var temp = (/\?/g.test(this.src)?"&":"?") + "temp=" + String(new Date().getTime())

¡¡¡¡this._xmlhttp.open("get", this.src + temp, true);

¡¡¡¡this._xmlhttp.send(null);

¡¡¡¡}catch(e){ oLoad.setText(TreeConfig.unavaibleText);}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.resetTree = function (oTree) {

¡¡¡¡for (var i=0; i<this.childNodes.length; i++)

¡¡¡¡this.childNodes[i].resetTree(oTree);

¡¡¡¡this._tree = oTree;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.setOpen = function (v) {

¡¡¡¡this.open = v;

¡¡¡¡if (TreeConfig.useCookie) {

¡¡¡¡WebCookie.setValue("o" + this.id, v);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getOpen = function () {

¡¡¡¡var o = WebCookie.getValue("o" + this.id);

¡¡¡¡if (o != null)

¡¡¡¡return parseInt(o);

¡¡¡¡return 0;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.toHTML = function() {

¡¡¡¡var o = this._item;

¡¡¡¡this.indent();

¡¡¡¡this.reloadIcon();

¡¡¡¡if (this.parentNode == null) o.removeChild(this._handler);

¡¡¡¡return o;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getRoot = function() {

¡¡¡¡var root = this;

¡¡¡¡while (root.parentNode) root = root.parentNode;

¡¡¡¡return root;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.setText = function(sText) {

¡¡¡¡this.text = sText;

¡¡¡¡this._anchor.innerHTML = this.HTMLtoText(sText);

¡¡¡¡};

¡¡¡¡TreeNode.prototype.add = function(oItem) {

¡¡¡¡var tree = this._tree;

¡¡¡¡oItem.parentNode = this;

¡¡¡¡var len = this.childNodes.length;

¡¡¡¡this.childNodes[len] = oItem;

¡¡¡¡if (len > 0) {

¡¡¡¡var o = this.childNodes[len-1];

¡¡¡¡o.recalIndent(o.level, false);

¡¡¡¡o.reloadIcon();

¡¡¡¡} else if (tree) {

¡¡¡¡if (tree._rendered) this.open = 0;

¡¡¡¡this.reloadIcon();

¡¡¡¡}

¡¡¡¡if (tree) this.resetTree(tree);

¡¡¡¡this._container.style.display = this.open ? "" : "none";

¡¡¡¡this._container.appendChild(oItem.toHTML());

¡¡¡¡return oItem;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.remove = function(f) {

¡¡¡¡for (var i=0; i<this.childNodes.length; i++) { this.childNodes[i].remove(true); }

¡¡¡¡this.unselect();

¡¡¡¡var v = this.getPreviousSibling();

¡¡¡¡var p = this.parentNode;

¡¡¡¡if (p) {

¡¡¡¡p.childNodes = p.childNodes.Remove(this);

¡¡¡¡if (p.childNodes.length > 0) {

¡¡¡¡var node = p.childNodes[p.childNodes.length-1];

¡¡¡¡node.recalIndent(node.level, true);

¡¡¡¡node.reloadIcon();

¡¡¡¡} else {

¡¡¡¡p.setOpen(0);

¡¡¡¡p._container.style.display = "none";

¡¡¡¡p.reloadIcon();

¡¡¡¡}

¡¡¡¡}

¡¡¡¡var tmp = this._item;

¡¡¡¡if (tmp) tmp.parentNode.removeChild(tmp);

¡¡¡¡delete TreeConfig[this.id];

¡¡¡¡if (v && !f) v.select(false);

¡¡¡¡};

¡¡¡¡TreeNode.prototype.toggle = function() {

¡¡¡¡if (this.childNodes.length>0) {

¡¡¡¡if (this.open) {

¡¡¡¡this.collapse();

¡¡¡¡}

¡¡¡¡else {

¡¡¡¡this.expand();

¡¡¡¡}

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.expand = function() {

¡¡¡¡this.setOpen(1);

¡¡¡¡if (! this.shown) {

¡¡¡¡this.shown = true;

¡¡¡¡if (this.src) this.getXML();

¡¡¡¡}

¡¡¡¡this.reloadIcon();

¡¡¡¡this._container.style.display = "";

¡¡¡¡if (typeof this.onexpand == "function") {

¡¡¡¡this.onexpand();

¡¡¡¡} else {

¡¡¡¡eval(this.onexpand);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.collapse = function() {

¡¡¡¡this.setOpen(0);

¡¡¡¡this._container.style.display = "none";

¡¡¡¡this.reloadIcon();

¡¡¡¡this.select(false);

¡¡¡¡if (typeof this.oncollapse == "function") {

¡¡¡¡this.oncollapse();

¡¡¡¡} else {

¡¡¡¡eval(this.oncollapse);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.async = function () {

¡¡¡¡var a = this._tree.context;

¡¡¡¡if (!a.length) return;

¡¡¡¡var id = a[a.length - 1];

¡¡¡¡var node = TreeHandler.all[id];

¡¡¡¡if (typeof(node) != 'undefined') {

¡¡¡¡if (node.parentNode == this) {

¡¡¡¡this._.context = a.slice(0, -1);

¡¡¡¡if (node.childNodes.length > 0)

¡¡¡¡node.expand();

¡¡¡¡else

¡¡¡¡node.select();

¡¡¡¡}

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.expandAll = function() {

¡¡¡¡if (this.childNodes.length>0 && !this.open) this.expand();

¡¡¡¡this.expandChildren();

¡¡¡¡};

¡¡¡¡TreeNode.prototype.collapseAll = function() {

¡¡¡¡this.collapseChildren();

¡¡¡¡if (this.childNodes.length>0 && this.open) this.collapse();

¡¡¡¡};

¡¡¡¡TreeNode.prototype.expandChildren = function() {

¡¡¡¡for (var i=0; i<this.childNodes.length; i++)

¡¡¡¡this.childNodes[i].expandAll();

¡¡¡¡};

¡¡¡¡TreeNode.prototype.collapseChildren = function() {

¡¡¡¡for (var i=0; i<this.childNodes.length; i++)

¡¡¡¡this.childNodes[i].collapseAll();

¡¡¡¡};

¡¡¡¡TreeNode.prototype.openURL = function() {

¡¡¡¡if (typeof this.href == "function") {

¡¡¡¡this.href();

¡¡¡¡} else if (this.href != TreeConfig.defaultHref) {

¡¡¡¡window.open(this.href, this.target);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.select = function(b){

¡¡¡¡this._anchor.focus();

¡¡¡¡if (b) {

¡¡¡¡this.openURL();

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.unselect = function () {

¡¡¡¡this._anchor.className = "TreeNode-Anchor";

¡¡¡¡var selected = this._tree.getSelectedNode();

¡¡¡¡if (selected == this) this._tree.setSelectedNode(null);

¡¡¡¡};

¡¡¡¡TreeNode.prototype.focus = function () {

¡¡¡¡var node = this._tree.getSelectedNode();

¡¡¡¡if (node && node != this) { node.unselect(); }

¡¡¡¡this._tree.setSelectedNode(this);

¡¡¡¡var oItem = this._anchor;

¡¡¡¡oItem.className =  "TreeNode-Anchor focus";

¡¡¡¡if (typeof this.onselect == "function") {

¡¡¡¡this.onselect();

¡¡¡¡} else {

¡¡¡¡eval(this.onselect);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeNode.prototype.blur = function () {

¡¡¡¡var oItem = this._anchor;

¡¡¡¡oItem.className =  "TreeNode-Anchor selected";

¡¡¡¡};

¡¡¡¡TreeNode.prototype.contextMenu = function (e) {

¡¡¡¡e = e || window.event;

¡¡¡¡if (e.button == 2) {

¡¡¡¡if (typeof TreeConfig.contextmenu == "function")

¡¡¡¡TreeConfig.contextmenu();

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡return true;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getFirstChild = function() {

¡¡¡¡if (this.childNodes.length>0 && this.open)

¡¡¡¡return this.childNodes[0];

¡¡¡¡return this;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getLastChild = function() {

¡¡¡¡if (this.childNodes.length>0 && this.open)

¡¡¡¡return this.childNodes[this.childNodes.length-1].getLastChild();

¡¡¡¡return this;

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getPreviousSibling = function() {

¡¡¡¡if (!this.parentNode) return null;

¡¡¡¡for (var i=0;i<this.parentNode.childNodes.length;i++)

¡¡¡¡if (this.parentNode.childNodes[i] == this) break;

¡¡¡¡if (i == 0)

¡¡¡¡return this.parentNode;

¡¡¡¡else

¡¡¡¡return this.parentNode.childNodes[i-1].getLastChild();

¡¡¡¡};

¡¡¡¡TreeNode.prototype.getNextSibling = function() {

¡¡¡¡if (!this.parentNode) return null;

¡¡¡¡for (var i=0;i<this.parentNode.childNodes.length;i++)

¡¡¡¡if (this.parentNode.childNodes[i] == this)break;

¡¡¡¡if (i == this.parentNode.childNodes.length-1)

¡¡¡¡return this.parentNode.getNextSibling();

¡¡¡¡else

¡¡¡¡return this.parentNode.childNodes[i+1];

¡¡¡¡}

¡¡¡¡TreeNode.prototype.KeyDown=function(e){

¡¡¡¡e = e || window.event;

¡¡¡¡var code = e.which || e.keyCode;

¡¡¡¡var o = this;

¡¡¡¡if (code == 37) {

¡¡¡¡if (this.open) this.collapse();

¡¡¡¡else {

¡¡¡¡if (this.parentNode) this.parentNode.select(false);

¡¡¡¡}

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡else if (code == 38) {

¡¡¡¡var el = o.getPreviousSibling();

¡¡¡¡if (el) el.select(false);

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡else if (code == 39) {

¡¡¡¡if (this.childNodes.length>0) {

¡¡¡¡if (!this.open) this.expand();

¡¡¡¡else {

¡¡¡¡var el = o.getFirstChild();

¡¡¡¡if(el) el.select(false);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡else if (code == 40) {

¡¡¡¡if (this.open && this.childNodes.length>0) this.getFirstChild().select(false);

¡¡¡¡else {

¡¡¡¡var el = o.getNextSibling();

¡¡¡¡if (el) el.select(false);

¡¡¡¡}

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡else if (code == 13) {

¡¡¡¡this.toggle();

¡¡¡¡return true;

¡¡¡¡}

¡¡¡¡return true;

¡¡¡¡};

¡¡¡¡function CheckBoxTreeNode(sKey, sName, sText, sHref, sTarget, sTitle, sIcon, sOpenIcon, sXMLSrc) {

¡¡¡¡this._base = TreeNode;

¡¡¡¡this._base(sKey, sText, sHref, sTarget, sTitle, sIcon, sOpenIcon, sXMLSrc);

¡¡¡¡this.name = sName;

¡¡¡¡this.checked = false;

¡¡¡¡};

¡¡¡¡CheckBoxTreeNode.prototype = new TreeNode;

¡¡¡¡CheckBoxTreeNode.prototype.toHTML = function () {

¡¡¡¡this._base = TreeNode.prototype.toHTML;

¡¡¡¡this._base();

¡¡¡¡var oThis = this;

¡¡¡¡this._checkbox = document.createElement("input");

¡¡¡¡this._checkbox.id = this._checkbox.name = this.name;

¡¡¡¡this._checkbox.type = "checkbox";

¡¡¡¡this._checkbox.defaultChecked = this.parentNode instanceof CheckBoxTreeNode ? this.parentNode.getChecked() : this.checked;

¡¡¡¡this._checkbox.onclick = function () { oThis.check() };

¡¡¡¡this._checkbox.hideFocus = true;

¡¡¡¡this._item.insertBefore(this._checkbox, this._icon);

¡¡¡¡return this._item;

¡¡¡¡};

¡¡¡¡CheckBoxTreeNode.prototype.check = function () {

¡¡¡¡this.setCheckedChildren(this.getChecked());

¡¡¡¡this.setCheckedParent();

¡¡¡¡if (typeof this.oncheck == "function") {

¡¡¡¡this.oncheck();

¡¡¡¡} else {

¡¡¡¡eval(this.oncheck);

¡¡¡¡}

¡¡¡¡};

¡¡¡¡CheckBoxTreeNode.prototype.setCheckedChildren = function (b) {

¡¡¡¡for (var i=0,j=0; i<this.childNodes.length; i++) {

¡¡¡¡if (this.childNodes[i] instanceof CheckBoxTreeNode)

¡¡¡¡this.childNodes[i].setCheckedChildren(b);

¡¡¡¡}

¡¡¡¡this._checkbox.checked = b;

¡¡¡¡};

¡¡¡¡CheckBoxTreeNode.prototype.setCheckedParent = function () {

¡¡¡¡var p = this.parentNode;

¡¡¡¡if (p instanceof CheckBoxTreeNode) {

¡¡¡¡for (var i=0; i<p.childNodes.length; i++) {

¡¡¡¡if (!p.childNodes[i].getChecked()) break;

¡¡¡¡}

¡¡¡¡p._checkbox.checked = i == p.childNodes.length

¡¡¡¡p.setCheckedParent();

¡¡¡¡}

¡¡¡¡};

¡¡¡¡CheckBoxTreeNode.prototype.getChecked = function () {

¡¡¡¡return this._checkbox.checked;

¡¡¡¡};

¡¡¡¡//************

¡¡¡¡// TreeView

¡¡¡¡//************

¡¡¡¡function TreeView(sKey, sText, sHref, sTarget, sTitle, sIcon, sOpenIcon, sXMLSrc) {

¡¡¡¡this.base = TreeNode;

¡¡¡¡this.base(sKey, sText, sHref, sTarget, sTitle, sIcon, sOpenIcon, sXMLSrc);

¡¡¡¡this.icon = sIcon || TreeConfig.TreeIcon.root;

¡¡¡¡this.context = new Array();

¡¡¡¡this._rendered = false;

¡¡¡¡this._tree = this;

¡¡¡¡};

¡¡¡¡TreeView.prototype = new TreeNode;

¡¡¡¡TreeView.prototype.getSelectedNode = function () {

¡¡¡¡if (window.selectedNode) return window.selectedNode;

¡¡¡¡return null;

¡¡¡¡};

¡¡¡¡TreeView.prototype.setSelectedNode = function (oNode) {

¡¡¡¡window.selectedNode = oNode;

¡¡¡¡};

¡¡¡¡TreeView.prototype.setContext = function () {

¡¡¡¡this.context = new Array();

¡¡¡¡for (var i=arguments.length-1,j=0; i>=0; i--,j++) {

¡¡¡¡this.context[j] = arguments[i];

¡¡¡¡}

¡¡¡¡};

¡¡¡¡TreeView.prototype.create = function (oTarget) {

¡¡¡¡oTarget.appendChild(this.toHTML());

¡¡¡¡this._rendered = true;

¡¡¡¡if (this.childNodes.length>0 || this.open || this.src)

¡¡¡¡this.expand();

¡¡¡¡};

¡¡¡¡TreeView.prototype.toString = function () {

¡¡¡¡var obj = this.toHTML();

¡¡¡¡var o = document.createElement("div");

¡¡¡¡o.appendChild(obj);

¡¡¡¡this._rendered = true;

¡¡¡¡return o.innerHTML;

¡¡¡¡};