PageSourceSearch

https://sanko-jk.site/wp-content/themes/insp_para/framework/js/pe/jquery.pixelentity.flare.lightbox.js

js sanko-jk.site collected 2026-10-10 02:29:52 UTC 26,117 bytes, 1,092 lines download raw bytes

1(function ($) {
2	/*jslint undef: false, browser: true, devel: false, eqeqeq: false, bitwise: false, white: false, plusplus: false, regexp: false, nomen: false */ 
3	/*global jQuery,setTimeout,location,setInterval,YT,clearInterval,clearTimeout,pixelentity,Spinner */
4	
5	$.pixelentity = $.pixelentity || {version: '1.0.0'};
6	
7	$.pixelentity.peFlareLightbox = {	
8		conf: {
9			api: false,
10			captions: true,
11			delay: 0,
12			preloadFont: true,
13			videoWidth: 0,
14			titleAttr: "title",
15			descriptionAttr: "data-description",
16			descriptionElement: "p.peFlareDescription"
17		} 
18	};
19
20	$.pixelentity.video.fallbackPlayer = "js/pe.flare/video/jarisplayer.swf";
21	
22	var ua = navigator.userAgent.toLowerCase();
23	var vimeoCover =  /http:\/\/(vimeo\.com|www\.vimeo\.com)\//i;
24	
25	var offset = {
26			none: {
27				from: 0,
28				to: 0
29			},
30			prev: {
31				from: -100,
32				to: 0
33			},
34			next: {
35				from: 100,
36				to: 0
37			}
38		};
39	
40	function Lightbox() {
41		
42		var conf;
43		var inited = false;
44		var built = false;
45		var jwin;
46		var w,h;
47		var overlay;
48		var active = false;
49		var overlayActive = false;
50		var rendered = false;
51		var useTransitions = $.support.csstransitions;
52		var useTransitionEnd = $.support.csstransitionsEnd;
53		var spinner,content;
54		var modules = [];
55		var rendererList = [];
56		var renderers = {};
57		var targets = [];
58		var items = [];
59		var galleries = {};
60		var loadQueue = [];
61		var displayList = [];
62		var loaded = 0;
63		var hiddenBuffer;
64		var currentGallery = false;
65		var currentGalleryPos = 0;
66		var currentID = -1;
67		var needDisplayListClear = false;
68		var rendererID = 1;
69		var direction = "none";
70		var touchX,touchAmountX,touchScrollX;
71		var spinnerTimeout = 0;
72		var locked = 0;
73		var thumbs;
74		var thumbsInnerContainer;
75		var thumbsActive = false;
76		var thumbsAutoHide;
77		var thumbsStart = 0;
78		var thumbsScrollAmount = 0;
79		var videoResource = false;
80		var videoIcon, videoOverlay, captionsOverlay;
81		var player;
82		var showVideoTimer = 0;
83		var isAbsolute = false;
84		var oldCaptions = false;
85		var slideshowTimer = 0;
86	
87		function resize() {
88			w = jwin.width();
89			h = window.innerHeight ? window.innerHeight: jwin.height();
90			if (overlay) {
91				overlay.width(w).height(h);
92				if (isAbsolute) {
93					overlay.css("top",jwin.scrollTop());
94				}
95			}
96			if ($.pixelentity.browser.mobile && thumbs && thumbs.data("count") > 0) {
97				scrollThumbs(thumbsStart,true);
98			}
99			var i = displayList.length;
100			while (i--) {
101				displayList[i].resize(w,h);
102			}
103			
104			resizeCaptions();
105			resizeVideo();
106		}
107		
108		function register(module,name) {
109			modules[name] = module;
110		}
111	
112		function thumbsHandler(e) {
113			clearTimeout(thumbsAutoHide);
114			var over = items[currentID].thumbover;
115			switch (e.type) {
116			case "mouseenter":
117				if (over) {
118					showHideThumbs(true);
119				}
120				break;
121			case "mouseleave":
122				if (over) {
123					showHideThumbs(false);
124				}
125				break;
126			case "click":
127				var id = e.currentTarget.id;
128				if (!locked && id) {
129					id = parseInt(id,10);
130					if (currentID >= 0) {
131						direction = id > currentID ? "next" : "prev";
132					}
133					process(id);
134				}
135				e.stopPropagation();
136				e.stopImmediatePropagation();
137				return false;
138			}
139		}
140
141		
142		function mousemoveHandler(e) {
143			clearTimeout(thumbsAutoHide);
144			var pos = e ? e.pageX : 0;
145			var total = thumbs.data("width");
146			var delta = total-w;
147			if (delta >= 0) {
148				pos = -delta*pos/w;
149				thumbsInnerContainer.css("margin-left",pos);				
150			} else {
151				thumbsInnerContainer.css("margin-left","auto");
152			}
153		}
154		
155		function scrollThumbs(pos,absolute) {
156			var size = thumbs.data("size");
157			var page = Math.floor(w/size);
158			var after;
159			var offset = 0;
160			if (thumbs.data("width") > w) {
161				if (absolute) {
162					thumbsStart = pos;
163				} else {
164					thumbsStart = Math.max(0,thumbsStart+pos*page);
165				}				
166				if ((after = thumbs.data("count")-thumbsStart) < page) {
167					thumbsStart -= (page-after+1);
168					offset = w-page*size-size-8;
169				}
170			} else {
171				thumbsStart = 0;
172			}
173			thumbsScrollAmount = -thumbsStart*size+offset;
174			thumbsInnerContainer.transform(1,thumbsScrollAmount === 0 ? 0 : thumbsScrollAmount-2,0);
175		}
176		
177		
178		function touchHandler(e) {
179			if (!active || player) {
180				return true;
181			}
182			
183			var type = e.type;
184			var te = e.originalEvent;
185			
186			
187			switch (type) {
188			case "touchstart":
189				if(te.touches.length > 1 || te.scale && te.scale !== 1) {
190					return true;
191				}
192				touchX = te.touches[0].pageX;
193				touchAmountX = 0;
194				break;
195			case "touchmove":
196				if(te.touches.length > 1 || te.scale && te.scale !== 1) {
197					return true;
198				}
199				//stopTimer();
200				touchAmountX = (te.touches[0].pageX - touchX);
201				
202				e.preventDefault();
203				e.stopPropagation();
204				if (thumbsActive) {
205					thumbsInnerContainer.addClass("touchMove").transform(1,thumbsScrollAmount + touchAmountX,0);
206				}
207				break;
208			case "touchend":
209				
210				if (thumbsActive) {
211					thumbsInnerContainer.removeClass("touchMove");
212				}
213				
214				if (touchAmountX === 0) {
215					return false;
216				}
217				
218				var jumped = false;
219				
220				if (touchAmountX > 10 /*&& current > 0*/) {
221					jumped = true;
222					if (!thumbsActive) {
223						prev();						
224					} else {
225						scrollThumbs(-1);
226					}
227				}
228				
229				if (touchAmountX < -10 /*&& current < (max-conf.count)*/) {
230					jumped = true;
231					if (!thumbsActive) {
232						next();						
233					} else {
234						scrollThumbs(+1);
235					}
236				} 
237				
238				/*
239				if (!jumped) {
240					jumpTo(current);
241				}
242				*/
243				
244				touchAmountX = 0;
245				
246				break;
247			}
248			
249			return true;
250		}
251		
252		function disableBodyScroll(e) {
253			if (!active) {
254				return true;
255			}
256			e.preventDefault();
257			e.stopPropagation();
258			return false;
259		}
260		
261		function next() {
262			if (locked || !currentGallery) {
263				return;
264			}
265			direction = "next";
266			process(currentGallery[(currentGalleryPos + 1) % currentGallery.length]);
267		}
268		
269		function prev() {
270			if (locked || !currentGallery) {
271				return;
272			}
273			direction = "prev";
274			process(currentGallery[currentGalleryPos === 0 ? currentGallery.length-1 : currentGalleryPos-1]);
275		}
276		
277		function showHideCaptions(status) {
278			// find tallest caption
279			var maxH = captionsOverlay.find(">
279 div:last").outerHeight() || 500;
280			
281			status = currentGallery ? status : false;
282			
283			if (useTransitionEnd) {
284				captionsOverlay.css({"top" : (status ? maxH : 0)});
285			} else {
286				captionsOverlay.stop().animate({"top" : (status ? maxH : 0)},500);
287			}
288			
289		}
290
291		
292		function showHideThumbs(status) {
293			var  tp = thumbs.parent();
294			thumbsActive = status === true ? true : (status === false ? false : (thumbsActive ? false : true));
295			showHideCaptions(thumbsActive);
296			if (useTransitionEnd) {
297				tp[thumbsActive ? "addClass" : "removeClass"]("peFlareLightboxActive");
298			} else {
299				tp.stop().animate({"margin-top" : (thumbsActive ? -84 : 0)},500);
300			}
301		}
302		
303		function resizeCaption() {
304			var c = captionsOverlay.find(this);
305			c.css("top",h-c.outerHeight());
306			//c.css("top",0);
307			//c.css("top",(h-c.outerHeight())/2);
308		}
309
310		
311		function resizeCaptions() {
312			captionsOverlay.find("> div").each(resizeCaption);
313		}
314		
315		function resizeVideo() {
316			if (videoOverlay.hasClass("peFlareLightboxActive")) {
317				if (true || $.pixelentity.browser.mobile || videoResource.videoType == "youtube" || videoResource.videoType == "vimeo") {
318					var mtop = $.pixelentity.browser.iDev ? 35 : 0;
319					var vh = $.pixelentity.browser.android ? w*9/16 : h;
320					vh = Math.min(vh,h);
321					
322					var vtarget = videoOverlay.find("iframe, video");
323					var maxW = items[currentID].videoWidth;
324					
325					if (maxW) {
326						vh = Math.min(vh,Math.min(w,maxW)*9/16);						
327					}
328					
329					if (maxW && maxW < w) {
330						vtarget.width(maxW).css("margin-left",(w-maxW)/2);
331					} else {
332						vtarget.width("100%").css("margin-left",0);
333					}
334					vtarget.css("margin-top",(h-vh)/2+mtop).height(vh-mtop);
335					
336					
337					//videoOverlay.find("iframe, video").css("margin-top",(h-vh)/2+offset).height(vh-offset).width("100%");	
338					//videoOverlay.find("iframe, video").css("max-width",500);	
339
340				} else {
341					player.resize(w,h);
342				}
343			}
344		}
345		
346		
347		function showVideo() {
348			clearTimeout(showVideoTimer);
349			player.unbind("video_ready.pixelentity",showVideo);
350			spinner.hide();
351			videoOverlay.addClass("peFlareLightboxActive");
352			resizeVideo();
353			if (($.pixelentity.browser.webkit || $.pixelentity.browser.iDev) && (videoResource.videoType == "vimeo" || videoResource.videoType == "youtube")) {
354				isAbsolute = true;
355				overlay.css({
356					"position": "absolute",
357					"top": jwin.scrollTop()
358				});
359			}
360		}
361		
362		function stopVideo() {
363			clearTimeout(showVideoTimer);
364			if (player) {
365				if (player.destroy) {
366					player.destroy();
367				}
368				player = false;
369				videoOverlay.removeClass("peFlareLightboxActive").empty();
370				videoIcon.addClass("peFlareLightboxActive");
371			}
372			if (isAbsolute) {
373				isAbsolute = false;
374				overlay.css({
375					"position": "fixed",
376					"top": 0
377				});
378			}
379		}
380
381		function closeButton() {
382			if (player) {
383				stopVideo();
384				videoIcon.addClass("peFlareLightboxActive");
385				if (!currentGallery) {
386					close();
387				}
388			} else {
389				close();					
390			}		
391		}
392		
393		function createVideo() {
394			spinner.show();
395			videoIcon.removeClass("peFlareLightboxActive");
396			player = videoOverlay.peVideo({
397				api: true,
398				//useVideoTag: $.pixelentity.browser.mobile,
399				useVideoTag: true,
400				disableFade: true,
401				width: w,
402				height: h,
403				type    : videoResource.videoType,
404				videoId : videoResource.video,
405				poster: $.pixelentity.browser.mobile && videoResource.videoPoster,
406				hd: true,
407				autoPlay:true,
408				loop:false
409			});
410			player.one("video_ready.pixelentity",showVideo);
411			showVideoTimer = setTimeout(showVideo,5000);
412			//player.one("video_ended.pixelentity",stopVideo);
413		}
414
415		
416		function controlsHandler(e) {
417			if (!active || !overlayActive) {
418				return true;
419			}
420			switch(e.currentTarget.id) {
421			case "peFlareLightboxControlClose":
422				closeButton();
423				break;
424			case "peFlareLightboxControlNext":
425				next();
426				break;
427			case "peFlareLightboxControlPrev":
428				prev();
429				break;
430			case "peFlareLightboxControlThumbs":
431				showHideThumbs();
432				break;
433			case "peFlareLightboxControlVideo":
434				createVideo();
435				break;
436			}
437			e.stopPropagation();
438			e.stopImmediatePropagation();
439			return false;
440		}
441		
442		function navHandler(e,delta) {
443			if (!active || !overlayActive) {
444				return true;
445			}
446			if (e.type == "keydown") {
447				switch (e.keyCode) {
448				case 27:
449					// ESC
450					closeButton();
451					break;
452				case 39:
453					// right arrow
454					next();
455					break;
456				case 37:
457					// left arrow
458					prev();
459					break;
460				}
461			} else {
462				// mousewheel
463				if (!player) {
464					if (delta < 0) {
465						next();
466					} else {
467						prev();
468					}					
469				}
470			}
471			e.preventDefault();
472			e.stopPropagation();
473			return false;
474		}
475
476		
477		function init(c) {
478			if (inited) {
479				return true;
480			}
481			inited = true;
482			conf = c;
483			
484			if (conf.preloadFont) {
485				var p = $('<p class="peFlareLightboxFontPreload">.</p>');
486				$("body").append(p);
487				setTimeout(function () {
488					p.detach().empty();
489				},100);
490			}
491			
492			return true;
493		}
494		
495		function scroll(e) {
496			if (!active) {
497				return;
498			}
499			if (isAbsolute) {
500				overlay.css("top",jwin.scrollTop());
501			}
502		}
503
504		
505		function build() {
506			if (built) {
507				return true;
508			}
509			built = true;
510			jwin = $(window).resize(resize);
511			jwin.scroll(scroll);
512			overlay = $('<div class="peFlareLightbox"><div class="peFlareLightboxHidden"></div><div class="peFlareLightboxControls"><div><a href="#" class="sprite" id="peFlareLightboxControlClose"/><a href="#" class="sprite" id="peFlareLightboxControlNext"/><a href="#" class="sprite" id="peFlareLightboxControlPrev"/><a href="#" class="sprite" id="peFlareLightboxControlThumbs"/></div></div><div class="peFlareLightboxOverlay"></div><div class="peFlareLightboxContent"></div><div class="peFlareLightboxCaptions"></div><div class="peFlareLightboxThumbs"><span></span></div><a id="peFlareLightboxControlVideo" class="peFlareLightboxVideoIcon"><span></span></a><div class="peFlareLightboxVideo"></div><div class="peFlareLightboxSpinner"><span/></div></div>');
513			if (!useTransitions) {
514				overlay.addClass("no-transitions");
515			}
516			
517			if ($.browser.msie) {
518				overlay.addClass("msie");
519			}
520			
521			$("body").append(overlay).bind("touchmove",disableBodyScroll);
522			
523			spinner = overlay.find(".peFlareLightboxSpinner").hide();
524			content = overlay.find(".peFlareLightboxContent");
525			videoIcon = overlay.find(".peFlareLightboxVideoIcon");
526			videoOverlay = overlay.find(".peFlareLightboxVideo");
527			captionsOverlay = overlay.find(".peFlareLightboxCaptions");
528			
529			thumbs = $("<div/>");
530			if ($.pixelentity.browser.mobile) {
531				overlay.addClass("mobile");
532				overlay.find(".peFlareLightboxThumbs").append(thumbs);				
533			} else {
534				overlay.addClass("desktop");
535				overlay.find(".peFlareLightboxThumbs").bind("mouseenter mouseleave",thumbsHandler).append(thumbs);
536			}
537			hiddenBuffer = overlay.find(".peFlareLightboxHidden");
538			
539			overlay
540				.bind("touchstart touchmove touchend",touchHandler)
541				.bind("mousewheel",navHandler)
542				.delegate(".peFlareLightboxControls a","click touchstart",controlsHandler)
543				.delegate(".peFlareLightboxThumbs span","click",thumbsHandler);
544			
545			videoIcon.click(controlsHandler);
546			
547			if (!$.pixelentity.browser.mobile) {
548				thumbs.bind("mousemove",mousemoveHandler);
549			} else {
550				overlay.click(showHideThumbs);
551			}
552			
553			$(document).bind("keydown",navHandler);
554
555		}
556
557		
558		function overlayReady() {
559			overlayActive = true;
560			overlay.css("filter","none");
561			if (thumbs.data("created")) {
562				showHideThumbs(true);
563				thumbsAutoHide = setTimeout(showHideThumbs,2000);
564			}
565			if (loadQueue.length === loaded) {
566				render();
567			}
568		}
569
570		
571		function fadeIn() {
572			overlay.addClass("peFlareLightboxActive");
573			if (useTransitions) {
574				//overlay.one(useTransitionEnd,overlayReady);
575				setTimeout(overlayReady,600);
576			} else {
577				overlay.stop().css("opacity",0).fadeTo(500,1,overlayReady);				
578			}
579		}
580		
581		function open() {
582			$.pixelentity.peFlareLightbox.active = active = true;
583			locked = 0;
584			build();
585			resize();
586			jwin.scrollLeft(0);
587			overlay.show();
588			setTimeout(fadeIn,10);
589			// stop all videos
590			$(".peVideo.peActiveWidget").trigger("disable.pixelentity");
591		}
592		
593		function clean() {
594			$.pixelentity.peFlareLightbox.active = active = false;
595			currentGallery = false;
596			locked = false;
597			loadQueue = [];
598			currentID = -1;
599			stopVideo();
600			overlay.hide();
601			content.empty();
602			captionsOverlay.empty();
603			var rID,renderer;
604			// remove all renderers in display list
605			while ((renderer = displayList.shift())) {
606				renderer.destroy();
607			}
608			// remove any renderer left
609			while ((rID = rendererList.shift())) {
610				renderers[rID].destroy();
611			}
612			thumbs.data("created",false).empty();
613			overlay.removeClass("peFlareLightboxActive");
614			videoIcon.removeClass("peFlareLightboxActive");
615			direction = "none";
616		}
617
618		
619		function close(e) {
620			overlayActive = false;
621			if (useTransitions) {
622				// too risky with event name changes ... let's stick with good ol' setTimeout
623				if (false && useTransitionEnd) {
624					overlay.one(useTransitionEnd,clean);
625				} else {
626					setTimeout(clean,600);
627				}	
628				overlay.removeClass("peFlareLightboxActive");				
629			} else {
630				//overlay.removeClass("peFlareLightboxActive");
631				overlay.stop().css("opacity",1).fadeTo(500,0,clean);
632			}
633		}
634		
635		function delayedSpinnerShow() {
636			spinner.show();
637		}
638
639		
640		function showSpinner() {
641			spinnerTimeout = setTimeout(delayedSpinnerShow,500);
642		}
643		
644		function hideSpinner() {
645			clearTimeout(spinnerTimeout);
646			spinner.hide();
647		}
648		
649		function createThumbs() {
650			if (!currentGallery || thumbs.data("created") === true) {
651				return;
652			}
653			var thumb,id;
654			thumbsInnerContainer = $("<div/>");
655			thumbs.empty().append(thumbsInnerContainer);
656			var count = 0;
657			for (var i=0;i<currentGallery.length;i++) {
658				id = currentGallery[i];
659				
660				if ((thumb = items[id].thumb)) {
661					thumb = $("<span/>").attr("data-src",thumb).attr("id",id);
662					thumbsInnerContainer.append(thumb);
663					thumb.peSimpleThumb();
664					count++;
665				}
666			}
667			var tiw = count*(104)+10;
668			thumbsInnerContainer.width(tiw);
669			thumbs.data("count",count);
670			thumbs.data("size",104); 
671			if (count > 0) {
672				thumbs.data("created",true);				
673				thumbs.data("width",tiw);				
674			} else {
675				overlay.find("#peFlareLightboxControlThumbs").hide();
676			}
677		}
678		
679		
680		function vimeoPosterUrlLoaded(data) {
681			hideSpinner();
682			var id = currentID;
683			items[id].resource = (data && data[0] && data[0].thumbnail_large) || false;
684			currentID = -1;
685			process(id);
686		}
687		
688		function filter(gallery) {
689			if (typeof gallery !== "object") return gallery;
690			var i = 0, n = gallery.length,id,target;
691			var filtered = [];
692			
693			for(;i<n;i++) {
694			
695				id = gallery[i];
696				target = items[id].target;
697				
698				if (target.hasClass("flare-hidden") || target.closest(".peIsotopeItem.isotope-hidden").length > 0) {
699					// skip targets inside hidden isotope elements
700					continue;
701				}
702				
703				filtered.push(id);
704				
705			}
706			return filtered;
707		}
708		
709		function process(id) {
710			var item = items[id];
711			
712			overlay.find(".peFlareLightboxThumbs > span")[item.thumbover ? "show" : "hide"]();
713			
714			// check if damn vimeo cover (json)
715			if (item.resource.match(vimeoCover)) {
716				currentID = id;
717				showSpinner();
718				$.getJSON(item.resource,vimeoPosterUrlLoaded);
719				return false;
720			}
721			
722			if (id === currentID) {
723				rendered = true;
724				loaded = 0;
725				return false;
726			}
727			currentID = id;
728			
729			stopVideo();
730			
731			currentGallery = item.gallery ? filter(galleries[item.gallery]) : false;
732			currentGallery = currentGallery.length > 1 ? currentGallery : false; 
733			
734			overlay.find("#peFlareLightboxControlPrev,#peFlareLightboxControlNext,#peFlareLightboxControlThumbs")[currentGallery && currentGallery.length > 1 ? "show" : "hide"]();
735			
736			if (currentGallery) {
737				currentGalleryPos = $.inArray(id,currentGallery);
738				createThumbs();
739			}
740			
741			rendered = false;
742			loaded = 0;
743
744			var rID;
745			var renderer,Module;
746			
747			// we have a gallery render here
748			if (rendererList.length > 0 && (renderer = renderers[rendererList[0]]).isGallery) {
749				rID = rendererList[0];
750				needDisplayListClear = false;
751			} else {			
752				rID = rendererID++;
753				Module  = modules[item.plugin] || modules["default"];
754				renderer = new Module(rID,w,h);
755				renderers[rID] = renderer;
756				rendererList.push(rID);
757				needDisplayListClear = true;
758			}
759			
760			videoResource = item.video ? item : false;
761			if (!videoResource) {
762				videoIcon.removeClass("peFlareLightboxActive");				
763			}
764			loadQueue.push(rID);
765						
766			showSpinner();
767			renderer.load(item);
768		}
769
770		
771		function click(e) {
772			var el = e.currentTarget;
773			var linkID = parseInt(el.getAttribute("data-pe-flare-id" || 0),10);
774			var linkGallery = el.getAttribute("data-pe-flare-gallery");
775			var tID;
776			if (linkGallery && linkID >= 0) {
777				if (!galleries[linkGallery]) {
778					return false;
779				}
780				tID = galleries[linkGallery][linkID];
781			} else {
782				tID = parseInt(el.getAttribute("data-pe-target-id"),10);
783			}
784			if (tID >= 0) {
785				open();
786				process(tID);
787			}
788			return false;
789		}
790		
791		function removeRenderer(id) {
792			var found = $.inArray(id,rendererList);
793			if (found !== false) {
794				rendererList.splice(found,1); 
795			}
796			renderers[id] = undefined;
797			delete renderers[id];
798		}
799
800		
801		function signal(type,id) {
802			switch (type) {
803			case "loaded":
804				loaded++;
805				if (loadQueue.length === loaded && overlayActive) {
806					render();
807				}
808				break;
809			case "destroy":
810				removeRenderer(id);
811				break;
812			case "locked":
813				locked++;
814				break;
815			case "unlocked":
816				locked--;
817				break;
818			}
819		}
820
821		
822		function show(id) {
823			var renderer = renderers[id];
824			var output = renderer.resize(w,h).render();
825						
826			if (renderer.isGallery) {
827				content.append(output);				
828			} else {
829				output.css("left",offset[direction].from);
830				content.append(output);
831				if (useTransitions) {
832					output.fadeTo(0,1).css("left",offset[direction].to);					
833				} else {
834					output.css("opacity",0).animate({"left":offset[direction].to,"opacity":1},1000);
835				}
836			}
837			
838			if ($.inArray(renderer,displayList) < 0) {
839				displayList.push(renderer);				
840			}
841			
842			if (videoResource && !currentGallery) {
843				videoIcon.removeClass("peFlareLightboxActive");
844				createVideo();
845			} else {
846				videoIcon[videoResource ? "addClass":"removeClass"]("peFlareLightboxActive");				
847			}
848			
849			if (conf.captions) {
850				addCaption(items[currentID].title,items[currentID].description);
851			}
852			
853			
854			if (currentGallery && conf.delay > 0) {
855				clearTimeout(slideshowTimer);
856				slideshowTimer = setTimeout(slideshowNext,conf.delay*1000);
857			}
858			
859		}
860		
861		function slideshowNext() {
862			clearTimeout(slideshowTimer);
863			if (locked || videoOverlay.hasClass("peFlareLightboxActive")) {
864				slideshowTimer = setTimeout(slideshowNext,500);
865			} else {
866				next();
867			}
868		}
869		
870		function addCaption(title,description) {
871			oldCaptions = captionsOverlay.find("> div");
872			
873			if (useTransitionEnd) {
874				oldCaptions.removeClass("peFlareLightboxActive");
875			} else {
876				oldCaptions.fadeTo(300,0);
877			}
878			
879			if (title || description) {
880				title = title ? "<h3>%0</h3>".format(title) : "";
881				description = description ? "<p>%0</p>".format(description) : "";				
882				captionsOverlay.append('<div><div>%0%1</div></div>'.format(title,description));
883
884			}
885			resizeCaptions();
886			setTimeout(fadeInCaption,500);
887
888		}
889		
890		function fadeInCaption() {
891			if (oldCaptions) {
892				oldCaptions.detach();
893				oldCaptions = false;
894			}
895			
896			if (useTransitionEnd) {
897				captionsOverlay.find("> div").addClass("peFlareLightboxActive");
898			} else {
899				captionsOverlay.find("> div").stop().fadeTo(0,0).fadeTo(500,1);
900			}
901		}
902
903		
904		function clearDisplayList() {
905			if (!needDisplayListClear) {
906				return;
907			}
908			needDisplayListClear = false;
909			var r,el;
910			while ((r = displayList.shift())) {
911				if (useTransitionEnd) {
912					r.render().fadeTo(0,0).css("left",-offset[direction].from).one(useTransitionEnd,r.destroy);					
913				} else {
914					r.render().css("opacity",1).animate({"left":-offset[direction].from,"opacity":0},1000,null,r.destroy);
915				}
916				//r.destroy();
917			}
918			
919		}
920
921		
922		function render() {
923			hideSpinner();
924						
925			if (rendered) {
926				return;
927			}
928			rendered = true;
929			
930			var id;
931			
932			clearDisplayList();
933			while ((id = loadQueue.shift()) !== undefined) {
934				show(id);
935			}
936		}
937		
938		function addItem(item) {
939			var gallery = item.gallery || false;
940			var id = item.id !== undefined ? item.id : items.length;
941			if (gallery) {
942				if (galleries[gallery]) {
943					galleries[gallery].push(id);
944				} else {
945					galleries[gallery]= [id];
946				}
947			}
948			items.push(item);
949			
950		}
951
952		
953		function add(target) {
954			var id,link = target.attr("href");
955			if (link.charAt(0) == "#") {
956				link = link.substring(1);
957				var gallery = link.substring(0,link.lastIndexOf("-"));
958				if (gallery) {
959					id  = link.substring(link.lastIndexOf("-")+1);	
960				} else {
961					gallery = link;
962					id = 0;
963				}
964				if (gallery) {
965					target
966						.attr("data-pe-flare-id",id)
967						.attr("data-pe-flare-gallery",gallery)
968						.bind("click",click);
969				}
970				return;
971			}
972			id = targets.length;
973			var resource = target.attr("href");
974			var plugin = target.attr("data-flare-plugin") || "default";
975			
976			target.attr("data-pe-target-id",targets.length).bind("click",click);
977			
978			
979			var videoInfo;
980			videoInfo = $.pixelentity.videoplayer.getInfo(resource,target.attr("data-flare-videoformats"),target.attr("data-flare-videoposter"));
981			
982			if (videoInfo.video) {
983				resource = videoInfo.videoPoster;
984			} else {
985				videoInfo = $.pixelentity.videoplayer.getInfo(target.attr("data-flare-video"),target.attr("data-flare-videoformats"));				
986			}			
987			
988			var title = target.attr(conf.titleAttr) || "";
989			var description = target.attr(conf.descriptionAttr);
990			
991			
992			if (!description) {
993				var el = target.find(conf.descriptionElement);
994				if (el.length > 0) {
995					description = el.html();
996					el.empty().detach();
997				} else {
998					description = "";
999				}
1000			}
1001						
1002			var item = {
1003					id: id,
1004					plugin: plugin,
1005					resource: resource || "",
1006					gallery: target.attr("data-flare-gallery") || false,
1007					bw: target.attr("data-flare-bw"),
1008					thumb: target.attr("data-flare-thumb"),
1009					thumbover: target.attr("data-flare-thumb-over") != "disabled",
1010					scale: target.attr("data-flare-scale") || "fit",
1011					title: title,
1012					description: description,
1013					target: target
1014				};
1015			
1016			if((title+description).match(/<a/)) {
1017				item.thumbover = false;
1018			}
1019
1020			
1021			if (videoInfo.video) {
1022				$.extend(item,videoInfo);
1023				item.videoWidth = parseInt(target.attr("data-flare-videowidth"),10) || conf.videoWidth;
1024			}
1025			
1026			targets.push(target);
1027			addItem(item);
1028		}
1029		
1030		function addToBuffer(el) {
1031			hiddenBuffer.append(el);
1032		}
1033		
1034		$.extend(this, {
1035			init:init,
1036			add:add,
1037			show:show,
1038			signal:signal,
1039			register:register,
1040			addToBuffer:addToBuffer
1041			// plublic API
1042			}
1043		);
1044		
1045		
1046	}
1047	
1048	var lb = $.pixelentity.lightbox = new Lightbox();
1049	
1050	
1051	function PeFlareLightbox(target, conf) {
1052		
1053		// init function
1054		function start() {
1055			lb.init(conf);
1056			lb.add(target);
1057		}
1058		
1059		$.extend(this, {
1060			// plublic API
1061			destroy: function() {
1062				target.data("peFlareLightbox", null);
1063				target = undefined;
1064			}
1065		});
1066		
1067		// initialize
1068		start();
1069	}
1070		
1071	// jQuery plugin implementation
1072	$.fn.peFlareLightbox = function(conf) {
1073		// return existing instance	
1074		var api = this.data("peFlareLightbox");
1075		
1076		if (api) { 
1077			return api; 
1078		}
1079		
1080		conf = $.extend(true, {}, $.pixelentity.peFlareLightbox.conf, conf);
1081		
1082		// install the plugin for each entry in jQuery object
1083		this.each(function() {
1084			var el = $(this);
1085			api = new PeFlareLightbox(el, conf);
1086			el.data("peFlareLightbox", api); 
1087		});
1088		
1089		return conf.api ? api: this;		 
1090	};
1091	
1092}(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.