/*
*
* Copyright (c) 2006-2008 Sam Collett (http://www.texotela.co.uk)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Version 2.2.3
* Demo: http://www.texotela.co.uk/code/jquery/select/
*
* $LastChangedDate: 2008-06-17 17:27:25 +0100 (Tue, 17 Jun 2008) $
* $Rev: 5727 $
*
*/
;(function($) {
/**
* Adds (single/multiple) options to a select box (or series of select boxes)
*
* @name addOption
* @author Sam Collett (http://www.texotela.co.uk)
* @type jQuery
* @example $("#myselect").addOption("Value", "Text"); // add single value (will be selected)
* @example $("#myselect").addOption("Value 2", "Text 2", false); // add single value (won't be selected)
* @example $("#myselect").addOption({"foo":"bar","bar":"baz"}, false); // add multiple values, but don't select
*
*/
$.fn.addOption = function()
{
var add = function(el, v, t, sO)
{
var option = document.createElement("option");
option.value = v, option.text = t;
// get options
var o = el.options;
// get number of options
var oL = o.length;
if(!el.cache)
{
el.cache = {};
// loop through existing options, adding to cache
for(var i = 0; i < oL; i++)
{
el.cache[o[i].value] = i;
}
}
// add to cache if it isn't already
if(typeof el.cache[v] == "undefined") el.cache[v] = oL;
el.options[el.cache[v]] = option;
if(sO)
{
option.selected = true;
}
};
var a = arguments;
if(a.length == 0) return this;
// select option when added? default is true
var sO = true;
// multiple items
var m = false;
// other variables
var items, v, t;
if(typeof(a[0]) == "object")
{
m = true;
items = a[0];
}
if(a.length >= 2)
{
if(typeof(a[1]) == "boolean") sO = a[1];
else if(typeof(a[2]) == "boolean") sO = a[2];
if(!m)
{
v = a[0];
t = a[1];
}
}
this.each(
function()
{
if(this.nodeName.toLowerCase() != "select") return;
if(m)
{
for(var item in items)
{
add(this, item, items[item], sO);
}
}
else
{
add(this, v, t, sO);
}
}
);
return this;
};
/**
* Add options via ajax
*
* @name ajaxAddOption
* @author Sam Collett (http://www.texotela.co.uk)
* @type jQuery
* @param String url Page to get options from (must be valid JSON)
* @param Object params (optional) Any parameters to send with the request
* @param Boolean select (optional) Select the added options, default true
* @param Function fn (optional) Call this function with the select object as param after completion
* @param Array args (optional) Array with params to pass to the function afterwards
* @example $("#myselect").ajaxAddOption("myoptions.php");
* @example $("#myselect").ajaxAddOption("myoptions.php", {"code" : "007"});
* @example $("#myselect").ajaxAddOption("myoptions.php", {"code" : "007"}, false, sortoptions, [{"dir": "desc"}]);
*
*/
$.fn.ajaxAddOption = function(url, params, select, fn, args)
{
if(typeof(url) != "string") return this;
if(typeof(params) != "object") params = {};
if(typeof(select) != "boolean") select = true;
this.each(
function()
{
var el = this;
$.getJSON(url,
params,
function(r)
{
$(el).addOption(r, select);
if(typeof fn == "function")
{
if(typeof args == "object")
{
fn.apply(el, args);
}
else
{
fn.call(el);
}
}
}
);
}
);
return this;
};
/**
* Removes an option (by value or index) from a select box (or series of select boxes)
*
* @name removeOption
* @author Sam Collett (http://www.texotela.co.uk)
* @type jQuery
* @param String|RegExp|Number what Option to remove
* @param Boolean selectedOnly (optional) Remove only if it has been selected (default false)
* @example $("#myselect").removeOption("Value"); // remove by value
* @example $("#myselect").removeOption(/^val/i); // remove options with a value starting with 'val'
* @example $("#myselect").removeOption(/./); // remove all options
* @example $("#myselect").removeOption(/./, true); // remove all options that have been selected
* @example $("#myselect").removeOption(0); // remove by index
* @example $("#myselect").removeOption(["myselect_1","myselect_2"]); // values contained in passed array
*
*/
$.fn.removeOption = function()
{
var a = arguments;
if(a.length == 0) return this;
var ta = typeof(a[0]);
var v, index;
// has to be a string or regular expression (object in IE, function in Firefox)
if(ta == "string" || ta == "object" || ta == "function" )
{
v = a[0];
// if an array, remove items
if(v.constructor == Array)
{
var l = v.length;
for(var i = 0; i=0; i--)
{
if(v.constructor == RegExp)
{
if(o[i].value.match(v))
{
remove = true;
}
}
else if(o[i].value == v)
{
remove = true;
}
// if the option is only to be removed if selected
if(remove && a[1] === true) remove = o[i].selected;
if(remove)
{
o[i] = null;
}
remove = false;
}
}
else
{
// only remove if selected?
if(a[1] === true)
{
remove = o[index].selected;
}
else
{
remove = true;
}
if(remove)
{
this.remove(index);
}
}
}
);
return this;
};
/**
* Sort options (ascending or descending) in a select box (or series of select boxes)
*
* @name sortOptions
* @author Sam Collett (http://www.texotela.co.uk)
* @type jQuery
* @param Boolean ascending (optional) Sort ascending (true/undefined), or descending (false)
* @example // ascending
* $("#myselect").sortOptions(); // or $("#myselect").sortOptions(true);
* @example // descending
* $("#myselect").sortOptions(false);
*
*/
$.fn.sortOptions = function(ascending)
{
var a = typeof(ascending) == "undefined" ? true : !!ascending;
this.each(
function()
{
if(this.nodeName.toLowerCase() != "select") return;
// get options
var o = this.options;
// get number of options
var oL = o.length;
// create an array for sorting
var sA = [];
// loop through options, adding to sort array
for(var i = 0; i o2t ? -1 : 1;
}
}
);
// change the options to match the sort array
for(var i = 0; i