﻿/*
 jQuery paginator plugin v 1.0.1
 - based on Paginator 3000
 - coded by Radik special for Syber Engine
 - (c) Лаборатория разработки web сайтов

 Exampel:
 $('.class').paginator(options);
 options = {
 pagesTotal  : 100, //all pages count
 pagesSpan   : 10,  //display pages count
 pageCurrent : 50,  //current page number
 baseUrl     : './page/', //may be link "http://www.youwebsite.ru/index.php?page=" or http://www.youwebsite.ru/index.php?page=%page%&limit=1
 or function
 function (page_number){

 }
 returnOrder : false, //if true display return order pages false display normal order pages
 lang        : {next  : "Следующая", //language next
 last  : "Последняя", //language last
 prior : "Предыдущая",//language prior
 first : "Первая",    //language first
 arrowRight : String.fromCharCode(8594), //language left arrow
 arrowLeft  : String.fromCharCode(8592)} //language right arrow
 };
 */
;
(function($) {
    $.fn.paginator = function(s) {
        var options = {pagesTotal:1,pagesSpan:10,pageCurrent:50,baseUrl:'./page/',returnOrder:false,lang:{next:"Следующая",last:"Последняя",prior:"Предыдущая",first:"Первая",arrowRight:String.fromCharCode(8594),arrowLeft:String.fromCharCode(8592)}};
        $.extend(options, s);
        options.pagesSpan = options.pagesSpan < options.pagesTotal ? options.pagesSpan : options.pagesTotal;
        options.pageCurrent = options.pagesTotal < options.pageCurrent ? options.pagesTotal : options.pageCurrent;
        if (!$.isFunction(options.baseUrl) && !options.baseUrl.match(/%page%/i))options.baseUrl += '%page%';
        var html = {holder:null,table:null,trPages:null,trScrollBar:null,tdsPages:null,scrollBar:null,scrollThumb:null,pageCurrentMark:null};

        function prepareHtml(el) {
            html.holder = el;
            $(html.holder).html(makePagesTableHtml());
            html.table = $(html.holder).find('table:last');
            html.trPages = $(html.table).find('tr:first');
            html.tdsPages = $(html.trPages).find('td');
            html.scrollBar = $(html.holder).find('div.scroll_bar');
            html.scrollThumb = $(html.holder).find('div.scroll_thumb');
            html.pageCurrentMark = $(html.holder).find('div.current_page_mark');
            if (options.pagesTotal == options.pagesSpan) {
                $(html.holder).addClass('fulsize');
            }
            ;
        }

        ;
        function makePagesTableHtml() {
            var tdWidth = (100 / (options.pagesSpan + 2)) + '%';
            var isFunc = $.isFunction(options.baseUrl);
            var next_page = (parseInt(options.pageCurrent) < parseInt(options.pagesTotal)) ? parseInt(options.pageCurrent) + 1 : options.pagesTotal;
            var next = '<a href="';
            next += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, next_page);
            next += '" rel="' + next_page + '">%next%</a>';
            var last = '<a href="';
            last += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, options.pagesTotal);
            last += '" rel="' + options.pagesTotal + '">%last%</a>';
            var prior_page = (parseInt(options.pageCurrent) > 1) ? parseInt(options.pageCurrent) - 1 : 1;
            var prior = '<a href="';
            prior += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, prior_page);
            prior += '" rel="' + prior_page + '">%prior%</a>';
            var first = '<a href="';
            first += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, 1);
            first += '" rel="' + 1 + '">%first%</a>';
            if (options.returnOrder) {
                var top_left = options.lang.arrowLeft + ' ' + options.lang.next;
                var bottom_left = options.lang.last;
                var top_right = options.lang.prior + ' ' + options.lang.arrowRight;
                var bottom_right = options.lang.first;
                if (options.pageCurrent !== options.pagesTotal) {
                    var top_left = next.replace(/%next%/, top_left);
                    var bottom_left = last.replace(/%last%/, bottom_left);
                }
                ;
                if (options.pageCurrent !== 1) {
                    var top_right = prior.replace(/%prior%/, top_right);
                    var bottom_right = first.replace(/%first%/, bottom_right);
                }
                ;
            } else {
                var bottom_right = options.lang.last;
                var top_right = options.lang.next + ' ' + options.lang.arrowRight;
                var top_left = options.lang.arrowLeft + ' ' + options.lang.prior;
                var bottom_left = options.lang.first;
                if (options.pageCurrent !== options.pagesTotal) {
                    var top_right = next.replace(/%next%/, top_right);
                    var bottom_right = last.replace(/%last%/, bottom_right);
                }
                ;
                if (options.pageCurrent !== 1) {
                    var top_left = prior.replace(/%prior%/, top_left);
                    var bottom_left = first.replace(/%first%/, bottom_left);
                }
                ;
            }
            ;
            var html = '' + '<table width="100%">' + '<tr>' + '<td class="left top">' + top_left + '</td>' + '<td class="spaser"></td>' + '<td rowspan="2" align="center">' + '<table>' + '<tr>'
            for (var i = 1; i <= options.pagesSpan; i++) {
                html += '<td width="' + tdWidth + '"></td>';
            }
            html += '' + '</tr>' + '<tr>' + '<td colspan="' + options.pagesSpan + '">' + '<div class="scroll_bar">' + '<div class="scroll_trough"></div>' + '<div class="scroll_thumb">' + '<div class="scroll_knob"></div>' + '</div>' + '<div class="current_page_mark"></div>' + '</div>' + '</td>' + '</tr>' + '</table>' + '</td>' + '<td class="spaser"></td>' + '<td class="right top">' + top_right + '</td>' + '</tr>' + '<tr>' + '<td class="left bottom">' + bottom_left + '</td>' + '<td class="spaser"></td>' + '<td class="spaser"></td>' + '<td class="right bottom">' + bottom_right + '</td>' + '</tr>' + '</table>';
            return html;
        }

        ;
        function initScrollThumb() {
            html.scrollThumb.widthMin = '8';
            html.scrollThumb.widthPercent = options.pagesSpan / options.pagesTotal * 100;
            html.scrollThumb.xPosPageCurrent = (options.pageCurrent - Math.round(options.pagesSpan / 2)) / options.pagesTotal * $(html.table).width();
            if (options.returnOrder) {
                html.scrollThumb.xPosPageCurrent = $(html.table).width() - (html.scrollThumb.xPosPageCurrent + Math.round(options.pagesSpan / 2) / options.pagesTotal * $(html.table).width());
            }
            ;
            html.scrollThumb.xPos = html.scrollThumb.xPosPageCurrent;
            html.scrollThumb.xPosMin = 0;
            html.scrollThumb.xPosMax;
            html.scrollThumb.widthActual;
            setScrollThumbWidth();
        }

        ;
        function setScrollThumbWidth() {
            $(html.scrollThumb).css({width:html.scrollThumb.widthPercent + "%"});
            html.scrollThumb.widthActual = $(html.scrollThumb).width();
            if (html.scrollThumb.widthActual < html.scrollThumb.widthMin)
                $(html.scrollThumb).css('width', html.scrollThumb.widthMin + 'px');
            html.scrollThumb.xPosMax = $(html.table).width - html.scrollThumb.widthActual;
        }

        ;
        function moveScrollThumb() {
            $(html.scrollThumb).css({left:html.scrollThumb.xPos + "px"});
        }

        function initPageCurrentMark() {
            html.pageCurrentMark.widthMin = '3';
            html.pageCurrentMark.widthPercent = 100 / options.pagesTotal;
            html.pageCurrentMark.widthActual;
            setPageCurrentPointWidth();
            movePageCurrentPoint();
        }

        ;
        function setPageCurrentPointWidth() {
            $(html.pageCurrentMark).css({width:html.pageCurrentMark.widthPercent + '%'});
            html.pageCurrentMark.widthActual = $(html.pageCurrentMark).width();
            if (html.pageCurrentMark.widthActual < html.pageCurrentMark.widthMin)
                $(html.pageCurrentMark).css("width", html.pageCurrentMark.widthMin + 'px');
        }

        ;
        function movePageCurrentPoint() {
            var pos = 0;
            if (html.pageCurrentMark.widthActual < $(html.pageCurrentMark).width()) {
                pos = (options.pageCurrent - 1) / options.pagesTotal * $(html.table).width() - $(html.pageCurrentMark).width() / 2;
            } else {
                pos = (options.pageCurrent - 1) / options.pagesTotal * $(html.table).width();
            }
            ;
            if (options.returnOrder)pos = $(html.table).width() - pos - $(html.pageCurrentMark).width();
            $(html.pageCurrentMark).css({left:pos + 'px'});
        }

        ;
        function initEvents() {
            moveScrollThumb();
            options.returnOrder ? drawReturn() : drawPages();
            $(html.scrollThumb).bind('mousedown', function(e) {
                var dx = e.pageX - html.scrollThumb.xPos;
                $(document).bind('mousemove', function(e) {
                    html.scrollThumb.xPos = e.pageX - dx;
                    moveScrollThumb();
                    options.returnOrder ? drawReturn() : drawPages();
                });
                $(document).bind('mouseup', function() {
                    $(document).unbind('mousemove');
                    enableSelection();
                });
                disableSelection();
            });
            if ($.isFunction(options.baseUrl)) {
                $(html.holder).find('a[rel!=""]').bind('click', function(e) {
                    var n = parseInt($(this).attr('rel'));
                    options.baseUrl(n);
                });
            }
            ;
            $(window).resize(function() {
                setPageCurrentPointWidth();
                movePageCurrentPoint();
                setScrollThumbWidth();
            });
        }

        ;
        function drawPages() {
            var percentFromLeft = html.scrollThumb.xPos / $(html.table).width();
            var cellFirstValue = Math.round(percentFromLeft * options.pagesTotal);
            var data = "";
            if (cellFirstValue < 1) {
                cellFirstValue = 1;
                html.scrollThumb.xPos = 0;
                moveScrollThumb();
            } else if (cellFirstValue >= options.pagesTotal - options.pagesSpan) {
                cellFirstValue = options.pagesTotal - options.pagesSpan + 1;
                html.scrollThumb.xPos = $(html.table).width() - $(html.scrollThumb).width();
                moveScrollThumb();
            }
            ;
            var isFunc = $.isFunction(options.baseUrl);
            for (var i = 0; i < html.tdsPages.length; i++) {
                var cellCurrentValue = cellFirstValue + i;
                if (cellCurrentValue == options.pageCurrent) {
                    data = '<span> <strong>' + cellCurrentValue + '</strong> </span>';
                } else {
                    data = '<span> <a href="';
                    data += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, cellCurrentValue);
                    data += '">' + cellCurrentValue + '</a> </span>';
                }
                ;
                $(html.tdsPages[i]).html(data);
                if (isFunc) {
                    $(html.tdsPages[i]).find('a').bind('click', function() {
                        options.baseUrl($(this).text());
                    });
                }
            }
            ;
        }

        ;
        function drawReturn() {
            var percentFromLeft = html.scrollThumb.xPos / $(html.table).width();
            var cellFirstValue = options.pagesTotal - Math.round(percentFromLeft * options.pagesTotal);
            var data = "";
            if (cellFirstValue < options.pagesSpan) {
                cellFirstValue = options.pagesSpan;
                html.scrollThumb.xPos = $(html.table).width() - $(html.scrollThumb).width();
                moveScrollThumb();
            } else if (cellFirstValue >= options.pagesTotal) {
                cellFirstValue = options.pagesTotal;
                html.scrollThumb.xPos = 0;
                moveScrollThumb();
            }
            ;
            var isFunc = $.isFunction(options.baseUrl);
            for (var i = 0; i < html.tdsPages.length; i++) {
                var cellCurrentValue = cellFirstValue - i;
                if (cellCurrentValue == options.pageCurrent) {
                    data = '<span> <strong>' + cellCurrentValue + '</strong> </span>';
                } else {
                    data = '<span> <a href="';
                    data += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, cellCurrentValue);
                    data += '">' + cellCurrentValue + '</a> </span>';
                }
                ;
                $(html.tdsPages[i]).html(data);
                if (isFunc) {
                    $(html.tdsPages[i]).find('a').bind('click', function() {
                        options.baseUrl($(this).text());
                    });
                }
            }
            ;
        }

        ;
        function enableSelection() {
            document.onselectstart = function() {
                return true;
            };
        }

        ;
        function disableSelection() {
            document.onselectstart = function() {
                return false;
            };
            $(html.scrollThumb).focus();
        }

        ;
        prepareHtml(this);
        initScrollThumb();
        initPageCurrentMark();
        initEvents();
    };
})(jQuery);
