Type.registerNamespace("CyberCoders");
CyberCoders.DataPager = function(element) {
	CyberCoders.DataPager.initializeBase(this, [element]);
	
	this._pageSize = 10;
	this._startIndex = 0;
	this._maxPageNumber = 5;
	this._nextPageText = '';
	this._previousPageText = '';
	this._pageCount = 0;
	
	this._prevLink = null;
	this._nextLink = null;
	this._prevEllipses = null;
	this._nextEllipses = null;
	this._numberLinks = [];
		
	this._linkClickDelegate = null;
}
CyberCoders.DataPager.prototype = {
	get_pageSize : function() {
		return this._pageSize;
	},
	
	set_pageSize : function(value) {
		this._pageSize = value;
	},
		
	get_pageCount : function() {
		return this._pageCount;
	},
	
	set_pageCount : function(value) {
		this._pageCount = value;
				
		this._render();
	},
	
	get_maxPageNumber : function() {
		return this._maxPageNumber;
	},
	
	set_maxPageNumber : function(value) {
		this._maxPageNumber = value;
	},
	
	get_nextPageText : function() {
		return this._nextPageText;
	},
	
	set_nextPageText : function(value) {
		this._nextPageText = value;
	},
	
	get_previousPageText : function() {
		return this._previousPageText;
	},
	
	set_previousPageText : function(value) {
		this._previousPageText = value;
	},
	
	get_currentPage : function() {
		return this._startIndex / this._pageSize;
	},
	
	add_pageChanged : function(handler) {
		this.get_events().addHandler('pageChanged', handler);
	},
	
	remove_pageChanged : function(handler) {
		this.get_events().removeHandler('pageChanged', handler);
	},
	
	initialize : function() {
		CyberCoders.DataPager.callBaseMethod(this, 'initialize');
				
		if (this._linkClickDelegate == null) {
			this._linkClickDelegate = Function.createDelegate(this, this._linkClickHandler);
		}		
	},
	
	dispose : function() {		
		delete this._linkClickDelegate;
	
		CyberCoders.DataPager.callBaseMethod(this, 'dispose');	
	},
	
	next : function() {
		this.raisePageChanged(this.get_currentPage() + 1);
	},
	
	previous : function() {
		this.raisePageChanged(this.get_currentPage() - 1);
	},
	
	jumpToPage : function(page) {
		this.raisePageChanged(page);
	},
	
	raisePageChanged : function(page) {		
		var e = new CyberCoders.DataPagerEventArgs(page);
		
		var handler = this.get_events().getHandler('pageChanged');
		if (handler) {
			handler(this, e);
		}
		
		this._startIndex = page * this._pageSize;
		this._render();
	},
	
	_linkClickHandler : function(event) {
		this.jumpToPage(event.target._page);
	},
		
	_render : function() {
		var elt = this.get_element();
		elt.innerHTML = '';
		
		if (this.get_pageCount() > 1) {
			if (this.get_currentPage() > 0) {
				var prev = document.createElement('a');
				prev.innerHTML = this._previousPageText;
				prev.href = 'javascript:void(0);';
				prev._page = this.get_currentPage() - 1;
				
				elt.appendChild(prev);
				$addHandler(prev, 'click', this._linkClickDelegate);		
				
				var space = document.createTextNode(' ');
				elt.appendChild(space);		
			}
			
			if (this._maxPageNumber > 0) {
				var group = this.get_currentPage() - this.get_currentPage() % this._maxPageNumber;
				if (group > 0) {
					var ellipses = document.createElement('a');
					ellipses.innerHTML = '...';
					ellipses.href = 'javascript:void(0);';
					ellipses._page = group - 1;
					
					elt.appendChild(ellipses);
					$addHandler(prev, 'click', this._linkClickDelegate);
					
					var space = document.createTextNode(' ');
					elt.appendChild(space);
				}
				
				for (var i = group; i < group + this._maxPageNumber && i < this.get_pageCount(); i++) {
					if (this.get_currentPage() == i) {
						var span = document.createElement('span');
						span.innerHTML = (i + 1).toString();
						elt.appendChild(span);
					}

					else {
						var link = document.createElement('a');
						link.innerHTML = (i + 1).toString();
						link.href = 'javascript:void(0);';
						link._page = i;
						
						elt.appendChild(link);
						$addHandler(link, 'click', this._linkClickDelegate);
					}
					
					var space = document.createTextNode(' ');
					elt.appendChild(space);
				}
				
				if (group + this._maxPageNumber < this.get_pageCount()) {
					var ellipses = document.createElement('a');
					ellipses.innerHTML = '...';
					ellipses.href = 'javascript:void(0);';
					ellipses._page = group + this._maxPageNumber;
					
					elt.appendChild(ellipses);
					$addHandler(ellipses, 'click', this._linkClickDelegate);
					
					var space = document.createTextNode(' ');
					elt.appendChild(space);
				}
			}
			
			if (this.get_currentPage() < this.get_pageCount() - 1) {
				var next = document.createElement('a');
				next.innerHTML = this._nextPageText;
				next.href = 'javascript:void(0)';
				next._page = this.get_currentPage() + 1;
				
				elt.appendChild(next);
				$addHandler(next, 'click', this._linkClickDelegate);
			}
		}
	}
}

CyberCoders.DataPager.registerClass("CyberCoders.DataPager", Sys.UI.Control);

CyberCoders.DataPagerEventArgs = function(page) {
	this._page = page;
}

CyberCoders.DataPagerEventArgs.prototype = {
	get_page : function() {
		return this._page;
	}
};
CyberCoders.DataPagerEventArgs.registerClass("CyberCoders.DataPagerEventArgs", Sys.EventArgs);

