blob: b95b23bd375b859688abe7dc29c9e7691eaf03d4 [file] [log] [blame]
/*
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.image.SlideShow"]){
dojo._hasResource["dojox.image.SlideShow"]=true;
dojo.provide("dojox.image.SlideShow");
dojo.require("dojo.string");
dojo.require("dojo.fx");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.declare("dojox.image.SlideShow",[dijit._Widget,dijit._Templated],{imageHeight:375,imageWidth:500,title:"",titleTemplate:"${title} <span class=\"slideShowCounterText\">(${current} of ${total})</span>",noLink:false,loop:true,hasNav:true,images:[],pageSize:20,autoLoad:true,autoStart:false,fixedHeight:false,imageStore:null,linkAttr:"link",imageLargeAttr:"imageUrl",titleAttr:"title",slideshowInterval:3,templateString:dojo.cache("dojox.image","resources/SlideShow.html","<div dojoAttachPoint=\"outerNode\" class=\"slideShowWrapper\">\n\t<div style=\"position:relative;\" dojoAttachPoint=\"innerWrapper\">\n\t\t<div class=\"slideShowNav\" dojoAttachEvent=\"onclick: _handleClick\">\n\t\t\t<div class=\"dijitInline slideShowTitle\" dojoAttachPoint=\"titleNode\">${title}</div>\n\t\t</div>\n\t\t<div dojoAttachPoint=\"navNode\" class=\"slideShowCtrl\" dojoAttachEvent=\"onclick: _handleClick\">\n\t\t\t<span dojoAttachPoint=\"navPrev\" class=\"slideShowCtrlPrev\"></span>\n\t\t\t<span dojoAttachPoint=\"navPlay\" class=\"slideShowCtrlPlay\"></span>\n\t\t\t<span dojoAttachPoint=\"navNext\" class=\"slideShowCtrlNext\"></span>\n\t\t</div>\n\t\t<div dojoAttachPoint=\"largeNode\" class=\"slideShowImageWrapper\"></div>\t\t\n\t\t<div dojoAttachPoint=\"hiddenNode\" class=\"slideShowHidden\"></div>\n\t</div>\n</div>\n"),_imageCounter:0,_tmpImage:null,_request:null,postCreate:function(){
this.inherited(arguments);
var _1=document.createElement("img");
_1.setAttribute("width",this.imageWidth);
_1.setAttribute("height",this.imageHeight);
if(this.hasNav){
dojo.connect(this.outerNode,"onmouseover",this,function(_2){
try{
this._showNav();
}
catch(e){
}
});
dojo.connect(this.outerNode,"onmouseout",this,function(_3){
try{
this._hideNav(_3);
}
catch(e){
}
});
}
this.outerNode.style.width=this.imageWidth+"px";
_1.setAttribute("src",this._blankGif);
var _4=this;
this.largeNode.appendChild(_1);
this._tmpImage=this._currentImage=_1;
this._fitSize(true);
this._loadImage(0,dojo.hitch(this,"showImage",0));
this._calcNavDimensions();
},setDataStore:function(_5,_6,_7){
this.reset();
var _8=this;
this._request={query:{},start:_6.start||0,count:_6.count||this.pageSize,onBegin:function(_9,_a){
_8.maxPhotos=_9;
}};
if(_6.query){
dojo.mixin(this._request.query,_6.query);
}
if(_7){
dojo.forEach(["imageLargeAttr","linkAttr","titleAttr"],function(_b){
if(_7[_b]){
this[_b]=_7[_b];
}
},this);
}
var _c=function(_d){
_8.maxPhotos=_d.length;
_8._request.onComplete=null;
if(_8.autoStart){
_8.imageIndex=-1;
_8.toggleSlideShow();
}else{
_8.showImage(0);
}
};
this.imageStore=_5;
this._request.onComplete=_c;
this._request.start=0;
this.imageStore.fetch(this._request);
},reset:function(){
dojo.query("> *",this.largeNode).orphan();
this.largeNode.appendChild(this._tmpImage);
dojo.query("> *",this.hiddenNode).orphan();
dojo.forEach(this.images,function(_e){
if(_e&&_e.parentNode){
_e.parentNode.removeChild(_e);
}
});
this.images=[];
this.isInitialized=false;
this._imageCounter=0;
},isImageLoaded:function(_f){
return this.images&&this.images.length>_f&&this.images[_f];
},moveImageLoadingPointer:function(_10){
this._imageCounter=_10;
},destroy:function(){
if(this._slideId){
this._stop();
}
this.inherited(arguments);
},showNextImage:function(_11,_12){
if(_11&&this._timerCancelled){
return false;
}
if(this.imageIndex+1>=this.maxPhotos){
if(_11&&(this.loop||_12)){
this.imageIndex=-1;
}else{
if(this._slideId){
this._stop();
}
return false;
}
}
this.showImage(this.imageIndex+1,dojo.hitch(this,function(){
if(_11){
this._startTimer();
}
}));
return true;
},toggleSlideShow:function(){
if(this._slideId){
this._stop();
}else{
dojo.toggleClass(this.domNode,"slideShowPaused");
this._timerCancelled=false;
var idx=this.imageIndex;
if(idx<0||(this.images[idx]&&this.images[idx]._img.complete)){
var _13=this.showNextImage(true,true);
if(!_13){
this._stop();
}
}else{
var _14=dojo.subscribe(this.getShowTopicName(),dojo.hitch(this,function(_15){
setTimeout(dojo.hitch(this,function(){
if(_15.index==idx){
var _16=this.showNextImage(true,true);
if(!_16){
this._stop();
}
dojo.unsubscribe(_14);
}
}),this.slideshowInterval*1000);
}));
dojo.publish(this.getShowTopicName(),[{index:idx,title:"",url:""}]);
}
}
},getShowTopicName:function(){
return (this.widgetId||this.id)+"/imageShow";
},getLoadTopicName:function(){
return (this.widgetId?this.widgetId:this.id)+"/imageLoad";
},showImage:function(_17,_18){
if(!_18&&this._slideId){
this.toggleSlideShow();
}
var _19=this;
var _1a=this.largeNode.getElementsByTagName("div");
this.imageIndex=_17;
var _1b=function(){
if(_19.images[_17]){
while(_19.largeNode.firstChild){
_19.largeNode.removeChild(_19.largeNode.firstChild);
}
dojo.style(_19.images[_17],"opacity",0);
_19.largeNode.appendChild(_19.images[_17]);
_19._currentImage=_19.images[_17]._img;
_19._fitSize();
var _1c=function(a,b,c){
var img=_19.images[_17].firstChild;
if(img.tagName.toLowerCase()!="img"){
img=img.firstChild;
}
var _1d=img.getAttribute("title")||"";
if(_19._navShowing){
_19._showNav(true);
}
dojo.publish(_19.getShowTopicName(),[{index:_17,title:_1d,url:img.getAttribute("src")}]);
if(_18){
_18(a,b,c);
}
_19._setTitle(_1d);
};
dojo.fadeIn({node:_19.images[_17],duration:300,onEnd:_1c}).play();
}else{
_19._loadImage(_17,function(){
_19.showImage(_17,_18);
});
}
};
if(_1a&&_1a.length>0){
dojo.fadeOut({node:_1a[0],duration:300,onEnd:function(){
_19.hiddenNode.appendChild(_1a[0]);
_1b();
}}).play();
}else{
_1b();
}
},_fitSize:function(_1e){
if(!this.fixedHeight||_1e){
var _1f=(this._currentImage.height+(this.hasNav?20:0));
dojo.style(this.innerWrapper,"height",_1f+"px");
return;
}
dojo.style(this.largeNode,"paddingTop",this._getTopPadding()+"px");
},_getTopPadding:function(){
if(!this.fixedHeight){
return 0;
}
return (this.imageHeight-this._currentImage.height)/2;
},_loadNextImage:function(){
if(!this.autoLoad){
return;
}
while(this.images.length>=this._imageCounter&&this.images[this._imageCounter]){
this._imageCounter++;
}
this._loadImage(this._imageCounter);
},_loadImage:function(_20,_21){
if(this.images[_20]||!this._request){
return;
}
var _22=_20-(_20%(this._request.count||this.pageSize));
this._request.start=_22;
this._request.onComplete=function(_23){
var _24=_20-_22;
if(_23&&_23.length>_24){
_25(_23[_24]);
}else{
}
};
var _26=this;
var _27=this.imageStore;
var _25=function(_28){
var url=_26.imageStore.getValue(_28,_26.imageLargeAttr);
var img=new Image();
var div=dojo.create("div",{id:_26.id+"_imageDiv"+_20});
div._img=img;
var _29=_26.imageStore.getValue(_28,_26.linkAttr);
if(!_29||_26.noLink){
div.appendChild(img);
}else{
var a=dojo.create("a",{"href":_29,"target":"_blank"},div);
a.appendChild(img);
}
dojo.connect(img,"onload",function(){
if(_27!=_26.imageStore){
return;
}
_26._fitImage(img);
dojo.attr(div,{"width":_26.imageWidth,"height":_26.imageHeight});
dojo.publish(_26.getLoadTopicName(),[_20]);
setTimeout(function(){
_26._loadNextImage();
},1);
if(_21){
_21();
}
});
_26.hiddenNode.appendChild(div);
var _2a=dojo.create("div",{className:"slideShowTitle"},div);
_26.images[_20]=div;
dojo.attr(img,"src",url);
var _2b=_26.imageStore.getValue(_28,_26.titleAttr);
if(_2b){
dojo.attr(img,"title",_2b);
}
};
this.imageStore.fetch(this._request);
},_stop:function(){
if(this._slideId){
clearTimeout(this._slideId);
}
this._slideId=null;
this._timerCancelled=true;
dojo.removeClass(this.domNode,"slideShowPaused");
},_prev:function(){
if(this.imageIndex<1){
return;
}
this.showImage(this.imageIndex-1);
},_next:function(){
this.showNextImage();
},_startTimer:function(){
var id=this.id;
this._slideId=setTimeout(function(){
dijit.byId(id).showNextImage(true);
},this.slideshowInterval*1000);
},_calcNavDimensions:function(){
dojo.style(this.navNode,"position","absolute");
dojo.style(this.navNode,"top","-10000px");
dojo._setOpacity(this.navNode,99);
this.navPlay._size=dojo.marginBox(this.navPlay);
this.navPrev._size=dojo.marginBox(this.navPrev);
this.navNext._size=dojo.marginBox(this.navNext);
dojo._setOpacity(this.navNode,0);
dojo.style(this.navNode,{"position":"",top:""});
},_setTitle:function(_2c){
this.titleNode.innerHTML=dojo.string.substitute(this.titleTemplate,{title:_2c,current:1+this.imageIndex,total:this.maxPhotos||""});
},_fitImage:function(img){
var _2d=img.width;
var _2e=img.height;
if(_2d>this.imageWidth){
_2e=Math.floor(_2e*(this.imageWidth/_2d));
img.height=_2e;
img.width=_2d=this.imageWidth;
}
if(_2e>this.imageHeight){
_2d=Math.floor(_2d*(this.imageHeight/_2e));
img.height=this.imageHeight;
img.width=_2d;
}
},_handleClick:function(e){
switch(e.target){
case this.navNext:
this._next();
break;
case this.navPrev:
this._prev();
break;
case this.navPlay:
this.toggleSlideShow();
break;
}
},_showNav:function(_2f){
if(this._navShowing&&!_2f){
return;
}
dojo.style(this.navNode,"marginTop","0px");
var _30=dojo.style(this.navNode,"width")/2-this.navPlay._size.w/2-this.navPrev._size.w;
dojo.style(this.navPlay,"marginLeft",_30+"px");
var _31=dojo.marginBox(this.outerNode);
var _32=this._currentImage.height-this.navPlay._size.h-10+this._getTopPadding();
if(_32>this._currentImage.height){
_32+=10;
}
dojo[this.imageIndex<1?"addClass":"removeClass"](this.navPrev,"slideShowCtrlHide");
dojo[this.imageIndex+1>=this.maxPhotos?"addClass":"removeClass"](this.navNext,"slideShowCtrlHide");
var _33=this;
if(this._navAnim){
this._navAnim.stop();
}
if(this._navShowing){
return;
}
this._navAnim=dojo.fadeIn({node:this.navNode,duration:300,onEnd:function(){
_33._navAnim=null;
}});
this._navAnim.play();
this._navShowing=true;
},_hideNav:function(e){
if(!e||!this._overElement(this.outerNode,e)){
var _34=this;
if(this._navAnim){
this._navAnim.stop();
}
this._navAnim=dojo.fadeOut({node:this.navNode,duration:300,onEnd:function(){
_34._navAnim=null;
}});
this._navAnim.play();
this._navShowing=false;
}
},_overElement:function(_35,e){
if(typeof (dojo)=="undefined"){
return false;
}
_35=dojo.byId(_35);
var m={x:e.pageX,y:e.pageY};
var bb=dojo._getBorderBox(_35);
var _36=dojo.coords(_35,true);
var _37=_36.x;
return (m.x>=_37&&m.x<=(_37+bb.w)&&m.y>=_36.y&&m.y<=(top+bb.h));
}});
}