summaryrefslogtreecommitdiffstats
path: root/js/keyword-chooser.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/keyword-chooser.js')
-rw-r--r--js/keyword-chooser.js162
1 files changed, 162 insertions, 0 deletions
diff --git a/js/keyword-chooser.js b/js/keyword-chooser.js
new file mode 100644
index 000000000..afc90b491
--- /dev/null
+++ b/js/keyword-chooser.js
@@ -0,0 +1,162 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Keyword Chooser.
+ *
+ * The Initial Developer of the Original Code is America Online, Inc.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * Mozilla Foundation. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Christopher A. Aillon <christopher@aillon.com> (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function KeywordChooser(aParent, aChooser, aAvail, aChosen, aValidKeywords)
+{
+ // Initialization
+ this._parent = aParent;
+ this._chooser = aChooser;
+ this._available = aAvail;
+ this._chosen = aChosen;
+ this._validKeywords = aValidKeywords;
+
+ this.setInitialStyles();
+
+ // Register us, our properties, and our events
+ this._parent.chooser = this;
+ this._chooser.chooserElement = this._parent;
+}
+
+KeywordChooser.prototype =
+{
+ // chooses the selected items
+ choose: function()
+ {
+ this._swapSelected(this._available, this._chosen);
+ },
+
+ unchoose: function()
+ {
+ this._swapSelected(this._chosen, this._available);
+ },
+
+ positionChooser: function()
+ {
+ if (this._positioned) {
+ return;
+ }
+
+ var elemY = bz_findPosY(this._parent);
+ var elemX = bz_findPosX(this._parent);
+ var elemH = this._parent.offsetHeight;
+
+ this._chooser.style.left = elemX + "px";
+ this._chooser.style.top = elemY + elemH + 1 + "px";
+
+ this._positioned = true;
+ },
+
+ setInitialStyles: function()
+ {
+ this._chooser.style.display = "none";
+ this._chooser.style.position = "absolute";
+ this._positioned = false;
+ },
+
+ open: function()
+ {
+ this._chooser.style.display = "";
+ this._available.style.display = "";
+ this._chosen.style.display = "";
+ this._parent.disabled = true;
+ this.positionChooser();
+ },
+
+ ok: function()
+ {
+ var len = this._chosen.options.length;
+
+ var text = "";
+ for (var i = 0; i < len; i++) {
+ text += this._chosen.options[i].text;
+ if (i != len - 1) {
+ text += ", ";
+ }
+ }
+
+ this._parent.value = text;
+ this._parent.title = text;
+
+ this.close();
+ },
+
+ cancel: function()
+ {
+ var chosentext = this._parent.value;
+ var chosenArray = new Array();
+
+ if (chosentext != ""){
+ chosenArray = chosentext.split(", ");
+ }
+
+ var availArray = new Array();
+
+ for (var i = 0; i < this._validKeywords.length; i++) {
+ if (!bz_isValueInArray(chosenArray, this._validKeywords[i])) {
+ availArray[availArray.length] = this._validKeywords[i];
+ }
+ }
+
+ bz_populateSelectFromArray(this._available, availArray, false, true);
+ bz_populateSelectFromArray(this._chosen, chosenArray, false, true);
+ this.close();
+ },
+
+ close: function()
+ {
+ this._chooser.style.display = "none";
+ this._parent.disabled = false;
+ },
+
+ _swapSelected: function(aSource, aTarget)
+ {
+ var kNothingSelected = -1;
+ while (aSource.selectedIndex != kNothingSelected) {
+ var option = aSource.options[aSource.selectedIndex];
+ aTarget.appendChild(option);
+ option.selected = false;
+ }
+ }
+};
+
+function InitializeKeywordChooser(aValidKeywords)
+{
+ var keywords = document.getElementById("keywords");
+ var chooser = document.getElementById("keyword-chooser");
+ var avail = document.getElementById("keyword-list");
+ var chosen = document.getElementById("bug-keyword-list");
+ var chooserObj = new KeywordChooser(keywords, chooser, avail, chosen, aValidKeywords);
+}