/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ function createId(boardid, nodeid) { return "b" + boardid + "_t" + nodeid; } function idFromStr(str) { return str.substring(str.search('t') + 1, str.length); } var nodes = new Array(); function findNode(id, subscribeid) { for(var i = 0; i < nodes.length; i++) { var node = nodes[i]; var child = node.findNode(id, subscribeid); if(child != null) { return child; } } return null; } function Node(id, subscribeid) { this.id = id; this.subscribeid = subscribeid; this.children = new Array(); this.attributes = {}; this.parent = null; // Elements: this.element = document.createElement("div"); this.div_id = document.createElement("span"); this.div_title = document.createElement("span"); } Node.prototype.dump = function() { alert(this.id); }; Node.prototype.findNode = function(id, subscribeid) { if(this.subscribeid != subscribeid) { return null; } if(this.id == id) { return this; } for(var i = 0; i < this.children.length; i++) { var node = this.children[i]; var child = node.findNode(id, subscribeid); if(child != null) { return child; } } return null; }; Node.prototype.addChild = function(node, insertBeforeId) { if(node.parent != null) { node.parent.removeChild(node); } node.parent = this; inserted = false; for(i = 0; i < this.children.length; ++i) { if(this.children[i].id == insertBeforeId) { this.children.splice(i - 1, 0, node); this.element.insertBefore(node.element, this.element.childNodes[i + 2]); inserted = true; break; } } if(inserted == false) { this.children.push(node); this.element.appendChild(node.element); } }; Node.prototype.removeChild = function(node) { this.children = this.children.filter(function(e) { return e.id != node.id; }); node.parent = null; this.element.removeChild(node.element); }; Node.prototype.create = function() { var node = this.element; node.name = "node"; node.setAttribute("class", "node"); node.setAttribute("ondblclick", "editTitle(this, event)"); //node.setAttribute("onclick", "showHideChildren(this, event)"); node.setAttribute("ondrop", "drop(event)"); node.setAttribute("ondragenter", "dragenter(event)"); node.setAttribute("ondragover", "dragover(event)"); node.setAttribute("ondragleave", "dragleave(event)"); node.setAttribute("draggable", true); node.setAttribute("ondragstart", "drag(this, event)"); node.setAttribute("ondragend", "dragEnd(event)"); node.setAttribute("nodeid", this.id); // This is a hack to make it possible to identify the nodeid and // oberveid from the node id alone. node.id = createId(this.subscribeid, this.id); /* var subscribe_button = document.createElement("div"); subscribe_button.name = "subscribe_button"; subscribe_button.setAttribute("onclick", "subscribeMe(this, event)"); subscribe_button.setAttribute("nodeid", this.id); subscribe_button.setAttribute("style", "float: left; display: inline-box; width:14px; height: 14px; border: solid green 2px; cursor: pointer;"); var txt_plus = document.createTextNode("+"); subscribe_button.appendChild(txt_plus); node.appendChild(subscribe_button); var unsubscribe_button = document.createElement("div"); unsubscribe_button.name = "unsubscribe_button"; unsubscribe_button.setAttribute("onclick", "unsubscribeMe(this, event)"); unsubscribe_button.setAttribute("nodeid", this.id); unsubscribe_button.setAttribute("style", "float: left; display: inline-box; width:14px; height: 14px; border: solid red 2px; cursor: pointer;"); var txt_minus = document.createTextNode("-"); unsubscribe_button.appendChild(txt_minus); node.appendChild(unsubscribe_button); */ this.element.appendChild(this.div_id); var id_txt = document.createTextNode(this.id); this.div_id.style.padding = "5px"; this.div_id.style.opacity = "0.3"; this.div_id.appendChild(id_txt); this.element.appendChild(this.div_title); this.setAttribute("title", "(missing title)"); }; Node.prototype.setAttribute = function(name, value) { this.attributes[name] = value; if(name == "title") { if(this.div_title.firstChild != null) { this.div_title.removeChild(this.div_title.firstChild); } var title_txt = document.createTextNode(value); this.div_title.appendChild(title_txt); } if(name == "dragged") { if(value == "true") { // Make transparent and non-draggable this.element.style.opacity = "0.3"; // TODO: Apply recursively? this.element.setAttribute("draggable", false); } else { // Make opaque and draggable again this.element.style.opacity = "1.0"; // TODO: Apply recursively? this.element.setAttribute("draggable", true); } } };