jQuery.fn.chainSelect = function( target, url, settings ) 
{
  return this.each( function()
  {
	$(this).change( function( ) 
	{
		settings = jQuery.extend(
		{
			after : null,
			before : null,
			usePost : false,
			defaultValue : null,
			parameters : {'_id' : $(this).attr('id'), '_name' : $(this).attr('name')}
        } , settings);

		settings.parameters._value =  $(this).val();

		if (settings.before != null) 
		{
			settings.before( target );
		}

		ajaxCallback = function(data, textStatus) 
		{
			$(target).html("");//clear old options
			data = eval(data);//get json array
			for (i = 0; i < data.length; i++)//iterate over all options
			{
			  for ( key in data[i] )//get key => value
			  {	
					$(target).get(0).add(new Option(data[i][key],[key]), document.all ? i : null);
              }
			}

			if (settings.defaultValue != null)
			{
				$(target).val(settings.defaultValue);//select default value
			} else
			{
				$("option:first", target).attr( "selected", "selected" );//select first option
			}

			if (settings.after != null) 
			{
				settings.after(target);
			}

			$(target).change();//call next chain
		};

		if (settings.usePost == true)
		{
			$.post( url, settings.parameters, ajaxCallback );
		} else
		{
			$.get( url, settings.parameters, ajaxCallback );
		}
	});
  });
};


jQuery.fn.chainSelect2 = function(target, url, settings){

	settings = jQuery.extend({
		after: null,
		before: null,
		usePost: false,
		defaultValue: null,
		parameters: {
			'_id': $(this).attr('id'),
			'_name': $(this).attr('name')
		}
	}, settings);
	
	settings.parameters._value = $(this).val();
	
	if (settings.before != null) {
		settings.before(target);
	}
	
	ajaxCallback = function(data, textStatus){
		$(target).html("");//clear old options
		data = eval(data);//get json array
		for (i = 0; i < data.length; i++)//iterate over all options
		{
			for (key in data[i])//get key => value
			{
				$(target).get(0).add(new Option(data[i][key], [key]), document.all ? i : null);
			}
		}
		
		if (settings.defaultValue != null) {
			$(target).val(settings.defaultValue);//select default value
		}
		else {
			$("option:first", target).attr("selected", "selected");//select first option
		}
		
		if (settings.after != null) {
			settings.after(target);
		}
		
		$(target).change();//call next chain
	};
	
	if (settings.usePost == true) {
		$.post(url, settings.parameters, ajaxCallback);
	}
	else {
		$.get(url, settings.parameters, ajaxCallback);
	}
}
