Advertisement
Guest User

jQuery Fancybox 1.3.4 patched for jQuery 1.11

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