-// 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