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.