// This file should be included *after* jquery.smartsearch.js
(function ($) {

    // Select Options Searchlet
    $.fn.smartsearch.searchlets.select_options = function (searchlet_name, description, update_delay) {
        $.fn.smartsearch.searchlets.base.call(this, searchlet_name, description, update_delay);
        var name_searchlet = $(this).attr("searchlet_name");
        var id_searchlet = $($("#"+name_searchlet+"-searchlet").find("select")[0]).attr("id");
        if(id_searchlet != null) {
            var id_searchlet_split = id_searchlet.split('__');
            if (id_searchlet_split.length == 2){
                this.operator = id_searchlet_split[1];
            }
        }
        if (this.operator == null) {
            this.operator = 'exact';
        }


    };
    $.fn.smartsearch.searchlets.select_options.prototype = new $.fn.smartsearch.searchlets.base;

    $.fn.smartsearch.searchlets.select_options.prototype.init = function () {
        var searchlet = this.searchlet;
        var description = this.description;
        var operator = this.operator;

        // When typing on the search term update the query
        $(".search-term", searchlet).change(function (event) {
                var search_term = this;
                var name = $(this).attr("name");
                var attr = name.substring(0, name.lastIndexOf("__"));

                var query_arg = {
                    attr: attr,
                    operator: operator,
                    value: $(search_term).val(),
                    description: description,
                    dom: null
                };
                searchlet.trigger("query_arg_updated", query_arg);
            });
    };

    $.fn.smartsearch.searchlets.select_options.prototype.render_value = function (value) {
        return this.searchlet.find("option[value=" + value + "]").html();
    };

    $.fn.smartsearch.searchlets.select_options.prototype.select = function (query_arg) {
        var value = query_arg.value;
        this.searchlet.find("option[value=" + value + "]").attr("selected", "selected");
        this.searchlet.find("select").triggerHandler('change');
    };

    $.fn.smartsearch.searchlets.select_options.prototype.remove = function (query_arg) {
        this.searchlet.find("option").removeAttr("selected");
    };

    $.fn.smartsearch.searchlets.select_options.prototype.submit = function (query_arg, form) {
        //this.select(query_arg);
    };


    // Multiple Options Single Select earchlet
    $.fn.smartsearch.searchlets.multiple_options_single_select = function (searchlet_name, description, update_delay) {
        $.fn.smartsearch.searchlets.select_options.call(this, searchlet_name, description, update_delay);
        this.operator = 'in';
    };
    $.fn.smartsearch.searchlets.multiple_options_single_select.prototype = new $.fn.smartsearch.searchlets.select_options;

    $.fn.smartsearch.searchlets.multiple_options_single_select.prototype.render_value = function (value) {
        var searchlet = this.searchlet;
        var text_value = $.map(value, function (val, i) {
                return $("option[value=" + val + "]", searchlet).html();
            });
        return text_value.join(", ");
    };

    $.fn.smartsearch.searchlets.multiple_options_single_select.prototype.select = function (query_arg) {
        for (var i=0; i<query_arg.value.length; i++) {
            var val = query_arg.value[i];
            this.searchlet.find("option[value=" + val + "]").attr("selected", "selected");
        }
    };

    // Checkbox Options searchlet
    $.fn.smartsearch.searchlets.checkbox_options = function (searchlet_name, description, update_delay) {
        $.fn.smartsearch.searchlets.base.call(this, searchlet_name, description, update_delay);
    };
    $.fn.smartsearch.searchlets.checkbox_options.prototype = new $.fn.smartsearch.searchlets.base;

    $.fn.smartsearch.searchlets.checkbox_options.prototype.init = function () {
        var searchlet = this.searchlet;
        var description = this.description;
	var search_term = $(".search-term", searchlet);

        search_term.find("input").click(function (event) {
                var name = search_term.attr("name");
                var values = $.map(search_term.find("input[checked]"), function (checkbox) {
                        return $(checkbox).val();
                    });
                var query_arg = {
                    attr: name,
                    operator: 'in',
                    value: values,
                    description: description,
                    dom: null
                };
                searchlet.trigger("query_arg_updated", query_arg);
            });
    };

    $.fn.smartsearch.searchlets.checkbox_options.prototype.render_value = function (value) {
        var searchlet = this.searchlet;
        var searchlet_name = this.searchlet_name;
        var names = $.map(value, function (val,i) {
                return searchlet.find("span.label_" + searchlet_name + "_" + val).html();
            });
        return names.join(", ");
    };

    $.fn.smartsearch.searchlets.checkbox_options.prototype.select = function (query_arg) {
        _this = this;
        $.each(query_arg.value, function (i, val) {
            _this.searchlet.find("input[value="+val+"]").attr("checked", "checked");
        });
    };

    $.fn.smartsearch.searchlets.checkbox_options.prototype.remove = function (query_arg) {
        _this = this;
        var names = $.each(query_arg.value, function (i, val) {
                return $("#id_" + _this.searchlet_name + "_" + val).click();
            });
    };

    // Radiobuttons Options searchlet
    $.fn.smartsearch.searchlets.radiobuttons_options = function (searchlet_name, description, update_delay) {
        $.fn.smartsearch.searchlets.checkbox_options.call(this, searchlet_name, description, update_delay);
    };
    $.fn.smartsearch.searchlets.radiobuttons_options.prototype = new $.fn.smartsearch.searchlets.checkbox_options;

    $.fn.smartsearch.searchlets.radiobuttons_options.prototype.remove = function (query_arg) {
        var searchlet_name = this.searchlet_name;
        var names = $.each(query_arg.value, function (i, val) {
                $("#id_" + searchlet_name + "_" + val).removeAttr("checked");
            });
    };

    // Datei10n Options searchlet
    $.fn.smartsearch.searchlets.datei10n = function (searchlet_name, description, update_delay) {
        $.fn.smartsearch.searchlets.text.call(this, searchlet_name, description, update_delay);
    };
    $.fn.smartsearch.searchlets.datei10n.prototype = new $.fn.smartsearch.searchlets.text;

    $.fn.smartsearch.searchlets.datei10n.prototype.submit = function (query_arg, form) {
        query_arg.value = getISODateFromLocalDate(query_arg.value);
        var name = query_arg.attr + '__' + query_arg.operator;
        var hidden = "<input type='hidden' name='" + name + "' value='" + query_arg.value + "'/>";
        form.find("input[name="+query_arg.attr+"]").val(query_arg.value);
        form.append(hidden);
    };

    $.fn.smartsearch.searchlets.citysearchlet = function (searchlet_name, description, update_delay) {
        $.fn.smartsearch.searchlets.select_options.call(this, searchlet_name, description, update_delay);
        this.basedescription = description;
    };

    $.fn.smartsearch.searchlets.citysearchlet.prototype = new $.fn.smartsearch.searchlets.select_options;

    $.fn.smartsearch.searchlets.citysearchlet.prototype.init = function () {
        var searchlet = this.searchlet;
        var description = this.description;
        var basedescription = this.basedescription;
        var operator = this.operator;

        function update_searchlet() {
                var search_term = searchlet.find('select');
                var name = searchlet.find('select').attr("name");
                var attr = name.substring(0, name.lastIndexOf("__"));
	        var distance = searchlet.find('input[name=distance__' + attr + ']');
                if (distance.val()) {
                    description = basedescription + ' -'
                                  + '<strong class="distanceLink">' + distance.val() + '</strong> (' 
                                  + distance.prev('input[type=hidden]').val() +  ')- ';
                } else {
                    description = basedescription;
                }

                var query_arg = {
                    attr: attr,
                    operator: operator,
                    value: $(search_term).val(),
                    description: description,
                    dom: null
                };
                searchlet.trigger("query_arg_updated", query_arg);
                if ($(search_term).val()) {
                    searchlet.find("div.extended-city-options").removeClass('print-disabled');
                    distance.removeAttr('disabled');
                } else {
                    searchlet.find("div.extended-city-options").addClass('print-disabled');
                    searchlet.find("input[type=text]").attr('disabled', 'disabled');
                }
        }

        function checkkey(event) {
            key = event.keyCode;
            var value = parseInt(String.fromCharCode(key))
            if (key == 46) return;
            if (key >= 8 && key <= 9) return;
            if (key >= 37 && key <= 40) return;
            if (key >= 112 && key <= 130) return;
            if (key >= 96 && key <= 105) return;
            if (value >=0 && value <= 9) return;
            return false;
        }

        // When typing on the search term update the query
        $(".search-term", searchlet).change(update_searchlet).keyup(update_searchlet).keydown(checkkey);
        update_searchlet();
    };

    $.fn.smartsearch.searchlets.citysearchlet.prototype.remove = function (query_arg) {
        this.searchlet.find("input.extended-radio-option[value=1]").attr("checked","checked");
        this.searchlet.find("input.extended-distance-field").val("");
        this.searchlet.find("div.extended-city-options").addClass('print-disabled');
        this.searchlet.find("input[type=text]").attr('disabled', 'disabled');
        $.fn.smartsearch.searchlets.select_options.prototype.remove.call(this, query_arg);
    };
})(jQuery);
