﻿var PAGE_COUNT_COOKIE = "PAGECOUNT=";
var PAGE_CSS_COOKIE = "PAGECCSS=";
var MAGIC_ALL_VALUE = "PSAll";

var OldPageCount = 0;
var OldPageSize = 10;
var OldPageNumber = 1;

var CurrentPageSize = 10;	//Default page size
var PageHolders = [];		//No holders to start
var TotalRowCount = 0;		//No rows until we're told otherwise
var CurrentPage = 1;		//Start on page 1, of course
var PageCount = 1;			//Assume one page
var CurrentShownStyle = "";	//No style being shown initially
var PageSizes = [];			//Start out with no sizes

function UpdatePaging()
{
	if ( CurrentPageSize == "All" )
		PageCount = 1;
	else
		PageCount = Math.ceil( TotalRowCount / CurrentPageSize );
		
	if ( PageCount < 1 )
		PageCount = 1;

	for ( var hIndex in PageHolders )
	{
		var h = GetHolder( PageHolders[hIndex] );
		h["OnSpan"].innerHTML = CurrentPage;
		h["OfSpan"].innerHTML = PageCount;
	}
	
	if ( ShowStyle( GetCSSClassName() ) )
	{
		if ( CurrentPage == 1 )
			DoNamedSpansAndLinks( "BackPageNav", function(x){x.style.display="none"} );
		else
			DoNamedSpansAndLinks( "BackPageNav", function(x){x.style.display=""} );

		if ( CurrentPage == PageCount )
			DoNamedSpansAndLinks( "ForePageNav", function(x){x.style.display="none"} );
		else
			DoNamedSpansAndLinks( "ForePageNav", function(x){x.style.display=""} );
		
		var CSSClass = "PageSizeLink";
		
		for ( var sIndex in PageSizes )
		{
			var p = PageSizes[sIndex];
			if ( p != CurrentPageSize )
			{
				DoNamedSpansAndLinks( CSSClass + "On" + p, function(x){x.style.display="inline"} );
				DoNamedSpansAndLinks( CSSClass + "Off" + p, function(x){x.style.display="none"} );
			} else {
				DoNamedSpansAndLinks( CSSClass + "On" + p, function(x){x.style.display="none"} );
				DoNamedSpansAndLinks( CSSClass + "Off" + p, function(x){x.style.display="inline"} );
			}
		}
	}
}

//Dear lord, IE, what have you made me do?
function DoNamedSpansAndLinks( name, thing )
{
	if ( document.styleSheets[ document.styleSheets.length - 1 ].insertRule ) {

		var namedThings = document.getElementsByName( name );
		for ( var i = 0 ; i < namedThings.length ; i++ )
		{
			thing( namedThings[i] );
		}
	}
	if ( document.styleSheets[ document.styleSheets.length - 1 ].addRule )
	{
		var spans = document.getElementsByTagName( "span" );
		var links = document.getElementsByTagName( "a" );
		
		var k = 0;
		
		for ( var i = 0 ; i < spans.length; i++ )
		{
			if ( spans[i].name == name )
			{
				k++;
				thing( spans[i] );
			}
		}
		for ( var i = 0 ; i < links.length; i++ )
		{
			if ( links[i].name == name )
			{
				k++;
				thing( links[i] );
			}
		}
	}
}

function GetCSSClassName()
{
	if ( CurrentPageSize == "All" )
		return PersistPagingCSS( MAGIC_ALL_VALUE );
	return PersistPagingCSS( "PS" + CurrentPageSize + "_" + CurrentPage );
}

function PersistPagingCSS( c )
{
	document.cookie = PAGE_CSS_COOKIE + c + "; path=/";
	document.cookie = PAGE_COUNT_COOKIE + TotalRowCount + "; path=/";
	return c;
}

function GetPagingInfo()
{
	var CSS = GetPagingCSS();
	if ( CSS != null )
	{
		if ( CSS == MAGIC_ALL_VALUE )
			return [ "All", 1 ];
		return CSS.replace(/^PS/,"").split("_");
	}
	return null;
}

function CheckSavedPaging()
{
	OldPageCount = GetPagingCount();
	var PagingInfo = GetPagingInfo();
	if ( PagingInfo != null )
	{
		OldPageSize = PagingInfo[0];
		OldPageNumber = PagingInfo[1];
	}

}

function HandleSavedPaging()
{
	if ( TotalRowCount == OldPageCount )
	{
		SetPageSize( OldPageSize );
		CurrentPage = OldPageNumber;
		UpdatePaging();
	}
}

function GetPagingCSS()
{
	return GetPagingCookie( PAGE_CSS_COOKIE );
}

function GetPagingCount()
{
	return GetPagingCookie( PAGE_COUNT_COOKIE );
}

function GetPagingCookie( key ) {
	var ca = document.cookie.split(';');
	var ret = null;
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(key) == 0)
		{
			return c.substring(key.length,c.length);
		}
	}
	return null;
}

function ShowStyle( s )
{
	if ( CurrentShownStyle == s )
		return false;
	if ( document.styleSheets[ document.styleSheets.length - 1 ].insertRule )
	{
		if ( CurrentShownStyle != "" )
			SetCSS( CurrentShownStyle, "display: none;" );
		CurrentShownStyle = s;
		SetCSS( CurrentShownStyle, "display: table-row;" );
	}
	else
	{
		if ( CurrentShownStyle != "" )
			SetCSS( CurrentShownStyle, "display: none;", true );
		CurrentShownStyle = s;
		SetCSS( CurrentShownStyle, "display: block;", true );
	}
	return true;
}

function SetCSS( cssClass, style, byHand )
{
	var selector = "." + cssClass;
	var sheet = document.styleSheets[ document.styleSheets.length - 1 ];
	if ( sheet.insertRule )
	{
		sheet.insertRule( selector + " {" + style + "}", sheet.cssRules.length );
	}
	else if ( sheet.addRule )
	{
		setTimeout( HandleQueuedStyles, 100 );
		QueuedStyles[ selector ] = [ style, byHand ];
//		sheet.addRule( selector, style );
	}
}

var QueuedStyles = {};
function HandleQueuedStyles()
{
	for ( var i in QueuedStyles )
	{
		var style = QueuedStyles[i][0];
		var byHand = QueuedStyles[i][1];
		if ( byHand )
		{
			var splits = style.replace(";","").split(/:\s*/);
			ApplyRuleByHand( i, splits[0], splits[1] );
		} else {
			document.styleSheets[ document.styleSheets.length - 1 ].addRule( i, style );
		}
	}
	QueuedStyles = {};
}

function ApplyRuleByHand( cssClass, cssProperty, cssValue )
{
	var rows = document.getElementsByTagName("tr");
	for ( var i = 0 ; i < rows.length ; i++ )
	{
		if ( (new RegExp(cssClass + "( |$)")).test( rows[i].className ) )
		{
			rows[i].style[cssProperty] = cssValue;
		}
	}
}

function SetPageSize( n )
{
	CurrentPageSize = n;
	PageFirst();
}

function PageFirst()
{
	CurrentPage = 1;
	UpdatePaging();
}

function PagePrevious()
{
	CurrentPage--;
	UpdatePaging();
}

function PageNext()
{
	CurrentPage++;
	UpdatePaging();
}

function PageLast()
{
	CurrentPage = PageCount;
	UpdatePaging();
}

function RegisterPageHolder( holder )
{
	PageHolders.push( holder );
}

function GetHolder( nameObj )
{
	var holder = {};
	for ( var n in nameObj )
		holder[n] = document.getElementById( nameObj[n] );
	return holder;
}

//Check immediately, to rescue the cookie, then handle things later, after load
CheckSavedPaging();
AddLoad( HandleSavedPaging );
