晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/home/salvufkx/salvatorefabbri.com/wp-content/themes/vega/js/fancybox/ |
| Current File : /home/salvufkx/salvatorefabbri.com/wp-content/themes/vega/js/fancybox/jquery.fancybox.js |
/*!
* fancyBox - jQuery Plugin
* version: 3.0.0 Beta 1 (Tue, 29 Jan 2013)
* @requires jQuery v1.7 or later
*
* Examples at http://fancyapps.com/fancybox/
* License: www.fancyapps.com/fancybox/#license
*
* Copyright 2013 Janis Skarnelis - janis@fancyapps.com
*
*/
(function (window, document, $, undefined) {
"use strict";
var W = $(window),
D = $(document),
H = $('html');
var F = $.fancybox = function () {
F.open.apply( this, arguments );
};
var isTouch = F.isTouch = (document.createTouch !== undefined || window.ontouchstart !== undefined);
var isQuery = function(object) {
return object && object.hasOwnProperty && object instanceof $;
};
var isString = function(str) {
return str && $.type(str) === "string";
};
var isPercentage = function(str) {
return isString(str) && str.indexOf('%') > 0;
};
var getScalar = function(orig, dim) {
var value = parseFloat(orig, 10) || 0;
if (dim && isPercentage(orig)) {
value = F.getViewport()[ dim ] / 100 * value;
}
return Math.ceil(value);
};
var getValue = function(value, dim) {
return getScalar(value, dim) + 'px';
};
var getTime = Date.now || function() {
return +new Date;
};
var removeWrap = function(what) {
var el = isString(what) ? $(what) : what;
if (el && el.length) {
el.removeClass('fancybox-wrap').stop(true).trigger('onReset').hide().unbind();
try {
el.find('iframe').unbind().attr('src', isTouch ? '' : '//about:blank');
// Give the document in the iframe to get a chance to unload properly before remove
setTimeout(function () {
el.empty().remove();
// Remove the lock if there are no elements
if (F.lock && !F.coming && !F.current) {
var scrollV, scrollH;
$('.fancybox-margin').removeClass('fancybox-margin');
scrollV = W.scrollTop();
scrollH = W.scrollLeft();
H.removeClass('fancybox-lock');
F.lock.remove();
F.lock = null;
W.scrollTop( scrollV ).scrollLeft( scrollH );
}
}, 150);
} catch(e) {}
}
};
$.extend(F, {
// The current version of fancyBox
version: '3.0.0',
defaults: {
theme : 'default', // 'default', dark', 'light'
padding : 15, // space inside box, around content
margin : [30, 55, 30, 55], // space between viewport and the box
loop : true, // Continuous gallery item loop
arrows : true,
closeBtn : true,
expander : !isTouch,
caption : {
type : 'outside' // 'float', 'inside', 'outside' or 'over',
},
overlay : {
closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay
speedIn : 0, // duration of fadeIn animation
speedOut : 250, // duration of fadeOut animation
showEarly : true, // indicates if should be opened immediately or wait until the content is ready
css : {} // custom CSS properties
},
helpers : {}, // list of enabled helpers
// Dimensions
width : 800,
height : 450,
minWidth : 100,
minHeight : 100,
maxWidth : 99999,
maxHeight : 99999,
aspectRatio : false,
fitToView : true,
autoHeight : true,
autoWidth : true,
autoResize : true,
// Location
autoCenter : !isTouch,
topRatio : 0.5,
leftRatio : 0.5,
// Opening animation
openEffect : 'elastic', // 'elastic', 'fade', 'drop' or 'none'
openSpeed : 350,
openEasing : 'easeOutQuad',
// Closing animation
closeEffect : 'elastic', // 'elastic', 'fade', 'drop' or 'none'
closeSpeed : 350,
closeEasing : 'easeOutQuad',
// Animation for next gallery item
nextEffect : 'elastic', // 'elastic', 'fade', 'drop' or 'none'
nextSpeed : 350,
nextEasing : 'easeOutQuad',
// Animation for previous gallery item
prevEffect : 'elastic', // 'elastic', 'fade', 'drop' or 'none'
prevSpeed : 350,
prevEasing : 'easeOutQuad',
// Slideshow
autoPlay : false,
playSpeed : 3000,
/*
Advanced
*/
// Callbacks
onCancel : $.noop, // If canceling
beforeLoad : $.noop, // Before loading
afterLoad : $.noop, // After loading
beforeShow : $.noop, // Before changing in current item
afterShow : $.noop, // After opening
beforeClose : $.noop, // Before closing
afterClose : $.noop, // After closing
// Properties specific to content type
ajax : {
dataType : 'html',
headers : { 'X-fancyBox': true }
},
iframe : {
scrolling : 'auto',
preload : true
},
swf : {
wmode : 'transparent',
allowfullscreen : 'true',
allowscriptaccess : 'always'
},
// Default keyboard
keys : {
next : {
13 : 'left', // enter
34 : 'up', // page down
39 : 'left', // right arrow
40 : 'up' // down arrow
},
prev : {
8 : 'right', // backspace
33 : 'down', // page up
37 : 'right', // left arrow
38 : 'down' // up arrow
},
close : [27], // escape key
play : [32], // space - start/stop slideshow
toggle : [70] // letter "f" - toggle fullscreen
},
// Default direction
direction : {
next : 'left',
prev : 'right'
},
// HTML templates
tpl: {
wrap : '<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-inner"></div></div>',
iframe : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true"></iframe>',
error : '<p class="fancybox-error">{{ERROR}}</p>',
closeBtn : '<a title="{{CLOSE}}" class="fancybox-close" href="javascript:;"></a>',
next : '<a title="{{NEXT}}" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',
prev : '<a title="{{PREV}}" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'
},
// Localization
locale : 'en',
locales : {
'en' : {
CLOSE : 'Close',
NEXT : 'Next',
PREV : 'Previous',
ERROR : 'The requested content cannot be loaded. <br/> Please try again later.',
EXPAND : 'Display actual size',
SHRINK : 'Fit to the viewport',
PLAY_START : 'Start slideshow',
PLAY_STOP : 'Pause slideshow'
},
'de' : {
CLOSE : 'Schliessen',
NEXT : 'Vorwärts',
PREV : 'Zurück',
ERROR : 'Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es später nochmal.',
EXPAND : '',
SHRINK : '',
PLAY_START : '',
PLAY_STOP : ''
}
},
// Override some properties
index : 0,
content : null,
href : null,
// Various
wrapCSS : '', // CSS class name for the box
modal : false,
locked : true,
preload : 3, // Number of gallery images to preload
mouseWheel : true, // Enable or disable mousewheel support
scrolling : 'auto', // 'yes', 'no', any valid value for CSS "overflow" property
scrollOutside : true // If trye, fancyBox will try to set scrollbars outside the content
},
// Current state
current : null,
coming : null,
group : [],
index : 0,
isActive : false, // Is activated
isOpen : false, // Is currently open
isOpened : false, // Have been fully opened at least once
isMaximized : false,
player : {
timer : null,
isActive : false
},
// Loaders
ajaxLoad : null,
imgPreload : null,
// Object containing all helpers
helpers : {},
// Open fancyBox
open: function( items, options ) {
if (!items) {
return;
}
// Close if already active
if (false === F.close(true)) {
return;
}
if (!$.isPlainObject( options )) {
options = {};
}
F.opts = $.extend(true, {}, F.defaults, options);
F.populate( items );
if (F.group.length) {
F._start( F.opts.index );
}
},
// Add new items to the group
populate : function( items ) {
var group = [];
if ( !$.isArray( items )) {
items = [ items ];
}
// Build group array, each item is object containing element
// and most important attributes - href, title and type
$.each(items, function(i, element) {
var defaults = $.extend(true, {}, F.opts),
item,
obj,
type,
margin,
padding;
if ($.isPlainObject(element)) {
item = element;
} else if (isString(element)) {
item = { href : element };
} else if (isQuery(element) || $.type(element) === 'object' && element.nodeType) {
obj = $(element);
item = $(obj).get(0);
if (!item.href) {
item = { href : element };
}
item = $.extend({
href : obj.data('fancybox-href') || obj.attr('href') || item.href,
title : obj.data('fancybox-title') || obj.attr('title') || item.title,
type : obj.data('fancybox-type'),
element : obj
}, obj.data('fancybox-options') );
} else {
return;
}
// If the type has not specified, then try to guess
if (!item.type && (item.content || item.href)) {
item.type = item.content ? "html" : F.guessType( obj, item.href );
}
// Adjust some defaults depending on content type
type = item.type || F.opts.type;
if (type === 'image' || type === 'swf') {
defaults.autoWidth = defaults.autoHeight = false;
defaults.scrolling = 'visible';
}
if (type === 'image') {
defaults.aspectRatio = true;
}
if (type === 'iframe') {
defaults.autoWidth = false;
defaults.scrolling = isTouch ? 'scroll' : 'visible';
}
if (items.length < 2) {
defaults.margin = 30;
}
item = $.extend(true, {}, defaults, item);
// Recheck some parameters
margin = item.margin;
padding = item.padding;
// Convert margin and padding properties to array - top, right, bottom, left
if ($.type(margin) === 'number') {
item.margin = [margin, margin, margin, margin];
}
if ($.type(padding) === 'number') {
item.padding = [padding, padding, padding, padding];
}
// 'modal' propery is just a shortcut
if (item.modal) {
$.extend(true, item, {
closeBtn : false,
closeClick : false,
nextClick : false,
arrows : false,
mouseWheel : false,
keys : null,
overlay : {
closeClick : false
}
});
}
if (item.autoSize !== undefined) {
item.autoWidth = item.autoHeight = !!item.autoSize;
}
if (item.width === 'auto') {
item.autoWidth = true;
}
if (item.height === 'auto') {
item.autoHeight = true;
}
group.push( item );
});
F.group = F.group.concat( group );
},
// Cancel image loading and abort ajax request
cancel: function () {
var coming = F.coming;
if (!coming || false === F.trigger('onCancel')) {
return;
}
F.hideLoading();
if (F.ajaxLoad) {
F.ajaxLoad.abort();
}
if (F.imgPreload) {
F.imgPreload.onload = F.imgPreload.onerror = null;
}
if (coming.wrap) {
removeWrap( coming.wrap );
}
F.ajaxLoad = F.imgPreload = F.coming = null;
// If the first item has been canceled, then clear everything
if (!F.current) {
F._afterZoomOut( coming );
}
},
// Start closing or remove immediately if is opening/closing
close: function (e) {
if (e && $.type(e) === 'object') {
e.preventDefault();
}
F.cancel();
// Do not close if:
// - the script has not been activated
// - cancel event has triggered opening a new item
// - "beforeClose" trigger has returned false
if (!F.isActive || F.coming || false === F.trigger('beforeClose')) {
return;
}
F.unbind();
F.isClosing = true;
if (F.lock) {
F.lock.css('overflow', 'hidden');
}
if (!F.isOpen || e === true) {
F._afterZoomOut();
} else {
F.isOpen = F.isOpened = false;
F.transitions.close();
}
},
prev : function( direction ) {
var current = F.current;
if (current) {
F.jumpto( current.index - 1, (isString(direction) ? direction : current.direction.prev) );
}
},
next : function( direction ) {
var current = F.current;
if (current) {
F.jumpto( current.index + 1, (isString(direction) ? direction : current.direction.next) );
}
},
jumpto : function( index, direction ) {
var current = F.current;
if (!(F.coming && F.coming.index === index)) {
F.cancel();
if (current.index == index) {
direction = null;
} else if (!direction) {
direction = current.direction[ index > current.index ? 'next' : 'prev' ];
}
F.direction = direction;
F._start( index );
}
}
});
$.extend(F, {
guessType : function(item, href) {
var rez = item && item.prop('class') ? item.prop('class').match(/fancybox\.(\w+)/) : 0,
type = false;
if (rez) {
return rez[1];
}
if (isString(href)) {
if (href.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp)((\?|#).*)?$)/i)) {
type = 'image';
} else if (href.match(/\.(swf)((\?|#).*)?$/i)) {
type = 'swf';
} else if (href.charAt(0) === '#') {
type = 'inline';
}
} else if (isString(item)) {
type = 'html';
}
return type;
},
trigger: function (event, o) {
var ret, obj = o || F.coming || F.current;
if (!obj) {
return;
}
if ($.isFunction( obj[event] )) {
ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));
}
// Cancel further execution if afterClose callback has opened new instance
if (ret === false || (event === 'afterClose' && F.isActive) ) {
return false;
}
if (obj.helpers) {
$.each(obj.helpers, function (helper, opts) {
var helperObject = F.helpers[helper],
helperOpts;
if (opts && helperObject && $.isFunction(helperObject[event])) {
helperOpts = $.extend(true, {}, helperObject.defaults, opts);
helperObject.opts = helperOpts;
helperObject[event](helperOpts, obj );
}
});
}
$.event.trigger(event);
},
// Center inside viewport
reposition: function (e, object) {
var obj = object || F.current,
wrap = obj && obj.wrap,
pos;
if (F.isOpen && wrap) {
pos = F._getPosition( obj );
if (e === false || (e && e.type === 'scroll')) {
wrap.stop(true).animate(pos, 200).css('overflow', 'visible');
} else {
wrap.css(pos);
}
}
},
update: function (e) {
var type = (e && e.type),
timeNow = getTime(),
current = F.current,
width;
if (!current || !F.isOpen ) {
return;
}
if (type === 'scroll') {
if (F.wrap.outerHeight(true) > F.getViewport().h) {
return;
}
if (F.didUpdate) {
clearTimeout( F.didUpdate );
}
F.didUpdate = setTimeout(function() {
F.reposition(e);
F.didUpdate = null;
}, 50);
return;
}
if (F.lock) {
F.lock.css('overflow', 'hidden');
}
F._setDimension();
F.reposition(e);
if (F.lock) {
F.lock.css('overflow', 'auto');
}
// Re-center float type caption
if (current.caption.type === 'float') {
width = F.getViewport().w - (F.wrap.outerWidth(true) - F.inner.width() );
current.caption.wrap.css('width', width).css('marginLeft', (width * 0.5 - F.inner.width() * 0.5) * -1 );
}
if (current.expander) {
if ( current.canShrink) {
$(".fancybox-expand").show().attr('title', current.locales[ current.locale ].SHRINK );
} else if (current.canExpand) {
$(".fancybox-expand").show().attr('title', current.locales[ current.locale ].EXPAND );
} else {
$(".fancybox-expand").hide();
}
}
F.trigger('onUpdate');
},
// Shrink content to fit inside viewport or restore if resized
toggle: function ( action ) {
var current = F.current;
if (current && F.isOpen) {
F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView;
F.update( true );
}
},
hideLoading: function () {
$('#fancybox-loading').remove();
},
showLoading: function () {
var el, view;
F.hideLoading();
el = $('<div id="fancybox-loading"></div>').click(F.cancel).appendTo('body');
if (!F.defaults.fixed) {
view = F.getViewport();
el.css({
position : 'absolute',
top : (view.h * 0.5) + view.y,
left : (view.w * 0.5) + view.x
});
}
},
getViewport: function () {
var rez;
if (F.lock) {
rez = {
x: F.lock.scrollLeft(),
y: F.lock.scrollTop(),
w: F.lock[0].clientWidth,
h: F.lock[0].clientHeight
};
} else {
rez = {
x: W.scrollLeft(),
y: W.scrollTop(),
// See http://bugs.jquery.com/ticket/6724
w : isTouch && window.innerWidth ? window.innerWidth : W.width(),
h : isTouch && window.innerHeight ? window.innerHeight : W.height()
};
}
return rez;
},
unbind : function() {
if (isQuery(F.wrap)) {
F.wrap.unbind('.fb');
}
if (isQuery(F.inner)) {
F.inner.unbind('.fb');
}
D.unbind('.fb');
W.unbind('.fb');
},
rebind: function () {
var current = F.current,
keys;
F.unbind();
if (!current || !F.isOpen) {
return;
}
// Changing document height on iOS devices triggers a 'resize' event,
// that can change document height... repeating infinitely
W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);
keys = current.keys;
if (keys) {
D.bind('keydown.fb', function (e) {
var code = e.which || e.keyCode,
target = e.target || e.srcElement;
// Skip esc key if loading, because showLoading will cancel preloading
if (code === 27 && F.coming) {
return false;
}
// Ignore key combinations and key events within form elements
if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {
$.each(keys, function(i, val) {
//if (current.group.length > 1 && val[ code ] !== undefined) {
if (val[ code ] !== undefined) {
e.preventDefault();
if (current.group.length > 1) {
F[ i ]( val[ code ] );
}
return false;
}
if ($.inArray(code, val) > -1) {
e.preventDefault();
if (i === 'play') {
F.slideshow.toggle();
} else {
F[ i ] ();
}
return false;
}
});
}
});
}
F.lastScroll = getTime();
if (current.mouseWheel && F.group.length > 1) {
F.wrap.bind('DOMMouseScroll.fb mousewheel.fb MozMousePixelScroll.fb', function (event) {
var e = event.originalEvent,
el = e.target || 0,
delta = (e.wheelDelta || e.detail || 0),
deltaX = e.wheelDeltaX || 0,
deltaY = e.wheelDeltaY || 0,
now = getTime();
if (((el && el.style && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)))) ) {
return;
}
if (delta === 0 || (F.current && F.current.canShrink)) {
return;
}
e.stopPropagation();
if (F.lastScroll && (now - F.lastScroll) < 80) {
F.lastScroll = now;
return;
}
F.lastScroll = now;
if (e.axis) {
if (e.axis === e.HORIZONTAL_AXIS) {
deltaX = delta * -1;
} else if (e.axis === e.VERTICAL_AXIS) {
deltaY = delta * -1;
}
}
if ( deltaX === 0 ) {
if (deltaY > 0) {
F.prev( 'down' );
} else {
F.next( 'up' );
}
} else {
if (deltaX > 0) {
F.prev( 'right' );
} else {
F.next( 'left' );
}
}
});
}
F.touch.init();
},
rebuild : function() {
var current = F.current;
current.wrap.find('.fancybox-nav, .fancybox-close, .fancybox-expand').remove();
// Create navigation arrows
if (current.arrows && F.group.length > 1) {
if (current.loop || current.index > 0) {
$( F._translate( current.tpl.prev) ).appendTo(F.inner).bind('click.fb', F.prev);
}
if (current.loop || current.index < F.group.length - 1) {
$( F._translate( current.tpl.next) ).appendTo(F.inner).bind('click.fb', F.next);
}
}
// Create a close button
if (current.closeBtn) {
$( F._translate( current.tpl.closeBtn) ).appendTo(F.wrap).bind('click.fb', F.close);
}
// Add expand button to image
if (current.expander && current.type === 'image') {
$('<a title="Expand image" class="fancybox-expand" href="javascript:;"></a>')
.appendTo( F.inner )
.bind('click.fb', F.toggle);
if ( !current.canShrink && !current.canExpand) {
}
}
},
// Create upcoming object and prepare for loading the content
_start: function( index ) {
var coming,
type;
// Check index and get object from the groups
if (F.opts.loop) {
if (index < 0) {
index = F.group.length + (index % F.group.length);
}
index = index % F.group.length;
}
coming = F.group[ index ];
if (!coming) {
return false;
}
// Add all properties
coming = $.extend(true, {}, F.opts, coming);
/*
* Add reference to the group, so it`s possible to access from callbacks, example:
* afterLoad : function() {
* this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
* }
*/
coming.group = F.group;
coming.index = index;
// Give a chance for callback or helpers to update coming item (type, title, etc)
F.coming = coming;
if (false === F.trigger('beforeLoad')) {
F.coming = null;
return;
}
F.isActive = true;
// Build the neccessary markup
F._build();
// If user will press the escape-button, the request will be canceled
D.bind('keydown.loading', function(e) {
if ((e.which || e.keyCode) === 27) {
D.unbind('.loading');
e.preventDefault();
F.cancel();
}
});
// Show overlay
if (coming.overlay && coming.overlay.showEarly) {
F.overlay.open( coming.overlay );
}
// Load content
type = coming.type;
if (type === 'image') {
F._loadImage();
} else if (type === 'ajax') {
F._loadAjax();
} else if (type === 'iframe') {
F._loadIframe();
} else if (type === 'inline') {
F._loadInline();
} else if (type === 'html' || type === 'swf') {
F._afterLoad();
} else {
F._error();
}
},
_build : function() {
var coming = F.coming,
captionType = coming.caption.type,
wrap,
inner,
scrollV,
scrollH;
coming.wrap = wrap = $('<div class="fancybox-wrap"></div>').appendTo( coming.parent || 'body' ).addClass('fancybox-' + coming.theme);
coming.inner = inner = $('<div class="fancybox-inner"></div>').appendTo( wrap );
coming[ captionType === 'outside' || captionType === 'float' ? 'inner' : 'wrap' ].addClass('fancybox-skin fancybox-' + coming.theme + '-skin');
if (coming.locked && coming.overlay && F.defaults.fixed) {
if (!F.lock) {
F.lock = $('<div id="fancybox-lock"></div>').appendTo( wrap.parent() );
}
F.lock.unbind().append( wrap );
if (coming.overlay.closeClick) {
F.lock.click(function(e) {
if ($(e.target).is(F.lock)) {
F.close();
}
});
}
// Compensate missing page scrolling by increasing margin
if (D.height() > W.height() || H.css('overflow-y') === 'scroll') {
$('*:visible').filter(function(){
return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && $(this).attr('id') !== "fancybox-lock");
}).addClass('fancybox-margin');
H.addClass('fancybox-margin');
}
// Workaround for FF jumping bug
scrollV = W.scrollTop();
scrollH = W.scrollLeft();
H.addClass('fancybox-lock');
W.scrollTop( scrollV ).scrollLeft( scrollH );
}
F.trigger('onReady');
},
_error: function ( type ) {
if (!F.coming) {
return;
}
$.extend(F.coming, {
type : 'html',
autoWidth : true,
autoHeight : true,
closeBtn : true,
minWidth : 0,
minHeight : 0,
padding : [15, 15, 15, 15],
scrolling : 'visible',
hasError : type,
content : F._translate( F.coming.tpl.error )
});
F._afterLoad();
},
_loadImage: function () {
// Reset preload image so it is later possible to check "complete" property
var img = F.imgPreload = new Image();
img.onload = function () {
this.onload = this.onerror = null;
$.extend(F.coming, {
width : this.width,
height : this.height,
content : $(this).addClass('fancybox-image')
});
F._afterLoad();
};
img.onerror = function () {
this.onload = this.onerror = null;
F._error( 'image' );
};
img.src = F.coming.href;
if (img.complete !== true || img.width < 1) {
F.showLoading();
}
},
_loadAjax: function () {
var coming = F.coming,
href = coming.href,
hrefParts,
selector;
hrefParts = href.split(/\s+/, 2);
href = hrefParts.shift();
selector = hrefParts.shift();
F.showLoading();
F.ajaxLoad = $.ajax($.extend({}, coming.ajax, {
url: coming.href,
error: function (jqXHR, textStatus) {
if (F.coming && textStatus !== 'abort') {
F._error( 'ajax', jqXHR );
} else {
F.hideLoading();
}
},
success: function (data, textStatus) {
if (textStatus === 'success') {
if (selector) {
data = $('<div>').html(data).find(selector);
}
coming.content = data;
F._afterLoad();
}
}
}));
},
_loadIframe: function() {
var coming = F.coming,
iframe;
coming.content = iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime()))
.attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling);
if (coming.iframe.preload) {
F.showLoading();
F._setDimension( coming );
coming.wrap.addClass('fancybox-tmp');
iframe.one('load.fb', function() {
if (coming.iframe.preload) {
$(this).data('ready', 1);
$(this).bind('load.fb', F.update);
F._afterLoad();
}
});
}
iframe.attr('src', coming.href).appendTo(coming.inner);
if (!coming.iframe.preload) {
F._afterLoad();
} else if (iframe.data('ready') !== 1) {
F.showLoading();
}
},
_loadInline : function() {
var coming = F.coming,
href = coming.href;
coming.content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7
if (coming.content.length) {
F._afterLoad();
} else {
F._error();
}
},
_preloadImages: function() {
var group = F.group,
current = F.current,
len = group.length,
cnt = current.preload ? Math.min(current.preload, len - 1) : 0,
item,
i;
for (i = 1; i <= cnt; i += 1) {
item = group[ (current.index + i ) % len ];
if (item && item.type === 'image' && item.href) {
new Image().src = item.href;
}
}
},
_afterLoad : function() {
var current = F.coming,
previous = F.current;
D.unbind('.loading');
if (!current || F.isActive === false || false === F.trigger('afterLoad', current, previous)) {
F.hideLoading();
if (current && current.wrap) {
removeWrap( current.wrap );
}
if (!previous) {
F._afterZoomOut( current );
}
F.coming = null;
return;
}
$.extend(F, {
wrap : current.wrap.addClass('fancybox-type-' + current.type + ' fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-' + current.theme + '-' + (isTouch ? 'mobile' : 'desktop') + ' ' + current.wrapCSS),
inner : current.inner,
current : current,
previous : previous
});
// Set content, margin/padding, caption, etc
F._prepare();
// Give a chance for helpers or callbacks to update elements
F.trigger('beforeShow', current, previous);
F.isOpen = false;
F.coming = null;
// Set initial dimension
F._setDimension();
F.hideLoading();
// Open overlay if is not yet open
if (current.overlay && !F.overlay.el) {
F.overlay.open( current.overlay );
}
F.transitions.open();
},
_prepare : function() {
var current = F.current,
content = current.content || '',
wrap = current.wrap,
inner = current.inner,
margin = current.margin,
padding = current.padding,
href = current.href,
type = current.type,
scrolling = current.scrolling,
caption = current.caption,
captionText = current.title,
captionType = caption.type,
placeholder = 'fancybox-placeholder',
display = 'fancybox-display',
embed;
if (type !== 'iframe' && isQuery(content) && content.length) {
if (!content.data(placeholder)) {
content.data(display, content.css('display'))
.data(placeholder, $('<div class="' + placeholder + '"></div>').insertAfter( content ).hide() );
}
content = content.show().detach();
current.wrap.bind('onReset', function () {
if ($(this).find(content).length) {
content.css('display', content.data(display))
.replaceAll( content.data(placeholder) )
.data(placeholder, false)
.data(display, false);
}
});
}
if (type === 'swf') {
content = '<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="' + href + '"></param>';
embed = '';
$.each(current.swf, function(name, val) {
content += '<param name="' + name + '" value="' + val + '"></param>';
embed += ' ' + name + '="' + val + '"';
});
content += '<embed src="' + href + '" type="application/x-shockwave-flash" width="100%" height="100%"' + embed + '></embed></object>';
}
if (!(isQuery(content) && content.parent().is(current.inner))) {
current.inner.append( content );
current.content = current.inner.children(':last');
}
// Add margin / padding
$.each(["Top", "Right", "Bottom", "Left"], function(i, v) {
if (margin[ i ]) {
wrap.css('margin' + v, getValue(margin[ i ]));
}
if (padding[ i ]) {
if (!(v === 'Bottom' && captionType === 'outside')) {
wrap.css('padding' + v, getValue(padding[ i ]) );
}
if (captionType === 'outside' || captionType === 'float') {
inner.css('border' + v + 'Width', getValue(padding[ i ]));
if (v === 'Top' || v === 'Left') {
inner.css('margin' + v, getValue(padding[ i ] * -1));
}
}
}
});
// Add caption
if ($.isFunction(captionText)) {
captionText = captionText.call(current.element, current);
}
if (isString(captionText) && $.trim(captionText) !== '') {
current.caption.wrap = $('<div class="fancybox-title fancybox-title-' + captionType + '-wrap">' + captionText + '</div>').appendTo( current[ captionType === 'over' ? 'inner' : 'wrap' ] );
if (captionType === 'float') {
current.caption.wrap.width( F.getViewport().w - (F.wrap.outerWidth(true) - F.inner.width() ) ).wrapInner('<div></div>');
}
}
},
_setDimension: function( object ) {
var view = F.getViewport(),
current = object || F.current,
wrap = current.wrap,
inner = current.inner,
width = current.width,
height = current.height,
minWidth = current.minWidth,
minHeight = current.minHeight,
maxWidth = current.maxWidth,
maxHeight = current.maxHeight,
margin = current.margin,
scrollOut = current.scrollOutside ? current.scrollbarWidth : 0,
margin = current.margin,
padding = current.padding,
scrolling = current.scrolling,
steps = 1,
scrollingX,
scrollingY,
hSpace,
wSpace,
origWidth,
origHeight,
ratio,
iframe,
body,
maxWidth_,
maxHeight_,
width_,
height_,
canShrink,
canExpand;
// Set scrolling
scrolling = scrolling.split(',');
scrollingX = scrolling[0];
scrollingY = scrolling[1] || scrollingX;
current.inner
.css('overflow-x', scrollingX === 'yes' ? 'scroll' : (scrollingX === 'no' ? 'hidden' : scrollingX))
.css('overflow-y', scrollingY === 'yes' ? 'scroll' : (scrollingY === 'no' ? 'hidden' : scrollingY));
wSpace = margin[1] + margin[3] + padding[1] + padding[3];
hSpace = margin[0] + margin[2] + padding[0] + padding[2];
// Calculations for the content
minWidth = getScalar( isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth );
maxWidth = getScalar( isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth );
minHeight = getScalar( isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight );
maxHeight = getScalar( isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight );
origWidth = getScalar( isPercentage(width) ? getScalar(width, 'w') - wSpace : width );
origHeight = getScalar( isPercentage(height) ? getScalar(height, 'h') - hSpace : height );
if (current.fitToView) {
maxWidth = Math.min(maxWidth, getScalar('100%', 'w') - wSpace );
maxHeight = Math.min(maxHeight, getScalar('100%', 'h') - hSpace );
}
maxWidth_ = view.w;
maxHeight_ = view.h;
if (current.type === 'iframe') {
iframe = current.content;
wrap.removeClass('fancybox-tmp');
if ((current.autoWidth || current.autoHeight) && iframe && iframe.data('ready') === 1) {
try {
if (iframe[0].contentWindow && iframe[0].contentWindow.document.location) {
body = iframe.contents().find('body');
inner.addClass( 'fancybox-tmp' );
inner.width( screen.width - wSpace ).height( 99999 );
if (scrollOut) {
body.css('overflow-x', 'hidden');
}
if (current.autoWidth) {
origWidth = body.outerWidth(true);
}
if (current.autoHeight) {
origHeight = body.outerHeight(true);
}
inner.removeClass( 'fancybox-tmp' );
}
} catch (e) {}
}
} else if ( (current.autoWidth || current.autoHeight) && !(current.type === 'image' || current.type === 'swf') ) {
inner.addClass( 'fancybox-tmp' );
// Set width or height in case we need to calculate only one dimension
if (current.autoWidth) {
inner.width( 'auto' );
} else {
inner.width( maxWidth );
}
if (current.autoHeight) {
inner.height( 'auto' );
} else {
inner.height( maxHeight );
}
if (current.autoWidth) {
origWidth = inner[0].scrollWidth || inner.width();
}
if (current.autoHeight) {
origHeight = inner[0].scrollHeight || inner.height();
}
inner.removeClass( 'fancybox-tmp' );
}
width = origWidth;
height = origHeight;
ratio = origWidth / origHeight;
if (!current.autoResize) {
wrap.css({
width : getValue( width ),
height : 'auto'
});
inner.css({
width : getValue( width ),
height : getValue( height )
});
return;
}
if (current.aspectRatio) {
if (width > maxWidth) {
width = maxWidth;
height = width / ratio;
}
if (height > maxHeight) {
height = maxHeight;
width = height * ratio;
}
if (width < minWidth) {
width = minWidth;
height = width / ratio;
}
if (height < minHeight) {
height = minHeight;
width = height * ratio;
}
} else {
width = Math.max(minWidth, Math.min(width, maxWidth));
if (current.autoHeight && current.type !== 'iframe') {
inner.width( width );
origHeight = height = inner[0].scrollHeight;
}
height = Math.max(minHeight, Math.min(height, maxHeight));
}
// Wrap element has to have fixed width, because long title can expand it
wrap.css({
width : getValue( width ),
height : 'auto'
});
inner.css({
width : getValue( width ),
height : getValue( height )
});
width_ = getScalar( wrap.outerWidth(true) );
height_ = getScalar( wrap.outerHeight(true) );
if (current.fitToView) {
// Since we do not know how many lines will be at the final, we need to
// resize box till it fits inside max dimensions
if (current.aspectRatio) {
while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {
if (steps++ > 30) {
break;
}
height = Math.max(minHeight, Math.min(maxHeight, height - 10));
width = getScalar(height * ratio);
if (width < minWidth) {
width = minWidth;
height = getScalar(width / ratio);
}
if (width > maxWidth) {
width = maxWidth;
height = getScalar(width / ratio);
}
wrap.css({
width : getValue( width )
});
inner.css({
width : getValue( width ),
height : getValue( height )
});
width_ = getScalar( wrap.outerWidth(true) );
height_ = getScalar( wrap.outerHeight(true) );
}
} else {
width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_ )));
height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_ )));
}
}
if (scrollOut && scrollingX === 'auto' && (height < inner[0].scrollHeight || (isQuery(current.content) && current.content[0] && height < current.content[0].offsetHeight)) && (width + wSpace + scrollOut) < maxWidth) {
width += scrollOut;
}
wrap.css({
width : width
});
inner.css({
width : getValue( width ),
height : getValue( height )
});
width_ = getScalar( wrap.outerWidth(true) );
height_ = getScalar( wrap.outerHeight(true) );
canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;
canExpand = (width_ < maxWidth_ || height_ < maxHeight_) && ( current.aspectRatio ? (width < maxWidth && height < maxHeight && width < origWidth && height < origHeight) : ((width < maxWidth || height < maxHeight) && (width < origWidth || height < origHeight)) );
current.canShrink = canShrink;
current.canExpand = canExpand;
if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {
inner.height('auto');
}
},
_getPosition: function( object ) {
var obj = object || F.current,
wrap = obj.wrap,
view = F.getViewport(),
pos = {},
top = view.y,
left = view.x;
pos = {
top : getValue( Math.max(top, top + ((view.h - wrap.outerHeight(true)) * obj.topRatio)) ),
left : getValue( Math.max(left, left + ((view.w - wrap.outerWidth(true)) * obj.leftRatio)) ),
width : getValue( wrap.width() ),
height : getValue( wrap.height() )
};
return pos;
},
_afterZoomIn : function() {
var current = F.current;
if (!current) {
return;
}
if (F.lock) {
F.lock.css('overflow', 'auto');
}
F.isOpen = F.isOpened = true;
F.rebuild();
F.rebind();
if (current.caption && current.caption.wrap) {
current.caption.wrap.show().css({
'visibility' : 'visible',
'opacity' : 0,
'left' : 0
})
.animate({opacity:1}, "fast");
}
F.update();
F.wrap.css('overflow', 'visible').addClass('fancybox-open').focus();
F[ F.wrap.hasClass('fancybox-skin') ? 'wrap' : 'inner' ].addClass('fancybox-' + current.theme + '-skin-open');
if (current.caption && current.caption.wrap) {
current.caption.wrap.show().css('left', 0).animate({opacity:1}, "fast");
}
// Add empty element to simulate bottom margin, this trick helps to avoid extra element
if (current.margin[2] > 0) {
$('<div class="fancybox-spacer"></div>').css('height', getValue( current.margin[2] - 2) ).appendTo( F.wrap );
}
F.trigger('afterShow');
F._preloadImages();
if (current.autoPlay && !F.slideshow.isActive) {
F.slideshow.start();
}
},
_afterZoomOut : function(obj) {
var cleanup = function() {
removeWrap('.fancybox-wrap');
};
F.hideLoading();
obj = obj || F.current;
if (obj && obj.wrap) {
obj.wrap.hide();
}
$.extend(F, {
group : [],
opts : {},
coming : null,
current : null,
isActive : false,
isOpened : false,
isOpen : false,
isClosing : false,
wrap : null,
skin : null,
inner : null
});
F.trigger('afterClose', obj);
if (!F.coming && !F.current) {
if (obj.overlay) {
F.overlay.close( obj.overlay, cleanup );
} else {
cleanup();
}
}
},
_translate : function( str ) {
var obj = F.coming || F.current,
arr = obj.locales[ obj.locale ];
return str.replace(/\{\{(\w+)\}\}/g, function(match, n) {
var value = arr[n];
if (value === undefined) {
return match;
}
return value;
});
}
});
/*
* Transition object
*/
F.transitions = {
_getOrig: function( object ) {
var obj = object || F.current,
wrap = obj.wrap,
element = obj.element,
orig = obj.orig,
view = F.getViewport(),
pos = {},
width = 50,
height = 50;
if (!orig && element && element.is(':visible')) {
orig = element.find('img:first:visible');
if (!orig.length) {
orig = element;
}
}
// If there is no orig element, maybe only the first thumbnail is visible
if (!orig && obj.group[0].element) {
orig = obj.group[0].element.find('img:visible:first');
}
if (isQuery(orig) && orig.is(':visible')) {
pos = orig.offset();
if (orig.is('img')) {
width = orig.outerWidth();
height = orig.outerHeight();
}
if (F.lock) {
pos.top -= W.scrollTop();
pos.left -= W.scrollLeft();
}
} else {
pos.top = view.y + (view.h - height) * obj.topRatio;
pos.left = view.x + (view.w - width) * obj.leftRatio;
}
pos = {
top : getValue( pos.top - (wrap.outerHeight(true) - wrap.height() ) * 0.5 ),
left : getValue( pos.left - (wrap.outerWidth(true) - wrap.width() ) * 0.5 ),
width : getValue( width ),
height : getValue( height )
};
return pos;
},
_getCenter: function( object ) {
var obj = object || F.current,
wrap = obj.wrap,
view = F.getViewport(),
pos = {},
top = view.y,
left = view.x;
pos = {
top : getValue( Math.max(top, top + ((view.h - wrap.outerHeight(true)) * obj.topRatio)) ),
left : getValue( Math.max(left, left + ((view.w - wrap.outerWidth(true)) * obj.leftRatio)) ),
width : getValue( wrap.width() ),
height : getValue( wrap.height() )
};
return pos;
},
_prepare : function( object, forClosing ) {
var obj = object || F.current,
wrap = obj.wrap,
inner = obj.inner;
// Little trick to avoid animating both elements and to improve performance
wrap.height( wrap.height() );
inner.css({
'width' : (inner.width() * 100 / wrap.width() ) + '%',
'height' : (Math.floor( (inner.height() * 100 / wrap.height() ) * 100 ) / 100 ) + '%'
});
if (forClosing === true) {
wrap.find('.fancybox-title, .fancybox-spacer, .fancybox-close, .fancybox-nav').remove();
}
inner.css('overflow', 'hidden');
},
fade : function( object, stage ) {
var pos = this._getCenter( object ),
opa = {opacity: 0};
return ((stage === 'open' || stage === 'changeIn') ? [ $.extend(pos, opa), {opacity: 1} ] : [ {}, opa ]);
},
drop : function( object, stage ) {
var a = $.extend(this._getCenter( object ), {opacity: 1}),
b = $.extend({}, a, {opacity: 0, top: getValue( Math.max( F.getViewport().y - object.margin[0], getScalar( a.top ) - 200 ) )});
return ((stage === 'open' || stage === 'changeIn') ? [ b, a ] : [ {}, b ]);
},
elastic : function( object, stage ) {
var wrap = object.wrap,
margin = object.margin,
view = F.getViewport(),
direction = F.direction,
pos = this._getCenter( object ),
from = $.extend({}, pos),
to = $.extend({}, pos),
prop,
amount,
value;
if (stage === 'open') {
from = this._getOrig( object );
} else if (stage === 'close') {
from = {};
to = this._getOrig( object );
} else if (direction) {
// Calculate max distance and try to avoid scrollbars
prop = (direction === 'up' || direction === 'down') ? 'top' : 'left';
amount = (direction === 'up' || direction === 'left') ? 200 : -200;
if (stage === 'changeIn') {
value = getScalar(from[ prop ]) + amount;
if (direction === 'left') {
// from viewport right to center
value = Math.min( value, view.x + view.w - margin[3] - wrap.outerWidth() - 1 );
} else if (direction === 'right') {
// from viewport left to center
value = Math.max( value, view.x - margin[1] );
} else if (direction === 'up') {
// from viewport bottom to center
value = Math.min( value, view.y + view.h - margin[0] - wrap.outerHeight() - 1);
} else {
// down - from viewport top to center
value = Math.max( value, view.y - margin[2] );
}
from[ prop ] = value;
} else {
value = getScalar(wrap.css(prop)) - amount;
from = {};
if (direction === 'left') {
// from viewport center to left
value = Math.max( value, view.x - margin[3] );
} else if (direction === 'right') {
// from viewport center to right
value = Math.min( value, view.x + view.w - margin[1] - wrap.outerWidth() - 1 );
} else if (direction === 'up') {
// from viewport center to top
value = Math.max( value, view.y - margin[0] );
} else {
// down - from center to bottom
value = Math.min( value, view.y + view.h - margin[2] - wrap.outerHeight() - 1 );
}
to[ prop ] = value;
}
}
if (stage === 'open' || stage === 'changeIn') {
from.opacity = 0;
to.opacity = 1;
} else {
to.opacity = 0;
}
return [ from, to ];
},
open : function() {
var current = F.current,
previous = F.previous,
direction = F.direction,
effect,
pos,
speed,
easing,
stage;
if (previous) {
previous.wrap.stop(true).removeClass('fancybox-opened');
}
if ( F.isOpened ) {
effect = current.nextEffect,
speed = current.nextSpeed;
easing = current.nextEasing;
stage = 'changeIn';
} else {
effect = current.openEffect;
speed = current.openSpeed;
easing = current.openEasing;
stage = 'open';
}
/*
* Open current item
*/
if (effect === 'none') {
F._afterZoomIn();
} else {
pos = this[ effect ]( current, stage );
if (effect === 'elastic') {
this._prepare( current );
}
current.wrap.css( pos[ 0 ] );
current.wrap.animate(
pos[ 1 ],
speed,
easing,
F._afterZoomIn
);
}
/*
* Close previous item
*/
if (previous) {
if (!F.isOpened || previous.prevEffect === 'none') {
// Remove previous item if it has not fully opened
removeWrap( $('.fancybox-wrap').not( current.wrap ) );
} else {
previous.wrap.stop(true).removeClass('fancybox-opened');
pos = this[ previous.prevEffect ]( previous, 'changeOut' );
this._prepare( previous, true );
previous.wrap.animate(
pos[ 1 ],
previous.prevSpeed,
previous.prevEasing,
function() {
removeWrap( previous.wrap );
}
);
}
}
},
close : function() {
var current = F.current,
wrap = current.wrap.stop(true).removeClass('fancybox-opened'),
effect = current.closeEffect,
pos;
if (effect === 'none') {
return F._afterZoomOut();
}
this._prepare( current, true );
pos = this[ effect ]( current, 'close' );
wrap.addClass('fancybox-animating')
.animate(
pos[ 1 ],
current.closeSpeed,
current.closeEasing,
F._afterZoomOut
);
}
};
/*
* Slideshow object
*/
F.slideshow = {
_clear : function () {
if (this._timer) {
clearTimeout(this._timer);
}
},
_set : function () {
this._clear();
if (F.current && this.isActive) {
this._timer = setTimeout(F.next, this._speed);
}
},
_timer : null,
_speed : null,
isActive : false,
start : function ( speed ) {
var current = F.current;
if (current && (current.loop || current.index < current.group.length - 1)) {
this.stop();
this.isActive = true;
this._speed = speed || current.playSpeed;
D.bind({
'beforeLoad.player' : $.proxy(this._clear, this),
'onUpdate.player' : $.proxy(this._set, this),
'onCancel.player beforeClose.player' : $.proxy(this.stop, this)
});
this._set();
F.trigger('onPlayStart');
}
},
stop : function () {
this._clear();
D.unbind('.player');
this.isActive = false;
this._timer = this._speed = null;
F.trigger('onPlayEnd');
},
toggle : function() {
if (this.isActive) {
this.stop();
} else {
this.start.apply(this, arguments );
}
}
};
/*
* Overlay object
*/
F.overlay = {
el : null, // current handle
theme : '', // current theme
// Public methods
open : function(opts) {
var that = this,
el = this.el,
fixed = F.defaults.fixed,
opacity,
theme;
opts = $.extend({}, F.defaults.overlay, opts);
if (el) {
el.stop(true).removeAttr('style').unbind('.overlay');
} else {
el = $('<div class="fancybox-overlay' + (fixed ? ' fancybox-overlay-fixed' : '' ) + '"></div>').appendTo( opts.parent || 'body' );
}
if (opts.closeClick) {
el.bind('click.overlay', function(e) {
// fix Android touch event bubbling issue
if (F.lastTouch && (getTime() - F.lastTouch) < 300) {
return false;
}
if (F.isActive) {
F.close();
} else {
that.close();
}
return false;
});
}
theme = opts.theme || (F.coming ? F.coming.theme : 'default');
if (theme !== this.theme) {
el.removeClass('fancybox-' + this.theme + '-overlay')
}
this.theme = theme;
el.addClass('fancybox-' + theme + '-overlay').css( opts.css );
opacity = el.css('opacity');
if (!this.el && opacity < 1 && opts.speedIn) {
el.css({
opacity : 0,
filter : 'alpha(opacity=0)' // This fixes IE flickering
})
.fadeTo( opts.speedIn, opacity );
}
this.el = el;
if (!fixed) {
W.bind('resize.overlay', $.proxy( this.update, this) );
this.update();
}
},
close : function(opts, callback) {
opts = $.extend({}, F.defaults.overlay, opts);
if (this.el) {
this.el.stop(true).fadeOut(opts.speedOut, function() {
W.unbind('resize.overlay');
$('.fancybox-overlay').remove();
F.overlay.el = null;
if ($.isFunction(callback)) {
callback();
}
});
}
},
update : function () {
// Reset width/height so it will not mess
this.el.css({width: '100%', height: '100%'});
this.el.width(D.width()).height(D.height());
}
};
/*
* Touch object - adds swipe left/right events
*/
F.touch = {
startX : 0,
wrapX : 0,
dx : 0,
isMoving : false,
_start : function(e) {
var current = F.current,
data = e.originalEvent.touches ? e.originalEvent.touches[0] : e,
now = getTime();
if (!F.isOpen || F.wrap.is(':animated') || !( $(e.target).is(F.inner) || $(e.target).parent().is(F.inner) )) {
return;
}
if (F.lastTouch && (now - F.lastTouch) < 300) {
e.preventDefault();
F.lastTouch = now;
this._cancel(true);
F.toggle();
return false;
}
F.lastTouch = now;
if (F.wrap && F.wrap.outerWidth() > F.getViewport().w) {
return;
}
e.preventDefault();
if (data && F.wrap && F.wrap.outerWidth() < F.getViewport().w) {
this.startX = data.pageX;
this.wrapX = F.wrap.position().left;
this.isMoving = true;
F.inner
.bind('touchmove.fb', $.proxy(this._move, this) )
.one("touchend.fb touchcancel.fb", $.proxy(this._cancel, this) );
}
},
_move : function(e) {
var data = e.originalEvent.touches ? e.originalEvent.touches[0] : e,
dx = this.startX - data.pageX;
if (!this.isMoving || !F.isOpen) {
return;
}
this.dx = dx;
if (F.current.wrap.outerWidth(true) <= W.width()) {
if (Math.abs(dx) >= 50) {
e.preventDefault();
this.last = 0;
this._cancel(true);
if (dx > 0) {
F.next('left');
} else {
F.prev('right');
}
} else if (Math.abs(dx) > 3) {
e.preventDefault();
this.last = 0;
F.wrap.css('left', this.wrapX - dx);
}
}
},
_clear : function() {
this.startX = this.wrapX = this.dx = 0;
this.isMoving = false;
},
_cancel : function( stop ) {
if (F.inner) {
F.inner.unbind('touchmove.fb');
}
if (F.isOpen && Math.abs(this.dx) > 3) {
F.reposition(false);
}
this._clear();
},
init : function() {
var that = this;
if (F.inner && F.touch) {
this._cancel(true);
F.inner.bind('touchstart.fb', $.proxy(this._start, this));
}
}
};
/*
* Add default easing
*/
if (!$.easing.easeOutQuad) {
$.easing.easeOutQuad = function (x, t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
};
}
/*
*
*/
D.ready(function() {
var w1, w2, scrollV, scrollH;
// Tests that need a body at doc ready
if ( $.scrollbarWidth === undefined ) {
$.scrollbarWidth = function() {
var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'),
child = parent.children(),
width = child.innerWidth() - child.height( 99 ).innerWidth();
parent.remove();
return width;
};
}
if ( $.support.fixedPosition === undefined ) {
$.support.fixedPosition = (function() {
var elem = $('<div style="position:fixed;top:20px;padding:0;margin:0;border:0;"></div>').appendTo('body'),
fixed = elem.css( 'position' ) === 'fixed' && ((elem[0].offsetTop > 18 && elem[0].offsetTop < 22) || elem[0].offsetTop === 15 );
elem.remove();
return fixed;
}());
}
$.extend(F.defaults, {
scrollbarWidth : $.scrollbarWidth(),
fixed : $.support.fixedPosition,
parent : $('body')
});
// Quick and dirty code to get page scroll-bar width and create CSS style
// Workaround for FF jumping bug
scrollV = W.scrollTop();
scrollH = W.scrollLeft();
w1 = $(window).width();
H.addClass('fancybox-lock-test');
w2 = $(window).width();
H.removeClass('fancybox-lock-test');
W.scrollTop( scrollV ).scrollLeft( scrollH );
F.lockMargin = (w2 - w1);
$("<style type='text/css'>.fancybox-margin{margin-right:" + F.lockMargin + "px;}</style>").appendTo("head");
// Auto start
if ($("script[src*='jquery.fancybox.js']").attr('src').match(/autorun/) ){
$("a[href$='.jpg'],a[href$='.png'],a[href$='.gif'],.fancybox").attr('data-fancybox-group', 'gallery').fancybox();
}
});
// jQuery plugin initialization
$.fn.fancybox = function (options) {
var that = this,
selector = this.length ? this.selector : false,
live = (selector && selector.indexOf('()') < 0 && !(options && options.live === false));
var handler = function(e) {
var collection = live ? $(selector) : that,
group = $(this).blur(),
param = options.groupAttr || 'data-fancybox-group',
value = group.attr( param ),
tmp = this.rel;
if (!value && tmp && tmp !== 'nofollow') {
param = 'rel';
value = tmp;
}
if (value) {
group = collection.filter('[' + param + '="' + value + '"]');
options.index = group.index( this );
}
if (group.length) {
e.preventDefault();
F.open(group.get(), options);
}
};
options = options || {};
if (live) {
D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-close,.fancybox-nav,.fancybox-wrap')", 'click.fb-start', handler);
} else {
that.unbind('click.fb-start').bind('click.fb-start', handler);
}
return this;
};
}(window, document, jQuery)); |