PageSourceSearch

https://www.kfbz.cz/sites/all/modules/contrib/lightbox2/js/lightbox.js?1790274884

js kfbz.cz collected 2026-09-24 21:11:52 UTC 45,178 bytes, 1,195 lines download raw bytes

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 && $.browser.msie) {
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 ($.browser.mozilla && 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 ($.browser.msie) {
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 ($.browser.safari || 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 ($.browser.safari || 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 ($.browser.mozilla) {
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    // Replaces calls to showSelectBoxes() and showFlash() in original
931    // lightbox2.
932    Lightbox.toggleSelectsFlash('visible');
933    if (Lightbox.isSlideshow) {
934      for (var i = 0; i < Lightbox.slideIdCount; i++) {
935        window.clearTimeout(Lightbox.slideIdArray[i]);
936      }
937      $('#lightshowPause, #lightshowPlay').hide();
938    }
939    else if (Lightbox.isLightframe) {
940      $('#frameContainer').empty().hide();
941    }
942    else if (Lightbox.isVideo || Lightbox.isModal) {
943      if (!Lightbox.auto_modal) {
944        $('#modalContainer').hide().html("");
945      }
946      Lightbox.auto_modal = false;
947    }
948  },
949
950
951  // getPageScroll()
952  // Returns array with x,y page scroll values.
953  // Core code from - quirksmode.com.
954  getPageScroll : function() {
955
956    var xScroll, yScroll;
957
958    if (self.pageYOffset || self.pageXOffset) {
959      yScroll = self.pageYOffset;
960      xScroll = self.pageXOffset;
961    }
962    else if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)) {  // Explorer 6 Strict.
963      yScroll = document.documentElement.scrollTop;
964      xScroll = document.documentElement.scrollLeft;
965    }
966    else if (document.body) {// All other Explorers.
967      yScroll = document.body.scrollTop;
968      xScroll = document.body.scrollLeft;
969    }
970
971    arrayPageScroll = [xScroll,yScroll];
972    return arrayPageScroll;
973  },
974
975  // getPageSize()
976  // Returns array with page width, height and window width, height.
977  // Core code from - quirksmode.com.
978  // Edit for Firefox by pHaez.
979
980  getPageSize : function() {
981
982    var xScroll, yScroll;
983
984    if (window.innerHeight && window.scrollMaxY) {
985      xScroll = window.innerWidth + window.scrollMaxX;
986      yScroll = window.innerHeight + window.scrollMaxY;
987    }
988    else if (document.body.scrollHeight > document.body.offsetHeight) { // All but Explorer Mac.
989      xScroll = document.body.scrollWidth;
990      yScroll = document.body.scrollHeight;
991    }
992    else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari.
993      xScroll = document.body.offsetWidth;
994      yScroll = document.body.offsetHeight;
995    }
996
997    var windowWidth, windowHeight;
998
999    if (self.innerHeight) { // All except Explorer.
1000      if (document.documentElement.clientWidth) {
1001        windowWidth = document.documentElement.clientWidth;
1002      }
1003      else {
1004        windowWidth = self.innerWidth;
1005      }
1006      windowHeight = self.innerHeight;
1007    }
1008    else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode.
1009      windowWidth = document.documentElement.clientWidth;
1010      windowHeight = document.documentElement.clientHeight;
1011    }
1012    else if (document.body) { // Other Explorers.
1013      windowWidth = document.body.clientWidth;
1014      windowHeight = document.body.clientHeight;
1015    }
1016    // For small pages with total height less than height of the viewport.
1017    if (yScroll < windowHeight) {
1018      pageHeight = windowHeight;
1019    }
1020    else {
1021      pageHeight = yScroll;
1022    }
1023    // For small pages with total width less than width of the viewport.
1024    if (xScroll < windowWidth) {
1025      pageWidth = xScroll;
1026    }
1027    else {
1028      pageWidth = windowWidth;
1029    }
1030    arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
1031    return arrayPageSize;
1032  },
1033
1034
1035  // pause(numberMillis)
1036  pause : function(ms) {
1037    var date = new Date();
1038    var curDate = null;
1039    do { curDate = new Date(); }
1040    while (curDate - date < ms);
1041  },
1042
1043
1044  // toggleSelectsFlash()
1045  // Hide / unhide select lists and flash objects as they appear above the
1046  // lightbox in some browsers.
1047  toggleSelectsFlash: function (state) {
1048    if (state == 'visible') {
1049      $("select.lightbox_hidden, embed.lightbox_hidden, object.lightbox_hidden").show();
1050    }
1051    else if (state == 'hide') {
1052      $("select:visible, embed:visible, object:visible").not('#lightboxAutoModal select, #lightboxAutoModal embed, #lightboxAutoModal object').addClass("lightbox_hidden");
1053      $("select.lightbox_hidden, embed.lightbox_hidden, object.lightbox_hidden").hide();
1054    }
1055  },
1056
1057
1058  // parseRel()
1059  parseRel: function (link) {
1060    var parts = [];
1061    parts["rel"] = parts["title"] = parts["group"] = parts["style"] = parts["flashvars"] = null;
1062    if (!$(link).attr('rel')) return parts;
1063    parts["rel"] = $(link).attr('rel').match(/\w+/)[0];
1064
1065    if ($(link).attr('rel').match(/\[(.*)\]/)) {
1066      var info = $(link).attr('rel').match(/\[(.*?)\]/)[1].split('|');
1067      parts["group"] = info[0];
1068      parts["style"] = info[1];
1069      if (parts["style"] != undefined && parts["style"].match(/flashvars:\s?(.*?);/)) {
1070        parts["flashvars"] = parts["style"].match(/flashvars:\s?(.*?);/)[1];
1071      }
1072    }
1073    if ($(link).attr('rel').match(/\[.*\]\[(.*)\]/)) {
1074      parts["title"] = $(link).attr('rel').match(/\[.*\]\[(.*)\]/)[1];
1075    }
1076    return parts;
1077  },
1078
1079  // setStyles()
1080  setStyles: function(item, styles) {
1081    item.width = Lightbox.iframe_width;
1082    item.height = Lightbox.iframe_height;
1083    item.scrolling = "auto";
1084
1085    if (!styles) return item;
1086    var stylesArray = styles.split(';');
1087    for (var i = 0; i< stylesArray.length; i++) {
1088      if (stylesArray[i].indexOf('width:') >= 0) {
1089        var w = stylesArray[i].replace('width:', '');
1090        item.width = jQuery.trim(w);
1091      }
1092      else if (stylesArray[i].indexOf('height:') >= 0) {
1093        var h = stylesArray[i].replace('height:', '');
1094        item.height = jQuery.trim(h);
1095      }
1096      else if (stylesArray[i].indexOf('scrolling:') >= 0) {
1097        var scrolling = stylesArray[i].replace('scrolling:', '');
1098        item.scrolling = jQuery.trim(scrolling);
1099      }
1100      else if (stylesArray[i].indexOf('overflow:') >= 0) {
1101        var overflow = stylesArray[i].replace('overflow:', '');
1102        item.overflow = jQuery.trim(overflow);
1103      }
1104    }
1105    return item;
1106  },
1107
1108
1109  // togglePlayPause()
1110  // Hide the pause / play button as appropriate.  If pausing the slideshow also
1111  // clear the timers, otherwise move onto the next image.
1112  togglePlayPause: function(hideId, showId) {
1113    if (Lightbox.isSlideshow && hideId == "lightshowPause") {
1114      for (var i = 0; i < Lightbox.slideIdCount; i++) {
1115        window.clearTimeout(Lightbox.slideIdArray[i]);
1116      }
1117    }
1118    $('#' + hideId).hide();
1119    $('#' + showId).show();
1120
1121    if (hideId == "lightshowPlay") {
1122      Lightbox.isPaused = false;
1123      if (!Lightbox.loopSlides && Lightbox.activeImage == (Lightbox.total - 1)) {
1124        Lightbox.end();
1125      }
1126      else if (Lightbox.total > 1) {
1127        Lightbox.changeData(Lightbox.activeImage + 1);
1128      }
1129    }
1130    else {
1131      Lightbox.isPaused = true;
1132    }
1133  },
1134
1135  triggerLightbox: function (rel_type, rel_group) {
1136    if (rel_type.length) {
1137      if (rel_group && rel_group.length) {
1138        $("a[rel^='" + rel_type +"\[" + rel_group + "\]'], area[rel^='" + rel_type +"\[" + rel_group + "\]']").eq(0).trigger("click");
1139      }
1140      else {
1141        $("a[rel^='" + rel_type +"'], area[rel^='" + rel_type +"']").eq(0).trigger("click");
1142      }
1143    }
1144  },
1145
1146  detectMacFF2: function() {
1147    var ua = navigator.userAgent.toLowerCase();
1148    if (/firefox[\/\s](\d+\.\d+)/.test(ua)) {
1149      var ffversion = new Number(RegExp.$1);
1150      if (ffversion < 3 && ua.indexOf('mac') != -1) {
1151        return true;
1152      }
1153    }
1154    return false;
1155  },
1156
1157  checkKey: function(keys, key, code) {
1158    return (jQuery.inArray(key, keys) != -1 || jQuery.inArray(String(code), keys) != -1);
1159  },
1160
1161  filterXSS: function(str, allowed_tags) {
1162    var output = "";
1163    $.ajax({
1164      url: Drupal.settings.basePath + 'system/lightbox2/filter-xss',
1165      data: {
1166        'string' : str,
1167        'allowed_tags' : allowed_tags
1168      },
1169      type: "POST",
1170      async: false,
1171      dataType:  "json",
1172      success: function(data) {
1173        output = data;
1174      }
1175    });
1176    return output;
1177  }
1178
1179};
1180
1181// Initialize the lightbox.
1182Drupal.behaviors.initLightbox = {
1183  attach: function(context) {
1184
1185  $('body:not(.lightbox-processed)', context).addClass('lightbox-processed').each(function() {
1186    Lightbox.initialize();
1187    return false; // Break the each loop.
1188  });
1189
1190  // Attach lightbox to any links with lightbox rels.
1191  Lightbox.initList(context);
1192  $('#lightboxAutoModal', context).triggerHandler('click');
1193  }
1194};
1195})(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.