(function($) { // hide the namespace

    $(function () {
        // table filter

        // copy paste of the $.fn.dataTableExt.oSort['date-asc'] function of dataTables, but parse the uk format before
        $.fn.dataTableExt.oSort['date-dd-mm-yyyy-asc'] = function ( a, b ) {
            var x = Date.parse( a.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1") );
            var y = Date.parse( b.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1") );

            if ( isNaN( x ) )
                x = Date.parse( "01/01/1970 00:00:00" );

            if ( isNaN( y ) )
                y =	Date.parse( "01/01/1970 00:00:00" );

            return x - y;
        }

        $.fn.dataTableExt.oSort['date-dd-mm-yyyy-desc'] = function ( a, b ) {
            return $.fn.dataTableExt.oSort['date-dd-mm-yyyy-asc'](b, a);
        }

        // copy paste of the $.fn.dataTableExt.oSort['date-asc'] function of dataTables, but parse the uk format before
        // short format dd/mm/yy
        // assume dd/mm/20yy
        $.fn.dataTableExt.oSort['date-dd-mm-yy-asc'] = function ( a, b ) {
            var x = Date.parse( a.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,2})/, "20$3/$2/$1") );
            var y = Date.parse( b.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,2})/, "20$3/$2/$1") );

            if ( isNaN( x ) )
                x = Date.parse( "01/01/1970 00:00:00" );

            if ( isNaN( y ) )
                y =	Date.parse( "01/01/1970 00:00:00" );

            return x - y;
        }

        $.fn.dataTableExt.oSort['date-dd-mm-yy-desc'] = function ( a, b ) {
            return $.fn.dataTableExt.oSort['date-dd-mm-yy-asc'](b, a);
        }

        $('table.filterable').each(function () {
            var options = {
                bPaginate   : false,
                bFilter     : true, // mandatory with individual colunm search, if not, sort after filter forget the filter !!!
                bProcessing : true,
                bSortClasses: false,
                sDom        : 'lfritp',
                oLanguage   : {
                        sSearch     : 'Full table search:',
                        sInfo       : 'Showing _TOTAL_ entries',
                        sInfoEmpty  : 'Showing 0 entries'
                    },
                bAutoWidth  : false,
                aoColumns   : []
            };

            // default sort columns, via metadata
            if( $.metadata && $(this).metadata() && $(this).metadata().sortlist ) {
                options.aaSorting = $(this).metadata().sortlist;
            }

            // unsortable columns, via metadata
            $('thead', $(this)).append('<tr></tr>');

            var headers = $('thead th', $(this));
            for ( var i = 0 ; i < headers.length ; i++ ) {
                options.aoColumns[i] = {};
                $('thead tr:last-child', $(this)).append('<td></td>');

                if( $.metadata && $(headers[i]).metadata() && $(headers[i]).metadata().do_not_sort ) {
                    options.aoColumns[i].bSortable = false;
                }
                else {
                    $(headers[i]).addClass('header');
                    $('thead tr:last-child td:last-child', $(this)).append('<input />');
                }

                if( $.metadata && $(headers[i]).metadata() && $(headers[i]).metadata().type ) {
                    options.aoColumns[i].sType = $(headers[i]).metadata().type;
                }
            }

            // initialize the plugin
            filterable_table = $(this).dataTable(options);
        });

        // individual column search
        $('table.filterable thead input').keyup(function () {
            filterable_table.fnFilter(this.value, $('thead input').index(this));
        });
    });
})(jQuery);

var filterable_table;