﻿(function($) {
    $.extend({
        clubTableSorterPager: new function() {

            this.defaults = {
                cssAsc: 'club-tablesorter-header-asc',
                cssDesc: 'club-tablesorter-header-desc',
                cssHeader: 'club-tablesorter-header',
                headers: {},
                pager: '',
                pageSize: 10,
                sortForce: null,
                sortList: []
            };

            this.construct = function(settings) {

                return this.each(function() {

                    this.config = {};

                    config = $.extend(this.config, $.clubTableSorterPager.defaults, settings);

                    var rowCount = $(this).find('tbody > tr').length;

                    if (rowCount == 0) {
                        return;
                    }

                    $this = $(this);

                    $this.data('initializing', true);
                    
                    config.rowCount = rowCount;
                    config.table = $this;

                    $this.addClass('club-tablesorter');

                    var index = 0;
                    $this.find('th').each(function() {
                        if ($(this).text().trim() != '') {
                            if (config.headers && config.headers[index] && config.headers[index]['sorter'] == false) {
                                $(this).html('<span><span class="left"></span><span class="center">' + $(this).text() + '</span><span class="right"></span></span>');
                            }
                            else {
                                $(this).html('<a href="javascript:{}"><span><span class="left"></span><span class="center">' + $(this).text() + '</span><span class="right"></span></span></a>');
                            }
                        }
                        index++;
                    });

                    $this.find('tr').each(function() { $(this).find('td:last').addClass('club-tablesorter-last'); });

                    $this.tablesorter({
                        cssAsc: config.cssAsc,
                        cssDesc: config.cssDesc,
                        cssHeader: config.cssHeader,
                        headers: config.headers,
                        sortForce: config.sortForce,
                        sortList: config.sortList,
                        textExtraction: function(node) {
                            return $(node).text();
                        },
                        widgets: ['cookie']
                    });

                    constructPager(config);
                });
            };

            function constructPager(config) {

                var rowCount = config.rowCount;
                var pageCount = Math.ceil(rowCount / config.pageSize);

                if (config.pager && pageCount > 1) {
                    for (var i = 0; i < pageCount; i++) {
                        var selected = (i == 0) ? 'club-tablesorter-pager-pagenumber-selected' : '';
                        $(config.pager).append('<div><a class="club-tablesorter-pager-pagenumber ' + selected + '" href="javascript:{}">' + (i + 1) + '</a></div>');
                    }
                    $(config.pager).append('<div><a class="club-tablesorter-pager-pagenumber" href="javascript:{}">View All</a></div>');
                    $(config.pager).append('<input class="pagesize" type="hidden" value="' + config.pageSize + '" />');

                    var defaultSize = config.pageSize;

                    var pagerSelector = '#' + $(config.pager).attr('id');
                    var tableSelector = '#' + $(config.table).attr('id');

                    $(pagerSelector + ' .club-tablesorter-pager-pagenumber').click(function() {
                        var number;
                        var size;

                        $(pagerSelector + ' .club-tablesorter-pager-pagenumber').removeClass('club-tablesorter-pager-pagenumber-selected');

                        if ($(this).text().toLowerCase() == 'view all') {
                            number = 0;
                            size = rowCount;
                        }
                        else {
                            number = $(this).text() - 1;
                            size = defaultSize;
                        }

                        $(pagerSelector + ' .pagesize').val(size);
                        $(this).addClass('club-tablesorter-pager-pagenumber-selected');

                        $(tableSelector).tablesorterPager({
                            container: $(pagerSelector),
                            page: number,
                            positionFixed: false,
                            size: size
                        });
                    });

                    $(config.pager).addClass('club-tablesorter-pager');

                    $(config.table).tablesorterPager({
                        container: $(config.pager),
                        positionFixed: false,
                        size: defaultSize
                    })
                    .find('th').click(function() {
                        if ($(pagerSelector + ' .club-tablesorter-pager-pagenumber-selected:first').text().toLowerCase() != 'view all') {
                            $(pagerSelector + ' .club-tablesorter-pager-pagenumber:first').click();
                        }
                    });

                }
                else if (config.pager) {
                    config.pager.hide();
                }
            };
        }
    });
    // extend plugin scope
    $.fn.extend({
        clubTableSorterPager: $.clubTableSorterPager.construct
    });

})(jQuery);				