/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.widget.Pager"]){
dojo._hasResource["dojox.widget.Pager"]=true;
dojo.provide("dojox.widget.Pager");
dojo.experimental("dojox.widget.Pager");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dojo.fx");
dojo.declare("dojox.widget.Pager",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dojox.widget","Pager/Pager.html","<div dojoAttachPoint=\"pagerContainer\" tabIndex=\"0\" dojoAttachEvent=\"onkeypress: _handleKey, onfocus: _a11yStyle, onblur:_a11yStyle\" class=\"${orientation}PagerContainer\">\n    <div class=\"pagerContainer\">\n\t\t<div dojoAttachPoint=\"pagerContainerStatus\" class=\"${orientation}PagerStatus\"></div>\n\t\t<div dojoAttachPoint=\"pagerContainerView\" class=\"${orientation}PagerView\">\n\t\t    <div dojoAttachPoint=\"pagerItemContainer\"><ul dojoAttachPoint=\"pagerItems\" class=\"pagerItems\"></ul></div>\n\t\t</div>\n\t\t<div dojoAttachPoint=\"pagerContainerPager\" class=\"${orientation}PagerPager\">\n\t\t\t<div tabIndex=\"0\" dojoAttachPoint=\"pagerNext\" class=\"pagerIconContainer\" dojoAttachEvent=\"onclick: _pagerNext\"><img dojoAttachPoint=\"pagerIconNext\" src=\"${iconNext}\" alt=\"Next\" /></div>\n\t\t\t<div tabIndex=\"0\" dojoAttachPoint=\"pagerPrevious\" class=\"pagerIconContainer\" dojoAttachEvent=\"onclick: _pagerPrevious\"><img dojoAttachPoint=\"pagerIconPrevious\" src=\"${iconPrevious}\" alt=\"Previous\" /></div>\n\t\t</div>\n    </div>\n\t<div dojoAttachPoint=\"containerNode\" style=\"display:none\"></div>\n</div>\n"),iconPage:dojo.moduleUrl("dojox.widget","Pager/images/pageInactive.png"),iconPageActive:dojo.moduleUrl("dojox.widget","Pager/images/pageActive.png"),store:null,orientation:"horizontal",statusPos:"leading",pagerPos:"center",duration:500,itemSpace:2,resizeChildren:true,itemClass:"dojox.widget._PagerItem",itemsPage:3,postMixInProperties:function(){
var h=(this.orientation=="horizontal");
dojo.mixin(this,{_totalPages:0,_currentPage:1,dirClass:"pager"+(h?"Horizontal":"Vertical"),iconNext:dojo.moduleUrl("dojox.widget","Pager/images/"+(h?"h":"v")+"Next.png"),iconPrevious:dojo.moduleUrl("dojox.widget","Pager/images/"+(h?"h":"v")+"Previous.png")});
},postCreate:function(){
this.inherited(arguments);
this.store.fetch({onComplete:dojo.hitch(this,"_init")});
},_a11yStyle:function(e){
dojo[(e.type=="focus"?"addClass":"removeClass")](e.target,"pagerFocus");
},_handleKey:function(e){
var dk=dojo.keys;
var _1=(e.charCode==dk.SPACE?dk.SPACE:e.keyCode);
switch(_1){
case dk.UP_ARROW:
case dk.RIGHT_ARROW:
case 110:
case 78:
e.preventDefault();
this._pagerNext();
break;
case dk.DOWN_ARROW:
case dk.LEFT_ARROW:
case 112:
case 80:
e.preventDefault();
this._pagerPrevious();
break;
case dk.ENTER:
switch(e.target){
case this.pagerNext:
this._pagerNext();
break;
case this.pagerPrevious:
this._pagerPrevious();
break;
}
break;
}
},_init:function(_2){
this.items=_2;
this._renderPages();
this._renderStatus();
this._renderPager();
},_renderPages:function(){
var _3=this.pagerContainerView;
var _4=(this.orientation=="horizontal");
var _5=dojo.style;
if(_4){
var _6=dojo.marginBox(this.pagerContainerPager).h;
var _7=dojo.marginBox(this.pagerContainerStatus).h;
if(this.pagerPos!="center"){
var _8=_6+_7;
}else{
var _8=_7;
var _9=this.pagerIconNext.width;
var _a=_5(_3,"width");
var _b=_a-(2*_9);
_5(_3,{width:_b+"px",marginLeft:this.pagerIconNext.width+"px",marginRight:this.pagerIconNext.width+"px"});
}
var _c=_5(this.pagerContainer,"height")-_8;
_5(this.pagerContainerView,"height",_c+"px");
var _d=Math.floor(_5(_3,"width")/this.itemsPage);
if(this.statusPos=="trailing"){
if(this.pagerPos!="center"){
_5(_3,"marginTop",_6+"px");
}
_5(_3,"marginBottom",_7+"px");
}else{
_5(_3,"marginTop",_7+"px");
if(this.pagerPos!="center"){
_5(_3,"marginTop",_6+"px");
}
}
}else{
var _e=dojo.marginBox(this.pagerContainerPager).w;
var _f=dojo.marginBox(this.pagerContainerStatus).w;
var _10=_5(this.pagerContainer,"width");
if(this.pagerPos!="center"){
var _11=_e+_f;
}else{
var _11=_f;
var _12=this.pagerIconNext.height;
var _13=_5(_3,"height");
var _14=_13-(2*_12);
_5(_3,{height:_14+"px",marginTop:this.pagerIconNext.height+"px",marginBottom:this.pagerIconNext.height+"px"});
}
var _15=_5(this.pagerContainer,"width")-_11;
_5(_3,"width",_15+"px");
var _d=Math.floor(_5(_3,"height")/this.itemsPage);
if(this.statusPos=="trailing"){
if(this.pagerPos!="center"){
_5(_3,"marginLeft",_e+"px");
}
_5(_3,"marginRight",_f+"px");
}else{
_5(_3,"marginLeft",_f+"px");
if(this.pagerPos!="center"){
_5(_3,"marginRight",_e+"px");
}
}
}
var _16=dojo.getObject(this.itemClass);
var _17="padding"+(_4?"Left":"Top");
var _18="padding"+(_4?"Right":"Bottom");
dojo.forEach(this.items,function(_19,cnt){
var _1a=dojo.create("div",{innerHTML:_19.content});
var _1b=new _16({id:this.id+"-item-"+(cnt+1)},_1a);
this.pagerItems.appendChild(_1b.domNode);
var _1c={};
_1c[(_4?"width":"height")]=(_d-this.itemSpace)+"px";
var p=(_4?"height":"width");
_1c[p]=_5(_3,p)+"px";
_5(_1b.containerNode,_1c);
if(this.resizeChildren){
_1b.resizeChildren();
}
_1b.parseChildren();
_5(_1b.domNode,"position","absolute");
if(cnt<this.itemsPage){
var pos=(cnt)*_d;
var _1d=(_4?"left":"top");
var dir=(_4?"top":"left");
_5(_1b.domNode,dir,"0px");
_5(_1b.domNode,_1d,pos+"px");
}else{
_5(_1b.domNode,"top","-1000px");
_5(_1b.domNode,"left","-1000px");
}
_5(_1b.domNode,_18,(this.itemSpace/2)+"px");
_5(_1b.domNode,_17,(this.itemSpace/2)+"px");
},this);
},_renderPager:function(){
var tcp=this.pagerContainerPager;
var _1e="0px";
var _1f=(this.orientation=="horizontal");
if(_1f){
if(this.statusPos=="center"){
}else{
if(this.statusPos=="trailing"){
dojo.style(tcp,"top",_1e);
}else{
dojo.style(tcp,"bottom",_1e);
}
}
dojo.style(this.pagerNext,"right",_1e);
dojo.style(this.pagerPrevious,"left",_1e);
}else{
if(this.statusPos=="trailing"){
dojo.style(tcp,"left",_1e);
}else{
dojo.style(tcp,"right",_1e);
}
dojo.style(this.pagerNext,"bottom",_1e);
dojo.style(this.pagerPrevious,"top",_1e);
}
},_renderStatus:function(){
this._totalPages=Math.ceil(this.items.length/this.itemsPage);
this.iconWidth=0;
this.iconHeight=0;
this.iconsLoaded=0;
this._iconConnects=[];
for(var i=1;i<=this._totalPages;i++){
var _20=new Image();
var _21=i;
dojo.connect(_20,"onclick",dojo.hitch(this,function(_22){
this._pagerSkip(_22);
},_21));
this._iconConnects[_21]=dojo.connect(_20,"onload",dojo.hitch(this,function(_23){
this.iconWidth+=_20.width;
this.iconHeight+=_20.height;
this.iconsLoaded++;
if(this._totalPages==this.iconsLoaded){
if(this.orientation=="horizontal"){
if(this.statusPos=="trailing"){
if(this.pagerPos=="center"){
var _24=dojo.style(this.pagerContainer,"height");
var _25=dojo.style(this.pagerContainerStatus,"height");
dojo.style(this.pagerContainerPager,"top",((_24/2)-(_25/2))+"px");
}
dojo.style(this.pagerContainerStatus,"bottom","0px");
}else{
if(this.pagerPos=="center"){
var _24=dojo.style(this.pagerContainer,"height");
var _25=dojo.style(this.pagerContainerStatus,"height");
dojo.style(this.pagerContainerPager,"bottom",((_24/2)-(_25/2))+"px");
}
dojo.style(this.pagerContainerStatus,"top","0px");
}
var _26=(dojo.style(this.pagerContainer,"width")/2)-(this.iconWidth/2);
dojo.style(this.pagerContainerStatus,"paddingLeft",_26+"px");
}else{
if(this.statusPos=="trailing"){
if(this.pagerPos=="center"){
var _27=dojo.style(this.pagerContainer,"width");
var _28=dojo.style(this.pagerContainerStatus,"width");
dojo.style(this.pagerContainerPager,"left",((_27/2)-(_28/2))+"px");
}
dojo.style(this.pagerContainerStatus,"right","0px");
}else{
if(this.pagerPos=="center"){
var _27=dojo.style(this.pagerContainer,"width");
var _28=dojo.style(this.pagerContainerStatus,"width");
dojo.style(this.pagerContainerPager,"right",((_27/2)-(_28/2))+"px");
}
dojo.style(this.pagerContainerStatus,"left","0px");
}
var _26=(dojo.style(this.pagerContainer,"height")/2)-(this.iconHeight/2);
dojo.style(this.pagerContainerStatus,"paddingTop",_26+"px");
}
}
dojo.disconnect(this._iconConnects[_23]);
},_21));
if(i==this._currentPage){
_20.src=this.iconPageActive;
}else{
_20.src=this.iconPage;
}
var _21=i;
dojo.addClass(_20,this.orientation+"PagerIcon");
dojo.attr(_20,"id",this.id+"-status-"+i);
this.pagerContainerStatus.appendChild(_20);
if(this.orientation=="vertical"){
dojo.style(_20,"display","block");
}
}
},_pagerSkip:function(_29){
if(this._currentPage==_29){
return;
}else{
var _2a;
var _2b;
if(_29<this._currentPage){
_2a=this._currentPage-_29;
_2b=(this._totalPages+_29)-this._currentPage;
}else{
_2a=(this._totalPages+this._currentPage)-_29;
_2b=_29-this._currentPage;
}
var b=(_2b>_2a);
this._toScroll=(b?_2a:_2b);
var cmd=(b?"_pagerPrevious":"_pagerNext");
var _2c=this.connect(this,"onScrollEnd",function(){
this._toScroll--;
if(this._toScroll<1){
this.disconnect(_2c);
}else{
this[cmd]();
}
});
this[cmd]();
}
},_pagerNext:function(){
if(this._anim){
return;
}
var _2d=[];
for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
if(!dojo.byId(this.id+"-item-"+i)){
continue;
}
var _2e=dojo.byId(this.id+"-item-"+i);
var _2f=dojo.marginBox(_2e);
if(this.orientation=="horizontal"){
var _30=_2f.l-(this.itemsPage*_2f.w);
_2d.push(dojo.fx.slideTo({node:_2e,left:_30,duration:this.duration}));
}else{
var _30=_2f.t-(this.itemsPage*_2f.h);
_2d.push(dojo.fx.slideTo({node:_2e,top:_30,duration:this.duration}));
}
}
var _31=this._currentPage;
if(this._currentPage==this._totalPages){
this._currentPage=1;
}else{
this._currentPage++;
}
var cnt=this.itemsPage;
for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
if(dojo.byId(this.id+"-item-"+i)){
var _2e=dojo.byId(this.id+"-item-"+i);
var _2f=dojo.marginBox(_2e);
if(this.orientation=="horizontal"){
var _32=(dojo.style(this.pagerContainerView,"width")+((cnt-1)*_2f.w))-1;
dojo.style(_2e,"left",_32+"px");
dojo.style(_2e,"top","0px");
var _30=_32-(this.itemsPage*_2f.w);
_2d.push(dojo.fx.slideTo({node:_2e,left:_30,duration:this.duration}));
}else{
_32=(dojo.style(this.pagerContainerView,"height")+((cnt-1)*_2f.h))-1;
dojo.style(_2e,"top",_32+"px");
dojo.style(_2e,"left","0px");
var _30=_32-(this.itemsPage*_2f.h);
_2d.push(dojo.fx.slideTo({node:_2e,top:_30,duration:this.duration}));
}
}
cnt--;
}
this._anim=dojo.fx.combine(_2d);
var _33=this.connect(this._anim,"onEnd",function(){
delete this._anim;
this.onScrollEnd();
this.disconnect(_33);
});
this._anim.play();
dojo.byId(this.id+"-status-"+_31).src=this.iconPage;
dojo.byId(this.id+"-status-"+this._currentPage).src=this.iconPageActive;
},_pagerPrevious:function(){
if(this._anim){
return;
}
var _34=[];
for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
if(!dojo.byId(this.id+"-item-"+i)){
continue;
}
var _35=dojo.byId(this.id+"-item-"+i);
var _36=dojo.marginBox(_35);
if(this.orientation=="horizontal"){
var _37=dojo.style(_35,"left")+(this.itemsPage*_36.w);
_34.push(dojo.fx.slideTo({node:_35,left:_37,duration:this.duration}));
}else{
var _37=dojo.style(_35,"top")+(this.itemsPage*_36.h);
_34.push(dojo.fx.slideTo({node:_35,top:_37,duration:this.duration}));
}
}
var _38=this._currentPage;
if(this._currentPage==1){
this._currentPage=this._totalPages;
}else{
this._currentPage--;
}
var cnt=this.itemsPage;
var j=1;
for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
if(dojo.byId(this.id+"-item-"+i)){
var _35=dojo.byId(this.id+"-item-"+i);
var _36=dojo.marginBox(_35);
if(this.orientation=="horizontal"){
var _39=-(j*_36.w)+1;
dojo.style(_35,"left",_39+"px");
dojo.style(_35,"top","0px");
var _37=((cnt-1)*_36.w);
_34.push(dojo.fx.slideTo({node:_35,left:_37,duration:this.duration}));
var _37=_39+(this.itemsPage*_36.w);
_34.push(dojo.fx.slideTo({node:_35,left:_37,duration:this.duration}));
}else{
_39=-((j*_36.h)+1);
dojo.style(_35,"top",_39+"px");
dojo.style(_35,"left","0px");
var _37=((cnt-1)*_36.h);
_34.push(dojo.fx.slideTo({node:_35,top:_37,duration:this.duration}));
}
}
cnt--;
j++;
}
this._anim=dojo.fx.combine(_34);
var _3a=dojo.connect(this._anim,"onEnd",dojo.hitch(this,function(){
delete this._anim;
this.onScrollEnd();
dojo.disconnect(_3a);
}));
this._anim.play();
dojo.byId(this.id+"-status-"+_38).src=this.iconPage;
dojo.byId(this.id+"-status-"+this._currentPage).src=this.iconPageActive;
},onScrollEnd:function(){
}});
dojo.declare("dojox.widget._PagerItem",[dijit._Widget,dijit._Templated],{templateString:"<li class=\"pagerItem\" dojoAttachPoint=\"containerNode\"></li>",resizeChildren:function(){
var box=dojo.marginBox(this.containerNode);
dojo.style(this.containerNode.firstChild,{width:box.w+"px",height:box.h+"px"});
},parseChildren:function(){
dojo.parser.parse(this.containerNode);
}});
}
