summaryrefslogtreecommitdiff
path: root/includes/js/dojox/image/Lightbox.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/image/Lightbox.js')
-rw-r--r--includes/js/dojox/image/Lightbox.js451
1 files changed, 0 insertions, 451 deletions
diff --git a/includes/js/dojox/image/Lightbox.js b/includes/js/dojox/image/Lightbox.js
deleted file mode 100644
index 79056d3..0000000
--- a/includes/js/dojox/image/Lightbox.js
+++ /dev/null
@@ -1,451 +0,0 @@
-if(!dojo._hasResource["dojox.image.Lightbox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.image.Lightbox"] = true;
-dojo.provide("dojox.image.Lightbox");
-dojo.experimental("dojox.image.Lightbox");
-
-dojo.require("dijit.Dialog");
-dojo.require("dojox.fx._base");
-
-dojo.declare("dojox.image.Lightbox",
- dijit._Widget,{
- // summary:
- // A dojo-based Lightbox implementation.
- //
- // description:
- // An Elegant, keyboard accessible, markup and store capable Lightbox widget to show images
- // in a modal dialog-esque format. Can show individual images as Modal dialog, or can group
- // images with multiple entry points, all using a single "master" Dialog for visualization
- //
- // key controls:
- // ESC - close
- // Down Arrow / Rt Arrow / N - Next Image
- // Up Arrow / Lf Arrow / P - Previous Image
- //
- // example:
- // | <a href="image1.jpg" dojoType="dojox.image.Lightbox">show lightbox</a>
- //
- // example:
- // | <a href="image2.jpg" dojoType="dojox.image.Lightbox" group="one">show group lightbox</a>
- // | <a href="image3.jpg" dojoType="dojox.image.Lightbox" group="one">show group lightbox</a>
- //
- // example:
- // | not implemented fully yet, though works with basic datastore access. need to manually call
- // | widget._attachedDialog.addImage(item,"fromStore") for each item in a store result set.
- // | <div dojoType="dojox.image.Lightbox" group="fromStore" store="storeName"></div>
- //
- // group: String
- // Grouping images in a page with similar tags will provide a 'slideshow' like grouping of images
- group: "",
-
- // title: String
- // A string of text to be shown in the Lightbox beneath the image (empty if using a store)
- title: "",
-
- // href; String
- // Link to image to use for this Lightbox node (empty if using a store).
- href: "",
-
- // duration: Integer
- // Generic time in MS to adjust the feel of widget. could possibly add various
- // durations for the various actions (dialog fadein, sizeing, img fadein ...)
- duration: 500,
-
- // _allowPassthru: Boolean
- // Privately set this to disable/enable natural link of anchor tags
- _allowPassthru: false,
-
- // _attachedDialg: dojox.image._LightboxDialog
- // The pointer to the global lightbox dialog for this widget
- _attachedDialog: null, // try to share a single underlay per page?
-
- startup: function(){
- this.inherited(arguments);
- // setup an attachment to the masterDialog (or create the masterDialog)
- var tmp = dijit.byId('dojoxLightboxDialog');
- if(tmp){
- this._attachedDialog = tmp;
- }else{
- // this is the first instance to start, so we make the masterDialog
- this._attachedDialog = new dojox.image._LightboxDialog({ id: "dojoxLightboxDialog" });
- this._attachedDialog.startup();
- }
- if(!this.store){
- // FIXME: full store support lacking, have to manually call this._attachedDialog.addImage(imgage,group) as it stands
- this._addSelf();
- this.connect(this.domNode, "onclick", "_handleClick");
- }
- },
-
- _addSelf: function(){
- // summary: Add this instance to the master LightBoxDialog
- this._attachedDialog.addImage({
- href: this.href,
- title: this.title
- },this.group||null);
- },
-
- _handleClick: function(/* Event */e){
- // summary: Handle the click on the link
- if(!this._allowPassthru){ e.preventDefault(); }
- else{ return; }
- this.show();
- },
-
- show: function(){
- // summary: Show the Lightbox with this instance as the starting point
- this._attachedDialog.show(this);
- },
-
- disable: function(){
- // summary: Disables event clobbering and dialog, and follows natural link
- this._allowPassthru = true;
- },
-
- enable: function(){
- // summary: Enables the dialog (prevents default link)
- this._allowPassthru = false;
- }
-
-});
-
-dojo.declare("dojox.image._LightboxDialog",
- dijit.Dialog,{
- // summary:
- // The "dialog" shared between any Lightbox instances on the page
- //
- // description:
- //
- // A widget that intercepts anchor links (typically around images)
- // and displays a modal Dialog. this is the actual Dialog, which you can
- // create and populate manually, though should use simple Lightbox's
- // unless you need to direct access.
- //
- // There should only be one of these on a page, so all dojox.image.Lightbox's will us it
- // (the first instance of a Lightbox to be show()'n will create me If i do not exist)
- //
- // title: String
- // The current title, read from object passed to show()
- title: "",
-
- // FIXME: implement titleTemplate
-
- // inGroup: Array
- // Array of objects. this is populated by from the JSON object _groups, and
- // should not be populate manually. it is a placeholder for the currently
- // showing group of images in this master dialog
- inGroup: null,
-
- // imgUrl: String
- // The src="" attribute of our imageNode (can be null at statup)
- imgUrl: "",
-
- // errorMessage: String
- // The text to display when an unreachable image is linked
- errorMessage: "Image not found.",
-
- // adjust: Boolean
- // If true, ensure the image always stays within the viewport
- // more difficult than necessary to disable, but enabled by default
- // seems sane in most use cases.
- adjust: true,
-
- // an object of arrays, each array (of objects) being a unique 'group'
- _groups: { XnoGroupX: [] },
-
- // errorImg: Url
- // Path to the image used when a 404 is encountered
- errorImg: dojo.moduleUrl("dojox.image","resources/images/warning.png"),
-
- // privates:
- _imageReady: false,
- _blankImg: dojo.moduleUrl("dojo","resources/blank.gif"),
- _clone: null, // the "untained" image
- _wasStyled: null, // indicating taint on the imgNode
-
- // animation holders:
- _loadingAnim:null,
- _showImageAnim: null,
- _showNavAnim: null,
- _animConnects: [],
-
- templateString:"<div class=\"dojoxLightbox\" dojoAttachPoint=\"containerNode\">\n\t<div style=\"position:relative\">\n\t\t<div dojoAttachPoint=\"imageContainer\" class=\"dojoxLightboxContainer\">\n\t\t\t<img dojoAttachPoint=\"imgNode\" src=\"${imgUrl}\" class=\"dojoxLightboxImage\" alt=\"${title}\">\n\t\t\t<div class=\"dojoxLightboxFooter\" dojoAttachPoint=\"titleNode\">\n\t\t\t\t<div class=\"dijitInline LightboxClose\" dojoAttachPoint=\"closeNode\"></div>\n\t\t\t\t<div class=\"dijitInline LightboxNext\" dojoAttachPoint=\"nextNode\"></div>\t\n\t\t\t\t<div class=\"dijitInline LightboxPrev\" dojoAttachPoint=\"prevNode\"></div>\n\n\t\t\t\t<div class=\"dojoxLightboxText\"><span dojoAttachPoint=\"textNode\">${title}</span><span dojoAttachPoint=\"groupCount\" class=\"dojoxLightboxGroupText\"></span></div>\n\t\t\t</div>\n\t\t</div>\t\n\t\t\n\t</div>\n</div>\n",
-
- startup: function(){
- // summary: Add some extra event handlers, and startup our superclass.
-
- this.inherited(arguments);
- this._clone = dojo.clone(this.imgNode);
- this.connect(document.documentElement,"onkeypress","_handleKey");
- this.connect(window,"onresize","_position");
- this.connect(this.nextNode, "onclick", "_nextImage");
- this.connect(this.prevNode, "onclick", "_prevImage");
- this.connect(this.closeNode, "onclick", "hide");
- this._makeAnims();
- this._vp = dijit.getViewport();
-
- },
-
- show: function(/* Object */groupData){
- // summary: Show the Master Dialog. Starts the chain of events to show
- // an image in the dialog, including showing the dialog if it is
- // not already visible
- //
- // groupData: Object
- // needs href and title attributes. the values for this image.
-
- var _t = this; // size
-
- // we only need to call dijit.Dialog.show() if we're not already open.
- if(!_t.open){ _t.inherited(arguments); }
-
- if(this._wasStyled){
- // ugly fix for IE being stupid:
- dojo._destroyElement(_t.imgNode);
- _t.imgNode = dojo.clone(_t._clone);
- dojo.place(_t.imgNode,_t.imageContainer,"first");
- _t._makeAnims();
- _t._wasStyled = false;
- }
-
- dojo.style(_t.imgNode,"opacity","0");
- dojo.style(_t.titleNode,"opacity","0");
-
- _t._imageReady = false;
- _t.imgNode.src = groupData.href;
-
- if((groupData.group && groupData !== "XnoGroupX") || _t.inGroup){
- if(!_t.inGroup){
- _t.inGroup = _t._groups[(groupData.group)];
- // determine where we were or are in the show
- dojo.forEach(_t.inGroup,function(g,i){
- if(g.href == groupData.href){
- _t._positionIndex = i;
- }
- },_t);
- }
- if(!_t._positionIndex){
- _t._positionIndex=0;
- _t.imgNode.src = _t.inGroup[_t._positionIndex].href;
- }
- // FIXME: implement titleTemplate
- _t.groupCount.innerHTML = " (" +(_t._positionIndex+1) +" of "+_t.inGroup.length+")";
- _t.prevNode.style.visibility = "visible";
- _t.nextNode.style.visibility = "visible";
- }else{
- // single images don't have buttons, or counters:
- _t.groupCount.innerHTML = "";
- _t.prevNode.style.visibility = "hidden";
- _t.nextNode.style.visibility = "hidden";
- }
- _t.textNode.innerHTML = groupData.title;
-
- if(!_t._imageReady || _t.imgNode.complete === true){
- // connect to the onload of the image
- _t._imgConnect = dojo.connect(_t.imgNode, "onload", _t, function(){
- _t._imageReady = true;
- _t.resizeTo({
- w: _t.imgNode.width,
- h: _t.imgNode.height,
- duration:_t.duration
- });
- // cleanup
- dojo.disconnect(_t._imgConnect);
- if(_t._imgError){ dojo.disconnect(_t._imgError); }
- });
-
- // listen for 404's:
- _t._imgError = dojo.connect(_t.imgNode, "onerror", _t, function(){
- dojo.disconnect(_t._imgError);
- // trigger the above onload with a new src:
- _t.imgNode.src = _t.errorImg;
- _t._imageReady = true;
- _t.textNode.innerHTML = _t.errorMessage;
- });
-
- // onload doesn't fire in IE if you connect before you set the src.
- // hack to re-set the src after onload connection made:
- if(dojo.isIE){ _t.imgNode.src = _t.imgNode.src; }
-
- }else{
- // do it quickly. kind of a hack, but image is ready now
- _t.resizeTo({ w: _t.imgNode.width, h: _t.imgNode.height, duration: 1 });
- }
-
- },
-
- _nextImage: function(){
- // summary: Load next image in group
- if(!this.inGroup){ return; }
- if(this._positionIndex+1<this.inGroup.length){
- this._positionIndex++;
- }else{
- this._positionIndex = 0;
- }
- this._loadImage();
- },
-
- _prevImage: function(){
- // summary: Load previous image in group
-
- if(this.inGroup){
- if(this._positionIndex == 0){
- this._positionIndex = this.inGroup.length - 1;
- }else{
- this._positionIndex--;
- }
- this._loadImage();
- }
- },
-
- _loadImage: function(){
- // summary: Do the prep work before we can show another image
- this._loadingAnim.play(1);
- },
-
- _prepNodes: function(){
- // summary: A localized hook to accompany _loadImage
- this._imageReady = false;
- this.show({
- href: this.inGroup[this._positionIndex].href,
- title: this.inGroup[this._positionIndex].title
- });
- },
-
- resizeTo: function(/* Object */size){
- // summary: Resize our dialog container, and fire _showImage
-
- if(this.adjust && (size.h + 80 > this._vp.h || size.w + 50 > this._vp.w)){
- size = this._scaleToFit(size);
- }
-
- var _sizeAnim = dojox.fx.sizeTo({
- node: this.containerNode,
- duration: size.duration||this.duration,
- width: size.w,
- height: size.h + 30
- });
- this.connect(_sizeAnim,"onEnd","_showImage");
- _sizeAnim.play(15);
- },
-
- _showImage: function(){
- // summary: Fade in the image, and fire showNav
- this._showImageAnim.play(1);
- },
-
- _showNav: function(){
- // summary: Fade in the footer, and setup our connections.
- this._showNavAnim.play(1);
- },
-
- hide: function(){
- // summary: Hide the Master Lightbox
- dojo.fadeOut({node:this.titleNode, duration:200,
- onEnd: dojo.hitch(this,function(){
- // refs #5112 - if you _don't_ change the .src, safari will _never_ fire onload for this image
- this.imgNode.src = this._blankImg;
- })
- }).play(5);
- this.inherited(arguments);
- this.inGroup = null;
- this._positionIndex = null;
- },
-
- addImage: function(child, group){
- // summary: Add an image to this Master Lightbox
- //
- // child: Object
- // The image information to add.
- // href: String - link to image (required)
- // title: String - title to display
- //
- // group: String?
- // attach to group of similar tag or null for individual image instance
- var g = group;
- if(!child.href){ return; }
- if(g){
- if(!this._groups[g]){
- this._groups[g] = [];
- }
- this._groups[g].push(child);
- }else{ this._groups["XnoGroupX"].push(child); }
- },
-
- _handleKey: function(/* Event */e){
- // summary: Handle keyboard navigation internally
- if(!this.open){ return; }
-
- var dk = dojo.keys;
- var key = (e.charCode == dk.SPACE ? dk.SPACE : e.keyCode);
- switch(key){
-
- case dk.ESCAPE: this.hide(); break;
-
- case dk.DOWN_ARROW:
- case dk.RIGHT_ARROW:
- case 78: // key "n"
- this._nextImage(); break;
-
- case dk.UP_ARROW:
- case dk.LEFT_ARROW:
- case 80: // key "p"
- this._prevImage(); break;
- }
- },
-
- _scaleToFit: function(/* Object */size){
- // summary: resize an image to fit within the bounds of the viewport
- // size: Object
- // The 'size' object passed around for this image
- var ns = {};
-
- // one of the dimensions is too big, go with the smaller viewport edge:
- if(this._vp.h > this._vp.w){
- // don't actually touch the edges:
- ns.w = this._vp.w - 70;
- ns.h = ns.w * (size.h / size.w);
- }else{
- // give a little room for the titlenode, too:
- ns.h = this._vp.h - 80;
- ns.w = ns.h * (size.w / size.h);
- }
-
- // trigger the nasty width="auto" workaround in show()
- this._wasStyled = true;
-
- // we actually have to style this image, it's too big
- var s = this.imgNode.style;
- s.height = ns.h + "px";
- s.width = ns.w + "px";
-
- ns.duration = size.duration;
- return ns; // Object
-
- },
-
- _position: function(/* Event */e){
- // summary: we want to know the viewport size any time it changes
- this.inherited(arguments);
- this._vp = dijit.getViewport();
- },
-
- _makeAnims: function(){
- // summary: make and cleanup animation and animation connections
-
- dojo.forEach(this._animConnects,dojo.disconnect);
- this._animConnects = [];
- this._showImageAnim = dojo.fadeIn({
- node: this.imgNode,
- duration: this.duration
- });
- this._animConnects.push(dojo.connect(this._showImageAnim, "onEnd", this, "_showNav"));
- this._loadingAnim = dojo.fx.combine([
- dojo.fadeOut({ node:this.imgNode, duration:175 }),
- dojo.fadeOut({ node:this.titleNode, duration:175 })
- ]);
- this._animConnects.push(dojo.connect(this._loadingAnim, "onEnd", this, "_prepNodes"));
- this._showNavAnim = dojo.fadeIn({ node: this.titleNode, duration:225 });
- }
-});
-
-}