(function ($) {
	$.fn.selectChain = function (options) {
		var defaults = {
							key: "id",
							value: "text",
							initialparent: false,
							setvalue: false
		};
		var settings = $.extend({}, defaults, options);
		if (!(settings.target instanceof $)) settings.target = $(settings.target);
		return this.each(function () {
			var $$ = $(this);
			$$.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;
						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");
							if ( typeof j[i] == 'object' )
							{
								o.value = j[i][settings.key];
								o.text = j[i][settings.value];
							}
							else
							{
								o.value = j[i];
								o.text = j[i];
							}
							settings.target.get(0).options[i] = o;
						}
						// hand control back to browser for a moment
						setTimeout(function () {
							settings.target
											.find('option:first')
											.attr('selected', 'selected')
											.parent('select')
											.trigger('change');
						}, 0);
						if ( settings.setvalue !== false )
							settings.target.val(settings.setvalue).attr("selected", "selected");
					},
					error: function (xhr, desc, er) {
						// add whatever debug you want here.
						// alert("an error occurred");
					}
				});
			});
		});
	};
})(jQuery);

