/*
 *
 * 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.4
 * Demo: http://www.texotela.co.uk/code/jquery/select/
 *
 * $LastChangedDate: 2008-06-17 17:27:25 +0100 (Tue, 17 Jun 2008) $
 * $Rev: 5727 $
 *
 */
;
(function(h) {
    h.fn.addOption = function() {
        var j = function(a, f, c, g) {
            var d = document.createElement("option");
            d.value = f,d.text = c;
            var b = a.options;
            var e = b.length;
            if (!a.cache) {
                a.cache = {};
                for (var i = 0; i < e; i++) {
                    a.cache[b[i].value] = i
                }
            }
            if (typeof a.cache[f] == "undefined")a.cache[f] = e;
            a.options[a.cache[f]] = d;
            if (g) {
                d.selected = true
            }
        };
        var k = arguments;
        if (k.length == 0)return this;
        var l = true;
        var m = false;
        var n,o,p;
        if (typeof(k[0]) == "object") {
            m = true;
            n = k[0]
        }
        if (k.length >= 2) {
            if (typeof(k[1]) == "boolean")l = k[1]; else if (typeof(k[2]) == "boolean")l = k[2];
            if (!m) {
                o = k[0];
                p = k[1]
            }
        }
        this.each(function() {
            if (this.nodeName.toLowerCase() != "select")return;
            if (m) {
                for (var a in n) {
                    j(this, a, n[a], l)
                }
            } else {
                j(this, o, p, l)
            }
        });
        return this
    };
    h.fn.ajaxAddOption = function(c, g, d, b, e) {
        if (typeof(c) != "string")return this;
        if (typeof(g) != "object")g = {};
        if (typeof(d) != "boolean")d = true;
        this.each(function() {
            var f = this;
            h.getJSON(c, g, function(a) {
                h(f).addOption(a, d);
                if (typeof b == "function") {
                    if (typeof e == "object") {
                        b.apply(f, e)
                    } else {
                        b.call(f)
                    }
                }
            })
        });
        return this
    };
    h.fn.removeOption = function() {
        var d = arguments;
        if (d.length == 0)return this;
        var b = typeof(d[0]);
        var e,i;
        if (b == "string" || b == "object" || b == "function") {
            e = d[0];
            if (e.constructor == Array) {
                var j = e.length;
                for (var k = 0; k < j; k++) {
                    this.removeOption(e[k], d[1])
                }
                return this
            }
        } else if (b == "number")i = d[0]; else return this;
        this.each(function() {
            if (this.nodeName.toLowerCase() != "select")return;
            if (this.cache)this.cache = null;
            var a = false;
            var f = this.options;
            if (!!e) {
                var c = f.length;
                for (var g = c - 1; g >= 0; g--) {
                    if (e.constructor == RegExp) {
                        if (f[g].value.match(e)) {
                            a = true
                        }
                    } else if (f[g].value == e) {
                        a = true
                    }
                    if (a && d[1] === true)a = f[g].selected;
                    if (a) {
                        f[g] = null
                    }
                    a = false
                }
            } else {
                if (d[1] === true) {
                    a = f[i].selected
                } else {
                    a = true
                }
                if (a) {
                    this.remove(i)
                }
            }
        });
        return this
    };
    h.fn.sortOptions = function(e) {
        var i = h(this).selectedValues();
        var j = typeof(e) == "undefined" ? true : !!e;
        this.each(function() {
            if (this.nodeName.toLowerCase() != "select")return;
            var c = this.options;
            var g = c.length;
            var d = [];
            for (var b = 0; b < g; b++) {
                d[b] = {v:c[b].value,t:c[b].text}
            }
            d.sort(function(a, f) {
                o1t = a.t.toLowerCase(),o2t = f.t.toLowerCase();
                if (o1t == o2t)return 0;
                if (j) {
                    return o1t < o2t ? -1 : 1
                } else {
                    return o1t > o2t ? -1 : 1
                }
            });
            for (var b = 0; b < g; b++) {
                c[b].text = d[b].t;
                c[b].value = d[b].v
            }
        }).selectOptions(i, true);
        return this
    };
    h.fn.selectOptions = function(g, d) {
        var b = g;
        var e = typeof(g);
        if (e == "object" && b.constructor == Array) {
            var i = this;
            h.each(b, function() {
                i.selectOptions(this, d)
            })
        }
        ;
        var j = d || false;
        if (e != "string" && e != "function" && e != "object")return this;
        this.each(function() {
            if (this.nodeName.toLowerCase() != "select")return this;
            var a = this.options;
            var f = a.length;
            for (var c = 0; c < f; c++) {
                if (b.constructor == RegExp) {
                    if (a[c].value.match(b)) {
                        a[c].selected = true
                    } else if (j) {
                        a[c].selected = false
                    }
                } else {
                    if (a[c].value == b) {
                        a[c].selected = true
                    } else if (j) {
                        a[c].selected = false
                    }
                }
            }
        });
        return this
    };
    h.fn.copyOptions = function(g, d) {
        var b = d || "selected";
        if (h(g).size() == 0)return this;
        this.each(function() {
            if (this.nodeName.toLowerCase() != "select")return this;
            var a = this.options;
            var f = a.length;
            for (var c = 0; c < f; c++) {
                if (b == "all" || (b == "selected" && a[c].selected)) {
                    h(g).addOption(a[c].value, a[c].text)
                }
            }
        });
        return this
    };
    h.fn.containsOption = function(g, d) {
        var b = false;
        var e = g;
        var i = typeof(e);
        var j = typeof(d);
        if (i != "string" && i != "function" && i != "object")return j == "function" ? this : b;
        this.each(function() {
            if (this.nodeName.toLowerCase() != "select")return this;
            if (b && j != "function")return false;
            var a = this.options;
            var f = a.length;
            for (var c = 0; c < f; c++) {
                if (e.constructor == RegExp) {
                    if (a[c].value.match(e)) {
                        b = true;
                        if (j == "function")d.call(a[c], c)
                    }
                } else {
                    if (a[c].value == e) {
                        b = true;
                        if (j == "function")d.call(a[c], c)
                    }
                }
            }
        });
        return j == "function" ? this : b
    };
    h.fn.selectedValues = function() {
        var a = [];
        this.selectedOptions().each(function() {
            a[a.length] = this.value
        });
        return a
    };
    h.fn.selectedTexts = function() {
        var a = [];
        this.selectedOptions().each(function() {
            a[a.length] = this.text
        });
        return a
    };
    h.fn.selectedOptions = function() {
        return this.find("option:selected")
    }
})(jQuery);
