(function($) {
    jQuery.fn.copycat = function(options) {
        var forms = $(this);
        $.each(options.names, function(i, selector) {
            var selector = 'input[name^='+selector+'],select[name='+selector+']';
            forms.find(selector).change(function() {
                // what input type triggered the event?
                switch (this.type) {
                    case 'checkbox':
                        var name = this.name.split('_')
                        var val = name.pop()
                        var name = name.join('_')
                        break;
                    case 'radio':
                        var val = this.value;
                        var name = this.name;
                        break;
                    case 'select-one':
                        var val = this.value;
                        var name = this.name;
                        break;
                    case 'text':
                        var val = this.value;
                        var name = this.name;
                        break;
                    case 'hidden':
                        var val = this.value;
                        var name = this.name;
                        break;
                }
                forms.find(selector).each(function(i, el) {
                    // skip elements in the triggering form
                    if ($(this).parent('form') == $(el).parent('form')) {
                        return;
                    }
                    // what type of input is being actioned?
                    switch (el.type) {
                        case 'checkbox':
                            // special case of checkboxes that act like radiobuttons, fmt: name_val
                            if (el.name == name + '_' + val)
                                el.checked = 'checked';
                            else
                                el.checked = '';
                            break;
                        case 'radio':
                            if (el.name == name && el.value == val)
                                el.checked = 'checked';
                            break;
                        case 'select-one':
                            if (el.name == name)
                                el.value = val;
                            break;
                        case 'text':
                            if (el.name == name)
                                el.value = val;
                        case 'hidden':
                            if (el.name == name)
                                el.value = val;
                        default:
                            // ignore unknown tags
                            break;
                    }
                });
            });
        });
    };
})(jQuery);
