/** * TreeDropdownField.js */ TreeDropdownField = Class.extend('Observable'); TreeDropdownField.prototype = { initialize: function() { // Hook up all the fieldy bits this.editLink = this.getElementsByTagName('a')[0]; this.humanItems = this.getElementsByTagName('span')[0]; this.inputTag = this.getElementsByTagName('input')[0]; this.editLink.treeDropdownField = this; this.humanItems.treeDropdownField = this; this.inputTag.treeDropdownField = this; this.editLink.onclick = this.edit_click; this.humanItems.onclick = this.edit_click; this.inputTag.setValue = this.setValue.bind(this); }, destroy: function() { if(this.editLink) { this.editLink.onclick = null; this.editLink.treeDropdownField = null; this.editLink = null; } if(this.humanItems) { this.humanItems.onclick = null; this.humanItems.treeDropdownField = null; this.humanItems = null; } if(this.inputTag) { this.inputTag.setValue = null; this.inputTag.treeDropdownField = null; this.inputTag = null; } }, helperURLBase: function() { return this.ownerForm().action + '&action_callfieldmethod=1&fieldName=' + this.inputTag.name + '&ajax=1' }, ownerForm: function() { var f =this.parentNode; while(f && f.tagName.toLowerCase() != 'form') f = f.parentNode; return f; }, toggleTree: function() { if(this.treeShown) this.hideTree(); else this.showTree(); }, createTreeNode: function(keepTreeHidden) { if(!this.itemTree) { this.itemTree = document.createElement('div'); if(keepTreeHidden) { this.hideTree(); } this.itemTree.className = 'tree_holder'; this.itemTree.innerHTML = "loading..."; this.appendChild(this.itemTree); } }, showTree: function () { this.treeShown = true; if(this.itemTree) { this.itemTree.style.display = 'block'; // Store this in a parameter so that stopObserving works this.bound_testForBlur = this.testForBlur.bind(this); Event.observe(document, 'click', this.bound_testForBlur); this.stretchIframeIfNeeded(); } else { this.createTreeNode(); this.ajaxGetTree( (function(response) { this.newTreeReady(response, false); this.updateTreeLabel(); }).bind(this)); } }, /** * If this control is inside an iframe, stretch the iframe out to fit the tree. */ stretchIframeIfNeeded: function() { if(parent && parent.document) { if(!this.iframeObj) { var iframes = parent.document.getElementsByTagName('iframe') var i,item; for(i=0;item=iframes[i];i++) { if(item.contentWindow == window) { this.iframeObj = item; break; } } } var desiredHeight = Position.cumulativeOffset(this.itemTree)[1] + this.itemTree.offsetHeight + 2; if(this.iframeObj && desiredHeight > this.iframeObj.offsetHeight) { this.iframeObj.oldHeight = this.iframeObj.offsetHeight; this.iframeObj.style.height = desiredHeight + 'px'; } } }, unstretchIframeIfNeeded: function() { if(this.iframeObj && this.iframeObj.oldHeight) this.iframeObj.style.height = this.iframeObj.oldHeight + 'px'; }, testForBlur: function (event) { var clicked = Event.element(event); if(clicked != this.itemTree && !hasAncestor(clicked, this.itemTree) && clicked != this.editLink && clicked != this.humanItems) { this.hideTree(); } }, hideTree: function() { this.treeShown = false; if(this.itemTree) { this.itemTree.style.display = 'none'; Event.stopObserving(document, 'click', this.bound_testForBlur); // this.editLink.style.display = this.humanItems.style.display = 'block'; this.unstretchIframeIfNeeded(); } // this.style.position = ''; }, ajaxGetTree: function(after) { var ajaxURL = this.helperURLBase() + '&methodName=gettree&forceValues=' + this.inputTag.value; new Ajax.Request(ajaxURL, { method : 'get', onSuccess : after, onFailure : function(response) { errorMessage("Error getting data", response); } }) }, /** * Called once the tree has been delivered from ajax */ newTreeReady: function (response, keepTreeHidden) { // alert('newTreeReady'); this.itemTree.innerHTML = response.responseText; // HACK IE6: see http://www.hedgerwow.com/360/bugs/css-select-free.html this.itemTree.appendChild(document.createElement('iframe')); this.tree = Tree.create(this.itemTree.getElementsByTagName('ul')[0], { ajaxExpansion: this.ajaxExpansion, getIdx: function() { return this.id.replace(this.options.idxBase,''); }, idxBase : 'selector-' + this.inputTag.name + '-', dropdownField : this, onselect : this.tree_click }); // Select the appropriate items var selectedItems = this.inputTag.value.split(/ *, */); var i, isSelected = {}; for(i=0;i