home *** CD-ROM | disk | FTP | other *** search
- // ===================================================================
- // Author: Matt Kruse <matt@mattkruse.com>
- // WWW: http://www.mattkruse.com/
- //
- // NOTICE: You may use this code for any purpose, commercial or
- // private, without any further permission from the author. You may
- // remove this notice from your final code if you wish, however it is
- // appreciated by the author if at least my web site address is kept.
- //
- // You may *NOT* re-distribute this code in any way except through its
- // use. That means, you can include it in your product, or your web
- // site, or any other form where the code is actually being used. You
- // may not put the plain javascript up on your site for download or
- // include it in your javascript libraries for download.
- // If you wish to share this code with others, please just point them
- // to the URL instead.
- // Please DO NOT link directly to my .js files from your site. Copy
- // the files to your server and use them there. Thank you.
- // ===================================================================
-
- // HISTORY
- // ------------------------------------------------------------------
- // June 12, 2003: Modified up and down functions to support more than
- // selected option
- /*
- DESCRIPTION: These are general functions to deal with and manipulate
- select boxes. Also see the OptionTransfer library to more easily
- handle transferring options between two lists
-
- COMPATIBILITY: These are fairly basic functions - they should work on
- all browsers that support Javascript.
- */
-
- // -------------------------------------------------------------------
- // selectUnselectMatchingOptions(select_object,regex,select/unselect,true/false)
- // This is a general function used by the select functions below, to
- // avoid code duplication
- // -------------------------------------------------------------------
- function selectUnselectMatchingOptions(obj,regex,which,only) {
- if (window.RegExp) {
- if (which == "select") {
- var selected1=true;
- var selected2=false;
- }
- else if (which == "unselect") {
- var selected1=false;
- var selected2=true;
- }
- else {
- return;
- }
- var re = new RegExp(regex);
- for (var i=0; i<obj.options.length; i++) {
- if (re.test(obj.options[i].text)) {
- obj.options[i].selected = selected1;
- }
- else {
- if (only == true) {
- obj.options[i].selected = selected2;
- }
- }
- }
- }
- }
-
- // -------------------------------------------------------------------
- // selectMatchingOptions(select_object,regex)
- // This function selects all options that match the regular expression
- // passed in. Currently-selected options will not be changed.
- // -------------------------------------------------------------------
- function selectMatchingOptions(obj,regex) {
- selectUnselectMatchingOptions(obj,regex,"select",false);
- }
- // -------------------------------------------------------------------
- // selectOnlyMatchingOptions(select_object,regex)
- // This function selects all options that match the regular expression
- // passed in. Selected options that don't match will be un-selected.
- // -------------------------------------------------------------------
- function selectOnlyMatchingOptions(obj,regex) {
- selectUnselectMatchingOptions(obj,regex,"select",true);
- }
- // -------------------------------------------------------------------
- // unSelectMatchingOptions(select_object,regex)
- // This function Unselects all options that match the regular expression
- // passed in.
- // -------------------------------------------------------------------
- function unSelectMatchingOptions(obj,regex) {
- selectUnselectMatchingOptions(obj,regex,"unselect",false);
- }
-
- // -------------------------------------------------------------------
- // sortSelect(select_object)
- // Pass this function a SELECT object and the options will be sorted
- // by their text (display) values
- // -------------------------------------------------------------------
- function sortSelect(obj) {
- var o = new Array();
- if (obj.options==null) { return; }
- for (var i=0; i<obj.options.length; i++) {
- o[o.length] = new Option( obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected) ;
- }
- if (o.length==0) { return; }
- o = o.sort(
- function(a,b) {
- if ((a.text+"") < (b.text+"")) { return -1; }
- if ((a.text+"") > (b.text+"")) { return 1; }
- return 0;
- }
- );
-
- for (var i=0; i<o.length; i++) {
- obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
- }
- }
-
- // -------------------------------------------------------------------
- // selectAllOptions(select_object)
- // This function takes a select box and selects all options (in a
- // multiple select object). This is used when passing values between
- // two select boxes. Select all options in the right box before
- // submitting the form so the values will be sent to the server.
- // -------------------------------------------------------------------
- function selectAllOptions(obj) {
- for (var i=0; i<obj.options.length; i++) {
- obj.options[i].selected = true;
- }
- }
-
- // -------------------------------------------------------------------
- // moveSelectedOptions(select_object,select_object[,autosort(true/false)[,regex]])
- // This function moves options between select boxes. Works best with
- // multi-select boxes to create the common Windows control effect.
- // Passes all selected values from the first object to the second
- // object and re-sorts each box.
- // If a third argument of 'false' is passed, then the lists are not
- // sorted after the move.
- // If a fourth string argument is passed, this will function as a
- // Regular Expression to match against the TEXT or the options. If
- // the text of an option matches the pattern, it will NOT be moved.
- // It will be treated as an unmoveable option.
- // You can also put this into the <SELECT> object as follows:
- // onDblClick="moveSelectedOptions(this,this.form.target)
- // This way, when the user double-clicks on a value in one box, it
- // will be transferred to the other (in browsers that support the
- // onDblClick() event handler).
- // -------------------------------------------------------------------
- function moveSelectedOptions(from,to) {
- // Unselect matching options, if required
- if (arguments.length>3) {
- var regex = arguments[3];
- if (regex != "") {
- unSelectMatchingOptions(from,regex);
- }
- }
- // Move them over
- for (var i=0; i<from.options.length; i++) {
- var o = from.options[i];
- if (o.selected) {
- to.options[to.options.length] = new Option( o.text, o.value, false, false);
- }
- }
- // Delete them from original
- for (var i=(from.options.length-1); i>=0; i--) {
- var o = from.options[i];
- if (o.selected) {
- from.options[i] = null;
- }
- }
- if ((arguments.length<3) || (arguments[2]==true)) {
- sortSelect(from);
- sortSelect(to);
- }
- from.selectedIndex = -1;
- to.selectedIndex = -1;
- }
-
- // -------------------------------------------------------------------
- // copySelectedOptions(select_object,select_object[,autosort(true/false)])
- // This function copies options between select boxes instead of
- // moving items. Duplicates in the target list are not allowed.
- // -------------------------------------------------------------------
- function copySelectedOptions(from,to) {
- var options = new Object();
- for (var i=0; i<to.options.length; i++) {
- options[to.options[i].value] = to.options[i].text;
- }
- for (var i=0; i<from.options.length; i++) {
- var o = from.options[i];
- if (o.selected) {
- if (options[o.value] == null || options[o.value] == "undefined" || options[o.value]!=o.text) {
- to.options[to.options.length] = new Option( o.text, o.value, false, false);
- }
- }
- }
- if ((arguments.length<3) || (arguments[2]==true)) {
- sortSelect(to);
- }
- from.selectedIndex = -1;
- to.selectedIndex = -1;
- }
-
- // -------------------------------------------------------------------
- // moveAllOptions(select_object,select_object[,autosort(true/false)[,regex]])
- // Move all options from one select box to another.
- // -------------------------------------------------------------------
- function moveAllOptions(from,to) {
- selectAllOptions(from);
- if (arguments.length==2) {
- moveSelectedOptions(from,to);
- }
- else if (arguments.length==3) {
- moveSelectedOptions(from,to,arguments[2]);
- }
- else if (arguments.length==4) {
- moveSelectedOptions(from,to,arguments[2],arguments[3]);
- }
- }
-
- // -------------------------------------------------------------------
- // copyAllOptions(select_object,select_object[,autosort(true/false)])
- // Copy all options from one select box to another, instead of
- // removing items. Duplicates in the target list are not allowed.
- // -------------------------------------------------------------------
- function copyAllOptions(from,to) {
- selectAllOptions(from);
- if (arguments.length==2) {
- copySelectedOptions(from,to);
- }
- else if (arguments.length==3) {
- copySelectedOptions(from,to,arguments[2]);
- }
- }
-
- // -------------------------------------------------------------------
- // swapOptions(select_object,option1,option2)
- // Swap positions of two options in a select list
- // -------------------------------------------------------------------
- function swapOptions(obj,i,j) {
- var o = obj.options;
- var i_selected = o[i].selected;
- var j_selected = o[j].selected;
- var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
- var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
- o[i] = temp2;
- o[j] = temp;
- o[i].selected = j_selected;
- o[j].selected = i_selected;
- }
-
- // -------------------------------------------------------------------
- // moveOptionUp(select_object)
- // Move selected option in a select list up one
- // -------------------------------------------------------------------
- function moveOptionUp(obj) {
- for (i=0; i<obj.options.length; i++) {
- if (obj.options[i].selected) {
- if (i != 0 && !obj.options[i-1].selected) {
- swapOptions(obj,i,i-1);
- obj.options[i-1].selected = true;
- }
- }
- }
- }
-
- // -------------------------------------------------------------------
- // moveOptionDown(select_object)
- // Move selected option in a select list down one
- // -------------------------------------------------------------------
- function moveOptionDown(obj) {
- for (i=obj.options.length-1; i>=0; i--) {
- if (obj.options[i].selected) {
- if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
- swapOptions(obj,i,i+1);
- obj.options[i+1].selected = true;
- }
- }
- }
- }
-
- // -------------------------------------------------------------------
- // removeSelectedOptions(select_object)
- // Remove all selected options from a list
- // (Thanks to Gene Ninestein)
- // -------------------------------------------------------------------
- function removeSelectedOptions(from) {
- for (var i=(from.options.length-1); i>=0; i--) {
- var o=from.options[i];
- if (o.selected) {
- from.options[i] = null;
- }
- }
- from.selectedIndex = -1;
- }
-
- // -------------------------------------------------------------------
- // removeAllOptions(select_object)
- // Remove all options from a list
- // -------------------------------------------------------------------
- function removeAllOptions(from) {
- for (var i=(from.options.length-1); i>=0; i--) {
- from.options[i] = null;
- }
- from.selectedIndex = -1;
- }
-
- // -------------------------------------------------------------------
- // addOption(select_object,display_text,value,selected)
- // Add an option to a list
- // -------------------------------------------------------------------
- function addOption(obj,text,value,selected) {
- if (obj!=null && obj.options!=null) {
- obj.options[obj.options.length] = new Option(text, value, false, selected);
- }
- }
-
-