// Generated by CoffeeScript 1.4.0
(function ($) {
    return $.fn.ajaxChosen = function (settings, callback, chosenOptions) {

        var chosenXhr, defaultOptions, options, select;
        if (settings == null) {
            settings = {};
        }
        if (chosenOptions == null) {
            chosenOptions = {};
        }
        defaultOptions = {
            minTermLength: 0,
            afterTypeDelay: 500,
            addSearchTermOnNorecord: 0,
            noLocationUrl: 0,
            jsonTermKey: "term",
            jsonTermKeyObject: "term",

            keepTypingMsg: "Keep typing...",
            lookingForMsg: "Looking for"
        };
        select = this;

        chosenXhr = null;
        options = $.extend({}, defaultOptions, $(select).data(), settings);
        this.chosen(chosenOptions ? chosenOptions : {});
        return this.each(function () {

            return $(this).next('.geodir-chosen-container').find(".search-field > input, .chosen-search > input").bind('keyup', function () {

                var field, msg, success, untrimmed_val, val;

                //select = $(this).closest('select');

                untrimmed_val = $(this).val();
                val = $.trim($(this).val());
                msg = val.length < options.minTermLength ? options.keepTypingMsg : options.lookingForMsg + (" '" + val + "'");
                select.next('.geodir-chosen-container').find('.no-results').text(msg);
                /*if (val === $(this).data('prevVal') && val != '') {
                 return false;
                 }*/

                $(this).data('prevVal', val);
                if (this.timer) {
                    clearTimeout(this.timer);
                }
                if (val.length < options.minTermLength) {
                    return false;
                }

                if (val.length == 0) {
                    // clear the entire list
                    select.find('option').each(function () {
                        return $(this).remove();
                    });
                    $("<option />").attr('value', '').html('').appendTo(select);
                    select.trigger("chosen:updated");
                    //return false;
                }
                field = $(this);
                //alert(field.val())

                if (options.data == null) {
                    options.data = {};
                }
                options.data[options.jsonTermKey] = val;


                if (options.dataCallback != null) {
                    options.data = options.dataCallback(options.data);
                }

                success = options.success;
                if (options.success == null) {
                    options.success = function (data) {
                        //alert('success');

                        var items, nbItems, selected_values;
                        if (data == null) {
                            return;
                        }
                        selected_values = [];
                        select.find('option').each(function () {

                            if (!$(this).is(":selected")) {
                                // if($(this).val() != 0 )
                                return $(this).remove();
                            } else {
                                return selected_values.push($(this).val() + "-" + $(this).text());
                            }
                        });
                        select.find('optgroup:empty').each(function () {
                            return $(this).remove();
                        });
                        items = callback != null ? callback(data, field) : data;
                        nbItems = 0;
                        $.each(items, function (i, element) {
                            //alert(element);
                            var group, text, value;
                            nbItems++;
                            if (element.group) {
                                group = select.find("optgroup[label='" + element.text + "']");
                                if (!group.size()) {
                                    group = $("<optgroup />");
                                }
                                group.attr('label', element.text).appendTo(select);
                                return $.each(element.items, function (i, element) {
                                    var text, value;
                                    if (typeof element === "string") {
                                        value = i;
                                        text = element;
                                    } else {
                                        value = element.value;
                                        text = element.text;
                                    }
                                    if ($.inArray(value + "-" + text, selected_values) === -1) {
                                        return $("<option />").attr('value', value).html(text).appendTo(group);
                                    }
                                });
                            } else {

                                if (typeof element === "string") {
                                    value = i;
                                    text = element;
                                } else {
                                    value = element.value;
                                    text = element.text;
                                }
                                if ($.inArray(value + "-" + text, selected_values) === -1) {
                                    return $("<option />").attr('value', value).html(text).appendTo(select);
                                }
                            }
                        });

                        if (nbItems) {
                            select.trigger("chosen:updated");
                        } else {
                            select.data().chosen.no_results_clear();
                            select.data().chosen.no_results(field.val());
                        }
                        if (settings.success != null) {
                            settings.success(data);
                        }
                        //alert(untrimmed_val)
                        // return field.val(untrimmed_val);
                    };
                }

                return this.timer = setTimeout(function () {

                    if (chosenXhr) {
                        chosenXhr.abort();
                    }

                    return chosenXhr = $.ajax(options);
                }, options.afterTypeDelay);
            });
        });
    };
})(jQuery);
