﻿(function ($) {
    /*
    * container: id or class of container element where paginator will be drawn
    * options  : paginator options
    **/
    $.fn.tai_paginate = function (container, options) {
        var opts = $.extend({}, $.fn.tai_paginate.defaults, options);       

        return this.each(function () {
            $this = $(this);
            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            var s = o.firstVisiblePage;

            _totalItems = $(this).children().size();
            _totalPages = Math.ceil(_totalItems / o.itemsPerPage);
            _container = $(container);

            $.fn.drawPage(o, $this, s);
        });
    };

    var _container;
    var _totalPages = 0;
    var _totalItems = 0;
    var _insideWidth = 0;
    /*
    *
    *
    **/
    $.fn.tai_paginate.defaults = {
        firstVisiblePage: 1,            // First visible page
        itemsPerPage: 10,               // Number of items to show in each page
        visiblePages: 5,                // Number of visible pages in paginator
        firstString: '|<',              // String to represent "first" button
        rotLeftString: '&laquo;',       // String to represent "first" button
        rotRightString: '&raquo;',      // String to represent "last" button
        lastString: '>|'                // String to represent "last" button

    };

    /*
    *
    *
    **/
    $.fn.drawPage = function (o, obj, selectedPage) {

        // Draw the paginator
        var divPag = $(document.createElement('div')).addClass('paginator-outer');
        var first = $(document.createElement('a')).addClass('paginator-first').html(o.firstString);
        var rotateLeft = $(document.createElement('a')).addClass('paginator-previous').html(o.rotLeftString);
        var divWrapLeft = $(document.createElement('div')).addClass('paginator-back');
        divWrapLeft.append(first).append(rotateLeft);

        var ulWrapDiv = $(document.createElement('div')).addClass('paginator-wrapper').css('overflow', 'hidden');
        var ul = $(document.createElement('ul')).addClass('paginator-pages');
        var c = (o.visiblePages - 1) / 2;
        var f = selectedPage - c;
        var selobj;
        for (var i = 0; i < _totalPages; i++) {
            var val = i + 1;
            if (val == selectedPage) {
                var pag = $(document.createElement('li')).html('<span class="paginator-current">' + val + '</span>');
                selobj = pag;
                ul.append(pag);
            } else {
                var pag = $(document.createElement('li')).html('<a>' + val + '</a>');
                ul.append(pag);
            }
        }
        ulWrapDiv.append(ul);
        var rotateRight = $(document.createElement('a')).addClass('paginator-next').html(o.rotRightString);
        var last = $(document.createElement('a')).addClass('paginator-last').html(o.lastString);
        var divWrapRight = $(document.createElement('div')).addClass('paginator-front');
        divWrapRight.append(rotateRight).append(last);

        divPag.append(divWrapLeft).append(ulWrapDiv).append(divWrapRight);
        _container.addClass('tai_paginator').append(divPag);
        divPag.css('padding-left', first.parent().width() + 5 + 'px');

        // calculate metrics
        var outsideWidth = $(_container).innerWidth();
        var visibleWidth = 0;

        $(ulWrapDiv).find('li').each(function (i, n) {
            if (i == o.visiblePages - 1) {
                visibleWidth += this.offsetLeft + this.offsetWidth;
            }
            _insideWidth += this.offsetWidth;
        });

        // apply default styles        
        divPag.css('width', divWrapLeft.outerWidth() + ulWrapDiv.outerWidth() + divWrapRight.outerWidth());
        divPag.css('margin', '0px auto');
        $(ulWrapDiv).css('width', (visibleWidth - first.parent().width()) + 'px');

        $(divWrapRight).css('left', $(ulWrapDiv).position().left + $(ulWrapDiv).outerWidth() + 5 + 'px');

        ul.css('width', _insideWidth + 'px');

        // Draw the list
        var firstToShow = (selectedPage - 1) * o.itemsPerPage;
        $this.children()
            .hide()
            .slice(firstToShow, firstToShow + o.itemsPerPage)
            .show();

        // Attach event handlers
        rotateRight.hover(
            function () {
                thumbs_scroll_interval = setInterval(
                    function () {
                        var left = ulWrapDiv.scrollLeft() + 1;
                        ulWrapDiv.scrollLeft(left);
                    }, 20);
            },
            function () {
                clearInterval(thumbs_scroll_interval);
            });

        rotateLeft.hover(
            function () {
                thumbs_scroll_interval = setInterval(
                    function () {
                        var left = ulWrapDiv.scrollLeft() - 1;
                        ulWrapDiv.scrollLeft(left);
                    }, 20);
            },
            function () {
                clearInterval(thumbs_scroll_interval);
            });

        rotateLeft.click(
            function () {
                var width = outsideWidth - 50;
                var left = ulWrapDiv.scrollLeft() - width;
                ulWrapDiv.animate({ scrollLeft: left + 'px' });
            });

        rotateRight.click(
            function () {
                var width = outsideWidth - 50;
                var left = ulWrapDiv.scrollLeft() + width;
                ulWrapDiv.animate({ scrollLeft: left + 'px' });
            });

        first.click(
            function () {
                ulWrapDiv.animate({ scrollLeft: '0px' });
                ulWrapDiv.find('li').eq('0').click();
            });

        last.click(
            function () {
                ulWrapDiv.animate({ scrollLeft: _insideWidth + 'px' });
                ulWrapDiv.find('li').eq(_totalPages - 1).click();
            });

        ulWrapDiv.find('li').click(function () {
            selobj.html('<a>' + selobj.find('.paginator-current').html() + '</a>');
            var oldval = $(selobj).text();
            var firstToHide = (parseInt(oldval) - 1) * o.itemsPerPage;
            $this.children().slice(firstToHide, firstToHide + o.itemsPerPage)
                .fadeOut('slow');
            $this.children().hide();
            var currval = $(this).find('a').html();
            $(this).html('<span class="paginator-current">' + currval + '</span>');
            selobj = $(this);

            var firstToShow = (parseInt(currval) - 1) * o.itemsPerPage;
            $this.children().slice(firstToShow, firstToShow + o.itemsPerPage)
                    .fadeIn('slow');
        });
    };

    var ie7 = function () {
        return navigator.appVersion.indexOf('MSIE 7.0') > 0;
    }
})(jQuery);
