(function ($) {
    $.fn.selectChain = function (options) {
        var defaults = {
            key: "value",
            value: "label"
        };
        
        var settings = $.extend({}, defaults, options);
        
        if (!(settings.target instanceof $)) settings.target = $(settings.target);
        
        return this.each(function () {
            var $$ = $(this);
            
            $$.change(function () {
            	
            	if (settings.startCallback)
            		settings.startCallback();
            	
            	// Wenn dieses Element deaktiviert ist oder keine Optionen 
            	// enthält beziehe die ID aus dem alternativeSource Element
            	var paramValue = (this.disabled || this.options.length == 0 || $$.val() == "0") 
            		? settings.alternativeSource.val() : $$.val();
            	
                var data = null;
                if (typeof settings.data == 'string') {
                    data = settings.data + '&' + this.name + '=' + paramValue;
                } else if (typeof settings.data == 'object') {
                    data = settings.data;
                    data[this.name] = paramValue;
                }
                
                settings.target.empty();
                var o = document.createElement("OPTION");
                o.value = "";
                o.text = "...";

                settings.target.get(0).options[0] = o;
                
                var ajaxUrl = settings.url.replace(/{subUrl}/,settings.subUrl).replace(/{param}/,paramValue);
                
                $.ajax({
                    url: ajaxUrl,
                    data: data,
                    type: (settings.type || 'get'),
                    dataType: 'json',
                    success: function (j) {
                        var options = [], i = 0, o = null;
                        
                        settings.target.empty();
                        var myTarget = settings.target.get(0);
                        
                        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];
                            myTarget.options[i] = o;
                        }
                        
                        myTarget.disabled = myTarget.options.length == 0;
                        
						// hand control back to browser for a moment
						setTimeout(function () {
							// change event muss manuell getriggert werden
							if (myTarget.disabled)
							{
							    settings.target.trigger('change');
							}
							else
							{
							    settings.target
				                                .find('option:first')
				                                .attr('selected', 'selected')
				                                .parent('select')
				                                .trigger('change');
							}
						    
						}, 0);
		            	if (settings.endCallback)
		            		settings.endCallback();

                    },
                    error: function (xhr, desc, er) {
                        // add whatever debug you want here.
                    	alert("an error occurred");
                    }
                });
            });
        });
    };
})(jQuery);

