jquery.lightbox-0.5.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. /**
  2. * jQuery lightBox plugin
  3. * This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
  4. * and adapted to me for use like a plugin from jQuery.
  5. * @name jquery-lightbox-0.5.js
  6. * @author Leandro Vieira Pinho - http://leandrovieira.com
  7. * @version 0.5
  8. * @date April 11, 2008
  9. * @category jQuery plugin
  10. * @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)
  11. * @license CCAttribution-ShareAlike 2.5 Brazil - http://creativecommons.org/licenses/by-sa/2.5/br/deed.en_US
  12. * @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
  13. */
  14. // Offering a Custom Alias suport - More info: http://docs.jquery.com/Plugins/Authoring#Custom_Alias
  15. (function($) {
  16. /**
  17. * $ is an alias to jQuery object
  18. *
  19. */
  20. $.fn.lightBox = function(settings) {
  21. // Settings to configure the jQuery lightBox plugin how you like
  22. settings = jQuery.extend({
  23. // Configuration related to overlay
  24. overlayBgColor: '#000', // (string) Background color to overlay; inform a hexadecimal value like: #RRGGBB. Where RR, GG, and BB are the hexadecimal values for the red, green, and blue values of the color.
  25. overlayOpacity: 0.8, // (integer) Opacity value to overlay; inform: 0.X. Where X are number from 0 to 9
  26. // Configuration related to navigation
  27. fixedNavigation: false, // (boolean) Boolean that informs if the navigation (next and prev button) will be fixed or not in the interface.
  28. // Configuration related to images
  29. imageLoading: 'images/lightbox-ico-loading.gif', // (string) Path and the name of the loading icon
  30. imageBtnPrev: 'images/lightbox-btn-prev.gif', // (string) Path and the name of the prev button image
  31. imageBtnNext: 'images/lightbox-btn-next.gif', // (string) Path and the name of the next button image
  32. imageBtnClose: 'images/lightbox-btn-close.gif', // (string) Path and the name of the close btn
  33. imageBlank: 'images/lightbox-blank.gif', // (string) Path and the name of a blank image (one pixel)
  34. // Configuration related to container image box
  35. containerBorderSize: 10, // (integer) If you adjust the padding in the CSS for the container, #lightbox-container-image-box, you will need to update this value
  36. containerResizeSpeed: 400, // (integer) Specify the resize duration of container image. These number are miliseconds. 400 is default.
  37. // show image data or not
  38. showImageData: true,
  39. // Configuration related to texts in caption. For example: Image 2 of 8. You can alter either "Image" and "of" texts.
  40. txtImage: 'Image', // (string) Specify text "Image"
  41. txtOf: 'of', // (string) Specify text "of"
  42. // Configuration related to keyboard navigation
  43. keyToClose: 'c', // (string) (c = close) Letter to close the jQuery lightBox interface. Beyond this letter, the letter X and the SCAPE key is used to.
  44. keyToPrev: 'p', // (string) (p = previous) Letter to show the previous image
  45. keyToNext: 'n', // (string) (n = next) Letter to show the next image.
  46. // Don´t alter these variables in any way
  47. imageArray: [],
  48. activeImage: 0
  49. },settings);
  50. // Caching the jQuery object with all elements matched
  51. var jQueryMatchedObj = this; // This, in this context, refer to jQuery object
  52. /**
  53. * Initializing the plugin calling the start function
  54. *
  55. * @return boolean false
  56. */
  57. function _initialize() {
  58. _start(this,jQueryMatchedObj); // This, in this context, refer to object (link) which the user have clicked
  59. return false; // Avoid the browser following the link
  60. }
  61. /**
  62. * Start the jQuery lightBox plugin
  63. *
  64. * @param object objClicked The object (link) whick the user have clicked
  65. * @param object jQueryMatchedObj The jQuery object with all elements matched
  66. */
  67. function _start(objClicked,jQueryMatchedObj) {
  68. // Hime some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
  69. $('embed, object, select').css({ 'visibility' : 'hidden' });
  70. // Call the function to create the markup structure; style some elements; assign events in some elements.
  71. _set_interface();
  72. // Unset total images in imageArray
  73. settings.imageArray.length = 0;
  74. // Unset image active information
  75. settings.activeImage = 0;
  76. // We have an image set? Or just an image? Let´s see it.
  77. if ( jQueryMatchedObj.length == 1 ) {
  78. settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));
  79. } else {
  80. // Add an Array (as many as we have), with href and title atributes, inside the Array that storage the images references
  81. for ( var i = 0; i < jQueryMatchedObj.length; i++ ) {
  82. settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'),jQueryMatchedObj[i].getAttribute('title')));
  83. }
  84. }
  85. while ( settings.imageArray[settings.activeImage][0] != objClicked.getAttribute('href') ) {
  86. settings.activeImage++;
  87. }
  88. // Call the function that prepares image exibition
  89. _set_image_to_view();
  90. }
  91. /**
  92. * Create the jQuery lightBox plugin interface
  93. *
  94. * The HTML markup will be like that:
  95. <div id="jquery-overlay"></div>
  96. <div id="jquery-lightbox">
  97. <div id="lightbox-container-image-box">
  98. <div id="lightbox-container-image">
  99. <img src="../fotos/XX.jpg" id="lightbox-image">
  100. <div id="lightbox-nav">
  101. <a href="#" id="lightbox-nav-btnPrev"></a>
  102. <a href="#" id="lightbox-nav-btnNext"></a>
  103. </div>
  104. <div id="lightbox-loading">
  105. <a href="#" id="lightbox-loading-link">
  106. <img src="../images/lightbox-ico-loading.gif">
  107. </a>
  108. </div>
  109. </div>
  110. </div>
  111. <div id="lightbox-container-image-data-box">
  112. <div id="lightbox-container-image-data">
  113. <div id="lightbox-image-details">
  114. <span id="lightbox-image-details-caption"></span>
  115. <span id="lightbox-image-details-currentNumber"></span>
  116. </div>
  117. <div id="lightbox-secNav">
  118. <a href="#" id="lightbox-secNav-btnClose">
  119. <img src="../images/lightbox-btn-close.gif">
  120. </a>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. *
  126. */
  127. function _set_interface() {
  128. // Apply the HTML markup into body tag
  129. $('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="' + settings.imageLoading + '"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="' + settings.imageBtnClose + '"></a></div></div></div></div>');
  130. // Get page sizes
  131. var arrPageSizes = ___getPageSize();
  132. // Style overlay and show it
  133. $('#jquery-overlay').css({
  134. backgroundColor: settings.overlayBgColor,
  135. opacity: settings.overlayOpacity,
  136. width: arrPageSizes[0],
  137. height: arrPageSizes[1]
  138. }).fadeIn();
  139. // Get page scroll
  140. var arrPageScroll = ___getPageScroll();
  141. // Calculate top and left offset for the jquery-lightbox div object and show it
  142. $('#jquery-lightbox').css({
  143. top: arrPageScroll[1] + (arrPageSizes[3] / 10),
  144. left: arrPageScroll[0]
  145. }).show();
  146. // Assigning click events in elements to close overlay
  147. $('#jquery-overlay,#jquery-lightbox').click(function() {
  148. _finish();
  149. });
  150. // Assign the _finish function to lightbox-loading-link and lightbox-secNav-btnClose objects
  151. $('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function() {
  152. _finish();
  153. return false;
  154. });
  155. // If window was resized, calculate the new overlay dimensions
  156. $(window).resize(function() {
  157. // Get page sizes
  158. var arrPageSizes = ___getPageSize();
  159. // Style overlay and show it
  160. $('#jquery-overlay').css({
  161. width: arrPageSizes[0],
  162. height: arrPageSizes[1]
  163. });
  164. // Get page scroll
  165. var arrPageScroll = ___getPageScroll();
  166. // Calculate top and left offset for the jquery-lightbox div object and show it
  167. $('#jquery-lightbox').css({
  168. top: arrPageScroll[1] + (arrPageSizes[3] / 10),
  169. left: arrPageScroll[0]
  170. });
  171. });
  172. }
  173. /**
  174. * Prepares image exibition; doing a image´s preloader to calculate it´s size
  175. *
  176. */
  177. function _set_image_to_view() { // show the loading
  178. // Show the loading
  179. $('#lightbox-loading').show();
  180. if ( settings.fixedNavigation ) {
  181. $('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
  182. } else {
  183. // Hide some elements
  184. $('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
  185. }
  186. // Image preload process
  187. var objImagePreloader = new Image();
  188. objImagePreloader.onload = function() {
  189. $('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);
  190. // Perfomance an effect in the image container resizing it
  191. _resize_container_image_box(objImagePreloader.width,objImagePreloader.height);
  192. // clear onLoad, IE behaves irratically with animated gifs otherwise
  193. objImagePreloader.onload=function(){};
  194. };
  195. objImagePreloader.src = settings.imageArray[settings.activeImage][0];
  196. };
  197. /**
  198. * Perfomance an effect in the image container resizing it
  199. *
  200. * @param integer intImageWidth The image´s width that will be showed
  201. * @param integer intImageHeight The image´s height that will be showed
  202. */
  203. function _resize_container_image_box(intImageWidth,intImageHeight) {
  204. // Get current width and height
  205. var intCurrentWidth = $('#lightbox-container-image-box').width();
  206. var intCurrentHeight = $('#lightbox-container-image-box').height();
  207. // Get the width and height of the selected image plus the padding
  208. var intWidth = (intImageWidth + (settings.containerBorderSize * 2)); // Plus the image´s width and the left and right padding value
  209. var intHeight = (intImageHeight + (settings.containerBorderSize * 2)); // Plus the image´s height and the left and right padding value
  210. // Diferences
  211. var intDiffW = intCurrentWidth - intWidth;
  212. var intDiffH = intCurrentHeight - intHeight;
  213. // Perfomance the effect
  214. $('#lightbox-container-image-box').animate({ width: intWidth, height: intHeight },settings.containerResizeSpeed,function() { _show_image(); });
  215. if ( ( intDiffW == 0 ) && ( intDiffH == 0 ) ) {
  216. if ( $.browser.msie ) {
  217. ___pause(250);
  218. } else {
  219. ___pause(100);
  220. }
  221. }
  222. $('#lightbox-container-image-data-box').css({ width: intImageWidth });
  223. $('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ height: intImageHeight + (settings.containerBorderSize * 2) });
  224. };
  225. /**
  226. * Show the prepared image
  227. *
  228. */
  229. function _show_image() {
  230. $('#lightbox-loading').hide();
  231. $('#lightbox-image').fadeIn(function() {
  232. _show_image_data();
  233. _set_navigation();
  234. });
  235. _preload_neighbor_images();
  236. };
  237. /**
  238. * Show the image information
  239. *
  240. */
  241. function _show_image_data() {
  242. console.log('_show_image_data...');
  243. console.log('settings.imageArray.length:', settings.imageArray.length);
  244. console.log('_show_image: settings.showImageData(', settings.showImageData ,')...');
  245. if (settings.showImageData === false) {
  246. console.log('_show_image: hide image-data-box ...');
  247. $('#lightbox-container-image-data-box').hide();
  248. return;
  249. }
  250. $('#lightbox-container-image-data-box').slideDown('fast');
  251. $('#lightbox-image-details-caption').hide();
  252. if ( settings.imageArray[settings.activeImage][1] ) {
  253. $('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();
  254. }
  255. // If we have a image set, display 'Image X of X'
  256. if ( settings.imageArray.length > 1 ) {
  257. console.log('_show_image: show currentNumber...');
  258. $('#lightbox-image-details-currentNumber').html(settings.txtImage + ' ' + ( settings.activeImage + 1 ) + ' ' + settings.txtOf + ' ' + settings.imageArray.length).show();
  259. } else {
  260. console.log('_show_image: hide currentNumber...');
  261. $('#lightbox-image-details-currentNumber').hide();
  262. }
  263. }
  264. /**
  265. * Display the button navigations
  266. *
  267. */
  268. function _set_navigation() {
  269. $('#lightbox-nav').show();
  270. // Instead to define this configuration in CSS file, we define here. And it´s need to IE. Just.
  271. $('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
  272. // Show the prev button, if not the first image in set
  273. if ( settings.activeImage != 0 ) {
  274. if ( settings.fixedNavigation ) {
  275. $('#lightbox-nav-btnPrev').css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' })
  276. .unbind()
  277. .bind('click',function() {
  278. settings.activeImage = settings.activeImage - 1;
  279. _set_image_to_view();
  280. return false;
  281. });
  282. } else {
  283. // Show the images button for Next buttons
  284. $('#lightbox-nav-btnPrev').unbind().hover(function() {
  285. $(this).css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' });
  286. },function() {
  287. $(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
  288. }).show().bind('click',function() {
  289. settings.activeImage = settings.activeImage - 1;
  290. _set_image_to_view();
  291. return false;
  292. });
  293. }
  294. }
  295. // Show the next button, if not the last image in set
  296. if ( settings.activeImage != ( settings.imageArray.length -1 ) ) {
  297. if ( settings.fixedNavigation ) {
  298. $('#lightbox-nav-btnNext').css({ 'background' : 'url(' + settings.imageBtnNext + ') right 15% no-repeat' })
  299. .unbind()
  300. .bind('click',function() {
  301. settings.activeImage = settings.activeImage + 1;
  302. _set_image_to_view();
  303. return false;
  304. });
  305. } else {
  306. // Show the images button for Next buttons
  307. $('#lightbox-nav-btnNext').unbind().hover(function() {
  308. $(this).css({ 'background' : 'url(' + settings.imageBtnNext + ') right 15% no-repeat' });
  309. },function() {
  310. $(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
  311. }).show().bind('click',function() {
  312. settings.activeImage = settings.activeImage + 1;
  313. _set_image_to_view();
  314. return false;
  315. });
  316. }
  317. }
  318. // Enable keyboard navigation
  319. _enable_keyboard_navigation();
  320. }
  321. /**
  322. * Enable a support to keyboard navigation
  323. *
  324. */
  325. function _enable_keyboard_navigation() {
  326. $(document).keydown(function(objEvent) {
  327. _keyboard_action(objEvent);
  328. });
  329. }
  330. /**
  331. * Disable the support to keyboard navigation
  332. *
  333. */
  334. function _disable_keyboard_navigation() {
  335. $(document).unbind();
  336. }
  337. /**
  338. * Perform the keyboard actions
  339. *
  340. */
  341. function _keyboard_action(objEvent) {
  342. // To ie
  343. if ( objEvent == null ) {
  344. keycode = event.keyCode;
  345. escapeKey = 27;
  346. // To Mozilla
  347. } else {
  348. keycode = objEvent.keyCode;
  349. escapeKey = objEvent.DOM_VK_ESCAPE;
  350. }
  351. // Get the key in lower case form
  352. key = String.fromCharCode(keycode).toLowerCase();
  353. // Verify the keys to close the ligthBox
  354. if ( ( key == settings.keyToClose ) || ( key == 'x' ) || ( keycode == escapeKey ) ) {
  355. _finish();
  356. }
  357. // Verify the key to show the previous image
  358. if ( ( key == settings.keyToPrev ) || ( keycode == 37 ) ) {
  359. // If we´re not showing the first image, call the previous
  360. if ( settings.activeImage != 0 ) {
  361. settings.activeImage = settings.activeImage - 1;
  362. _set_image_to_view();
  363. _disable_keyboard_navigation();
  364. }
  365. }
  366. // Verify the key to show the next image
  367. if ( ( key == settings.keyToNext ) || ( keycode == 39 ) ) {
  368. // If we´re not showing the last image, call the next
  369. if ( settings.activeImage != ( settings.imageArray.length - 1 ) ) {
  370. settings.activeImage = settings.activeImage + 1;
  371. _set_image_to_view();
  372. _disable_keyboard_navigation();
  373. }
  374. }
  375. }
  376. /**
  377. * Preload prev and next images being showed
  378. *
  379. */
  380. function _preload_neighbor_images() {
  381. if ( (settings.imageArray.length -1) > settings.activeImage ) {
  382. objNext = new Image();
  383. objNext.src = settings.imageArray[settings.activeImage + 1][0];
  384. }
  385. if ( settings.activeImage > 0 ) {
  386. objPrev = new Image();
  387. objPrev.src = settings.imageArray[settings.activeImage -1][0];
  388. }
  389. }
  390. /**
  391. * Remove jQuery lightBox plugin HTML markup
  392. *
  393. */
  394. function _finish() {
  395. $('#jquery-lightbox').remove();
  396. $('#jquery-overlay').fadeOut(function() { $('#jquery-overlay').remove(); });
  397. // Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
  398. $('embed, object, select').css({ 'visibility' : 'visible' });
  399. }
  400. /**
  401. / THIRD FUNCTION
  402. * getPageSize() by quirksmode.com
  403. *
  404. * @return Array Return an array with page width, height and window width, height
  405. */
  406. function ___getPageSize() {
  407. var xScroll, yScroll;
  408. if (window.innerHeight && window.scrollMaxY) {
  409. xScroll = window.innerWidth + window.scrollMaxX;
  410. yScroll = window.innerHeight + window.scrollMaxY;
  411. } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
  412. xScroll = document.body.scrollWidth;
  413. yScroll = document.body.scrollHeight;
  414. } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
  415. xScroll = document.body.offsetWidth;
  416. yScroll = document.body.offsetHeight;
  417. }
  418. var windowWidth, windowHeight;
  419. if (self.innerHeight) { // all except Explorer
  420. if(document.documentElement.clientWidth){
  421. windowWidth = document.documentElement.clientWidth;
  422. } else {
  423. windowWidth = self.innerWidth;
  424. }
  425. windowHeight = self.innerHeight;
  426. } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
  427. windowWidth = document.documentElement.clientWidth;
  428. windowHeight = document.documentElement.clientHeight;
  429. } else if (document.body) { // other Explorers
  430. windowWidth = document.body.clientWidth;
  431. windowHeight = document.body.clientHeight;
  432. }
  433. // for small pages with total height less then height of the viewport
  434. if(yScroll < windowHeight){
  435. pageHeight = windowHeight;
  436. } else {
  437. pageHeight = yScroll;
  438. }
  439. // for small pages with total width less then width of the viewport
  440. if(xScroll < windowWidth){
  441. pageWidth = xScroll;
  442. } else {
  443. pageWidth = windowWidth;
  444. }
  445. arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
  446. return arrayPageSize;
  447. };
  448. /**
  449. / THIRD FUNCTION
  450. * getPageScroll() by quirksmode.com
  451. *
  452. * @return Array Return an array with x,y page scroll values.
  453. */
  454. function ___getPageScroll() {
  455. var xScroll, yScroll;
  456. if (self.pageYOffset) {
  457. yScroll = self.pageYOffset;
  458. xScroll = self.pageXOffset;
  459. } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
  460. yScroll = document.documentElement.scrollTop;
  461. xScroll = document.documentElement.scrollLeft;
  462. } else if (document.body) {// all other Explorers
  463. yScroll = document.body.scrollTop;
  464. xScroll = document.body.scrollLeft;
  465. }
  466. arrayPageScroll = new Array(xScroll,yScroll);
  467. return arrayPageScroll;
  468. };
  469. /**
  470. * Stop the code execution from a escified time in milisecond
  471. *
  472. */
  473. function ___pause(ms) {
  474. var date = new Date();
  475. curDate = null;
  476. do { var curDate = new Date(); }
  477. while ( curDate - date < ms);
  478. };
  479. // Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
  480. return this.unbind('click').click(_initialize);
  481. };
  482. })(jQuery); // Call and execute the function immediately passing the jQuery object