﻿/**
 * This is a rewrite of the plugin written by Gabriel Birke (birke *at* d-scribe *dot* de).
 */
(function($) {
    var current_page = 0;
    var panels;
    var maxentries;
    var opts;
    var getInterval = function (numberOfPages, numberOfDisplayEntries) {
        var ne_half = Math.ceil(numberOfDisplayEntries / 2);
        var upper_limit = numberOfPages - numberOfDisplayEntries;
        var start = current_page > ne_half ? Math.max(Math.min(current_page - ne_half, upper_limit), 0) : 0;
        var end = current_page > ne_half ? Math.min(current_page + ne_half, numberOfPages) : Math.min(numberOfDisplayEntries, numberOfPages);
        return [start,end];
    };
    
    var pageSelected = function (page_id, evt) {
        current_page = page_id;
        drawLinks();
        opts.callback(page_id);
        return false;
    };

    var drawLinks = function () {
        var numberOfPages = Math.ceil(maxentries / opts.items_per_page);
        var ul = document.createElement("ul");
        var interval = getInterval(numberOfPages, opts.num_display_entries);

        var attachClicks = function () {
            panels.find("a").each(function () {
                var ele = $(this);
                var pageId = parseInt(ele.attr("href"));
                if (!isNaN(pageId)) {
                    ele.click(getClickHandler(pageId)).attr("href", opts.link_to.replace(/__id__/, pageId + 1));
                }
            });
        };
        
        var getClickHandler = function (page_id) {
            return function (evt) {
                return pageSelected(page_id, evt);
            }
        };
        
        var addEnabledLink = function (page_id, appendopts) {
            var li = document.createElement("li");
            var a = document.createElement("a");
            a.href = page_id;
            a.appendChild(document.createTextNode(appendopts.text));
            if (appendopts.classes) {
                li.className = appendopts.classes;
            }
            li.appendChild(a);
            return li;
        };
        
        var addDisabledLink = function (appendopts) {
            var li = document.createElement("li");
            var a = document.createElement("a");
            if (appendopts.text == opts.next_text || appendopts.text == opts.prev_text) {
                a.href = "javascript:void(0);";
                a.appendChild(document.createTextNode(appendopts.text));
                li.className = "";
            } else {
                a.href = "javascript:void(0);";
                a.appendChild(document.createTextNode(appendopts.text));
                li.className = "num-sel";
            }
            if (appendopts.classes) {
                li.className = li.className + " " + appendopts.classes;
            }
            li.appendChild(a);
            return li;
        };

        var addHiddenDisabledLink = function (appendopts) {
            var li = document.createElement("li");
            var a = document.createElement("a");
            li.className = "num-dot";
            a.href = "javascript:void(0);";
            a.appendChild(document.createTextNode(opts.ellipse_text));
            li.appendChild(a);
            if (appendopts.classes) {
                li.className = li.className + " " + appendopts.classes;
            }
            return li;
        };
        
        var getItem = function (page_id, appendopts) {
            page_id = page_id < 0 ? 0 :
                page_id < numberOfPages ? page_id : numberOfPages - 1;
            page_id_temp = page_id + 1;
            current_page_temp = current_page + 1;
            appendopts = $.extend({text:page_id + 1, classes:""}, appendopts || {});
            if (page_id_temp == current_page_temp) { // disable link if current
                return addDisabledLink(appendopts);
            } else if (numberOfPages <= 9) {	// display link
                return addEnabledLink(page_id, appendopts);
            } else if (numberOfPages > 9) {
                if (current_page_temp <= 4) {
                    if (page_id_temp < 7) { // display link
                        return addEnabledLink(page_id, appendopts);
                    } else if (page_id_temp == 7) { // display right ...
                        return addHiddenDisabledLink(appendopts);
                    } else if (page_id_temp == numberOfPages) { // always display last link
                        return addEnabledLink(page_id, appendopts);
                    }
                } else if (current_page_temp > 4 && current_page_temp < numberOfPages - 3) { // apply sliding window
                    if (page_id_temp == 1) { // always display first link
                        return addEnabledLink(page_id, appendopts);
                    } else if (page_id_temp == 2) { // display left ...
                        return addHiddenDisabledLink(appendopts);
                    } else if (page_id_temp == (current_page_temp-2) || page_id_temp == (current_page_temp-1) || page_id_temp == (current_page_temp+1) || page_id_temp == (current_page_temp+2) || page_id_temp == numberOfPages) { // display 2 to the left and right of current link, also display last link
                        return addEnabledLink(page_id, appendopts);
                    } else if (page_id_temp == (current_page_temp + 3)) { // display right ...
                        return addHiddenDisabledLink(appendopts);
                    }
                } else if (current_page_temp >= (numberOfPages - 3)) { // apply left ...
                    if (page_id_temp == 1) { // always display first link
                        return addEnabledLink(page_id, appendopts);
                    } else if (page_id_temp == 2) { // display left ...
                        return addHiddenDisabledLink(appendopts);
                    } else if (page_id_temp >= (numberOfPages - 5)) { //display last 6 links
                        return addEnabledLink(page_id, appendopts);
                    }
                }
            }
        };
        
        if (opts.prev_text && opts.prev_show_always) {
            if (current_page > 0) {
                ul.appendChild(getItem(current_page - 1, {text:opts.prev_text, classes:"num-prev"}));
            } else if(current_page <= 0) {
                ul.appendChild(getItem(current_page - 1, {text:opts.prev_text, classes:"num-prev-pas"}));
            }
        };
        
        // Generate starting points
        if (interval[0] > 0 && opts.num_edge_entries > 0) {
            var end = Math.min(opts.num_edge_entries, interval[0]);
            for(var i=0; i<end; i++) {
                ul.appendChild(getItem(i));
            }
            if(opts.num_edge_entries < interval[0] && opts.ellipse_text) {
                var li = document.createElement("li");
                var a = document.createElement("a");
                li.className = "num-dot";
                a.href = "javascript:void(0);"
                a.appendChild(document.createTextNode(opts.ellipse_text));
                li.appendChild(a);
                ul.appendChild(li);
            }
        }
        // Generate interval links
        for (var i = interval[0]; i < interval[1]; i++) {
            ul.appendChild(getItem(i));
        }
        // Generate ending points
        if (interval[1] < numberOfPages && opts.num_edge_entries > 0) {
            var begin = Math.max(numberOfPages - opts.num_edge_entries, interval[1]);
            for (var i = begin; i < numberOfPages; i++) {
                ul.appendChild(getItem(i));
            }
            
        }
        // Generate "Next"-Link
        if (opts.next_text && opts.next_show_always) {
            if(current_page < numberOfPages - 1) {
                ul.appendChild(getItem(current_page + 1, {text:opts.next_text, classes:"num-next"}));
            } else {
                ul.appendChild(getItem(current_page + 1, {text:opts.next_text, classes:"num-next-pas"}));
            }
        }
        
        panels.empty().append(ul);
        attachClicks();
    };

    $.extend({
        pagination: function (maxEntries, options) {
            opts = $.extend({
                    jQuerySelector: ".pgnum",
                    items_per_page: 10,
                    num_display_entries: 10,
                    current_page: 0,
                    num_edge_entries: 0,
                    link_to: "__id__",
                    prev_text: "Prev",
                    next_text: "Next",
                    ellipse_text: "...",
                    prev_show_always: true,
                    next_show_always: true,
                    callback: function () { return false; }
                }, options || {});
            maxentries = (!maxEntries || maxEntries < 0) ? 1 : maxEntries;
            opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0) ? 1 : opts.items_per_page;
            panels = $(opts.jQuerySelector);
            drawLinks(maxentries, opts);
            current_page = opts.current_page;
            opts.callback(current_page);
        }
    });
}($));