]> git.ipfire.org Git - ipfire.org.git/blame - static/fancybox/jquery.fancybox-1.3.4.js
Move everything to the root of the repository.
[ipfire.org.git] / static / fancybox / jquery.fancybox-1.3.4.js
CommitLineData
54b8df1a
MT
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);