1/* $Id: lightbox.js,v 1.5.2.6.2.136 2010/09/24 08:39:40 snpower Exp $ */ 2 3/** 4 * jQuery Lightbox 5 * @author 6 * Stella Power, <http://drupal.org/user/66894> 7 * 8 * Based on Lightbox v2.03.3 by Lokesh Dhakar 9 * <http://www.huddletogether.com/projects/lightbox2/> 10 * Also partially based on the jQuery Lightbox by Warren Krewenki 11 * <http://warren.mesozen.com> 12 * 13 * Permission has been granted to Mark Ashmead & other Drupal Lightbox2 module 14 * maintainers to distribute this file via Drupal.org 15 * Under GPL license. 16 * 17 * Slideshow, iframe and video functionality added by Stella Power. 18 */ 19 20var Lightbox; 21(function($) { 22Lightbox = { 23 auto_modal : false, 24 overlayOpacity : 0.8, // Controls transparency of shadow overlay. 25 overlayColor : '000', // Controls colour of shadow overlay. 26 disableCloseClick : true, 27 // Controls the order of the lightbox resizing animation sequence. 28 resizeSequence: 0, // 0: simultaneous, 1: width then height, 2: height then width. 29 resizeSpeed: 'normal', // Controls the speed of the lightbox resizing animation. 30 fadeInSpeed: 'normal', // Controls the speed of the image appearance. 31 slideDownSpeed: 'slow', // Controls the speed of the image details appearance. 32 minWidth: 240, 33 borderSize : 10, 34 boxColor : 'fff', 35 fontColor : '000', 36 topPosition : '', 37 infoHeight: 20, 38 alternative_layout : false, 39 imageArray : [], 40 imageNum : null, 41 total : 0, 42 activeImage : null, 43 inprogress : false, 44 disableResize : false, 45 disableZoom : false, 46 isZoomedIn : false, 47 rtl : false, 48 loopItems : false, 49 keysClose : ['c', 'x', 27], 50 keysPrevious : ['p', 37], 51 keysNext : ['n', 39], 52 keysZoom : ['z'], 53 keysPlayPause : [32], 54 55 // Slideshow options. 56 slideInterval : 5000, // In milliseconds. 57 showPlayPause : true, 58 autoStart : true, 59 autoExit : true, 60 pauseOnNextClick : false, // True to pause the slideshow when the "Next" button is clicked. 61 pauseOnPrevClick : true, // True to pause the slideshow when the "Prev" button is clicked. 62 slideIdArray : [], 63 slideIdCount : 0, 64 isSlideshow : false, 65 isPaused : false, 66 loopSlides : false, 67 68 // Iframe options. 69 isLightframe : false, 70 iframe_width : 600, 71 iframe_height : 400, 72 iframe_border : 1, 73 74 // Video and modal options. 75 enableVideo : false, 76 flvPlayer : '/flvplayer.swf', 77 flvFlashvars : '', 78 isModal : false, 79 isVideo : false, 80 videoId : false, 81 modalWidth : 400, 82 modalHeight : 400, 83 modalHTML : null, 84 85 86 // initialize() 87 // Constructor runs on completion of the DOM loading. 88 // The function inserts html at the bottom of the page which is used 89 // to display the shadow overlay and the image container. 90 initialize: function() { 91 92 var s = Drupal.settings.lightbox2; 93 Lightbox.overlayOpacity = s.overlay_opacity; 94 Lightbox.overlayColor = s.overlay_color; 95 Lightbox.disableCloseClick = s.disable_close_click; 96 Lightbox.resizeSequence = s.resize_sequence; 97 Lightbox.resizeSpeed = s.resize_speed; 98 Lightbox.fadeInSpeed = s.fade_in_speed; 99 Lightbox.slideDownSpeed = s.slide_down_speed; 100 Lightbox.borderSize = s.border_size; 101 Lightbox.boxColor = s.box_color; 102 Lightbox.fontColor = s.font_color; 103 Lightbox.topPosition = s.top_position; 104 Lightbox.rtl = s.rtl; 105 Lightbox.loopItems = s.loop_items; 106 Lightbox.keysClose = s.keys_close.split(" "); 107 Lightbox.keysPrevious = s.keys_previous.split(" "); 108 Lightbox.keysNext = s.keys_next.split(" "); 109 Lightbox.keysZoom = s.keys_zoom.split(" "); 110 Lightbox.keysPlayPause = s.keys_play_pause.split(" "); 111 Lightbox.disableResize = s.disable_resize; 112 Lightbox.disableZoom = s.disable_zoom; 113 Lightbox.slideInterval = s.slideshow_interval; 114 Lightbox.showPlayPause = s.show_play_pause; 115 Lightbox.showCaption = s.show_caption; 116 Lightbox.autoStart = s.slideshow_automatic_start; 117 Lightbox.autoExit = s.slideshow_automatic_exit; 118 Lightbox.pauseOnNextClick = s.pause_on_next_click; 119 Lightbox.pauseOnPrevClick = s.pause_on_previous_click; 120 Lightbox.loopSlides = s.loop_slides; 121 Lightbox.alternative_layout = s.use_alt_layout; 122 Lightbox.iframe_width = s.iframe_width; 123 Lightbox.iframe_height = s.iframe_height; 124 Lightbox.iframe_border = s.iframe_border; 125 Lightbox.enableVideo = s.enable_video; 126 if (s.enable_video) { 127 Lightbox.flvPlayer = s.flvPlayer; 128 Lightbox.flvFlashvars = s.flvFlashvars; 129 } 130 131 // Make the lightbox divs. 132 var layout_class = (s.use_alt_layout ? 'lightbox2-alt-layout' : 'lightbox2-orig-layout'); 133 var output = '<div id="lightbox2-overlay" style="display: none;"></div>\ 134 <div id="lightbox" style="display: none;" class="' + layout_class + '">\ 135 <div id="outerImageContainer"></div>\ 136 <div id="imageDataContainer" class="clearfix">\ 137 <div id="imageData"></div>\ 138 </div>\ 139 </div>'; 140 var loading = '<div id="loading"><a href="#" id="loadingLink"></a></div>'; 141 var modal = '<div id="modalContainer" style="display: none;"></div>'; 142 var frame = '<div id="frameContainer" style="display: none;"></div>'; 143 var imageContainer = '<div id="imageContainer" style="display: none;"></div>'; 144 var details = '<div id="imageDetails"></div>'; 145 var bottomNav = '<div id="bottomNav"></div>'; 146 var image = '<img id="lightboxImage" alt="" />'; 147 var hoverNav = '<div id="hoverNav"><a id="prevLink" href="#"></a><a id="nextLink" href="#"></a></div>';
148 var frameNav = '<div id="frameHoverNav"><a id="framePrevLink" href="#"></a><a id="frameNextLink" href="#"></a></div>'; 149 var hoverNav = '<div id="hoverNav"><a id="prevLink" title="' + Drupal.t('Previous') + '" href="#"></a><a id="nextLink" title="' + Drupal.t('Next') + '" href="#"></a></div>'; 150 var frameNav = '<div id="frameHoverNav"><a id="framePrevLink" title="' + Drupal.t('Previous') + '" href="#"></a><a id="frameNextLink" title="' + Drupal.t('Next') + '" href="#"></a></div>'; 151 var caption = '<span id="caption"></span>'; 152 var numberDisplay = '<span id="numberDisplay"></span>'; 153 var close = '<a id="bottomNavClose" title="' + Drupal.t('Close') + '" href="#"></a>'; 154 var zoom = '<a id="bottomNavZoom" href="#"></a>'; 155 var zoomOut = '<a id="bottomNavZoomOut" href="#"></a>'; 156 var pause = '<a id="lightshowPause" title="' + Drupal.t('Pause Slideshow') + '" href="#" style="display: none;"></a>'; 157 var play = '<a id="lightshowPlay" title="' + Drupal.t('Play Slideshow') + '" href="#" style="display: none;"></a>'; 158 159 $("body").append(output); 160 $('#outerImageContainer').append(modal + frame + imageContainer + loading); 161 if (!s.use_alt_layout) { 162 $('#imageContainer').append(image + hoverNav);
163 $('#imageData').append(details + bottomNav); 164 $('#imageDetails').append(caption + numberDisplay); 165 $('#bottomNav').append(frameNav + close + zoom + zoomOut + pause + play); 166 } 167 else { 168 $('#outerImageContainer').append(bottomNav); 169 $('#imageContainer').append(image); 170 $('#bottomNav').append(close + zoom + zoomOut); 171 $('#imageData').append(hoverNav + details); 172 $('#imageDetails').append(caption + numberDisplay + pause + play); 173 } 174 175 // Setup onclick handlers. 176 if (Lightbox.disableCloseClick) { 177 $('#lightbox2-overlay').click(function() { Lightbox.end(); return false; } ).hide(); 178 } 179 $('#loadingLink, #bottomNavClose').click(function() { Lightbox.end('forceClose'); return false; } ); 180 $('#prevLink, #framePrevLink').click(function() { Lightbox.changeData(Lightbox.activeImage - 1); return false; } ); 181 $('#nextLink, #frameNextLink').click(function() { Lightbox.changeData(Lightbox.activeImage + 1); return false; } ); 182 $('#bottomNavZoom').click(function() { Lightbox.changeData(Lightbox.activeImage, true); return false; } ); 183 $('#bottomNavZoomOut').click(function() { Lightbox.changeData(Lightbox.activeImage, false); return false; } ); 184 $('#lightshowPause').click(function() { Lightbox.togglePlayPause("lightshowPause", "lightshowPlay"); return false; } ); 185 $('#lightshowPlay').click(function() { Lightbox.togglePlayPause("lightshowPlay", "lightshowPause"); return false; } ); 186 187 // Fix positioning. 188 $('#prevLink, #nextLink, #framePrevLink, #frameNextLink').css({ 'paddingTop': Lightbox.borderSize + 'px'}); 189 $('#imageContainer, #frameContainer, #modalContainer').css({ 'padding': Lightbox.borderSize + 'px'}); 190 $('#outerImageContainer, #imageDataContainer, #bottomNavClose').css({'backgroundColor': '#' + Lightbox.boxColor, 'color': '#'+Lightbox.fontColor}); 191 if (Lightbox.alternative_layout) { 192 $('#bottomNavZoom, #bottomNavZoomOut').css({'bottom': Lightbox.borderSize + 'px', 'right': Lightbox.borderSize + 'px'}); 193 } 194 else if (Lightbox.rtl == 1 && Drupal.settings.lightbox2.useragent.search('MSIE') !== -1) { 195 $('#bottomNavZoom, #bottomNavZoomOut').css({'left': '0px'}); 196 } 197 198 // Force navigation links to always be displayed 199 if (s.force_show_nav) { 200 $('#prevLink, #nextLink').addClass("force_show_nav"); 201 } 202 203 }, 204 205 // initList() 206 // Loops through anchor tags looking for 'lightbox', 'lightshow' and 207 // 'lightframe', etc, references and applies onclick events to appropriate 208 // links. You can rerun after dynamically adding images w/ajax. 209 initList : function(context) { 210 211 if (context == undefined || context == null) { 212 context = document; 213 } 214 215 // Attach lightbox to any links with rel 'lightbox', 'lightshow' or 216 // 'lightframe', etc. 217 $("a[rel^='lightbox']:not(.lightbox-processed), area[rel^='lightbox']:not(.lightbox-processed)", context).addClass('lightbox-processed').click(function(e) { 218 if (Lightbox.disableCloseClick) { 219 $('#lightbox').unbind('click'); 220 $('#lightbox').click(function() { Lightbox.end('forceClose'); } ); 221 } 222 Lightbox.start(this, false, false, false, false); 223 if (e.preventDefault) { e.preventDefault(); } 224 return false; 225 }); 226 $("a[rel^='lightshow']:not(.lightbox-processed), area[rel^='lightshow']:not(.lightbox-processed)", context).addClass('lightbox-processed').click(function(e) { 227 if (Lightbox.disableCloseClick) { 228 $('#lightbox').unbind('click'); 229 $('#lightbox').click(function() { Lightbox.end('forceClose'); } ); 230 } 231 Lightbox.start(this, true, false, false, false); 232 if (e.preventDefault) { e.preventDefault(); } 233 return false; 234 }); 235 $("a[rel^='lightframe']:not(.lightbox-processed), area[rel^='lightframe']:not(.lightbox-processed)", context).addClass('lightbox-processed').click(function(e) { 236 if (Lightbox.disableCloseClick) { 237 $('#lightbox').unbind('click'); 238 $('#lightbox').click(function() { Lightbox.end('forceClose'); } ); 239 } 240 Lightbox.start(this, false, true, false, false); 241 if (e.preventDefault) { e.preventDefault(); } 242 return false;
243 }); 244 if (Lightbox.enableVideo) { 245 $("a[rel^='lightvideo']:not(.lightbox-processed), area[rel^='lightvideo']:not(.lightbox-processed)", context).addClass('lightbox-processed').click(function(e) { 246 if (Lightbox.disableCloseClick) { 247 $('#lightbox').unbind('click'); 248 $('#lightbox').click(function() { Lightbox.end('forceClose'); } ); 249 } 250 Lightbox.start(this, false, false, true, false); 251 if (e.preventDefault) { e.preventDefault(); } 252 return false; 253 }); 254 } 255 $("a[rel^='lightmodal']:not(.lightbox-processed), area[rel^='lightmodal']:not(.lightbox-processed)", context).addClass('lightbox-processed').click(function(e) { 256 $('#lightbox').unbind('click'); 257 // Add classes from the link to the lightbox div - don't include lightbox-processed 258 $('#lightbox').addClass($(this).attr('class')); 259 $('#lightbox').removeClass('lightbox-processed'); 260 Lightbox.start(this, false, false, false, true); 261 if (e.preventDefault) { e.preventDefault(); } 262 return false; 263 }); 264 $("#lightboxAutoModal:not(.lightbox-processed)", context).addClass('lightbox-processed').click(function(e) { 265 Lightbox.auto_modal = true; 266 $('#lightbox').unbind('click'); 267 Lightbox.start(this, false, false, false, true); 268 if (e.preventDefault) { e.preventDefault(); } 269 return false; 270 }); 271 }, 272 273 // start() 274 // Display overlay and lightbox. If image is part of a set, add siblings to 275 // imageArray. 276 start: function(imageLink, slideshow, lightframe, lightvideo, lightmodal) { 277 278 Lightbox.isPaused = !Lightbox.autoStart; 279 280 // Replaces hideSelectBoxes() and hideFlash() calls in original lightbox2. 281 Lightbox.toggleSelectsFlash('hide'); 282 283 // Stretch overlay to fill page and fade in. 284 var arrayPageSize = Lightbox.getPageSize(); 285 $("#lightbox2-overlay").hide().css({ 286 'width': '100%', 287 'zIndex': '10090', 288 'height': arrayPageSize[1] + 'px', 289 'backgroundColor' : '#' + Lightbox.overlayColor 290 }); 291 // Detect OS X FF2 opacity + flash issue. 292 if (lightvideo && this.detectMacFF2()) { 293 $("#lightbox2-overlay").removeClass("overlay_default"); 294 $("#lightbox2-overlay").addClass("overlay_macff2"); 295 $("#lightbox2-overlay").css({'opacity' : null}); 296 } 297 else { 298 $("#lightbox2-overlay").removeClass("overlay_macff2"); 299 $("#lightbox2-overlay").addClass("overlay_default"); 300 $("#lightbox2-overlay").css({'opacity' : Lightbox.overlayOpacity}); 301 } 302 $("#lightbox2-overlay").fadeIn(Lightbox.fadeInSpeed); 303 304 305 Lightbox.isSlideshow = slideshow; 306 Lightbox.isLightframe = lightframe; 307 Lightbox.isVideo = lightvideo; 308 Lightbox.isModal = lightmodal; 309 Lightbox.imageArray = []; 310 Lightbox.imageNum = 0; 311 312 var anchors = $(imageLink.tagName); 313 var anchor = null; 314 var rel_parts = Lightbox.parseRel(imageLink); 315 var rel = rel_parts["rel"]; 316 var rel_group = rel_parts["group"]; 317 var title = (rel_parts["title"] ? rel_parts["title"] : imageLink.title); 318 var rel_style = null; 319 var i = 0; 320 321 if (rel_parts["flashvars"]) { 322 Lightbox.flvFlashvars = Lightbox.flvFlashvars + '&' + rel_parts["flashvars"]; 323 } 324 325 // Set the title for image alternative text. 326 var alt = imageLink.title; 327 if (!alt) { 328 var img = $(imageLink).find("img"); 329 if (img && $(img).attr("alt")) { 330 alt = $(img).attr("alt"); 331 } 332 else { 333 alt = title; 334 } 335 } 336 337 if ($(imageLink).attr('id') == 'lightboxAutoModal') { 338 rel_style = rel_parts["style"]; 339 Lightbox.imageArray.push(['#lightboxAutoModal > *', title, alt, rel_style, 1]); 340 } 341 else { 342 // Handle lightbox images with no grouping. 343 if ((rel == 'lightbox' || rel == 'lightshow') && !rel_group) { 344 Lightbox.imageArray.push([imageLink.href, title, alt]); 345 } 346 347 // Handle other items with no grouping. 348 else if (!rel_group) { 349 rel_style = rel_parts["style"]; 350 Lightbox.imageArray.push([imageLink.href, title, alt, rel_style]); 351 } 352 353 // Handle grouped items. 354 else { 355 356 // Loop through anchors and add them to imageArray. 357 for (i = 0; i < anchors.length; i++) { 358 anchor = anchors[i]; 359 if (anchor.href && typeof(anchor.href) == "string" && $(anchor).attr('rel')) { 360 var rel_data = Lightbox.parseRel(anchor); 361 var anchor_title = (rel_data["title"] ? rel_data["title"] : anchor.title); 362 img_alt = anchor.title; 363 if (!img_alt) { 364 var anchor_img = $(anchor).find("img"); 365 if (anchor_img && $(anchor_img).attr("alt")) { 366 img_alt = $(anchor_img).attr("alt"); 367 } 368 else { 369 img_alt = title; 370 } 371 } 372 if (rel_data["rel"] == rel) { 373 if (rel_data["group"] == rel_group) { 374 if (Lightbox.isLightframe || Lightbox.isModal || Lightbox.isVideo) { 375 rel_style = rel_data["style"]; 376 } 377 Lightbox.imageArray.push([anchor.href, anchor_title, img_alt, rel_style]); 378 } 379 } 380 } 381 } 382 383 // Remove duplicates. 384 for (i = 0; i < Lightbox.imageArray.length; i++) { 385 for (j = Lightbox.imageArray.length-1; j > i; j--) { 386 if (Lightbox.imageArray[i][0] == Lightbox.imageArray[j][0]) { 387 Lightbox.imageArray.splice(j,1); 388 } 389 } 390 } 391 while (Lightbox.imageArray[Lightbox.imageNum][0] != imageLink.href) { 392 Lightbox.imageNum++; 393 } 394 } 395 } 396 397 if (Lightbox.isSlideshow && Lightbox.showPlayPause && Lightbox.isPaused) { 398 $('#lightshowPlay').show(); 399 $('#lightshowPause').hide(); 400 } 401 402 // Calculate top and left offset for the lightbox. 403 var arrayPageScroll = Lightbox.getPageScroll(); 404 var lightboxTop = arrayPageScroll[1] + (Lightbox.topPosition == '' ? (arrayPageSize[3] / 10) : Lightbox.topPosition) * 1; 405 var lightboxLeft = arrayPageScroll[0]; 406 $('#frameContainer, #modalContainer, #lightboxImage').hide();
407 $('#hoverNav, #prevLink, #nextLink, #frameHoverNav, #framePrevLink, #frameNextLink').hide(); 408 $('#imageDataContainer, #numberDisplay, #bottomNavZoom, #bottomNavZoomOut').hide(); 409 $('#outerImageContainer').css({'width': '250px', 'height': '250px'}); 410 $('#lightbox').css({ 411 'zIndex': '10500', 412 'top': lightboxTop + 'px', 413 'left': lightboxLeft + 'px' 414 }).show(); 415 416 Lightbox.total = Lightbox.imageArray.length; 417 Lightbox.changeData(Lightbox.imageNum); 418 }, 419 420 // changeData() 421 // Hide most elements and preload image in preparation for resizing image 422 // container. 423 changeData: function(imageNum, zoomIn) { 424 425 if (Lightbox.inprogress === false) { 426 if (Lightbox.total > 1 && ((Lightbox.isSlideshow && Lightbox.loopSlides) || (!Lightbox.isSlideshow && Lightbox.loopItems))) { 427 if (imageNum >= Lightbox.total) imageNum = 0; 428 if (imageNum < 0) imageNum = Lightbox.total - 1; 429 } 430 431 if (Lightbox.isSlideshow) { 432 for (var i = 0; i < Lightbox.slideIdCount; i++) { 433 window.clearTimeout(Lightbox.slideIdArray[i]); 434 } 435 } 436 Lightbox.inprogress = true; 437 Lightbox.activeImage = imageNum; 438 439 if (Lightbox.disableResize && !Lightbox.isSlideshow) { 440 zoomIn = true; 441 } 442 Lightbox.isZoomedIn = zoomIn; 443 444 445 // Hide elements during transition. 446 $('#loading').css({'zIndex': '10500'}).show(); 447 if (!Lightbox.alternative_layout) { 448 $('#imageContainer').hide(); 449 } 450 $('#frameContainer, #modalContainer, #lightboxImage').hide(); 451 $('#hoverNav, #prevLink, #nextLink, #frameHoverNav, #framePrevLink, #frameNextLink').hide(); 452 $('#imageDataContainer, #numberDisplay, #bottomNavZoom, #bottomNavZoomOut').hide(); 453 454 // Preload image content, but not iframe pages. 455 if (!Lightbox.isLightframe && !Lightbox.isVideo && !Lightbox.isModal) { 456 $("#lightbox #imageDataContainer").removeClass('lightbox2-alt-layout-data'); 457 imgPreloader = new Image(); 458 imgPreloader.onerror = function() { Lightbox.imgNodeLoadingError(this); }; 459 460 imgPreloader.onload = function() { 461 var photo = document.getElementById('lightboxImage'); 462 photo.src = Lightbox.imageArray[Lightbox.activeImage][0]; 463 photo.alt = Lightbox.imageArray[Lightbox.activeImage][2]; 464 465 var imageWidth = imgPreloader.width; 466 var imageHeight = imgPreloader.height; 467 468 // Resize code. 469 var arrayPageSize = Lightbox.getPageSize(); 470 var targ = { w:arrayPageSize[2] - (Lightbox.borderSize * 2), h:arrayPageSize[3] - (Lightbox.borderSize * 6) - (Lightbox.infoHeight * 4) - (arrayPageSize[3] / 10) }; 471 var orig = { w:imgPreloader.width, h:imgPreloader.height }; 472 473 // Image is very large, so show a smaller version of the larger image 474 // with zoom button. 475 if (zoomIn !== true) { 476 var ratio = 1.0; // Shrink image with the same aspect. 477 $('#bottomNavZoomOut, #bottomNavZoom').hide(); 478 if ((orig.w >= targ.w || orig.h >= targ.h) && orig.h && orig.w) { 479 ratio = ((targ.w / orig.w) < (targ.h / orig.h)) ? targ.w / orig.w : targ.h / orig.h; 480 if (!Lightbox.disableZoom && !Lightbox.isSlideshow) { 481 $('#bottomNavZoom').css({'zIndex': '10500'}).show(); 482 } 483 } 484 485 imageWidth = Math.floor(orig.w * ratio); 486 imageHeight = Math.floor(orig.h * ratio); 487 } 488 489 else { 490 $('#bottomNavZoom').hide();
491 // Only display zoom out button if the image is zoomed in already. 492 if ((orig.w >= targ.w || orig.h >= targ.h) && orig.h && orig.w) { 493 // Only display zoom out button if not a slideshow and if the 494 // buttons aren't disabled. 495 if (!Lightbox.disableResize && Lightbox.isSlideshow === false && !Lightbox.disableZoom) { 496 $('#bottomNavZoomOut').css({'zIndex': '10500'}).show(); 497 } 498 } 499 } 500 501 photo.style.width = (imageWidth) + 'px'; 502 photo.style.height = (imageHeight) + 'px'; 503 Lightbox.resizeContainer(imageWidth, imageHeight); 504 505 // Clear onLoad, IE behaves irratically with animated gifs otherwise. 506 imgPreloader.onload = function() {}; 507 }; 508 509 imgPreloader.src = Lightbox.imageArray[Lightbox.activeImage][0]; 510 imgPreloader.alt = Lightbox.imageArray[Lightbox.activeImage][2]; 511 } 512 513 // Set up frame size, etc. 514 else if (Lightbox.isLightframe) { 515 $("#lightbox #imageDataContainer").addClass('lightbox2-alt-layout-data'); 516 var src = Lightbox.imageArray[Lightbox.activeImage][0]; 517 $('#frameContainer').html('<iframe id="lightboxFrame" style="display: none;" src="'+src+'"></iframe>'); 518 519 // Enable swf support in Gecko browsers. 520 if (Drupal.settings.lightbox2.useragent.search('Mozilla') !== -1 && src.indexOf('.swf') != -1) { 521 setTimeout(function () { 522 document.getElementById("lightboxFrame").src = Lightbox.imageArray[Lightbox.activeImage][0]; 523 }, 1000); 524 } 525 526 if (!Lightbox.iframe_border) { 527 $('#lightboxFrame').css({'border': 'none'}); 528 $('#lightboxFrame').attr('frameborder', '0'); 529 } 530 var iframe = document.getElementById('lightboxFrame'); 531 var iframeStyles = Lightbox.imageArray[Lightbox.activeImage][3]; 532 iframe = Lightbox.setStyles(iframe, iframeStyles); 533 Lightbox.resizeContainer(parseInt(iframe.width, 10), parseInt(iframe.height, 10)); 534 } 535 else if (Lightbox.isVideo || Lightbox.isModal) { 536 $("#lightbox #imageDataContainer").addClass('lightbox2-alt-layout-data'); 537 var container = document.getElementById('modalContainer'); 538 var modalStyles = Lightbox.imageArray[Lightbox.activeImage][3]; 539 container = Lightbox.setStyles(container, modalStyles); 540 if (Lightbox.isVideo) { 541 Lightbox.modalHeight = parseInt(container.height, 10) - 10; 542 Lightbox.modalWidth = parseInt(container.width, 10) - 10; 543 Lightvideo.startVideo(Lightbox.imageArray[Lightbox.activeImage][0]); 544 } 545 Lightbox.resizeContainer(parseInt(container.width, 10), parseInt(container.height, 10)); 546 } 547 } 548 }, 549 550 // imgNodeLoadingError() 551 imgNodeLoadingError: function(image) { 552 var s = Drupal.settings.lightbox2; 553 var original_image = Lightbox.imageArray[Lightbox.activeImage][0]; 554 if (s.display_image_size !== "") { 555 original_image = original_image.replace(new RegExp("."+s.display_image_size), ""); 556 } 557 Lightbox.imageArray[Lightbox.activeImage][0] = original_image; 558 image.onerror = function() { Lightbox.imgLoadingError(image); }; 559 image.src = original_image; 560 }, 561 562 // imgLoadingError() 563 imgLoadingError: function(image) { 564 var s = Drupal.settings.lightbox2; 565 Lightbox.imageArray[Lightbox.activeImage][0] = s.default_image; 566 image.src = s.default_image; 567 }, 568 569 // resizeContainer() 570 resizeContainer: function(imgWidth, imgHeight) { 571 572 imgWidth = (imgWidth < Lightbox.minWidth ? Lightbox.minWidth : imgWidth); 573 574 this.widthCurrent = $('#outerImageContainer').width(); 575 this.heightCurrent = $('#outerImageContainer').height(); 576 577 var widthNew = (imgWidth + (Lightbox.borderSize * 2)); 578 var heightNew = (imgHeight + (Lightbox.borderSize * 2)); 579 580 // Scalars based on change from old to new. 581 this.xScale = ( widthNew / this.widthCurrent) * 100; 582 this.yScale = ( heightNew / this.heightCurrent) * 100; 583 584 // Calculate size difference between new and old image, and resize if 585 // necessary. 586 wDiff = this.widthCurrent - widthNew; 587 hDiff = this.heightCurrent - heightNew; 588 589 $('#modalContainer').css({'width': imgWidth, 'height': imgHeight}); 590 // Detect animation sequence. 591 if (Lightbox.resizeSequence) { 592 var animate1 = {width: widthNew}; 593 var animate2 = {height: heightNew}; 594 if (Lightbox.resizeSequence == 2) { 595 animate1 = {height: heightNew}; 596 animate2 = {width: widthNew}; 597 } 598 $('#outerImageContainer').animate(animate1, Lightbox.resizeSpeed).animate(animate2, Lightbox.resizeSpeed, 'linear', function() { Lightbox.showData(); }); 599 } 600 // Simultaneous. 601 else { 602 $('#outerImageContainer').animate({'width': widthNew, 'height': heightNew}, Lightbox.resizeSpeed, 'linear', function() { Lightbox.showData(); }); 603 } 604 605 // If new and old image are same size and no scaling transition is necessary 606 // do a quick pause to prevent image flicker. 607 if ((hDiff === 0) && (wDiff === 0)) { 608 if (Drupal.settings.lightbox2.useragent.search('MSIE') !== -1) { 609 Lightbox.pause(250); 610 } 611 else { 612 Lightbox.pause(100); 613 } 614 } 615 616 var s = Drupal.settings.lightbox2; 617 if (!s.use_alt_layout) { 618 $('#prevLink, #nextLink').css({'height': imgHeight + 'px'}); 619 } 620 $('#imageDataContainer').css({'width': widthNew + 'px'}); 621 }, 622 623 // showData() 624 // Display image and begin preloading neighbors. 625 showData: function() { 626 $('#loading').hide(); 627 628 if (Lightbox.isLightframe || Lightbox.isVideo || Lightbox.isModal) { 629 Lightbox.updateDetails(); 630 if (Lightbox.isLightframe) { 631 $('#frameContainer').show(); 632 if (Drupal.settings.lightbox2.useragent.search('Safari') !== -1 || Lightbox.fadeInSpeed === 0) { 633 $('#lightboxFrame').css({'zIndex': '10500'}).show(); 634 } 635 else { 636 $('#lightboxFrame').css({'zIndex': '10500'}).fadeIn(Lightbox.fadeInSpeed); 637 } 638 } 639 else { 640 if (Lightbox.isVideo) { 641 $("#modalContainer").html(Lightbox.modalHTML).click(function(){return false;}).css('zIndex', '10500').show(); 642 } 643 else { 644 var src = unescape(Lightbox.imageArray[Lightbox.activeImage][0]); 645 if (Lightbox.imageArray[Lightbox.activeImage][4]) { 646 $(src).appendTo("#modalContainer"); 647 $('#modalContainer').css({'zIndex': '10500'}).show(); 648 } 649 else { 650 // Use a callback to show the new image, otherwise you get flicker. 651 $("#modalContainer").hide().load(src, function () {$('#modalContainer').css({'zIndex': '10500'}).show();}); 652 } 653 $('#modalContainer').unbind('click'); 654 } 655 // This might be needed in the Lightframe section above. 656 //$('#modalContainer').css({'zIndex': '10500'}).show(); 657 } 658 } 659 660 // Handle display of image content. 661 else { 662 $('#imageContainer').show(); 663 if (Drupal.settings.lightbox2.useragent.search('Safari') !== -1 || Lightbox.fadeInSpeed === 0) { 664 $('#lightboxImage').css({'zIndex': '10500'}).show(); 665 } 666 else { 667 $('#lightboxImage').css({'zIndex': '10500'}).fadeIn(Lightbox.fadeInSpeed); 668 } 669 Lightbox.updateDetails(); 670 this.preloadNeighborImages(); 671 } 672 Lightbox.inprogress = false;
673 674 // Slideshow specific stuff. 675 if (Lightbox.isSlideshow) { 676 if (!Lightbox.loopSlides && Lightbox.activeImage == (Lightbox.total - 1)) { 677 if (Lightbox.autoExit) { 678 Lightbox.slideIdArray[Lightbox.slideIdCount++] = setTimeout(function () {Lightbox.end('slideshow');}, Lightbox.slideInterval); 679 } 680 } 681 else { 682 if (!Lightbox.isPaused && Lightbox.total > 1) { 683 Lightbox.slideIdArray[Lightbox.slideIdCount++] = setTimeout(function () {Lightbox.changeData(Lightbox.activeImage + 1);}, Lightbox.slideInterval); 684 } 685 } 686 if (Lightbox.showPlayPause && Lightbox.total > 1 && !Lightbox.isPaused) { 687 $('#lightshowPause').show(); 688 $('#lightshowPlay').hide(); 689 } 690 else if (Lightbox.showPlayPause && Lightbox.total > 1) { 691 $('#lightshowPause').hide(); 692 $('#lightshowPlay').show(); 693 } 694 } 695 696 // Adjust the page overlay size. 697 var arrayPageSize = Lightbox.getPageSize(); 698 var arrayPageScroll = Lightbox.getPageScroll(); 699 var pageHeight = arrayPageSize[1]; 700 if (Lightbox.isZoomedIn && arrayPageSize[1] > arrayPageSize[3]) { 701 var lightboxTop = (Lightbox.topPosition == '' ? (arrayPageSize[3] / 10) : Lightbox.topPosition) * 1; 702 pageHeight = pageHeight + arrayPageScroll[1] + lightboxTop; 703 } 704 $('#lightbox2-overlay').css({'height': pageHeight + 'px', 'width': arrayPageSize[0] + 'px'}); 705 706 // Gecko browsers (e.g. Firefox, SeaMonkey, etc) don't handle pdfs as 707 // expected. 708 if (Drupal.settings.lightbox2.useragent.search('Mozilla') !== -1) { 709 if (Lightbox.imageArray[Lightbox.activeImage][0].indexOf(".pdf") != -1) { 710 setTimeout(function () { 711 document.getElementById("lightboxFrame").src = Lightbox.imageArray[Lightbox.activeImage][0]; 712 }, 1000); 713 } 714 } 715 }, 716 717 // updateDetails() 718 // Display caption, image number, and bottom nav. 719 updateDetails: function() { 720 721 $("#imageDataContainer").hide(); 722 723 var s = Drupal.settings.lightbox2; 724 725 if (s.show_caption) { 726 var caption = Lightbox.filterXSS(Lightbox.imageArray[Lightbox.activeImage][1]); 727 if (!caption) caption = ''; 728 $('#caption').html(caption).css({'zIndex': '10500'}).show(); 729 } 730 731 // If image is part of set display 'Image x of x'. 732 var numberDisplay = null; 733 if (s.image_count && Lightbox.total > 1) { 734 var currentImage = Lightbox.activeImage + 1; 735 if (!Lightbox.isLightframe && !Lightbox.isModal && !Lightbox.isVideo) { 736 numberDisplay = s.image_count.replace(/\!current/, currentImage).replace(/\!total/, Lightbox.total); 737 } 738 else if (Lightbox.isVideo) { 739 numberDisplay = s.video_count.replace(/\!current/, currentImage).replace(/\!total/, Lightbox.total); 740 } 741 else { 742 numberDisplay = s.page_count.replace(/\!current/, currentImage).replace(/\!total/, Lightbox.total); 743 }
744 $('#numberDisplay').html(numberDisplay).css({'zIndex': '10500'}).show(); 745 } 746 else { 747 $('#numberDisplay').hide(); 748 } 749 750 $("#imageDataContainer").hide().slideDown(Lightbox.slideDownSpeed, function() { 751 $("#bottomNav").show(); 752 }); 753 if (Lightbox.rtl == 1) { 754 $("#bottomNav").css({'float': 'left'}); 755 } 756 Lightbox.updateNav(); 757 }, 758 759 // updateNav() 760 // Display appropriate previous and next hover navigation. 761 updateNav: function() { 762 763 $('#hoverNav').css({'zIndex': '10500'}).show(); 764 var prevLink = '#prevLink'; 765 var nextLink = '#nextLink'; 766 767 // Slideshow is separated as we need to show play / pause button. 768 if (Lightbox.isSlideshow) { 769 if ((Lightbox.total > 1 && Lightbox.loopSlides) || Lightbox.activeImage !== 0) { 770 $(prevLink).css({'zIndex': '10500'}).show().click(function() { 771 if (Lightbox.pauseOnPrevClick) { 772 Lightbox.togglePlayPause("lightshowPause", "lightshowPlay"); 773 } 774 Lightbox.changeData(Lightbox.activeImage - 1); return false; 775 }); 776 } 777 else { 778 $(prevLink).hide(); 779 } 780 781 // If not last image in set, display next image button. 782 if ((Lightbox.total > 1 && Lightbox.loopSlides) || Lightbox.activeImage != (Lightbox.total - 1)) { 783 $(nextLink).css({'zIndex': '10500'}).show().click(function() { 784 if (Lightbox.pauseOnNextClick) { 785 Lightbox.togglePlayPause("lightshowPause", "lightshowPlay"); 786 } 787 Lightbox.changeData(Lightbox.activeImage + 1); return false; 788 }); 789 } 790 // Safari browsers need to have hide() called again. 791 else { 792 $(nextLink).hide(); 793 } 794 } 795 796 // All other types of content. 797 else { 798 799 if ((Lightbox.isLightframe || Lightbox.isModal || Lightbox.isVideo) && !Lightbox.alternative_layout) { 800 $('#frameHoverNav').css({'zIndex': '10500'}).show(); 801 $('#hoverNav').css({'zIndex': '10500'}).hide(); 802 prevLink = '#framePrevLink'; 803 nextLink = '#frameNextLink'; 804 } 805 806 // If not first image in set, display prev image button. 807 if ((Lightbox.total > 1 && Lightbox.loopItems) || Lightbox.activeImage !== 0) { 808 // Unbind any other click handlers, otherwise this adds a new click handler 809 // each time the arrow is clicked. 810 $(prevLink).css({'zIndex': '10500'}).show().unbind().click(function() { 811 Lightbox.changeData(Lightbox.activeImage - 1); return false; 812 }); 813 } 814 // Safari browsers need to have hide() called again. 815 else { 816 $(prevLink).hide(); 817 } 818 819 // If not last image in set, display next image button. 820 if ((Lightbox.total > 1 && Lightbox.loopItems) || Lightbox.activeImage != (Lightbox.total - 1)) { 821 // Unbind any other click handlers, otherwise this adds a new click handler 822 // each time the arrow is clicked. 823 $(nextLink).css({'zIndex': '10500'}).show().unbind().click(function() { 824 Lightbox.changeData(Lightbox.activeImage + 1); return false; 825 }); 826 } 827 // Safari browsers need to have hide() called again. 828 else { 829 $(nextLink).hide(); 830 } 831 } 832 833 // Don't enable keyboard shortcuts so forms will work. 834 if (!Lightbox.isModal) { 835 this.enableKeyboardNav(); 836 } 837 }, 838 839 840 // enableKeyboardNav() 841 enableKeyboardNav: function() { 842 $(document).bind("keydown", this.keyboardAction); 843 }, 844 845 // disableKeyboardNav() 846 disableKeyboardNav: function() { 847 $(document).unbind("keydown", this.keyboardAction); 848 }, 849 850 // keyboardAction() 851 keyboardAction: function(e) { 852 if (e === null) { // IE. 853 keycode = event.keyCode; 854 escapeKey = 27; 855 } 856 else { // Mozilla. 857 keycode = e.keyCode; 858 escapeKey = e.DOM_VK_ESCAPE; 859 } 860 861 key = String.fromCharCode(keycode).toLowerCase(); 862 863 // Close lightbox. 864 if (Lightbox.checkKey(Lightbox.keysClose, key, keycode)) { 865 Lightbox.end('forceClose'); 866 } 867 // Display previous image (p, <-). 868 else if (Lightbox.checkKey(Lightbox.keysPrevious, key, keycode)) { 869 if ((Lightbox.total > 1 && ((Lightbox.isSlideshow && Lightbox.loopSlides) || (!Lightbox.isSlideshow && Lightbox.loopItems))) || Lightbox.activeImage !== 0) { 870 Lightbox.changeData(Lightbox.activeImage - 1); 871 } 872 873 } 874 // Display next image (n, ->). 875 else if (Lightbox.checkKey(Lightbox.keysNext, key, keycode)) { 876 if ((Lightbox.total > 1 && ((Lightbox.isSlideshow && Lightbox.loopSlides) || (!Lightbox.isSlideshow && Lightbox.loopItems))) || Lightbox.activeImage != (Lightbox.total - 1)) { 877 Lightbox.changeData(Lightbox.activeImage + 1); 878 } 879 } 880 // Zoom in. 881 else if (Lightbox.checkKey(Lightbox.keysZoom, key, keycode) && !Lightbox.disableResize && !Lightbox.disableZoom && !Lightbox.isSlideshow && !Lightbox.isLightframe) { 882 if (Lightbox.isZoomedIn) { 883 Lightbox.changeData(Lightbox.activeImage, false); 884 } 885 else if (!Lightbox.isZoomedIn) { 886 Lightbox.changeData(Lightbox.activeImage, true); 887 } 888 return false;
889 } 890 // Toggle play / pause (space). 891 else if (Lightbox.checkKey(Lightbox.keysPlayPause, key, keycode) && Lightbox.isSlideshow) { 892 893 if (Lightbox.isPaused) { 894 Lightbox.togglePlayPause("lightshowPlay", "lightshowPause"); 895 } 896 else { 897 Lightbox.togglePlayPause("lightshowPause", "lightshowPlay"); 898 } 899 return false; 900 } 901 }, 902 903 preloadNeighborImages: function() { 904 905 if ((Lightbox.total - 1) > Lightbox.activeImage) { 906 preloadNextImage = new Image(); 907 preloadNextImage.src = Lightbox.imageArray[Lightbox.activeImage + 1][0]; 908 } 909 if (Lightbox.activeImage > 0) { 910 preloadPrevImage = new Image(); 911 preloadPrevImage.src = Lightbox.imageArray[Lightbox.activeImage - 1][0]; 912 } 913 914 }, 915 916 end: function(caller) { 917 var closeClick = (caller == 'slideshow' ? false : true); 918 if (Lightbox.isSlideshow && Lightbox.isPaused && !closeClick) { 919 return; 920 } 921 // To prevent double clicks on navigation links. 922 if (Lightbox.inprogress === true && caller != 'forceClose') { 923 return; 924 } 925 Lightbox.disableKeyboardNav(); 926 $('#lightbox').hide(); 927 $("#lightbox2-overlay").fadeOut(); 928 Lightbox.isPaused = true; 929 Lightbox.inprogress = false; 930 Lightbox.imageArray = []; 931 Lightbox.imageNum = 0; 932 // Replaces calls to showSelectBoxes() and showFlash() in original 933 // lightbox2. 934 Lightbox.toggleSelectsFlash('visible'); 935 if (Lightbox.isSlideshow) { 936 for (var i = 0; i < Lightbox.slideIdCount; i++) { 937 window.clearTimeout(Lightbox.slideIdArray[i]); 938 } 939 $('#lightshowPause, #lightshowPlay').hide(); 940 } 941 else if (Lightbox.isLightframe) { 942 $('#frameContainer').empty().hide(); 943 } 944 else if (Lightbox.isVideo || Lightbox.isModal) { 945 if (!Lightbox.auto_modal) { 946 $('#modalContainer').hide().html(""); 947 } 948 Lightbox.auto_modal = false; 949 } 950 }, 951 952 953 // getPageScroll() 954 // Returns array with x,y page scroll values. 955 // Core code from - quirksmode.com. 956 getPageScroll : function() { 957 958 var xScroll, yScroll; 959 960 if (self.pageYOffset || self.pageXOffset) { 961 yScroll = self.pageYOffset; 962 xScroll = self.pageXOffset; 963 } 964 else if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)) { // Explorer 6 Strict. 965 yScroll = document.documentElement.scrollTop; 966 xScroll = document.documentElement.scrollLeft; 967 } 968 else if (document.body) {// All other Explorers. 969 yScroll = document.body.scrollTop; 970 xScroll = document.body.scrollLeft; 971 } 972 973 arrayPageScroll = [xScroll,yScroll]; 974 return arrayPageScroll; 975 }, 976 977 // getPageSize() 978 // Returns array with page width, height and window width, height. 979 // Core code from - quirksmode.com. 980 // Edit for Firefox by pHaez. 981 982 getPageSize : function() { 983 984 var xScroll, yScroll; 985 986 if (window.innerHeight && window.scrollMaxY) { 987 xScroll = window.innerWidth + window.scrollMaxX; 988 yScroll = window.innerHeight + window.scrollMaxY; 989 } 990 else if (document.body.scrollHeight > document.body.offsetHeight) { // All but Explorer Mac. 991 xScroll = document.body.scrollWidth; 992 yScroll = document.body.scrollHeight; 993 } 994 else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari. 995 xScroll = document.body.offsetWidth; 996 yScroll = document.body.offsetHeight; 997 } 998 999 var windowWidth, windowHeight; 1000 1001 if (self.innerHeight) { // All except Explorer. 1002 if (document.documentElement.clientWidth) { 1003 windowWidth = document.documentElement.clientWidth; 1004 } 1005 else { 1006 windowWidth = self.innerWidth; 1007 } 1008 windowHeight = self.innerHeight; 1009 } 1010 else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode. 1011 windowWidth = document.documentElement.clientWidth; 1012 windowHeight = document.documentElement.clientHeight; 1013 } 1014 else if (document.body) { // Other Explorers. 1015 windowWidth = document.body.clientWidth; 1016 windowHeight = document.body.clientHeight; 1017 } 1018 // For small pages with total height less than height of the viewport. 1019 if (yScroll < windowHeight) { 1020 pageHeight = windowHeight; 1021 } 1022 else { 1023 pageHeight = yScroll; 1024 } 1025 // For small pages with total width less than width of the viewport. 1026 if (xScroll < windowWidth) { 1027 pageWidth = xScroll; 1028 } 1029 else { 1030 pageWidth = windowWidth; 1031 } 1032 arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight); 1033 return arrayPageSize; 1034 }, 1035 1036 1037 // pause(numberMillis) 1038 pause : function(ms) { 1039 var date = new Date(); 1040 var curDate = null; 1041 do { curDate = new Date(); } 1042 while (curDate - date < ms); 1043 }, 1044 1045 1046 // toggleSelectsFlash() 1047 // Hide / unhide select lists and flash objects as they appear above the 1048 // lightbox in some browsers. 1049 toggleSelectsFlash: function (state) { 1050 if (state == 'visible') { 1051 $("select.lightbox_hidden, embed.lightbox_hidden, object.lightbox_hidden").show(); 1052 } 1053 else if (state == 'hide') { 1054 $("select:visible, embed:visible, object:visible").not('#lightboxAutoModal select, #lightboxAutoModal embed, #lightboxAutoModal object').addClass("lightbox_hidden"); 1055 $("select.lightbox_hidden, embed.lightbox_hidden, object.lightbox_hidden").hide(); 1056 } 1057 }, 1058 1059 1060 // parseRel() 1061 parseRel: function (link) { 1062 var parts = []; 1063 parts["rel"] = parts["title"] = parts["group"] = parts["style"] = parts["flashvars"] = null; 1064 if (!$(link).attr('rel')) return parts; 1065 parts["rel"] = $(link).attr('rel').match(/\w+/)[0]; 1066 1067 if ($(link).attr('rel').match(/\[(.*)\]/)) { 1068 var info = $(link).attr('rel').match(/\[(.*?)\]/)[1].split('|'); 1069 parts["group"] = info[0]; 1070 parts["style"] = info[1]; 1071 if (parts["style"] != undefined && parts["style"].match(/flashvars:\s?(.*?);/)) { 1072 parts["flashvars"] = parts["style"].match(/flashvars:\s?(.*?);/)[1]; 1073 } 1074 } 1075 if ($(link).attr('rel').match(/\[.*\]\[([\s\S]*)\]/)) { 1076 var title = $(link).attr('rel').match(/\[.*\]\[([\s\S]*)\]/)[1]; 1077 parts["title"] = title.replace(/\n/g, '<br />'); 1078 } 1079 return parts; 1080 }, 1081 1082 // setStyles() 1083 setStyles: function(item, styles) { 1084 item.width = Lightbox.iframe_width; 1085 item.height = Lightbox.iframe_height; 1086 item.scrolling = "auto"; 1087 1088 if (!styles) return item; 1089 var stylesArray = styles.split(';'); 1090 for (var i = 0; i< stylesArray.length; i++) { 1091 if (stylesArray[i].indexOf('width:') >= 0) { 1092 var w = stylesArray[i].replace('width:', ''); 1093 item.width = jQuery.trim(w); 1094 } 1095 else if (stylesArray[i].indexOf('height:') >= 0) { 1096 var h = stylesArray[i].replace('height:', ''); 1097 item.height = jQuery.trim(h); 1098 } 1099 else if (stylesArray[i].indexOf('scrolling:') >= 0) { 1100 var scrolling = stylesArray[i].replace('scrolling:', ''); 1101 item.scrolling = jQuery.trim(scrolling); 1102 } 1103 else if (stylesArray[i].indexOf('overflow:') >= 0) { 1104 var overflow = stylesArray[i].replace('overflow:', ''); 1105 item.overflow = jQuery.trim(overflow); 1106 } 1107 } 1108 return item; 1109 }, 1110 1111 1112 // togglePlayPause() 1113 // Hide the pause / play button as appropriate. If pausing the slideshow also 1114 // clear the timers, otherwise move onto the next image. 1115 togglePlayPause: function(hideId, showId) { 1116 if (Lightbox.isSlideshow && hideId == "lightshowPause") { 1117 for (var i = 0; i < Lightbox.slideIdCount; i++) { 1118 window.clearTimeout(Lightbox.slideIdArray[i]); 1119 } 1120 } 1121 $('#' + hideId).hide(); 1122 $('#' + showId).show(); 1123 1124 if (hideId == "lightshowPlay") { 1125 Lightbox.isPaused = false;
1126 if (!Lightbox.loopSlides && Lightbox.activeImage == (Lightbox.total - 1)) { 1127 Lightbox.end(); 1128 } 1129 else if (Lightbox.total > 1) { 1130 Lightbox.changeData(Lightbox.activeImage + 1); 1131 } 1132 } 1133 else { 1134 Lightbox.isPaused = true; 1135 } 1136 }, 1137 1138 triggerLightbox: function (rel_type, rel_group) { 1139 if (rel_type.length) { 1140 if (rel_group && rel_group.length) { 1141 $("a[rel^='" + rel_type +"\[" + rel_group + "\]'], area[rel^='" + rel_type +"\[" + rel_group + "\]']").eq(0).trigger("click"); 1142 } 1143 else { 1144 $("a[rel^='" + rel_type +"'], area[rel^='" + rel_type +"']").eq(0).trigger("click"); 1145 } 1146 } 1147 }, 1148 1149 detectMacFF2: function() { 1150 var ua = navigator.userAgent.toLowerCase(); 1151 if (/firefox[\/\s](\d+\.\d+)/.test(ua)) { 1152 var ffversion = new Number(RegExp.$1); 1153 if (ffversion < 3 && ua.indexOf('mac') != -1) { 1154 return true; 1155 } 1156 } 1157 return false; 1158 }, 1159 1160 checkKey: function(keys, key, code) { 1161 return (jQuery.inArray(key, keys) != -1 || jQuery.inArray(String(code), keys) != -1); 1162 }, 1163 1164 filterXSS: function(str, allowed_tags) { 1165 var output = ""; 1166 var prefix = Drupal.settings.pathPrefix; 1167 if (!prefix) prefix = ''; 1168 $.ajax({ 1169 url: Drupal.settings.basePath + prefix + '?q=system/lightbox2/filter-xss', 1170 data: { 1171 'string' : str, 1172 'allowed_tags' : allowed_tags 1173 }, 1174 type: "POST", 1175 async: false, 1176 dataType: "json", 1177 success: function(data) { 1178 output = data; 1179 } 1180 }); 1181 return output; 1182 } 1183 1184}; 1185 1186// Initialize the lightbox. 1187Drupal.behaviors.initLightbox = { 1188 attach: function(context) { 1189 1190 $('body:not(.lightbox-processed)', context).addClass('lightbox-processed').each(function() { 1191 Lightbox.initialize(); 1192 return false; // Break the each loop. 1193 }); 1194 1195 // Attach lightbox to any links with lightbox rels. 1196 Lightbox.initList(context); 1197 $('#lightboxAutoModal', context).triggerHandler('click'); 1198 } 1199}; 1200})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.