(function ($) {
    $.fn.selectChain = function (options) {
        var defaults = {
            key: "id",
            value: "label",
            default_value: 0,
            retrieveData: null,
            afterPopulate: null
        };
        var self = this;
        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] = $('#'+this.id).val();
                }
                if (settings.retrieveData != null)
                {
                	if (data == null)
                		data = {};
                	newParams = settings.retrieveData(); 
					for(i=0;i<newParams.length;i++)
					{
						data[newParams[i]['name']] = newParams[i]['value']; 
					} 
                }
                 
                settings.target.empty();
                settings.target.attr("disabled", "disabled");
                settings.target.append("<option value=0>"+settings.loading_text+"</option>");
                
                $.ajax({
                    url: settings.url,
                    data: data,
                    type: (settings.type || 'get'),
                    dataType: 'json',
                    success: function (j) {
                    	
                        var options = [], i = 0, o = null;
                        settings.target.removeAttr("disabled");
                        if (j.length > 0)
                        {
                        	
                       		value = typeof j[0] == 'object' ? j[i][settings.key] : j[0];
                            text = typeof j[0] == 'object' ? j[i][settings.value] : j[0];
                        	if (value == null )
                        	{
				                settings.target.empty();
				                settings.target.append("<option value=0></option>"); 
                        	}
                        	else
		                    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.text = html_entity_decode(o.text);
			                    settings.target.get(0).options[i] = o;
		                    }
		                    settings.target.find("option[value="+settings.default_value+"]").attr('selected', 'selected');
		                    settings.target.change();
                        }
                        else
						{
			                settings.target.empty();
			                settings.target.append("<option value=0></option>"); 
						}     
                        if (settings.afterPopulate != null)
                        	settings.afterPopulate(self, settings);
                    },
                    error: function (xhr, desc, er) {
                        // add whatever debug you want here.
						//alert(er);
                    }
                });
            });
        });
    };
})(jQuery);


$.fn.selectLoad = function(options) {
        var defaults = {
            key: "id",
            value: "label",
            default_value: 0,
            target: $(this),
            callback: null
        };
        
        var settings = $.extend({}, defaults, options);
        
        if (!(settings.target instanceof $)) settings.target = $(settings.target);
 		 return this.each(function () {
 		 	var data = null;
            if (typeof settings.data == 'string') {
                data = settings.data + '&' + this.name + '=' + $$.val();
            } else if (typeof settings.data == 'object') {
                data = settings.data;
                var val = $('#'+this.id).val() == null ? 0 : $('#'+this.id).val();
                data[this.name] = val;
            }
            
            settings.target.empty();
                settings.target.attr("disabled", "disabled");
                settings.target.append("<option value=0>"+settings.loading_text+"</option>"); 
                $.ajax({
                    url: settings.url,
                    data: data,
                    type: (settings.type || 'get'),
                    dataType: 'json',
                    success: function (j) {
                        var options = [], i = 0, o = null;
                        settings.target.removeAttr("disabled");
                        if (j.length > 0)
                        {
                       		value = typeof j[0] == 'object' ? j[i][settings.key] : j[0];
                            text = typeof j[0] == 'object' ? j[i][settings.value] : j[0];
                        	if (value == null )
                        	{
				                settings.target.empty();
				                settings.target.append("<option value=0></option>"); 
                        	}
                        	else
		                    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.text = html_entity_decode(o.text);
			                    settings.target.get(0).options[i] = o;
		                    }
		                    settings.target.find("option[value="+settings.default_value+"]").attr('selected', 'selected');
		                    settings.target.change();
                        }
                        else
						{
			                settings.target.empty();
			                settings.target.append("<option value=0></option>"); 
						}   
						if (settings.callback != null)
							settings.callback();							                     
                    },
                    error: function (xhr, desc, er) {
                        // add whatever debug you want here.
						//alert(er);
                    }
                });
 		 	
 		 })
 }
