/*
 * 翻页组件
 */
Fangbole.Paginator = Class.create({
	initialize: function(options){
		this.options = Object.extend({
			total: 0,//总页数
			page: 1,//当前页
			rowsPerPage: 20,//todo
			baseURL: '#',
			className: 'pagination_t1',//样式类型
			onSelect: Prototype.emptyFunction,
			id: '',
			mode:'ajax',//'ajax','form'//分页类型
			formElements:null,
			enableJumpe:true,//有无跳转
			enablePreviousNext:true,//有无上下页
			enableFirstLast:true,//有无第一页最后一页
			showAmount:{//页码显示
				start:7,
				center:5,
				end:7
			}
		}, options || {})
		this.total = parseInt(this.options.total);
		this.page = parseInt(this.options.page);
		this.element = [];
		//this.group = this.options.group;
	},
	//filter.observe(this.onFilterChange.bind(this, filter)); 
	observe: function(callback){
		if(!this.element.length)
			throw 'no element rendered, can not observing';
		this.element[0].observe('paginator:page', callback);
	},
	onClick: function(e){
		var elt = e.element(), page;
		if(elt.className=='p_num_btn'){
			page = parseInt(elt.innerHTML);
			this.select(page,elt);
		}else if(elt.className=='p_previous_btn'){
			//WARNING! text input must appear before button
			try{
				page = parseInt(this.previous());
				if(page <= this.total)
					this.select(page,elt);
			}catch(e){}
		}else if(elt.className=='p_next_btn'){
			//WARNING! text input must appear before button
			try{
				page = parseInt(this.next());
				if(page <= this.total)
					this.select(page,elt);
			}catch(e){}
		}else if(elt.className=='p_jump_btn'){
			//WARNING! text input must appear before button
			try{
				numInput=elt.adjacent('.p_jump_lable')[0];
				page=parseInt($F(numInput));
				if(page <= this.total && page >0){
					this.select(page,elt);
				}else{
					alert("您的输入有误，请重新输入!");
					numInput.value=this.page;
				}
				//page = parseInt(this.jump());
			}catch(e){}
		}
	},
	update: function(oPage, target){
		var oPage = oPage || {};
		var target = target || this.element;
		target = Object.isArray(target) ? target : [target];	
		this.page = typeof oPage.page == 'number' ? oPage.page : this.page;
		this.total = this.total = typeof oPage.total == 'number' ? oPage.total : this.total;
		//this.total = this.total = 9;
		var showAmount=this.options.showAmount;
		var start=parseInt(showAmount.start);
		var center=parseInt(showAmount.center);
		var end=parseInt(showAmount.end)
		
		//classic page model implement
		//other model can be switch here
		if(this.total>1){
			var pages = '';
			if(this.total <= start){//如果总条数小于开头显示量，只显示数字
				for(var i = 1; i < this.total + 1; ++ i){
					if(i != this.page){
						pages += Fangbole.Paginator.template[this.options.mode].item.evaluate({number: i});
					}
					else
						pages += Fangbole.Paginator.template[this.options.mode].itemCurrent.evaluate({number: i});
				}
			}else{//按算法添加应该显示的页数
				var visiblePageNum = []
				if(this.page < Math.ceil(start*2/3)){
					visiblePageNum = visiblePageNum.concat($A($R(1,start)));//10
					visiblePageNum.push('');
					visiblePageNum.push(this.total);
				}else if(this.total - this.page<Math.ceil(end*2/3)-1){
					visiblePageNum.push(1);
					visiblePageNum.push('');
					visiblePageNum = visiblePageNum.concat($A($R(this.total - end+1, this.total)));//9
				}else{
					visiblePageNum.push(1);
					visiblePageNum.push('');
					visiblePageNum = visiblePageNum.concat($A($R(this.page - (center-1)/2, this.page + (center-1)/2)));//4
					visiblePageNum.push('');
					visiblePageNum.push(this.total);
				}
				for(var i = 0; i < visiblePageNum.length; ++ i){
					if(visiblePageNum[i] == '')
						pages += Fangbole.Paginator.template[this.options.mode].split.evaluate({});
					else{
						if(visiblePageNum[i] != this.page)
							pages += Fangbole.Paginator.template[this.options.mode].item.evaluate({link: visiblePageNum[i], number: visiblePageNum[i]});
						else
							pages += Fangbole.Paginator.template[this.options.mode].itemCurrent.evaluate({number: visiblePageNum[i]});
					}
				}
				
			}
			var p_previous="";
			var p_next="";//显示上下页
			if(this.options.enablePreviousNext&&this.total!=0){
				if(this.page>1)
					p_previous=Fangbole.Paginator.template[this.options.mode].p_previous.evaluate();
				if(this.page<this.total)
					p_next=Fangbole.Paginator.template[this.options.mode].p_next.evaluate();
			}
			var p_jump="";//显示跳转页
			if(this.options.enableJumpe&&this.total!=0){
				p_jump=Fangbole.Paginator.template[this.options.mode].p_jump.evaluate({page:this.page})
			}
			var hidden="";//form提交隐藏域
			if(this.options.formElements){
				$H(this.options.formElements).each(function(itm){
					hidden+=Fangbole.Paginator.template[this.options.mode].hidden.evaluate({key:itm.key,value:itm.value});
				}.bind(this))
				hidden+=Fangbole.Paginator.template[this.options.mode].hidden.evaluate({key:'page',value:''});
			}
			//总渲染
			var html = Fangbole.Paginator.template[this.options.mode].main.evaluate({p_previous:p_previous,pages: pages,p_next:p_next,p_jump:p_jump,hidden:hidden,baseURL:this.options.baseURL});
			target.each(function(t){t.update(html)});
		}else if(this.element.length>0){
			this.element.each(function(el){
				$(el).update();
			})
		}
	},
	getValue: function(){
		return this.page;
	},
	select: function(page,elt){
		if(page > this.total)return;
		if(this.options.mode=='form'){
			var form=elt.ancestors().find(function(elt){
				if(elt.tagName.toLowerCase()=="form")
					return true;
			})
			form.page.value=page;
			form.submit();
			//this.redirect(this.options.baseURL+page)
		}else{
			this.update({page: page});
			if(this.element.length)
				this.element[0].fire('paginator:page', {filter: this});
		}
		this.options.onSelect(page);			
	},
	previous: function(){
		return this.page==1?1:(this.page-1)
	},
	first: function(){
	},
	next: function(){
		return this.page==this.total?1:(this.page+1)		
	},
	last: function(){
		
	},
	render: function(element, position){//渲染分页元素
		var position = position || 'bottom',
			insertion = {};
		var el = new Element('div', {className: this.options.className});//元素容器(目标元素)
		el.observe('click', this.onClick.bindAsEventListener(this));//为容器绑定点击事件，具体点击元素具体分析
		this.element.push(el);
		this.update({}, el);

		insertion[position] = el;
		$(element).insert(insertion);
	},
	remove: function(el){
		this.element = this.element.without(el);
		el.remove();
	},
	show: function(){
		this.element.invoke('show');
	},
	hide: function(){
		this.element.invoke('hide');
	},
	redirect:function(url){
		window.location.href=url;
	}
})

Object.extend(Fangbole.Paginator, {
	template: {
		form:{
			main: new Template('<form action="#{baseURL}" method="post"><ul>#{p_previous}#{pages}#{p_next}#{p_jump}</ul>#{hidden}</form>'),
			item: new Template('<li class="p_num"><a href="javascript:void(0)" class="p_num_btn">#{number}</a></li>'),
			split: new Template('<li><span>...</span></li>'),
			itemCurrent: new Template('<li class="current p_num"><span>#{number}</span></li>'),
			p_previous:new Template('<li class="p_previous"><a href="javascript:void(0)" class="p_previous_btn">上一页</a></li>'),
			p_next:new Template('<li class="p_next"><a href="javascript:void(0)" class="p_next_btn">下一页</a></li>'),
			hidden:new Template('<input type="hidden" name="#{key}" value="#{value}"/>'),
			p_jump:new Template('<li class="p_jump"><span>到第</span><input type="text" class="p_jump_lable" value="#{page}"></input><span>页</span><a href="javascript:void(0)" class="p_jump_btn">确定</a></li>')
		},
		ajax:{
			main: new Template('<ul>#{p_previous}#{pages}#{p_next}#{p_jump}</ul>'),
			item: new Template('<li class="p_num"><a href="javascript:void(0)" class="p_num_btn">#{number}</a></li>'),
			split: new Template('<li><span>...</span></li>'),
			itemCurrent: new Template('<li class="current p_num"><span>#{number}</span></li>'),
			p_previous:new Template('<li class="p_previous"><a href="javascript:void(0)" class="p_previous_btn">上一页</a></li>'),
			p_next:new Template('<li class="p_next"><a href="javascript:void(0)" class="p_next_btn">下一页</a></li>'),
			p_jump:new Template('<li class="p_jump"><span>到第</span><input type="text" class="p_jump_lable" value="#{page}"></input><span>页</span><a href="javascript:void(0)" class="p_jump_btn">确定</a></li>')
		}
	}
})
