(function($) {  
    $.fn.contentSelector = function() {
        
        // Apply function to all matched objects
        return this.each(function() {
            
            var contentSelector = $(this);
            
            // Make selected items draggable
            $('.selected > ul',contentSelector).sortable({ opacity: 0.6, axis: 'y' }).disableSelection();
            
            // Add selected
            function addSelected() {
                $('.available input:checked',contentSelector).each(function() {
                    var target = $('.selected > ul',contentSelector);
                    var container = $(this).parent();
                    container.appendTo(target);
                    $(this).attr('checked',false)
                    var fieldname = container.children('input:hidden').attr('name');
                    var fieldname = fieldname.substr(11);
                    container.children('input:hidden').attr('name',fieldname);
                });
            }
            
            // Remove selected
            function removeSelected() {
                $('.selected input:checked',contentSelector).each(function() {
                    var target = $('.available .'+$(this).parent().attr('class')+' > ul',contentSelector);
                    var container = $(this).parent();
                    $(this).attr('checked',false);
                    container.appendTo(target);
                    var fieldname = container.children('input:hidden').attr('name');
                    container.children('input:hidden').attr('name','deselected-'+fieldname);
                });
            }
            
            function filterByTitle(search) {
                var compare = search.attr('value').toLowerCase();
                $('.available li li',contentSelector).each(function() {
                    var label = $('label',$(this));
                    var title = label.html().toLowerCase();
                    if(title.lastIndexOf(compare.toLowerCase()) == -1) { $(this).hide(); }
                    else { $(this).show(); }
                });
            }
            
            // Assign actions
            $('.selected > input[type=image]',contentSelector).click(function() { removeSelected(); return false; });
            $('.available > input[type=image]',contentSelector).click(function() { addSelected(); return false; });
            $('.available .content-selector-filter input',contentSelector).keyup(function() { filterByTitle($(this)); return false; });
            
        });
        
    };
})(jQuery);