Initial commit Change-Id: I0000000000000000000000000000000000000000
This commit is contained in:
16
scripts/.htaccess
Executable file
16
scripts/.htaccess
Executable file
@@ -0,0 +1,16 @@
|
||||
php_value include_path ".:/var/www"
|
||||
|
||||
# disable directory browsing
|
||||
Options All -Indexes
|
||||
|
||||
ErrorDocument 400 /error/error400.php
|
||||
ErrorDocument 401 /error/error401.php
|
||||
ErrorDocument 403 /error/error403.php
|
||||
ErrorDocument 404 /error/error404.php
|
||||
ErrorDocument 500 /error/error500.php
|
||||
|
||||
#400 - Bad request
|
||||
#401 - Authorization Required
|
||||
#403 - Forbidden directory
|
||||
#404 - Page not found
|
||||
#500 - Internal Server Error
|
||||
136
scripts/builder.js
Normal file
136
scripts/builder.js
Normal file
@@ -0,0 +1,136 @@
|
||||
// script.aculo.us builder.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
|
||||
|
||||
// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
//
|
||||
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||
|
||||
var Builder = {
|
||||
NODEMAP: {
|
||||
AREA: 'map',
|
||||
CAPTION: 'table',
|
||||
COL: 'table',
|
||||
COLGROUP: 'table',
|
||||
LEGEND: 'fieldset',
|
||||
OPTGROUP: 'select',
|
||||
OPTION: 'select',
|
||||
PARAM: 'object',
|
||||
TBODY: 'table',
|
||||
TD: 'table',
|
||||
TFOOT: 'table',
|
||||
TH: 'table',
|
||||
THEAD: 'table',
|
||||
TR: 'table'
|
||||
},
|
||||
// note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
|
||||
// due to a Firefox bug
|
||||
node: function(elementName) {
|
||||
elementName = elementName.toUpperCase();
|
||||
|
||||
// try innerHTML approach
|
||||
var parentTag = this.NODEMAP[elementName] || 'div';
|
||||
var parentElement = document.createElement(parentTag);
|
||||
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
||||
parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
|
||||
} catch(e) {}
|
||||
var element = parentElement.firstChild || null;
|
||||
|
||||
// see if browser added wrapping tags
|
||||
if(element && (element.tagName.toUpperCase() != elementName))
|
||||
element = element.getElementsByTagName(elementName)[0];
|
||||
|
||||
// fallback to createElement approach
|
||||
if(!element) element = document.createElement(elementName);
|
||||
|
||||
// abort if nothing could be created
|
||||
if(!element) return;
|
||||
|
||||
// attributes (or text)
|
||||
if(arguments[1])
|
||||
if(this._isStringOrNumber(arguments[1]) ||
|
||||
(arguments[1] instanceof Array) ||
|
||||
arguments[1].tagName) {
|
||||
this._children(element, arguments[1]);
|
||||
} else {
|
||||
var attrs = this._attributes(arguments[1]);
|
||||
if(attrs.length) {
|
||||
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
||||
parentElement.innerHTML = "<" +elementName + " " +
|
||||
attrs + "></" + elementName + ">";
|
||||
} catch(e) {}
|
||||
element = parentElement.firstChild || null;
|
||||
// workaround firefox 1.0.X bug
|
||||
if(!element) {
|
||||
element = document.createElement(elementName);
|
||||
for(attr in arguments[1])
|
||||
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
|
||||
}
|
||||
if(element.tagName.toUpperCase() != elementName)
|
||||
element = parentElement.getElementsByTagName(elementName)[0];
|
||||
}
|
||||
}
|
||||
|
||||
// text, or array of children
|
||||
if(arguments[2])
|
||||
this._children(element, arguments[2]);
|
||||
|
||||
return $(element);
|
||||
},
|
||||
_text: function(text) {
|
||||
return document.createTextNode(text);
|
||||
},
|
||||
|
||||
ATTR_MAP: {
|
||||
'className': 'class',
|
||||
'htmlFor': 'for'
|
||||
},
|
||||
|
||||
_attributes: function(attributes) {
|
||||
var attrs = [];
|
||||
for(attribute in attributes)
|
||||
attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
|
||||
'="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"');
|
||||
return attrs.join(" ");
|
||||
},
|
||||
_children: function(element, children) {
|
||||
if(children.tagName) {
|
||||
element.appendChild(children);
|
||||
return;
|
||||
}
|
||||
if(typeof children=='object') { // array can hold nodes and text
|
||||
children.flatten().each( function(e) {
|
||||
if(typeof e=='object')
|
||||
element.appendChild(e);
|
||||
else
|
||||
if(Builder._isStringOrNumber(e))
|
||||
element.appendChild(Builder._text(e));
|
||||
});
|
||||
} else
|
||||
if(Builder._isStringOrNumber(children))
|
||||
element.appendChild(Builder._text(children));
|
||||
},
|
||||
_isStringOrNumber: function(param) {
|
||||
return(typeof param=='string' || typeof param=='number');
|
||||
},
|
||||
build: function(html) {
|
||||
var element = this.node('div');
|
||||
$(element).update(html.strip());
|
||||
return element.down();
|
||||
},
|
||||
dump: function(scope) {
|
||||
if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
|
||||
|
||||
var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
|
||||
"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
|
||||
"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
|
||||
"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
|
||||
"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
|
||||
"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
|
||||
|
||||
tags.each( function(tag){
|
||||
scope[tag] = function() {
|
||||
return Builder.node.apply(Builder, [tag].concat($A(arguments)));
|
||||
};
|
||||
});
|
||||
}
|
||||
};
|
||||
1123
scripts/effects.js
vendored
Normal file
1123
scripts/effects.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8981
scripts/jquery.js
vendored
Executable file
8981
scripts/jquery.js
vendored
Executable file
File diff suppressed because it is too large
Load Diff
14
scripts/jquery.sha256.js
Executable file
14
scripts/jquery.sha256.js
Executable file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* SHA256 Hash Algorithm Plugin
|
||||
*
|
||||
* @version 1.0 (06/09/2009)
|
||||
* @requires jQuery v1.2.6+
|
||||
* @author Alex Weber <alexweber.com.br>
|
||||
* @copyright Copyright (c) 2008-2009, Alex Weber
|
||||
* @see http://anmar.eu.org/projects/jssha2/
|
||||
* @see http://pajhome.org.uk/crypt/md5
|
||||
*
|
||||
* Distributed under the BSD License
|
||||
*
|
||||
*/
|
||||
(function(f){var m=8;var k=function(q,t){var s=(q&65535)+(t&65535);var r=(q>>16)+(t>>16)+(s>>16);return(r<<16)|(s&65535)};var e=function(r,q){return(r>>>q)|(r<<(32-q))};var g=function(r,q){return(r>>>q)};var a=function(q,s,r){return((q&s)^((~q)&r))};var d=function(q,s,r){return((q&s)^(q&r)^(s&r))};var h=function(q){return(e(q,2)^e(q,13)^e(q,22))};var b=function(q){return(e(q,6)^e(q,11)^e(q,25))};var p=function(q){return(e(q,7)^e(q,18)^g(q,3))};var l=function(q){return(e(q,17)^e(q,19)^g(q,10))};var c=function(r,s){var E=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298);var t=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225);var q=new Array(64);var G,F,D,C,A,y,x,w,v,u;var B,z;r[s>>5]|=128<<(24-s%32);r[((s+64>>9)<<4)+15]=s;for(var v=0;v<r.length;v+=16){G=t[0];F=t[1];D=t[2];C=t[3];A=t[4];y=t[5];x=t[6];w=t[7];for(var u=0;u<64;u++){if(u<16){q[u]=r[u+v]}else{q[u]=k(k(k(l(q[u-2]),q[u-7]),p(q[u-15])),q[u-16])}B=k(k(k(k(w,b(A)),a(A,y,x)),E[u]),q[u]);z=k(h(G),d(G,F,D));w=x;x=y;y=A;A=k(C,B);C=D;D=F;F=G;G=k(B,z)}t[0]=k(G,t[0]);t[1]=k(F,t[1]);t[2]=k(D,t[2]);t[3]=k(C,t[3]);t[4]=k(A,t[4]);t[5]=k(y,t[5]);t[6]=k(x,t[6]);t[7]=k(w,t[7])}return t};var j=function(t){var s=Array();var q=(1<<m)-1;for(var r=0;r<t.length*m;r+=m){s[r>>5]|=(t.charCodeAt(r/m)&q)<<(24-r%32)}return s};var n=function(s){var r="0123456789abcdef";var t="";for(var q=0;q<s.length*4;q++){t+=r.charAt((s[q>>2]>>((3-q%4)*8+4))&15)+r.charAt((s[q>>2]>>((3-q%4)*8))&15)}return t};var o=function(s,v){var u=j(s);if(u.length>16){u=core_sha1(u,s.length*m)}var q=Array(16),t=Array(16);for(var r=0;r<16;r++){q[r]=u[r]^909522486;t[r]=u[r]^1549556828}var w=c(q.concat(j(v)),512+v.length*m);return c(t.concat(w),512+256)};var i=function(q){q=typeof q=="object"?f(q).val():q.toString();return q};f.extend({sha256:function(q){q=i(q);return n(c(j(q),q.length*m))},sha256hmac:function(q,r){q=i(q);r=i(r);return n(o(q,r))},sha256config:function(q){m=parseInt(q)||8}});f.fn.sha256=function(r){f.sha256config(r);var q=i(f(this).val());var s=f.sha256(q);f.sha256config(8);return s}})(jQuery);
|
||||
497
scripts/lightbox-web.js
Normal file
497
scripts/lightbox-web.js
Normal file
@@ -0,0 +1,497 @@
|
||||
// -----------------------------------------------------------------------------------
|
||||
//
|
||||
// Lightbox v2.04
|
||||
// by Lokesh Dhakar - http://www.lokeshdhakar.com
|
||||
// Last Modification: 2/9/08
|
||||
//
|
||||
// For more information, visit:
|
||||
// http://lokeshdhakar.com/projects/lightbox2/
|
||||
//
|
||||
// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
|
||||
// - Free for use in both personal and commercial projects
|
||||
// - Attribution requires leaving author name, author link, and the license info intact.
|
||||
//
|
||||
// Thanks: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets.
|
||||
// Artemy Tregubenko (arty.name) for cleanup and help in updating to latest ver of proto-aculous.
|
||||
//
|
||||
// -----------------------------------------------------------------------------------
|
||||
/*
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
Configuration
|
||||
|
||||
Lightbox Class Declaration
|
||||
- initialize()
|
||||
- updateImageList()
|
||||
- start()
|
||||
- changeImage()
|
||||
- resizeImageContainer()
|
||||
- showImage()
|
||||
- updateDetails()
|
||||
- updateNav()
|
||||
- enableKeyboardNav()
|
||||
- disableKeyboardNav()
|
||||
- keyboardAction()
|
||||
- preloadNeighborImages()
|
||||
- end()
|
||||
|
||||
Function Calls
|
||||
- document.observe()
|
||||
|
||||
*/
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Configurationl
|
||||
//
|
||||
LightboxOptions = Object.extend({
|
||||
fileLoadingImage: 'res/loading.gif',
|
||||
fileBottomNavCloseImage: 'res/closelabel.gif',
|
||||
|
||||
overlayOpacity: 0.8, // controls transparency of shadow overlay
|
||||
|
||||
animate: true, // toggles resizing animations
|
||||
resizeSpeed: 7, // controls the speed of the image resizing animations (1=slowest and 10=fastest)
|
||||
|
||||
borderSize: 10, //if you adjust the padding in the CSS, you will need to update this variable
|
||||
|
||||
// When grouping images this is used to write: Image # of #.
|
||||
// Change it for non-english localization
|
||||
labelImage: "Image",
|
||||
labelOf: "of"
|
||||
}, window.LightboxOptions || {});
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
var Lightbox = Class.create();
|
||||
|
||||
Lightbox.prototype = {
|
||||
imageArray: [],
|
||||
activeImage: undefined,
|
||||
|
||||
// initialize()
|
||||
// Constructor runs on completion of the DOM loading. Calls updateImageList and then
|
||||
// the function inserts html at the bottom of the page which is used to display the shadow
|
||||
// overlay and the image container.
|
||||
//
|
||||
initialize: function() {
|
||||
|
||||
this.updateImageList();
|
||||
|
||||
this.keyboardAction = this.keyboardAction.bindAsEventListener(this);
|
||||
|
||||
if (LightboxOptions.resizeSpeed > 10) LightboxOptions.resizeSpeed = 10;
|
||||
if (LightboxOptions.resizeSpeed < 1) LightboxOptions.resizeSpeed = 1;
|
||||
|
||||
this.resizeDuration = LightboxOptions.animate ? ((11 - LightboxOptions.resizeSpeed) * 0.15) : 0;
|
||||
this.overlayDuration = LightboxOptions.animate ? 0.2 : 0; // shadow fade in/out duration
|
||||
|
||||
// When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.
|
||||
// If animations are turned off, it will be hidden as to prevent a flicker of a
|
||||
// white 250 by 250 box.
|
||||
var size = (LightboxOptions.animate ? 250 : 1) + 'px';
|
||||
|
||||
|
||||
// Code inserts html at the bottom of the page that looks similar to this:
|
||||
//
|
||||
// <div id="overlay"></div>
|
||||
// <div id="lightbox">
|
||||
// <div id="outerImageContainer">
|
||||
// <div id="imageContainer">
|
||||
// <img id="lightboxImage">
|
||||
// <div style="" id="hoverNav">
|
||||
// <a href="#" id="prevLink"></a>
|
||||
// <a href="#" id="nextLink"></a>
|
||||
// </div>
|
||||
// <div id="loading">
|
||||
// <a href="#" id="loadingLink">
|
||||
// <img src="res/loading.gif">
|
||||
// </a>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// <div id="imageDataContainer">
|
||||
// <div id="imageData">
|
||||
// <div id="imageDetails">
|
||||
// <span id="caption"></span>
|
||||
// <span id="numberDisplay"></span>
|
||||
// </div>
|
||||
// <div id="bottomNav">
|
||||
// <a href="#" id="bottomNavClose">
|
||||
// <img src="res/close.gif">
|
||||
// </a>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
|
||||
|
||||
var objBody = $$('body')[0];
|
||||
|
||||
objBody.appendChild(Builder.node('div',{id:'overlay'}));
|
||||
|
||||
objBody.appendChild(Builder.node('div',{id:'lightbox'}, [
|
||||
Builder.node('div',{id:'outerImageContainer'},
|
||||
Builder.node('div',{id:'imageContainer'}, [
|
||||
Builder.node('img',{id:'lightboxImage'}),
|
||||
Builder.node('div',{id:'hoverNav'}, [
|
||||
Builder.node('a',{id:'prevLink', href: '#' }),
|
||||
Builder.node('a',{id:'nextLink', href: '#' })
|
||||
]),
|
||||
Builder.node('div',{id:'loading'},
|
||||
Builder.node('a',{id:'loadingLink', href: '#' },
|
||||
Builder.node('img', {src: LightboxOptions.fileLoadingImage})
|
||||
)
|
||||
)
|
||||
])
|
||||
),
|
||||
Builder.node('div', {id:'imageDataContainer'},
|
||||
Builder.node('div',{id:'imageData'}, [
|
||||
Builder.node('div',{id:'imageDetails'}, [
|
||||
Builder.node('span',{id:'caption'}),
|
||||
Builder.node('span',{id:'numberDisplay'})
|
||||
]),
|
||||
Builder.node('div',{id:'bottomNav'},
|
||||
Builder.node('a',{id:'bottomNavClose', href: '#' },
|
||||
Builder.node('img', { src: LightboxOptions.fileBottomNavCloseImage })
|
||||
)
|
||||
)
|
||||
])
|
||||
)
|
||||
]));
|
||||
|
||||
|
||||
$('overlay').hide().observe('click', (function() { this.end(); }).bind(this));
|
||||
$('lightbox').hide().observe('click', (function(event) { if (event.element().id == 'lightbox') this.end(); }).bind(this));
|
||||
$('outerImageContainer').setStyle({ width: size, height: size });
|
||||
$('prevLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage - 1); }).bindAsEventListener(this));
|
||||
$('nextLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage + 1); }).bindAsEventListener(this));
|
||||
$('loadingLink').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
|
||||
$('bottomNavClose').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
|
||||
|
||||
var th = this;
|
||||
(function(){
|
||||
var ids =
|
||||
'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink ' +
|
||||
'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';
|
||||
$w(ids).each(function(id){ th[id] = $(id); });
|
||||
}).defer();
|
||||
},
|
||||
|
||||
//
|
||||
// updateImageList()
|
||||
// Loops through anchor tags looking for 'lightbox' references and applies onclick
|
||||
// events to appropriate links. You can rerun after dynamically adding images w/ajax.
|
||||
//
|
||||
updateImageList: function() {
|
||||
this.updateImageList = Prototype.emptyFunction;
|
||||
|
||||
document.observe('click', (function(event){
|
||||
var target = event.findElement('a[rel^=lightbox]') || event.findElement('area[rel^=lightbox]');
|
||||
if (target) {
|
||||
event.stop();
|
||||
this.start(target);
|
||||
}
|
||||
}).bind(this));
|
||||
},
|
||||
|
||||
//
|
||||
// start()
|
||||
// Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
|
||||
//
|
||||
start: function(imageLink) {
|
||||
|
||||
$$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' });
|
||||
|
||||
// stretch overlay to fill page and fade in
|
||||
var arrayPageSize = this.getPageSize();
|
||||
$('overlay').setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });
|
||||
|
||||
new Effect.Appear(this.overlay, { duration: this.overlayDuration, from: 0.0, to: LightboxOptions.overlayOpacity });
|
||||
|
||||
this.imageArray = [];
|
||||
var imageNum = 0;
|
||||
|
||||
if ((imageLink.rel == 'lightbox')){
|
||||
// if image is NOT part of a set, add single image to imageArray
|
||||
this.imageArray.push([imageLink.href, imageLink.title]);
|
||||
} else {
|
||||
// if image is part of a set..
|
||||
this.imageArray =
|
||||
$$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]').
|
||||
collect(function(anchor){ return [anchor.href, anchor.title]; }).
|
||||
uniq();
|
||||
|
||||
while (this.imageArray[imageNum][0] != imageLink.href) { imageNum++; }
|
||||
}
|
||||
|
||||
// calculate top and left offset for the lightbox
|
||||
var arrayPageScroll = document.viewport.getScrollOffsets();
|
||||
var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10);
|
||||
var lightboxLeft = arrayPageScroll[0];
|
||||
this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show();
|
||||
|
||||
this.changeImage(imageNum);
|
||||
},
|
||||
|
||||
//
|
||||
// changeImage()
|
||||
// Hide most elements and preload image in preparation for resizing image container.
|
||||
//
|
||||
changeImage: function(imageNum) {
|
||||
|
||||
this.activeImage = imageNum; // update global var
|
||||
|
||||
// hide elements during transition
|
||||
if (LightboxOptions.animate) this.loading.show();
|
||||
this.lightboxImage.hide();
|
||||
this.hoverNav.hide();
|
||||
this.prevLink.hide();
|
||||
this.nextLink.hide();
|
||||
// HACK: Opera9 does not currently support scriptaculous opacity and appear fx
|
||||
this.imageDataContainer.setStyle({opacity: .0001});
|
||||
this.numberDisplay.hide();
|
||||
|
||||
var imgPreloader = new Image();
|
||||
|
||||
// once image is preloaded, resize image container
|
||||
|
||||
|
||||
imgPreloader.onload = (function(){
|
||||
this.lightboxImage.src = this.imageArray[this.activeImage][0];
|
||||
this.resizeImageContainer(imgPreloader.width, imgPreloader.height);
|
||||
}).bind(this);
|
||||
imgPreloader.src = this.imageArray[this.activeImage][0];
|
||||
},
|
||||
|
||||
//
|
||||
// resizeImageContainer()
|
||||
//
|
||||
resizeImageContainer: function(imgWidth, imgHeight) {
|
||||
|
||||
// get current width and height
|
||||
var widthCurrent = this.outerImageContainer.getWidth();
|
||||
var heightCurrent = this.outerImageContainer.getHeight();
|
||||
|
||||
// get new width and height
|
||||
var widthNew = (imgWidth + LightboxOptions.borderSize * 2);
|
||||
var heightNew = (imgHeight + LightboxOptions.borderSize * 2);
|
||||
|
||||
// scalars based on change from old to new
|
||||
var xScale = (widthNew / widthCurrent) * 100;
|
||||
var yScale = (heightNew / heightCurrent) * 100;
|
||||
|
||||
// calculate size difference between new and old image, and resize if necessary
|
||||
var wDiff = widthCurrent - widthNew;
|
||||
var hDiff = heightCurrent - heightNew;
|
||||
|
||||
if (hDiff != 0) new Effect.Scale(this.outerImageContainer, yScale, {scaleX: false, duration: this.resizeDuration, queue: 'front'});
|
||||
if (wDiff != 0) new Effect.Scale(this.outerImageContainer, xScale, {scaleY: false, duration: this.resizeDuration, delay: this.resizeDuration});
|
||||
|
||||
// if new and old image are same size and no scaling transition is necessary,
|
||||
// do a quick pause to prevent image flicker.
|
||||
var timeout = 0;
|
||||
if ((hDiff == 0) && (wDiff == 0)){
|
||||
timeout = 100;
|
||||
if (Prototype.Browser.IE) timeout = 250;
|
||||
}
|
||||
|
||||
(function(){
|
||||
this.prevLink.setStyle({ height: imgHeight + 'px' });
|
||||
this.nextLink.setStyle({ height: imgHeight + 'px' });
|
||||
this.imageDataContainer.setStyle({ width: widthNew + 'px' });
|
||||
|
||||
this.showImage();
|
||||
}).bind(this).delay(timeout / 1000);
|
||||
},
|
||||
|
||||
//
|
||||
// showImage()
|
||||
// Display image and begin preloading neighbors.
|
||||
//
|
||||
showImage: function(){
|
||||
this.loading.hide();
|
||||
new Effect.Appear(this.lightboxImage, {
|
||||
duration: this.resizeDuration,
|
||||
queue: 'end',
|
||||
afterFinish: (function(){ this.updateDetails(); }).bind(this)
|
||||
});
|
||||
this.preloadNeighborImages();
|
||||
},
|
||||
|
||||
//
|
||||
// updateDetails()
|
||||
// Display caption, image number, and bottom nav.
|
||||
//
|
||||
updateDetails: function() {
|
||||
|
||||
// if caption is not null
|
||||
if (this.imageArray[this.activeImage][1] != ""){
|
||||
this.caption.update(this.imageArray[this.activeImage][1]).show();
|
||||
}
|
||||
|
||||
// if image is part of set display 'Image x of x'
|
||||
if (this.imageArray.length > 1){
|
||||
this.numberDisplay.update( LightboxOptions.labelImage + ' ' + (this.activeImage + 1) + ' ' + LightboxOptions.labelOf + ' ' + this.imageArray.length).show();
|
||||
}
|
||||
|
||||
new Effect.Parallel(
|
||||
[
|
||||
new Effect.SlideDown(this.imageDataContainer, { sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0 }),
|
||||
new Effect.Appear(this.imageDataContainer, { sync: true, duration: this.resizeDuration })
|
||||
],
|
||||
{
|
||||
duration: this.resizeDuration,
|
||||
afterFinish: (function() {
|
||||
// update overlay size and update nav
|
||||
var arrayPageSize = this.getPageSize();
|
||||
this.overlay.setStyle({ height: arrayPageSize[1] + 'px' });
|
||||
this.updateNav();
|
||||
}).bind(this)
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
//
|
||||
// updateNav()
|
||||
// Display appropriate previous and next hover navigation.
|
||||
//
|
||||
updateNav: function() {
|
||||
|
||||
this.hoverNav.show();
|
||||
|
||||
// if not first image in set, display prev image button
|
||||
if (this.activeImage > 0) this.prevLink.show();
|
||||
|
||||
// if not last image in set, display next image button
|
||||
if (this.activeImage < (this.imageArray.length - 1)) this.nextLink.show();
|
||||
|
||||
this.enableKeyboardNav();
|
||||
},
|
||||
|
||||
//
|
||||
// enableKeyboardNav()
|
||||
//
|
||||
enableKeyboardNav: function() {
|
||||
document.observe('keydown', this.keyboardAction);
|
||||
},
|
||||
|
||||
//
|
||||
// disableKeyboardNav()
|
||||
//
|
||||
disableKeyboardNav: function() {
|
||||
document.stopObserving('keydown', this.keyboardAction);
|
||||
},
|
||||
|
||||
//
|
||||
// keyboardAction()
|
||||
//
|
||||
keyboardAction: function(event) {
|
||||
var keycode = event.keyCode;
|
||||
|
||||
var escapeKey;
|
||||
if (event.DOM_VK_ESCAPE) { // mozilla
|
||||
escapeKey = event.DOM_VK_ESCAPE;
|
||||
} else { // ie
|
||||
escapeKey = 27;
|
||||
}
|
||||
|
||||
var key = String.fromCharCode(keycode).toLowerCase();
|
||||
|
||||
if (key.match(/x|o|c/) || (keycode == escapeKey)){ // close lightbox
|
||||
this.end();
|
||||
} else if ((key == 'p') || (keycode == 37)){ // display previous image
|
||||
if (this.activeImage != 0){
|
||||
this.disableKeyboardNav();
|
||||
this.changeImage(this.activeImage - 1);
|
||||
}
|
||||
} else if ((key == 'n') || (keycode == 39)){ // display next image
|
||||
if (this.activeImage != (this.imageArray.length - 1)){
|
||||
this.disableKeyboardNav();
|
||||
this.changeImage(this.activeImage + 1);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//
|
||||
// preloadNeighborImages()
|
||||
// Preload previous and next images.
|
||||
//
|
||||
preloadNeighborImages: function(){
|
||||
var preloadNextImage, preloadPrevImage;
|
||||
if (this.imageArray.length > this.activeImage + 1){
|
||||
preloadNextImage = new Image();
|
||||
preloadNextImage.src = this.imageArray[this.activeImage + 1][0];
|
||||
}
|
||||
if (this.activeImage > 0){
|
||||
preloadPrevImage = new Image();
|
||||
preloadPrevImage.src = this.imageArray[this.activeImage - 1][0];
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
//
|
||||
// end()
|
||||
//
|
||||
end: function() {
|
||||
this.disableKeyboardNav();
|
||||
this.lightbox.hide();
|
||||
new Effect.Fade(this.overlay, { duration: this.overlayDuration });
|
||||
$$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' });
|
||||
},
|
||||
|
||||
//
|
||||
// getPageSize()
|
||||
//
|
||||
getPageSize: function() {
|
||||
|
||||
var xScroll, yScroll;
|
||||
|
||||
if (window.innerHeight && window.scrollMaxY) {
|
||||
xScroll = window.innerWidth + window.scrollMaxX;
|
||||
yScroll = window.innerHeight + window.scrollMaxY;
|
||||
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
|
||||
xScroll = document.body.scrollWidth;
|
||||
yScroll = document.body.scrollHeight;
|
||||
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
|
||||
xScroll = document.body.offsetWidth;
|
||||
yScroll = document.body.offsetHeight;
|
||||
}
|
||||
|
||||
var windowWidth, windowHeight;
|
||||
|
||||
if (self.innerHeight) { // all except Explorer
|
||||
if(document.documentElement.clientWidth){
|
||||
windowWidth = document.documentElement.clientWidth;
|
||||
} else {
|
||||
windowWidth = self.innerWidth;
|
||||
}
|
||||
windowHeight = self.innerHeight;
|
||||
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
|
||||
windowWidth = document.documentElement.clientWidth;
|
||||
windowHeight = document.documentElement.clientHeight;
|
||||
} else if (document.body) { // other Explorers
|
||||
windowWidth = document.body.clientWidth;
|
||||
windowHeight = document.body.clientHeight;
|
||||
}
|
||||
|
||||
// for small pages with total height less then height of the viewport
|
||||
if(yScroll < windowHeight){
|
||||
pageHeight = windowHeight;
|
||||
} else {
|
||||
pageHeight = yScroll;
|
||||
}
|
||||
|
||||
// for small pages with total width less then width of the viewport
|
||||
if(xScroll < windowWidth){
|
||||
pageWidth = xScroll;
|
||||
} else {
|
||||
pageWidth = windowWidth;
|
||||
}
|
||||
|
||||
return [pageWidth,pageHeight];
|
||||
}
|
||||
}
|
||||
|
||||
document.observe('dom:loaded', function () { new Lightbox(); });
|
||||
496
scripts/lightbox.js
Normal file
496
scripts/lightbox.js
Normal file
@@ -0,0 +1,496 @@
|
||||
// -----------------------------------------------------------------------------------
|
||||
//
|
||||
// Lightbox v2.05
|
||||
// by Lokesh Dhakar - http://www.lokeshdhakar.com
|
||||
// Last Modification: 3/18/11
|
||||
//
|
||||
// For more information, visit:
|
||||
// http://lokeshdhakar.com/projects/lightbox2/
|
||||
//
|
||||
// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
|
||||
// - Free for use in both personal and commercial projects
|
||||
// - Attribution requires leaving author name, author link, and the license info intact.
|
||||
//
|
||||
// Thanks: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets.
|
||||
// Artemy Tregubenko (arty.name) for cleanup and help in updating to latest ver of proto-aculous.
|
||||
//
|
||||
// -----------------------------------------------------------------------------------
|
||||
/*
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
Configuration
|
||||
|
||||
Lightbox Class Declaration
|
||||
- initialize()
|
||||
- updateImageList()
|
||||
- start()
|
||||
- changeImage()
|
||||
- resizeImageContainer()
|
||||
- showImage()
|
||||
- updateDetails()
|
||||
- updateNav()
|
||||
- enableKeyboardNav()
|
||||
- disableKeyboardNav()
|
||||
- keyboardAction()
|
||||
- preloadNeighborImages()
|
||||
- end()
|
||||
|
||||
Function Calls
|
||||
- document.observe()
|
||||
|
||||
*/
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Configurationl
|
||||
//
|
||||
LightboxOptions = Object.extend({
|
||||
fileLoadingImage: 'res/loading.gif',
|
||||
fileBottomNavCloseImage: 'res/closelabel.gif',
|
||||
|
||||
overlayOpacity: 0.8, // controls transparency of shadow overlay
|
||||
|
||||
animate: true, // toggles resizing animations
|
||||
resizeSpeed: 7, // controls the speed of the image resizing animations (1=slowest and 10=fastest)
|
||||
|
||||
borderSize: 10, //if you adjust the padding in the CSS, you will need to update this variable
|
||||
|
||||
// When grouping images this is used to write: Image # of #.
|
||||
// Change it for non-english localization
|
||||
labelImage: "Image",
|
||||
labelOf: "of"
|
||||
}, window.LightboxOptions || {});
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
var Lightbox = Class.create();
|
||||
|
||||
Lightbox.prototype = {
|
||||
imageArray: [],
|
||||
activeImage: undefined,
|
||||
|
||||
// initialize()
|
||||
// Constructor runs on completion of the DOM loading. Calls updateImageList and then
|
||||
// the function inserts html at the bottom of the page which is used to display the shadow
|
||||
// overlay and the image container.
|
||||
//
|
||||
initialize: function() {
|
||||
|
||||
this.updateImageList();
|
||||
|
||||
this.keyboardAction = this.keyboardAction.bindAsEventListener(this);
|
||||
|
||||
if (LightboxOptions.resizeSpeed > 10) LightboxOptions.resizeSpeed = 10;
|
||||
if (LightboxOptions.resizeSpeed < 1) LightboxOptions.resizeSpeed = 1;
|
||||
|
||||
this.resizeDuration = LightboxOptions.animate ? ((11 - LightboxOptions.resizeSpeed) * 0.15) : 0;
|
||||
this.overlayDuration = LightboxOptions.animate ? 0.2 : 0; // shadow fade in/out duration
|
||||
|
||||
// When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.
|
||||
// If animations are turned off, it will be hidden as to prevent a flicker of a
|
||||
// white 250 by 250 box.
|
||||
var size = (LightboxOptions.animate ? 250 : 1) + 'px';
|
||||
|
||||
|
||||
// Code inserts html at the bottom of the page that looks similar to this:
|
||||
//
|
||||
// <div id="overlay"></div>
|
||||
// <div id="lightbox">
|
||||
// <div id="outerImageContainer">
|
||||
// <div id="imageContainer">
|
||||
// <img id="lightboxImage">
|
||||
// <div style="" id="hoverNav">
|
||||
// <a href="#" id="prevLink"></a>
|
||||
// <a href="#" id="nextLink"></a>
|
||||
// </div>
|
||||
// <div id="loading">
|
||||
// <a href="#" id="loadingLink">
|
||||
// <img src="res/loading.gif">
|
||||
// </a>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// <div id="imageDataContainer">
|
||||
// <div id="imageData">
|
||||
// <div id="imageDetails">
|
||||
// <span id="caption"></span>
|
||||
// <span id="numberDisplay"></span>
|
||||
// </div>
|
||||
// <div id="bottomNav">
|
||||
// <a href="#" id="bottomNavClose">
|
||||
// <img src="res/close.gif">
|
||||
// </a>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
|
||||
|
||||
var objBody = $$('body')[0];
|
||||
|
||||
objBody.appendChild(Builder.node('div',{id:'overlay'}));
|
||||
|
||||
objBody.appendChild(Builder.node('div',{id:'lightbox'}, [
|
||||
Builder.node('div',{id:'outerImageContainer'},
|
||||
Builder.node('div',{id:'imageContainer'}, [
|
||||
Builder.node('img',{id:'lightboxImage'}),
|
||||
Builder.node('div',{id:'hoverNav'}, [
|
||||
Builder.node('a',{id:'prevLink', href: '#' }),
|
||||
Builder.node('a',{id:'nextLink', href: '#' })
|
||||
]),
|
||||
Builder.node('div',{id:'loading'},
|
||||
Builder.node('a',{id:'loadingLink', href: '#' },
|
||||
Builder.node('img', {src: LightboxOptions.fileLoadingImage})
|
||||
)
|
||||
)
|
||||
])
|
||||
),
|
||||
Builder.node('div', {id:'imageDataContainer'},
|
||||
Builder.node('div',{id:'imageData'}, [
|
||||
Builder.node('div',{id:'imageDetails'}, [
|
||||
Builder.node('span',{id:'caption'}),
|
||||
Builder.node('span',{id:'numberDisplay'})
|
||||
]),
|
||||
Builder.node('div',{id:'bottomNav'},
|
||||
Builder.node('a',{id:'bottomNavClose', href: '#' },
|
||||
Builder.node('img', { src: LightboxOptions.fileBottomNavCloseImage })
|
||||
)
|
||||
)
|
||||
])
|
||||
)
|
||||
]));
|
||||
|
||||
|
||||
$('overlay').hide().observe('click', (function() { this.end(); }).bind(this));
|
||||
$('lightbox').hide().observe('click', (function(event) { if (event.element().id == 'lightbox') this.end(); }).bind(this));
|
||||
$('outerImageContainer').setStyle({ width: size, height: size });
|
||||
$('prevLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage - 1); }).bindAsEventListener(this));
|
||||
$('nextLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage + 1); }).bindAsEventListener(this));
|
||||
$('loadingLink').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
|
||||
$('bottomNavClose').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
|
||||
|
||||
var th = this;
|
||||
(function(){
|
||||
var ids =
|
||||
'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink ' +
|
||||
'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';
|
||||
$w(ids).each(function(id){ th[id] = $(id); });
|
||||
}).defer();
|
||||
},
|
||||
|
||||
//
|
||||
// updateImageList()
|
||||
// Loops through anchor tags looking for 'lightbox' references and applies onclick
|
||||
// events to appropriate links. You can rerun after dynamically adding images w/ajax.
|
||||
//
|
||||
updateImageList: function() {
|
||||
this.updateImageList = Prototype.emptyFunction;
|
||||
|
||||
document.observe('click', (function(event){
|
||||
var target = event.findElement('a[rel^=lightbox]') || event.findElement('area[rel^=lightbox]');
|
||||
if (target) {
|
||||
event.stop();
|
||||
this.start(target);
|
||||
}
|
||||
}).bind(this));
|
||||
},
|
||||
|
||||
//
|
||||
// start()
|
||||
// Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
|
||||
//
|
||||
start: function(imageLink) {
|
||||
|
||||
$$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' });
|
||||
|
||||
// stretch overlay to fill page and fade in
|
||||
var arrayPageSize = this.getPageSize();
|
||||
$('overlay').setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });
|
||||
|
||||
new Effect.Appear(this.overlay, { duration: this.overlayDuration, from: 0.0, to: LightboxOptions.overlayOpacity });
|
||||
|
||||
this.imageArray = [];
|
||||
var imageNum = 0;
|
||||
|
||||
if ((imageLink.getAttribute("rel") == 'lightbox')){
|
||||
// if image is NOT part of a set, add single image to imageArray
|
||||
this.imageArray.push([imageLink.href, imageLink.title]);
|
||||
} else {
|
||||
// if image is part of a set..
|
||||
this.imageArray =
|
||||
$$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]').
|
||||
collect(function(anchor){ return [anchor.href, anchor.title]; }).
|
||||
uniq();
|
||||
|
||||
while (this.imageArray[imageNum][0] != imageLink.href) { imageNum++; }
|
||||
}
|
||||
|
||||
// calculate top and left offset for the lightbox
|
||||
var arrayPageScroll = document.viewport.getScrollOffsets();
|
||||
var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10);
|
||||
var lightboxLeft = arrayPageScroll[0];
|
||||
this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show();
|
||||
|
||||
this.changeImage(imageNum);
|
||||
},
|
||||
|
||||
//
|
||||
// changeImage()
|
||||
// Hide most elements and preload image in preparation for resizing image container.
|
||||
//
|
||||
changeImage: function(imageNum) {
|
||||
|
||||
this.activeImage = imageNum; // update global var
|
||||
|
||||
// hide elements during transition
|
||||
if (LightboxOptions.animate) this.loading.show();
|
||||
this.lightboxImage.hide();
|
||||
this.hoverNav.hide();
|
||||
this.prevLink.hide();
|
||||
this.nextLink.hide();
|
||||
// HACK: Opera9 does not currently support scriptaculous opacity and appear fx
|
||||
this.imageDataContainer.setStyle({opacity: .0001});
|
||||
this.numberDisplay.hide();
|
||||
|
||||
var imgPreloader = new Image();
|
||||
|
||||
// once image is preloaded, resize image container
|
||||
imgPreloader.onload = (function(){
|
||||
this.lightboxImage.src = this.imageArray[this.activeImage][0];
|
||||
/*Bug Fixed by Andy Scott*/
|
||||
this.lightboxImage.width = imgPreloader.width;
|
||||
this.lightboxImage.height = imgPreloader.height;
|
||||
/*End of Bug Fix*/
|
||||
this.resizeImageContainer(imgPreloader.width, imgPreloader.height);
|
||||
}).bind(this);
|
||||
imgPreloader.src = this.imageArray[this.activeImage][0];
|
||||
},
|
||||
|
||||
//
|
||||
// resizeImageContainer()
|
||||
//
|
||||
resizeImageContainer: function(imgWidth, imgHeight) {
|
||||
|
||||
// get current width and height
|
||||
var widthCurrent = this.outerImageContainer.getWidth();
|
||||
var heightCurrent = this.outerImageContainer.getHeight();
|
||||
|
||||
// get new width and height
|
||||
var widthNew = (imgWidth + LightboxOptions.borderSize * 2);
|
||||
var heightNew = (imgHeight + LightboxOptions.borderSize * 2);
|
||||
|
||||
// scalars based on change from old to new
|
||||
var xScale = (widthNew / widthCurrent) * 100;
|
||||
var yScale = (heightNew / heightCurrent) * 100;
|
||||
|
||||
// calculate size difference between new and old image, and resize if necessary
|
||||
var wDiff = widthCurrent - widthNew;
|
||||
var hDiff = heightCurrent - heightNew;
|
||||
|
||||
if (hDiff != 0) new Effect.Scale(this.outerImageContainer, yScale, {scaleX: false, duration: this.resizeDuration, queue: 'front'});
|
||||
if (wDiff != 0) new Effect.Scale(this.outerImageContainer, xScale, {scaleY: false, duration: this.resizeDuration, delay: this.resizeDuration});
|
||||
|
||||
// if new and old image are same size and no scaling transition is necessary,
|
||||
// do a quick pause to prevent image flicker.
|
||||
var timeout = 0;
|
||||
if ((hDiff == 0) && (wDiff == 0)){
|
||||
timeout = 100;
|
||||
if (Prototype.Browser.IE) timeout = 250;
|
||||
}
|
||||
|
||||
(function(){
|
||||
this.prevLink.setStyle({ height: imgHeight + 'px' });
|
||||
this.nextLink.setStyle({ height: imgHeight + 'px' });
|
||||
this.imageDataContainer.setStyle({ width: widthNew + 'px' });
|
||||
|
||||
this.showImage();
|
||||
}).bind(this).delay(timeout / 1000);
|
||||
},
|
||||
|
||||
//
|
||||
// showImage()
|
||||
// Display image and begin preloading neighbors.
|
||||
//
|
||||
showImage: function(){
|
||||
this.loading.hide();
|
||||
new Effect.Appear(this.lightboxImage, {
|
||||
duration: this.resizeDuration,
|
||||
queue: 'end',
|
||||
afterFinish: (function(){ this.updateDetails(); }).bind(this)
|
||||
});
|
||||
this.preloadNeighborImages();
|
||||
},
|
||||
|
||||
//
|
||||
// updateDetails()
|
||||
// Display caption, image number, and bottom nav.
|
||||
//
|
||||
updateDetails: function() {
|
||||
|
||||
this.caption.update(this.imageArray[this.activeImage][1]).show();
|
||||
|
||||
// if image is part of set display 'Image x of x'
|
||||
if (this.imageArray.length > 1){
|
||||
this.numberDisplay.update( LightboxOptions.labelImage + ' ' + (this.activeImage + 1) + ' ' + LightboxOptions.labelOf + ' ' + this.imageArray.length).show();
|
||||
}
|
||||
|
||||
new Effect.Parallel(
|
||||
[
|
||||
new Effect.SlideDown(this.imageDataContainer, { sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0 }),
|
||||
new Effect.Appear(this.imageDataContainer, { sync: true, duration: this.resizeDuration })
|
||||
],
|
||||
{
|
||||
duration: this.resizeDuration,
|
||||
afterFinish: (function() {
|
||||
// update overlay size and update nav
|
||||
var arrayPageSize = this.getPageSize();
|
||||
this.overlay.setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });
|
||||
this.updateNav();
|
||||
}).bind(this)
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
//
|
||||
// updateNav()
|
||||
// Display appropriate previous and next hover navigation.
|
||||
//
|
||||
updateNav: function() {
|
||||
|
||||
this.hoverNav.show();
|
||||
|
||||
// if not first image in set, display prev image button
|
||||
if (this.activeImage > 0) this.prevLink.show();
|
||||
|
||||
// if not last image in set, display next image button
|
||||
if (this.activeImage < (this.imageArray.length - 1)) this.nextLink.show();
|
||||
|
||||
this.enableKeyboardNav();
|
||||
},
|
||||
|
||||
//
|
||||
// enableKeyboardNav()
|
||||
//
|
||||
enableKeyboardNav: function() {
|
||||
document.observe('keydown', this.keyboardAction);
|
||||
},
|
||||
|
||||
//
|
||||
// disableKeyboardNav()
|
||||
//
|
||||
disableKeyboardNav: function() {
|
||||
document.stopObserving('keydown', this.keyboardAction);
|
||||
},
|
||||
|
||||
//
|
||||
// keyboardAction()
|
||||
//
|
||||
keyboardAction: function(event) {
|
||||
var keycode = event.keyCode;
|
||||
|
||||
var escapeKey;
|
||||
if (event.DOM_VK_ESCAPE) { // mozilla
|
||||
escapeKey = event.DOM_VK_ESCAPE;
|
||||
} else { // ie
|
||||
escapeKey = 27;
|
||||
}
|
||||
|
||||
var key = String.fromCharCode(keycode).toLowerCase();
|
||||
|
||||
if (key.match(/x|o|c/) || (keycode == escapeKey)){ // close lightbox
|
||||
this.end();
|
||||
} else if ((key == 'p') || (keycode == 37)){ // display previous image
|
||||
if (this.activeImage != 0){
|
||||
this.disableKeyboardNav();
|
||||
this.changeImage(this.activeImage - 1);
|
||||
}
|
||||
} else if ((key == 'n') || (keycode == 39)){ // display next image
|
||||
if (this.activeImage != (this.imageArray.length - 1)){
|
||||
this.disableKeyboardNav();
|
||||
this.changeImage(this.activeImage + 1);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//
|
||||
// preloadNeighborImages()
|
||||
// Preload previous and next images.
|
||||
//
|
||||
preloadNeighborImages: function(){
|
||||
var preloadNextImage, preloadPrevImage;
|
||||
if (this.imageArray.length > this.activeImage + 1){
|
||||
preloadNextImage = new Image();
|
||||
preloadNextImage.src = this.imageArray[this.activeImage + 1][0];
|
||||
}
|
||||
if (this.activeImage > 0){
|
||||
preloadPrevImage = new Image();
|
||||
preloadPrevImage.src = this.imageArray[this.activeImage - 1][0];
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
//
|
||||
// end()
|
||||
//
|
||||
end: function() {
|
||||
this.disableKeyboardNav();
|
||||
this.lightbox.hide();
|
||||
new Effect.Fade(this.overlay, { duration: this.overlayDuration });
|
||||
$$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' });
|
||||
},
|
||||
|
||||
//
|
||||
// getPageSize()
|
||||
//
|
||||
getPageSize: function() {
|
||||
|
||||
var xScroll, yScroll;
|
||||
|
||||
if (window.innerHeight && window.scrollMaxY) {
|
||||
xScroll = window.innerWidth + window.scrollMaxX;
|
||||
yScroll = window.innerHeight + window.scrollMaxY;
|
||||
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
|
||||
xScroll = document.body.scrollWidth;
|
||||
yScroll = document.body.scrollHeight;
|
||||
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
|
||||
xScroll = document.body.offsetWidth;
|
||||
yScroll = document.body.offsetHeight;
|
||||
}
|
||||
|
||||
var windowWidth, windowHeight;
|
||||
|
||||
if (self.innerHeight) { // all except Explorer
|
||||
if(document.documentElement.clientWidth){
|
||||
windowWidth = document.documentElement.clientWidth;
|
||||
} else {
|
||||
windowWidth = self.innerWidth;
|
||||
}
|
||||
windowHeight = self.innerHeight;
|
||||
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
|
||||
windowWidth = document.documentElement.clientWidth;
|
||||
windowHeight = document.documentElement.clientHeight;
|
||||
} else if (document.body) { // other Explorers
|
||||
windowWidth = document.body.clientWidth;
|
||||
windowHeight = document.body.clientHeight;
|
||||
}
|
||||
|
||||
// for small pages with total height less then height of the viewport
|
||||
if(yScroll < windowHeight){
|
||||
pageHeight = windowHeight;
|
||||
} else {
|
||||
pageHeight = yScroll;
|
||||
}
|
||||
|
||||
// for small pages with total width less then width of the viewport
|
||||
if(xScroll < windowWidth){
|
||||
pageWidth = xScroll;
|
||||
} else {
|
||||
pageWidth = windowWidth;
|
||||
}
|
||||
|
||||
return [pageWidth,pageHeight];
|
||||
}
|
||||
}
|
||||
|
||||
document.observe('dom:loaded', function () { new Lightbox(); });
|
||||
6081
scripts/prototype.js
vendored
Normal file
6081
scripts/prototype.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
68
scripts/scriptaculous.js
Normal file
68
scripts/scriptaculous.js
Normal file
@@ -0,0 +1,68 @@
|
||||
// script.aculo.us scriptaculous.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
|
||||
|
||||
// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||
|
||||
var Scriptaculous = {
|
||||
Version: '1.9.0',
|
||||
require: function(libraryName) {
|
||||
try{
|
||||
// inserting via DOM fails in Safari 2.0, so brute force approach
|
||||
document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
|
||||
} catch(e) {
|
||||
// for xhtml+xml served content, fall back to DOM methods
|
||||
var script = document.createElement('script');
|
||||
script.type = 'text/javascript';
|
||||
script.src = libraryName;
|
||||
document.getElementsByTagName('head')[0].appendChild(script);
|
||||
}
|
||||
},
|
||||
REQUIRED_PROTOTYPE: '1.6.0.3',
|
||||
load: function() {
|
||||
function convertVersionString(versionString) {
|
||||
var v = versionString.replace(/_.*|\./g, '');
|
||||
v = parseInt(v + '0'.times(4-v.length));
|
||||
return versionString.indexOf('_') > -1 ? v-1 : v;
|
||||
}
|
||||
|
||||
if((typeof Prototype=='undefined') ||
|
||||
(typeof Element == 'undefined') ||
|
||||
(typeof Element.Methods=='undefined') ||
|
||||
(convertVersionString(Prototype.Version) <
|
||||
convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
|
||||
throw("script.aculo.us requires the Prototype JavaScript framework >= " +
|
||||
Scriptaculous.REQUIRED_PROTOTYPE);
|
||||
|
||||
var js = /scriptaculous\.js(\?.*)?$/;
|
||||
$$('script[src]').findAll(function(s) {
|
||||
return s.src.match(js);
|
||||
}).each(function(s) {
|
||||
var path = s.src.replace(js, ''),
|
||||
includes = s.src.match(/\?.*load=([a-z,]*)/);
|
||||
(includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
|
||||
function(include) { Scriptaculous.require(path+include+'.js') });
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Scriptaculous.load();
|
||||
Reference in New Issue
Block a user