(function ($) {
    $.fn.selectChain = function (options) {
        var defaults = {
            key: "id",
            value: "label",
            selector: "selected"
        };

        var settings = $.extend({}, defaults, options);

        if (!(settings.target instanceof $)) settings.target = $(settings.target);

        return this.each(function () {
            var $$ = $(this);

            $$.change(function () {
                var data = null;

                document.getElementById("search-loading").style.display = "block";
                //document.getElementById("search-loading").innerHTML = "go<img src='/images/ajax-loader.gif' />";

                if (typeof settings.data == 'string') {
                    data = settings.data + '&' + this.name + '=' + $$.val();
                } else if (typeof settings.data == 'object') {
                    data = settings.data;
                    data[this.name] = $$.val();
                }

                settings.target.empty();

                $.ajax({
                    url: settings.url,
                    data: data,
                    type: (settings.type || 'get'),
                    dataType: 'json',
                    success: function (j) {
                        var options = [], i = 0, o = null;

                        for (i = 0; i < j.length; i++) {
                            // required to get around IE bug (http://support.microsoft.com/?scid=kb%3Ben-us%3B276228)
                            o = document.createElement("OPTION");
                            o.value = typeof j[i] == 'object' ? j[i][settings.key] : j[i];
                            o.text = typeof j[i] == 'object' ? j[i][settings.value] : j[i];
                            o.id = "poption" + j[i][settings.key];
                            if (j[i][settings.selector] == 'true') {
                                var poptionselector = "poption" + j[i][settings.key];
                                var popoptionid = j[i][settings.key];
                            }
                            settings.target.get(0).options[i] = o;
                        }

			// hand control back to browser for a moment
			setTimeout(function () {
			    settings.target
                               .find("#"+poptionselector)
                               .attr('selected', 'selected')
                               .parent('select')
                               .trigger('change');
			}, 0);
                        
                        if (!$("#"+poptionselector+" option:selected").length) {
                            $("#"+poptionselector+" option[value='"+popoptionid+"']").attr('selected', 'selected');
                        }


                        document.getElementById("search-loading").style.display = "none";
                    },
                    error: function (xhr, desc, er) {
			//alert("an error occurred");
                    }

                });
                
            });
        });
    };
})(jQuery);
