[evolvis-commits] r17683: javascript-lightbox pending merges:↵ Thorsten Glaser 2011-11-02 lightbox.css only for media="screen", please↵ Thorsten Glaser 2011-11-02 add html_use_lightbox()↵ Thorsten Glaser 2011-11-02 adjust path to images↵ Thorsten Glaser 2011-11-02 add Lightbox v2.05 (only needed files, pristine)

mirabilos at evolvis.org mirabilos at evolvis.org
Wed Nov 2 15:07:32 CET 2011


Author: mirabilos
Date: 2011-11-02 15:07:32 +0100 (Wed, 02 Nov 2011)
New Revision: 17683

Added:
   trunk/gforge_base/evolvisforge-5.1/src/www/images/closelabel.gif
   trunk/gforge_base/evolvisforge-5.1/src/www/images/loading.gif
   trunk/gforge_base/evolvisforge-5.1/src/www/images/nextlabel.gif
   trunk/gforge_base/evolvisforge-5.1/src/www/images/prevlabel.gif
   trunk/gforge_base/evolvisforge-5.1/src/www/js/lightbox.js
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/lightbox.css
Modified:
   trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php
Log:
javascript-lightbox pending merges:
  Thorsten Glaser 2011-11-02 lightbox.css only for media="screen", please
    Thorsten Glaser 2011-11-02 add html_use_lightbox()
    Thorsten Glaser 2011-11-02 adjust path to images
    Thorsten Glaser 2011-11-02 add Lightbox v2.05 (only needed files, pristine)


Added: trunk/gforge_base/evolvisforge-5.1/src/www/images/closelabel.gif
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/images/closelabel.gif	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/images/closelabel.gif	2011-11-02 14:07:32 UTC (rev 17683)
@@ -0,0 +1,7 @@
+GIF89aB  æ  ÀÀÀÁÁÁYYYÒÒÒƒƒƒ¯¯¯õõõäääPPP¸¸¸ŒŒŒ”””TTTVVVÜÜÜRRRÉÉÉQQQXXXUUUìììSSSöööýýýêêêúúú¦¦¦WWW¢¢¢LLLOOOfff÷÷÷ÝÝÝÌÌÌ```{{{¡¡¡üüüðððÞÞÞlllµµµûûû•••ÍÍÍÊÊÊxxxëëëKKKààà___¹¹¹ßßß´´´†††pppcccååå’’’ˆˆˆ©©©nnn———oooÕÕÕŽŽŽíííeeevvv˜˜˜mmm|||ïïïççç±±±³³³ñññyyyZZZdddMMMsssggg–––‡‡‡ãããNNNiiiÛÛÛzzzÿÿÿþþþ                                                                                                      !ù     ,    B   ÿ€\‚ƒ„…†‡ˆ‰Š‹ŒŽŒ]’“”•–——\'˜žŸ˜‘’\,GB\–\#¨ ¯ ¢]!@Q"®]‚.4U”Z°]×ZZº‹£M2EZ®ª$
+>’[à] [Ì• à[ ”
+ë/\ë냣[	T6‚Fа0 ]"lYAK„È™«d`Z0ØQ¢Œ.Ðã d |ùJ$Ð@ÅØH±U&å”xN‚-*	˜8”’ z­P‚$Ø&$è!²‹–-î,•ëɳÒU]**ØytKRC•¸ÄHa€ÿ ©)ië%»“ŠZÚ¥‚º-”m! °”FQ¡0`Bƒ­&áE71ï–K|» ðÍìH†Oâ¢$c–tM"€õneIðÆQbU2Ç‘g¥1%qM`puàæNc9'[Íl™˜æI at q+B…iY at 8˜ ¡ÃpI
+:,°`3G è™U¼˜q#Ø°ì7l9YÏ€É DQq=Œ+/8°¹âM<ã”cOV鬳@m
+‚sØHöxf @ E%d H
+N A'PrŒs¯œxÉ29EÂÅ:¬ä_¨²‚p Ã
+Åô˜Š3\8Á lá¡Q+X@0"øèä(ÎèÂOT”Lü°Ã•OÂ"Tu	KpÙå+²4ã‰~gú˜f  ;
\ No newline at end of file

Added: trunk/gforge_base/evolvisforge-5.1/src/www/images/loading.gif
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/images/loading.gif	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/images/loading.gif	2011-11-02 14:07:32 UTC (rev 17683)
@@ -0,0 +1,32 @@
+GIF89a    ÷  ÿÿÿ³³³ûûûÖÖÖáááòòòººº444ÄÄÄ———ýýýTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   !ÿNETSCAPE2.0   !ù
+   ,         ú Hà‚
+*\Èpà‡	h¨p€‚À‘"ÁÌ8° ÇG>D)¤À“R4ðCˆ œ”IÁË \Âä9pÀŸ:ȹs Î1_2`p`€Ÿ
+u–<	uà‚©SY­ÚkÇž`§FõhvíÆ´6S>u»ð+–ry J´/Q³M.0@¸p_À+æ+óä˜/öKY&]Š—Îõ¸9¥Ù‰
+Mrå	¸`iÌxŸr\«ºëË˪	vfêúåj MO‚&*ZìÙ؇oã>;¼¶Ü¦Å"÷,<yQâÌñ:wš™aºË+g5N1  !ù
+   ,       € H° €*d €!AFT8Á	h,èPà‚‹
+j오„6ìh $ņ&$ RfƆZlèR VTY°eN€=J€Ð—H•B, 5áO©U&=™Ua§]Ãz@¶,تfÍŠ%PvAY± !ù
+   ,      ‰ Hpà *\(aÂ€HE‚"4`€bC Pɐ£-†$©q€É”
+Y2\ÀqäÅ EÄ©€Iœø8ÐÀC@9f M	.8zô¤R¥<xêQƒW	0Õèõ T‘WÏ.4z cO¥c52ˆ›P¬F !ù
+   ,       €€‚*°ÀÀ„ €Ð€E‚2.0 âŁ7r,0ÐâA"&$À±£@“„\ %E 0	0 °“¦@›8?ÎDèò'Ç›ô¬¹4á ¤
+‘îà“fϦU!ÆÌêÓ I®`Ã&<@¶ì•`Íš€¬³ !ù
+   ,      ‚ ,    Áƒ,@` A†,4¸À€ˆ' `ñ"D‰;À²à€Ž3(ÐñáG‰
+Ð(ƒ”
+´É€&F› €¦ôæНFt©´iÓ¤)oJuzÀ ƒ‘N›`zÔÀ¨~ýêâ c@Å™Ö£Ò d !ù
+   ,      ™ (   ÁƒHÈ°à€‡,XÐðáBƒ/&´hP"ÅŠNüȐ#€‘
+†ÌÑ€	h$àҥƆj ÙPçË”mE8p¨Q£’*” §P¦\šô¨Õƒ­~4pÕ ƒ›
+	88–¡0VmÈà€Ûƒœ‚@Àíž@Ͼµj—ëÑv¯ÚÍzÔ%À !ù
+   ,     Œ €@‚°a…
+#.$‘ …+
+¼QãÆŽ9zˆq ÅŠ1j,™Q#Ç“#	ÀI¡›8hÄÉÓ@ÅžtÖJs B==ZséÒ†:[
+<šT O¦u2x +€ƒ$#v=@k±·VDK“íTµg8PØЭǪj !ù
+   ,     } H° €(`°á@…
+:L¸ !‰3b 1£;üHò¢È4°@ä &	¬yð€†øh ƒr$À (Æ@˜
+`S‡Io:,ÚrdR‚O}5˜´*Ƭ¯b=PÐkY©s‚=I³c@ !ù
+   ,     ‰ H° A $À@¡A$<hàÀ	FÜX@£Å5nŒ(ÁÇd$€qàH–'[&\`p€4BTYñ@ ‚?`d@@›&>,¨@C§PؼràS‚E.¸Ù´jT¨WYR
+Y´+Ñ« ¶¶¬Š­K¥»b
+ê•íÚŒ !ù
+   ,      € H𠀃*<X°à‡	t0¢Å‹10±ã‚Ž€„ a @dÀ@åÁ–	˜™Ð%G„,E0À€Ì™UÈ!Ï›?]Zdùqgσ3 |¸ ¨Ñ§Pi.Mx´¦Ö…V¯ÞD8bS„œ©Ð@Ù„ !ù
+   ,     w 8` €Áƒ8pA‡ d0 "ÂXL``ÁAŠI²¤É“(7.`À $K– _¾¹²%²txp5H !Ÿ
+ Z"Ò¦L!@z0êC¤E
+ZMø³©Ö¡	xý:¤X  !ù
+   ,      Š `‚8À !Â…8 âD…^\`‘`C‚?z”€À QŠ$0qÀG‘”y@5[2ØɦÀž=ºÜ	€gΣI^`À€R„šJuhPê‚B­$0 «À¨N	ËR ×Æ(ëP-Û„\ÇÖT›SnÎo ;
\ No newline at end of file

Added: trunk/gforge_base/evolvisforge-5.1/src/www/images/nextlabel.gif
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/images/nextlabel.gif	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/images/nextlabel.gif	2011-11-02 14:07:32 UTC (rev 17683)
@@ -0,0 +1,5 @@
+GIF89a?   ÷ƒ ýýýéééGGG©©©æææÐÐÐÂÂÂìììïï着ªñññöööúúúþþþ\\\÷÷÷ííígggeee___IIIÍÍÍîîî[[[ûûû¼¼¼¦¦¦êêꧧ§pppðððZZZ€€€±±±ccc```ùùùèèèLLLTTTNNN£££ÒÒÒbbbçççhhhŽŽŽWWWaaaQQQ¨¨¨ÕÕÕßßßÁÁÁüüüøøø‘‘‘´´´]]]ÞÞÞƒƒƒzzzòòòfff‚‚‚ÏÏÏRRRYYY«««………mmmdddâââÊÊÊVVV¤¤¤µµµ²²²···EEE^^^¢¢¢óóóËËËÆÆÆkkkuuuÈÈÈšššUUUxxxˆˆˆHHHwwwØØ؍ººº™™™ààànnnKKKÖÖÖÜÜÜSSS¥¥¥jjjOOO®®®¾¾¾ŒŒŒMMM†††äääááá××׬¬¬ëëëÃÃÃBBBXXX~~~sssyyy›››ãããlllôôôÿÿÿ333                                                                                                                                                                                                                                                                                                                                                                                    !ù  ƒ ,    ?    ÿ 
+D° Áƒ*\ÈáÀ†#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(A°2ÃBÁ6D
+äDÁ€›”Ðhâ’ xæ¨`č‚: x@ Bìy ÈFŒØa¡Åd9 p¢Š#0!AâË‚¥9P¤8‚CPƒRxÐ#‚	-”.‰ÇA–Z”(ÀM…8 XJÀE˜6:eøAA/ˆ	Ǥyâ¡LƒFÉtM.Eþâ¬7jTØa@B V   kpÔÙ"‚Î’`àãIˆ·‚ ôð²£ÆðâÇ% Áq0å„‚.$ô>8’ “‰ ²… ‰W‰üƒ €<0Ažå€z„ txüIàŸ C0!ƒzQ€…ŠAG	BÀ€†]>  FAú±öÂ
+âG0Á	Ô˜Ç"˜±AA4áv3D±HT$Ÿfœ@{4Üq¤ A pCJ\VÔÀ„)¦x×%D%ØpÀšlðÆgÆ)çœtÖiç
+=„'Dí	Q@ ;
\ No newline at end of file

Added: trunk/gforge_base/evolvisforge-5.1/src/www/images/prevlabel.gif
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/images/prevlabel.gif	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/images/prevlabel.gif	2011-11-02 14:07:32 UTC (rev 17683)
@@ -0,0 +1,4 @@
+GIF89a?   ÷‰ ÜÜÜýýýöööºººÚÚÚþþþ[[[ÁÁÁõõõüüü^^^MMM___úúúàààÕÕÕØØØ€€€```QQQTTTJJJÝÝÝâââÙÙÙÀÀÀãããùùùÂÂÂÃÃÃðððòòò»»»   ßß߃ƒƒBBBKKK]]]ZZZrrrjjj¾¾¾”””ÌÌÌøøø¤¤¤RRReeeÆÆÆÄÄÄlll¶¶¶åååcccpppvvvfffçççëëëÎÎÎ×××ÊÊÊÉÉÉèèè\\\PPP¡¡¡›››xxx{{{˜˜˜ÞÞÞÓÓÓ@@@¸¸¸GGGzzzóóóÖÖÖ§§§æææOOOwwwdddHHHyyy¼¼¼ôôôtttooo­­­£££ûûû®®®¿¿¿nnnaaaiiiÔÔÔŽŽŽµµµ½½½¢¢¢êêꝝ¹¹¹UUUššš¦¦¦ñññ÷÷÷ªªªÐÐÐŒŒŒÈÈȨ¨¨«««bbb†††IIIXXX³³³áááAAAqqqÏÏÏËËËsssïïïWWWîîîÿÿÿ333                                                                                                                                                                                                                                                                                                                                                                  !ù  ‰ ,    ?    ÿ 	H° Áƒ*4˜(ч#>t(±¢Å‹3jÜȱ£Ç CŠI²¤É“(SnlàcLS\$!ƒŠB~èp ç<É(0pC;"Ô˜À iˆŠÀP  LŒ<ˆ,0dàÄ	uÐL 0€	#"@ñ"àCšv¬1 `ƒ…}~h°²B„¿,1Oi#J€¨À	R^(¸!0UP)è!
+ˆ\	D4¤€9< °‘ÅH 0¶`PƒC‚ƒF¨pã¤c8€ bRÄH#ˆ˜"	D/`ÄBÅD ˜0³Ljˆ0,ÍP‚H‰Çkìè0ãǁE ùRb€@ Xh±äBé$d8€Œ%Ö…A!0ÐC:èñvÐqì! $†x… Àˆ€PBYM°Â(žqˆ@…ÐPAd¨E
+tÄ" Â|ñO d~TÀ€ˆQR 8PÚ@l  "=< Ä  ¥–$ ©$æE7 À™hžã˜µ`à pÆ9 a°ùP䩧žvöé矀*¨Ÿ
+ºPC ;
\ No newline at end of file

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php	2011-11-02 14:07:28 UTC (rev 17682)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php	2011-11-02 14:07:32 UTC (rev 17683)
@@ -374,6 +374,13 @@
 	use_javascript('/scripts/jquery-ui/jquery-ui.min.js');
 }
 
+function html_use_lightbox() {
+	/* Prototype is always loaded */
+	/* script.aculo.us is always loded completely */
+	use_javascript('/js/lightbox.js');
+	use_stylesheet('/themes/css/lightbox.css', 'screen');
+}
+
 /**
  * html_build_select_box_from_arrays() - Takes two arrays, with the first array being the "id" or value and the other
  * array being the text you want displayed.

Added: trunk/gforge_base/evolvisforge-5.1/src/www/js/lightbox.js
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/js/lightbox.js	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/js/lightbox.js	2011-11-02 14:07:32 UTC (rev 17683)
@@ -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:        '/images/loading.gif',     
+    fileBottomNavCloseImage: '/images/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="images/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="images/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(); });
\ No newline at end of file

Added: trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/lightbox.css
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/lightbox.css	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/lightbox.css	2011-11-02 14:07:32 UTC (rev 17683)
@@ -0,0 +1,27 @@
+#lightbox{	position: absolute;	left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0;}
+#lightbox img{ width: auto; height: auto;}
+#lightbox a img{ border: none; }
+
+#outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; }
+#imageContainer{ padding: 10px; }
+
+#loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; }
+#hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; }
+#imageContainer>#hoverNav{ left: 0;}
+#hoverNav a{ outline: none;}
+
+#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }
+#prevLink { left: 0; float: left;}
+#nextLink { right: 0; float: right;}
+#prevLink:hover, #prevLink:visited:hover { background: url(/images/prevlabel.gif) left 15% no-repeat; }
+#nextLink:hover, #nextLink:visited:hover { background: url(/images/nextlabel.gif) right 15% no-repeat; }
+
+#imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; overflow: auto; width: 100%	; }
+
+#imageData{	padding:0 10px; color: #666; }
+#imageData #imageDetails{ width: 70%; float: left; text-align: left; }	
+#imageData #caption{ font-weight: bold;	}
+#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em;	}			
+#imageData #bottomNavClose{ width: 66px; float: right;  padding-bottom: 0.7em; outline: none;}	 	
+
+#overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; }



More information about the evolvis-commits mailing list