Subversion-Projekte lars-tiefland.cienc

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

/**
 * Sometimes for quick navigation, it can be useful to allow an end user to
 * enter which page they wish to jump to manually. This paging control uses a
 * text input box to accept new paging numbers (arrow keys are also allowed
 * for), and four standard navigation buttons are also presented to the end
 * user.
 *
 *  @name Navigation with text input
 *  @summary Shows an input element into which the user can type a page number
 *  @author [Allan Jardine](http://sprymedia.co.uk)
 *
 *  @example
 *    $(document).ready(function() {
 *        $('#example').dataTable( {
 *            "sPaginationType": "input"
 *        } );
 *    } );
 */

$.fn.dataTableExt.oPagination.input = {
        "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
        {
                var nFirst = document.createElement( 'span' );
                var nPrevious = document.createElement( 'span' );
                var nNext = document.createElement( 'span' );
                var nLast = document.createElement( 'span' );
                var nInput = document.createElement( 'input' );
                var nPage = document.createElement( 'span' );
                var nOf = document.createElement( 'span' );

                nFirst.innerHTML = oSettings.oLanguage.oPaginate.sFirst;
                nPrevious.innerHTML = oSettings.oLanguage.oPaginate.sPrevious;
                nNext.innerHTML = oSettings.oLanguage.oPaginate.sNext;
                nLast.innerHTML = oSettings.oLanguage.oPaginate.sLast;

                nFirst.className = "paginate_button first disabled";
                nPrevious.className = "paginate_button previous disabled";
                nNext.className="paginate_button next";
                nLast.className = "paginate_button last";
                nOf.className = "paginate_of";
                nPage.className = "paginate_page";
                nInput.className = "paginate_input";

                if ( oSettings.sTableId !== '' )
                {
                        nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
                        nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
                        nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
                        nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
                        nLast.setAttribute( 'id', oSettings.sTableId+'_last' );
                }

                nInput.type = "text";
                nPage.innerHTML = "Page ";

                nPaging.appendChild( nFirst );
                nPaging.appendChild( nPrevious );
                nPaging.appendChild( nPage );
                nPaging.appendChild( nInput );
                nPaging.appendChild( nOf );
                nPaging.appendChild( nNext );
                nPaging.appendChild( nLast );

                $(nFirst).click( function ()
                {
                        var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
                                if (iCurrentPage != 1)
                                {
                                oSettings.oApi._fnPageChange( oSettings, "first" );
                                fnCallbackDraw( oSettings );
                                $(nFirst).addClass('disabled');
                                $(nPrevious).addClass('disabled');
                                $(nNext).removeClass('disabled');
                                $(nLast).removeClass('disabled');
                                }
                } );

                $(nPrevious).click( function()
                {
                        var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
                                if (iCurrentPage != 1)
                                {
                                oSettings.oApi._fnPageChange(oSettings, "previous");
                                        fnCallbackDraw(oSettings);
                                        if (iCurrentPage == 2)
                                        {
                                                $(nFirst).addClass('disabled');
                                                $(nPrevious).addClass('disabled');
                                        }
                                        $(nNext).removeClass('disabled');
                                        $(nLast).removeClass('disabled');
                        }
                } );

                $(nNext).click( function()
                {
                        var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
                        if (iCurrentPage != Math.ceil((oSettings.fnRecordsDisplay() / oSettings._iDisplayLength)))
                        {
                                oSettings.oApi._fnPageChange(oSettings, "next");
                                fnCallbackDraw(oSettings);
                                if (iCurrentPage == (Math.ceil((oSettings.fnRecordsDisplay() - 1) / oSettings._iDisplayLength) - 1))
                                {
                                        $(nNext).addClass('disabled');
                                        $(nLast).addClass('disabled');
                                }
                                $(nFirst).removeClass('disabled');
                                $(nPrevious).removeClass('disabled');
                        }
                } );

                $(nLast).click( function()
                {
                        var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
                                if (iCurrentPage != Math.ceil((oSettings.fnRecordsDisplay() / oSettings._iDisplayLength)))
                                {
                                        oSettings.oApi._fnPageChange(oSettings, "last");
                                        fnCallbackDraw(oSettings);
                                        $(nFirst).removeClass('disabled');
                                        $(nPrevious).removeClass('disabled');
                                        $(nNext).addClass('disabled');
                                        $(nLast).addClass('disabled');
                                }
                } );

                $(nInput).keyup( function (e) {
                        // 38 = up arrow, 39 = right arrow
                        if ( e.which == 38 || e.which == 39 )
                        {
                                this.value++;
                        }
                        // 37 = left arrow, 40 = down arrow
                        else if ( (e.which == 37 || e.which == 40) && this.value > 1 )
                        {
                                this.value--;
                        }

                        if ( this.value === "" || this.value.match(/[^0-9]/) )
                        {
                                /* Nothing entered or non-numeric character */
                                this.value = this.value.replace(/[^\d]/g, ''); // don't even allow anything but digits
                                return;
                        }

                        var iNewStart = oSettings._iDisplayLength * (this.value - 1);
                                if (iNewStart < 0)
                                {
                                        iNewStart = 0;
                                }
                                if (iNewStart > oSettings.fnRecordsDisplay())
                                {
                                        iNewStart = (Math.ceil((oSettings.fnRecordsDisplay() - 1) / oSettings._iDisplayLength) - 1) * oSettings._iDisplayLength;
                                }

                                if (iNewStart === 0)
                                {
                                        $(nFirst).addClass('disabled');
                                        $(nPrevious).addClass('disabled');
                                        $(nNext).removeClass('disabled');
                                        $(nLast).removeClass('disabled');
                                }
                                else if (iNewStart == ((Math.ceil((oSettings.fnRecordsDisplay() - 1) / oSettings._iDisplayLength) - 1) * oSettings._iDisplayLength))
                                {
                                        $(nNext).addClass('disabled');
                                        $(nLast).addClass('disabled');
                                        $(nFirst).removeClass('disabled');
                                        $(nPrevious).removeClass('disabled');
                                }
                                else
                                {
                                        $(nFirst).removeClass('disabled');
                                        $(nPrevious).removeClass('disabled');
                                        $(nNext).removeClass('disabled');
                                        $(nLast).removeClass('disabled');
                                }

                        oSettings._iDisplayStart = iNewStart;
                        fnCallbackDraw( oSettings );
                } );

                /* Take the brutal approach to cancelling text selection */
                $('span', nPaging).bind( 'mousedown', function () { return false; } );
                $('span', nPaging).bind( 'selectstart', function () { return false; } );
                
                // If we can't page anyway, might as well not show it
                var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
                if(iPages <= 1)
                {
                        $(nPaging).hide();
                }
        },


        "fnUpdate": function ( oSettings, fnCallbackDraw )
        {
                if ( !oSettings.aanFeatures.p )
                {
                        return;
                }
                var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
                var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;

                var an = oSettings.aanFeatures.p;
                if (iPages <= 1) // hide paging when we can't page
                {
                        $(an).hide();
                }
                else
                {
                        /* Loop over each instance of the pager */
                        for (var i = 0, iLen = an.length ; i < iLen ; i++)
                        {
                                var spans = an[i].getElementsByTagName('span');
                                var inputs = an[i].getElementsByTagName('input');
                                spans[3].innerHTML = " of " + iPages;
                                inputs[0].value = iCurrentPage;
                        }
                }
        }
};