OSDN Git Service

setup spinelz environment
[cloudmanganw/git_repo.git] / src / jp / sourceforge / manganetwork / page / javascripts / spinelz / treeview.js
index 8a26882..58b428b 100644 (file)
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-// 
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var TreeView = Class.create();
-TreeView.className = {
-  top: 'treeview',
-  dir: 'treeview_dir',
-  dirBody: 'treeview_dirBody',
-  dirBodyText: 'treeview_dirBodyText',
-  dirBodyTextActive: 'treeview_dirBodyTextActive',
-  dirContainer: 'treeview_dirContainer',
-  dirContainerHover: 'treeview_dirContainerHover',
-  file: 'treeview_file',
-  fileBody: 'treeview_fileBody',
-  fileBodyText: 'treeview_fileBodyText',
-  fileBodyTextActive: 'treeview_fileBodyTextActive',
-  state_open: 'treeview_stateOpen',
-  state_close: 'treeview_stateClose',
-  state_empty: 'treeview_stateEmpty',
-  dirIcon: 'treeview_dirIcon',
-  fileIcon: 'treeview_fileIcon',
-  handle: 'treeview_handle'
-}
-
-TreeView.iconId = 'treeview_icon';
-
-TreeView.prototype = {
-  initialize: function(element) {
-    this.element = $(element);
-    Element.setStyle(this.element, {visibility: 'hidden'});
-    Element.hide(this.element);
-
-    this.options = Object.extend({
-      dirSymbol:         'dir',
-      fileSymbol:        'file',
-      cssPrefix:         'custom_',
-      open:              true,
-      callBackFunctions: false,
-      dirSelect:         true,
-      fileSelect:        true,
-      noSelectedInsert:  true,
-      iconIdPrefix:      TreeView.iconId,
-      move:              false,
-      unselected:        Prototype.emptyFunction,
-      enableUnselected:  true,
-      sortOptions:       {},
-      openDir:           Prototype.emptyFunction,
-      closeDir:          Prototype.emptyFunction,
-      emptyImg:          false,
-      initialSelected:   null
-    }, arguments[1] || {});
-
-    this.customCss = CssUtil.appendPrefix(this.options.cssPrefix, TreeView.className);
-    this.classNames = new CssUtil([TreeView.className, this.customCss]);
-
-    this.changeClassNameDirAndFile(this.element);
-    var nodes = this.element.childNodes;
-    for (var i = 0; i < nodes.length; i++) {
-      this.build(nodes[i]);
-    }
-
-    this.classNames.addClassNames(this.element, 'top');
-    Element.setStyle(this.element, {visibility: 'visible'});
-    Element.show(this.element);
-
-    if (this.options.initialSelected) {
-      this.selectEffect(this.options.initialSelected);
-    }
-
-    if (this.options.move) {
-      this.setSortable();
-    }
-  },
-
-  addChildById: function(element, parent, number) {
-    element = $(element);
-    parent = $(parent);
-
-    var container = null;
-    if (!element || !parent)
-      return;
-    else if (Element.hasClassName(parent, TreeView.className.dir))
-      container = this.getChildDirContainer(parent);
-    else if (Element.hasClassName(parent, TreeView.className.top))
-      container = parent;
-    else
-      return;
-
-    this.build(element);
-
-    if (isNaN(number)) {
-      container.appendChild(element);
-    } else {
-      var children = this.getDirectoryContents(container);
-      if (children[number]) container.insertBefore(element, children[number]);
-      else container.appendChild(element);
-    }
-
-    this.refreshStateImg(parent);
-    if (this.options.dragAdrop) this.setSortable();
-  },
-
-  addChildByPath: function(element, path) {
-    element = $(element);
-    if (element) this.build(element);
-    else return;
-
-    var paths = path.split('/').findAll(function(elm) {
-      return (elm != '');
-    });
-
-    var last = paths.pop();
-    var container = this.search(paths.join('/'));
-
-    var children = this.getDirectoryContents(container);
-
-    if(children[last])
-      container.insertBefore(element, children[last]);
-    else
-      container.appendChild(element);
-
-    this.refreshStateImg(container.parentNode);
-    if (this.options.dragAdrop) this.setSortable();
-  },
-
-  addChildBySelected: function(element, number) {
-    if (!this.selected && !this.options.noSelectedInsert) return;
-
-    if (this.selected)
-      this.addChildById(element, this.selected, number);
-    else
-      this.addChildById(element, this.element, number);
-  },
-
-  addSelectItemCallback: function(functionObj) {
-    if (!this.options.callBackFunctions) {
-      this.options.callBackFunctions = new Array();
-    }
-    this.options.callBackFunctions.push(functionObj);
-  },
-
-  build: function(element) {
-    if (element.nodeType != 1) return;
-
-    Element.cleanWhitespace(element);
-    this.changeClassNameDirAndFile(element);
-
-    if (Element.hasClassName(element, TreeView.className.dir)) {
-      var container = this.createDirectoryContainer(element);
-      var body;
-      if (this.hasContents(container))
-        body = this.createDirectoryBody(element, false);
-      else
-        body = this.createDirectoryBody(element, true);
-
-      element.appendChild(body);
-      element.appendChild(container);
-
-      var nodes = container.childNodes;
-      for (var i = 0; i < nodes.length; i++) {
-        this.build(nodes[i]);
-      }
-    } else if (Element.hasClassName(element, TreeView.className.file)) {
-      var created = this.createFileBody(element);
-      element.appendChild(created);
-    }
-  },
-
-  changeClassName: function(element, to, from) {
-    var nodes = document.getElementsByClassName(from, element);
-
-    var newClassName = this.classNames.joinClassNames(to);
-    nodes.each(function(n) {
-      n.className = n.className.replace(new RegExp(from), newClassName);
-    });
-
-    if (Element.hasClassName(element, from)) {
-      element.className = element.className.replace(new RegExp(from), newClassName);
-    }
-  },
-
-  changeClassNameDirAndFile: function(element) {
-    this.changeClassName(element, 'dir', this.options.dirSymbol);
-    this.changeClassName(element, 'file', this.options.fileSymbol);
-  },
-
-  convertJSON: function() {
-    return JSON.stringify(this.parse());
-  },
-
-  createDirectoryBody: function(element, isEmpty) {
-    var customClass = null;
-    var dirBodyClass = this.classNames.joinClassNames('dir');
-    if (element.className != dirBodyClass) {
-      customClass  = element.className.replace(new RegExp(dirBodyClass + ' '), '');
-      element.className = dirBodyClass;
-    }
-
-    var bodyNodes = new Array();
-    var state;
-    if (isEmpty && !this.options.emptyImg)
-      state = 'state_empty';
-    else if (this.options.open)
-      state = 'state_open';
-    else
-      state = 'state_close';
-
-    var id = this.options.iconIdPrefix.appendSuffix(element.id);
-    var stateImg = Builder.node('DIV', {id: id.appendSuffix('stateImg')});
-    this.classNames.addClassNames(stateImg, state);
-    Event.observe(stateImg, "click", this.toggle.bindAsEventListener(this));
-
-    var itemImg = Builder.node('DIV', {id: id});
-    this.classNames.addClassNames(itemImg, 'dirIcon');
-    if (customClass) {
-      Element.addClassName(itemImg, customClass);
-    }
-    this.classNames.addClassNames(itemImg, 'handle');
-
-    var bodyText = Builder.node('SPAN', this.getDirectoryText(element));
-    this.classNames.addClassNames(bodyText, 'dirBodyText');
-
-    bodyNodes.push(stateImg);
-    bodyNodes.push(itemImg);
-    bodyNodes.push(bodyText);
-
-    var body = Builder.node('DIV', bodyNodes);
-    this.classNames.addClassNames(body, 'dirBody');
-    if (this.options.dirSelect) {
-      Event.observe(itemImg, "click", this.selectDirItem.bindAsEventListener(this));
-      Event.observe(bodyText, "click", this.selectDirItem.bindAsEventListener(this));
-    }
-
-    return body;
-  },
-
-  createDirectoryContainer: function(element) {
-    var container = element.getElementsByTagName('ul')[0];
-    if (!container) {
-      container = Builder.node('UL');
-    }
-    this.classNames.addClassNames(container, 'dirContainer');
-    if (!this.options.open) Element.hide(container);
-    return container;
-  },
-
-  createFileBody: function(element) {
-    var customClass = null;
-    var fileBodyClass = this.classNames.joinClassNames('file');
-    if (element.className != fileBodyClass) {
-      customClass  = element.className.replace(new RegExp(fileBodyClass + ' '), '');
-      element.className = fileBodyClass;
-    }
-
-    var id = this.options.iconIdPrefix.appendSuffix(element.id);
-    var itemImg = Builder.node('DIV', {id: id});
-    this.classNames.addClassNames(itemImg, 'fileIcon');
-    if (customClass) {
-      Element.addClassName(itemImg, customClass);
-    }
-    this.classNames.addClassNames(itemImg, 'handle');
-
-    var bodyText = Builder.node('SPAN', $A(element.childNodes));
-    this.classNames.addClassNames(bodyText, 'fileBodyText');
-
-    var children = new Array();
-    children.push(itemImg);
-    children.push(bodyText);
-
-    var body = Builder.node('DIV', children);
-    this.classNames.addClassNames(body, 'fileBody');
-    if (this.options.fileSelect) {
-      Event.observe(itemImg, "click", this.selectFileItem.bindAsEventListener(this));
-      Event.observe(bodyText, "click", this.selectFileItem.bindAsEventListener(this));
-    }
-
-    return body;
-  },
-
-  getChildBody: function(element) {
-    var names = [TreeView.className.fileBody, TreeView.className.dirBody];
-    return Element.getFirstElementByClassNames(element, names);
-  },
-
-  getChildBodyText: function(element) {
-    var names = [
-      TreeView.className.fileBodyText,
-      TreeView.className.fileBodyTextActive,
-      TreeView.className.dirBodyText,
-      TreeView.className.dirBodyTextActive
-    ];
-    return Element.getFirstElementByClassNames(element, names);
-  },
-
-  getChildBodyTextNode: function(element) {
-    var body = this.getChildBody(element);
-    var bodyText = this.getChildBodyText(body);
-    return this.searchTextNode(bodyText);
-  },
-
-  getChildDir: function(element) {
-    return document.getElementsByClassName(TreeView.className.dir, element);
-  },
-
-  getChildDirBody: function(element) {
-    return document.getElementsByClassName(TreeView.className.dirBody, element)[0];
-  },
-
-  getChildDirContainer: function(element) {
-    return document.getElementsByClassName(TreeView.className.dirContainer, element)[0];
-  },
-
-  getChildStateImg: function(element) {
-    var body = this.getChildDirBody(element);
-    var names = [
-      TreeView.className.state_close,
-      TreeView.className.state_open,
-      TreeView.className.state_empty
-    ];
-
-    return Element.getFirstElementByClassNames(body, names);
-  },
-
-  getChildren: function(element, ignoreDir, ignoreFile) {
-    var parent;
-    var children = new Array();
-    if(element) {
-      parent = $(element).getElementsByTagName('ul')[0];
-    } else {
-      parent = this.element;
-    }
-    $A(Element.getTagNodes(parent)).each(
-      function(node) {
-        if(!ignoreDir && Element.hasClassName(node, TreeView.className.dir)) {
-          children.push(node);
-        }
-        if(!ignoreFile && Element.hasClassName(node, TreeView.className.file)) {
-          children.push(node);
-        }
-      }
-    );
-    return children;
-  },
-
-  getDirectoryContents: function(element) {
-    return $A(element.childNodes).findAll(function(child) {
-      if ((child.nodeType != 1)) {
-        return false;
-      }
-      if (child.tagName.toLowerCase() == 'li') {
-        return true;
-      }
-      return false;
-    });
-  },
-
-  getDirectoryText: function(element) {
-    return $A(element.childNodes).findAll(function(child) {
-      if ((child.nodeType != 1)) {
-        return true;
-      } else if (child.tagName.toLowerCase() != 'ul') {
-        return true;
-      }
-      return false;
-    });
-  },
-
-  getHierarchyNumber: function() {
-    if (!this.selected) return;
-    var element = this.selected;
-    var i = 0;
-    while (true) {
-      if (this.element == element) {
-        return i;
-      } else {
-        element = this.getParentDir(element, true);
-        if (!element) return;
-        i++;
-      }
-    }
-  },
-
-  getParentDir: function(element, top) {
-    var result = Element.getParentByClassName(TreeView.className.dir, element);
-    if (!result && top)
-      result = Element.getParentByClassName(TreeView.className.top, element);
-    return result;
-  },
-
-  hasContents: function(element) {
-    if (element) {
-      if (!Element.hasClassName(element, TreeView.className.dirContainer) &&
-          !Element.hasClassName(element, TreeView.className.top)) {
-        return false;
-      }
-
-      var nodes = element.childNodes;
-      for (var i = 0; i < nodes.length; i++) {
-        if (nodes[i].nodeType == 1) {
-          if (Element.hasClassName(nodes[i], TreeView.className.dir) ||
-              Element.hasClassName(nodes[i], TreeView.className.file)) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  },
-
-  parse: function(container) {
-    if (!container) container = this.element;
-
-    var itemList = [];
-    var contents = this.getDirectoryContents(container);
-
-    for (var i = 0; i < contents.length; i++) {
-      var node = contents[i];
-      var body = this.getChildBody(node);
-      var text = this.getChildBodyText(body);
-
-      var item = {};
-      item.id = node.id;
-
-      item.name = Element.collectTextNodes(text).replace(/\n/, '');
-      if (Element.hasClassName(node, TreeView.className.dir)) {
-        item.type = this.options.dirSymbol;
-        item.contents = this.parse(this.getChildDirContainer(node));
-
-      } else {
-        item.type = this.options.fileSymbol;
-       }
-
-       itemList.push(item);
-    }
-
-    return itemList;
-  },
-
-  refreshStateImg: function(element) {
-    if (!Element.hasClassName(element, TreeView.className.dir)) return;
-
-    var container = this.getChildDirContainer(element);
-    var img = this.getChildStateImg(element);
-
-    if (!this.hasContents(container) && !this.options.emptyImg)
-      this.classNames.refreshClassNames(img, 'state_empty');
-    else if (Element.visible(container))
-      this.classNames.refreshClassNames(img, 'state_open');
-    else
-      this.classNames.refreshClassNames(img, 'state_close');
-  },
-
-  removeById: function(element) {
-    element = $(element);
-    if (element) {
-      var parent = element.parentNode.parentNode;
-      Element.remove(element);
-      this.refreshStateImg(parent);
-    }
-  },
-
-  removeByPath: function(path) {
-    var paths = path.split('/').findAll(function(elm) {
-      return (elm != '');
-    });
-
-    var last = paths.pop();
-    var container = this.search(paths.join('/'));
-
-    var target = this.getDirectoryContents(container)[last];
-    if (target)
-      this.removeById(target);
-  },
-
-  removeBySelected: function() {
-    if (!this.selected) return;
-    this.removeById(this.selected);
-    this.selected = false;
-  },
-
-  renameById: function(name, element) {
-    element = $(element);
-    if (!Element.hasClassName(element, TreeView.className.dir) &&
-        !Element.hasClassName(element, TreeView.className.file)) {
-      return;
-    }
-    var node = this.getChildBodyTextNode(element);
-    node.nodeValue = name;
-  },
-
-  renameByPath: function(name, path) {
-    var paths = path.split('/').findAll(function(elm) {
-      return (elm != '');
-    });
-
-    var last = paths.pop();
-    var container = this.search(paths.join('/'));
-
-    var target = this.getDirectoryContents(container)[last];
-    if (target)
-      this.renameById(name, target);
-  },
-
-  renameBySelected: function(name) {
-    if (!this.selected) return;
-    this.renameById(name, this.selected);
-  },
-
-  search: function(path) {
-    var paths = path.split('/').findAll(function(elm) {
-      return (elm != '');
-    });
-
-    var container = this.element;
-    for (var i = 0; i < paths.length; i++) {
-      var num = paths[i];
-      var contents = this.getDirectoryContents(container);
-      if (contents[num] && Element.hasClassName(contents[num], TreeView.className.dir)) {
-        container = this.getChildDirContainer(contents[num]);
-      } else {
-        return false;
-      }
-    }
-    return container;
-  },
-
-  searchTextNode: function(element) {
-    var text = null;
-    var nodes = element.childNodes;
-
-    for (var i = 0; i < nodes.length; i++) {
-      if (nodes[i].nodeType == 3) {
-        text = nodes[i];
-        break;
-      } else if (nodes[i].nodeType == 1) {
-        var tmp = this.searchTextNode(nodes[i]);
-        if (tmp) {
-          text = tmp;
-          break;
-        }
-      }
-    }
-    return text;
-  },
-
-  selectDirItem: function(event) {
-    var itemBody = Element.getParentByClassName(TreeView.className.dirBody, Event.element(event));
-    this.selectItem(itemBody);
-  },
-
-  selectEffect: function(element) {
-    element = $(element);
-    if(element) {
-      var itemBody = element.firstChild;
-      if (this.selectItemUnselect(itemBody, false)) {
-        return;
-      }
-      this.selectItemSelect(itemBody, false);
-    }
-  },
-
-  selectFileItem: function(event) {
-    var itemBody = Element.getParentByClassName(TreeView.className.fileBody, Event.element(event));
-    this.selectItem(itemBody);
-  },
-
-  selectItem: function(itemBody) {
-    if (this.selectItemUnselect(itemBody, true)) {
-      return;
-    }
-    this.selectItemSelect(itemBody, true);
-  },
-
-  selectItemSelect: function(itemBody, callback) {
-    this.selected = itemBody.parentNode;
-    var text = this.getChildBodyText(itemBody);
-    if (Element.hasClassName(text, TreeView.className.dirBodyText)) {
-      this.classNames.refreshClassNames(text, 'dirBodyTextActive');
-      this.defaultCss = 'dirBodyText';
-    } else if (Element.hasClassName(text, TreeView.className.fileBodyText)) {
-      this.classNames.refreshClassNames(text, 'fileBodyTextActive');
-      this.defaultCss = 'fileBodyText';
-    }
-    if (callback) {
-      if (this.options.callBackFunctions) {
-        for (var i = 0; i < this.options.callBackFunctions.length; i++) {
-          this.options.callBackFunctions[i](itemBody.parentNode);
-        }
-      }
-    }
-  },
-
-  selectItemUnselect: function(itemBody, callback) {
-    if (this.selected) {
-      var selectedBody = this.getChildBody(this.selected);
-      var selectedText = this.getChildBodyText(selectedBody);
-      this.classNames.refreshClassNames(selectedText, this.defaultCss);
-      if (this.selected == itemBody.parentNode && this.options.enableUnselected) {
-        this.selected = false;
-        this.defaultCss = false;
-        if (callback) {
-          this.options.unselected();
-        }
-        return true;
-      }
-    }
-    return false;
-  },
-
-  setSortable: function() {
-    var options = Object.extend({
-      dropOnEmpty: true,
-      tree: true,
-      hoverclass: 'treeview_dirContainerHover',
-      scroll: window,
-      ghosting: true
-    }, this.options.sortOptions);
-    Sortable.create(this.element, options);
-  },
-
-  toggle: function(event) {
-    Event.stop(event);
-    var src = Event.element(event);
-    var parent = this.getParentDir(src);
-    var container = this.getChildDirContainer(parent);
-
-    if (!this.hasContents(container) && !this.options.emptyImg) return;
-
-    Element.toggle(container);
-    this.refreshStateImg(parent);
-
-    if (!this.hasContents(container) && !this.options.emptyImg)
-      this.options.openDir(parent, container);
-    else if (Element.visible(container))
-      this.options.openDir(parent, container);
-    else
-      this.options.closeDir(parent, container);
-  }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var TreeView = Class.create();\r
+TreeView.className = {\r
+  top: 'treeview',\r
+  dir: 'treeview_dir',\r
+  dirBody: 'treeview_dirBody',\r
+  dirBodyText: 'treeview_dirBodyText',\r
+  dirBodyTextActive: 'treeview_dirBodyTextActive',\r
+  dirContainer: 'treeview_dirContainer',\r
+  dirContainerHover: 'treeview_dirContainerHover',\r
+  file: 'treeview_file',\r
+  fileBody: 'treeview_fileBody',\r
+  fileBodyText: 'treeview_fileBodyText',\r
+  fileBodyTextActive: 'treeview_fileBodyTextActive',\r
+  state_open: 'treeview_stateOpen',\r
+  state_close: 'treeview_stateClose',\r
+  state_empty: 'treeview_stateEmpty',\r
+  dirIcon: 'treeview_dirIcon',\r
+  fileIcon: 'treeview_fileIcon',\r
+  handle: 'treeview_handle'\r
+}\r
+\r
+TreeView.iconId = 'treeview_icon';\r
+\r
+TreeView.prototype = {\r
+  initialize: function(element) {\r
+    this.element = $(element);\r
+    Element.setStyle(this.element, {visibility: 'hidden'});\r
+    Element.hide(this.element);\r
+\r
+    this.options = Object.extend({\r
+      dirSymbol:         'dir',\r
+      fileSymbol:        'file',\r
+      cssPrefix:         'custom_',\r
+      open:              true,\r
+      callBackFunctions: false,\r
+      dirSelect:         true,\r
+      fileSelect:        true,\r
+      noSelectedInsert:  true,\r
+      iconIdPrefix:      TreeView.iconId,\r
+      move:              false,\r
+      unselected:        Prototype.emptyFunction,\r
+      enableUnselected:  true,\r
+      sortOptions:       {},\r
+      openDir:           Prototype.emptyFunction,\r
+      closeDir:          Prototype.emptyFunction,\r
+      emptyImg:          false,\r
+      initialSelected:   null\r
+    }, arguments[1] || {});\r
+\r
+    this.customCss = CssUtil.appendPrefix(this.options.cssPrefix, TreeView.className);\r
+    this.classNames = new CssUtil([TreeView.className, this.customCss]);\r
+\r
+    this.changeClassNameDirAndFile(this.element);\r
+    var nodes = this.element.childNodes;\r
+    for (var i = 0; i < nodes.length; i++) {\r
+      this.build(nodes[i]);\r
+    }\r
+\r
+    this.classNames.addClassNames(this.element, 'top');\r
+    Element.setStyle(this.element, {visibility: 'visible'});\r
+    Element.show(this.element);\r
+\r
+    if (this.options.initialSelected) {\r
+      this.selectEffect(this.options.initialSelected);\r
+    }\r
+\r
+    if (this.options.move) {\r
+      this.setSortable();\r
+    }\r
+  },\r
+\r
+  addChildById: function(element, parent, number) {\r
+    element = $(element);\r
+    parent = $(parent);\r
+\r
+    var container = null;\r
+    if (!element || !parent)\r
+      return;\r
+    else if (Element.hasClassName(parent, TreeView.className.dir))\r
+      container = this.getChildDirContainer(parent);\r
+    else if (Element.hasClassName(parent, TreeView.className.top))\r
+      container = parent;\r
+    else\r
+      return;\r
+\r
+    this.build(element);\r
+\r
+    if (isNaN(number)) {\r
+      container.appendChild(element);\r
+    } else {\r
+      var children = this.getDirectoryContents(container);\r
+      if (children[number]) container.insertBefore(element, children[number]);\r
+      else container.appendChild(element);\r
+    }\r
+\r
+    this.refreshStateImg(parent);\r
+    if (this.options.dragAdrop) this.setSortable();\r
+  },\r
+\r
+  addChildByPath: function(element, path) {\r
+    element = $(element);\r
+    if (element) this.build(element);\r
+    else return;\r
+\r
+    var paths = path.split('/').findAll(function(elm) {\r
+      return (elm != '');\r
+    });\r
+\r
+    var last = paths.pop();\r
+    var container = this.search(paths.join('/'));\r
+\r
+    var children = this.getDirectoryContents(container);\r
+\r
+    if(children[last])\r
+      container.insertBefore(element, children[last]);\r
+    else\r
+      container.appendChild(element);\r
+\r
+    this.refreshStateImg(container.parentNode);\r
+    if (this.options.dragAdrop) this.setSortable();\r
+  },\r
+\r
+  addChildBySelected: function(element, number) {\r
+    if (!this.selected && !this.options.noSelectedInsert) return;\r
+\r
+    if (this.selected)\r
+      this.addChildById(element, this.selected, number);\r
+    else\r
+      this.addChildById(element, this.element, number);\r
+  },\r
+\r
+  addSelectItemCallback: function(functionObj) {\r
+    if (!this.options.callBackFunctions) {\r
+      this.options.callBackFunctions = new Array();\r
+    }\r
+    this.options.callBackFunctions.push(functionObj);\r
+  },\r
+\r
+  build: function(element) {\r
+    if (element.nodeType != 1) return;\r
+\r
+    Element.cleanWhitespace(element);\r
+    this.changeClassNameDirAndFile(element);\r
+\r
+    if (Element.hasClassName(element, TreeView.className.dir)) {\r
+      var container = this.createDirectoryContainer(element);\r
+      var body;\r
+      if (this.hasContents(container))\r
+        body = this.createDirectoryBody(element, false);\r
+      else\r
+        body = this.createDirectoryBody(element, true);\r
+\r
+      element.appendChild(body);\r
+      element.appendChild(container);\r
+\r
+      var nodes = container.childNodes;\r
+      for (var i = 0; i < nodes.length; i++) {\r
+        this.build(nodes[i]);\r
+      }\r
+    } else if (Element.hasClassName(element, TreeView.className.file)) {\r
+      var created = this.createFileBody(element);\r
+      element.appendChild(created);\r
+    }\r
+  },\r
+\r
+  changeClassName: function(element, to, from) {\r
+    var nodes = document.getElementsByClassName(from, element);\r
+\r
+    var newClassName = this.classNames.joinClassNames(to);\r
+    nodes.each(function(n) {\r
+      n.className = n.className.replace(new RegExp(from), newClassName);\r
+    });\r
+\r
+    if (Element.hasClassName(element, from)) {\r
+      element.className = element.className.replace(new RegExp(from), newClassName);\r
+    }\r
+  },\r
+\r
+  changeClassNameDirAndFile: function(element) {\r
+    this.changeClassName(element, 'dir', this.options.dirSymbol);\r
+    this.changeClassName(element, 'file', this.options.fileSymbol);\r
+  },\r
+\r
+  convertJSON: function() {\r
+    return JSON.stringify(this.parse());\r
+  },\r
+\r
+  createDirectoryBody: function(element, isEmpty) {\r
+    var customClass = null;\r
+    var dirBodyClass = this.classNames.joinClassNames('dir');\r
+    if (element.className != dirBodyClass) {\r
+      customClass  = element.className.replace(new RegExp(dirBodyClass + ' '), '');\r
+      element.className = dirBodyClass;\r
+    }\r
+\r
+    var bodyNodes = new Array();\r
+    var state;\r
+    if (isEmpty && !this.options.emptyImg)\r
+      state = 'state_empty';\r
+    else if (this.options.open)\r
+      state = 'state_open';\r
+    else\r
+      state = 'state_close';\r
+\r
+    var id = this.options.iconIdPrefix.appendSuffix(element.id);\r
+    var stateImg = Builder.node('DIV', {id: id.appendSuffix('stateImg')});\r
+    this.classNames.addClassNames(stateImg, state);\r
+    Event.observe(stateImg, "click", this.toggle.bindAsEventListener(this));\r
+\r
+    var itemImg = Builder.node('DIV', {id: id});\r
+    this.classNames.addClassNames(itemImg, 'dirIcon');\r
+    if (customClass) {\r
+      Element.addClassName(itemImg, customClass);\r
+    }\r
+    this.classNames.addClassNames(itemImg, 'handle');\r
+\r
+    var bodyText = Builder.node('SPAN', this.getDirectoryText(element));\r
+    this.classNames.addClassNames(bodyText, 'dirBodyText');\r
+\r
+    bodyNodes.push(stateImg);\r
+    bodyNodes.push(itemImg);\r
+    bodyNodes.push(bodyText);\r
+\r
+    var body = Builder.node('DIV', bodyNodes);\r
+    this.classNames.addClassNames(body, 'dirBody');\r
+    if (this.options.dirSelect) {\r
+      Event.observe(itemImg, "click", this.selectDirItem.bindAsEventListener(this));\r
+      Event.observe(bodyText, "click", this.selectDirItem.bindAsEventListener(this));\r
+    }\r
+\r
+    return body;\r
+  },\r
+\r
+  createDirectoryContainer: function(element) {\r
+    var container = element.getElementsByTagName('ul')[0];\r
+    if (!container) {\r
+      container = Builder.node('UL');\r
+    }\r
+    this.classNames.addClassNames(container, 'dirContainer');\r
+    if (!this.options.open) Element.hide(container);\r
+    return container;\r
+  },\r
+\r
+  createFileBody: function(element) {\r
+    var customClass = null;\r
+    var fileBodyClass = this.classNames.joinClassNames('file');\r
+    if (element.className != fileBodyClass) {\r
+      customClass  = element.className.replace(new RegExp(fileBodyClass + ' '), '');\r
+      element.className = fileBodyClass;\r
+    }\r
+\r
+    var id = this.options.iconIdPrefix.appendSuffix(element.id);\r
+    var itemImg = Builder.node('DIV', {id: id});\r
+    this.classNames.addClassNames(itemImg, 'fileIcon');\r
+    if (customClass) {\r
+      Element.addClassName(itemImg, customClass);\r
+    }\r
+    this.classNames.addClassNames(itemImg, 'handle');\r
+\r
+    var bodyText = Builder.node('SPAN', $A(element.childNodes));\r
+    this.classNames.addClassNames(bodyText, 'fileBodyText');\r
+\r
+    var children = new Array();\r
+    children.push(itemImg);\r
+    children.push(bodyText);\r
+\r
+    var body = Builder.node('DIV', children);\r
+    this.classNames.addClassNames(body, 'fileBody');\r
+    if (this.options.fileSelect) {\r
+      Event.observe(itemImg, "click", this.selectFileItem.bindAsEventListener(this));\r
+      Event.observe(bodyText, "click", this.selectFileItem.bindAsEventListener(this));\r
+    }\r
+\r
+    return body;\r
+  },\r
+\r
+  getChildBody: function(element) {\r
+    var names = [TreeView.className.fileBody, TreeView.className.dirBody];\r
+    return Element.getFirstElementByClassNames(element, names);\r
+  },\r
+\r
+  getChildBodyText: function(element) {\r
+    var names = [\r
+      TreeView.className.fileBodyText,\r
+      TreeView.className.fileBodyTextActive,\r
+      TreeView.className.dirBodyText,\r
+      TreeView.className.dirBodyTextActive\r
+    ];\r
+    return Element.getFirstElementByClassNames(element, names);\r
+  },\r
+\r
+  getChildBodyTextNode: function(element) {\r
+    var body = this.getChildBody(element);\r
+    var bodyText = this.getChildBodyText(body);\r
+    return this.searchTextNode(bodyText);\r
+  },\r
+\r
+  getChildDir: function(element) {\r
+    return document.getElementsByClassName(TreeView.className.dir, element);\r
+  },\r
+\r
+  getChildDirBody: function(element) {\r
+    return document.getElementsByClassName(TreeView.className.dirBody, element)[0];\r
+  },\r
+\r
+  getChildDirContainer: function(element) {\r
+    return document.getElementsByClassName(TreeView.className.dirContainer, element)[0];\r
+  },\r
+\r
+  getChildStateImg: function(element) {\r
+    var body = this.getChildDirBody(element);\r
+    var names = [\r
+      TreeView.className.state_close,\r
+      TreeView.className.state_open,\r
+      TreeView.className.state_empty\r
+    ];\r
+\r
+    return Element.getFirstElementByClassNames(body, names);\r
+  },\r
+\r
+  getChildren: function(element, ignoreDir, ignoreFile) {\r
+    var parent;\r
+    var children = new Array();\r
+    if(element) {\r
+      parent = $(element).getElementsByTagName('ul')[0];\r
+    } else {\r
+      parent = this.element;\r
+    }\r
+    $A(Element.getTagNodes(parent)).each(\r
+      function(node) {\r
+        if(!ignoreDir && Element.hasClassName(node, TreeView.className.dir)) {\r
+          children.push(node);\r
+        }\r
+        if(!ignoreFile && Element.hasClassName(node, TreeView.className.file)) {\r
+          children.push(node);\r
+        }\r
+      }\r
+    );\r
+    return children;\r
+  },\r
+\r
+  getDirectoryContents: function(element) {\r
+    return $A(element.childNodes).findAll(function(child) {\r
+      if ((child.nodeType != 1)) {\r
+        return false;\r
+      }\r
+      if (child.tagName.toLowerCase() == 'li') {\r
+        return true;\r
+      }\r
+      return false;\r
+    });\r
+  },\r
+\r
+  getDirectoryText: function(element) {\r
+    return $A(element.childNodes).findAll(function(child) {\r
+      if ((child.nodeType != 1)) {\r
+        return true;\r
+      } else if (child.tagName.toLowerCase() != 'ul') {\r
+        return true;\r
+      }\r
+      return false;\r
+    });\r
+  },\r
+\r
+  getHierarchyNumber: function() {\r
+    if (!this.selected) return;\r
+    var element = this.selected;\r
+    var i = 0;\r
+    while (true) {\r
+      if (this.element == element) {\r
+        return i;\r
+      } else {\r
+        element = this.getParentDir(element, true);\r
+        if (!element) return;\r
+        i++;\r
+      }\r
+    }\r
+  },\r
+\r
+  getParentDir: function(element, top) {\r
+    var result = Element.getParentByClassName(TreeView.className.dir, element);\r
+    if (!result && top)\r
+      result = Element.getParentByClassName(TreeView.className.top, element);\r
+    return result;\r
+  },\r
+\r
+  hasContents: function(element) {\r
+    if (element) {\r
+      if (!Element.hasClassName(element, TreeView.className.dirContainer) &&\r
+          !Element.hasClassName(element, TreeView.className.top)) {\r
+        return false;\r
+      }\r
+\r
+      var nodes = element.childNodes;\r
+      for (var i = 0; i < nodes.length; i++) {\r
+        if (nodes[i].nodeType == 1) {\r
+          if (Element.hasClassName(nodes[i], TreeView.className.dir) ||\r
+              Element.hasClassName(nodes[i], TreeView.className.file)) {\r
+            return true;\r
+          }\r
+        }\r
+      }\r
+    }\r
+    return false;\r
+  },\r
+\r
+  parse: function(container) {\r
+    if (!container) container = this.element;\r
+\r
+    var itemList = [];\r
+    var contents = this.getDirectoryContents(container);\r
+\r
+    for (var i = 0; i < contents.length; i++) {\r
+      var node = contents[i];\r
+      var body = this.getChildBody(node);\r
+      var text = this.getChildBodyText(body);\r
+\r
+      var item = {};\r
+      item.id = node.id;\r
+\r
+      item.name = Element.collectTextNodes(text).replace(/\n/, '');\r
+      if (Element.hasClassName(node, TreeView.className.dir)) {\r
+        item.type = this.options.dirSymbol;\r
+        item.contents = this.parse(this.getChildDirContainer(node));\r
+\r
+      } else {\r
+        item.type = this.options.fileSymbol;\r
+       }\r
+\r
+       itemList.push(item);\r
+    }\r
+\r
+    return itemList;\r
+  },\r
+\r
+  refreshStateImg: function(element) {\r
+    if (!Element.hasClassName(element, TreeView.className.dir)) return;\r
+\r
+    var container = this.getChildDirContainer(element);\r
+    var img = this.getChildStateImg(element);\r
+\r
+    if (!this.hasContents(container) && !this.options.emptyImg)\r
+      this.classNames.refreshClassNames(img, 'state_empty');\r
+    else if (Element.visible(container))\r
+      this.classNames.refreshClassNames(img, 'state_open');\r
+    else\r
+      this.classNames.refreshClassNames(img, 'state_close');\r
+  },\r
+\r
+  removeById: function(element) {\r
+    element = $(element);\r
+    if (element) {\r
+      var parent = element.parentNode.parentNode;\r
+      Element.remove(element);\r
+      this.refreshStateImg(parent);\r
+    }\r
+  },\r
+\r
+  removeByPath: function(path) {\r
+    var paths = path.split('/').findAll(function(elm) {\r
+      return (elm != '');\r
+    });\r
+\r
+    var last = paths.pop();\r
+    var container = this.search(paths.join('/'));\r
+\r
+    var target = this.getDirectoryContents(container)[last];\r
+    if (target)\r
+      this.removeById(target);\r
+  },\r
+\r
+  removeBySelected: function() {\r
+    if (!this.selected) return;\r
+    this.removeById(this.selected);\r
+    this.selected = false;\r
+  },\r
+\r
+  renameById: function(name, element) {\r
+    element = $(element);\r
+    if (!Element.hasClassName(element, TreeView.className.dir) &&\r
+        !Element.hasClassName(element, TreeView.className.file)) {\r
+      return;\r
+    }\r
+    var node = this.getChildBodyTextNode(element);\r
+    node.nodeValue = name;\r
+  },\r
+\r
+  renameByPath: function(name, path) {\r
+    var paths = path.split('/').findAll(function(elm) {\r
+      return (elm != '');\r
+    });\r
+\r
+    var last = paths.pop();\r
+    var container = this.search(paths.join('/'));\r
+\r
+    var target = this.getDirectoryContents(container)[last];\r
+    if (target)\r
+      this.renameById(name, target);\r
+  },\r
+\r
+  renameBySelected: function(name) {\r
+    if (!this.selected) return;\r
+    this.renameById(name, this.selected);\r
+  },\r
+\r
+  search: function(path) {\r
+    var paths = path.split('/').findAll(function(elm) {\r
+      return (elm != '');\r
+    });\r
+\r
+    var container = this.element;\r
+    for (var i = 0; i < paths.length; i++) {\r
+      var num = paths[i];\r
+      var contents = this.getDirectoryContents(container);\r
+      if (contents[num] && Element.hasClassName(contents[num], TreeView.className.dir)) {\r
+        container = this.getChildDirContainer(contents[num]);\r
+      } else {\r
+        return false;\r
+      }\r
+    }\r
+    return container;\r
+  },\r
+\r
+  searchTextNode: function(element) {\r
+    var text = null;\r
+    var nodes = element.childNodes;\r
+\r
+    for (var i = 0; i < nodes.length; i++) {\r
+      if (nodes[i].nodeType == 3) {\r
+        text = nodes[i];\r
+        break;\r
+      } else if (nodes[i].nodeType == 1) {\r
+        var tmp = this.searchTextNode(nodes[i]);\r
+        if (tmp) {\r
+          text = tmp;\r
+          break;\r
+        }\r
+      }\r
+    }\r
+    return text;\r
+  },\r
+\r
+  selectDirItem: function(event) {\r
+    var itemBody = Element.getParentByClassName(TreeView.className.dirBody, Event.element(event));\r
+    this.selectItem(itemBody);\r
+  },\r
+\r
+  selectEffect: function(element) {\r
+    element = $(element);\r
+    if(element) {\r
+      var itemBody = element.firstChild;\r
+      if (this.selectItemUnselect(itemBody, false)) {\r
+        return;\r
+      }\r
+      this.selectItemSelect(itemBody, false);\r
+    }\r
+  },\r
+\r
+  selectFileItem: function(event) {\r
+    var itemBody = Element.getParentByClassName(TreeView.className.fileBody, Event.element(event));\r
+    this.selectItem(itemBody);\r
+  },\r
+\r
+  selectItem: function(itemBody) {\r
+    if (this.selectItemUnselect(itemBody, true)) {\r
+      return;\r
+    }\r
+    this.selectItemSelect(itemBody, true);\r
+  },\r
+\r
+  selectItemSelect: function(itemBody, callback) {\r
+    this.selected = itemBody.parentNode;\r
+    var text = this.getChildBodyText(itemBody);\r
+    if (Element.hasClassName(text, TreeView.className.dirBodyText)) {\r
+      this.classNames.refreshClassNames(text, 'dirBodyTextActive');\r
+      this.defaultCss = 'dirBodyText';\r
+    } else if (Element.hasClassName(text, TreeView.className.fileBodyText)) {\r
+      this.classNames.refreshClassNames(text, 'fileBodyTextActive');\r
+      this.defaultCss = 'fileBodyText';\r
+    }\r
+    if (callback) {\r
+      if (this.options.callBackFunctions) {\r
+        for (var i = 0; i < this.options.callBackFunctions.length; i++) {\r
+          this.options.callBackFunctions[i](itemBody.parentNode);\r
+        }\r
+      }\r
+    }\r
+  },\r
+\r
+  selectItemUnselect: function(itemBody, callback) {\r
+    if (this.selected) {\r
+      var selectedBody = this.getChildBody(this.selected);\r
+      var selectedText = this.getChildBodyText(selectedBody);\r
+      this.classNames.refreshClassNames(selectedText, this.defaultCss);\r
+      if (this.selected == itemBody.parentNode && this.options.enableUnselected) {\r
+        this.selected = false;\r
+        this.defaultCss = false;\r
+        if (callback) {\r
+          this.options.unselected();\r
+        }\r
+        return true;\r
+      }\r
+    }\r
+    return false;\r
+  },\r
+\r
+  setSortable: function() {\r
+    var options = Object.extend({\r
+      dropOnEmpty: true,\r
+      tree: true,\r
+      hoverclass: 'treeview_dirContainerHover',\r
+      scroll: window,\r
+      ghosting: true\r
+    }, this.options.sortOptions);\r
+    Sortable.create(this.element, options);\r
+  },\r
+\r
+  toggle: function(event) {\r
+    Event.stop(event);\r
+    var src = Event.element(event);\r
+    var parent = this.getParentDir(src);\r
+    var container = this.getChildDirContainer(parent);\r
+\r
+    if (!this.hasContents(container) && !this.options.emptyImg) return;\r
+\r
+    Element.toggle(container);\r
+    this.refreshStateImg(parent);\r
+\r
+    if (!this.hasContents(container) && !this.options.emptyImg)\r
+      this.options.openDir(parent, container);\r
+    else if (Element.visible(container))\r
+      this.options.openDir(parent, container);\r
+    else\r
+      this.options.closeDir(parent, container);\r
+  }\r
+}\r