首页 > 代码库 > 代码阅读_chosen.js

代码阅读_chosen.js

1:调用方式

 <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/css/beautyform.css" /> <script type="text/javascript" src="http://www.mamicode.com/js/jquery-1.8.min.js"></script> <script type="text/javascript" src="http://www.mamicode.com/js/beautyform.js"></script>

2:使用方法(测试:IE6,IE7,IE9不支持,为什么IE8支持?)

  <div>                <select style=" width: 100px;">                    <option>选择1</option>                    <option selected="selected">选择2</option>                    <option>选择3</option>                    <option>选择4</option>                </select>                <select class="chosen" style=" width: 150px;">                    <option>选择1</option>                    <option >选择2</option>                    <option>选择3</option>                    <option>选择4</option>                </select>                <select class="chosen" multiple="multiple" style=" width: 150px;">                    <option>选择1</option>                    <option selected="selected">选择2</option>                    <option>选择3</option>                    <option>选择4</option>                </select>            </div>

<script type="text/javascript">
  $(document).ready(function(){
    $(".chosen").chosen();

    $(".chosen").data("placeholder","select Frameworks......").chosen();//没有起效果
  });
</script>

 3:源码解析

3.1:大致分为4部分

(function ($, undef) {    "use strict";    /**     * Use .prop() if jQuery supports it, otherwise fall back to .attr() 否则退回到attr     *     * @param jQuery $el jQuery‘d element on which we‘re calling attr/prop     * @param ... All other parameters are passed to jQuery‘s function     * @return The result from jQuery     */    function attrOrProp($el) {        var args = Array.prototype.slice.call(arguments, 1);        if ($el.prop) {            // jQuery 1.6+            return $el.prop.apply($el, args); // jQuery 1.6+        }        // jQuery 1.5 and below        return $el.attr.apply($el, args);    }    /**     * For backwards compatibility with older jQuery libraries, only bind     * one thing at a time.  Also, this function adds our namespace to     * events in one consistent location, shrinking the minified code.     *     * The properties on the events object are the names of the events     * that we are supposed to add to.  It can be a space separated list.     * The namespace will be added automatically.     *     * @param jQuery $el     * @param Object options Uniform options for this element     * @param Object events Events to bind, properties are event names     */    function bindMany($el, options, events) {        var name, namespaced;        for (name in events) {            if (events.hasOwnProperty(name)) {                namespaced = name.replace(/ |$/g, options.eventNamespace);                $el.bind(namespaced, events[name]);            }        }    }    /**     * Bind the hover, active, focus, and blur UI updates     *     * @param jQuery $el Original element     * @param jQuery $target Target for the events (our div/span)     * @param Object options Uniform options for the element $target     */    function bindUi($el, $target, options) {        bindMany($el, options, {            focus: function () {                $target.addClass(options.focusClass);            },            blur: function () {                $target.removeClass(options.focusClass);                $target.removeClass(options.activeClass);            },            mouseenter: function () {                $target.addClass(options.hoverClass);            },            mouseleave: function () {                $target.removeClass(options.hoverClass);                $target.removeClass(options.activeClass);            },            "mousedown touchbegin": function () {                if (!$el.is(":disabled")) {                    $target.addClass(options.activeClass);                }            },            "mouseup touchend": function () {                $target.removeClass(options.activeClass);            }        });    }    /**     * Remove the hover, focus, active classes.     *     * @param jQuery $el Element with classes     * @param Object options Uniform options for the element     */    function classClearStandard($el, options) {        $el.removeClass(options.hoverClass + " " + options.focusClass + " " + options.activeClass);    }    /**     * Add or remove a class, depending on if it‘s "enabled"     *     * @param jQuery $el Element that has the class added/removed     * @param String className Class or classes to add/remove     * @param Boolean enabled True to add the class, false to remove     */    function classUpdate($el, className, enabled) {        if (enabled) {            $el.addClass(className);        } else {            $el.removeClass(className);        }    }    /**     * Updating the "checked" property can be a little tricky.  This     * changed in jQuery 1.6 and now we can pass booleans to .prop().     * Prior to that, one either adds an attribute ("checked=checked") or     * removes the attribute.     *     * @param jQuery $tag Our Uniform span/div     * @param jQuery $el Original form element     * @param Object options Uniform options for this element     */    function classUpdateChecked($tag, $el, options) {        var c = "checked",            isChecked = $el.is(":" + c);        if ($el.prop) {            // jQuery 1.6+            $el.prop(c, isChecked);        } else {            // jQuery 1.5 and below            if (isChecked) {                $el.attr(c, c);            } else {                $el.removeAttr(c);            }        }        classUpdate($tag, options.checkedClass, isChecked);    }    /**     * Set or remove the "disabled" class for disabled elements, based on     * if the     *     * @param jQuery $tag Our Uniform span/div     * @param jQuery $el Original form element     * @param Object options Uniform options for this element     */    function classUpdateDisabled($tag, $el, options) {        classUpdate($tag, options.disabledClass, $el.is(":disabled"));    }    /**     * Wrap an element inside of a container or put the container next     * to the element.  See the code for examples of the different methods.     *     * Returns the container that was added to the HTML.     *     * @param jQuery $el Element to wrap     * @param jQuery $container Add this new container around/near $el     * @param String method One of "after", "before" or "wrap"     * @return $container after it has been cloned for adding to $el     */    function divSpanWrap($el, $container, method) {        switch (method) {        case "after":            // Result:  <element /> <container />            $el.after($container);            return $el.next();        case "before":            // Result:  <container /> <element />            $el.before($container);            return $el.prev();        case "wrap":            // Result:  <container> <element /> </container>            $el.wrap($container);            return $el.parent();        }        return null;    }    /**     * Create a div/span combo for uniforming an element     *     * @param jQuery $el Element to wrap     * @param Object options Options for the element, set by the user     * @param Object divSpanConfig Options for how we wrap the div/span     * @return Object Contains the div and span as properties     */    function divSpan($el, options, divSpanConfig) {        var $div, $span, id;        if (!divSpanConfig) {            divSpanConfig = {};        }        divSpanConfig = $.extend({            bind: {},            divClass: null,            divWrap: "wrap",            spanClass: null,            spanHtml: null,            spanWrap: "wrap"        }, divSpanConfig);        $div = $(‘<div />‘);        $span = $(‘<span />‘);        // Automatically hide this div/span if the element is hidden.        // Do not hide if the element is hidden because a parent is hidden.        if (options.autoHide && $el.is(‘:hidden‘) && $el.css(‘display‘) === ‘none‘) {            $div.hide();        }        if (divSpanConfig.divClass) {            $div.addClass(divSpanConfig.divClass);        }        if (options.wrapperClass) {            $div.addClass(options.wrapperClass);        }        if (divSpanConfig.spanClass) {            $span.addClass(divSpanConfig.spanClass);        }        id = attrOrProp($el, ‘id‘);        if (options.useID && id) {            attrOrProp($div, ‘id‘, options.idPrefix + ‘-‘ + id);        }        if (divSpanConfig.spanHtml) {            $span.html(divSpanConfig.spanHtml);        }        $div = divSpanWrap($el, $div, divSpanConfig.divWrap);        $span = divSpanWrap($el, $span, divSpanConfig.spanWrap);        classUpdateDisabled($div, $el, options);        return {            div: $div,            span: $span        };    }    /**     * Wrap an element with a span to apply a global wrapper class     *     * @param jQuery $el Element to wrap     * @param object options     * @return jQuery Wrapper element     */    function wrapWithWrapperClass($el, options) {        var $span;        if (!options.wrapperClass) {            return null;        }        $span = $(‘<span />‘).addClass(options.wrapperClass);        $span = divSpanWrap($el, $span, "wrap");        return $span;    }    /**     * Test if high contrast mode is enabled.     *     * In high contrast mode, background images can not be set and     * they are always returned as ‘none‘.     *     * @return boolean True if in high contrast mode     */    function highContrast() {        var c, $div, el, rgb;        // High contrast mode deals with white and black        rgb = ‘rgb(120,2,153)‘;        $div = $(‘<div style="width:0;height:0;color:‘ + rgb + ‘">‘);        $(‘body‘).append($div);        el = $div.get(0);        // $div.css() will get the style definition, not        // the actually displaying style        if (window.getComputedStyle) {            c = window.getComputedStyle(el, ‘‘).color;        } else {            c = (el.currentStyle || el.style || {}).color;        }        $div.remove();        return c.replace(/ /g, ‘‘) !== rgb;    }    /**     * Change text into safe HTML     *     * @param String text     * @return String HTML version     */    function htmlify(text) {        if (!text) {            return "";        }        return $(‘<span />‘).text(text).html();    }    /**     * If not MSIE, return false.     * If it is, return the version number.     *     * @return false|number     */    function isMsie() {        return navigator.cpuClass && !navigator.product;    }    /**     * Return true if this version of IE allows styling     *     * @return boolean     */    function isMsieSevenOrNewer() {        if (typeof window.XMLHttpRequest !== ‘undefined‘) {            return true;        }        return false;    }    /**     * Test if the element is a multiselect     *     * @param jQuery $el Element     * @return boolean true/false     */    function isMultiselect($el) {        var elSize;        if ($el[0].multiple) {            return true;        }        elSize = attrOrProp($el, "size");        if (!elSize || elSize <= 1) {            return false;        }        return true;    }    /**     * Meaningless utility function.  Used mostly for improving minification.     *     * @return false     */    function returnFalse() {        return false;    }    /**     * noSelect plugin, very slightly modified     * http://mths.be/noselect v1.0.3     *     * @param jQuery $elem Element that we don‘t want to select     * @param Object options Uniform options for the element     */    function noSelect($elem, options) {        var none = ‘none‘;        bindMany($elem, options, {            ‘selectstart dragstart mousedown‘: returnFalse        });        $elem.css({            MozUserSelect: none,            msUserSelect: none,            webkitUserSelect: none,            userSelect: none        });    }    /**     * Updates the filename tag based on the value of the real input     * element.     *     * @param jQuery $el Actual form element     * @param jQuery $filenameTag Span/div to update     * @param Object options Uniform options for this element     */    function setFilename($el, $filenameTag, options) {        var filename = $el.val();        if (filename === "") {            filename = options.fileDefaultHtml;        } else {            filename = filename.split(/[\/\\]+/);            filename = filename[(filename.length - 1)];        }        $filenameTag.text(filename);    }    /**     * Function from jQuery to swap some CSS values, run a callback,     * then restore the CSS.  Modified to pass JSLint and handle undefined     * values with ‘use strict‘.     *     * @param jQuery $el Element     * @param object newCss CSS values to swap out     * @param Function callback Function to run     */    function swap($elements, newCss, callback) {        var restore, item;        restore = [];        $elements.each(function () {            var name;            for (name in newCss) {                if (Object.prototype.hasOwnProperty.call(newCss, name)) {                    restore.push({                        el: this,                        name: name,                        old: this.style[name]                    });                    this.style[name] = newCss[name];                }            }        });        callback();        while (restore.length) {            item = restore.pop();            item.el.style[item.name] = item.old;        }    }    /**     * The browser doesn‘t provide sizes of elements that are not visible.     * This will clone an element and add it to the DOM for calculations.     *     * @param jQuery $el     * @param String method     */    function sizingInvisible($el, callback) {        var targets;        // We wish to target ourselves and any parents as long as        // they are not visible        targets = $el.parents();        targets.push($el[0]);        targets = targets.not(‘:visible‘);        swap(targets, {            visibility: "hidden",            display: "block",            position: "absolute"        }, callback);    }    /**     * Standard way to unwrap the div/span combination from an element     *     * @param jQuery $el Element that we wish to preserve     * @param Object options Uniform options for the element     * @return Function This generated function will perform the given work     */    function unwrapUnwrapUnbindFunction($el, options) {        return function () {            $el.unwrap().unwrap().unbind(options.eventNamespace);        };    }    var allowStyling = true,  // False if IE6 or other unsupported browsers        highContrastTest = false,  // Was the high contrast test ran?        uniformHandlers = [  // Objects that take care of "unification"            {                // Buttons                match: function ($el) {                    return $el.is("a, button, :submit, :reset, input[type=‘button‘]");                },                apply: function ($el, options) {                    var $div, defaultSpanHtml, ds, getHtml, doingClickEvent;                    defaultSpanHtml = options.submitDefaultHtml;                    if ($el.is(":reset")) {                        defaultSpanHtml = options.resetDefaultHtml;                    }                    if ($el.is("a, button")) {                        // Use the HTML inside the tag                        getHtml = function () {                            return $el.html() || defaultSpanHtml;                        };                    } else {                        // Use the value property of the element                        getHtml = function () {                            return htmlify(attrOrProp($el, "value")) || defaultSpanHtml;                        };                    }                    ds = divSpan($el, options, {                        divClass: options.buttonClass,                        spanHtml: getHtml()                    });                    $div = ds.div;                    bindUi($el, $div, options);                    doingClickEvent = false;                    bindMany($div, options, {                        "click touchend": function () {                            var ev, res, target, href;                            if (doingClickEvent) {                                return;                            }                            if ($el.is(‘:disabled‘)) {                                return;                            }                            doingClickEvent = true;                            if ($el[0].dispatchEvent) {                                ev = document.createEvent("MouseEvents");                                ev.initEvent("click", true, true);                                res = $el[0].dispatchEvent(ev);                                if ($el.is(‘a‘) && res) {                                    target = attrOrProp($el, ‘target‘);                                    href = attrOrProp($el, ‘href‘);                                    if (!target || target === ‘_self‘) {                                        document.location.href = href;                                    } else {                                        window.open(href, target);                                    }                                }                            } else {                                $el.click();                            }                            doingClickEvent = false;                        }                    });                    noSelect($div, options);                    return {                        remove: function () {                            // Move $el out                            $div.after($el);                            // Remove div and span                            $div.remove();                            // Unbind events                            $el.unbind(options.eventNamespace);                            return $el;                        },                        update: function () {                            classClearStandard($div, options);                            classUpdateDisabled($div, $el, options);                            $el.detach();                            ds.span.html(getHtml()).append($el);                        }                    };                }            },            {                // Checkboxes                match: function ($el) {                    return $el.is(":checkbox");                },                apply: function ($el, options) {                    var ds, $div, $span;                    ds = divSpan($el, options, {                        divClass: options.checkboxClass                    });                    $div = ds.div;                    $span = ds.span;                    // Add focus classes, toggling, active, etc.                    bindUi($el, $div, options);                    bindMany($el, options, {                        "click touchend": function () {                            classUpdateChecked($span, $el, options);                        }                    });                    classUpdateChecked($span, $el, options);                    return {                        remove: unwrapUnwrapUnbindFunction($el, options),                        update: function () {                            classClearStandard($div, options);                            $span.removeClass(options.checkedClass);                            classUpdateChecked($span, $el, options);                            classUpdateDisabled($div, $el, options);                        }                    };                }            },            {                // File selection / uploads                match: function ($el) {                    return $el.is(":file");                },                apply: function ($el, options) {                    var ds, $div, $filename, $button;                    // The "span" is the button                    ds = divSpan($el, options, {                        divClass: options.fileClass,                        spanClass: options.fileButtonClass,                        spanHtml: options.fileButtonHtml,                        spanWrap: "after"                    });                    $div = ds.div;                    $button = ds.span;                    $filename = $("<span />").html(options.fileDefaultHtml);                    $filename.addClass(options.filenameClass);                    $filename = divSpanWrap($el, $filename, "after");                    // Set the size                    if (!attrOrProp($el, "size")) {                        attrOrProp($el, "size", $div.width() / 10);                    }                    // Actions                    function filenameUpdate() {                        setFilename($el, $filename, options);                    }                    bindUi($el, $div, options);                    // Account for input saved across refreshes                    filenameUpdate();                    // IE7 doesn‘t fire onChange until blur or second fire.                    if (isMsie()) {                        // IE considers browser chrome blocking I/O, so it                        // suspends tiemouts until after the file has                        // been selected.                        bindMany($el, options, {                            click: function () {                                $el.trigger("change");                                setTimeout(filenameUpdate, 0);                            }                        });                    } else {                        // All other browsers behave properly                        bindMany($el, options, {                            change: filenameUpdate                        });                    }                    noSelect($filename, options);                    noSelect($button, options);                    return {                        remove: function () {                            // Remove filename and button                            $filename.remove();                            $button.remove();                            // Unwrap parent div, remove events                            return $el.unwrap().unbind(options.eventNamespace);                        },                        update: function () {                            classClearStandard($div, options);                            setFilename($el, $filename, options);                            classUpdateDisabled($div, $el, options);                        }                    };                }            },            {                // Input fields (text)                match: function ($el) {                    if ($el.is("input")) {                        var t = (" " + attrOrProp($el, "type") + " ").toLowerCase(),                            allowed = " color date datetime datetime-local email month number password search tel text time url week ";                        return allowed.indexOf(t) >= 0;                    }                    return false;                },                apply: function ($el, options) {                    var elType, $wrapper;                    elType = attrOrProp($el, "type");                    $el.addClass(options.inputClass);                    $wrapper = wrapWithWrapperClass($el, options);                    bindUi($el, $el, options);                    if (options.inputAddTypeAsClass) {                        $el.addClass(elType);                    }                    return {                        remove: function () {                            $el.removeClass(options.inputClass);                            if (options.inputAddTypeAsClass) {                                $el.removeClass(elType);                            }                            if ($wrapper) {                                $el.unwrap();                            }                        },                        update: returnFalse                    };                }            },            {                // Radio buttons                match: function ($el) {                    return $el.is(":radio");                },                apply: function ($el, options) {                    var ds, $div, $span;                    ds = divSpan($el, options, {                        divClass: options.radioClass                    });                    $div = ds.div;                    $span = ds.span;                    // Add classes for focus, handle active, checked                    bindUi($el, $div, options);                    bindMany($el, options, {                        "click touchend": function () {                            // Find all radios with the same name, then update                            // them with $.uniform.update() so the right                            // per-element options are used                            $.uniform.update($(‘:radio[name="‘ + attrOrProp($el, "name") + ‘"]‘));                        }                    });                    classUpdateChecked($span, $el, options);                    return {                        remove: unwrapUnwrapUnbindFunction($el, options),                        update: function () {                            classClearStandard($div, options);                            classUpdateChecked($span, $el, options);                            classUpdateDisabled($div, $el, options);                        }                    };                }            },            {                // Select lists, but do not style multiselects here                match: function ($el) {                    if ($el.is("select") && !isMultiselect($el)) {                        return true;                    }                    return false;                },                apply: function ($el, options) {                    var ds, $div, $span, origElemWidth;                    if (options.selectAutoWidth) {                        sizingInvisible($el, function () {                            origElemWidth = $el.width();                        });                    }                    ds = divSpan($el, options, {                        divClass: options.selectClass,                        spanHtml: ($el.find(":selected:first") || $el.find("option:first")).html(),                        spanWrap: "before"                    });                    $div = ds.div;                    $span = ds.span;                    if (options.selectAutoWidth) {                        // Use the width of the select and adjust the                        // span and div accordingly                        sizingInvisible($el, function () {                            // Force "display: block" - related to bug #287                            swap($([ $span[0], $div[0] ]), {                                display: "block"                            }, function () {                                var spanPad;                                spanPad = $span.outerWidth() - $span.width();                                $div.width(origElemWidth + spanPad);                                $span.width(origElemWidth);                            });                        });                    } else {                        // Force the select to fill the size of the div                        $div.addClass(‘fixedWidth‘);                    }                    // Take care of events                    bindUi($el, $div, options);                    bindMany($el, options, {                        change: function () {                            $span.html($el.find(":selected").html());                            $div.removeClass(options.activeClass);                        },                        "click touchend": function () {                            // IE7 and IE8 may not update the value right                            // until after click event - issue #238                            var selHtml = $el.find(":selected").html();                            if ($span.html() !== selHtml) {                                // Change was detected                                // Fire the change event on the select tag                                $el.trigger(‘change‘);                            }                        },                        keyup: function () {                            $span.html($el.find(":selected").html());                        }                    });                    noSelect($span, options);                    return {                        remove: function () {                            // Remove sibling span                            $span.remove();                            // Unwrap parent div                            $el.unwrap().unbind(options.eventNamespace);                            return $el;                        },                        update: function () {                            if (options.selectAutoWidth) {                                // Easier to remove and reapply formatting                                $.uniform.restore($el);                                $el.uniform(options);                            } else {                                classClearStandard($div, options);                                // Reset current selected text                                $span.html($el.find(":selected").html());                                classUpdateDisabled($div, $el, options);                            }                        }                    };                }            },            {                // Select lists - multiselect lists only                match: function ($el) {                    if ($el.is("select") && isMultiselect($el)) {                        return true;                    }                    return false;                },                apply: function ($el, options) {                    var $wrapper;                    $el.addClass(options.selectMultiClass);                    $wrapper = wrapWithWrapperClass($el, options);                    bindUi($el, $el, options);                    return {                        remove: function () {                            $el.removeClass(options.selectMultiClass);                            if ($wrapper) {                                $el.unwrap();                            }                        },                        update: returnFalse                    };                }            },            {                // Textareas                match: function ($el) {                    return $el.is("textarea");                },                apply: function ($el, options) {                    var $wrapper;                    $el.addClass(options.textareaClass);                    $wrapper = wrapWithWrapperClass($el, options);                    bindUi($el, $el, options);                    return {                        remove: function () {                            $el.removeClass(options.textareaClass);                            if ($wrapper) {                                $el.unwrap();                            }                        },                        update: returnFalse                    };                }            }        ];    // IE6 can‘t be styled - can‘t set opacity on select    if (isMsie() && !isMsieSevenOrNewer()) {        allowStyling = false;    }    $.uniform = {        // Default options that can be overridden globally or when uniformed        // globally:  $.uniform.defaults.fileButtonHtml = "Pick A File";        // on uniform:  $(‘input‘).uniform({fileButtonHtml: "Pick a File"});        defaults: {            activeClass: "active",            autoHide: true,            buttonClass: "button",            checkboxClass: "checker",            checkedClass: "checked",            disabledClass: "disabled",            eventNamespace: ".uniform",            fileButtonClass: "action",            fileButtonHtml: "选择文件",            fileClass: "uploader",            fileDefaultHtml: "未选择文件",            filenameClass: "filename",            focusClass: "focus",            hoverClass: "hover",            idPrefix: "uniform",            inputAddTypeAsClass: true,            inputClass: "uniform-input",            radioClass: "radio",            resetDefaultHtml: "Reset",            resetSelector: false,  // We‘ll use our own function when you don‘t specify one            selectAutoWidth: true,            selectClass: "selector",            selectMultiClass: "uniform-multiselect",            submitDefaultHtml: "Submit",  // Only text allowed            textareaClass: "uniform",            useID: true,            wrapperClass: null        },        // All uniformed elements - DOM objects        elements: []    };    $.fn.uniform = function (options) {        var el = this;        options = $.extend({}, $.uniform.defaults, options);        // If we are in high contrast mode, do not allow styling        if (!highContrastTest) {            highContrastTest = true;            if (highContrast()) {                allowStyling = false;            }        }        // Only uniform on browsers that work        if (!allowStyling) {            return this;        }        // Code for specifying a reset button        if (options.resetSelector) {            $(options.resetSelector).mouseup(function () {                window.setTimeout(function () {                    $.uniform.update(el);                }, 10);            });        }        return this.each(function () {            var $el = $(this), i, handler, callbacks;            // Avoid uniforming elements already uniformed - just update            if ($el.data("uniformed")) {                $.uniform.update($el);                return;            }            // See if we have any handler for this type of element            for (i = 0; i < uniformHandlers.length; i = i + 1) {                handler = uniformHandlers[i];                if (handler.match($el, options)) {                    callbacks = handler.apply($el, options);                    $el.data("uniformed", callbacks);                    // Store element in our global array                    $.uniform.elements.push($el.get(0));                    return;                }            }            // Could not style this element        });    };    $.uniform.restore = $.fn.uniform.restore = function (elem) {        if (elem === undef) {            elem = $.uniform.elements;        }        $(elem).each(function () {            var $el = $(this), index, elementData;            elementData = $el.data("uniformed");            // Skip elements that are not uniformed            if (!elementData) {                return;            }            // Unbind events, remove additional markup that was added            elementData.remove();            // Remove item from list of uniformed elements            index = $.inArray(this, $.uniform.elements);            if (index >= 0) {                $.uniform.elements.splice(index, 1);            }            $el.removeData("uniformed");        });    };    $.uniform.update = $.fn.uniform.update = function (elem) {        if (elem === undef) {            elem = $.uniform.elements;        }        $(elem).each(function () {            var $el = $(this), elementData;            elementData = $el.data("uniformed");            // Skip elements that are not uniformed            if (!elementData) {                return;            }            elementData.update($el, elementData.options);        });    };}(jQuery));/** * Chosen.js */// Chosen, a Select Box Enhancer for jQuery and Prototype// by Patrick Filler for Harvest, http://getharvest.com//// Version 0.11.1// Full source at https://github.com/harvesthq/chosen// Copyright (c) 2011 Harvest http://getharvest.com// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md// This file is generated by `grunt build`, do not edit it by hand.(function () {    var SelectParser;    SelectParser = (function () {        function SelectParser() {            this.options_index = 0;            this.parsed = [];        }        SelectParser.prototype.add_node = function (child) {            if (child.nodeName.toUpperCase() === "OPTGROUP") {                return this.add_group(child);            } else {                return this.add_option(child);            }        };        SelectParser.prototype.add_group = function (group) {            var group_position, option, _i, _len, _ref, _results;            group_position = this.parsed.length;            this.parsed.push({                array_index: group_position,                group: true,                label: group.label,                children: 0,                disabled: group.disabled            });            _ref = group.childNodes;            _results = [];            for (_i = 0, _len = _ref.length; _i < _len; _i++) {                option = _ref[_i];                _results.push(this.add_option(option, group_position, group.disabled));            }            return _results;        };        SelectParser.prototype.add_option = function (option, group_position, group_disabled) {            if (option.nodeName.toUpperCase() === "OPTION") {                if (option.text !== "") {                    if (group_position != null) {                        this.parsed[group_position].children += 1;                    }                    this.parsed.push({                        array_index: this.parsed.length,                        options_index: this.options_index,                        value: option.value,                        text: option.text,                        html: option.innerHTML,                        selected: option.selected,                        disabled: group_disabled === true ? group_disabled : option.disabled,                        group_array_index: group_position,                        classes: option.className,                        style: option.style.cssText                    });                } else {                    this.parsed.push({                        array_index: this.parsed.length,                        options_index: this.options_index,                        empty: true                    });                }                return this.options_index += 1;            }        };        return SelectParser;    })();    SelectParser.select_to_array = function (select) {        var child, parser, _i, _len, _ref;        parser = new SelectParser();        _ref = select.childNodes;        for (_i = 0, _len = _ref.length; _i < _len; _i++) {            child = _ref[_i];            parser.add_node(child);        }        return parser.parsed;    };    this.SelectParser = SelectParser;}).call(this);(function () {    var AbstractChosen, root;    root = this;    AbstractChosen = (function () {        function AbstractChosen(form_field, options) {            this.form_field = form_field;            this.options = options != null ? options : {};            if (!AbstractChosen.browser_is_supported()) {                return;            }            this.is_multiple = this.form_field.multiple;            this.set_default_text();            this.set_default_values();            this.setup();            this.set_up_html();            this.register_observers();            this.finish_setup();        }        AbstractChosen.prototype.set_default_values = function () {            var _this = this;            this.click_test_action = function (evt) {                return _this.test_active_click(evt);            };            this.activate_action = function (evt) {                return _this.activate_field(evt);            };            this.active_field = false;            this.mouse_on_container = false;            this.results_showing = false;            this.result_highlighted = null;            this.result_single_selected = null;            this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;            this.disable_search_threshold = this.options.disable_search_threshold || 0;            this.disable_search = this.options.disable_search || false;            this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;            this.search_contains = this.options.search_contains || false;            this.single_backstroke_delete = this.options.single_backstroke_delete || false;            this.max_selected_options = this.options.max_selected_options || Infinity;            return this.inherit_select_classes = this.options.inherit_select_classes || false;        };        AbstractChosen.prototype.set_default_text = function () {            if (this.form_field.getAttribute("data-placeholder")) {                this.default_text = this.form_field.getAttribute("data-placeholder");            } else if (this.is_multiple) {                this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;            } else {                this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;            }            return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;        };        AbstractChosen.prototype.mouse_enter = function () {            return this.mouse_on_container = true;        };        AbstractChosen.prototype.mouse_leave = function () {            return this.mouse_on_container = false;        };        AbstractChosen.prototype.input_focus = function (evt) {            var _this = this;            if (this.is_multiple) {                if (!this.active_field) {                    return setTimeout((function () {                        return _this.container_mousedown();                    }), 50);                }            } else {                if (!this.active_field) {                    return this.activate_field();                }            }        };        AbstractChosen.prototype.input_blur = function (evt) {            var _this = this;            if (!this.mouse_on_container) {                this.active_field = false;                return setTimeout((function () {                    return _this.blur_test();                }), 100);            }        };        AbstractChosen.prototype.result_add_option = function (option) {            var classes, style;            option.dom_id = this.container_id + "_o_" + option.array_index;            classes = [];            if (!option.disabled && !(option.selected && this.is_multiple)) {                classes.push("active-result");            }            if (option.disabled && !(option.selected && this.is_multiple)) {                classes.push("disabled-result");            }            if (option.selected) {                classes.push("result-selected");            }            if (option.group_array_index != null) {                classes.push("group-option");            }            if (option.classes !== "") {                classes.push(option.classes);            }            style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";            return ‘<li id="‘ + option.dom_id + ‘" class="‘ + classes.join(‘ ‘) + ‘"‘ + style + ‘>‘ + option.html + ‘</li>‘;        };        AbstractChosen.prototype.results_update_field = function () {            this.set_default_text();            if (!this.is_multiple) {                this.results_reset_cleanup();            }            this.result_clear_highlight();            this.result_single_selected = null;            return this.results_build();        };        AbstractChosen.prototype.results_toggle = function () {            if (this.results_showing) {                return this.results_hide();            } else {                return this.results_show();            }        };        AbstractChosen.prototype.results_search = function (evt) {            if (this.results_showing) {                return this.winnow_results();            } else {                return this.results_show();            }        };        AbstractChosen.prototype.choices_count = function () {            var option, _i, _len, _ref;            if (this.selected_option_count != null) {                return this.selected_option_count;            }            this.selected_option_count = 0;            _ref = this.form_field.options;            for (_i = 0, _len = _ref.length; _i < _len; _i++) {                option = _ref[_i];                if (option.selected) {                    this.selected_option_count += 1;                }            }            return this.selected_option_count;        };        AbstractChosen.prototype.choices_click = function (evt) {            evt.preventDefault();            if (!(this.results_showing || this.is_disabled)) {                return this.results_show();            }        };        AbstractChosen.prototype.keyup_checker = function (evt) {            var stroke, _ref;            stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;            this.search_field_scale();            switch (stroke) {                case 8:                    if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {                        return this.keydown_backstroke();                    } else if (!this.pending_backstroke) {                        this.result_clear_highlight();                        return this.results_search();                    }                    break;                case 13:                    evt.preventDefault();                    if (this.results_showing) {                        return this.result_select(evt);                    }                    break;                case 27:                    if (this.results_showing) {                        this.results_hide();                    }                    return true;                case 9:                case 38:                case 40:                case 16:                case 91:                case 17:                    break;                default:                    return this.results_search();            }        };        AbstractChosen.prototype.generate_field_id = function () {            var new_id;            new_id = this.generate_random_id();            this.form_field.id = new_id;            return new_id;        };        AbstractChosen.prototype.generate_random_char = function () {            var chars, newchar, rand;            chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";            rand = Math.floor(Math.random() * chars.length);            return newchar = chars.substring(rand, rand + 1);        };        AbstractChosen.prototype.container_width = function () {            if (this.options.width != null) {                return this.options.width;            } else {                return  this.form_field.offsetWidth + 10;            }        };        AbstractChosen.browser_is_supported = function () {            var _ref;            if (window.navigator.appName === "Microsoft Internet Explorer") {                return (null !== (_ref = document.documentMode) && _ref >= 8);            }            return true;        };        AbstractChosen.default_multiple_text = "Select Some Options";        AbstractChosen.default_single_text = "Select an Option";        AbstractChosen.default_no_result_text = "No results match";        return AbstractChosen;    })();    root.AbstractChosen = AbstractChosen;}).call(this);(function () {    var $, Chosen, root, _ref,        __hasProp = {}.hasOwnProperty,        __extends = function (child, parent) {            for (var key in parent) {                if (__hasProp.call(parent, key)) child[key] = parent[key];            }            function ctor() {                this.constructor = child;            }            ctor.prototype = parent.prototype;            child.prototype = new ctor();            child.__super__ = parent.prototype;            return child;        };    root = this;    $ = jQuery;    $.fn.extend({        chosen: function (options) {            if (!AbstractChosen.browser_is_supported()) {                return this;            }            return this.each(function (input_field) {                var $this;                $this = $(this);                if (!$this.hasClass("chzn-done")) {                    return $this.data(‘chosen‘, new Chosen(this, options));                }            });        }    });    Chosen = (function (_super) {        __extends(Chosen, _super);        function Chosen() {            _ref = Chosen.__super__.constructor.apply(this, arguments);            return _ref;        }        Chosen.prototype.setup = function () {            this.form_field_jq = $(this.form_field);            this.current_selectedIndex = this.form_field.selectedIndex;            return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");        };        Chosen.prototype.finish_setup = function () {            return this.form_field_jq.addClass("chzn-done");        };        Chosen.prototype.set_up_html = function () {            var container_classes, container_props;            this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, ‘_‘) : this.generate_field_id();            this.container_id += "_chzn";            container_classes = ["chzn-container"];            container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));            if (this.inherit_select_classes && this.form_field.className) {                container_classes.push(this.form_field.className);            }            if (this.is_rtl) {                container_classes.push("chzn-rtl");            }            container_props = {                ‘id‘: this.container_id,                ‘class‘: container_classes.join(‘ ‘),                ‘style‘: "width:" + (this.container_width()) + "px;",                ‘title‘: this.form_field.title            };            this.container = $("<div />", container_props);            if (this.is_multiple) {                this.container.html(‘<ul class="chzn-choices"><li class="search-field"><input type="text" value="http://www.mamicode.com/‘ + this.default_text + ‘" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>‘);            } else {                this.container.html(‘<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>‘ + this.default_text + ‘</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>‘);            }            this.form_field_jq.hide().after(this.container);            this.dropdown = this.container.find(‘div.chzn-drop‘).first();            this.search_field = this.container.find(‘input‘).first();            this.search_results = this.container.find(‘ul.chzn-results‘).first();            this.search_field_scale();            this.search_no_results = this.container.find(‘li.no-results‘).first();            if (this.is_multiple) {                this.search_choices = this.container.find(‘ul.chzn-choices‘).first();                this.search_container = this.container.find(‘li.search-field‘).first();            } else {                this.search_container = this.container.find(‘div.chzn-search‘).first();                this.selected_item = this.container.find(‘.chzn-single‘).first();            }            this.results_build();            this.set_tab_index();            this.set_label_behavior();            return this.form_field_jq.trigger("liszt:ready", {                chosen: this            });        };        Chosen.prototype.register_observers = function () {            var _this = this;            this.container.mousedown(function (evt) {                _this.container_mousedown(evt);            });            this.container.mouseup(function (evt) {                _this.container_mouseup(evt);            });            this.container.mouseenter(function (evt) {                _this.mouse_enter(evt);            });            this.container.mouseleave(function (evt) {                _this.mouse_leave(evt);            });            this.search_results.mouseup(function (evt) {                _this.search_results_mouseup(evt);            });            this.search_results.mouseover(function (evt) {                _this.search_results_mouseover(evt);            });            this.search_results.mouseout(function (evt) {                _this.search_results_mouseout(evt);            });            this.search_results.bind(‘mousewheel DOMMouseScroll‘, function (evt) {                _this.search_results_mousewheel(evt);            });            this.form_field_jq.bind("liszt:updated", function (evt) {                _this.results_update_field(evt);            });            this.form_field_jq.bind("liszt:activate", function (evt) {                _this.activate_field(evt);            });            this.form_field_jq.bind("liszt:open", function (evt) {                _this.container_mousedown(evt);            });            this.search_field.blur(function (evt) {                _this.input_blur(evt);            });            this.search_field.keyup(function (evt) {                _this.keyup_checker(evt);            });            this.search_field.keydown(function (evt) {                _this.keydown_checker(evt);            });            this.search_field.focus(function (evt) {                _this.input_focus(evt);            });            if (this.is_multiple) {                return this.search_choices.click(function (evt) {                    _this.choices_click(evt);                });            } else {                return this.container.click(function (evt) {                    evt.preventDefault();                });            }        };        Chosen.prototype.search_field_disabled = function () {            this.is_disabled = this.form_field_jq[0].disabled;            if (this.is_disabled) {                this.container.addClass(‘chzn-disabled‘);                this.search_field[0].disabled = true;                if (!this.is_multiple) {                    this.selected_item.unbind("focus", this.activate_action);                }                return this.close_field();            } else {                this.container.removeClass(‘chzn-disabled‘);                this.search_field[0].disabled = false;                if (!this.is_multiple) {                    return this.selected_item.bind("focus", this.activate_action);                }            }        };        Chosen.prototype.container_mousedown = function (evt) {            if (!this.is_disabled) {                if (evt && evt.type === "mousedown" && !this.results_showing) {                    evt.preventDefault();                }                if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {                    if (!this.active_field) {                        if (this.is_multiple) {                            this.search_field.val("");                        }                        $(document).click(this.click_test_action);                        this.results_show();                    } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {                        evt.preventDefault();                        this.results_toggle();                    }                    return this.activate_field();                }            }        };        Chosen.prototype.container_mouseup = function (evt) {            if (evt.target.nodeName === "ABBR" && !this.is_disabled) {                return this.results_reset(evt);            }        };        Chosen.prototype.search_results_mousewheel = function (evt) {            var delta, _ref1, _ref2;            delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0);            if (delta != null) {                evt.preventDefault();                if (evt.type === ‘DOMMouseScroll‘) {                    delta = delta * 40;                }                return this.search_results.scrollTop(delta + this.search_results.scrollTop());            }        };        Chosen.prototype.blur_test = function (evt) {            if (!this.active_field && this.container.hasClass("chzn-container-active")) {                return this.close_field();            }        };        Chosen.prototype.close_field = function () {            $(document).unbind("click", this.click_test_action);            this.active_field = false;            this.results_hide();            this.container.removeClass("chzn-container-active");            this.clear_backstroke();            this.show_search_field_default();            return this.search_field_scale();        };        Chosen.prototype.activate_field = function () {            this.container.addClass("chzn-container-active");            this.active_field = true;            this.search_field.val(this.search_field.val());            return this.search_field.focus();        };        Chosen.prototype.test_active_click = function (evt) {            if ($(evt.target).parents(‘#‘ + this.container_id).length) {                return this.active_field = true;            } else {                return this.close_field();            }        };        Chosen.prototype.results_build = function () {            var content, data, _i, _len, _ref1;            this.parsing = true;            this.selected_option_count = null;            this.results_data = http://www.mamicode.com/root.SelectParser.select_to_array(this.form_field);            if (this.is_multiple) {                this.search_choices.find("li.search-choice").remove();            } else if (!this.is_multiple) {                this.selected_item.addClass("chzn-default").find("span").text(this.default_text);                if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {                    this.search_field[0].readOnly = true;                    this.container.addClass("chzn-container-single-nosearch");                } else {                    this.search_field[0].readOnly = false;                    this.container.removeClass("chzn-container-single-nosearch");                }            }            content = ‘‘;            _ref1 = this.results_data;            for (_i = 0, _len = _ref1.length; _i < _len; _i++) {                data = _ref1[_i];                if (data.group) {                    content += this.result_add_group(data);                } else if (!data.empty) {                    content += this.result_add_option(data);                    if (data.selected && this.is_multiple) {                        this.choice_build(data);                    } else if (data.selected && !this.is_multiple) {                        this.selected_item.removeClass("chzn-default").find("span").text(data.text);                        if (this.allow_single_deselect) {                            this.single_deselect_control_build();                        }                    }                }            }            this.search_field_disabled();            this.show_search_field_default();            this.search_field_scale();            this.search_results.html(content);            return this.parsing = false;        };        Chosen.prototype.result_add_group = function (group) {            group.dom_id = this.container_id + "_g_" + group.array_index;            return ‘<li id="‘ + group.dom_id + ‘" class="group-result">‘ + $("<div />").text(group.label).html() + ‘</li>‘;        };        Chosen.prototype.result_do_highlight = function (el) {            var high_bottom, high_top, maxHeight, visible_bottom, visible_top;            if (el.length) {                this.result_clear_highlight();                this.result_highlight = el;                this.result_highlight.addClass("highlighted");                maxHeight = parseInt(this.search_results.css("maxHeight"), 10);                visible_top = this.search_results.scrollTop();                visible_bottom = maxHeight + visible_top;                high_top = this.result_highlight.position().top + this.search_results.scrollTop();                high_bottom = high_top + this.result_highlight.outerHeight();                if (high_bottom >= visible_bottom) {                    return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);                } else if (high_top < visible_top) {                    return this.search_results.scrollTop(high_top);                }            }        };        Chosen.prototype.result_clear_highlight = function () {            if (this.result_highlight) {                this.result_highlight.removeClass("highlighted");            }            return this.result_highlight = null;        };        Chosen.prototype.results_show = function () {            if (this.is_multiple && this.max_selected_options <= this.choices_count()) {                this.form_field_jq.trigger("liszt:maxselected", {                    chosen: this                });                return false;            }            this.container.addClass("chzn-with-drop");            this.form_field_jq.trigger("liszt:showing_dropdown", {                chosen: this            });            this.results_showing = true;            this.search_field.focus();            this.search_field.val(this.search_field.val());            return this.winnow_results();        };        Chosen.prototype.results_hide = function () {            if (this.results_showing) {                this.result_clear_highlight();                this.container.removeClass("chzn-with-drop");                this.form_field_jq.trigger("liszt:hiding_dropdown", {                    chosen: this                });            }            return this.results_showing = false;        };        Chosen.prototype.set_tab_index = function (el) {            var ti;            if (this.form_field_jq.attr("tabindex")) {                ti = this.form_field_jq.attr("tabindex");                this.form_field_jq.attr("tabindex", -1);                return this.search_field.attr("tabindex", ti);            }        };        Chosen.prototype.set_label_behavior = function () {            var _this = this;            this.form_field_label = this.form_field_jq.parents("label");            if (!this.form_field_label.length && this.form_field.id.length) {                this.form_field_label = $("label[for=‘" + this.form_field.id + "‘]");            }            if (this.form_field_label.length > 0) {                return this.form_field_label.click(function (evt) {                    if (_this.is_multiple) {                        return _this.container_mousedown(evt);                    } else {                        return _this.activate_field();                    }                });            }        };        Chosen.prototype.show_search_field_default = function () {            if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {                this.search_field.val(this.default_text);                return this.search_field.addClass("default");            } else {                this.search_field.val("");                return this.search_field.removeClass("default");            }        };        Chosen.prototype.search_results_mouseup = function (evt) {            var target;            target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();            if (target.length) {                this.result_highlight = target;                this.result_select(evt);                return this.search_field.focus();            }        };        Chosen.prototype.search_results_mouseover = function (evt) {            var target;            target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();            if (target) {                return this.result_do_highlight(target);            }        };        Chosen.prototype.search_results_mouseout = function (evt) {            if ($(evt.target).hasClass("active-result" || $(evt.target).parents(‘.active-result‘).first())) {                return this.result_clear_highlight();            }        };        Chosen.prototype.choice_build = function (item) {            var choice, close_link,                _this = this;            choice = $(‘<li />‘, {                "class": "search-choice"            }).html("<span>" + item.html + "</span>");            if (item.disabled) {                choice.addClass(‘search-choice-disabled‘);            } else {                close_link = $(‘<a />‘, {                    href: ‘#‘,                    "class": ‘search-choice-close‘,                    rel: item.array_index                });                close_link.click(function (evt) {                    return _this.choice_destroy_link_click(evt);                });                choice.append(close_link);            }            return this.search_container.before(choice);        };        Chosen.prototype.choice_destroy_link_click = function (evt) {            evt.preventDefault();            evt.stopPropagation();            if (!this.is_disabled) {                return this.choice_destroy($(evt.target));            }        };        Chosen.prototype.choice_destroy = function (link) {            if (this.result_deselect(link.attr("rel"))) {                this.show_search_field_default();                if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {                    this.results_hide();                }                link.parents(‘li‘).first().remove();                return this.search_field_scale();            }        };        Chosen.prototype.results_reset = function () {            this.form_field.options[0].selected = true;            this.selected_option_count = null;            this.selected_item.find("span").text(this.default_text);            if (!this.is_multiple) {                this.selected_item.addClass("chzn-default");            }            this.show_search_field_default();            this.results_reset_cleanup();            this.form_field_jq.trigger("change");            if (this.active_field) {                return this.results_hide();            }        };        Chosen.prototype.results_reset_cleanup = function () {            this.current_selectedIndex = this.form_field.selectedIndex;            return this.selected_item.find("abbr").remove();        };        Chosen.prototype.result_select = function (evt) {            var high, high_id, item, position;            if (this.result_highlight) {                high = this.result_highlight;                high_id = high.attr("id");                this.result_clear_highlight();                if (this.is_multiple && this.max_selected_options <= this.choices_count()) {                    this.form_field_jq.trigger("liszt:maxselected", {                        chosen: this                    });                    return false;                }                if (this.is_multiple) {                    high.removeClass("active-result");                } else {                    this.search_results.find(".result-selected").removeClass("result-selected");                    this.result_single_selected = high;                    this.selected_item.removeClass("chzn-default");                }                high.addClass("result-selected");                position = high_id.substr(high_id.lastIndexOf("_") + 1);                item = this.results_data[position];                item.selected = true;                this.form_field.options[item.options_index].selected = true;                this.selected_option_count = null;                if (this.is_multiple) {                    this.choice_build(item);                } else {                    this.selected_item.find("span").first().text(item.text);                    if (this.allow_single_deselect) {                        this.single_deselect_control_build();                    }                }                if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {                    this.results_hide();                }                this.search_field.val("");                if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {                    this.form_field_jq.trigger("change", {                        ‘selected‘: this.form_field.options[item.options_index].value                    });                }                this.current_selectedIndex = this.form_field.selectedIndex;                return this.search_field_scale();            }        };        Chosen.prototype.result_activate = function (el, option) {            if (option.disabled) {                return el.addClass("disabled-result");            } else if (this.is_multiple && option.selected) {                return el.addClass("result-selected");            } else {                return el.addClass("active-result");            }        };        Chosen.prototype.result_deactivate = function (el) {            return el.removeClass("active-result result-selected disabled-result");        };        Chosen.prototype.result_deselect = function (pos) {            var result, result_data;            result_data = this.results_data[pos];            if (!this.form_field.options[result_data.options_index].disabled) {                result_data.selected = false;                this.form_field.options[result_data.options_index].selected = false;                this.selected_option_count = null;                result = $("#" + this.container_id + "_o_" + pos);                result.removeClass("result-selected").addClass("active-result").show();                this.result_clear_highlight();                this.winnow_results();                this.form_field_jq.trigger("change", {                    deselected: this.form_field.options[result_data.options_index].value                });                this.search_field_scale();                return true;            } else {                return false;            }        };        Chosen.prototype.single_deselect_control_build = function () {            if (!this.allow_single_deselect) {                return;            }            if (!this.selected_item.find("abbr").length) {                this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");            }            return this.selected_item.addClass("chzn-single-with-deselect");        };        Chosen.prototype.winnow_results = function () {            var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref1;            this.no_results_clear();            results = 0;            searchText = this.search_field.val() === this.default_text ? "" : $(‘<div/>‘).text($.trim(this.search_field.val())).html();            regexAnchor = this.search_contains ? "" : "^";            regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), ‘i‘);            zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), ‘i‘);            _ref1 = this.results_data;            for (_i = 0, _len = _ref1.length; _i < _len; _i++) {                option = _ref1[_i];                if (!option.empty) {                    if (option.group) {                        $(‘#‘ + option.dom_id).css(‘display‘, ‘none‘);                    } else {                        found = false;                        result_id = option.dom_id;                        result = $("#" + result_id);                        if (regex.test(option.html)) {                            found = true;                            results += 1;                        } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {                            parts = option.html.replace(/\[|\]/g, "").split(" ");                            if (parts.length) {                                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {                                    part = parts[_j];                                    if (regex.test(part)) {                                        found = true;                                        results += 1;                                    }                                }                            }                        }                        if (found) {                            if (searchText.length) {                                startpos = option.html.search(zregex);                                text = option.html.substr(0, startpos + searchText.length) + ‘</em>‘ + option.html.substr(startpos + searchText.length);                                text = text.substr(0, startpos) + ‘<em>‘ + text.substr(startpos);                            } else {                                text = option.html;                            }                            result.html(text);                            this.result_activate(result, option);                            if (option.group_array_index != null) {                                $("#" + this.results_data[option.group_array_index].dom_id).css(‘display‘, ‘list-item‘);                            }                        } else {                            if (this.result_highlight && result_id === this.result_highlight.attr(‘id‘)) {                                this.result_clear_highlight();                            }                            this.result_deactivate(result);                        }                    }                }            }            if (results < 1 && searchText.length) {                return this.no_results(searchText);            } else {                return this.winnow_results_set_highlight();            }        };        Chosen.prototype.winnow_results_set_highlight = function () {            var do_high, selected_results;            if (!this.result_highlight) {                selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];                do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();                if (do_high != null) {                    return this.result_do_highlight(do_high);                }            }        };        Chosen.prototype.no_results = function (terms) {            var no_results_html;            no_results_html = $(‘<li class="no-results">‘ + this.results_none_found + ‘ "<span></span>"</li>‘);            no_results_html.find("span").first().html(terms);            return this.search_results.append(no_results_html);        };        Chosen.prototype.no_results_clear = function () {            return this.search_results.find(".no-results").remove();        };        Chosen.prototype.keydown_arrow = function () {            var next_sib;            if (this.results_showing && this.result_highlight) {                next_sib = this.result_highlight.nextAll("li.active-result").first();                if (next_sib) {                    return this.result_do_highlight(next_sib);                }            } else {                return this.results_show();            }        };        Chosen.prototype.keyup_arrow = function () {            var prev_sibs;            if (!this.results_showing && !this.is_multiple) {                return this.results_show();            } else if (this.result_highlight) {                prev_sibs = this.result_highlight.prevAll("li.active-result");                if (prev_sibs.length) {                    return this.result_do_highlight(prev_sibs.first());                } else {                    if (this.choices_count() > 0) {                        this.results_hide();                    }                    return this.result_clear_highlight();                }            }        };        Chosen.prototype.keydown_backstroke = function () {            var next_available_destroy;            if (this.pending_backstroke) {                this.choice_destroy(this.pending_backstroke.find("a").first());                return this.clear_backstroke();            } else {                next_available_destroy = this.search_container.siblings("li.search-choice").last();                if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {                    this.pending_backstroke = next_available_destroy;                    if (this.single_backstroke_delete) {                        return this.keydown_backstroke();                    } else {                        return this.pending_backstroke.addClass("search-choice-focus");                    }                }            }        };        Chosen.prototype.clear_backstroke = function () {            if (this.pending_backstroke) {                this.pending_backstroke.removeClass("search-choice-focus");            }            return this.pending_backstroke = null;        };        Chosen.prototype.keydown_checker = function (evt) {            var stroke, _ref1;            stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;            this.search_field_scale();            if (stroke !== 8 && this.pending_backstroke) {                this.clear_backstroke();            }            switch (stroke) {                case 8:                    this.backstroke_length = this.search_field.val().length;                    break;                case 9:                    if (this.results_showing && !this.is_multiple) {                        this.result_select(evt);                    }                    this.mouse_on_container = false;                    break;                case 13:                    evt.preventDefault();                    break;                case 38:                    evt.preventDefault();                    this.keyup_arrow();                    break;                case 40:                    evt.preventDefault();                    this.keydown_arrow();                    break;            }        };        Chosen.prototype.search_field_scale = function () {            var div, h, style, style_block, styles, w, _i, _len;            if (this.is_multiple) {                h = 0;                w = 0;                style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";                styles = [‘font-size‘, ‘font-style‘, ‘font-weight‘, ‘font-family‘, ‘line-height‘, ‘text-transform‘, ‘letter-spacing‘];                for (_i = 0, _len = styles.length; _i < _len; _i++) {                    style = styles[_i];                    style_block += style + ":" + this.search_field.css(style) + ";";                }                div = $(‘<div />‘, {                    ‘style‘: style_block                });                div.text(this.search_field.val());                $(‘body‘).append(div);                w = div.width() + 25;                div.remove();                if (!this.f_width) {                    this.f_width = this.container.outerWidth();                }                if (w > this.f_width - 10) {                    w = this.f_width - 10;                }                return this.search_field.css({                    ‘width‘: w + ‘px‘                });            }        };        Chosen.prototype.generate_random_id = function () {            var string;            string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();            while ($("#" + string).length > 0) {                string += this.generate_random_char();            }            return string;        };        return Chosen;    })(AbstractChosen);    root.Chosen = Chosen;}).call(this);