(function ($) {
    $.fn.selectChain = function (options) {
        var defaults = {
            key: "id",
            value: "label"
        };
        var settings = $.extend({}, defaults, options);
        if (!(settings.target instanceof $)) settings.target = $(settings.target);
        return this.each(function () {
            var $$ = $(this);
			var selectedIdx = 0;

            $$.change(function () {
                var data = null;
                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;
						if (j.length>0){
							o = document.createElement("OPTION");
							o.value = settings.firstkey;
							o.text = settings.firstvalue;
							settings.target.get(0).options[0] = o;
							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];
								if ($(settings.selectedfrom).val()==o.value){
									selectedIdx = i+1;
								}
								settings.target.get(0).options[i+1] = o;
							}
						}else{
							o = document.createElement("OPTION");
							o.value = settings.blankkey;
							o.text = settings.blankvalue;
							settings.target.get(0).options[0] = o;
							window.status = 'none';
						}
						settings.target.selectedIndex = selectedIdx;

						setTimeout(function () {
							settings.target
							.find('option:eq('+selectedIdx+')')
							.attr('selected', 'selected')
							.parent('select')
							.trigger('load');
						}, 0);
					},
                    error: function (xhr, desc, er) {
//						alert("an error occurred");
                    }
                });
            });
        });
    };
})(jQuery);


