﻿$.fn.dataTableExt.oPagination.sriPagination = {
    "fnInit": function (oSettings, nPaging, fnCallbackDraw) {
        var nFirst = document.createElement('span');
        var nList = document.createElement('span');
        var nLast = document.createElement('span');

        nFirst.innerHTML = oSettings.oLanguage.oPaginate.sFirst;
        nLast.innerHTML = oSettings.oLanguage.oPaginate.sLast;

        var oClasses = oSettings.oClasses;
        nFirst.className = oClasses.sPageButton + " " + oClasses.sPageFirst;
        nLast.className = oClasses.sPageButton + " " + oClasses.sPageLast;

        nPaging.appendChild(nFirst);
        nPaging.appendChild(nList);
        nPaging.appendChild(nLast);

        $(nFirst).bind('click.DT', function () {
            if (oSettings.oApi._fnPageChange(oSettings, "first")) {
                fnCallbackDraw(oSettings);
            }
        });

        $(nLast).bind('click.DT', function () {
            if (oSettings.oApi._fnPageChange(oSettings, "last")) {
                fnCallbackDraw(oSettings);
            }
        });

        /* Take the brutal approach to cancelling text selection */
        $('span', nPaging)
			.bind('mousedown.DT', function () { return false; })
			.bind('selectstart.DT', function () { return false; });

        /* ID the first elements only */
        if (oSettings.sTableId !== '' && typeof oSettings.aanFeatures.p == "undefined") {
            nPaging.setAttribute('id', oSettings.sTableId + '_paginate');
            nFirst.setAttribute('id', oSettings.sTableId + '_first');
            nLast.setAttribute('id', oSettings.sTableId + '_last');
        }
    },
    "fnUpdate": function (oSettings, fnCallbackDraw) {
        if (!oSettings.aanFeatures.p) {
            return;
        }

        var iPageCount = $.fn.dataTableExt.oPagination.iFullNumbersShowPages;
        var iPageCountHalf = Math.floor(iPageCount / 2);
        var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
        var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
        var sList = "";
        var iStartButton, iEndButton, i, iLen;
        var oClasses = oSettings.oClasses;

        /* Pages calculation */
        if (iPages < iPageCount) {
            iStartButton = 1;
            iEndButton = iPages;
        }
        else {
            if (iCurrentPage <= iPageCountHalf) {
                iStartButton = 1;
                iEndButton = iPageCount;
            }
            else {
                if (iCurrentPage >= (iPages - iPageCountHalf)) {
                    iStartButton = iPages - iPageCount + 1;
                    iEndButton = iPages;
                }
                else {
                    iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
                    iEndButton = iStartButton + iPageCount - 1;
                }
            }
        }

        /* Build the dynamic list */
        for (i = iStartButton; i <= iEndButton; i++) {
            if (iCurrentPage != i) {
                sList += '<span class="' + oClasses.sPageButton + '">' + i + '</span>';
            }
            else {
                sList += '<span class="' + oClasses.sPageButtonActive + '">' + i + '</span>';
            }
        }

        /* Loop over each instance of the pager */
        var an = oSettings.aanFeatures.p;
        var anButtons, anStatic, nPaginateList;
        var fnClick = function (e) {
            /* Use the information in the element to jump to the required page */
            var iTarget = (this.innerHTML * 1) - 1;
            oSettings._iDisplayStart = iTarget * oSettings._iDisplayLength;
            fnCallbackDraw(oSettings);
            e.preventDefault();
        };
        var fnFalse = function () { return false; };

        for (i = 0, iLen = an.length; i < iLen; i++) {
            if (an[i].childNodes.length === 0) {
                continue;
            }

            /* Build up the dynamic list forst - html and listeners */
            var qjPaginateList = $('span:eq(1)', an[i]);
            qjPaginateList.html(sList);
            $('span', qjPaginateList).bind('click.DT', fnClick).bind('mousedown.DT', fnFalse)
				.bind('selectstart.DT', fnFalse);
            
            /* Update the 'premanent botton's classes */
            anButtons = an[i].getElementsByTagName('span');
            anStatic = [
				anButtons[0], anButtons[anButtons.length - 1]
			];
            $(anStatic).removeClass(oClasses.sPageButton + " " + oClasses.sPageButtonActive + " " + oClasses.sPageButtonStaticDisabled);
            if (iCurrentPage == 1) {
                anStatic[0].className += " " + oClasses.sPageButtonStaticDisabled;
            }
            else {
                anStatic[0].className += " " + oClasses.sPageButton;
            }

            if (iPages === 0 || iCurrentPage == iPages || oSettings._iDisplayLength == -1) {
                anStatic[1].className += " " + oClasses.sPageButtonStaticDisabled;
            }
            else {
                anStatic[1].className += " " + oClasses.sPageButton;
            }
        }
    }
}
