Index: branches/RC/core/admin_templates/js/tree.js =================================================================== --- branches/RC/core/admin_templates/js/tree.js (revision 11834) +++ branches/RC/core/admin_templates/js/tree.js (revision 11835) @@ -1,633 +1,645 @@ var last_hightlighted = null; var last_highlighted_key = null; function TreeItem(title, url, icon, onclick, priority) { this.Title = title; this.Url = url; this.Rendered = false; this.Displayed = false; this.Level = 0; this.Icon = icon; this.Onclick = onclick; this.Priority = isset(priority) ? priority : false; this.Children = false; } TreeItem.prototype.isFolder = function() { return typeof(this.folderClick) == 'function'; } TreeItem.prototype.isContainer = function() { return this.isFolder() && this.Container; } TreeItem.prototype.Render = function(before, force) { if (!this.Rendered || force) { if (!isset(before)) {before = null} tr = document.createElement('tr'); this.ParentElement.insertBefore(tr, before); if (!this.Displayed) { tr.style.display = 'none' } td = document.createElement('td'); td.TreeElement = this; tr.appendChild(td); this.appendLevel(td); if (this.ParentFolder != null) this.appendNodeImage(td); this.appendIcon(td); this.appendLink(td); this.Tr = tr; this.Rendered = true; // alert(this.Tr.innerHTML) } } TreeItem.prototype.remove = function() { var p = this.Tr.parentNode; p.removeChild(this.Tr); } TreeItem.prototype.appendLevel = function(td) { for (var i=0; i < this.Level; i++) { img = document.createElement('img'); img.style.width = '16px'; img.style.height = '22px'; img.src = TREE_ICONS_PATH+'/ftv2blank.gif'; img.style.verticalAlign = 'middle'; td.appendChild(img); } } TreeItem.prototype.getNodeImage = function(is_last) { return is_last ? TREE_ICONS_PATH+'/ftv2lastnode.gif' : TREE_ICONS_PATH+'/ftv2node.gif'; } TreeItem.prototype.appendNodeImage = function(td) { img = document.createElement('img'); img.style.width = '16px'; img.style.height = '22px'; img.src = this.getNodeImage(); img.style.verticalAlign = 'middle'; td.appendChild(img); } TreeItem.prototype.appendIcon = function (td) { img = document.createElement('img'); img.style.width = '24px'; img.style.height = '22px'; if (this.Icon.indexOf('http://') != -1) { img.src = this.Icon; } else { img.src = this.Icon; } img.style.verticalAlign = 'middle'; td.appendChild(img); } TreeItem.prototype.appendLink = function (td) { var $node_text = document.createElement('span'); $node_text.innerHTML = this.Title; if (TREE_SHOW_PRIORITY && this.Priority !== false) { $node_text.innerHTML += '<span class="priority"><sup>' + this.Priority + '</sup></span>'; } link = document.createElement('a'); link.nodeValue = this.Title; link.href = this.Url; link.target = 'main'; link.appendChild($node_text); link.treeItem = this; //addEvent(link, 'click', link.onclick = function(ev) { var e = is.ie ? window.event : ev; res = true; if (isset(this.treeItem.Onclick)) { res = eval(this.treeItem.Onclick); } if (!res) { // if we need to cancel onclick action if (is.ie) { window.event.cancelBubble = true; window.event.returnValue = false; } else { ev.preventDefault(); ev.stopPropagation(); } return res; } else { // ensures, that click is made before AJAX request will be sent if (res === true) { // only in case of "true" is returned, used in catalog if (this.treeItem.isContainer()) { this.href = this.treeItem.locateFirstItem().Url; } getFrame(link.target).location.href = this.href; } if (!this.treeItem.Expanded && this.treeItem.isFolder()) { if (this.treeItem.folderClick()); } this.treeItem.highLight(); return false; } } td.appendChild(link); /* if (this.LateLoadURL) { var span = document.createElement('span'); span.innerHTML = ' Reload'; span.treeItem = this; span.onclick = function(ev) { this.treeItem.reload(); } td.appendChild(span); } */ } TreeItem.prototype.display = function() { this.Tr.style.display = is.ie ? 'block' : 'table-row'; this.Displayed = true; var do_sub = TreeManager.isExpanded(this.Key); if (this.Children && do_sub && !this.Expanding) { this.expand(); } if (this.ParentFolder != null && !this.ParentFolder.Expanded) { this.ParentFolder.expand(); } } TreeItem.prototype.hide = function() { this.Tr.style.display = 'none'; this.Displayed = false; } TreeItem.prototype.highLight = function() { if (last_hightlighted) last_hightlighted.Tr.className = ''; if (this.Children && this.Children.length > 0 && this.isContainer()) { if (!this.Expanded) { this.expand(); } this.Children[0].highLight(); return; } this.Tr.className = "highlighted"; last_hightlighted = this; last_highlighted_key = this.Key; if (!this.Expanded) { this.expand(); } } TreeItem.prototype.expand = function() { this.display(); } TreeItem.prototype.collapse = function() { this.hide() } TreeItem.prototype.updateLastNodes = function(is_last, lines_pattern) { if (!isset(is_last)) is_last = true; if (!isset(this.Tr)) return; if (!isset(lines_pattern)) { var lines_pattern = new Array() } imgs = this.Tr.getElementsByTagName('img'); found = false; for (var i=0; i<imgs.length; i++) { the_img = imgs.item(i); if (in_array(i, lines_pattern) && the_img.src.indexOf('ftv2blank.gif') != -1) { the_img.src = TREE_ICONS_PATH+'/ftv2vertline.gif'; } if (this.isNodeImage(the_img)) { found = true; break; } } if (found) { the_img.src = this.getNodeImage(is_last); } this.isLast = is_last; return lines_pattern; } TreeItem.prototype.isNodeImage = function(img) { return ( img.src.indexOf('ftv2node.gif') != -1 || img.src.indexOf('ftv2lastnode.gif') != -1 ) } TreeItem.prototype.locateLastItem = function() { return this; } TreeItem.prototype.locateItemByURL = function(url) { if (this.Url == url) return this; return false; } TreeItem.prototype.locateItemByKey = function(key) { if (this.Key == key) return this; return false; } TreeItem.prototype.reload = function() { } /* FOLDER */ function TreeFolder(parent_id, title, url, icon, late_load_url, onclick, priority, container) { var render = false; if (isset(parent_id)) { this.ParentElement = document.getElementById(parent_id); render = true; } else { } this.Title = title; this.Url = url; this.Rendered = false; this.Displayed = false; this.Expanded = false; this.Level = 0; this.Id = 0; this.Tr = null; this.Icon = icon; this.LateLoadURL = isset(late_load_url) ? late_load_url : false; this.Loaded = false; this.Onclick = onclick; this.Priority = isset(priority) ? priority : false; this.Container = isset(container) ? parseInt(container) : false; this.Children = new Array(); this.ChildIndex = 0; + this.Reloading = false; + if (render) { this.Expanded = true; this.Displayed = true; this.Render(); this.expand(); } } TreeFolder.prototype = new TreeItem; TreeFolder.prototype.locateLastItem = function() { if (this.Children.length == 0) return this; for (var i=0; i<this.Children.length; i++) { last_item = this.Children[i].locateLastItem() } return last_item; } TreeFolder.prototype.locateFirstItem = function() { var $folder_node = this; while ($folder_node.isContainer() && $folder_node.Children.length > 0) { $folder_node = $folder_node.Children[0]; } return $folder_node; } TreeFolder.prototype.locateItemByURL = function(url, with_late_load) { last_item = false; if (this.Url == url && ( (with_late_load && this.LateLoadURL) || !with_late_load) ) { return this; } for (var i=0; i<this.Children.length; i++) { last_item = this.Children[i].locateItemByURL(url, with_late_load) if (last_item) return last_item; } return last_item; } TreeFolder.prototype.locateItemByKey = function(key) { last_item = false; if (this.Key == key) { return this; } for (var i=0; i<this.Children.length; i++) { last_item = this.Children[i].locateItemByKey(key) if (last_item) return last_item; } return last_item; } TreeFolder.prototype.locateTopItem = function() { if (this.ParentFolder == null) return this; return this.ParentFolder.locateTopItem(); } TreeFolder.prototype.AddItem = function(an_item, render, display) { an_item.ParentElement = this.ParentElement; an_item.Level = this.ParentFolder != null ? this.Level + 1 : 0; an_item.ParentFolder = this; last_item = this.locateLastItem(); this.Children.push(an_item); an_item.Id = this.Children.length; an_item.Render(last_item.Tr.nextSibling); var keys = new Array() var tmp = an_item; keys.push(tmp.Level + '_' + tmp.Id); while (tmp.ParentFolder) { tmp = tmp.ParentFolder keys.push(tmp.Level + '_' + tmp.Id); } keys = keys.reverse(); key_str = keys.join('-'); an_item.Key = key_str; if (this.Expanded) { an_item.display(); } return an_item; } TreeFolder.prototype.AddFromXML = function(xml, render) { // start = new Date(); if (!isset(render)) render = true; doc = getDocumentFromXML(xml); this.LastFolder = this; this.ProcessXMLNode(doc, render); // end = new Date(); this.locateTopItem().updateLastNodes(); // alert('AddFromXML took: '+(end - start)) } TreeFolder.prototype.ProcessXMLNode = function(node, render) { if (!isset(render)) render = true; if (!isset(this.LastFolder)) this.LastFolder = this; for (var i=0; i<node.childNodes.length; i++) { child = node.childNodes.item(i); if (child.tagName == 'folder') { var backupLastFolder = this.LastFolder; this.LastFolder = this.LastFolder.AddItem(new TreeFolder(null, child.getAttribute('name'), child.getAttribute('href'), child.getAttribute('icon'), child.getAttribute('load_url'), child.getAttribute('onclick'), child.getAttribute('priority'), child.getAttribute('container')), render); if (child.hasChildNodes) { this.ProcessXMLNode(child); } this.LastFolder = backupLastFolder; } else if (child.tagName == 'item') { this.LastFolder.AddItem(new TreeItem(child.firstChild.nodeValue, child.getAttribute('href'), child.getAttribute('icon'), child.getAttribute('onclick'), child.getAttribute('priority')), render) } else if (child.tagName == 'tree') { this.LastFolder = this; this.ProcessXMLNode(child); } } } TreeFolder.prototype.getNodeImage = function(is_last) { if (is_last) { return this.Expanded ? TREE_ICONS_PATH+'/ftv2mlastnode.gif' : TREE_ICONS_PATH+'/ftv2plastnode.gif'; } else { return this.Expanded ? TREE_ICONS_PATH+'/ftv2mnode.gif' : TREE_ICONS_PATH+'/ftv2pnode.gif'; } } TreeFolder.prototype.appendNodeImage = function(td, is_last) { img = document.createElement('img'); img.style.width = '16px'; img.style.height = '22px'; img.src = this.getNodeImage(is_last); img.style.cursor = 'hand'; img.style.cursor = 'pointer'; img.style.verticalAlign = 'middle'; img.onclick = function() { this.parentNode.TreeElement.folderClick(this) } this.Img = img; td.appendChild(img); } TreeFolder.prototype.updateLastNodes = function(is_last, lines_pattern) { if (!isset(is_last)) is_last = true; if (!isset(lines_pattern)) { var lines_pattern = new Array() } if (!is_last && !in_array(this.Level, lines_pattern)) { lines_pattern.push(this.Level) } lines_pattern = TreeItem.prototype.updateLastNodes.apply(this, new Array(is_last, lines_pattern)) for (var i=0; i<this.Children.length; i++) { lines_pattern = this.Children[i].updateLastNodes((i+1) == this.Children.length, lines_pattern) } lines_pattern[array_search(this.Level, lines_pattern)] = -1; return lines_pattern; } TreeFolder.prototype.isNodeImage = function(img) { return ( img.src.indexOf('ftv2mlastnode.gif') != -1 || img.src.indexOf('ftv2plastnode.gif') != -1 || img.src.indexOf('ftv2mnode.gif') != -1 || img.src.indexOf('ftv2pnode.gif') != -1 ) } TreeFolder.prototype.folderClick = function(img) { if (this.Expanded) { this.collapse(); } else { this.expand(); } } TreeFolder.prototype.remove = function() { this.removeChildren(); var p = this.Tr.parentNode; p.removeChild(this.Tr); } TreeFolder.prototype.removeChildren = function() { for (var i in this.Children) { this.Children[i].remove(); } this.Children = new Array(); } TreeFolder.prototype.successCallback = function ($request, $params, $object) { if ($params == 'reload') { $object.removeChildren(); } $object.Loaded = true; $object.ProcessXMLNode($request.responseXML); $object.Render(); $object.locateTopItem().updateLastNodes(); $object.expand(); if (last_highlighted_key) { var fld = $object.locateItemByKey(last_highlighted_key) if (fld) { fld.highLight(); } } + + $object.Reloading = false; } TreeFolder.prototype.reload = function() { + if (this.Reloading) { + return ; + } + + this.Reloading = true; + Request.headers['Content-type'] = 'text/xml'; Request.makeRequest(this.LateLoadURL, false, '', this.successCallback, this.errorCallback, 'reload', this); } TreeFolder.prototype.errorCallback = function($request, $params, $object) { alert('AJAX ERROR: ' + Request.getErrorHtml($request)); + + $object.Reloading = false; } TreeFolder.prototype.expand = function(mode) { if (this.Expanding) { return; } this.Expanding = true; if (!isset(mode)) mode = 0; this.display(); if (mode == 0 || this.Expanded ) { for (var i=0; i<this.Children.length; i++) { this.Children[i].expand(mode+1); } } if (mode == 0) { if (this.LateLoadURL && !this.Loaded) { Request.headers['Content-type'] = 'text/xml'; Request.makeRequest(this.LateLoadURL, false, '', this.successCallback, this.errorCallback, '', this); } this.Expanded = true; TreeManager.markStatus(this.Key, 1) if (isset(this.Img)) { this.Img.src = this.getNodeImage(this.isLast); } } this.Expanding = false; } TreeFolder.prototype.collapse = function(mode) { if (!isset(mode)) mode = 0; for (var i=0; i<this.Children.length; i++) { this.Children[i].collapse(mode+1); this.Children[i].hide(); } if (mode == 0) { this.Expanded = false; TreeManager.markStatus(this.Key, 0) if (isset(this.Img)) { this.Img.src = this.getNodeImage(this.isLast); } } } function TreeManager() {} TreeManager.ExpandStatus = new Array (); TreeManager.markStatus = function(id, status) { this.ExpandStatus[id] = status; if (!status) { for (var i in this.ExpandStatus) { if (i.indexOf(id) == 0) { // if i starts with the same as id, meaning it is its child node this.ExpandStatus[i] = 0; } } } TreeManager.saveStatus() } TreeManager.isExpanded = function(id) { return (this.ExpandStatus[id] == 1); } TreeManager.saveStatus = function () { var cookieString = new Array(); for (var i in this.ExpandStatus) { if (this.ExpandStatus[i] == 1) { cookieString.push(i); } } document.cookie = 'TreeExpandStatus=' + cookieString.join(':'); } TreeManager.loadStatus = function () { var $tree_status = getCookie('TreeExpandStatus'); if (!$tree_status) { return ; } $tree_status = $tree_status.split(':'); for (var $i = 0; $i < $tree_status.length; $i++) { this.ExpandStatus[$tree_status[$i]] = true; } // print_pre(this.ExpandStatus); } TreeManager.loadStatus(); \ No newline at end of file