Mx.Paginator=Class.create();
Mx.Paginator.prototype = {
	initialize: function(options, pages, total){
		if (this.options != undefined){this._clearNavigator()}
		this.current_page = 1;
		this.pages = pages ? pages : 1;

		this.setOptions(options);

		this._getCountUrl();
	},
		
	setOptions: function(options){
		var current_date = new Date();
		this.options = $H({
			url:			undefined,
			limit:			undefined,
			params: 		{month: current_date.getMonth() + 1, year:current_date.getFullYear()},

			pager:			$('pager'),
			pagerPrev:		$('pager-prev'),
			pagerNext:		$('pager-next'),
			pagerList:		$('pager-list'),

			linked:			'',	
			noLinked:		'disabled',
			selectedPage:	'selected',
			pagerLength:	10,

			onClick:		function(p){return false;}
		}).merge(options);
	},
	
	_getCountUrl: function(){
		if (!this.options.url || !this.options.limit){ return false; }
		new Ajax.Request(this.options.url, {
			method: 'get',
			asynchronous: false,
			parameters: this.options.params,
			onComplete: function(transport,json){
				try{
					if(!json){json = transport.responseText.evalJSON(false);}
					if(!json) throw 'Errors evaluating json';
				}catch(e){alert('_getCountUrl: '+e);}
				this.pages = Math.ceil(json[1].COUNT/this.options.limit);
			}.bind(this),
			onFailure: function(transport,json){
				this.pages=1;
			}.bind(this)
		});
	},

	run: function(){
		this._makeNavigator();
	},
	
	restart:function(){
		this._getCountUrl();
		this._deleteAllPageLinks();
		$(this.options.pagerList).innerHTML='';
		this._makeNavigator();
	},

    _currentPager: function(){
        return new Number(Math.ceil(this.current_page/this.options.pagerLength-1)*this.options.pagerLength+1);
    },

    _makeNavigator: function(){
		if(this.pages<=1){
			$(this.options.pager).hide();
			return ;
		}
		else $(this.options.pager).show();

		var pagerlist=$(this.options.pagerList);
		var current_pager=this._currentPager();

		$(this.options.pagerPrev).name=this.current_page-1;
		$(this.options.pagerNext).name=this.current_page+1;

		if(this.current_page>1) $(this.options.pagerPrev).className=this.options.linked;
		else                    $(this.options.pagerPrev).className=this.options.noLinked;

		if(this.current_page<this.pages)  $(this.options.pagerNext).className=this.options.linked;
		else                    $(this.options.pagerNext).className=this.options.noLinked;

		if (current_pager>1){
			var a=Builder.node('a', {href: '#', name: current_pager-1}); a.innerHTML='&hellip;';
			pagerlist.appendChild(Builder.node('li', {name: current_pager-1}, a));
		}

		for(var i=current_pager, icount=1; i <= this.pages &&  icount<=(this.options.pagerLength+1); i++, icount++){
			var li = Builder.node('li', {name: i}), a;

			if(icount<=this.options.pagerLength){
				a   = Builder.node('a', {href: '#', name: i});
				a.innerHTML=i;
			}
			else{
				a   = Builder.node('a', {href: '#', name: i});
				a.innerHTML='&hellip;';
			}
			if (this.current_page==i){
				$(li).addClassName(this.options.selectedPage);
				$(a).addClassName(this.options.noLinked);
			}

			li.appendChild(a);
			pagerlist.appendChild(li);
		}

		if(!this.navigatorLinks){
			this.navigatorLinks = $(this.options.pager).getElementsBySelector('a[name]','li[name]');
			this._observeNavigator();
		}

		return this.options.pagerList;
	},

    _remakeNavigator: function (new_page){
		if(!$(this.options.pagerList)) return false;
		
		if(this.pages<=1) {
			$(this.options.pager).hide();
			return false;
		}

		if(this._clearNavigator(new_page)){
			delete this.navigatorLinks; this.navigatorLinks=undefined;
			this.current_page=new Number(new_page).valueOf();
			this._makeNavigator();
			return true;
		}
		
		this.current_page=new Number(new_page).valueOf();
		
		$(this.options.pagerPrev).name=this.current_page-1;
		$(this.options.pagerNext).name=this.current_page+1;

        if(new Number($(this.options.pagerPrev).name).valueOf()==0){
			$(this.options.pagerPrev).className=this.options.noLinked;
		}
		else
			$(this.options.pagerPrev).className=this.options.linked;
		if(new Number($(this.options.pagerNext).name).valueOf()>this.pages){
			$(this.options.pagerNext).className=this.options.noLinked;
		}
		else
			$(this.options.pagerNext).className=this.options.linked;

		$(this.options.pagerList).getElementsBySelector('li').each(function(e){

			var epage=e.readAttribute('name');

			if(this.current_page==epage){
				
				$(e).addClassName(this.options.selectedPage);
				$(e).getElementsBySelector('a').each(function(a){ a.className=this.options.noLinked; }.bind(this));
			}
			else{
				$(e).className=this.options.linked;
				$(e).getElementsBySelector('a').each(function(a){ a.className=this.options.linked; }.bind(this));
			}
		}.bind(this));
		
		return true;
    },

	_deleteAllPageLinks: function(){
		if(this.options.pagerList){
			if($(this.navigatorLinks)) $A(this.navigatorLinks).invoke('stopObserving', 'click', this.onClickNavigatorListener);
			$(this.options.pagerList).getElementsBySelector('li').each(function(e){
				$(this.options.pagerList).removeChild(e); delete e;
			}.bind(this));
		}
		this.navigatorLinks=undefined;
	},

	_clearNavigator: function(new_page){
		var current_pager=this._currentPager();

		if(new_page<(current_pager) || new_page>=current_pager+this.options.pagerLength){
			this._deleteAllPageLinks();
			return true;
		}
		return false;
	},

	_observeNavigator: function(){
		this.onClickNavigatorListener = this.onClickNavigatorListener || this.onClickNavigator.bindAsEventListener(this);
		$A(this.navigatorLinks).invoke('observe', 'click', this.onClickNavigatorListener);
	},

	onClickNavigator: function(e){
		Event.stop(e);
		var pn = Event.element(e).getAttribute('name')
		this.options.onClick(pn);
		this._remakeNavigator(pn)
	}
}

