/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * File:		SMPageControl.js
 *              This is all David's fault
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

var SMPageControl = Class.create({

	Name: null,
	_Control: null,
	_PrevButton: null,
	_NextButton: null,
	_PageButton: null,
	_PagesContainer: null,
	_DescContainer: null,
	_PrevButtonClone: null,
	_NextButtonClone: null,
	_DelayTimer: null,

	initialize: function( ControlID, Options ) {
		this.Name = ControlID;
		this._Control = $(this.Name);
		this._Options = Options;
		
		if ( !this._Control ) return;
		
		// Why? WHY? WHYY?
		if ( this._Control.hasClassName('proc') ) return;
		this._Control.addClassName('proc');
		
		this._PrevButton = this._Control.down('.SMPageControlTemplate .SMPageControlPrev');
		if ( this._PrevButton ) {
			this._PrevButton = this._PrevButton.clone(true);
			this._NextButton = this._Control.down('.SMPageControlTemplate .SMPageControlNext').clone(true);
			this._PageButton = this._Control.down('.SMPageControlTemplate .SMPageControlPage').clone(true);
			this._PagesContainer = this._Control.down('.SMPageControlTemplate .SMPageControlPages').clone(true);
			this._DescContainer = this._Control.down('.SMPageControlTemplate .SMPageControlDesc').clone(true);
		}
		
		this.BuildDelay(100);
		
		Event.observe(window, 'resize', this.BuildDelay.bind(this) );
	},

	PostBack: function( PageNumber ) {
		SMLayoutManager.FireAjaxEvent( this.Name, 'SMPageControl', {
			EventType: 'OnChangePage', PageNumber: PageNumber
		});
	},
	
	BuildDelay: function( delay ) {
        if ( delay == null ) delay = 500;
		
        if ( ( this._Control.up() != null && this._Control.up().getWidth() == 0 ) || ( $$('html.oRTL').length == 0 && $$('html.oLTR').length == 0 ) ) {
		
			clearTimeout( this._DelayTimer );
			this._DelayTimer = setTimeout( this.BuildDelay.bind(this), delay );
		
		} else {
			
			this.Build();
			
		}
		
	},
	
	AddPage: function( PageNumber ) {
		var PageNumberElement = this._PageButton.clone(true);
		if ( PageNumber == this._Options.CurrentPage ) {
			PageNumberElement.addClassName( 'Current' );
			PageNumberElement.observe('click',function(){ return false; });
		} else {
			PageNumberElement.observe('click',this.PostBack.bind( this, PageNumber ) );
		}
		PageNumberElement.update( PageNumber );
		return PageNumberElement;
	},
	
	MakeCursor: function( Node, PageNumber, Depth ) {
		return {
			Node: Node,
			PageNumber: PageNumber,
			Depth: Depth
		}
	},
	
	Build: function() {
		if ( !this._Control.up() ) return;
		
		if ( this._NextButtonClone ) this._NextButtonClone.remove();
		if ( this._PrevButtonClone ) this._PrevButtonClone.remove();
		this._PagesContainer.update('');
		
		this._Control.setStyle({width:'auto'});
		
		if ( this._Options.TotalPages > 1 ) {
		
			var padding = 0;
			
			if ( this._Options.CurrentPage > 1 && this._Options.HasNextPrevButtons ) {
				this._PrevButtonClone = this._PrevButton.clone(true);
				this._PrevButtonClone.observe('click',this.PostBack.bind( this, this._Options.CurrentPage - 1 ) );
				this._Control.insert( this._PrevButtonClone );
				padding += this._PrevButtonClone.getWidth();
			}
			
			this._Control.insert(this._PagesContainer);
			
			if ( this._Options.CurrentPage < this._Options.TotalPages && this._Options.HasNextPrevButtons  ) {
				this._NextButtonClone = this._NextButton.clone(true);
				this._NextButtonClone.observe('click',this.PostBack.bind( this, this._Options.CurrentPage + 1 ) );
				this._Control.insert( this._NextButtonClone );
				padding += this._NextButtonClone.getWidth();
			}
			
		}
		
		this._Control.insert(this._DescContainer);
		
		var CurrentRecord = ( ( this._Options.CurrentPage - 1 ) * this._Options.PageSize ) + 1;
		var NextRecord = CurrentRecord + this._Options.PageSize - 1;
		
		if ( this._Options.ItemName.length ) {
			this._DescContainer.update( this._Options.ItemName + " " + CurrentRecord + "-" + ( NextRecord > this._Options.TotalCount ? this._Options.TotalCount : NextRecord ) + " " + this._Options.PageOfLabel + " " + this._Options.TotalCount );
		} else {
			this._DescContainer.update("");
		}

		if ( this._Options.TotalPages <= 1 ) return;

		padding += this._DescContainer.getWidth() + 40;
		var space = this._Control.up().getWidth() - padding;
		
		var LastElement = this.MakeCursor( this.AddPage( this._Options.CurrentPage ), this._Options.CurrentPage, 0 );
		this._PagesContainer.insert( LastElement.Node );
		
		// Add in first page
		if ( this._Options.CurrentPage > 1 ) {
			var StartElement = this.AddPage( 1 );
			StartElement.addClassName('Anchor');
			LastElement.Node.insert({ before: StartElement });
			
			if ( this._PagesContainer.getWidth() >= space ) {
				StartElement.remove();
				this._Control.setStyle({width: this._Control.getWidth() + 'px' });
				return;
			}
		} else {
			LastElement.Node.addClassName('First');
		}
		
		// Add in last page
		if ( this._Options.CurrentPage < this._Options.TotalPages ) {
			var EndElement = this.AddPage( this._Options.TotalPages );
			EndElement.addClassName('Anchor');
			LastElement.Node.insert({ after: EndElement });
			
			if ( this._PagesContainer.getWidth() >= space ) {
				EndElement.remove();
				this._Control.setStyle({width: this._Control.getWidth() + 'px' });
				return;
			}
		}
		
		var ItemCount = 0;
		var NextPageNumber;
		var KeepLast = false;
		var HeadElement = this.MakeCursor( LastElement.Node, LastElement.PageNumber, 0 );
		var TailElement = this.MakeCursor( LastElement.Node, LastElement.PageNumber, 0 );
		while( this._PagesContainer.getWidth() < space ) {
			
			if ( ItemCount % 2 == 0 ) {
				
				if ( this._Options.TotalPages < 100 ) {
					NextPageNumber = HeadElement.PageNumber - 1;
				} else {
					if ( HeadElement.Depth < 4 ) {
						NextPageNumber = HeadElement.PageNumber - 1;
					} else if ( HeadElement.Depth < 9 ) {
						NextPageNumber = HeadElement.PageNumber - 10;
					} else {
						NextPageNumber = HeadElement.PageNumber - 100;
					}
				}
				
				if ( NextPageNumber > 1 ) {
					LastElement = this.MakeCursor(
						this.AddPage( NextPageNumber ),
						NextPageNumber,
						HeadElement.Depth + 1
					);
					HeadElement.Node.insert({ before: LastElement.Node });
					HeadElement = LastElement;
				} else {
					HeadElement.PageNumber = -1;
				}
				
			} else {
				
				if ( this._Options.TotalPages < 100 ) {
					NextPageNumber = TailElement.PageNumber + 1;
				} else {
					if ( TailElement.Depth < 4 ) {
						NextPageNumber = TailElement.PageNumber + 1;
					} else if ( TailElement.Depth < 9 ) {
						NextPageNumber = TailElement.PageNumber + 10;
					} else {
						NextPageNumber = TailElement.PageNumber + 100;
					}
				}
				
				if ( NextPageNumber < this._Options.TotalPages ) {
					LastElement = this.MakeCursor(
						this.AddPage( NextPageNumber ),
						NextPageNumber,
						TailElement.Depth + 1
					);
					TailElement.Node.insert({ after: LastElement.Node });
					TailElement = LastElement;
				} else {
					TailElement.PageNumber = this._Options.TotalPages;
				}
				
			}
			
			ItemCount++;
			if ( HeadElement.PageNumber <= 2 && TailElement.PageNumber >= this._Options.TotalPages-1 ) {
				KeepLast = true;
				break;
			}
			
		}
		
		if ( !KeepLast ) LastElement.Node.remove();
		this._Control.setStyle({width: this._Control.getWidth() + 'px' });
	}

});

