(function ($) {
    $.fn.linkedSelect = function (url, destination, params) {
        var params = $.extend({
            firstOption: 'Please Select',
            loadingText: 'Loading...',
            dont_change_on_first_option: true,
            use_checkable_comp: false,
            checkable_comp_id: null
        },
        params);
        var $dest = $(destination);
        var $self = $(this);
        var proba = document.getElementById(params.checkable_comp_id);
        if (params.use_checkable_comp == true) {
            var real_checkable_component = document.getElementById(params.checkable_comp_id);
            var is_checked = real_checkable_component.checked;
            $(real_checkable_component).bind('click', function (e) {
                is_checked = real_checkable_component.checked;
                $self.change();
            });
        }
        return this.each(function () {
            $(this).bind('change', function () {
                var $$ = $(this);
                if (params.dont_change_on_first_option == true) {
                    if ($(this).get(0).selectedIndex == 0) { 
                        $dest.attr('disabled', 'true').append('<option value="">' + 'Illegal Parent Select' + '</option>');
                        $dest.get(0).selectedIndex = $dest.get(0).options.length - 1;
                        return false;
                    }
                }
                $dest.attr('disabled', 'false').append('<option value="">' + params.loadingText + '</option>').ajaxStart(function () {
                    $$.show();
                }); //dobry
                if (params.use_checkable_comp == true) {
                    var json_data = {
                        str: $$.val(),
                        bool_val: is_checked
                    }
                } else {
                    var json_data = {
                        str: $$.val()
                    }
                } //eof dobry	
                $.getJSON(url, json_data, function (j) {
                    if (j.length > 0) {
                        var options = '<option value="">' + params.firstOption + '</option>';
                        for (var i = 0; i < j.length; i++) {
                            options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
                        }
                        $dest.removeAttr('disabled').html(options).find('option:first').attr('selected', 'selected');
                    } else {
                        $dest.attr('disabled', 'true').append('<option value="-1">No selection possible</option>');
                        $dest.get(0).selectedIndex = $dest.get(0).options.length - 1;
                    }
                }); // end getJSON
            }); // end change
        }); // end return each
    }; // end function
})(jQuery);
