/*
Copyright (c) 2007-2008 the OTHER media Limited
Licensed under the BSD license, http://ojay.othermedia.org/license.html
*/
// @require ojay/core-min
// @require ojay/pkg/http-min
Ojay.Paginator=JS.Class({include:[Ojay.Observable,JS.State],extend:{CONTAINER_CLASS:'paginator',PAGE_CLASS:'page',ITEM_CLASS:'item',SCROLL_TIME:0.5,DIRECTION:'horizontal',EASING:'easeBoth'},initialize:function(a,b){this._0=a;this._1={};b=this._2=b||{};b.scrollTime=b.scrollTime||this.klass.SCROLL_TIME;b.direction=b.direction||this.klass.DIRECTION;b.easing=b.easing||this.klass.EASING;this.setState('CREATED')},getInitialState:function(){return{page:1}},changeState:function(a){if(a.page!==undefined)this._3(a.page);return this},getHTML:function(){var a=this._1,b=this._2;if(a._4)return a._4;var c=Ojay(Ojay.HTML.div({className:this.klass.CONTAINER_CLASS}));c.addClass(this._2.direction);var d=b.width,e=b.height,f;if(b.rows||b.columns){f=this.getItems();if(b.rows)e=(b.rows*f.getHeight())+'px';if(b.columns)d=(b.columns*f.getWidth())+'px'}c.setStyle({width:d,height:e,overflow:'hidden',padding:'0 0 0 0',border:'none',position:'relative'});return a._4=c},getDirection:function(){return this._2.direction},getContainer:function(){return this.getHTML()},getSubject:function(){return this._1._5||undefined},getRegion:function(){if(!this._1._4)return undefined;return this._1._4.getRegion()},getItems:function(){var a=this._1;if(!a._5)return undefined;if(a._6)return a._6;a._6=a._5.children(this._2.selector);a._6.setStyle({margin:'0 0 0 0'});return a._6},getPages:function(){if(this._7)return this._7;var a=this.getItems();if(!a)return undefined;if(a.length===0)return 0;var b=this.getRegion(),c=a.at(0).getRegion();this._8=c.getWidth();this._9=c.getHeight();this._10=(b.getWidth()/this._8).floor()||1;this._11=(b.getHeight()/this._9).floor()||1;this._12=this._11*this._10;this._7=(a.length/this._12).ceil();if(this._2.grouping!==false)this._13();return this._7},_13:function(){var c=this.getRegion(),d=c.getWidth(),e=c.getHeight(),n=this._12,f=this._1._6.toArray();this._7.times(function(i){var a=f.slice(i*n,(i+1)*n);var b=Ojay(Ojay.HTML.div({className:this.klass.PAGE_CLASS}));b.setStyle({'float':'left',width:d+'px',height:e+'px',margin:'0 0 0 0',padding:'0 0 0 0',border:'none'});a.forEach(b.method('insert'));this._1._5.insert(b.node)},this)},getCurrentPage:function(){return this._14||undefined},pageForItem:function(a){if(!this._7)return undefined;var n=this._1._6.length;if(a<1||a>n)return undefined;return((a-1)/this._12).floor()+1},addControls:function(a){if(this.inState('CREATED')||!/^(?:before|after)$/.test(a))return undefined;var b=new this.klass.Controls(this);this.getContainer().insert(b.getHTML().node,a);return b},states:{CREATED:{setup:function(){var a=this._1._5=Ojay(this._0).at(0);if(!a.node)return this;var b=this.getHTML();a.insert(b.node,'after');b.insert(a.node);a.setStyle({padding:'0 0 0 0',border:'none',position:'absolute',left:0,right:0});var c=this._7=this.getPages(),d=this.getRegion();var e=(this._2.direction=='vertical')?{width:d.getWidth()+'px',height:(c*d.getHeight()+1000)+'px'}:{width:(c*d.getWidth()+1000)+'px',height:d.getHeight()+'px'};a.setStyle(e);var f=this.getInitialState();this.setState('READY');this._14=f.page;this._3(f.page);return this}},READY:{setPage:function(a){a=Number(a);if(a==this._14||a<1||a>this._7)return this;this.changeState({page:a});return this},_3:function(a){this.setScroll((a-1)/(this._7-1),{animate:true})},incrementPage:function(){return this.setPage(this._14+1)},decrementPage:function(){return this.setPage(this._14-1)},snapToPage:function(a){this.setScroll((this._14-1)/(this._7-1),{animate:a!==false,silent:true});return this},focusItem:function(a){var b=this.pageForItem(a);if(!b)return this;var c=this._1._6.at(a-1);this.notifyObservers('focusitem',a,c);this.setPage(b);this._1._6.removeClass('focused');c.addClass('focused');return this},setScroll:function(b,c){var d=this._2.direction,e;var f=(d=='vertical')?'getHeight':'getWidth';var g=this._7,h=this.getRegion()[f]()*(g-1);if(b>=0&&b<=1)b=b*h;if(b<0||b>h)return this;this._1._6.removeClass('focused');c=c||{};if(c.animate&&YAHOO.util.Anim){this.setState('SCROLLING');e=(d=='vertical')?{top:{to:-b}}:{left:{to:-b}};this._1._5.animate(e,this._2.scrollTime,{easing:this._2.easing})._(function(a){a.setState('READY')},this)}else{e=(d=='vertical')?{top:(-b)+'px'}:{left:(-b)+'px'};this._1._5.setStyle(e)}if(!c.silent)this.notifyObservers('scroll',b/h,h);var i=(g*(b/h)).ceil()||1;if(i!=this._14){this._14=i;this.notifyObservers('pagechange',i);if(i==1)this.notifyObservers('firstpage');if(i==this._7)this.notifyObservers('lastpage')}return this}},SCROLLING:{}}});Ojay.AjaxPaginator=JS.Class(Ojay.Paginator,{initialize:function(b,c){this.callSuper();this._2.urls=this._2.urls.map(function(a){return{_15:a,_16:false}})},getItems:function(){var b=this._1;if(b._6)return b._6;if(!b._5)return undefined;var c=this._2.urls;if(!c.length)return undefined;c.length.times(function(i){var a=Ojay(Ojay.HTML.div({className:this.klass.ITEM_CLASS}));b._5.insert(a.node,'bottom')},this);var d=this.callSuper();d.fitToRegion(this.getRegion());return d},pageLoaded:function(a){return!!(this._2.urls[a-1]||{})._16},loadPage:function(b,c,d){if(this.pageLoaded(b)||this.inState('CREATED'))return;var e=this._2.urls[b-1],f=this;this.notifyObservers('pagerequest',e._15);Ojay.HTTP.GET(e._15,{},{onSuccess:function(a){a.insertInto(f._1._6.at(b-1));e._16=true;f.notifyObservers('pageload',e._15,a);if(typeof c=='function')c.call(d||null)}})},states:{READY:{_3:function(a){if(this.pageLoaded(a))return this.callSuper();var b=this.method('callSuper');this.setState('REQUESTING');this.loadPage(a,function(){this.setState('READY');b()},this)}},REQUESTING:{}}});Ojay.Paginator.extend({Controls:JS.Class({extend:{CONTAINER_CLASS:'paginator-controls',PREVIOUS_CLASS:'previous',NEXT_CLASS:'next',PAGE_LINKS_CLASS:'pages'},initialize:function(a){this._17=a;this._1={}},getHTML:function(){if(this._17.inState('CREATED'))return null;var e=this._1,f=this.klass,g=this._17;if(e._4)return e._4;e._4=Ojay(Ojay.HTML.div({className:f.CONTAINER_CLASS},function(d){e._18=Ojay(d.div({className:f.PREVIOUS_CLASS},'Previous'));e._19=Ojay(d.div({className:f.PAGE_LINKS_CLASS},function(c){e._20=[];g.getPages().times(function(a){var b=e._20[a]=Ojay(c.span(String(a+1)));b.on('mouseover').addClass('hovered');b.on('mouseout').removeClass('hovered')})}));e._21=Ojay(d.div({className:f.NEXT_CLASS},'Next'))}));e._18.on('click')._(g).decrementPage();e._21.on('click')._(g).incrementPage();e._19.on('click',Ojay.delegateEvent({span:function(a,b){g.setPage(a.node.innerHTML)}}));var h=[e._18,e._21];h.forEach(it().on('mouseover').addClass('hovered'));h.forEach(it().on('mouseout').removeClass('hovered'));g.on('pagechange',function(a,b){this._22(b);h.forEach(it().removeClass('disabled'))},this);var i=g.getCurrentPage();this._22(i);g.on('firstpage')._(e._18).addClass('disabled');g.on('lastpage')._(e._21).addClass('disabled');if(i==1)e._18.addClass('disabled');if(i==g.getPages())e._21.addClass('disabled');e._4.addClass(g.getDirection());return e._4},_22:function(a){this._1._20.forEach({removeClass:'selected'});this._1._20[a-1].addClass('selected')},getPreviousButton:function(){if(this._17.inState('CREATED'))return null;return this._1._18},getNextButton:function(){if(this._17.inState('CREATED'))return null;return this._1._21},getPageButtons:function(){if(this._17.inState('CREATED'))return null;return this._1._19}})});