(function($) {
    $.fn.chained= function(parent_selector,options) {
        return this.each( function() {
            var self=this;
            var backup=$(self).clone();
            $(parent_selector).each( function() {
                $(this).bind("change", function() {
                    $(self).html($(backup).html());
                    var selected="";
                    $(parent_selector).each( function() {
                        selected+="\\"+$(":selected",this).val();
                    });
                    selected=selected.substr(1);
                    var first=$(parent_selector).first();
                    var selected_first=$(":selected",first).val();
                    $("option",self).each( function() {
                        if(!$(this).hasClass(selected)&&!$(this).hasClass(selected_first)&&$(this).val()!=="") {
                            $(this).remove();
                        }
                    });
                    if(1==$("option",self).size()&&$(self).val()=="") {
                        $(self).attr("disabled","disabled");
                    } else {
                        $(self).removeAttr("disabled");
                    }
                });
                $(this).trigger("change");
            });
        });
    };
    $.fn.chainedTo=$.fn.chained;
})(jQuery);
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 );
            }
        });
    });
};
