/*
 * Variable: full_numbers_ucpa
 * Purpose:  Full numbers pagination
 * Scope:    jQuery.fn.dataTableExt.oPagination
 */
$.fn.dataTableExt.oPagination.full_numbers_ucpa = {
	/*
	 * 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 )
	{
		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' );
		
		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;
		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( nFirst );
		nPaging.appendChild( nPrevious );
		nPaging.appendChild( nList );
		nPaging.appendChild( nNext );
		nPaging.appendChild( nLast );
		
		$(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;
		}
		/*
		 * Variable: iFullNumbersShowPages
		 * Purpose:  Change the number of pages which can be seen
	 	 * Scope:    jQuery.fn.dataTableExt.oPagination
		 */
		var iFullNumbersShowPages = 5;

		var iPageCount = 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++ )
		{
		var separator = '';
		if(i<iEndButton){
		 separator = ' - ';
		}
		var pageText = '';
		if(i==iStartButton)
		{
			sList += 'Page ';
		}
			if ( iCurrentPage != i )
			{
				sList += '<span class="'+oClasses.sPageButton+'">'+i+'</span>'+separator;
			}
			else
			{
				sList += '<span class="'+oClasses.sPageButtonActive+'">'+i+'</span>'+separator;
			}
		}
		
		/* 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 forst - html and listeners */
			nPaginateList = an[i].childNodes[2];
			nPaginateList.innerHTML = sList;
			
			$('span', nPaginateList).click( fnClick ).bind( 'mousedown', fnFalse )
				.bind( 'selectstart', fnFalse );
			
			/* Update the 'premanent botton's classes */
			anButtons = an[i].getElementsByTagName('span');
			anStatic = [
				anButtons[0], anButtons[1], 
				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;
			}
		}
	}
};
