ajax_filtered_fields = { request_url: "/ajax_filtered_fields/json_index/", data_loaded: "data_loaded", _appendOption: function(obj, selector) { // append a json data row as an option to the selector var option = $(''); option.attr({value: obj[0]}); option.appendTo(selector); return option; }, _removeOptions: function(selector) { // remove all options from selector selector.children("option").each(function(i) { $(this).remove(); }); }, getManyToManyJSON: function(element_id, app_label, object_name, lookup_string, select_related) { // manage the ManyToMany ajax request var selector_from = $("#" + element_id + "_from"); var selector_to = $("#" + element_id + "_to"); $("#" + element_id + "_input").val(""); selector_from.attr("disabled", true); selector_to.attr("disabled", true); this._removeOptions(selector_from); $.getJSON(this.request_url, { app_label: app_label, object_name: object_name, lookup_string: lookup_string, select_related: select_related}, function(data){ $.each(data, function(i, obj){ var option_is_selected = selector_to.children("option[value='" + obj[0] + "']").length; if (!option_is_selected) { ajax_filtered_fields._appendOption(obj, selector_from); }; }); SelectBox.init(element_id + "_from"); selector_from.attr("disabled", false); selector_to.attr("disabled", false); selector_from.trigger(ajax_filtered_fields.data_loaded); }); }, getForeignKeyJSON: function(element_id, app_label, object_name, lookup_string, select_related) { // manage the ForeignKey ajax request var selector = $("#" + element_id); var hidden = $("#hidden-" + element_id); $("#" + element_id + "_input").val(""); selector.attr("disabled", true); this._removeOptions(selector); $.getJSON(this.request_url, { app_label: app_label, object_name: object_name, lookup_string: lookup_string, select_related: select_related}, function(data){ var selection = hidden.val(); ajax_filtered_fields._appendOption(new Array("", "---------"), selector); $.each(data, function(i, obj){ ajax_filtered_fields._appendOption(obj, selector); }); selector.children("option[value='" + selection + "']").attr("selected", "selected"); selector.attr("disabled", false); SelectBox.init(element_id); ajax_filtered_fields.bindForeignKeyOptions(element_id); selector.trigger(ajax_filtered_fields.data_loaded); }); }, bindForeignKeyOptions: function(element_id) { // bind the dummy options to the hidden field that do the work var selector = $("#" + element_id); var hidden = $("#hidden-" + element_id); selector.change(function(e) { hidden.val($(this).val()); }); } };