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