$.fn.dataTableExt.oPagination.full_numbers_iweb = {
    /*
     * Function: oPagination.full_numbers.fnInit
     * Purpose:  Initalise dom elements required for pagination with a list of the pages
     * Returns:  -
     * Inputs:   object:oSettings - dataTables settings object
     *           node:nPaging - the DIV which contains this pagination control
     *           function:fnCallbackDraw - draw function which must be called on update
     */
    "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
    {
        // language definition
		oSettings.oLanguage.oPaginate.sToggleToAll = "Show all";
		oSettings.oLanguage.oPaginate.sToggleToPaging = "Activate paging";

        // load external lang for internationalisation... is there a better way??
        if ((typeof oGlobalLang != 'undefined') && (typeof oGlobalLang.oPaginate != 'undefined') && (typeof oGlobalLang.oPaginate.sToggleToAll != 'undefined') && (oGlobalLang.oPaginate.sToggleToAll != '')) {
            oSettings.oLanguage.oPaginate.sToggleToAll = oGlobalLang.oPaginate.sToggleToAll;
        }
        if ((typeof oGlobalLang != 'undefined') && (typeof oGlobalLang.oPaginate != 'undefined') && (typeof oGlobalLang.oPaginate.sToggleToPaging != 'undefined') && (oGlobalLang.oPaginate.sToggleToPaging != '')) {
            oSettings.oLanguage.oPaginate.sToggleToPaging = oGlobalLang.oPaginate.sToggleToPaging;
        }

        var nToggle = document.createElement( 'span' );

        var nFirst = document.createElement( 'span' );
        var nPrevious = document.createElement( 'span' );
        var nList = document.createElement( 'span' );
        var nNext = document.createElement( 'span' );
        var nLast = document.createElement( 'span' );

        nToggle.innerHTML = oSettings.oLanguage.oPaginate.sToggleToAll;

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

        var oClasses = oSettings.oClasses;
        nToggle.className = oClasses.sPageButton+" "+oSettings.sTableId+"_dataTables_togglePaging";
        nFirst.className = oClasses.sPageButton+" "+oClasses.sPageFirst;
        nPrevious.className = oClasses.sPageButton+" "+oClasses.sPagePrevious;
        nNext.className= oClasses.sPageButton+" "+oClasses.sPageNext;
        nLast.className = oClasses.sPageButton+" "+oClasses.sPageLast;

        nPaging.appendChild( nToggle );
        
        nPaging.appendChild( nFirst );
        nPaging.appendChild( nPrevious );
        nPaging.appendChild( nList );
        nPaging.appendChild( nNext );
        nPaging.appendChild( nLast );

        $(nToggle).click( function () {
            if (oSettings.oFeatures.bPaginate) {
                oSettings.oApi._fnPageChange( oSettings, "first" );
                for (var i=0, iLen=$('.'+oSettings.sTableId+'_dataTables_togglePaging').length ; i<iLen ; i++ ) {
                    $('.'+oSettings.sTableId+'_dataTables_togglePaging')[i].innerHTML = oSettings.oLanguage.oPaginate.sToggleToPaging;
                }
                oSettings.oFeatures.bPaginate = false;
                $('#'+oSettings.sTableId+'_paginate').children().addClass("dataTables_hidden");
                $('#'+oSettings.sTableId+'_paginate').children().removeClass("dataTables_inline");
                $('.'+oSettings.sTableId+'_dataTables_togglePaging').removeClass("dataTables_hidden");
                $('.'+oSettings.sTableId+'_dataTables_togglePaging').addClass("dataTables_inline");
            } else {
                oSettings.oApi._fnPageChange( oSettings, "first" );
                for (var i=0, iLen=$('.'+oSettings.sTableId+'_dataTables_togglePaging').length ; i<iLen ; i++ ) {
                    $('.'+oSettings.sTableId+'_dataTables_togglePaging')[i].innerHTML = oSettings.oLanguage.oPaginate.sToggleToAll;
                }
                oSettings.oFeatures.bPaginate = true;
                $('#'+oSettings.sTableId+'_paginate').children().removeClass("dataTables_hidden");
                $('#'+oSettings.sTableId+'_paginate').children().addClass("dataTables_inline");
            }

            fnCallbackDraw( oSettings );
        } );

        $(nFirst).click( function () {
            if ( oSettings.oApi._fnPageChange( oSettings, "first" ) )
            {
                fnCallbackDraw( oSettings );
            }
        } );

        $(nPrevious).click( function() {
            if ( oSettings.oApi._fnPageChange( oSettings, "previous" ) )
            {
                fnCallbackDraw( oSettings );
            }
        } );

        $(nNext).click( function() {
            if ( oSettings.oApi._fnPageChange( oSettings, "next" ) )
            {
                fnCallbackDraw( oSettings );
            }
        } );

        $(nLast).click( function() {
            if ( oSettings.oApi._fnPageChange( oSettings, "last" ) )
            {
                fnCallbackDraw( oSettings );
            }
        } );

        /* Take the brutal approach to cancelling text selection */
        $('span', nPaging)
            .bind( 'mousedown', function () { return false; } )
            .bind( 'selectstart', 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' );
            nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
            nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
            nLast.setAttribute( 'id', oSettings.sTableId+'_last' );
        }
    },

    /*
     * Function: oPagination.full_numbers.fnUpdate
     * Purpose:  Update the list of page buttons shows
     * Returns:  -
     * Inputs:   object:oSettings - dataTables settings object
     *           function:fnCallbackDraw - draw function to call on page change
     */
    "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() {
            /* 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 );
            return false;
        };
        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 first - html and listeners */
            nPaginateList = an[i].childNodes[3];
            nPaginateList.innerHTML = sList;

            $('span', nPaginateList).click( fnClick ).bind( 'mousedown', fnFalse )
                .bind( 'selectstart', fnFalse );

            /* Update the 'permanent botton's classes */
            anButtons = an[i].getElementsByTagName('span');
            anStatic = [
                anButtons[1], anButtons[2],
                anButtons[anButtons.length-2], anButtons[anButtons.length-1]
            ];
            $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
            if ( iCurrentPage == 1 )
            {
                anStatic[0].className += " "+oClasses.sPageButtonStaticDisabled;
                anStatic[1].className += " "+oClasses.sPageButtonStaticDisabled;
            }
            else
            {
                anStatic[0].className += " "+oClasses.sPageButton;
                anStatic[1].className += " "+oClasses.sPageButton;
            }

            if ( iPages === 0 || iCurrentPage == iPages || oSettings._iDisplayLength == -1 )
            {
                anStatic[2].className += " "+oClasses.sPageButtonStaticDisabled;
                anStatic[3].className += " "+oClasses.sPageButtonStaticDisabled;
            }
            else
            {
                anStatic[2].className += " "+oClasses.sPageButton;
                anStatic[3].className += " "+oClasses.sPageButton;
            }
        }
    }
};


