	function Paginator( pPageSize, pULid, pUL, pObjects )
	{
		this.items = null;
		this.paginationArea = null;
		this.page = 1;
		this.pageSize = pPageSize;

		if( pULid )
		{
			pUL = document.getElementById( pULid );
		}
		if( pUL ) 
		{
			this.items = pUL.getElementsByTagName( "li" );
			this.paginationArea = document.createElement("div");
			this.paginationArea.id = "PaginationArea";
			
			Paginator.InsertAfter( this.paginationArea, pUL );
			
			if( this.items.length == 0 )
			{ 
				/*if( this.ResultsContainer )
				{
					if( document.getElementById( this.ResultsContainer ) && this.NothingFoundMessage )
					{ 
						 document.getElementById( this.ResultsContainer ).innerHTML = this.NothingFoundMessage;
					}
				}*/
			}
		}
		if( pObjects )
		{
			this.items = pObjects;
		}

		Paginator._instance = this;
	}
	Paginator.GetInstance = function()
	{
		if( Paginator._instance )
		{
			return Paginator._instance;
		}
		else
		{
			throw "Must Initialize Paginator Before Using It!";
		}	
	}
	Paginator.Paginate = function( pPage )
	{
		if( ! pPage )
		{
			pPage = Paginator.GetInstance().page;
		}
		
		Paginator.GetInstance().Paginate( pPage );
	}
	Paginator.prototype.Paginate = function( pPage )
	{
		if( ! pPage )
		{
			pPage = 1;
		}
		
		this.page = pPage;
		
		var pageBottom = ( this.page-1 ) * this.pageSize;
		var pageTop =  ( ( this.page ) * this.pageSize ) - 1;	

		var itemsToUse =  this.GetFilteredItems();

		if( itemsToUse.length != this.items.length )
		{
			for( var i=0; i < this.items.length; i++ )
			{
				this.items[ i ].style.display = 'none';
			}
		}

		for( var i=0; i < itemsToUse.length; i++ )
		{
			var outOfRange = ( i < pageBottom ) || ( i > pageTop );
			
			if( itemsToUse[ i ] )
			{
				itemsToUse[ i ].style.display = outOfRange ? 'none' : '';
			}
		}
		
		if( this.paginationArea )
		{
			Paginator.WritePages();
		}
	}
	Paginator.prototype.GetFilteredItems =function()
	{
		return this.items;
	}
	Paginator.ChangePage =function( pPage, pNamedAnchor )
	{
		Paginator.GetInstance().Paginate( pPage );

		var height = document.getElementById( Paginator.NamedAnchor ) ? document.getElementById( Paginator.NamedAnchor ).offsetTop : 0;
		if( height >= 0 )
		{
		    window.scrollTo( 0, height );
		}
	}
	Paginator.NextPage = function()
	{
		Paginator.GetInstance().Paginate( ++this.GetInstance().page );
	}
	Paginator.LastPage = function()
	{
		Paginator.GetInstance().Paginate( --this.GetInstance().page );
	}
	Paginator.HidePages = function()
	{
		if(  Paginator.GetInstance(). domParent )
		{
			Paginator.GetInstance(). domParent.style.display = 'none';
		
		}
	}
	Paginator.WritePages = function( pDomParentID, pDomParent )
	{
		if( pDomParentID )
		{
			pDomParent = document.getElementById( pDomParentID );
		}

		if( pDomParent ||  Paginator.GetInstance().paginationArea )
		{
			if( !  Paginator.GetInstance().paginationArea )
			{
				 Paginator.GetInstance().paginationArea = pDomParent;
			}
		
			Paginator.GetInstance(). paginationArea.style.display = '';

			var html = "Pages: <ul>";
			var numberOfPages = ( Paginator.GetInstance().GetFilteredItems().length ) /  ( Paginator.GetInstance().pageSize );

			for( var i=0; i < numberOfPages; i++ )
			{
				html += "<li>";

				if( ( i +1 ) != Paginator.GetInstance().page )
				{
					html += "<a href='javascript:Paginator.ChangePage( " +(i+1) + " )'>";
				}
				else
				{
					html += "<strong>";
				}

				html += (i+1);

				if( ( i +1 ) != Paginator.GetInstance().page )
				{
					html += "</a>";
				}
				else
				{
					html += "</strong>";
				}
				 html += "</li>";
			}
			
			html += "</ul><div id='NumberPerPage'><span>Number per page:</span><input onkeypress='Paginator.HandleEnter( event )' id='PaginatorPageSizeChanger' maxlength='3' size='3' type='text' value='"+ Paginator.GetInstance().pageSize + "'><button onclick='Paginator.ChangePageSize()'>go</button></div>";

			Paginator.GetInstance().paginationArea.innerHTML = html;
		}
		
	}
	Paginator.HandleEnter = function( event )
	{
		if( ! event ) event = window.event;

        	if( event.keyCode ) keyCode = event.keyCode;
        	else if( event.which ) keyCode = event.which;

        	if( keyCode == 13 )
        	{
			    Paginator.ChangePageSize();
		    }
	}
	Paginator.ChangePageSize = function()
	{
		if( document.getElementById( "PaginatorPageSizeChanger" ).value == "" )
		{
				
		} 
		else if( ! isNaN( document.getElementById( "PaginatorPageSizeChanger" ).value ) &&  document.getElementById( "PaginatorPageSizeChanger" ).value >= 1 )
		{
			Paginator.GetInstance().pageSize = document.getElementById( "PaginatorPageSizeChanger" ).value;	
			
			var numberOfPages = Math.ceil( ( Paginator.GetInstance().GetFilteredItems().length ) /  ( Paginator.GetInstance().pageSize ) );

			if( Paginator.GetInstance().page > numberOfPages )
			{
			    Paginator.GetInstance().page = numberOfPages;
			}
		}		
		
		Paginator.Paginate();
		window.location.hash = Paginator.NamedAnchor;
	}
	Paginator.InsertAfter = function( pNew, pExisting )
    {
        var Parent = pExisting.parentNode;
        
        if( Parent.lastchild == pExisting )
        {
            Parent.AppendChild( pNew );
        }
        else
        {
            Parent.insertBefore( pNew, pExisting.nextSibling );
        }
    }
