Team Talk

vBulletin Team Talk 1.0.0

No permission to download

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
ChrisTERiS submitted a new resource:

Team Talk - Multiuser Conversation System

I'm offering my hard work for free, without even a single copyright line in footer, expecting that some of you will appreciate the time that I spent for coding it and they will donate something.
1.- What's this?

Just like normal PMs but with the ability to start a conversation with multiple users. Let's say an offline chat.

2.- Features
  • Multiuser (max participants depending on usergroup...
Read more about this resource...
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hi Chris,

vbulletin 4.2.5 PHP 7.4

The code below gives an error. Team Talk cannot be started.

Within the teamtalk/includes/functions.php file:

Line: 8-13

PHP:
function getUserName($id)
{
    global $db, $vbulletin, $vbphrase, $vboptions;
    $user = $vbulletin->db->query_first("SELECT username FROM ".TABLE_PREFIX."user WHERE userid=$id LIMIT 1");
    return $user["username"];
}
When I use the code below, Team Talk message is added. However, there is a new problem. The problem is this: the message does not appear on the contact side. In addition, when the message added on the sender side is clicked on "My Conversations", the message does not appear again.

PHP:
function getUserName($id)
{
    global $db, $vbulletin, $vbphrase, $vboptions;
    $user = $vbulletin->db->query_first("SELECT username FROM ".TABLE_PREFIX."user WHERE userid=" . (int) $id . " LIMIT 1");
    return $user["username"];
}
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
As I can see you're using PHP 7.4 while vBulletin 4.x does not supports even 7.2
As you can see in your member area at vB.com, it clearly states that:
vBulletin 3 and vBulletin 4 do not support PHP 7.2
As for my mods, all have been coded at least 5 years ago, on glory days of vBulletin. Sure I can upgrade them to work with latest PHP version, but this will be a waste of time, when none of them has more than 10 downloads here.
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
If you're running a general medium sized community, and if you like my work, I suggest you to use:

Most probably should be Free and it will be ready max Feb 15th. Just adding some final touches. eg now I'm adding normal Login/Registration while till now I had only Facebook Login. Also I'll replace Search with Ajax Search, and the most important is that works fine with all PHP 7.x versions.

If you want to check what I mean with AjaxSearch give a look here with 1.650.000 posts, even if the real is much faster (in the demo the template is broken)

And here is a sample on how Reviews page appear in CMS Viral. As you can see has most of the important data that a Review must have.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
As I can see you're using PHP 7.4 while vBulletin 4.x does not supports even 7.2
As you can see in your member area at vB.com, it clearly states that:


As for my mods, all have been coded at least 5 years ago, on glory days of vBulletin. Sure I can upgrade them to work with latest PHP version, but this will be a waste of time, when none of them has more than 10 downloads here.
Hi Chris,
You are very right too. As I said, I am using vbulletin 4.2.5 and PHP 7.4. Many add-ons have had many problems and I have fixed them. I started using the coupon plugin as I said last. But I couldn't do the Team Talk plugin. I asked, maybe there is a simple solution. Thank you so much.
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
I asked, maybe there is a simple solution. Thank you so much.
Usually I stop coding at 21:00pm every day and then spending an hour just for fun. I'll try to see if it's something that can be easily fix. Meanwhile, as I'm not totally sure where exactly is the bug, if you've any screenshot or anything else to help me locate it easily, I'll appreciate it.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Usually I stop coding at 21:00pm every day and then spending an hour just for fun. I'll try to see if it's something that can be easily fix. Meanwhile, as I'm not totally sure where exactly is the bug, if you've any screenshot or anything else to help me locate it easily, I'll appreciate it.
Thanks Chris,

I click on "Start a New Conversation". I choose the person to be interviewed. I write the message and click on Save Changes. The following screen also writes:

Database error in vBulletin 4.2.5:

Invalid SQL:
SELECT username FROM user WHERE userid= LIMIT 1;

MySQL Error : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIMIT 1' at line 1
Error Number : 1064
Request Date : Tuesday, February 4th 2020 @ 01:17:49 PM
Error Date : Tuesday, February 4th 2020 @ 01:17:50 PM
Script : http://ddddddd.com/teamtalk.php
Referrer : https://ddddddd.com/teamtalk.php?do=new
IP Address : xx.xxx.xxx.xx
Username : Super Admin
Classname : vB_Database_MySQLi
MySQL Version : 10.2.24-MariaDB
Server : xx.xxx.xxx.xxx
User Agent :

Note:
I've realized now. I don't think so, but could the error be this?
http: //
https: //

Script : http://ddddddd.com/teamtalk.php
Referrer : https://ddddddd.com/teamtalk.php?do=new
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
niho
Thank you for the report. No, http/https is not the case. The error message is very clear. Query is missing the userid (WHERE userid= )
I'll check it, and I'll post a reply later, hopefully tonight.
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
niho Just to keep you informed, I tried to install vB 4.2.5 in 2 sites, one with PHP 5.6 and the other with PHP 7.3
Both tries were unsuccessful. With 5.6 installation procedure frozen in 5% (Suite version), while with PHP 7.3 I was getting dozen of errors even if I've disabled them in both php.ini and config.php

Sorry, I'm very tired to continue today, I'll try tomorrow. What is for sure is, that I've used this mod for my own for long time and worked fine. At least that days.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
niho Just to keep you informed, I tried to install vB 4.2.5 in 2 sites, one with PHP 5.6 and the other with PHP 7.3
Both tries were unsuccessful. With 5.6 installation procedure frozen in 5% (Suite version), while with PHP 7.3 I was getting dozen of errors even if I've disabled them in both php.ini and config.php

Sorry, I'm very tired to continue today, I'll try tomorrow. What is for sure is, that I've used this mod for my own for long time and worked fine. At least that days.
Thanks Chris, I've been trying for hours, but I'm still in the same place.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hi Chris,
I don't know if this is useful. When using this code in functions.php it gives ID NO.

PHP:
$user = $vbulletin->db->query_first("SELECT username FROM ".TABLE_PREFIX."user WHERE userid='$row.['$id']' LIMIT 1");
But the problem is this:
Database error in vBulletin 4.2.5:

Invalid SQL:
SELECT username FROM user WHERE userid='.['1']' LIMIT 1;

MySQL Error : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1']' LIMIT 1' at line 1
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
I don't know if this is useful. When using this code in functions.php it gives ID NO.
Is good to do tests on your own, actually this is the way that I learn programming, but this is not correct. You don't have any row[] array there, so again the value should be empty. In that place needs the parameter declared in the function.

PS: Still trying to find why I can't install vB :oops: What is first to check is if jQuery version is compatible. I seen that there is an ancient version there. If you've any testing installation online, please PM me access details, as it'll save some valuable time.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hello Chris,
Sorry, there is no test site. It has been active for many years, is a multi-member site for social benefit and I am trying to make some adjustments. I do not advertise the site and nobody even knows that the site is mine. So the site is not mine, it is like the public site. But if there is anything you want me to test, I can gladly try it. I have knowledge, though not as much as you, about these issues.
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
niho Sorry but I'll give up. Have tried more than 10 times to install both vB Forum or vB Suite in different websites with different PHP versions and all installations stop working without any error message (have turn on display errors). The installation stops always on the same point:
Inserting default data into usertitle
This is on 5% of the Suite installation or 13% of Forum version installation.

If you can install vB somewhere, I can try to help you.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hello Chris,

Unfortunately, I do not have the possibility to install it elsewhere.
Thank you for all your efforts. You are a good person.

But if you have an intermediate time and will be interested:

The final situation is this:

I looked at the sql tables.

Main Problem:
Table:
teamtalk_pm
column: memberids and membernames
No value is saved in these columns.
I manually added value then it works.

The other problem is Table: teamtalk_notifications. No value is recorded in this table. However, since it only sends notifications, it does not affect other parts of the plugin negatively.
Nowhere else does the problem appear.

I guess the code that causes all this problem is this:

PHP:
function getUserName($id)
{
    global $db, $vbulletin, $vbphrase, $vboptions;
    $user = $vbulletin->db->query_first("SELECT username FROM ".TABLE_PREFIX."user WHERE userid=$id LIMIT 1");
    return $user["username"];
}
And also the following:

teamtalk.php

in: Line: 332-334


PHP:
// Participants
$ memberids = $ db-> escape_string ($ vbulletin-> GPC ['userids']);
$ membernames = '';
I don't know where userids are coming from. There is userid in table user.

That's all I can for now. I don't know what I can do in the future.
I wish you healthy days.
 

ChrisTERiS

Developer
Joined
Jan 16, 2015
Messages
620
userids fields come from the template teamtalk_new_pm
If you see in the footer there is js code:
JavaScript:
<script type="text/javascript">
    $(document).ready(function () {
        $(".select_usernames").chosenImage({
            width: "100%",
            disable_search_threshold: 10,
            post_field: "userids"
        });
    });
</script>
The function getUserName is correct. The problem is that:
Code:
$memberids = $db->escape_string($ vbulletin-> GPC ['userids']);
does not gets the values, so as there are no values, is normal that the function getUserName which actually "translates" userid to username does not works.

If you want do some tests.

1.- Below line 333
Code:
$memberids = $db->escape_string($vbulletin->GPC['userids']);
add:
Code:
echo $memberids;
If it does not shows anything on the screen, then proceed to 2nd test

2.- Edit line 312 of teamtalk.php and replace:
Code:
'userids'          => TYPE_STR,
with:
Code:
'userids'          => TYPE_ARRAY_INT,
Also change:
Code:
$memberids = $db->escape_string($ vbulletin-> GPC ['userids']);
to:
Code:
$memberids = $vbulletin->GPC ['userids'];
Then add as before, but instead of echo.... use:
Code:
print_r($memberids);
 
Last edited:

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hello Chris,

Unfortunately, what you have suggested did not solve the problem.

The only problem is the following code on line 333 in teamtalk.php:

PHP:
$memberids = $db->escape_string($vbulletin->GPC['userids']);
or
There is a problem with the code that allows generating the following piece of code:

PHP:
$db->escape_string($vbulletin->GPC['userids']);
If I know all the codes that produce this piece of code, I will try to solve the problem. Is this the only code that produces this piece of code?

JavaScript:
<script type="text/javascript">
    $(document).ready(function () {
        $(".select_usernames").chosenImage({
            width: "100%",
            disable_search_threshold: 10,
            post_field: "userids"
        });
    });
</script>
Note: I don't know how it will be useful but if it can give you another idea, there is a situation like this: https://www.vbulletin.com/docs/html/main/codestandards_gpc

If I write the code directly like this, no problem:

PHP:
$memberids = 3;
When I enter the member ID No 3 in this code, for example, the data in the memberids and membernames fields in SQL are entered correctly. But the problem is that it doesn't get it automatically with the code defined in teamtalk.php. Entering manually allows communication only with the defined person.
 

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hello Chris,
I also noticed that. the part of the person to message is not like this picture below:

There is no contact search block in this product I installed. People also do not have pictures on the left side. You can find and select people by simply scrolling down with the scroll bar. I think this is due to the following code:

JavaScript:
<script type="text/javascript">
    $(document).ready(function () {
        $(".select_usernames").chosenImage({
            width: "100%",
            disable_search_threshold: 10,
            post_field: "userids"
        });
    });
</script>

Again, I don't know if this fix can give you an idea. One of the problems I encounter a lot in vbulletin 4.2.5 plugins is array() problem. This can be for both implode and explode. For example, I corrected these problems as follows:

PHP:
if (is_array($settings['xxx']))
{
$settings['xxx'] = implode(',', (array)$settings['xxx']);
}
I added (array) and it fixed. I had to say this because there are such codes in the teamtalk.php file.


Another problem I encountered with vbulletin 4.2.5 plugins is vB_DataManager.

I fixed this as follows: parent :: vB_DataManager (...); parent :: __construct (...); I use. This statement is also in the functions.php file $pmSystem = new vB_DataManager_PM( $vbulletin ); I said if he could give you an idea because I saw the code.
 
Last edited:

niho

Aspirant
Joined
Jan 19, 2020
Messages
17
Hello Chris,

The main problem is:
Unable to generate userids in teamtalk.php Line 333 code. According to my guess, this problem may be due to the fact that the person to whom the message was sent was not selected even if it was clicked on. This requires a converter, and this converter needs to work well. These converters also encode js.

The relevant codes are:

functions.php
Line: 8-13


PHP:
function getUserName($id)
{
    global $db, $vbulletin, $vbphrase, $vboptions;
    $user = $vbulletin->db->query_first("SELECT username FROM ".TABLE_PREFIX."user WHERE userid=$id LIMIT 1");
    return $user["username"];
}
teamtalk.php

Line:
333

PHP:
    $memberids = $db->escape_string($vbulletin->GPC['userids']);
product-teamtalk.xml

Line: 487-491


XML:
            <div class="blockrow">                  
                <select name="participants" data-placeholder="{vb:var vbphrase.teamtalk_select_participants}" class="select_usernames" multiple style="width:100%;">
                {vb:raw html_participants}
                </select>
            </div>
Line: 555-563

XML:
<script type="text/javascript">
    $(document).ready(function () {
        $(".select_usernames").chosenImage({
            width: "100%",
            disable_search_threshold: 10,
            post_field: "userids"
        });
    });
</script>
I think the problem is related to the following files:

(Note: The following may also be the cause of the problem because it is an older version: jquery-1.10.2.min.js)

chosen.jquery.js and chosenImage.jquery.js

chosen.jquery.js:


JavaScript:
/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com

Version 1.4.2
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011-2015 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 $, AbstractChosen, Chosen, SelectParser, _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;
            };

    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: this.escapeExpression(group.label),
                title: group.title ? group.title : void 0,
                children: 0,
                disabled: group.disabled,
                classes: group.className
            });
            _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,
                        title: option.title ? option.title : void 0,
                        selected: option.selected,
                        disabled: group_disabled === true ? group_disabled : option.disabled,
                        group_array_index: group_position,
                        group_label: group_position != null ? this.parsed[group_position].label : null,
                        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;
            }
        };

        SelectParser.prototype.escapeExpression = function (text) {
            var map, unsafe_chars;
            if ((text == null) || text === false) {
                return "";
            }
            if (!/[\&\<\>\"\'\`]/.test(text)) {
                return text;
            }
            map = {
                "<": "&lt;",
                ">": "&gt;",
                '"': "&quot;",
                "'": "&#x27;",
                "`": "&#x60;"
            };
            unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
            return text.replace(unsafe_chars, function (chr) {
                return map[chr] || "&amp;";
            });
        };

        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;
    };

    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.on_ready();
        }

        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.post_field = "default_post_field_name";
            this.mouse_on_container = false;
            this.results_showing = false;
            this.result_highlighted = 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.group_search = this.options.group_search != null ? this.options.group_search : true;
            this.search_contains = this.options.search_contains || false;
            this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
            this.max_selected_options = this.options.max_selected_options || Infinity;
            this.inherit_select_classes = this.options.inherit_select_classes || false;
            this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
            this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
          
            /*this.ids = {};
            for (var j=0; j < this.form_field.options.length; j++){
                this.ids[j] = this.form_field.options[j].value;
            }*/
              
            return this.include_group_label_in_selected = this.options.include_group_label_in_selected || 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.choice_label = function (item) {
            if (this.include_group_label_in_selected && (item.group_label != null)) {
                return "<b class='group-name'>" + item.group_label + "</b>" + item.html;
            } else {
                return item.html;
            }
        };

        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.results_option_build = function (options) {
            var content, data, _i, _len, _ref;
            content = '';
            _ref = this.results_data;
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                data = _ref[_i];
                if (data.group) {
                    content += this.result_add_group(data);
                } else {
                    content += this.result_add_option(data);
                }
                if (options != null ? options.first : void 0) {
                    if (data.selected && this.is_multiple) {
                        this.choice_build(data);
                    } else if (data.selected && !this.is_multiple) {
                        this.single_set_selected_text(this.choice_label(data));
                    }
                }
            }
            return content;
        };

        AbstractChosen.prototype.result_add_option = function (option) {
            var classes, option_el;
            if (!option.search_match) {
                return '';
            }
            if (!this.include_option_in_results(option)) {
                return '';
            }
            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);
            }
            option_el = document.createElement("li");
            option_el.className = classes.join(" ");
            option_el.style.cssText = option.style;
            option_el.setAttribute("data-option-array-index", option.array_index);
            option_el.innerHTML = option.search_text;
            if (option.title) {
                option_el.title = option.title;
            }
            return this.outerHTML(option_el);
        };

        AbstractChosen.prototype.result_add_group = function (group) {
            var classes, group_el;
            if (!(group.search_match || group.group_match)) {
                return '';
            }
            if (!(group.active_options > 0)) {
                return '';
            }
            classes = [];
            classes.push("group-result");
            if (group.classes) {
                classes.push(group.classes);
            }
            group_el = document.createElement("li");
            group_el.className = classes.join(" ");
            group_el.innerHTML = group.search_text;
            if (group.title) {
                group_el.title = group.title;
            }
            return this.outerHTML(group_el);
        };

        AbstractChosen.prototype.results_update_field = function () {
            this.set_default_text();
            if (!this.is_multiple) {
                this.results_reset_cleanup();
            }
            this.result_clear_highlight();
            this.results_build();
            if (this.results_showing) {
                return this.winnow_results();
            }
        };

        AbstractChosen.prototype.reset_single_select_options = function () {
            var result, _i, _len, _ref, _results;
            _ref = this.results_data;
            _results = [];
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                result = _ref[_i];
                if (result.selected) {
                    _results.push(result.selected = false);
                } else {
                    _results.push(void 0);
                }
            }
            return _results;
        };

        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.winnow_results = function () {
            var escapedSearchText, option, regex, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
            this.no_results_clear();
            results = 0;
            searchText = this.get_search_text();
            escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
            zregex = new RegExp(escapedSearchText, 'i');
            regex = this.get_search_regex(escapedSearchText);
            _ref = this.results_data;
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                option = _ref[_i];
                option.search_match = false;
                results_group = null;
                if (this.include_option_in_results(option)) {
                    if (option.group) {
                        option.group_match = false;
                        option.active_options = 0;
                    }
                    if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
                        results_group = this.results_data[option.group_array_index];
                        if (results_group.active_options === 0 && results_group.search_match) {
                            results += 1;
                        }
                        results_group.active_options += 1;
                    }
                    option.search_text = option.group ? option.label : option.html;
                    if (!(option.group && !this.group_search)) {
                        option.search_match = this.search_string_match(option.search_text, regex);
                        if (option.search_match && !option.group) {
                            results += 1;
                        }
                        if (option.search_match) {
                            if (searchText.length) {
                                startpos = option.search_text.search(zregex);
                                text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
                                option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
                            }
                            if (results_group != null) {
                                results_group.group_match = true;
                            }
                        } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
                            option.search_match = true;
                        }
                    }
                }
            }
            this.result_clear_highlight();
            if (results < 1 && searchText.length) {
                this.update_results_content("");
                return this.no_results(searchText);
            } else {
                this.update_results_content(this.results_option_build());
                return this.winnow_results_set_highlight();
            }
        };

        AbstractChosen.prototype.get_search_regex = function (escaped_search_string) {
            var regex_anchor;
            regex_anchor = this.search_contains ? "" : "^";
            return new RegExp(regex_anchor + escaped_search_string, 'i');
        };

        AbstractChosen.prototype.search_string_match = function (search_string, regex) {
            var part, parts, _i, _len;
            if (regex.test(search_string)) {
                return true;
            } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
                parts = search_string.replace(/\[|\]/g, "").split(" ");
                if (parts.length) {
                    for (_i = 0, _len = parts.length; _i < _len; _i++) {
                        part = parts[_i];
                        if (regex.test(part)) {
                            return true;
                        }
                    }
                }
            }
        };

        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.clipboard_event_checker = function (evt) {
            var _this = this;
            return setTimeout((function () {
                return _this.results_search();
            }), 50);
        };

        AbstractChosen.prototype.container_width = function () {
            if (this.options.width != null) {
                return this.options.width;
            } else {
                return "" + this.form_field.offsetWidth + "px";
            }
        };

        AbstractChosen.prototype.include_option_in_results = function (option) {
            if (this.is_multiple && (!this.display_selected_options && option.selected)) {
                return false;
            }
            if (!this.display_disabled_options && option.disabled) {
                return false;
            }
            if (option.empty) {
                return false;
            }
            return true;
        };

        AbstractChosen.prototype.search_results_touchstart = function (evt) {
            this.touch_started = true;
            return this.search_results_mouseover(evt);
        };

        AbstractChosen.prototype.search_results_touchmove = function (evt) {
            this.touch_started = false;
            return this.search_results_mouseout(evt);
        };

        AbstractChosen.prototype.search_results_touchend = function (evt) {
            if (this.touch_started) {
                return this.search_results_mouseup(evt);
            }
        };

        AbstractChosen.prototype.outerHTML = function (element) {
            var tmp;
            if (element.outerHTML) {
                return element.outerHTML;
            }
            tmp = document.createElement("div");
            tmp.appendChild(element);
            return tmp.innerHTML;
        };

        AbstractChosen.browser_is_supported = function () {
            if (window.navigator.appName === "Microsoft Internet Explorer") {
                return document.documentMode >= 8;
            }
            if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
                return false;
            }
            if (/Android/i.test(window.navigator.userAgent)) {
                if (/Mobile/i.test(window.navigator.userAgent)) {
                    return false;
                }
            }
            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;

    })();

    $ = jQuery;

    $.fn.extend({
        chosen: function (options) {
            if (!AbstractChosen.browser_is_supported()) {
                return this;
            }
            return this.each(function (input_field) {
                var $this, chosen;
                $this = $(this);
                chosen = $this.data('chosen');
                if (options === 'destroy' && chosen instanceof Chosen) {
                    chosen.destroy();
                } else if (!(chosen instanceof Chosen)) {
                    $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("chosen-rtl");
        };

        Chosen.prototype.set_up_html = function () {
            var container_classes, container_props;
            container_classes = ["chosen-container"];
            container_classes.push("chosen-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("chosen-rtl");
            }
            container_props = {
                'class': container_classes.join(' '),
                'style': "width: " + (this.container_width()) + ";",
                'title': this.form_field.title
            };
            if (this.form_field.id.length) {
                container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
            }
            this.container = $("<div />", container_props);
            if (this.is_multiple) {
                this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
            } else {
                this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
            }
            this.form_field_jq.hide().after(this.container);
            this.dropdown = this.container.find('div.chosen-drop').first();
            this.search_field = this.container.find('input').first();
            this.search_results = this.container.find('ul.chosen-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.chosen-choices').first();
                this.search_container = this.container.find('li.search-field').first();
            } else {
                this.search_container = this.container.find('div.chosen-search').first();
                this.selected_item = this.container.find('.chosen-single').first();
            }
            this.results_build();
            this.set_tab_index();
            return this.set_label_behavior();
        };

        Chosen.prototype.on_ready = function () {
            return this.form_field_jq.trigger("chosen:ready", {
                chosen: this
            });
        };

        Chosen.prototype.register_observers = function () {
            var _this = this;
            this.container.bind('touchstart.chosen', function (evt) {
                _this.container_mousedown(evt);
                return evt.preventDefault();
            });
            this.container.bind('touchend.chosen', function (evt) {
                _this.container_mouseup(evt);
                return evt.preventDefault();
            });
            this.container.bind('mousedown.chosen', function (evt) {
                _this.container_mousedown(evt);
            });
            this.container.bind('mouseup.chosen', function (evt) {
                _this.container_mouseup(evt);
            });
            this.container.bind('mouseenter.chosen', function (evt) {
                _this.mouse_enter(evt);
            });
            this.container.bind('mouseleave.chosen', function (evt) {
                _this.mouse_leave(evt);
            });
            this.search_results.bind('mouseup.chosen', function (evt) {
                _this.search_results_mouseup(evt);
            });
            this.search_results.bind('mouseover.chosen', function (evt) {
                _this.search_results_mouseover(evt);
            });
            this.search_results.bind('mouseout.chosen', function (evt) {
                _this.search_results_mouseout(evt);
            });
            this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function (evt) {
                _this.search_results_mousewheel(evt);
            });
            this.search_results.bind('touchstart.chosen', function (evt) {
                _this.search_results_touchstart(evt);
            });
            this.search_results.bind('touchmove.chosen', function (evt) {
                _this.search_results_touchmove(evt);
            });
            this.search_results.bind('touchend.chosen', function (evt) {
                _this.search_results_touchend(evt);
            });
            this.form_field_jq.bind("chosen:updated.chosen", function (evt) {
                _this.results_update_field(evt);
            });
            this.form_field_jq.bind("chosen:activate.chosen", function (evt) {
                _this.activate_field(evt);
            });
            this.form_field_jq.bind("chosen:open.chosen", function (evt) {
                _this.container_mousedown(evt);
            });
            this.form_field_jq.bind("chosen:close.chosen", function (evt) {
                _this.input_blur(evt);
            });
            this.search_field.bind('blur.chosen', function (evt) {
                _this.input_blur(evt);
            });
            this.search_field.bind('keyup.chosen', function (evt) {
                _this.keyup_checker(evt);
            });
            this.search_field.bind('keydown.chosen', function (evt) {
                _this.keydown_checker(evt);
            });
            this.search_field.bind('focus.chosen', function (evt) {
                _this.input_focus(evt);
            });
            this.search_field.bind('cut.chosen', function (evt) {
                _this.clipboard_event_checker(evt);
            });
            this.search_field.bind('paste.chosen', function (evt) {
                _this.clipboard_event_checker(evt);
            });
            if (this.is_multiple) {
                return this.search_choices.bind('click.chosen', function (evt) {
                    _this.choices_click(evt);
                });
            } else {
                return this.container.bind('click.chosen', function (evt) {
                    evt.preventDefault();
                });
            }
        };

        Chosen.prototype.destroy = function () {
            $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
            if (this.search_field[0].tabIndex) {
                this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
            }
            this.container.remove();
            this.form_field_jq.removeData('chosen');
            return this.form_field_jq.show();
        };

        Chosen.prototype.search_field_disabled = function () {
            this.is_disabled = this.form_field_jq[0].disabled;
            if (this.is_disabled) {
                this.container.addClass('chosen-disabled');
                this.search_field[0].disabled = true;
                if (!this.is_multiple) {
                    this.selected_item.unbind("focus.chosen", this.activate_action);
                }
                return this.close_field();
            } else {
                this.container.removeClass('chosen-disabled');
                this.search_field[0].disabled = false;
                if (!this.is_multiple) {
                    return this.selected_item.bind("focus.chosen", 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("");
                        }
                        $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action);
                        this.results_show();
                    } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-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;
            if (evt.originalEvent) {
                delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
            }
            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("chosen-container-active")) {
                return this.close_field();
            }
        };

        Chosen.prototype.close_field = function () {
            $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
            this.active_field = false;
            this.results_hide();
            this.container.removeClass("chosen-container-active");
            this.clear_backstroke();
            this.show_search_field_default();
            return this.search_field_scale();
        };

        Chosen.prototype.activate_field = function () {
            this.container.addClass("chosen-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) {
            var active_container;
            active_container = $(evt.target).closest('.chosen-container');
            if (active_container.length && this.container[0] === active_container[0]) {
                return this.active_field = true;
            } else {
                return this.close_field();
            }
        };

        Chosen.prototype.results_build = function () {
            this.parsing = true;
            this.selected_option_count = null;
            this.results_data = 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.single_set_selected_text();
                if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
                    this.search_field[0].readOnly = true;
                    this.container.addClass("chosen-container-single-nosearch");
                } else {
                    this.search_field[0].readOnly = false;
                    this.container.removeClass("chosen-container-single-nosearch");
                }
            }
            this.update_results_content(this.results_option_build({
                first: true
            }));
            this.search_field_disabled();
            this.show_search_field_default();
            this.search_field_scale();
            return this.parsing = false;
        };

        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("chosen:maxselected", {
                    chosen: this
                });
                return false;
            }
            this.container.addClass("chosen-with-drop");
            this.results_showing = true;
            this.search_field.focus();
            this.search_field.val(this.search_field.val());
            this.winnow_results();
            return this.form_field_jq.trigger("chosen:showing_dropdown", {
                chosen: this
            });
        };

        Chosen.prototype.update_results_content = function (content) {
            return this.search_results.html(content);
        };

        Chosen.prototype.results_hide = function () {
            if (this.results_showing) {
                this.result_clear_highlight();
                this.container.removeClass("chosen-with-drop");
                this.form_field_jq.trigger("chosen:hiding_dropdown", {
                    chosen: this
                });
            }
            return this.results_showing = false;
        };

        Chosen.prototype.set_tab_index = function (el) {
            var ti;
            if (this.form_field.tabIndex) {
                ti = this.form_field.tabIndex;
                this.form_field.tabIndex = -1;
                return this.search_field[0].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.bind('click.chosen', 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>" + (this.choice_label(item)) + "</span>");
            if (item.disabled) {
                choice.addClass('search-choice-disabled');
            } else {
                close_link = $('<a />', {
                    "class": 'search-choice-close',
                    'data-option-array-index': item.array_index
                });
                close_link.bind('click.chosen', 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) {
            var del = confirm("Sure to Delete?");
            if (this.result_deselect(link[0].getAttribute("data-option-array-index")) && del) {
                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.reset_single_select_options();
            this.form_field.options[0].selected = true;
            this.single_set_selected_text();
            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, item;
            if (this.result_highlight) {
                high = this.result_highlight;
                this.result_clear_highlight();
                if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
                    this.form_field_jq.trigger("chosen:maxselected", {
                        chosen: this
                    });
                    return false;
                }
                if (this.is_multiple) {
                    high.removeClass("active-result");
                } else {
                    this.reset_single_select_options();
                }
                high.addClass("result-selected");
                item = this.results_data[high[0].getAttribute("data-option-array-index")];
                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.single_set_selected_text(this.choice_label(item));
                }
                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;
                evt.preventDefault();
                return this.search_field_scale();
            }
        };

        Chosen.prototype.single_set_selected_text = function (text) {
            if (text == null) {
                text = this.default_text;
            }
            if (text === this.default_text) {
                this.selected_item.addClass("chosen-default");
            } else {
                this.single_deselect_control_build();
                this.selected_item.removeClass("chosen-default");
            }
            return this.selected_item.find("span").html(text);
        };

        Chosen.prototype.result_deselect = function (pos) {
            var 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;
                this.result_clear_highlight();
                if (this.results_showing) {
                    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("chosen-single-with-deselect");
        };

        Chosen.prototype.get_search_text = function () {
            return $('<div/>').text($.trim(this.search_field.val())).html();
        };

        Chosen.prototype.winnow_results_set_highlight = function () {
            var do_high, selected_results;
            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);
            this.search_results.append(no_results_html);
            return this.form_field_jq.trigger("chosen:no_results", {
                chosen: this
            });
        };

        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:
                    if (this.results_showing) {
                        evt.preventDefault();
                    }
                    break;
                case 32:
                    if (this.disable_search) {
                        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, f_width, 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();
                f_width = this.container.outerWidth();
                if (w > f_width - 10) {
                    w = f_width - 10;
                }
                return this.search_field.css({
                    'width': w + 'px'
                });
            }
        };

        return Chosen;

    })(AbstractChosen);

}).call(this);
chosenImage.jquery.js

JavaScript:
/*
* Chosen jQuery plugin to add an image to the dropdown items.
*/
(function ($) {
    $.fn.chosenImage = function (options) {
        return this.each(function () {
            var $select = $(this);
            var imgMap = {};
            var ids = {};
            var post_field = "default_post_field_name";

            if (options.post_field != undefined && options.post_field != '') {
                post_field = options.post_field;
            }
            $select.parent().append("<input type='hidden' id='" + post_field + "' name='" + post_field + "' value='' />");
            // 1. Retrieve img-src from data attribute and build object of image sources for each list item.
            $select.find('option').filter(function () {
                return $(this).text();
            }).each(function (i) {
                imgMap[i] = $(this).attr('data-img-src');
                ids[i] = $(this).attr('value');
            });
            // 2. Execute chosen plugin and get the newly created chosen container.
            $select.chosen(options);
            var $chosen = $select.next('.chosen-container').addClass('chosenImage-container');

            // 3. Style lis with image sources.
            $chosen.on('mousedown.chosen, keyup.chosen, click.chosen', function (event) {
                $chosen.find('.chosen-results li.result-selected, .chosen-results li.active-result').each(function () {
                    var imgIndex = $(this).attr("data-option-array-index");
                    $(this).css(cssObj(imgMap[imgIndex]));
                });
            });

            // 4. Change image on chosen selected element when form changes.
            $select.change(function () {
                var selected_html = [];
                $chosen.find('li.search-choice').each(function () {
                    var imgIndex = $(this).find('a.search-choice-close').attr("data-option-array-index");
                    $(this).find('a.search-choice-close').click(function(){
                        update_ids();
                    });
                    $(this).css(cssObj(imgMap[imgIndex]));
                    // Generate selected ids
                    selected_html.push(ids[imgIndex]);
                });
                $("#" + post_field).val(selected_html.join(","));

            });
            $select.trigger('change');

            // Utilties
            function cssObj(imgSrc) {
                var bgImg = (imgSrc) ? 'url(' + imgSrc + ')' : 'none';
                return {'background-image': bgImg};
            }
          
            function update_ids(){
                var selected_html = [];
                $chosen.find('li.search-choice').each(function () {
                    var imgIndex = $(this).find('a.search-choice-close').attr("data-option-array-index");
                    // Generate selected ids
                    selected_html.push(ids[imgIndex]);
                });
                $("#" + post_field).val(selected_html.join(","));
            }
        });
    };
})(jQuery);
But I can not solve the problem because I do not understand as much as you.

Web links related to files are:






If you are eligible, you will look. If not, it's okay. Nevertheless, thank you.
 
Last edited:
Top