/**
 * @author Vladimir Tisma
 */
var PaginatorController = Class.create();

PaginatorController.prototype = {

  initialize: function() {
    this.callbacks = new Array();
    this.paginators = new Array();
	this.pageIndexPrepender = '/';
    this.firstTime = true;
	this.loadingHtml = this.getLoadingIcon();
  },

	getLoadingIcon: function() {
		return '<img src="/img/icons/loader.gif"/>';
	},

  addPaginatorNavigation: function(paginatorDivId) {
  	paginatorDiv = $(paginatorDivId);

  	this.extendNavigation(paginatorDiv);

		this.paginators.push(paginatorDiv);
  }
  ,
  addCallback: function(callbackFunction) {
		this.callbacks.push(callbackFunction);
  }
  ,
  showPageEvent: function(eventObject, pageNumber) {
  	Event.stop(eventObject);
  	this.showPage(pageNumber);
  }
  ,
  showPage: function(pageNumber) {
		var container = this.container;
		var paginators = this.paginators;
		var callbacks = this.callbacks;
		var loadingHtml = this.loadingHtml;
		this.recalculateConstraints(pageNumber);

		if(this.firstTime){
			paginators.invoke('update');
			this.firstTime = false;
			return;
		}

		errorMessage = "<b><font color='red'>Error retreiving data</font></b>";

		paginatorStatus = container;
		dotPaginatorStatus = '.' + paginatorStatus;

		$$(dotPaginatorStatus).each(function(div) {div.innerHTML = loadingHtml;});

		new Ajax.Request(this.buildURL(pageNumber), {
			container: this.container,
			method: 'post',
		  onSuccess: function(transport, json) {
	    	if(transport.responseText != "ERROR") {
					$$(dotPaginatorStatus).each(function(div) {div.innerHTML = "";});
		    		paginators.invoke('update');
					callbacks.invoke('render', transport, json);

	    	} else {
	    		container.innerHTML = errorMessage;
	    	}
		  }
		  ,
		  onFailure: function() {
		  	container.innerHTML = errorMessage;
		  }
	  })
  }
  ,
  extendNavigation: function(paginatorDiv) {
  	Object.extend(paginatorDiv,
  								{
  								paginator: this,


  								update: function() {

  									paginatorControl = this.paginator.constraints;
  									previous = this.select('.previousPageSet');
	  								if(paginatorControl.previous > 0) {
  										previous[0].innerHTML = '<a href="#">&lt;&lt;</a>';
	  									Event.observe(previous[0].down('a'), 'click', this.paginator.showPageEvent.bindAsEventListener(this.paginator, paginatorControl.previous));
  									}
  									else {
  										previous[0].innerHTML = '';
  									}

  									next = this.select('.nextPageSet');
	  								if(paginatorControl.next > 0) {
  										next[0].innerHTML = '<a href="#">&gt;&gt;</a>';
	  									Event.observe(next[0].down('a'), 'click', this.paginator.showPageEvent.bindAsEventListener(this.paginator, paginatorControl.next));
  									}
  									else {
  										next[0].innerHTML = '';
  									}


										numbers = this.select('.paginatorNumber');
										for(i=0; i< numbers.length; i++) {
											index = i+paginatorControl.startIndex;
											if(index > paginatorControl.endIndex) {
												numbers[i].innerHTML = '';
											}
											else {
												numbers[i].innerHTML = "<a href='#'>"+(index)+"</a> ";
												Event.observe(numbers[i].down('a'), 'click', this.paginator.showPageEvent.bindAsEventListener(this.paginator, index));
											}

										}
										curPage = numbers[paginatorControl.currentPage - paginatorControl.startIndex];
										curPage.innerHTML = '<span class="currentPage">['+ paginatorControl.currentPage + ']</span> ';
									}});

  }
  ,
  buildURL: function(pageNumber){
  	if(this.pagingUrl.indexOf("###") == -1){
  		url = this.pagingUrl + this.pageIndexPrepender + pageNumber;
  	}
  	else {
  		url = this.pagingUrl.replace("###", pageNumber);
  	}
  	return url;
  }
  ,
  recalculateConstraints: function(pageNumber) {
  	this.constraints.currentPage = pageNumber;
  	this.constraints.next = 0;
		this.constraints.previous = 0;

		if(!this.constraints.totalNumberOfPages) {
			this.constraints.totalNumberOfPages = Math.ceil(this.constraints.totalNumberOfItems / this.constraints.numberOfItemsPerPage);
		}


		this.constraints.startIndex = this.constraints.currentPage - (this.constraints.currentPage - 1) % this.constraints.numberOfPagesPerSet;
		this.constraints.endIndex = Math.min(this.constraints.totalNumberOfPages, this.constraints.startIndex + this.constraints.numberOfPagesPerSet - 1);

		if(this.constraints.startIndex > 1){
			this.constraints.previous = this.constraints.startIndex - 1;
		}
		if(this.constraints.endIndex < this.constraints.totalNumberOfPages){
			this.constraints.next = this.constraints.endIndex + 1;
		}

  }


}