/apps/rickgigger.com/public/fancybox/jquery.fancybox-1.3.1.js
JavaScript | 1077 lines | 785 code | 270 blank | 22 comment | 185 complexity | 8e8c18a9e7a147606a74ad2a5f4d2cff MD5 | raw file
1/* 2 * FancyBox - jQuery Plugin 3 * Simple and fancy lightbox alternative 4 * 5 * Examples and documentation at: http://fancybox.net 6 * 7 * Copyright (c) 2008 - 2010 Janis Skarnelis 8 * 9 * Version: 1.3.1 (05/03/2010) 10 * Requires: jQuery v1.3+ 11 * 12 * Dual licensed under the MIT and GPL licenses: 13 * http://www.opensource.org/licenses/mit-license.php 14 * http://www.gnu.org/licenses/gpl.html 15 */ 16 17(function($) { 18 19 var tmp, loading, overlay, wrap, outer, inner, close, nav_left, nav_right, 20 21 selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], 22 23 ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, 24 25 loadingTimer, loadingFrame = 1, 26 27 start_pos, final_pos, busy = false, shadow = 20, fx = $.extend($('<div/>')[0], { prop: 0 }), titleh = 0, 28 29 isIE6 = !$.support.opacity && !window.XMLHttpRequest, 30 31 /* 32 * Private methods 33 */ 34 35 fancybox_abort = function() { 36 loading.hide(); 37 38 imgPreloader.onerror = imgPreloader.onload = null; 39 40 if (ajaxLoader) { 41 ajaxLoader.abort(); 42 } 43 44 tmp.empty(); 45 }, 46 47 fancybox_error = function() { 48 $.fancybox('<p id="fancybox_error">The requested content cannot be loaded.<br />Please try again later.</p>', { 49 'scrolling' : 'no', 50 'padding' : 20, 51 'transitionIn' : 'none', 52 'transitionOut' : 'none' 53 }); 54 }, 55 56 fancybox_get_viewport = function() { 57 return [ $(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ]; 58 }, 59 60 fancybox_get_zoom_to = function () { 61 var view = fancybox_get_viewport(), 62 to = {}, 63 64 margin = currentOpts.margin, 65 resize = currentOpts.autoScale, 66 67 horizontal_space = (shadow + margin) * 2, 68 vertical_space = (shadow + margin) * 2, 69 double_padding = (currentOpts.padding * 2), 70 71 ratio; 72 73 if (currentOpts.width.toString().indexOf('%') > -1) { 74 to.width = ((view[0] * parseFloat(currentOpts.width)) / 100) - (shadow * 2) ; 75 resize = false; 76 77 } else { 78 to.width = currentOpts.width + double_padding; 79 } 80 81 if (currentOpts.height.toString().indexOf('%') > -1) { 82 to.height = ((view[1] * parseFloat(currentOpts.height)) / 100) - (shadow * 2); 83 resize = false; 84 85 } else { 86 to.height = currentOpts.height + double_padding; 87 } 88 89 if (resize && (to.width > (view[0] - horizontal_space) || to.height > (view[1] - vertical_space))) { 90 if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { 91 horizontal_space += double_padding; 92 vertical_space += double_padding; 93 94 ratio = Math.min(Math.min( view[0] - horizontal_space, currentOpts.width) / currentOpts.width, Math.min( view[1] - vertical_space, currentOpts.height) / currentOpts.height); 95 96 to.width = Math.round(ratio * (to.width - double_padding)) + double_padding; 97 to.height = Math.round(ratio * (to.height - double_padding)) + double_padding; 98 99 } else { 100 to.width = Math.min(to.width, (view[0] - horizontal_space)); 101 to.height = Math.min(to.height, (view[1] - vertical_space)); 102 } 103 } 104 105 to.top = view[3] + ((view[1] - (to.height + (shadow * 2 ))) * 0.5); 106 to.left = view[2] + ((view[0] - (to.width + (shadow * 2 ))) * 0.5); 107 108 if (currentOpts.autoScale === false) { 109 to.top = Math.max(view[3] + margin, to.top); 110 to.left = Math.max(view[2] + margin, to.left); 111 } 112 113 return to; 114 }, 115 116 fancybox_format_title = function(title) { 117 if (title && title.length) { 118 switch (currentOpts.titlePosition) { 119 case 'inside': 120 return title; 121 case 'over': 122 return '<span id="fancybox-title-over">' + title + '</span>'; 123 default: 124 return '<span id="fancybox-title-wrap"><span id="fancybox-title-left"></span><span id="fancybox-title-main">' + title + '</span><span id="fancybox-title-right"></span></span>'; 125 } 126 } 127 128 return false; 129 }, 130 131 fancybox_process_title = function() { 132 var title = currentOpts.title, 133 width = final_pos.width - (currentOpts.padding * 2), 134 titlec = 'fancybox-title-' + currentOpts.titlePosition; 135 136 $('#fancybox-title').remove(); 137 138 titleh = 0; 139 140 if (currentOpts.titleShow === false) { 141 return; 142 } 143 144 title = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(title, currentArray, currentIndex, currentOpts) : fancybox_format_title(title); 145 146 if (!title || title === '') { 147 return; 148 } 149 150 $('<div id="fancybox-title" class="' + titlec + '" />').css({ 151 'width' : width, 152 'paddingLeft' : currentOpts.padding, 153 'paddingRight' : currentOpts.padding 154 }).html(title).appendTo('body'); 155 156 switch (currentOpts.titlePosition) { 157 case 'inside': 158 titleh = $("#fancybox-title").outerHeight(true) - currentOpts.padding; 159 final_pos.height += titleh; 160 break; 161 162 case 'over': 163 $('#fancybox-title').css('bottom', currentOpts.padding); 164 break; 165 166 default: 167 $('#fancybox-title').css('bottom', $("#fancybox-title").outerHeight(true) * -1); 168 break; 169 } 170 171 $('#fancybox-title').appendTo( outer ).hide(); 172 }, 173 174 fancybox_set_navigation = function() { 175 $(document).unbind('keydown.fb').bind('keydown.fb', function(e) { 176 if (e.keyCode == 27 && currentOpts.enableEscapeButton) { 177 e.preventDefault(); 178 $.fancybox.close(); 179 180 } else if (e.keyCode == 37) { 181 e.preventDefault(); 182 $.fancybox.prev(); 183 184 } else if (e.keyCode == 39) { 185 e.preventDefault(); 186 $.fancybox.next(); 187 } 188 }); 189 190 if ($.fn.mousewheel) { 191 wrap.unbind('mousewheel.fb'); 192 193 if (currentArray.length > 1) { 194 wrap.bind('mousewheel.fb', function(e, delta) { 195 e.preventDefault(); 196 197 if (busy || delta === 0) { 198 return; 199 } 200 201 if (delta > 0) { 202 $.fancybox.prev(); 203 } else { 204 $.fancybox.next(); 205 } 206 }); 207 } 208 } 209 210 if (!currentOpts.showNavArrows) { return; } 211 212 if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { 213 nav_left.show(); 214 } 215 216 if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { 217 nav_right.show(); 218 } 219 }, 220 221 fancybox_preload_images = function() { 222 var href, 223 objNext; 224 225 if ((currentArray.length -1) > currentIndex) { 226 href = currentArray[ currentIndex + 1 ].href; 227 228 if (typeof href !== 'undefined' && href.match(imgRegExp)) { 229 objNext = new Image(); 230 objNext.src = href; 231 } 232 } 233 234 if (currentIndex > 0) { 235 href = currentArray[ currentIndex - 1 ].href; 236 237 if (typeof href !== 'undefined' && href.match(imgRegExp)) { 238 objNext = new Image(); 239 objNext.src = href; 240 } 241 } 242 }, 243 244 _finish = function () { 245 inner.css('overflow', (currentOpts.scrolling == 'auto' ? (currentOpts.type == 'image' || currentOpts.type == 'iframe' || currentOpts.type == 'swf' ? 'hidden' : 'auto') : (currentOpts.scrolling == 'yes' ? 'auto' : 'visible'))); 246 247 if (!$.support.opacity) { 248 inner.get(0).style.removeAttribute('filter'); 249 wrap.get(0).style.removeAttribute('filter'); 250 } 251 252 $('#fancybox-title').show(); 253 254 if (currentOpts.hideOnContentClick) { 255 inner.one('click', $.fancybox.close); 256 } 257 if (currentOpts.hideOnOverlayClick) { 258 overlay.one('click', $.fancybox.close); 259 } 260 261 if (currentOpts.showCloseButton) { 262 close.show(); 263 } 264 265 fancybox_set_navigation(); 266 267 $(window).bind("resize.fb", $.fancybox.center); 268 269 if (currentOpts.centerOnScroll) { 270 $(window).bind("scroll.fb", $.fancybox.center); 271 } else { 272 $(window).unbind("scroll.fb"); 273 } 274 275 if ($.isFunction(currentOpts.onComplete)) { 276 currentOpts.onComplete(currentArray, currentIndex, currentOpts); 277 } 278 279 busy = false; 280 281 fancybox_preload_images(); 282 }, 283 284 fancybox_draw = function(pos) { 285 var width = Math.round(start_pos.width + (final_pos.width - start_pos.width) * pos), 286 height = Math.round(start_pos.height + (final_pos.height - start_pos.height) * pos), 287 288 top = Math.round(start_pos.top + (final_pos.top - start_pos.top) * pos), 289 left = Math.round(start_pos.left + (final_pos.left - start_pos.left) * pos); 290 291 wrap.css({ 292 'width' : width + 'px', 293 'height' : height + 'px', 294 'top' : top + 'px', 295 'left' : left + 'px' 296 }); 297 298 width = Math.max(width - currentOpts.padding * 2, 0); 299 height = Math.max(height - (currentOpts.padding * 2 + (titleh * pos)), 0); 300 301 inner.css({ 302 'width' : width + 'px', 303 'height' : height + 'px' 304 }); 305 306 if (typeof final_pos.opacity !== 'undefined') { 307 wrap.css('opacity', (pos < 0.5 ? 0.5 : pos)); 308 } 309 }, 310 311 fancybox_get_obj_pos = function(obj) { 312 var pos = obj.offset(); 313 314 pos.top += parseFloat( obj.css('paddingTop') ) || 0; 315 pos.left += parseFloat( obj.css('paddingLeft') ) || 0; 316 317 pos.top += parseFloat( obj.css('border-top-width') ) || 0; 318 pos.left += parseFloat( obj.css('border-left-width') ) || 0; 319 320 pos.width = obj.width(); 321 pos.height = obj.height(); 322 323 return pos; 324 }, 325 326 fancybox_get_zoom_from = function() { 327 var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, 328 from = {}, 329 pos, 330 view; 331 332 if (orig && orig.length) { 333 pos = fancybox_get_obj_pos(orig); 334 335 from = { 336 width : (pos.width + (currentOpts.padding * 2)), 337 height : (pos.height + (currentOpts.padding * 2)), 338 top : (pos.top - currentOpts.padding - shadow), 339 left : (pos.left - currentOpts.padding - shadow) 340 }; 341 342 } else { 343 view = fancybox_get_viewport(); 344 345 from = { 346 width : 1, 347 height : 1, 348 top : view[3] + view[1] * 0.5, 349 left : view[2] + view[0] * 0.5 350 }; 351 } 352 353 return from; 354 }, 355 356 fancybox_show = function() { 357 loading.hide(); 358 359 if (wrap.is(":visible") && $.isFunction(currentOpts.onCleanup)) { 360 if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) { 361 $.event.trigger('fancybox-cancel'); 362 363 busy = false; 364 return; 365 } 366 } 367 368 currentArray = selectedArray; 369 currentIndex = selectedIndex; 370 currentOpts = selectedOpts; 371 372 inner.get(0).scrollTop = 0; 373 inner.get(0).scrollLeft = 0; 374 375 if (currentOpts.overlayShow) { 376 if (isIE6) { 377 $('select:not(#fancybox-tmp select)').filter(function() { 378 return this.style.visibility !== 'hidden'; 379 }).css({'visibility':'hidden'}).one('fancybox-cleanup', function() { 380 this.style.visibility = 'inherit'; 381 }); 382 } 383 384 overlay.css({ 385 'background-color' : currentOpts.overlayColor, 386 'opacity' : currentOpts.overlayOpacity 387 }).unbind().show(); 388 } 389 390 final_pos = fancybox_get_zoom_to(); 391 392 fancybox_process_title(); 393 394 if (wrap.is(":visible")) { 395 $( close.add( nav_left ).add( nav_right ) ).hide(); 396 397 var pos = wrap.position(), 398 equal; 399 400 start_pos = { 401 top : pos.top , 402 left : pos.left, 403 width : wrap.width(), 404 height : wrap.height() 405 }; 406 407 equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); 408 409 inner.fadeOut(currentOpts.changeFade, function() { 410 var finish_resizing = function() { 411 inner.html( tmp.contents() ).fadeIn(currentOpts.changeFade, _finish); 412 }; 413 414 $.event.trigger('fancybox-change'); 415 416 inner.empty().css('overflow', 'hidden'); 417 418 if (equal) { 419 inner.css({ 420 top : currentOpts.padding, 421 left : currentOpts.padding, 422 width : Math.max(final_pos.width - (currentOpts.padding * 2), 1), 423 height : Math.max(final_pos.height - (currentOpts.padding * 2) - titleh, 1) 424 }); 425 426 finish_resizing(); 427 428 } else { 429 inner.css({ 430 top : currentOpts.padding, 431 left : currentOpts.padding, 432 width : Math.max(start_pos.width - (currentOpts.padding * 2), 1), 433 height : Math.max(start_pos.height - (currentOpts.padding * 2), 1) 434 }); 435 436 fx.prop = 0; 437 438 $(fx).animate({ prop: 1 }, { 439 duration : currentOpts.changeSpeed, 440 easing : currentOpts.easingChange, 441 step : fancybox_draw, 442 complete : finish_resizing 443 }); 444 } 445 }); 446 447 return; 448 } 449 450 wrap.css('opacity', 1); 451 452 if (currentOpts.transitionIn == 'elastic') { 453 start_pos = fancybox_get_zoom_from(); 454 455 inner.css({ 456 top : currentOpts.padding, 457 left : currentOpts.padding, 458 width : Math.max(start_pos.width - (currentOpts.padding * 2), 1), 459 height : Math.max(start_pos.height - (currentOpts.padding * 2), 1) 460 }) 461 .html( tmp.contents() ); 462 463 wrap.css(start_pos).show(); 464 465 if (currentOpts.opacity) { 466 final_pos.opacity = 0; 467 } 468 469 fx.prop = 0; 470 471 $(fx).animate({ prop: 1 }, { 472 duration : currentOpts.speedIn, 473 easing : currentOpts.easingIn, 474 step : fancybox_draw, 475 complete : _finish 476 }); 477 478 } else { 479 inner.css({ 480 top : currentOpts.padding, 481 left : currentOpts.padding, 482 width : Math.max(final_pos.width - (currentOpts.padding * 2), 1), 483 height : Math.max(final_pos.height - (currentOpts.padding * 2) - titleh, 1) 484 }) 485 .html( tmp.contents() ); 486 487 wrap.css( final_pos ).fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); 488 } 489 }, 490 491 fancybox_process_inline = function() { 492 tmp.width( selectedOpts.width ); 493 tmp.height( selectedOpts.height ); 494 495 if (selectedOpts.width == 'auto') { 496 selectedOpts.width = tmp.width(); 497 } 498 if (selectedOpts.height == 'auto') { 499 selectedOpts.height = tmp.height(); 500 } 501 502 fancybox_show(); 503 }, 504 505 fancybox_process_image = function() { 506 busy = true; 507 508 selectedOpts.width = imgPreloader.width; 509 selectedOpts.height = imgPreloader.height; 510 511 $("<img />").attr({ 512 'id' : 'fancybox-img', 513 'src' : imgPreloader.src, 514 'alt' : selectedOpts.title 515 }).appendTo( tmp ); 516 517 fancybox_show(); 518 }, 519 520 fancybox_start = function() { 521 fancybox_abort(); 522 523 var obj = selectedArray[ selectedIndex ], 524 href, 525 type, 526 title, 527 str, 528 emb, 529 selector, 530 data; 531 532 selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); 533 title = obj.title || $(obj).title || selectedOpts.title || ''; 534 535 if (obj.nodeName && !selectedOpts.orig) { 536 selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); 537 } 538 539 if (title === '' && selectedOpts.orig) { 540 title = selectedOpts.orig.attr('alt'); 541 } 542 543 if (obj.nodeName && (/^(?:javascript|#)/i).test(obj.href)) { 544 href = selectedOpts.href || null; 545 } else { 546 href = selectedOpts.href || obj.href || null; 547 } 548 549 if (selectedOpts.type) { 550 type = selectedOpts.type; 551 552 if (!href) { 553 href = selectedOpts.content; 554 } 555 556 } else if (selectedOpts.content) { 557 type = 'html'; 558 559 } else if (href) { 560 if (href.match(imgRegExp)) { 561 type = 'image'; 562 563 } else if (href.match(swfRegExp)) { 564 type = 'swf'; 565 566 } else if ($(obj).hasClass("iframe")) { 567 type = 'iframe'; 568 569 } else if (href.match(/#/)) { 570 obj = href.substr(href.indexOf("#")); 571 572 type = $(obj).length > 0 ? 'inline' : 'ajax'; 573 } else { 574 type = 'ajax'; 575 } 576 } else { 577 type = 'inline'; 578 } 579 580 selectedOpts.type = type; 581 selectedOpts.href = href; 582 selectedOpts.title = title; 583 584 if (selectedOpts.autoDimensions && selectedOpts.type !== 'iframe' && selectedOpts.type !== 'swf') { 585 selectedOpts.width = 'auto'; 586 selectedOpts.height = 'auto'; 587 } 588 589 if (selectedOpts.modal) { 590 selectedOpts.overlayShow = true; 591 selectedOpts.hideOnOverlayClick = false; 592 selectedOpts.hideOnContentClick = false; 593 selectedOpts.enableEscapeButton = false; 594 selectedOpts.showCloseButton = false; 595 } 596 597 if ($.isFunction(selectedOpts.onStart)) { 598 if (selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts) === false) { 599 busy = false; 600 return; 601 } 602 } 603 604 tmp.css('padding', (shadow + selectedOpts.padding + selectedOpts.margin)); 605 606 $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { 607 $(this).replaceWith(inner.children()); 608 }); 609 610 switch (type) { 611 case 'html' : 612 tmp.html( selectedOpts.content ); 613 fancybox_process_inline(); 614 break; 615 616 case 'inline' : 617 $('<div class="fancybox-inline-tmp" />').hide().insertBefore( $(obj) ).bind('fancybox-cleanup', function() { 618 $(this).replaceWith(inner.children()); 619 }).bind('fancybox-cancel', function() { 620 $(this).replaceWith(tmp.children()); 621 }); 622 623 $(obj).appendTo(tmp); 624 625 fancybox_process_inline(); 626 break; 627 628 case 'image': 629 busy = false; 630 631 $.fancybox.showActivity(); 632 633 imgPreloader = new Image(); 634 635 imgPreloader.onerror = function() { 636 fancybox_error(); 637 }; 638 639 imgPreloader.onload = function() { 640 imgPreloader.onerror = null; 641 imgPreloader.onload = null; 642 fancybox_process_image(); 643 }; 644 645 imgPreloader.src = href; 646 647 break; 648 649 case 'swf': 650 str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"><param name="movie" value="' + href + '"></param>'; 651 emb = ''; 652 653 $.each(selectedOpts.swf, function(name, val) { 654 str += '<param name="' + name + '" value="' + val + '"></param>'; 655 emb += ' ' + name + '="' + val + '"'; 656 }); 657 658 str += '<embed src="' + href + '" type="application/x-shockwave-flash" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"' + emb + '></embed></object>'; 659 660 tmp.html(str); 661 662 fancybox_process_inline(); 663 break; 664 665 case 'ajax': 666 selector = href.split('#', 2); 667 data = selectedOpts.ajax.data || {}; 668 669 if (selector.length > 1) { 670 href = selector[0]; 671 672 if (typeof data == "string") { 673 data += '&selector=' + selector[1]; 674 } else { 675 data.selector = selector[1]; 676 } 677 } 678 679 busy = false; 680 $.fancybox.showActivity(); 681 682 ajaxLoader = $.ajax($.extend(selectedOpts.ajax, { 683 url : href, 684 data : data, 685 error : fancybox_error, 686 success : function(data, textStatus, XMLHttpRequest) { 687 if (ajaxLoader.status == 200) { 688 tmp.html( data ); 689 fancybox_process_inline(); 690 } 691 } 692 })); 693 694 break; 695 696 case 'iframe' : 697 $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" scrolling="' + selectedOpts.scrolling + '" src="' + selectedOpts.href + '"></iframe>').appendTo(tmp); 698 fancybox_show(); 699 break; 700 } 701 }, 702 703 fancybox_animate_loading = function() { 704 if (!loading.is(':visible')){ 705 clearInterval(loadingTimer); 706 return; 707 } 708 709 $('div', loading).css('top', (loadingFrame * -40) + 'px'); 710 711 loadingFrame = (loadingFrame + 1) % 12; 712 }, 713 714 fancybox_init = function() { 715 if ($("#fancybox-wrap").length) { 716 return; 717 } 718 719 $('body').append( 720 tmp = $('<div id="fancybox-tmp"></div>'), 721 loading = $('<div id="fancybox-loading"><div></div></div>'), 722 overlay = $('<div id="fancybox-overlay"></div>'), 723 wrap = $('<div id="fancybox-wrap"></div>') 724 ); 725 726 if (!$.support.opacity) { 727 wrap.addClass('fancybox-ie'); 728 loading.addClass('fancybox-ie'); 729 } 730 731 outer = $('<div id="fancybox-outer"></div>') 732 .append('<div class="fancy-bg" id="fancy-bg-n"></div><div class="fancy-bg" id="fancy-bg-ne"></div><div class="fancy-bg" id="fancy-bg-e"></div><div class="fancy-bg" id="fancy-bg-se"></div><div class="fancy-bg" id="fancy-bg-s"></div><div class="fancy-bg" id="fancy-bg-sw"></div><div class="fancy-bg" id="fancy-bg-w"></div><div class="fancy-bg" id="fancy-bg-nw"></div>') 733 .appendTo( wrap ); 734 735 outer.append( 736 inner = $('<div id="fancybox-inner"></div>'), 737 close = $('<a id="fancybox-close"></a>'), 738 739 nav_left = $('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'), 740 nav_right = $('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>') 741 ); 742 743 close.click($.fancybox.close); 744 loading.click($.fancybox.cancel); 745 746 nav_left.click(function(e) { 747 e.preventDefault(); 748 $.fancybox.prev(); 749 }); 750 751 nav_right.click(function(e) { 752 e.preventDefault(); 753 $.fancybox.next(); 754 }); 755 756 if (isIE6) { 757 overlay.get(0).style.setExpression('height', "document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'"); 758 loading.get(0).style.setExpression('top', "(-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'"); 759 760 outer.prepend('<iframe id="fancybox-hide-sel-frame" src="javascript:\'\';" scrolling="no" frameborder="0" ></iframe>'); 761 } 762 }; 763 764 /* 765 * Public methods 766 */ 767 768 $.fn.fancybox = function(options) { 769 $(this) 770 .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) 771 .unbind('click.fb').bind('click.fb', function(e) { 772 e.preventDefault(); 773 774 if (busy) { 775 return; 776 } 777 778 busy = true; 779 780 $(this).blur(); 781 782 selectedArray = []; 783 selectedIndex = 0; 784 785 var rel = $(this).attr('rel') || ''; 786 787 if (!rel || rel == '' || rel === 'nofollow') { 788 selectedArray.push(this); 789 790 } else { 791 selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); 792 selectedIndex = selectedArray.index( this ); 793 } 794 795 fancybox_start(); 796 797 return false; 798 }); 799 800 return this; 801 }; 802 803 $.fancybox = function(obj) { 804 if (busy) { 805 return; 806 } 807 808 busy = true; 809 810 var opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; 811 812 selectedArray = []; 813 selectedIndex = opts.index || 0; 814 815 if ($.isArray(obj)) { 816 for (var i = 0, j = obj.length; i < j; i++) { 817 if (typeof obj[i] == 'object') { 818 $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); 819 } else { 820 obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); 821 } 822 } 823 824 selectedArray = jQuery.merge(selectedArray, obj); 825 826 } else { 827 if (typeof obj == 'object') { 828 $(obj).data('fancybox', $.extend({}, opts, obj)); 829 } else { 830 obj = $({}).data('fancybox', $.extend({content : obj}, opts)); 831 } 832 833 selectedArray.push(obj); 834 } 835 836 if (selectedIndex > selectedArray.length || selectedIndex < 0) { 837 selectedIndex = 0; 838 } 839 840 fancybox_start(); 841 }; 842 843 $.fancybox.showActivity = function() { 844 clearInterval(loadingTimer); 845 846 loading.show(); 847 loadingTimer = setInterval(fancybox_animate_loading, 66); 848 }; 849 850 $.fancybox.hideActivity = function() { 851 loading.hide(); 852 }; 853 854 $.fancybox.next = function() { 855 return $.fancybox.pos( currentIndex + 1); 856 }; 857 858 $.fancybox.prev = function() { 859 return $.fancybox.pos( currentIndex - 1); 860 }; 861 862 $.fancybox.pos = function(pos) { 863 if (busy) { 864 return; 865 } 866 867 pos = parseInt(pos, 10); 868 869 if (pos > -1 && currentArray.length > pos) { 870 selectedIndex = pos; 871 fancybox_start(); 872 } 873 874 if (currentOpts.cyclic && currentArray.length > 1 && pos < 0) { 875 selectedIndex = currentArray.length - 1; 876 fancybox_start(); 877 } 878 879 if (currentOpts.cyclic && currentArray.length > 1 && pos >= currentArray.length) { 880 selectedIndex = 0; 881 fancybox_start(); 882 } 883 884 return; 885 }; 886 887 $.fancybox.cancel = function() { 888 if (busy) { 889 return; 890 } 891 892 busy = true; 893 894 $.event.trigger('fancybox-cancel'); 895 896 fancybox_abort(); 897 898 if (selectedOpts && $.isFunction(selectedOpts.onCancel)) { 899 selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); 900 } 901 902 busy = false; 903 }; 904 905 // Note: within an iframe use - parent.$.fancybox.close(); 906 $.fancybox.close = function() { 907 if (busy || wrap.is(':hidden')) { 908 return; 909 } 910 911 busy = true; 912 913 if (currentOpts && $.isFunction(currentOpts.onCleanup)) { 914 if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) { 915 busy = false; 916 return; 917 } 918 } 919 920 fancybox_abort(); 921 922 $(close.add( nav_left ).add( nav_right )).hide(); 923 924 $('#fancybox-title').remove(); 925 926 wrap.add(inner).add(overlay).unbind(); 927 928 $(window).unbind("resize.fb scroll.fb"); 929 $(document).unbind('keydown.fb'); 930 931 function _cleanup() { 932 overlay.fadeOut('fast'); 933 934 wrap.hide(); 935 936 $.event.trigger('fancybox-cleanup'); 937 938 inner.empty(); 939 940 if ($.isFunction(currentOpts.onClosed)) { 941 currentOpts.onClosed(currentArray, currentIndex, currentOpts); 942 } 943 944 currentArray = selectedOpts = []; 945 currentIndex = selectedIndex = 0; 946 currentOpts = selectedOpts = {}; 947 948 busy = false; 949 } 950 951 inner.css('overflow', 'hidden'); 952 953 if (currentOpts.transitionOut == 'elastic') { 954 start_pos = fancybox_get_zoom_from(); 955 956 var pos = wrap.position(); 957 958 final_pos = { 959 top : pos.top , 960 left : pos.left, 961 width : wrap.width(), 962 height : wrap.height() 963 }; 964 965 if (currentOpts.opacity) { 966 final_pos.opacity = 1; 967 } 968 969 fx.prop = 1; 970 971 $(fx).animate({ prop: 0 }, { 972 duration : currentOpts.speedOut, 973 easing : currentOpts.easingOut, 974 step : fancybox_draw, 975 complete : _cleanup 976 }); 977 978 } else { 979 wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); 980 } 981 }; 982 983 $.fancybox.resize = function() { 984 var c, h; 985 986 if (busy || wrap.is(':hidden')) { 987 return; 988 } 989 990 busy = true; 991 992 c = inner.wrapInner("<div style='overflow:auto'></div>").children(); 993 h = c.height(); 994 995 wrap.css({height: h + (currentOpts.padding * 2) + titleh}); 996 inner.css({height: h}); 997 998 c.replaceWith(c.children()); 999 1000 $.fancybox.center(); 1001 }; 1002 1003 $.fancybox.center = function() { 1004 busy = true; 1005 1006 var view = fancybox_get_viewport(), 1007 margin = currentOpts.margin, 1008 to = {}; 1009 1010 to.top = view[3] + ((view[1] - ((wrap.height() - titleh) + (shadow * 2 ))) * 0.5); 1011 to.left = view[2] + ((view[0] - (wrap.width() + (shadow * 2 ))) * 0.5); 1012 1013 to.top = Math.max(view[3] + margin, to.top); 1014 to.left = Math.max(view[2] + margin, to.left); 1015 1016 wrap.css(to); 1017 1018 busy = false; 1019 }; 1020 1021 $.fn.fancybox.defaults = { 1022 padding : 10, 1023 margin : 20, 1024 opacity : false, 1025 modal : false, 1026 cyclic : false, 1027 scrolling : 'auto', // 'auto', 'yes' or 'no' 1028 1029 width : 560, 1030 height : 340, 1031 1032 autoScale : true, 1033 autoDimensions : true, 1034 centerOnScroll : false, 1035 1036 ajax : {}, 1037 swf : { wmode: 'transparent' }, 1038 1039 hideOnOverlayClick : true, 1040 hideOnContentClick : false, 1041 1042 overlayShow : true, 1043 overlayOpacity : 0.3, 1044 overlayColor : '#666', 1045 1046 titleShow : true, 1047 titlePosition : 'outside', // 'outside', 'inside' or 'over' 1048 titleFormat : null, 1049 1050 transitionIn : 'fade', // 'elastic', 'fade' or 'none' 1051 transitionOut : 'fade', // 'elastic', 'fade' or 'none' 1052 1053 speedIn : 300, 1054 speedOut : 300, 1055 1056 changeSpeed : 300, 1057 changeFade : 'fast', 1058 1059 easingIn : 'swing', 1060 easingOut : 'swing', 1061 1062 showCloseButton : true, 1063 showNavArrows : true, 1064 enableEscapeButton : true, 1065 1066 onStart : null, 1067 onCancel : null, 1068 onComplete : null, 1069 onCleanup : null, 1070 onClosed : null 1071 }; 1072 1073 $(document).ready(function() { 1074 fancybox_init(); 1075 }); 1076 1077})(jQuery);