diff --git a/public/assets/js/appear.js b/public/assets/js/appear.js deleted file mode 100644 index 1b8a743..0000000 --- a/public/assets/js/appear.js +++ /dev/null @@ -1,151 +0,0 @@ -/* - * jQuery.appear - * https://github.com/bas2k/jquery.appear/ - * http://code.google.com/p/jquery-appear/ - * http://bas2k.ru/ - * - * Copyright (c) 2009 Michael Hixson - * Copyright (c) 2012-2014 Alexander Brovikov - * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) - */ -(function($) { - $.fn.appear = function(fn, options) { - - var settings = $.extend({ - - //arbitrary data to pass to fn - data: undefined, - - //call fn only on the first appear? - one: true, - - // X & Y accuracy - accX: 0, - accY: 0 - - }, options); - - return this.each(function() { - - var t = $(this); - - //whether the element is currently visible - t.appeared = false; - - if (!fn) { - - //trigger the custom event - t.trigger('appear', settings.data); - return; - } - - var w = $(window); - - //fires the appear event when appropriate - var check = function() { - - //is the element hidden? - if (!t.is(':visible')) { - - //it became hidden - t.appeared = false; - return; - } - - //is the element inside the visible window? - var a = w.scrollLeft(); - var b = w.scrollTop(); - var o = t.offset(); - var x = o.left; - var y = o.top; - - var ax = settings.accX; - var ay = settings.accY; - var th = t.height(); - var wh = w.height(); - var tw = t.width(); - var ww = w.width(); - - if (y + th + ay >= b && - y <= b + wh + ay && - x + tw + ax >= a && - x <= a + ww + ax) { - - //trigger the custom event - if (!t.appeared) t.trigger('appear', settings.data); - - } else { - - //it scrolled out of view - t.appeared = false; - } - }; - - //create a modified fn with some additional logic - var modifiedFn = function() { - - //mark the element as visible - t.appeared = true; - - //is this supposed to happen only once? - if (settings.one) { - - //remove the check - w.unbind('scroll', check); - var i = $.inArray(check, $.fn.appear.checks); - if (i >= 0) $.fn.appear.checks.splice(i, 1); - } - - //trigger the original fn - fn.apply(this, arguments); - }; - - //bind the modified fn to the element - if (settings.one) t.one('appear', settings.data, modifiedFn); - else t.bind('appear', settings.data, modifiedFn); - - //check whenever the window scrolls - w.scroll(check); - - //check whenever the dom changes - $.fn.appear.checks.push(check); - - //check now - (check)(); - }); - }; - - //keep a queue of appearance checks - $.extend($.fn.appear, { - - checks: [], - timeout: null, - - //process the queue - checkAll: function() { - var length = $.fn.appear.checks.length; - if (length > 0) while (length--) ($.fn.appear.checks[length])(); - }, - - //check the queue asynchronously - run: function() { - if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout); - $.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20); - } - }); - - //run checks when these methods are called - $.each(['append', 'prepend', 'after', 'before', 'attr', - 'removeAttr', 'addClass', 'removeClass', 'toggleClass', - 'remove', 'css', 'show', 'hide'], function(i, n) { - var old = $.fn[n]; - if (old) { - $.fn[n] = function() { - var r = old.apply(this, arguments); - $.fn.appear.run(); - return r; - } - } - }); - -})(jQuery); diff --git a/public/assets/js/gmaps.js b/public/assets/js/gmaps.js deleted file mode 100644 index cf4fb63..0000000 --- a/public/assets/js/gmaps.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd&&define("GMaps",[],b),a.GMaps=b()}(this,function(){if("object"!=typeof window.google||!window.google.maps)throw"Google Maps API is required. Please register the following JavaScript library http://maps.google.com/maps/api/js?sensor=true.";var a=function(a,b){var c;if(a===b)return a;for(c in b)a[c]=b[c];return a},b=function(a,b){var c,d=Array.prototype.slice.call(arguments,2),e=[],f=a.length;if(Array.prototype.map&&a.map===Array.prototype.map)e=Array.prototype.map.call(a,function(a){var c=d.slice(0);return c.splice(0,0,a),b.apply(this,c)});else for(c=0;f>c;c++)callback_params=d,callback_params.splice(0,0,a[c]),e.push(b.apply(this,callback_params));return e},c=function(a){var b,c=[];for(b=0;b0&&"object"==typeof a[c][0]?a[c]=f(a[c],b):a[c]=d(a[c],b));return a},g=function(a,b){var c,d=a.replace(".","");return c="jQuery"in this&&b?$("."+d,b)[0]:document.getElementsByClassName(d)[0]},h=function(a,b){var c,a=a.replace("#","");return c="jQuery"in window&&b?$("#"+a,b)[0]:document.getElementById(a)},i=function(a){var b=0,c=0;if(a.offsetParent)do b+=a.offsetLeft,c+=a.offsetTop;while(a=a.offsetParent);return[b,c]},j=function(b){var c=document,d=function(b){if(!this)return new d(b);b.zoom=b.zoom||15,b.mapType=b.mapType||"roadmap";var e,f=this,j=["bounds_changed","center_changed","click","dblclick","drag","dragend","dragstart","idle","maptypeid_changed","projection_changed","resize","tilesloaded","zoom_changed"],k=["mousemove","mouseout","mouseover"],l=["el","lat","lng","mapType","width","height","markerClusterer","enableNewStyle"],m=b.el||b.div,n=b.markerClusterer,o=google.maps.MapTypeId[b.mapType.toUpperCase()],p=new google.maps.LatLng(b.lat,b.lng),q=b.zoomControl||!0,r=b.zoomControlOpt||{style:"DEFAULT",position:"TOP_LEFT"},s=r.style||"DEFAULT",t=r.position||"TOP_LEFT",u=b.panControl||!0,v=b.mapTypeControl||!0,w=b.scaleControl||!0,x=b.streetViewControl||!0,y=y||!0,z={},A={zoom:this.zoom,center:p,mapTypeId:o},B={panControl:u,zoomControl:q,zoomControlOptions:{style:google.maps.ZoomControlStyle[s],position:google.maps.ControlPosition[t]},mapTypeControl:v,scaleControl:w,streetViewControl:x,overviewMapControl:y};if("string"==typeof b.el||"string"==typeof b.div?m.indexOf("#")>-1?this.el=h(m,b.context):this.el=g.apply(this,[m,b.context]):this.el=m,"undefined"==typeof this.el||null===this.el)throw"No element defined.";for(window.context_menu=window.context_menu||{},window.context_menu[f.el.id]={},this.controls=[],this.overlays=[],this.layers=[],this.singleLayers={},this.markers=[],this.polylines=[],this.routes=[],this.polygons=[],this.infoWindow=null,this.overlay_el=null,this.zoom=b.zoom,this.registered_events={},this.el.style.width=b.width||this.el.scrollWidth||this.el.offsetWidth,this.el.style.height=b.height||this.el.scrollHeight||this.el.offsetHeight,google.maps.visualRefresh=b.enableNewStyle,e=0;e'+g.title+""}if(h("gmaps_context_menu")){var j=h("gmaps_context_menu");j.innerHTML=c;var e,k=j.getElementsByTagName("a"),l=k.length;for(e=0;l>e;e++){var m=k[e],n=function(c){c.preventDefault(),d[this.id.replace(a+"_","")].action.apply(f,[b]),f.hideContextMenu()};google.maps.event.clearListeners(m,"click"),google.maps.event.addDomListenerOnce(m,"click",n,!1)}var o=i.apply(this,[f.el]),p=o[0]+b.pixel.x-15,q=o[1]+b.pixel.y-15;j.style.left=p+"px",j.style.top=q+"px",j.style.display="block"}};this.buildContextMenu=function(a,b){if("marker"===a){b.pixel={};var c=new google.maps.OverlayView;c.setMap(f.map),c.draw=function(){var d=c.getProjection(),e=b.marker.getPosition();b.pixel=d.fromLatLngToContainerPixel(e),C(a,b)}}else C(a,b)},this.setContextMenu=function(a){window.context_menu[f.el.id][a.control]={};var b,d=c.createElement("ul");for(b in a.options)if(a.options.hasOwnProperty(b)){var e=a.options[b];window.context_menu[f.el.id][a.control][e.name]={title:e.title,action:e.action}}d.id="gmaps_context_menu",d.style.display="none",d.style.position="absolute",d.style.minWidth="100px",d.style.background="white",d.style.listStyle="none",d.style.padding="8px",d.style.boxShadow="2px 2px 6px #ccc",c.body.appendChild(d);var g=h("gmaps_context_menu");google.maps.event.addDomListener(g,"mouseout",function(a){a.relatedTarget&&this.contains(a.relatedTarget)||window.setTimeout(function(){g.style.display="none"},400)},!1)},this.hideContextMenu=function(){var a=h("gmaps_context_menu");a&&(a.style.display="none")};var D=function(a,c){google.maps.event.addListener(a,c,function(a){void 0==a&&(a=this),b[c].apply(this,[a]),f.hideContextMenu()})};google.maps.event.addListener(this.map,"zoom_changed",this.hideContextMenu);for(var E=0;Ea;a++)"boolean"==typeof this.markers[a].visible&&this.markers[a].visible&&b.push(this.markers[a].getPosition());this.fitLatLngBounds(b)},this.fitLatLngBounds=function(a){var b,c=a.length,d=new google.maps.LatLngBounds;for(b=0;c>b;b++)d.extend(a[b]);this.map.fitBounds(d)},this.setCenter=function(a,b,c){this.map.panTo(new google.maps.LatLng(a,b)),c&&c()},this.getElement=function(){return this.el},this.zoomIn=function(a){a=a||1,this.zoom=this.map.getZoom()+a,this.map.setZoom(this.zoom)},this.zoomOut=function(a){a=a||1,this.zoom=this.map.getZoom()-a,this.map.setZoom(this.zoom)};var G,H=[];for(G in this.map)"function"!=typeof this.map[G]||this[G]||H.push(G);for(e=0;e-1){var d=this.markers[e];d.setMap(null),this.markerClusterer&&this.markerClusterer.removeMarker(d),j.fire("marker_removed",d,this)}}for(var c=0;c0&&d.paths[0].length>0&&(d.paths=c(b(d.paths,f,e)));for(var g=new google.maps.Polygon(d),h=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup","rightclick"],i=0;i0&&d.locations[0].length>0&&(d.locations=c(b([d.locations],f,!1)));var e=d.callback;delete d.callback;var g=new google.maps.ElevationService;if(d.path){var h={path:d.locations,samples:d.samples};g.getElevationAlongPath(h,function(a,b){e&&"function"==typeof e&&e(a,b)})}else delete d.path,delete d.samples,g.getElevationForLocations(d,function(a,b){e&&"function"==typeof e&&e(a,b)})},j.prototype.cleanRoute=j.prototype.removePolylines,j.prototype.drawRoute=function(a){var b=this;this.getRoutes({origin:a.origin,destination:a.destination,travelMode:a.travelMode,waypoints:a.waypoints,unitSystem:a.unitSystem,error:a.error,callback:function(c){if(c.length>0){var d={path:c[c.length-1].overview_path,strokeColor:a.strokeColor,strokeOpacity:a.strokeOpacity,strokeWeight:a.strokeWeight};a.hasOwnProperty("icons")&&(d.icons=a.icons),b.drawPolyline(d),a.callback&&a.callback(c[c.length-1])}}})},j.prototype.travelRoute=function(a){if(a.origin&&a.destination)this.getRoutes({origin:a.origin,destination:a.destination,travelMode:a.travelMode,waypoints:a.waypoints,unitSystem:a.unitSystem,error:a.error,callback:function(b){if(b.length>0&&a.start&&a.start(b[b.length-1]),b.length>0&&a.step){var c=b[b.length-1];if(c.legs.length>0)for(var d,e=c.legs[0].steps,f=0;d=e[f];f++)d.step_number=f,a.step(d,c.legs[0].steps.length-1)}b.length>0&&a.end&&a.end(b[b.length-1])}});else if(a.route&&a.route.legs.length>0)for(var b,c=a.route.legs[0].steps,d=0;b=c[d];d++)b.step_number=d,a.step(b)},j.prototype.drawSteppedRoute=function(a){var b=this;if(a.origin&&a.destination)this.getRoutes({origin:a.origin,destination:a.destination,travelMode:a.travelMode,waypoints:a.waypoints,error:a.error,callback:function(c){if(c.length>0&&a.start&&a.start(c[c.length-1]),c.length>0&&a.step){var d=c[c.length-1];if(d.legs.length>0)for(var e,f=d.legs[0].steps,g=0;e=f[g];g++){e.step_number=g;var h={path:e.path,strokeColor:a.strokeColor,strokeOpacity:a.strokeOpacity,strokeWeight:a.strokeWeight};a.hasOwnProperty("icons")&&(h.icons=a.icons),b.drawPolyline(h),a.step(e,d.legs[0].steps.length-1)}}c.length>0&&a.end&&a.end(c[c.length-1])}});else if(a.route&&a.route.legs.length>0)for(var c,d=a.route.legs[0].steps,e=0;c=d[e];e++){c.step_number=e;var f={path:c.path,strokeColor:a.strokeColor,strokeOpacity:a.strokeOpacity,strokeWeight:a.strokeWeight};a.hasOwnProperty("icons")&&(f.icons=a.icons),b.drawPolyline(f),a.step(c)}},j.Route=function(a){this.origin=a.origin,this.destination=a.destination,this.waypoints=a.waypoints,this.map=a.map,this.route=a.route,this.step_count=0,this.steps=this.route.legs[0].steps,this.steps_length=this.steps.length;var b={path:new google.maps.MVCArray,strokeColor:a.strokeColor,strokeOpacity:a.strokeOpacity,strokeWeight:a.strokeWeight};a.hasOwnProperty("icons")&&(b.icons=a.icons),this.polyline=this.map.drawPolyline(b).getPath()},j.Route.prototype.getRoute=function(a){var b=this;this.map.getRoutes({origin:this.origin,destination:this.destination,travelMode:a.travelMode,waypoints:this.waypoints||[],error:a.error,callback:function(){b.route=e[0],a.callback&&a.callback.call(b)}})},j.Route.prototype.back=function(){if(this.step_count>0){this.step_count--;var a=this.route.legs[0].steps[this.step_count].path;for(var b in a)a.hasOwnProperty(b)&&this.polyline.pop()}},j.Route.prototype.forward=function(){if(this.step_count0){b.markers=[];for(var c=0;c0){var d=this.polylines[0];b.polyline={},b.polyline.path=google.maps.geometry.encoding.encodePath(d.getPath()),b.polyline.strokeColor=d.strokeColor,b.polyline.strokeOpacity=d.strokeOpacity,b.polyline.strokeWeight=d.strokeWeight}return j.staticMapURL(b)},j.staticMapURL=function(a){function b(a,b){if("#"===a[0]&&(a=a.replace("#","0x"),b)){if(b=parseFloat(b),b=Math.min(1,Math.max(b,0)),0===b)return"0x00000000";b=(255*b).toString(16),1===b.length&&(b+=b),a=a.slice(0,8)+b}return a}var c,d=[],e=("file:"===location.protocol?"http:":location.protocol)+"//maps.googleapis.com/maps/api/staticmap";a.url&&(e=a.url,delete a.url),e+="?";var f=a.markers;delete a.markers,!f&&a.marker&&(f=[a.marker],delete a.marker);var g=a.styles;delete a.styles;var h=a.polyline;if(delete a.polyline,a.center)d.push("center="+a.center),delete a.center;else if(a.address)d.push("center="+a.address),delete a.address;else if(a.lat)d.push(["center=",a.lat,",",a.lng].join("")),delete a.lat,delete a.lng;else if(a.visible){var i=encodeURI(a.visible.join("|"));d.push("visible="+i)}var j=a.size;j?(j.join&&(j=j.join("x")),delete a.size):j="630x300",d.push("size="+j),a.zoom||a.zoom===!1||(a.zoom=15);var k=a.hasOwnProperty("sensor")?!!a.sensor:!0;delete a.sensor,d.push("sensor="+k);for(var l in a)a.hasOwnProperty(l)&&d.push(l+"="+a[l]);if(f)for(var m,n,o=0;c=f[o];o++){m=[],c.size&&"normal"!==c.size?(m.push("size:"+c.size),delete c.size):c.icon&&(m.push("icon:"+encodeURI(c.icon)),delete c.icon),c.color&&(m.push("color:"+c.color.replace("#","0x")),delete c.color),c.label&&(m.push("label:"+c.label[0].toUpperCase()),delete c.label),n=c.address?c.address:c.lat+","+c.lng,delete c.address,delete c.lat,delete c.lng;for(var l in c)c.hasOwnProperty(l)&&m.push(l+":"+c[l]);m.length||0===o?(m.push(n),m=m.join("|"),d.push("markers="+encodeURI(m))):(m=d.pop()+encodeURI("|"+n),d.push(m))}if(g)for(var o=0;oe;e++)for(var f=this.getPaths().getAt(e),g=f.getLength(),h=g-1,i=0;g>i;i++){var j=f.getAt(i),k=f.getAt(h);(j.lng()=a.lng()||k.lng()=a.lng())&&j.lat()+(a.lng()-j.lng())/(k.lng()-j.lng())*(k.lat()-j.lat())>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&d!=1/0&&d!=-(1/0)&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1}),j}); -//# sourceMappingURL=gmaps.min.js.map \ No newline at end of file diff --git a/public/assets/js/jQuery.style.switcher.min.js b/public/assets/js/jQuery.style.switcher.min.js deleted file mode 100644 index 016d4c5..0000000 --- a/public/assets/js/jQuery.style.switcher.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){var t,n={hasPreview:true,defaultThemeId:"jssDefault",fullPath:"css/",cookie:{expires:30,isManagingLoad:true}},r="jss_selected",i={};i={getItem:function(e){if(!e){return null}return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null},setItem:function(e,t,n,r,i,s){if(!e||/^(?:expires|max\-age|path|domain|secure)$/i.test(e)){return false}var o="";if(n){switch(n.constructor){case Number:o=n===Infinity?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+n;break;case String:o="; expires="+n;break;case Date:o="; expires="+n.toUTCString();break}}document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(t)+o+(i?"; domain="+i:"")+(r?"; path="+r:"")+(s?"; secure":"");return true},removeItem:function(e,t,n){if(!this.hasItem(e)){return false}document.cookie=encodeURIComponent(e)+"=; expires=Thu, 01 Jan 1970 00:00:00 GMT"+(n?"; domain="+n:"")+(t?"; path="+t:"");return true},hasItem:function(e){if(!e){return false}return(new RegExp("(?:^|;\\s*)"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=")).test(document.cookie)},keys:function(){var e=document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g,"").split(/\s*(?:\=[^;]*)?;\s*/);for(var t=e.length,n=0;n= 0 ) && focusable( element, !isTabIndexNaN ); - } -}); - -// support: jQuery <1.8 -if ( !$( "" ).outerWidth( 1 ).jquery ) { - $.each( [ "Width", "Height" ], function( i, name ) { - var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], - type = name.toLowerCase(), - orig = { - innerWidth: $.fn.innerWidth, - innerHeight: $.fn.innerHeight, - outerWidth: $.fn.outerWidth, - outerHeight: $.fn.outerHeight - }; - - function reduce( elem, size, border, margin ) { - $.each( side, function() { - size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; - if ( border ) { - size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; - } - if ( margin ) { - size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; - } - }); - return size; - } - - $.fn[ "inner" + name ] = function( size ) { - if ( size === undefined ) { - return orig[ "inner" + name ].call( this ); - } - - return this.each(function() { - $( this ).css( type, reduce( this, size ) + "px" ); - }); - }; - - $.fn[ "outer" + name] = function( size, margin ) { - if ( typeof size !== "number" ) { - return orig[ "outer" + name ].call( this, size ); - } - - return this.each(function() { - $( this).css( type, reduce( this, size, true, margin ) + "px" ); - }); - }; - }); -} - -// support: jQuery <1.8 -if ( !$.fn.addBack ) { - $.fn.addBack = function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - }; -} - -// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) -if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { - $.fn.removeData = (function( removeData ) { - return function( key ) { - if ( arguments.length ) { - return removeData.call( this, $.camelCase( key ) ); - } else { - return removeData.call( this ); - } - }; - })( $.fn.removeData ); -} - -// deprecated -$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); - -$.fn.extend({ - focus: (function( orig ) { - return function( delay, fn ) { - return typeof delay === "number" ? - this.each(function() { - var elem = this; - setTimeout(function() { - $( elem ).focus(); - if ( fn ) { - fn.call( elem ); - } - }, delay ); - }) : - orig.apply( this, arguments ); - }; - })( $.fn.focus ), - - disableSelection: (function() { - var eventType = "onselectstart" in document.createElement( "div" ) ? - "selectstart" : - "mousedown"; - - return function() { - return this.bind( eventType + ".ui-disableSelection", function( event ) { - event.preventDefault(); - }); - }; - })(), - - enableSelection: function() { - return this.unbind( ".ui-disableSelection" ); - }, - - zIndex: function( zIndex ) { - if ( zIndex !== undefined ) { - return this.css( "zIndex", zIndex ); - } - - if ( this.length ) { - var elem = $( this[ 0 ] ), position, value; - while ( elem.length && elem[ 0 ] !== document ) { - // Ignore z-index if position is set to a value where z-index is ignored by the browser - // This makes behavior of this function consistent across browsers - // WebKit always returns auto if the element is positioned - position = elem.css( "position" ); - if ( position === "absolute" || position === "relative" || position === "fixed" ) { - // IE returns 0 when zIndex is not specified - // other browsers return a string - // we ignore the case of nested elements with an explicit value of 0 - //
- value = parseInt( elem.css( "zIndex" ), 10 ); - if ( !isNaN( value ) && value !== 0 ) { - return value; - } - } - elem = elem.parent(); - } - } - - return 0; - } -}); - -// $.ui.plugin is deprecated. Use $.widget() extensions instead. -$.ui.plugin = { - add: function( module, option, set ) { - var i, - proto = $.ui[ module ].prototype; - for ( i in set ) { - proto.plugins[ i ] = proto.plugins[ i ] || []; - proto.plugins[ i ].push( [ option, set[ i ] ] ); - } - }, - call: function( instance, name, args, allowDisconnected ) { - var i, - set = instance.plugins[ name ]; - - if ( !set ) { - return; - } - - if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { - return; - } - - for ( i = 0; i < set.length; i++ ) { - if ( instance.options[ set[ i ][ 0 ] ] ) { - set[ i ][ 1 ].apply( instance.element, args ); - } - } - } -}; - - -/*! - * jQuery UI Widget 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/jQuery.widget/ - */ - - -var widget_uuid = 0, - widget_slice = Array.prototype.slice; - -$.cleanData = (function( orig ) { - return function( elems ) { - var events, elem, i; - for ( i = 0; (elem = elems[i]) != null; i++ ) { - try { - - // Only trigger remove when necessary to save time - events = $._data( elem, "events" ); - if ( events && events.remove ) { - $( elem ).triggerHandler( "remove" ); - } - - // http://bugs.jquery.com/ticket/8235 - } catch ( e ) {} - } - orig( elems ); - }; -})( $.cleanData ); - -$.widget = function( name, base, prototype ) { - var fullName, existingConstructor, constructor, basePrototype, - // proxiedPrototype allows the provided prototype to remain unmodified - // so that it can be used as a mixin for multiple widgets (#8876) - proxiedPrototype = {}, - namespace = name.split( "." )[ 0 ]; - - name = name.split( "." )[ 1 ]; - fullName = namespace + "-" + name; - - if ( !prototype ) { - prototype = base; - base = $.Widget; - } - - // create selector for plugin - $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { - return !!$.data( elem, fullName ); - }; - - $[ namespace ] = $[ namespace ] || {}; - existingConstructor = $[ namespace ][ name ]; - constructor = $[ namespace ][ name ] = function( options, element ) { - // allow instantiation without "new" keyword - if ( !this._createWidget ) { - return new constructor( options, element ); - } - - // allow instantiation without initializing for simple inheritance - // must use "new" keyword (the code above always passes args) - if ( arguments.length ) { - this._createWidget( options, element ); - } - }; - // extend with the existing constructor to carry over any static properties - $.extend( constructor, existingConstructor, { - version: prototype.version, - // copy the object used to create the prototype in case we need to - // redefine the widget later - _proto: $.extend( {}, prototype ), - // track widgets that inherit from this widget in case this widget is - // redefined after a widget inherits from it - _childConstructors: [] - }); - - basePrototype = new base(); - // we need to make the options hash a property directly on the new instance - // otherwise we'll modify the options hash on the prototype that we're - // inheriting from - basePrototype.options = $.widget.extend( {}, basePrototype.options ); - $.each( prototype, function( prop, value ) { - if ( !$.isFunction( value ) ) { - proxiedPrototype[ prop ] = value; - return; - } - proxiedPrototype[ prop ] = (function() { - var _super = function() { - return base.prototype[ prop ].apply( this, arguments ); - }, - _superApply = function( args ) { - return base.prototype[ prop ].apply( this, args ); - }; - return function() { - var __super = this._super, - __superApply = this._superApply, - returnValue; - - this._super = _super; - this._superApply = _superApply; - - returnValue = value.apply( this, arguments ); - - this._super = __super; - this._superApply = __superApply; - - return returnValue; - }; - })(); - }); - constructor.prototype = $.widget.extend( basePrototype, { - // TODO: remove support for widgetEventPrefix - // always use the name + a colon as the prefix, e.g., draggable:start - // don't prefix for widgets that aren't DOM-based - widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name - }, proxiedPrototype, { - constructor: constructor, - namespace: namespace, - widgetName: name, - widgetFullName: fullName - }); - - // If this widget is being redefined then we need to find all widgets that - // are inheriting from it and redefine all of them so that they inherit from - // the new version of this widget. We're essentially trying to replace one - // level in the prototype chain. - if ( existingConstructor ) { - $.each( existingConstructor._childConstructors, function( i, child ) { - var childPrototype = child.prototype; - - // redefine the child widget using the same prototype that was - // originally used, but inherit from the new version of the base - $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); - }); - // remove the list of existing child constructors from the old constructor - // so the old child constructors can be garbage collected - delete existingConstructor._childConstructors; - } else { - base._childConstructors.push( constructor ); - } - - $.widget.bridge( name, constructor ); - - return constructor; -}; - -$.widget.extend = function( target ) { - var input = widget_slice.call( arguments, 1 ), - inputIndex = 0, - inputLength = input.length, - key, - value; - for ( ; inputIndex < inputLength; inputIndex++ ) { - for ( key in input[ inputIndex ] ) { - value = input[ inputIndex ][ key ]; - if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { - // Clone objects - if ( $.isPlainObject( value ) ) { - target[ key ] = $.isPlainObject( target[ key ] ) ? - $.widget.extend( {}, target[ key ], value ) : - // Don't extend strings, arrays, etc. with objects - $.widget.extend( {}, value ); - // Copy everything else by reference - } else { - target[ key ] = value; - } - } - } - } - return target; -}; - -$.widget.bridge = function( name, object ) { - var fullName = object.prototype.widgetFullName || name; - $.fn[ name ] = function( options ) { - var isMethodCall = typeof options === "string", - args = widget_slice.call( arguments, 1 ), - returnValue = this; - - if ( isMethodCall ) { - this.each(function() { - var methodValue, - instance = $.data( this, fullName ); - if ( options === "instance" ) { - returnValue = instance; - return false; - } - if ( !instance ) { - return $.error( "cannot call methods on " + name + " prior to initialization; " + - "attempted to call method '" + options + "'" ); - } - if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { - return $.error( "no such method '" + options + "' for " + name + " widget instance" ); - } - methodValue = instance[ options ].apply( instance, args ); - if ( methodValue !== instance && methodValue !== undefined ) { - returnValue = methodValue && methodValue.jquery ? - returnValue.pushStack( methodValue.get() ) : - methodValue; - return false; - } - }); - } else { - - // Allow multiple hashes to be passed on init - if ( args.length ) { - options = $.widget.extend.apply( null, [ options ].concat(args) ); - } - - this.each(function() { - var instance = $.data( this, fullName ); - if ( instance ) { - instance.option( options || {} ); - if ( instance._init ) { - instance._init(); - } - } else { - $.data( this, fullName, new object( options, this ) ); - } - }); - } - - return returnValue; - }; -}; - -$.Widget = function( /* options, element */ ) {}; -$.Widget._childConstructors = []; - -$.Widget.prototype = { - widgetName: "widget", - widgetEventPrefix: "", - defaultElement: "
", - options: { - disabled: false, - - // callbacks - create: null - }, - _createWidget: function( options, element ) { - element = $( element || this.defaultElement || this )[ 0 ]; - this.element = $( element ); - this.uuid = widget_uuid++; - this.eventNamespace = "." + this.widgetName + this.uuid; - - this.bindings = $(); - this.hoverable = $(); - this.focusable = $(); - - if ( element !== this ) { - $.data( element, this.widgetFullName, this ); - this._on( true, this.element, { - remove: function( event ) { - if ( event.target === element ) { - this.destroy(); - } - } - }); - this.document = $( element.style ? - // element within the document - element.ownerDocument : - // element is window or document - element.document || element ); - this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); - } - - this.options = $.widget.extend( {}, - this.options, - this._getCreateOptions(), - options ); - - this._create(); - this._trigger( "create", null, this._getCreateEventData() ); - this._init(); - }, - _getCreateOptions: $.noop, - _getCreateEventData: $.noop, - _create: $.noop, - _init: $.noop, - - destroy: function() { - this._destroy(); - // we can probably remove the unbind calls in 2.0 - // all event bindings should go through this._on() - this.element - .unbind( this.eventNamespace ) - .removeData( this.widgetFullName ) - // support: jquery <1.6.3 - // http://bugs.jquery.com/ticket/9413 - .removeData( $.camelCase( this.widgetFullName ) ); - this.widget() - .unbind( this.eventNamespace ) - .removeAttr( "aria-disabled" ) - .removeClass( - this.widgetFullName + "-disabled " + - "ui-state-disabled" ); - - // clean up events and states - this.bindings.unbind( this.eventNamespace ); - this.hoverable.removeClass( "ui-state-hover" ); - this.focusable.removeClass( "ui-state-focus" ); - }, - _destroy: $.noop, - - widget: function() { - return this.element; - }, - - option: function( key, value ) { - var options = key, - parts, - curOption, - i; - - if ( arguments.length === 0 ) { - // don't return a reference to the internal hash - return $.widget.extend( {}, this.options ); - } - - if ( typeof key === "string" ) { - // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } - options = {}; - parts = key.split( "." ); - key = parts.shift(); - if ( parts.length ) { - curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); - for ( i = 0; i < parts.length - 1; i++ ) { - curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; - curOption = curOption[ parts[ i ] ]; - } - key = parts.pop(); - if ( arguments.length === 1 ) { - return curOption[ key ] === undefined ? null : curOption[ key ]; - } - curOption[ key ] = value; - } else { - if ( arguments.length === 1 ) { - return this.options[ key ] === undefined ? null : this.options[ key ]; - } - options[ key ] = value; - } - } - - this._setOptions( options ); - - return this; - }, - _setOptions: function( options ) { - var key; - - for ( key in options ) { - this._setOption( key, options[ key ] ); - } - - return this; - }, - _setOption: function( key, value ) { - this.options[ key ] = value; - - if ( key === "disabled" ) { - this.widget() - .toggleClass( this.widgetFullName + "-disabled", !!value ); - - // If the widget is becoming disabled, then nothing is interactive - if ( value ) { - this.hoverable.removeClass( "ui-state-hover" ); - this.focusable.removeClass( "ui-state-focus" ); - } - } - - return this; - }, - - enable: function() { - return this._setOptions({ disabled: false }); - }, - disable: function() { - return this._setOptions({ disabled: true }); - }, - - _on: function( suppressDisabledCheck, element, handlers ) { - var delegateElement, - instance = this; - - // no suppressDisabledCheck flag, shuffle arguments - if ( typeof suppressDisabledCheck !== "boolean" ) { - handlers = element; - element = suppressDisabledCheck; - suppressDisabledCheck = false; - } - - // no element argument, shuffle and use this.element - if ( !handlers ) { - handlers = element; - element = this.element; - delegateElement = this.widget(); - } else { - element = delegateElement = $( element ); - this.bindings = this.bindings.add( element ); - } - - $.each( handlers, function( event, handler ) { - function handlerProxy() { - // allow widgets to customize the disabled handling - // - disabled as an array instead of boolean - // - disabled class as method for disabling individual parts - if ( !suppressDisabledCheck && - ( instance.options.disabled === true || - $( this ).hasClass( "ui-state-disabled" ) ) ) { - return; - } - return ( typeof handler === "string" ? instance[ handler ] : handler ) - .apply( instance, arguments ); - } - - // copy the guid so direct unbinding works - if ( typeof handler !== "string" ) { - handlerProxy.guid = handler.guid = - handler.guid || handlerProxy.guid || $.guid++; - } - - var match = event.match( /^([\w:-]*)\s*(.*)$/ ), - eventName = match[1] + instance.eventNamespace, - selector = match[2]; - if ( selector ) { - delegateElement.delegate( selector, eventName, handlerProxy ); - } else { - element.bind( eventName, handlerProxy ); - } - }); - }, - - _off: function( element, eventName ) { - eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + - this.eventNamespace; - element.unbind( eventName ).undelegate( eventName ); - - // Clear the stack to avoid memory leaks (#10056) - this.bindings = $( this.bindings.not( element ).get() ); - this.focusable = $( this.focusable.not( element ).get() ); - this.hoverable = $( this.hoverable.not( element ).get() ); - }, - - _delay: function( handler, delay ) { - function handlerProxy() { - return ( typeof handler === "string" ? instance[ handler ] : handler ) - .apply( instance, arguments ); - } - var instance = this; - return setTimeout( handlerProxy, delay || 0 ); - }, - - _hoverable: function( element ) { - this.hoverable = this.hoverable.add( element ); - this._on( element, { - mouseenter: function( event ) { - $( event.currentTarget ).addClass( "ui-state-hover" ); - }, - mouseleave: function( event ) { - $( event.currentTarget ).removeClass( "ui-state-hover" ); - } - }); - }, - - _focusable: function( element ) { - this.focusable = this.focusable.add( element ); - this._on( element, { - focusin: function( event ) { - $( event.currentTarget ).addClass( "ui-state-focus" ); - }, - focusout: function( event ) { - $( event.currentTarget ).removeClass( "ui-state-focus" ); - } - }); - }, - - _trigger: function( type, event, data ) { - var prop, orig, - callback = this.options[ type ]; - - data = data || {}; - event = $.Event( event ); - event.type = ( type === this.widgetEventPrefix ? - type : - this.widgetEventPrefix + type ).toLowerCase(); - // the original event may come from any element - // so we need to reset the target on the new event - event.target = this.element[ 0 ]; - - // copy original event properties over to the new event - orig = event.originalEvent; - if ( orig ) { - for ( prop in orig ) { - if ( !( prop in event ) ) { - event[ prop ] = orig[ prop ]; - } - } - } - - this.element.trigger( event, data ); - return !( $.isFunction( callback ) && - callback.apply( this.element[0], [ event ].concat( data ) ) === false || - event.isDefaultPrevented() ); - } -}; - -$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { - $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { - if ( typeof options === "string" ) { - options = { effect: options }; - } - var hasOptions, - effectName = !options ? - method : - options === true || typeof options === "number" ? - defaultEffect : - options.effect || defaultEffect; - options = options || {}; - if ( typeof options === "number" ) { - options = { duration: options }; - } - hasOptions = !$.isEmptyObject( options ); - options.complete = callback; - if ( options.delay ) { - element.delay( options.delay ); - } - if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { - element[ method ]( options ); - } else if ( effectName !== method && element[ effectName ] ) { - element[ effectName ]( options.duration, options.easing, callback ); - } else { - element.queue(function( next ) { - $( this )[ method ](); - if ( callback ) { - callback.call( element[ 0 ] ); - } - next(); - }); - } - }; -}); - -var widget = $.widget; - - -/*! - * jQuery UI Mouse 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/mouse/ - */ - - -var mouseHandled = false; -$( document ).mouseup( function() { - mouseHandled = false; -}); - -var mouse = $.widget("ui.mouse", { - version: "1.11.4", - options: { - cancel: "input,textarea,button,select,option", - distance: 1, - delay: 0 - }, - _mouseInit: function() { - var that = this; - - this.element - .bind("mousedown." + this.widgetName, function(event) { - return that._mouseDown(event); - }) - .bind("click." + this.widgetName, function(event) { - if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { - $.removeData(event.target, that.widgetName + ".preventClickEvent"); - event.stopImmediatePropagation(); - return false; - } - }); - - this.started = false; - }, - - // TODO: make sure destroying one instance of mouse doesn't mess with - // other instances of mouse - _mouseDestroy: function() { - this.element.unbind("." + this.widgetName); - if ( this._mouseMoveDelegate ) { - this.document - .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) - .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); - } - }, - - _mouseDown: function(event) { - // don't let more than one widget handle mouseStart - if ( mouseHandled ) { - return; - } - - this._mouseMoved = false; - - // we may have missed mouseup (out of window) - (this._mouseStarted && this._mouseUp(event)); - - this._mouseDownEvent = event; - - var that = this, - btnIsLeft = (event.which === 1), - // event.target.nodeName works around a bug in IE 8 with - // disabled inputs (#7620) - elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); - if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { - return true; - } - - this.mouseDelayMet = !this.options.delay; - if (!this.mouseDelayMet) { - this._mouseDelayTimer = setTimeout(function() { - that.mouseDelayMet = true; - }, this.options.delay); - } - - if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { - this._mouseStarted = (this._mouseStart(event) !== false); - if (!this._mouseStarted) { - event.preventDefault(); - return true; - } - } - - // Click event may never have fired (Gecko & Opera) - if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { - $.removeData(event.target, this.widgetName + ".preventClickEvent"); - } - - // these delegates are required to keep context - this._mouseMoveDelegate = function(event) { - return that._mouseMove(event); - }; - this._mouseUpDelegate = function(event) { - return that._mouseUp(event); - }; - - this.document - .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) - .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); - - event.preventDefault(); - - mouseHandled = true; - return true; - }, - - _mouseMove: function(event) { - // Only check for mouseups outside the document if you've moved inside the document - // at least once. This prevents the firing of mouseup in the case of IE<9, which will - // fire a mousemove event if content is placed under the cursor. See #7778 - // Support: IE <9 - if ( this._mouseMoved ) { - // IE mouseup check - mouseup happened when mouse was out of window - if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { - return this._mouseUp(event); - - // Iframe mouseup check - mouseup occurred in another document - } else if ( !event.which ) { - return this._mouseUp( event ); - } - } - - if ( event.which || event.button ) { - this._mouseMoved = true; - } - - if (this._mouseStarted) { - this._mouseDrag(event); - return event.preventDefault(); - } - - if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { - this._mouseStarted = - (this._mouseStart(this._mouseDownEvent, event) !== false); - (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); - } - - return !this._mouseStarted; - }, - - _mouseUp: function(event) { - this.document - .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) - .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); - - if (this._mouseStarted) { - this._mouseStarted = false; - - if (event.target === this._mouseDownEvent.target) { - $.data(event.target, this.widgetName + ".preventClickEvent", true); - } - - this._mouseStop(event); - } - - mouseHandled = false; - return false; - }, - - _mouseDistanceMet: function(event) { - return (Math.max( - Math.abs(this._mouseDownEvent.pageX - event.pageX), - Math.abs(this._mouseDownEvent.pageY - event.pageY) - ) >= this.options.distance - ); - }, - - _mouseDelayMet: function(/* event */) { - return this.mouseDelayMet; - }, - - // These are placeholder methods, to be overriden by extending plugin - _mouseStart: function(/* event */) {}, - _mouseDrag: function(/* event */) {}, - _mouseStop: function(/* event */) {}, - _mouseCapture: function(/* event */) { return true; } -}); - - -/*! - * jQuery UI Position 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/position/ - */ - -(function() { - -$.ui = $.ui || {}; - -var cachedScrollbarWidth, supportsOffsetFractions, - max = Math.max, - abs = Math.abs, - round = Math.round, - rhorizontal = /left|center|right/, - rvertical = /top|center|bottom/, - roffset = /[\+\-]\d+(\.[\d]+)?%?/, - rposition = /^\w+/, - rpercent = /%$/, - _position = $.fn.position; - -function getOffsets( offsets, width, height ) { - return [ - parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), - parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) - ]; -} - -function parseCss( element, property ) { - return parseInt( $.css( element, property ), 10 ) || 0; -} - -function getDimensions( elem ) { - var raw = elem[0]; - if ( raw.nodeType === 9 ) { - return { - width: elem.width(), - height: elem.height(), - offset: { top: 0, left: 0 } - }; - } - if ( $.isWindow( raw ) ) { - return { - width: elem.width(), - height: elem.height(), - offset: { top: elem.scrollTop(), left: elem.scrollLeft() } - }; - } - if ( raw.preventDefault ) { - return { - width: 0, - height: 0, - offset: { top: raw.pageY, left: raw.pageX } - }; - } - return { - width: elem.outerWidth(), - height: elem.outerHeight(), - offset: elem.offset() - }; -} - -$.position = { - scrollbarWidth: function() { - if ( cachedScrollbarWidth !== undefined ) { - return cachedScrollbarWidth; - } - var w1, w2, - div = $( "
" ), - innerDiv = div.children()[0]; - - $( "body" ).append( div ); - w1 = innerDiv.offsetWidth; - div.css( "overflow", "scroll" ); - - w2 = innerDiv.offsetWidth; - - if ( w1 === w2 ) { - w2 = div[0].clientWidth; - } - - div.remove(); - - return (cachedScrollbarWidth = w1 - w2); - }, - getScrollInfo: function( within ) { - var overflowX = within.isWindow || within.isDocument ? "" : - within.element.css( "overflow-x" ), - overflowY = within.isWindow || within.isDocument ? "" : - within.element.css( "overflow-y" ), - hasOverflowX = overflowX === "scroll" || - ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), - hasOverflowY = overflowY === "scroll" || - ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); - return { - width: hasOverflowY ? $.position.scrollbarWidth() : 0, - height: hasOverflowX ? $.position.scrollbarWidth() : 0 - }; - }, - getWithinInfo: function( element ) { - var withinElement = $( element || window ), - isWindow = $.isWindow( withinElement[0] ), - isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; - return { - element: withinElement, - isWindow: isWindow, - isDocument: isDocument, - offset: withinElement.offset() || { left: 0, top: 0 }, - scrollLeft: withinElement.scrollLeft(), - scrollTop: withinElement.scrollTop(), - - // support: jQuery 1.6.x - // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows - width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), - height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() - }; - } -}; - -$.fn.position = function( options ) { - if ( !options || !options.of ) { - return _position.apply( this, arguments ); - } - - // make a copy, we don't want to modify arguments - options = $.extend( {}, options ); - - var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, - target = $( options.of ), - within = $.position.getWithinInfo( options.within ), - scrollInfo = $.position.getScrollInfo( within ), - collision = ( options.collision || "flip" ).split( " " ), - offsets = {}; - - dimensions = getDimensions( target ); - if ( target[0].preventDefault ) { - // force left top to allow flipping - options.at = "left top"; - } - targetWidth = dimensions.width; - targetHeight = dimensions.height; - targetOffset = dimensions.offset; - // clone to reuse original targetOffset later - basePosition = $.extend( {}, targetOffset ); - - // force my and at to have valid horizontal and vertical positions - // if a value is missing or invalid, it will be converted to center - $.each( [ "my", "at" ], function() { - var pos = ( options[ this ] || "" ).split( " " ), - horizontalOffset, - verticalOffset; - - if ( pos.length === 1) { - pos = rhorizontal.test( pos[ 0 ] ) ? - pos.concat( [ "center" ] ) : - rvertical.test( pos[ 0 ] ) ? - [ "center" ].concat( pos ) : - [ "center", "center" ]; - } - pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; - pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; - - // calculate offsets - horizontalOffset = roffset.exec( pos[ 0 ] ); - verticalOffset = roffset.exec( pos[ 1 ] ); - offsets[ this ] = [ - horizontalOffset ? horizontalOffset[ 0 ] : 0, - verticalOffset ? verticalOffset[ 0 ] : 0 - ]; - - // reduce to just the positions without the offsets - options[ this ] = [ - rposition.exec( pos[ 0 ] )[ 0 ], - rposition.exec( pos[ 1 ] )[ 0 ] - ]; - }); - - // normalize collision option - if ( collision.length === 1 ) { - collision[ 1 ] = collision[ 0 ]; - } - - if ( options.at[ 0 ] === "right" ) { - basePosition.left += targetWidth; - } else if ( options.at[ 0 ] === "center" ) { - basePosition.left += targetWidth / 2; - } - - if ( options.at[ 1 ] === "bottom" ) { - basePosition.top += targetHeight; - } else if ( options.at[ 1 ] === "center" ) { - basePosition.top += targetHeight / 2; - } - - atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); - basePosition.left += atOffset[ 0 ]; - basePosition.top += atOffset[ 1 ]; - - return this.each(function() { - var collisionPosition, using, - elem = $( this ), - elemWidth = elem.outerWidth(), - elemHeight = elem.outerHeight(), - marginLeft = parseCss( this, "marginLeft" ), - marginTop = parseCss( this, "marginTop" ), - collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, - collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, - position = $.extend( {}, basePosition ), - myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); - - if ( options.my[ 0 ] === "right" ) { - position.left -= elemWidth; - } else if ( options.my[ 0 ] === "center" ) { - position.left -= elemWidth / 2; - } - - if ( options.my[ 1 ] === "bottom" ) { - position.top -= elemHeight; - } else if ( options.my[ 1 ] === "center" ) { - position.top -= elemHeight / 2; - } - - position.left += myOffset[ 0 ]; - position.top += myOffset[ 1 ]; - - // if the browser doesn't support fractions, then round for consistent results - if ( !supportsOffsetFractions ) { - position.left = round( position.left ); - position.top = round( position.top ); - } - - collisionPosition = { - marginLeft: marginLeft, - marginTop: marginTop - }; - - $.each( [ "left", "top" ], function( i, dir ) { - if ( $.ui.position[ collision[ i ] ] ) { - $.ui.position[ collision[ i ] ][ dir ]( position, { - targetWidth: targetWidth, - targetHeight: targetHeight, - elemWidth: elemWidth, - elemHeight: elemHeight, - collisionPosition: collisionPosition, - collisionWidth: collisionWidth, - collisionHeight: collisionHeight, - offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], - my: options.my, - at: options.at, - within: within, - elem: elem - }); - } - }); - - if ( options.using ) { - // adds feedback as second argument to using callback, if present - using = function( props ) { - var left = targetOffset.left - position.left, - right = left + targetWidth - elemWidth, - top = targetOffset.top - position.top, - bottom = top + targetHeight - elemHeight, - feedback = { - target: { - element: target, - left: targetOffset.left, - top: targetOffset.top, - width: targetWidth, - height: targetHeight - }, - element: { - element: elem, - left: position.left, - top: position.top, - width: elemWidth, - height: elemHeight - }, - horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", - vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" - }; - if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { - feedback.horizontal = "center"; - } - if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { - feedback.vertical = "middle"; - } - if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { - feedback.important = "horizontal"; - } else { - feedback.important = "vertical"; - } - options.using.call( this, props, feedback ); - }; - } - - elem.offset( $.extend( position, { using: using } ) ); - }); -}; - -$.ui.position = { - fit: { - left: function( position, data ) { - var within = data.within, - withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, - outerWidth = within.width, - collisionPosLeft = position.left - data.collisionPosition.marginLeft, - overLeft = withinOffset - collisionPosLeft, - overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, - newOverRight; - - // element is wider than within - if ( data.collisionWidth > outerWidth ) { - // element is initially over the left side of within - if ( overLeft > 0 && overRight <= 0 ) { - newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; - position.left += overLeft - newOverRight; - // element is initially over right side of within - } else if ( overRight > 0 && overLeft <= 0 ) { - position.left = withinOffset; - // element is initially over both left and right sides of within - } else { - if ( overLeft > overRight ) { - position.left = withinOffset + outerWidth - data.collisionWidth; - } else { - position.left = withinOffset; - } - } - // too far left -> align with left edge - } else if ( overLeft > 0 ) { - position.left += overLeft; - // too far right -> align with right edge - } else if ( overRight > 0 ) { - position.left -= overRight; - // adjust based on position and margin - } else { - position.left = max( position.left - collisionPosLeft, position.left ); - } - }, - top: function( position, data ) { - var within = data.within, - withinOffset = within.isWindow ? within.scrollTop : within.offset.top, - outerHeight = data.within.height, - collisionPosTop = position.top - data.collisionPosition.marginTop, - overTop = withinOffset - collisionPosTop, - overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, - newOverBottom; - - // element is taller than within - if ( data.collisionHeight > outerHeight ) { - // element is initially over the top of within - if ( overTop > 0 && overBottom <= 0 ) { - newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; - position.top += overTop - newOverBottom; - // element is initially over bottom of within - } else if ( overBottom > 0 && overTop <= 0 ) { - position.top = withinOffset; - // element is initially over both top and bottom of within - } else { - if ( overTop > overBottom ) { - position.top = withinOffset + outerHeight - data.collisionHeight; - } else { - position.top = withinOffset; - } - } - // too far up -> align with top - } else if ( overTop > 0 ) { - position.top += overTop; - // too far down -> align with bottom edge - } else if ( overBottom > 0 ) { - position.top -= overBottom; - // adjust based on position and margin - } else { - position.top = max( position.top - collisionPosTop, position.top ); - } - } - }, - flip: { - left: function( position, data ) { - var within = data.within, - withinOffset = within.offset.left + within.scrollLeft, - outerWidth = within.width, - offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, - collisionPosLeft = position.left - data.collisionPosition.marginLeft, - overLeft = collisionPosLeft - offsetLeft, - overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, - myOffset = data.my[ 0 ] === "left" ? - -data.elemWidth : - data.my[ 0 ] === "right" ? - data.elemWidth : - 0, - atOffset = data.at[ 0 ] === "left" ? - data.targetWidth : - data.at[ 0 ] === "right" ? - -data.targetWidth : - 0, - offset = -2 * data.offset[ 0 ], - newOverRight, - newOverLeft; - - if ( overLeft < 0 ) { - newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; - if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { - position.left += myOffset + atOffset + offset; - } - } else if ( overRight > 0 ) { - newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; - if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { - position.left += myOffset + atOffset + offset; - } - } - }, - top: function( position, data ) { - var within = data.within, - withinOffset = within.offset.top + within.scrollTop, - outerHeight = within.height, - offsetTop = within.isWindow ? within.scrollTop : within.offset.top, - collisionPosTop = position.top - data.collisionPosition.marginTop, - overTop = collisionPosTop - offsetTop, - overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, - top = data.my[ 1 ] === "top", - myOffset = top ? - -data.elemHeight : - data.my[ 1 ] === "bottom" ? - data.elemHeight : - 0, - atOffset = data.at[ 1 ] === "top" ? - data.targetHeight : - data.at[ 1 ] === "bottom" ? - -data.targetHeight : - 0, - offset = -2 * data.offset[ 1 ], - newOverTop, - newOverBottom; - if ( overTop < 0 ) { - newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; - if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { - position.top += myOffset + atOffset + offset; - } - } else if ( overBottom > 0 ) { - newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; - if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { - position.top += myOffset + atOffset + offset; - } - } - } - }, - flipfit: { - left: function() { - $.ui.position.flip.left.apply( this, arguments ); - $.ui.position.fit.left.apply( this, arguments ); - }, - top: function() { - $.ui.position.flip.top.apply( this, arguments ); - $.ui.position.fit.top.apply( this, arguments ); - } - } -}; - -// fraction support test -(function() { - var testElement, testElementParent, testElementStyle, offsetLeft, i, - body = document.getElementsByTagName( "body" )[ 0 ], - div = document.createElement( "div" ); - - //Create a "fake body" for testing based on method used in jQuery.support - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0, - background: "none" - }; - if ( body ) { - $.extend( testElementStyle, { - position: "absolute", - left: "-1000px", - top: "-1000px" - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || document.documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - div.style.cssText = "position: absolute; left: 10.7432222px;"; - - offsetLeft = $( div ).offset().left; - supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; - - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); -})(); - -})(); - -var position = $.ui.position; - - -/*! - * jQuery UI Draggable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/draggable/ - */ - - -$.widget("ui.draggable", $.ui.mouse, { - version: "1.11.4", - widgetEventPrefix: "drag", - options: { - addClasses: true, - appendTo: "parent", - axis: false, - connectToSortable: false, - containment: false, - cursor: "auto", - cursorAt: false, - grid: false, - handle: false, - helper: "original", - iframeFix: false, - opacity: false, - refreshPositions: false, - revert: false, - revertDuration: 500, - scope: "default", - scroll: true, - scrollSensitivity: 20, - scrollSpeed: 20, - snap: false, - snapMode: "both", - snapTolerance: 20, - stack: false, - zIndex: false, - - // callbacks - drag: null, - start: null, - stop: null - }, - _create: function() { - - if ( this.options.helper === "original" ) { - this._setPositionRelative(); - } - if (this.options.addClasses){ - this.element.addClass("ui-draggable"); - } - if (this.options.disabled){ - this.element.addClass("ui-draggable-disabled"); - } - this._setHandleClassName(); - - this._mouseInit(); - }, - - _setOption: function( key, value ) { - this._super( key, value ); - if ( key === "handle" ) { - this._removeHandleClassName(); - this._setHandleClassName(); - } - }, - - _destroy: function() { - if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { - this.destroyOnClear = true; - return; - } - this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); - this._removeHandleClassName(); - this._mouseDestroy(); - }, - - _mouseCapture: function(event) { - var o = this.options; - - this._blurActiveElement( event ); - - // among others, prevent a drag on a resizable-handle - if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { - return false; - } - - //Quit if we're not on a valid handle - this.handle = this._getHandle(event); - if (!this.handle) { - return false; - } - - this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); - - return true; - - }, - - _blockFrames: function( selector ) { - this.iframeBlocks = this.document.find( selector ).map(function() { - var iframe = $( this ); - - return $( "
" ) - .css( "position", "absolute" ) - .appendTo( iframe.parent() ) - .outerWidth( iframe.outerWidth() ) - .outerHeight( iframe.outerHeight() ) - .offset( iframe.offset() )[ 0 ]; - }); - }, - - _unblockFrames: function() { - if ( this.iframeBlocks ) { - this.iframeBlocks.remove(); - delete this.iframeBlocks; - } - }, - - _blurActiveElement: function( event ) { - var document = this.document[ 0 ]; - - // Only need to blur if the event occurred on the draggable itself, see #10527 - if ( !this.handleElement.is( event.target ) ) { - return; - } - - // support: IE9 - // IE9 throws an "Unspecified error" accessing document.activeElement from an ', - - // Preload iframe before displaying it - // This allows to calculate iframe content width and height - // (note: Due to "Same Origin Policy", you can't get cross domain data). - preload : true, - - // Custom CSS styling for iframe wrapping element - // You can use this to set custom iframe dimensions - css : {}, - - // Iframe tag attributes - attr : { - scrolling : 'auto' - } - - }, - - // Default content type if cannot be detected automatically - defaultType : 'image', - - // Open/close animation type - // Possible values: - // false - disable - // "zoom" - zoom images from/to thumbnail - // "fade" - // "zoom-in-out" - // - animationEffect : "zoom", - - // Duration in ms for open/close animation - animationDuration : 500, - - // Should image change opacity while zooming - // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios - zoomOpacity : "auto", - - // Transition effect between slides - // - // Possible values: - // false - disable - // "fade' - // "slide' - // "circular' - // "tube' - // "zoom-in-out' - // "rotate' - // - transitionEffect : "fade", - - // Duration in ms for transition animation - transitionDuration : 366, - - // Custom CSS class for slide element - slideClass : '', - - // Custom CSS class for layout - baseClass : '', - - // Base template for layout - baseTpl : - '', - - // Loading indicator template - spinnerTpl : '
', - - // Error message template - errorTpl : '

{{ERROR}}

', - - btnTpl : { - - download : '
' + - '' + - '' + - '' + - '', - - zoom : '', - - close : '', - - // This small close button will be appended to your html/inline/ajax content by default, - // if "smallBtn" option is not set to false - smallBtn : '', - - // Arrows - arrowLeft : '', - - arrowRight : '' - }, - - // Container is injected into this element - parentEl : 'body', - - - // Focus handling - // ============== - - // Try to focus on the first focusable element after opening - autoFocus : false, - - // Put focus back to active element after closing - backFocus : true, - - // Do not let user to focus on element outside modal content - trapFocus : true, - - - // Module specific options - // ======================= - - fullScreen : { - autoStart : false, - }, - - // Set `touch: false` to disable dragging/swiping - touch : { - vertical : true, // Allow to drag content vertically - momentum : true // Continue movement after releasing mouse/touch when panning - }, - - // Hash value when initializing manually, - // set `false` to disable hash change - hash : null, - - // Customize or add new media types - // Example: - /* - media : { - youtube : { - params : { - autoplay : 0 - } - } - } - */ - media : {}, - - slideShow : { - autoStart : false, - speed : 4000 - }, - - thumbs : { - autoStart : false, // Display thumbnails on opening - hideOnClose : true, // Hide thumbnail grid when closing animation starts - parentEl : '.fancybox-container', // Container is injected into this element - axis : 'y' // Vertical (y) or horizontal (x) scrolling - }, - - // Use mousewheel to navigate gallery - // If 'auto' - enabled for images only - wheel : 'auto', - - // Callbacks - //========== - - // See Documentation/API/Events for more information - // Example: - /* - afterShow: function( instance, current ) { - console.info( 'Clicked element:' ); - console.info( current.opts.$orig ); - } - */ - - onInit : $.noop, // When instance has been initialized - - beforeLoad : $.noop, // Before the content of a slide is being loaded - afterLoad : $.noop, // When the content of a slide is done loading - - beforeShow : $.noop, // Before open animation starts - afterShow : $.noop, // When content is done loading and animating - - beforeClose : $.noop, // Before the instance attempts to close. Return false to cancel the close. - afterClose : $.noop, // After instance has been closed - - onActivate : $.noop, // When instance is brought to front - onDeactivate : $.noop, // When other instance has been activated - - - // Interaction - // =========== - - // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, - // each option can be string or method that returns value. - // - // Possible values: - // "close" - close instance - // "next" - move to next gallery item - // "nextOrClose" - move to next gallery item or close if gallery has only one item - // "toggleControls" - show/hide controls - // "zoom" - zoom image (if loaded) - // false - do nothing - - // Clicked on the content - clickContent : function( current, event ) { - return current.type === 'image' ? 'zoom' : false; - }, - - // Clicked on the slide - clickSlide : 'close', - - // Clicked on the background (backdrop) element - clickOutside : 'close', - - // Same as previous two, but for double click - dblclickContent : false, - dblclickSlide : false, - dblclickOutside : false, - - - // Custom options when mobile device is detected - // ============================================= - - mobile : { - idleTime : false, - margin : 0, - - clickContent : function( current, event ) { - return current.type === 'image' ? 'toggleControls' : false; - }, - clickSlide : function( current, event ) { - return current.type === 'image' ? 'toggleControls' : 'close'; - }, - dblclickContent : function( current, event ) { - return current.type === 'image' ? 'zoom' : false; - }, - dblclickSlide : function( current, event ) { - return current.type === 'image' ? 'zoom' : false; - } - }, - - - // Internationalization - // ============ - - lang : 'en', - i18n : { - 'en' : { - CLOSE : 'Close', - NEXT : 'Next', - PREV : 'Previous', - ERROR : 'The requested content cannot be loaded.
Please try again later.', - PLAY_START : 'Start slideshow', - PLAY_STOP : 'Pause slideshow', - FULL_SCREEN : 'Full screen', - THUMBS : 'Thumbnails', - DOWNLOAD : 'Download', - SHARE : 'Share', - ZOOM : 'Zoom' - }, - 'de' : { - CLOSE : 'Schliessen', - NEXT : 'Weiter', - PREV : 'Zurück', - ERROR : 'Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.', - PLAY_START : 'Diaschau starten', - PLAY_STOP : 'Diaschau beenden', - FULL_SCREEN : 'Vollbild', - THUMBS : 'Vorschaubilder', - DOWNLOAD : 'Herunterladen', - SHARE : 'Teilen', - ZOOM : 'Maßstab' - } - } - - }; - - // Few useful variables and methods - // ================================ - - var $W = $(window); - var $D = $(document); - - var called = 0; - - - // Check if an object is a jQuery object and not a native JavaScript object - // ======================================================================== - - var isQuery = function ( obj ) { - return obj && obj.hasOwnProperty && obj instanceof $; - }; - - - // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" - // =============================================================================== - - var requestAFrame = (function () { - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - // if all else fails, use setTimeout - function (callback) { - return window.setTimeout(callback, 1000 / 60); - }; - })(); - - - // Detect the supported transition-end event property name - // ======================================================= - - var transitionEnd = (function () { - var t, el = document.createElement("fakeelement"); - - var transitions = { - "transition" : "transitionend", - "OTransition" : "oTransitionEnd", - "MozTransition" : "transitionend", - "WebkitTransition": "webkitTransitionEnd" - }; - - for (t in transitions) { - if (el.style[t] !== undefined){ - return transitions[t]; - } - } - - return 'transitionend'; - })(); - - - // Force redraw on an element. - // This helps in cases where the browser doesn't redraw an updated element properly. - // ================================================================================= - - var forceRedraw = function( $el ) { - return ( $el && $el.length && $el[0].offsetHeight ); - }; - - - // Class definition - // ================ - - var FancyBox = function( content, opts, index ) { - var self = this; - - self.opts = $.extend( true, { index : index }, $.fancybox.defaults, opts || {} ); - - if ( $.fancybox.isMobile ) { - self.opts = $.extend( true, {}, self.opts, self.opts.mobile ); - } - - // Exclude buttons option from deep merging - if ( opts && $.isArray( opts.buttons ) ) { - self.opts.buttons = opts.buttons; - } - - self.id = self.opts.id || ++called; - self.group = []; - - self.currIndex = parseInt( self.opts.index, 10 ) || 0; - self.prevIndex = null; - - self.prevPos = null; - self.currPos = 0; - - self.firstRun = null; - - // Create group elements from original item collection - self.createGroup( content ); - - if ( !self.group.length ) { - return; - } - - // Save last active element and current scroll position - self.$lastFocus = $(document.activeElement).blur(); - - // Collection of gallery objects - self.slides = {}; - - self.init(); - }; - - $.extend(FancyBox.prototype, { - - // Create DOM structure - // ==================== - - init : function() { - var self = this, - firstItem = self.group[ self.currIndex ], - firstItemOpts = firstItem.opts, - scrollbarWidth = $.fancybox.scrollbarWidth, - $scrollDiv, - $container, - buttonStr; - - self.scrollTop = $D.scrollTop(); - self.scrollLeft = $D.scrollLeft(); - - - // Hide scrollbars - // =============== - - if ( !$.fancybox.getInstance() ) { - - $( 'body' ).addClass( 'fancybox-active' ); - - // iOS hack - if ( /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream ) { - - // iOS has problems for input elements inside fixed containers, - // the workaround is to apply `position: fixed` to `` element, - // unfortunately, this makes it lose the scrollbars and forces address bar to appear. - - if ( firstItem.type !== 'image' ) { - $( 'body' ).css( 'top', $( 'body' ).scrollTop() * -1 ).addClass( 'fancybox-iosfix' ); - } - - } else if ( !$.fancybox.isMobile && document.body.scrollHeight > window.innerHeight ) { - - if ( scrollbarWidth === undefined ) { - $scrollDiv = $('
').appendTo( 'body' ); - - scrollbarWidth = $.fancybox.scrollbarWidth = $scrollDiv[0].offsetWidth - $scrollDiv[0].clientWidth; - - $scrollDiv.remove(); - } - - $( 'head' ).append( '' ); - $( 'body' ).addClass( 'compensate-for-scrollbar' ); - } - } - - - // Build html markup and set references - // ==================================== - - // Build html code for buttons and insert into main template - buttonStr = ''; - - $.each( firstItemOpts.buttons, function( index, value ) { - buttonStr += ( firstItemOpts.btnTpl[ value ] || '' ); - }); - - // Create markup from base template, it will be initially hidden to - // avoid unnecessary work like painting while initializing is not complete - $container = $( - self.translate( self, - firstItemOpts.baseTpl - .replace( '\{\{buttons\}\}', buttonStr ) - .replace( '\{\{arrows\}\}', firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight ) - ) - ) - .attr( 'id', 'fancybox-container-' + self.id ) - .addClass( 'fancybox-is-hidden' ) - .addClass( firstItemOpts.baseClass ) - .data( 'FancyBox', self ) - .appendTo( firstItemOpts.parentEl ); - - // Create object holding references to jQuery wrapped nodes - self.$refs = { - container : $container - }; - - [ 'bg', 'inner', 'infobar', 'toolbar', 'stage', 'caption', 'navigation' ].forEach(function(item) { - self.$refs[ item ] = $container.find( '.fancybox-' + item ); - }); - - self.trigger( 'onInit' ); - - // Enable events, deactive previous instances - self.activate(); - - // Build slides, load and reveal content - self.jumpTo( self.currIndex ); - }, - - - // Simple i18n support - replaces object keys found in template - // with corresponding values - // ============================================================ - - translate : function( obj, str ) { - var arr = obj.opts.i18n[ obj.opts.lang ]; - - return str.replace(/\{\{(\w+)\}\}/g, function(match, n) { - var value = arr[n]; - - if ( value === undefined ) { - return match; - } - - return value; - }); - }, - - // Create array of gally item objects - // Check if each object has valid type and content - // =============================================== - - createGroup : function ( content ) { - var self = this; - var items = $.makeArray( content ); - - $.each(items, function( i, item ) { - var obj = {}, - opts = {}, - $item, - type, - found, - src, - srcParts; - - // Step 1 - Make sure we have an object - // ==================================== - - if ( $.isPlainObject( item ) ) { - - // We probably have manual usage here, something like - // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) - - obj = item; - opts = item.opts || item; - - } else if ( $.type( item ) === 'object' && $( item ).length ) { - - // Here we probably have jQuery collection returned by some selector - $item = $( item ); - - opts = $item.data(); - opts = $.extend( {}, opts, opts.options || {} ); - - // Here we store clicked element - opts.$orig = $item; - - obj.src = opts.src || $item.attr( 'href' ); - - // Assume that simple syntax is used, for example: - // `$.fancybox.open( $("#test"), {} );` - if ( !obj.type && !obj.src ) { - obj.type = 'inline'; - obj.src = item; - } - - } else { - - // Assume we have a simple html code, for example: - // $.fancybox.open( '

Hi!

' ); - - obj = { - type : 'html', - src : item + '' - }; - - } - - // Each gallery object has full collection of options - obj.opts = $.extend( true, {}, self.opts, opts ); - - // Do not merge buttons array - if ( $.isArray( opts.buttons ) ) { - obj.opts.buttons = opts.buttons; - } - - - // Step 2 - Make sure we have content type, if not - try to guess - // ============================================================== - - type = obj.type || obj.opts.type; - src = obj.src || ''; - - if ( !type && src ) { - if ( src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i) ) { - type = 'image'; - - } else if ( src.match(/\.(pdf)((\?|#).*)?$/i) ) { - type = 'pdf'; - - } else if ( found = src.match(/\.(mp4|mov|ogv)((\?|#).*)?$/i) ) { - type = 'video'; - - if ( !obj.opts.videoFormat ) { - obj.opts.videoFormat = 'video/' + ( found[1] === 'ogv' ? 'ogg' : found[1] ); - } - - } else if ( src.charAt(0) === '#' ) { - type = 'inline'; - } - } - - if ( type ) { - obj.type = type; - - } else { - self.trigger( 'objectNeedsType', obj ); - } - - - // Step 3 - Some adjustments - // ========================= - - obj.index = self.group.length; - - // Check if $orig and $thumb objects exist - if ( obj.opts.$orig && !obj.opts.$orig.length ) { - delete obj.opts.$orig; - } - - if ( !obj.opts.$thumb && obj.opts.$orig ) { - obj.opts.$thumb = obj.opts.$orig.find( 'img:first' ); - } - - if ( obj.opts.$thumb && !obj.opts.$thumb.length ) { - delete obj.opts.$thumb; - } - - // "caption" is a "special" option, it can be used to customize caption per gallery item .. - if ( $.type( obj.opts.caption ) === 'function' ) { - obj.opts.caption = obj.opts.caption.apply( item, [ self, obj ] ); - } - - if ( $.type( self.opts.caption ) === 'function' ) { - obj.opts.caption = self.opts.caption.apply( item, [ self, obj ] ); - } - - // Make sure we have caption as a string or jQuery object - if ( !( obj.opts.caption instanceof $ ) ) { - obj.opts.caption = obj.opts.caption === undefined ? '' : obj.opts.caption + ''; - } - - // Check if url contains "filter" used to filter the content - // Example: "ajax.html #something" - if ( type === 'ajax' ) { - srcParts = src.split(/\s+/, 2); - - if ( srcParts.length > 1 ) { - obj.src = srcParts.shift(); - - obj.opts.filter = srcParts.shift(); - } - } - - if ( obj.opts.smallBtn == 'auto' ) { - - if ( $.inArray( type, ['html', 'inline', 'ajax'] ) > -1 ) { - obj.opts.toolbar = false; - obj.opts.smallBtn = true; - - } else { - obj.opts.smallBtn = false; - } - - } - - // If the type is "pdf", then simply load file into iframe - if ( type === 'pdf' ) { - obj.type = 'iframe'; - - obj.opts.iframe.preload = false; - } - - // Hide all buttons and disable interactivity for modal items - if ( obj.opts.modal ) { - - obj.opts = $.extend(true, obj.opts, { - // Remove buttons - infobar : 0, - toolbar : 0, - - smallBtn : 0, - - // Disable keyboard navigation - keyboard : 0, - - // Disable some modules - slideShow : 0, - fullScreen : 0, - thumbs : 0, - touch : 0, - - // Disable click event handlers - clickContent : false, - clickSlide : false, - clickOutside : false, - dblclickContent : false, - dblclickSlide : false, - dblclickOutside : false - }); - - } - - // Step 4 - Add processed object to group - // ====================================== - - self.group.push( obj ); - - }); - - }, - - - // Attach an event handler functions for: - // - navigation buttons - // - browser scrolling, resizing; - // - focusing - // - keyboard - // - detect idle - // ====================================== - - addEvents : function() { - var self = this; - - self.removeEvents(); - - // Make navigation elements clickable - self.$refs.container.on('click.fb-close', '[data-fancybox-close]', function(e) { - e.stopPropagation(); - e.preventDefault(); - - self.close( e ); - - }).on( 'click.fb-prev touchend.fb-prev', '[data-fancybox-prev]', function(e) { - e.stopPropagation(); - e.preventDefault(); - - self.previous(); - - }).on( 'click.fb-next touchend.fb-next', '[data-fancybox-next]', function(e) { - e.stopPropagation(); - e.preventDefault(); - - self.next(); - - }).on( 'click.fb', '[data-fancybox-zoom]', function(e) { - // Click handler for zoom button - self[ self.isScaledDown() ? 'scaleToActual' : 'scaleToFit' ](); - }); - - - // Handle page scrolling and browser resizing - $W.on('orientationchange.fb resize.fb', function(e) { - - if ( e && e.originalEvent && e.originalEvent.type === "resize" ) { - - requestAFrame(function() { - self.update(); - }); - - } else { - - self.$refs.stage.hide(); - - setTimeout(function() { - self.$refs.stage.show(); - - self.update(); - }, 600); - - } - - }); - - // Trap keyboard focus inside of the modal, so the user does not accidentally tab outside of the modal - // (a.k.a. "escaping the modal") - $D.on('focusin.fb', function(e) { - var instance = $.fancybox ? $.fancybox.getInstance() : null; - - if ( instance.isClosing || !instance.current || !instance.current.opts.trapFocus || $( e.target ).hasClass( 'fancybox-container' ) || $( e.target ).is( document ) ) { - return; - } - - if ( instance && $( e.target ).css( 'position' ) !== 'fixed' && !instance.$refs.container.has( e.target ).length ) { - e.stopPropagation(); - - instance.focus(); - - // Sometimes page gets scrolled, set it back - $W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft ); - } - }); - - - // Enable keyboard navigation - $D.on('keydown.fb', function (e) { - var current = self.current, - keycode = e.keyCode || e.which; - - if ( !current || !current.opts.keyboard ) { - return; - } - - if ( $(e.target).is('input') || $(e.target).is('textarea') ) { - return; - } - - // Backspace and Esc keys - if ( keycode === 8 || keycode === 27 ) { - e.preventDefault(); - - self.close( e ); - - return; - } - - // Left arrow and Up arrow - if ( keycode === 37 || keycode === 38 ) { - e.preventDefault(); - - self.previous(); - - return; - } - - // Righ arrow and Down arrow - if ( keycode === 39 || keycode === 40 ) { - e.preventDefault(); - - self.next(); - - return; - } - - self.trigger('afterKeydown', e, keycode); - }); - - - // Hide controls after some inactivity period - if ( self.group[ self.currIndex ].opts.idleTime ) { - self.idleSecondsCounter = 0; - - $D.on('mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle', function(e) { - self.idleSecondsCounter = 0; - - if ( self.isIdle ) { - self.showControls(); - } - - self.isIdle = false; - }); - - self.idleInterval = window.setInterval(function() { - self.idleSecondsCounter++; - - if ( self.idleSecondsCounter >= self.group[ self.currIndex ].opts.idleTime && !self.isDragging ) { - self.isIdle = true; - self.idleSecondsCounter = 0; - - self.hideControls(); - } - - }, 1000); - } - - }, - - - // Remove events added by the core - // =============================== - - removeEvents : function() { - var self = this; - - $W.off( 'orientationchange.fb resize.fb' ); - $D.off( 'focusin.fb keydown.fb .fb-idle' ); - - this.$refs.container.off( '.fb-close .fb-prev .fb-next' ); - - if ( self.idleInterval ) { - window.clearInterval( self.idleInterval ); - - self.idleInterval = null; - } - }, - - - // Change to previous gallery item - // =============================== - - previous : function( duration ) { - return this.jumpTo( this.currPos - 1, duration ); - }, - - - // Change to next gallery item - // =========================== - - next : function( duration ) { - return this.jumpTo( this.currPos + 1, duration ); - }, - - - // Switch to selected gallery item - // =============================== - - jumpTo : function ( pos, duration, slide ) { - var self = this, - firstRun, - loop, - current, - previous, - canvasWidth, - currentPos, - transitionProps; - - var groupLen = self.group.length; - - if ( self.isDragging || self.isClosing || ( self.isAnimating && self.firstRun ) ) { - return; - } - - pos = parseInt( pos, 10 ); - loop = self.current ? self.current.opts.loop : self.opts.loop; - - if ( !loop && ( pos < 0 || pos >= groupLen ) ) { - return false; - } - - firstRun = self.firstRun = ( self.firstRun === null ); - - if ( groupLen < 2 && !firstRun && !!self.isDragging ) { - return; - } - - previous = self.current; - - self.prevIndex = self.currIndex; - self.prevPos = self.currPos; - - // Create slides - current = self.createSlide( pos ); - - if ( groupLen > 1 ) { - if ( loop || current.index > 0 ) { - self.createSlide( pos - 1 ); - } - - if ( loop || current.index < groupLen - 1 ) { - self.createSlide( pos + 1 ); - } - } - - self.current = current; - self.currIndex = current.index; - self.currPos = current.pos; - - self.trigger( 'beforeShow', firstRun ); - - self.updateControls(); - - currentPos = $.fancybox.getTranslate( current.$slide ); - - current.isMoved = ( currentPos.left !== 0 || currentPos.top !== 0 ) && !current.$slide.hasClass( 'fancybox-animated' ); - current.forcedDuration = undefined; - - if ( $.isNumeric( duration ) ) { - current.forcedDuration = duration; - } else { - duration = current.opts[ firstRun ? 'animationDuration' : 'transitionDuration' ]; - } - - duration = parseInt( duration, 10 ); - - // Fresh start - reveal container, current slide and start loading content - if ( firstRun ) { - - if ( current.opts.animationEffect && duration ) { - self.$refs.container.css( 'transition-duration', duration + 'ms' ); - } - - self.$refs.container.removeClass( 'fancybox-is-hidden' ); - - forceRedraw( self.$refs.container ); - - self.$refs.container.addClass( 'fancybox-is-open' ); - - // Make first slide visible (to display loading icon, if needed) - current.$slide.addClass( 'fancybox-slide--current' ); - - self.loadSlide( current ); - - self.preload( 'image' ); - - return; - } - - // Clean up - $.each(self.slides, function( index, slide ) { - $.fancybox.stop( slide.$slide ); - }); - - // Make current that slide is visible even if content is still loading - current.$slide.removeClass( 'fancybox-slide--next fancybox-slide--previous' ).addClass( 'fancybox-slide--current' ); - - // If slides have been dragged, animate them to correct position - if ( current.isMoved ) { - canvasWidth = Math.round( current.$slide.width() ); - - $.each(self.slides, function( index, slide ) { - var pos = slide.pos - current.pos; - - $.fancybox.animate( slide.$slide, { - top : 0, - left : ( pos * canvasWidth ) + ( pos * slide.opts.gutter ) - }, duration, function() { - - slide.$slide.removeAttr('style').removeClass( 'fancybox-slide--next fancybox-slide--previous' ); - - if ( slide.pos === self.currPos ) { - current.isMoved = false; - - self.complete(); - } - }); - }); - - } else { - self.$refs.stage.children().removeAttr( 'style' ); - } - - // Start transition that reveals current content - // or wait when it will be loaded - - if ( current.isLoaded ) { - self.revealContent( current ); - - } else { - self.loadSlide( current ); - } - - self.preload( 'image' ); - - if ( previous.pos === current.pos ) { - return; - } - - // Handle previous slide - // ===================== - - transitionProps = 'fancybox-slide--' + ( previous.pos > current.pos ? 'next' : 'previous' ); - - previous.$slide.removeClass( 'fancybox-slide--complete fancybox-slide--current fancybox-slide--next fancybox-slide--previous' ); - - previous.isComplete = false; - - if ( !duration || ( !current.isMoved && !current.opts.transitionEffect ) ) { - return; - } - - if ( current.isMoved ) { - previous.$slide.addClass( transitionProps ); - - } else { - - transitionProps = 'fancybox-animated ' + transitionProps + ' fancybox-fx-' + current.opts.transitionEffect; - - $.fancybox.animate( previous.$slide, transitionProps, duration, function() { - previous.$slide.removeClass( transitionProps ).removeAttr( 'style' ); - }); - - } - - }, - - - // Create new "slide" element - // These are gallery items that are actually added to DOM - // ======================================================= - - createSlide : function( pos ) { - - var self = this; - var $slide; - var index; - - index = pos % self.group.length; - index = index < 0 ? self.group.length + index : index; - - if ( !self.slides[ pos ] && self.group[ index ] ) { - $slide = $('
').appendTo( self.$refs.stage ); - - self.slides[ pos ] = $.extend( true, {}, self.group[ index ], { - pos : pos, - $slide : $slide, - isLoaded : false, - }); - - self.updateSlide( self.slides[ pos ] ); - } - - return self.slides[ pos ]; - }, - - - // Scale image to the actual size of the image - // =========================================== - - scaleToActual : function( x, y, duration ) { - - var self = this; - - var current = self.current; - var $what = current.$content; - - var imgPos, posX, posY, scaleX, scaleY; - - var canvasWidth = parseInt( current.$slide.width(), 10 ); - var canvasHeight = parseInt( current.$slide.height(), 10 ); - - var newImgWidth = current.width; - var newImgHeight = current.height; - - if ( !( current.type == 'image' && !current.hasError) || !$what || self.isAnimating ) { - return; - } - - $.fancybox.stop( $what ); - - self.isAnimating = true; - - x = x === undefined ? canvasWidth * 0.5 : x; - y = y === undefined ? canvasHeight * 0.5 : y; - - imgPos = $.fancybox.getTranslate( $what ); - - scaleX = newImgWidth / imgPos.width; - scaleY = newImgHeight / imgPos.height; - - // Get center position for original image - posX = ( canvasWidth * 0.5 - newImgWidth * 0.5 ); - posY = ( canvasHeight * 0.5 - newImgHeight * 0.5 ); - - // Make sure image does not move away from edges - if ( newImgWidth > canvasWidth ) { - posX = imgPos.left * scaleX - ( ( x * scaleX ) - x ); - - if ( posX > 0 ) { - posX = 0; - } - - if ( posX < canvasWidth - newImgWidth ) { - posX = canvasWidth - newImgWidth; - } - } - - if ( newImgHeight > canvasHeight) { - posY = imgPos.top * scaleY - ( ( y * scaleY ) - y ); - - if ( posY > 0 ) { - posY = 0; - } - - if ( posY < canvasHeight - newImgHeight ) { - posY = canvasHeight - newImgHeight; - } - } - - self.updateCursor( newImgWidth, newImgHeight ); - - $.fancybox.animate( $what, { - top : posY, - left : posX, - scaleX : scaleX, - scaleY : scaleY - }, duration || 330, function() { - self.isAnimating = false; - }); - - // Stop slideshow - if ( self.SlideShow && self.SlideShow.isActive ) { - self.SlideShow.stop(); - } - }, - - - // Scale image to fit inside parent element - // ======================================== - - scaleToFit : function( duration ) { - - var self = this; - - var current = self.current; - var $what = current.$content; - var end; - - if ( !( current.type == 'image' && !current.hasError) || !$what || self.isAnimating ) { - return; - } - - $.fancybox.stop( $what ); - - self.isAnimating = true; - - end = self.getFitPos( current ); - - self.updateCursor( end.width, end.height ); - - $.fancybox.animate( $what, { - top : end.top, - left : end.left, - scaleX : end.width / $what.width(), - scaleY : end.height / $what.height() - }, duration || 330, function() { - self.isAnimating = false; - }); - - }, - - // Calculate image size to fit inside viewport - // =========================================== - - getFitPos : function( slide ) { - var self = this; - var $what = slide.$content; - - var imgWidth = slide.width; - var imgHeight = slide.height; - - var margin = slide.opts.margin; - - var canvasWidth, canvasHeight, minRatio, width, height; - - if ( !$what || !$what.length || ( !imgWidth && !imgHeight) ) { - return false; - } - - // Convert "margin to CSS style: [ top, right, bottom, left ] - if ( $.type( margin ) === "number" ) { - margin = [ margin, margin ]; - } - - if ( margin.length == 2 ) { - margin = [ margin[0], margin[1], margin[0], margin[1] ]; - } - - // We can not use $slide width here, because it can have different diemensions while in transiton - canvasWidth = parseInt( self.$refs.stage.width(), 10 ) - ( margin[ 1 ] + margin[ 3 ] ); - canvasHeight = parseInt( self.$refs.stage.height(), 10 ) - ( margin[ 0 ] + margin[ 2 ] ); - - minRatio = Math.min(1, canvasWidth / imgWidth, canvasHeight / imgHeight ); - - width = Math.floor( minRatio * imgWidth ); - height = Math.floor( minRatio * imgHeight ); - - // Use floor rounding to make sure it really fits - return { - top : Math.floor( ( canvasHeight - height ) * 0.5 ) + margin[ 0 ], - left : Math.floor( ( canvasWidth - width ) * 0.5 ) + margin[ 3 ], - width : width, - height : height - }; - - }, - - - // Update content size and position for all slides - // ============================================== - - update : function() { - var self = this; - - $.each( self.slides, function( key, slide ) { - self.updateSlide( slide ); - }); - }, - - - // Update slide content position and size - // ====================================== - - updateSlide : function( slide, duration ) { - var self = this, - $what = slide && slide.$content; - - if ( $what && ( slide.width || slide.height ) ) { - self.isAnimating = false; - - $.fancybox.stop( $what ); - - $.fancybox.setTranslate( $what, self.getFitPos( slide ) ); - - if ( slide.pos === self.currPos ) { - self.updateCursor(); - } - } - - slide.$slide.trigger( 'refresh' ); - - self.trigger( 'onUpdate', slide ); - - }, - - - // Horizontally center slide - // ========================= - - centerSlide : function( slide, duration ) { - var self = this, canvasWidth, pos; - - if ( self.current ) { - canvasWidth = Math.round( slide.$slide.width() ); - pos = slide.pos - self.current.pos; - - $.fancybox.animate( slide.$slide, { - top : 0, - left : ( pos * canvasWidth ) + ( pos * slide.opts.gutter ), - opacity : 1 - }, duration === undefined ? 0 : duration, null, false); - } - }, - - - // Update cursor style depending if content can be zoomed - // ====================================================== - - updateCursor : function( nextWidth, nextHeight ) { - - var self = this; - var isScaledDown; - - var $container = self.$refs.container.removeClass( 'fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-drag fancybox-can-zoomOut' ); - - if ( !self.current || self.isClosing ) { - return; - } - - if ( self.isZoomable() ) { - - $container.addClass( 'fancybox-is-zoomable' ); - - if ( nextWidth !== undefined && nextHeight !== undefined ) { - isScaledDown = nextWidth < self.current.width && nextHeight < self.current.height; - - } else { - isScaledDown = self.isScaledDown(); - } - - if ( isScaledDown ) { - - // If image is scaled down, then, obviously, it can be zoomed to full size - $container.addClass( 'fancybox-can-zoomIn' ); - - } else { - - if ( self.current.opts.touch ) { - - // If image size ir largen than available available and touch module is not disable, - // then user can do panning - $container.addClass( 'fancybox-can-drag' ); - - } else { - $container.addClass( 'fancybox-can-zoomOut' ); - } - - } - - } else if ( self.current.opts.touch ) { - $container.addClass( 'fancybox-can-drag' ); - } - - }, - - - // Check if current slide is zoomable - // ================================== - - isZoomable : function() { - - var self = this; - - var current = self.current; - var fitPos; - - if ( !current || self.isClosing ) { - return; - } - - // Assume that slide is zoomable if - // - image is loaded successfuly - // - click action is "zoom" - // - actual size of the image is smaller than available area - if ( current.type === 'image' && current.isLoaded && !current.hasError && - ( current.opts.clickContent === 'zoom' || ( $.isFunction( current.opts.clickContent ) && current.opts.clickContent( current ) === "zoom" ) ) - ) { - - fitPos = self.getFitPos( current ); - - if ( current.width > fitPos.width || current.height > fitPos.height ) { - return true; - } - - } - - return false; - - }, - - - // Check if current image dimensions are smaller than actual - // ========================================================= - - isScaledDown : function() { - - var self = this; - - var current = self.current; - var $what = current.$content; - - var rez = false; - - if ( $what ) { - rez = $.fancybox.getTranslate( $what ); - rez = rez.width < current.width || rez.height < current.height; - } - - return rez; - - }, - - - // Check if image dimensions exceed parent element - // =============================================== - - canPan : function() { - - var self = this; - - var current = self.current; - var $what = current.$content; - - var rez = false; - - if ( $what ) { - rez = self.getFitPos( current ); - rez = Math.abs( $what.width() - rez.width ) > 1 || Math.abs( $what.height() - rez.height ) > 1; - } - - return rez; - - }, - - - // Load content into the slide - // =========================== - - loadSlide : function( slide ) { - - var self = this, type, $slide; - var ajaxLoad; - - if ( slide.isLoading ) { - return; - } - - if ( slide.isLoaded ) { - return; - } - - slide.isLoading = true; - - self.trigger( 'beforeLoad', slide ); - - type = slide.type; - $slide = slide.$slide; - - $slide - .off( 'refresh' ) - .trigger( 'onReset' ) - .addClass( 'fancybox-slide--' + ( type || 'unknown' ) ) - .addClass( slide.opts.slideClass ); - - // Create content depending on the type - - switch ( type ) { - - case 'image': - - self.setImage( slide ); - - break; - - case 'iframe': - - self.setIframe( slide ); - - break; - - case 'html': - - self.setContent( slide, slide.src || slide.content ); - - break; - - case 'inline': - - if ( $( slide.src ).length ) { - self.setContent( slide, $( slide.src ) ); - - } else { - self.setError( slide ); - } - - break; - - case 'ajax': - - self.showLoading( slide ); - - ajaxLoad = $.ajax( $.extend( {}, slide.opts.ajax.settings, { - url : slide.src, - success : function ( data, textStatus ) { - - if ( textStatus === 'success' ) { - self.setContent( slide, data ); - } - - }, - error : function ( jqXHR, textStatus ) { - - if ( jqXHR && textStatus !== 'abort' ) { - self.setError( slide ); - } - - } - })); - - $slide.one( 'onReset', function () { - ajaxLoad.abort(); - }); - - break; - - case 'video' : - - self.setContent( slide, - '' - ); - - break; - - default: - - self.setError( slide ); - - break; - - } - - return true; - - }, - - - // Use thumbnail image, if possible - // ================================ - - setImage : function( slide ) { - - var self = this; - var srcset = slide.opts.srcset || slide.opts.image.srcset; - - var found, temp, pxRatio, windowWidth; - - // If we have "srcset", then we need to find matching "src" value. - // This is necessary, because when you set an src attribute, the browser will preload the image - // before any javascript or even CSS is applied. - if ( srcset ) { - pxRatio = window.devicePixelRatio || 1; - windowWidth = window.innerWidth * pxRatio; - - temp = srcset.split(',').map(function ( el ) { - var ret = {}; - - el.trim().split(/\s+/).forEach(function ( el, i ) { - var value = parseInt( el.substring(0, el.length - 1), 10 ); - - if ( i === 0 ) { - return ( ret.url = el ); - } - - if ( value ) { - ret.value = value; - ret.postfix = el[ el.length - 1 ]; - } - - }); - - return ret; - }); - - // Sort by value - temp.sort(function (a, b) { - return a.value - b.value; - }); - - // Ok, now we have an array of all srcset values - for ( var j = 0; j < temp.length; j++ ) { - var el = temp[ j ]; - - if ( ( el.postfix === 'w' && el.value >= windowWidth ) || ( el.postfix === 'x' && el.value >= pxRatio ) ) { - found = el; - break; - } - } - - // If not found, take the last one - if ( !found && temp.length ) { - found = temp[ temp.length - 1 ]; - } - - if ( found ) { - slide.src = found.url; - - // If we have default width/height values, we can calculate height for matching source - if ( slide.width && slide.height && found.postfix == 'w' ) { - slide.height = ( slide.width / slide.height ) * found.value; - slide.width = found.value; - } - } - } - - // This will be wrapper containing both ghost and actual image - slide.$content = $('
') - .addClass( 'fancybox-is-hidden' ) - .appendTo( slide.$slide ); - - - // If we have a thumbnail, we can display it while actual image is loading - // Users will not stare at black screen and actual image will appear gradually - if ( slide.opts.preload !== false && slide.opts.width && slide.opts.height && ( slide.opts.thumb || slide.opts.$thumb ) ) { - - slide.width = slide.opts.width; - slide.height = slide.opts.height; - - slide.$ghost = $('') - .one('error', function() { - - $(this).remove(); - - slide.$ghost = null; - - self.setBigImage( slide ); - - }) - .one('load', function() { - - self.afterLoad( slide ); - - self.setBigImage( slide ); - - }) - .addClass( 'fancybox-image' ) - .appendTo( slide.$content ) - .attr( 'src', slide.opts.thumb || slide.opts.$thumb.attr( 'src' ) ); - - } else { - - self.setBigImage( slide ); - - } - - }, - - - // Create full-size image - // ====================== - - setBigImage : function ( slide ) { - var self = this; - var $img = $(''); - - slide.$image = $img - .one('error', function() { - - self.setError( slide ); - - }) - .one('load', function() { - - // Clear timeout that checks if loading icon needs to be displayed - clearTimeout( slide.timouts ); - - slide.timouts = null; - - if ( self.isClosing ) { - return; - } - - slide.width = slide.opts.width || this.naturalWidth; - slide.height = slide.opts.height || this.naturalHeight; - - if ( slide.opts.image.srcset ) { - $img.attr( 'sizes', '100vw' ).attr( 'srcset', slide.opts.image.srcset ); - } - - self.hideLoading( slide ); - - if ( slide.$ghost ) { - - slide.timouts = setTimeout(function() { - slide.timouts = null; - - slide.$ghost.hide(); - - }, Math.min( 300, Math.max( 1000, slide.height / 1600 ) ) ); - - } else { - self.afterLoad( slide ); - } - - }) - .addClass( 'fancybox-image' ) - .attr('src', slide.src) - .appendTo( slide.$content ); - - if ( ( $img[0].complete || $img[0].readyState == "complete" ) && $img[0].naturalWidth && $img[0].naturalHeight ) { - $img.trigger( 'load' ); - - } else if( $img[0].error ) { - $img.trigger( 'error' ); - - } else { - - slide.timouts = setTimeout(function() { - if ( !$img[0].complete && !slide.hasError ) { - self.showLoading( slide ); - } - - }, 100); - - } - - }, - - - // Create iframe wrapper, iframe and bindings - // ========================================== - - setIframe : function( slide ) { - var self = this, - opts = slide.opts.iframe, - $slide = slide.$slide, - $iframe; - - slide.$content = $('
') - .css( opts.css ) - .appendTo( $slide ); - - $iframe = $( opts.tpl.replace(/\{rnd\}/g, new Date().getTime()) ) - .attr( opts.attr ) - .appendTo( slide.$content ); - - if ( opts.preload ) { - - self.showLoading( slide ); - - // Unfortunately, it is not always possible to determine if iframe is successfully loaded - // (due to browser security policy) - - $iframe.on('load.fb error.fb', function(e) { - this.isReady = 1; - - slide.$slide.trigger( 'refresh' ); - - self.afterLoad( slide ); - }); - - // Recalculate iframe content size - // =============================== - - $slide.on('refresh.fb', function() { - var $wrap = slide.$content, - frameWidth = opts.css.width, - frameHeight = opts.css.height, - scrollWidth, - $contents, - $body; - - if ( $iframe[0].isReady !== 1 ) { - return; - } - - // Check if content is accessible, - // it will fail if frame is not with the same origin - - try { - $contents = $iframe.contents(); - $body = $contents.find('body'); - - } catch (ignore) {} - - // Calculate dimensions for the wrapper - if ( $body && $body.length ) { - - if ( frameWidth === undefined ) { - scrollWidth = $iframe[0].contentWindow.document.documentElement.scrollWidth; - - frameWidth = Math.ceil( $body.outerWidth(true) + ( $wrap.width() - scrollWidth ) ); - frameWidth += $wrap.outerWidth() - $wrap.innerWidth(); - } - - if ( frameHeight === undefined ) { - frameHeight = Math.ceil( $body.outerHeight(true) ); - frameHeight += $wrap.outerHeight() - $wrap.innerHeight(); - } - - // Resize wrapper to fit iframe content - if ( frameWidth ) { - $wrap.width( frameWidth ); - } - - if ( frameHeight ) { - $wrap.height( frameHeight ); - } - } - - $wrap.removeClass( 'fancybox-is-hidden' ); - - }); - - } else { - - this.afterLoad( slide ); - - } - - $iframe.attr( 'src', slide.src ); - - if ( slide.opts.smallBtn === true ) { - slide.$content.prepend( self.translate( slide, slide.opts.btnTpl.smallBtn ) ); - } - - // Remove iframe if closing or changing gallery item - $slide.one( 'onReset', function () { - - // This helps IE not to throw errors when closing - try { - - $( this ).find( 'iframe' ).hide().attr( 'src', '//about:blank' ); - - } catch ( ignore ) {} - - $( this ).empty(); - - slide.isLoaded = false; - - }); - - }, - - - // Wrap and append content to the slide - // ====================================== - - setContent : function ( slide, content ) { - - var self = this; - - if ( self.isClosing ) { - return; - } - - self.hideLoading( slide ); - - slide.$slide.empty(); - - if ( isQuery( content ) && content.parent().length ) { - - // If content is a jQuery object, then it will be moved to the slide. - // The placeholder is created so we will know where to put it back. - // If user is navigating gallery fast, then the content might be already inside fancyBox - // ===================================================================================== - - // Make sure content is not already moved to fancyBox - content.parent( '.fancybox-slide--inline' ).trigger( 'onReset' ); - - // Create temporary element marking original place of the content - slide.$placeholder = $( '
' ).hide().insertAfter( content ); - - // Make sure content is visible - content.css('display', 'inline-block'); - - } else if ( !slide.hasError ) { - - // If content is just a plain text, try to convert it to html - if ( $.type( content ) === 'string' ) { - content = $('
').append( $.trim( content ) ).contents(); - - // If we have text node, then add wrapping element to make vertical alignment work - if ( content[0].nodeType === 3 ) { - content = $('
').html( content ); - } - } - - // If "filter" option is provided, then filter content - if ( slide.opts.filter ) { - content = $('
').html( content ).find( slide.opts.filter ); - } - - } - - slide.$slide.one('onReset', function () { - - // Pause all html5 video/audio - $( this ).find( 'video,audio' ).trigger( 'pause' ); - - // Put content back - if ( slide.$placeholder ) { - slide.$placeholder.after( content.hide() ).remove(); - - slide.$placeholder = null; - } - - // Remove custom close button - if ( slide.$smallBtn ) { - slide.$smallBtn.remove(); - - slide.$smallBtn = null; - } - - // Remove content and mark slide as not loaded - if ( !slide.hasError ) { - $(this).empty(); - - slide.isLoaded = false; - } - - }); - - slide.$content = $( content ).appendTo( slide.$slide ); - - this.afterLoad( slide ); - }, - - // Display error message - // ===================== - - setError : function ( slide ) { - - slide.hasError = true; - - slide.$slide.removeClass( 'fancybox-slide--' + slide.type ); - - this.setContent( slide, this.translate( slide, slide.opts.errorTpl ) ); - - }, - - - // Show loading icon inside the slide - // ================================== - - showLoading : function( slide ) { - - var self = this; - - slide = slide || self.current; - - if ( slide && !slide.$spinner ) { - slide.$spinner = $( self.opts.spinnerTpl ).appendTo( slide.$slide ); - } - - }, - - // Remove loading icon from the slide - // ================================== - - hideLoading : function( slide ) { - - var self = this; - - slide = slide || self.current; - - if ( slide && slide.$spinner ) { - slide.$spinner.remove(); - - delete slide.$spinner; - } - - }, - - - // Adjustments after slide content has been loaded - // =============================================== - - afterLoad : function( slide ) { - - var self = this; - - if ( self.isClosing ) { - return; - } - - slide.isLoading = false; - slide.isLoaded = true; - - self.trigger( 'afterLoad', slide ); - - self.hideLoading( slide ); - - if ( slide.opts.smallBtn && !slide.$smallBtn ) { - slide.$smallBtn = $( self.translate( slide, slide.opts.btnTpl.smallBtn ) ).appendTo( slide.$content.filter('div,form').first() ); - } - - if ( slide.opts.protect && slide.$content && !slide.hasError ) { - - // Disable right click - slide.$content.on( 'contextmenu.fb', function( e ) { - if ( e.button == 2 ) { - e.preventDefault(); - } - - return true; - }); - - // Add fake element on top of the image - // This makes a bit harder for user to select image - if ( slide.type === 'image' ) { - $( '
' ).appendTo( slide.$content ); - } - - } - - self.revealContent( slide ); - - }, - - - // Make content visible - // This method is called right after content has been loaded or - // user navigates gallery and transition should start - // ============================================================ - - revealContent : function( slide ) { - - var self = this; - var $slide = slide.$slide; - - var effect, effectClassName, duration, opacity, end, start = false; - - effect = slide.opts[ self.firstRun ? 'animationEffect' : 'transitionEffect' ]; - duration = slide.opts[ self.firstRun ? 'animationDuration' : 'transitionDuration' ]; - - duration = parseInt( slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10 ); - - if ( slide.isMoved || slide.pos !== self.currPos || !duration ) { - effect = false; - } - - // Check if can zoom - if ( effect === 'zoom' && !( slide.pos === self.currPos && duration && slide.type === 'image' && !slide.hasError && ( start = self.getThumbPos( slide ) ) ) ) { - effect = 'fade'; - } - - // Zoom animation - // ============== - - if ( effect === 'zoom' ) { - end = self.getFitPos( slide ); - - end.scaleX = end.width / start.width; - end.scaleY = end.height / start.height; - - delete end.width; - delete end.height; - - // Check if we need to animate opacity - opacity = slide.opts.zoomOpacity; - - if ( opacity == 'auto' ) { - opacity = Math.abs( slide.width / slide.height - start.width / start.height ) > 0.1; - } - - if ( opacity ) { - start.opacity = 0.1; - end.opacity = 1; - } - - // Draw image at start position - $.fancybox.setTranslate( slide.$content.removeClass( 'fancybox-is-hidden' ), start ); - - forceRedraw( slide.$content ); - - // Start animation - $.fancybox.animate( slide.$content, end, duration, function() { - self.complete(); - }); - - return; - } - - self.updateSlide( slide ); - - - // Simply show content - // =================== - - if ( !effect ) { - forceRedraw( $slide ); - - slide.$content.removeClass( 'fancybox-is-hidden' ); - - if ( slide.pos === self.currPos ) { - self.complete(); - } - - return; - } - - $.fancybox.stop( $slide ); - - effectClassName = 'fancybox-animated fancybox-slide--' + ( slide.pos >= self.prevPos ? 'next' : 'previous' ) + ' fancybox-fx-' + effect; - - $slide.removeAttr( 'style' ).removeClass( 'fancybox-slide--current fancybox-slide--next fancybox-slide--previous' ).addClass( effectClassName ); - - slide.$content.removeClass( 'fancybox-is-hidden' ); - - //Force reflow for CSS3 transitions - forceRedraw( $slide ); - - $.fancybox.animate( $slide, 'fancybox-slide--current', duration, function(e) { - $slide.removeClass( effectClassName ).removeAttr( 'style' ); - - if ( slide.pos === self.currPos ) { - self.complete(); - } - - }, true); - - }, - - - // Check if we can and have to zoom from thumbnail - //================================================ - - getThumbPos : function( slide ) { - - var self = this; - var rez = false; - - // Check if element is inside the viewport by at least 1 pixel - var isElementVisible = function( $el ) { - var element = $el[0]; - - var elementRect = element.getBoundingClientRect(); - var parentRects = []; - - var visibleInAllParents; - - while ( element.parentElement !== null ) { - if ( $(element.parentElement).css('overflow') === 'hidden' || $(element.parentElement).css('overflow') === 'auto' ) { - parentRects.push(element.parentElement.getBoundingClientRect()); - } - - element = element.parentElement; - } - - visibleInAllParents = parentRects.every(function(parentRect){ - var visiblePixelX = Math.min(elementRect.right, parentRect.right) - Math.max(elementRect.left, parentRect.left); - var visiblePixelY = Math.min(elementRect.bottom, parentRect.bottom) - Math.max(elementRect.top, parentRect.top); - - return visiblePixelX > 0 && visiblePixelY > 0; - }); - - return visibleInAllParents && - elementRect.bottom > 0 && elementRect.right > 0 && - elementRect.left < $(window).width() && elementRect.top < $(window).height(); - }; - - var $thumb = slide.opts.$thumb; - var thumbPos = $thumb ? $thumb.offset() : 0; - var slidePos; - - if ( thumbPos && $thumb[0].ownerDocument === document && isElementVisible( $thumb ) ) { - slidePos = self.$refs.stage.offset(); - - rez = { - top : thumbPos.top - slidePos.top + parseFloat( $thumb.css( "border-top-width" ) || 0 ), - left : thumbPos.left - slidePos.left + parseFloat( $thumb.css( "border-left-width" ) || 0 ), - width : $thumb.width(), - height : $thumb.height(), - scaleX : 1, - scaleY : 1 - }; - } - - return rez; - }, - - - // Final adjustments after current gallery item is moved to position - // and it`s content is loaded - // ================================================================== - - complete : function() { - var self = this, - current = self.current, - slides = {}, - promise; - - if ( current.isMoved || !current.isLoaded || current.isComplete ) { - return; - } - - current.isComplete = true; - - current.$slide.siblings().trigger( 'onReset' ); - - self.preload( 'inline' ); - - // Trigger any CSS3 transiton inside the slide - forceRedraw( current.$slide ); - - current.$slide.addClass( 'fancybox-slide--complete' ); - - // Remove unnecessary slides - $.each( self.slides, function( key, slide ) { - if ( slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1 ) { - slides[ slide.pos ] = slide; - - } else if ( slide ) { - $.fancybox.stop( slide.$slide ); - - slide.$slide.off().remove(); - } - }); - - self.slides = slides; - - self.updateCursor(); - - self.trigger( 'afterShow' ); - - // Play first html5 video/audio - current.$slide.find( 'video,audio' ).first().trigger( 'play' ); - - // Try to focus on the first focusable element - if ( $( document.activeElement ).is( '[disabled]' ) || ( current.opts.autoFocus && !( current.type == 'image' || current.type === 'iframe' ) ) ) { - self.focus(); - } - - }, - - - // Preload next and previous slides - // ================================ - - preload : function( type ) { - var self = this, - next = self.slides[ self.currPos + 1 ], - prev = self.slides[ self.currPos - 1 ]; - - if ( next && next.type === type ) { - self.loadSlide( next ); - } - - if ( prev && prev.type === type ) { - self.loadSlide( prev ); - } - }, - - - // Try to find and focus on the first focusable element - // ==================================================== - - focus : function() { - var current = this.current; - var $el; - - if ( this.isClosing ) { - return; - } - - if ( current && current.isComplete ) { - - // Look for first input with autofocus attribute - $el = current.$slide.find('input[autofocus]:enabled:visible:first'); - - if ( !$el.length ) { - $el = current.$slide.find('button,:input,[tabindex],a').filter(':enabled:visible:first'); - } - } - - $el = $el && $el.length ? $el : this.$refs.container; - - $el.focus(); - }, - - - // Activates current instance - brings container to the front and enables keyboard, - // notifies other instances about deactivating - // ================================================================================= - - activate : function () { - var self = this; - - // Deactivate all instances - $( '.fancybox-container' ).each(function () { - var instance = $(this).data( 'FancyBox' ); - - // Skip self and closing instances - if (instance && instance.id !== self.id && !instance.isClosing) { - instance.trigger( 'onDeactivate' ); - - instance.removeEvents(); - - instance.isVisible = false; - } - - }); - - self.isVisible = true; - - if ( self.current || self.isIdle ) { - self.update(); - - self.updateControls(); - } - - self.trigger( 'onActivate' ); - - self.addEvents(); - }, - - - // Start closing procedure - // This will start "zoom-out" animation if needed and clean everything up afterwards - // ================================================================================= - - close : function( e, d ) { - - var self = this; - var current = self.current; - - var effect, duration; - var $what, opacity, start, end; - - var done = function() { - self.cleanUp( e ); - }; - - if ( self.isClosing ) { - return false; - } - - self.isClosing = true; - - // If beforeClose callback prevents closing, make sure content is centered - if ( self.trigger( 'beforeClose', e ) === false ) { - self.isClosing = false; - - requestAFrame(function() { - self.update(); - }); - - return false; - } - - // Remove all events - // If there are multiple instances, they will be set again by "activate" method - self.removeEvents(); - - if ( current.timouts ) { - clearTimeout( current.timouts ); - } - - $what = current.$content; - effect = current.opts.animationEffect; - duration = $.isNumeric( d ) ? d : ( effect ? current.opts.animationDuration : 0 ); - - // Remove other slides - current.$slide.off( transitionEnd ).removeClass( 'fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated' ); - - current.$slide.siblings().trigger( 'onReset' ).remove(); - - // Trigger animations - if ( duration ) { - self.$refs.container.removeClass( 'fancybox-is-open' ).addClass( 'fancybox-is-closing' ); - } - - // Clean up - self.hideLoading( current ); - - self.hideControls(); - - self.updateCursor(); - - // Check if possible to zoom-out - if ( effect === 'zoom' && !( e !== true && $what && duration && current.type === 'image' && !current.hasError && ( end = self.getThumbPos( current ) ) ) ) { - effect = 'fade'; - } - - if ( effect === 'zoom' ) { - $.fancybox.stop( $what ); - - start = $.fancybox.getTranslate( $what ); - - start.width = start.width * start.scaleX; - start.height = start.height * start.scaleY; - - // Check if we need to animate opacity - opacity = current.opts.zoomOpacity; - - if ( opacity == 'auto' ) { - opacity = Math.abs( current.width / current.height - end.width / end.height ) > 0.1; - } - - if ( opacity ) { - end.opacity = 0; - } - - start.scaleX = start.width / end.width; - start.scaleY = start.height / end.height; - - start.width = end.width; - start.height = end.height; - - $.fancybox.setTranslate( current.$content, start ); - - forceRedraw( current.$content ); - - $.fancybox.animate( current.$content, end, duration, done ); - - return true; - } - - if ( effect && duration ) { - - // If skip animation - if ( e === true ) { - setTimeout( done, duration ); - - } else { - $.fancybox.animate( current.$slide.removeClass( 'fancybox-slide--current' ), 'fancybox-animated fancybox-slide--previous fancybox-fx-' + effect, duration, done ); - } - - } else { - done(); - } - - return true; - }, - - - // Final adjustments after removing the instance - // ============================================= - - cleanUp : function( e ) { - var self = this, - $body = $( 'body' ), - instance, - offset; - - self.current.$slide.trigger( 'onReset' ); - - self.$refs.container.empty().remove(); - - self.trigger( 'afterClose', e ); - - // Place back focus - if ( self.$lastFocus && !!self.current.opts.backFocus ) { - self.$lastFocus.focus(); - } - - self.current = null; - - // Check if there are other instances - instance = $.fancybox.getInstance(); - - if ( instance ) { - instance.activate(); - - } else { - - $W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft ); - - $body.removeClass( 'fancybox-active compensate-for-scrollbar' ); - - if ( $body.hasClass( 'fancybox-iosfix' ) ) { - offset = parseInt(document.body.style.top, 10); - - $body.removeClass( 'fancybox-iosfix' ).css( 'top', '' ).scrollTop( offset * -1 ); - } - - $( '#fancybox-style-noscroll' ).remove(); - - } - - }, - - - // Call callback and trigger an event - // ================================== - - trigger : function( name, slide ) { - var args = Array.prototype.slice.call(arguments, 1), - self = this, - obj = slide && slide.opts ? slide : self.current, - rez; - - if ( obj ) { - args.unshift( obj ); - - } else { - obj = self; - } - - args.unshift( self ); - - if ( $.isFunction( obj.opts[ name ] ) ) { - rez = obj.opts[ name ].apply( obj, args ); - } - - if ( rez === false ) { - return rez; - } - - if ( name === 'afterClose' || !self.$refs ) { - $D.trigger( name + '.fb', args ); - - } else { - self.$refs.container.trigger( name + '.fb', args ); - } - - }, - - - // Update infobar values, navigation button states and reveal caption - // ================================================================== - - updateControls : function ( force ) { - - var self = this; - - var current = self.current, - index = current.index, - caption = current.opts.caption, - $container = self.$refs.container, - $caption = self.$refs.caption; - - // Recalculate content dimensions - current.$slide.trigger( 'refresh' ); - - self.$caption = caption && caption.length ? $caption.html( caption ) : null; - - if ( !self.isHiddenControls && !self.isIdle ) { - self.showControls(); - } - - // Update info and navigation elements - $container.find('[data-fancybox-count]').html( self.group.length ); - $container.find('[data-fancybox-index]').html( index + 1 ); - - $container.find('[data-fancybox-prev]').prop( 'disabled', ( !current.opts.loop && index <= 0 ) ); - $container.find('[data-fancybox-next]').prop( 'disabled', ( !current.opts.loop && index >= self.group.length - 1 ) ); - - if ( current.type === 'image' ) { - - // Update download button source - $container.find('[data-fancybox-download]').attr( 'href', current.opts.image.src || current.src ).show(); - - } else { - $container.find('[data-fancybox-download],[data-fancybox-zoom]').hide(); - } - }, - - // Hide toolbar and caption - // ======================== - - hideControls : function () { - - this.isHiddenControls = true; - - this.$refs.container.removeClass( 'fancybox-show-infobar fancybox-show-toolbar fancybox-show-caption fancybox-show-nav' ); - - }, - - showControls : function() { - var self = this; - var opts = self.current ? self.current.opts : self.opts; - var $container = self.$refs.container; - - self.isHiddenControls = false; - self.idleSecondsCounter = 0; - - $container - .toggleClass( 'fancybox-show-toolbar', !!( opts.toolbar && opts.buttons ) ) - .toggleClass( 'fancybox-show-infobar', !!( opts.infobar && self.group.length > 1 ) ) - .toggleClass( 'fancybox-show-nav', !!( opts.arrows && self.group.length > 1 ) ) - .toggleClass( 'fancybox-is-modal', !!opts.modal ); - - if ( self.$caption ) { - $container.addClass( 'fancybox-show-caption '); - - } else { - $container.removeClass( 'fancybox-show-caption' ); - } - - }, - - - // Toggle toolbar and caption - // ========================== - - toggleControls : function() { - if ( this.isHiddenControls ) { - this.showControls(); - - } else { - this.hideControls(); - } - - }, - - - }); - - - $.fancybox = { - - version : "3.2.10", - defaults : defaults, - - - // Get current instance and execute a command. - // - // Examples of usage: - // - // $instance = $.fancybox.getInstance(); - // $.fancybox.getInstance().jumpTo( 1 ); - // $.fancybox.getInstance( 'jumpTo', 1 ); - // $.fancybox.getInstance( function() { - // console.info( this.currIndex ); - // }); - // ====================================================== - - getInstance : function ( command ) { - var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data( 'FancyBox' ); - var args = Array.prototype.slice.call(arguments, 1); - - if ( instance instanceof FancyBox ) { - - if ( $.type( command ) === 'string' ) { - instance[ command ].apply( instance, args ); - - } else if ( $.type( command ) === 'function' ) { - command.apply( instance, args ); - } - - return instance; - } - - return false; - - }, - - - // Create new instance - // =================== - - open : function ( items, opts, index ) { - return new FancyBox( items, opts, index ); - }, - - - // Close current or all instances - // ============================== - - close : function ( all ) { - var instance = this.getInstance(); - - if ( instance ) { - instance.close(); - - // Try to find and close next instance - - if ( all === true ) { - this.close(); - } - } - - }, - - // Close instances and unbind all events - // ============================== - - destroy : function() { - - this.close( true ); - - $D.off( 'click.fb-start' ); - - }, - - - // Try to detect mobile devices - // ============================ - - isMobile : document.createTouch !== undefined && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), - - - // Detect if 'translate3d' support is available - // ============================================ - - use3d : (function() { - var div = document.createElement('div'); - - return window.getComputedStyle && window.getComputedStyle( div ).getPropertyValue('transform') && !(document.documentMode && document.documentMode < 11); - }()), - - // Helper function to get current visual state of an element - // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] - // ===================================================================== - - getTranslate : function( $el ) { - var matrix; - - if ( !$el || !$el.length ) { - return false; - } - - matrix = $el.eq( 0 ).css('transform'); - - if ( matrix && matrix.indexOf( 'matrix' ) !== -1 ) { - matrix = matrix.split('(')[1]; - matrix = matrix.split(')')[0]; - matrix = matrix.split(','); - } else { - matrix = []; - } - - if ( matrix.length ) { - - // If IE - if ( matrix.length > 10 ) { - matrix = [ matrix[13], matrix[12], matrix[0], matrix[5] ]; - - } else { - matrix = [ matrix[5], matrix[4], matrix[0], matrix[3]]; - } - - matrix = matrix.map(parseFloat); - - } else { - matrix = [ 0, 0, 1, 1 ]; - - var transRegex = /\.*translate\((.*)px,(.*)px\)/i; - var transRez = transRegex.exec( $el.eq( 0 ).attr('style') ); - - if ( transRez ) { - matrix[ 0 ] = parseFloat( transRez[2] ); - matrix[ 1 ] = parseFloat( transRez[1] ); - } - } - - return { - top : matrix[ 0 ], - left : matrix[ 1 ], - scaleX : matrix[ 2 ], - scaleY : matrix[ 3 ], - opacity : parseFloat( $el.css('opacity') ), - width : $el.width(), - height : $el.height() - }; - - }, - - - // Shortcut for setting "translate3d" properties for element - // Can set be used to set opacity, too - // ======================================================== - - setTranslate : function( $el, props ) { - var str = ''; - var css = {}; - - if ( !$el || !props ) { - return; - } - - if ( props.left !== undefined || props.top !== undefined ) { - str = ( props.left === undefined ? $el.position().left : props.left ) + 'px, ' + ( props.top === undefined ? $el.position().top : props.top ) + 'px'; - - if ( this.use3d ) { - str = 'translate3d(' + str + ', 0px)'; - - } else { - str = 'translate(' + str + ')'; - } - } - - if ( props.scaleX !== undefined && props.scaleY !== undefined ) { - str = (str.length ? str + ' ' : '') + 'scale(' + props.scaleX + ', ' + props.scaleY + ')'; - } - - if ( str.length ) { - css.transform = str; - } - - if ( props.opacity !== undefined ) { - css.opacity = props.opacity; - } - - if ( props.width !== undefined ) { - css.width = props.width; - } - - if ( props.height !== undefined ) { - css.height = props.height; - } - - return $el.css( css ); - }, - - - // Simple CSS transition handler - // ============================= - - animate : function ( $el, to, duration, callback, leaveAnimationName ) { - if ( $.isFunction( duration ) ) { - callback = duration; - duration = null; - } - - if ( !$.isPlainObject( to ) ) { - $el.removeAttr( 'style' ); - } - - $el.on( transitionEnd, function(e) { - - // Skip events from child elements and z-index change - if ( e && e.originalEvent && ( !$el.is( e.originalEvent.target ) || e.originalEvent.propertyName == 'z-index' ) ) { - return; - } - - $.fancybox.stop( $el ); - - if ( $.isPlainObject( to ) ) { - - if ( to.scaleX !== undefined && to.scaleY !== undefined ) { - $el.css( 'transition-duration', '' ); - - to.width = Math.round( $el.width() * to.scaleX ); - to.height = Math.round( $el.height() * to.scaleY ); - - to.scaleX = 1; - to.scaleY = 1; - - $.fancybox.setTranslate( $el, to ); - } - - if ( leaveAnimationName === false ) { - $el.removeAttr( 'style' ); - } - - } else if ( leaveAnimationName !== true ) { - $el.removeClass( to ); - } - - if ( $.isFunction( callback ) ) { - callback( e ); - } - - }); - - if ( $.isNumeric( duration ) ) { - $el.css( 'transition-duration', duration + 'ms' ); - } - - if ( $.isPlainObject( to ) ) { - $.fancybox.setTranslate( $el, to ); - - } else { - $el.addClass( to ); - } - - if ( to.scaleX && $el.hasClass( 'fancybox-image-wrap' ) ) { - $el.parent().addClass( 'fancybox-is-scaling' ); - } - - // Make sure that `transitionend` callback gets fired - $el.data("timer", setTimeout(function() { - $el.trigger( 'transitionend' ); - }, duration + 16)); - - }, - - stop : function( $el ) { - clearTimeout( $el.data("timer") ); - - $el.off( 'transitionend' ).css( 'transition-duration', '' ); - - if ( $el.hasClass( 'fancybox-image-wrap' ) ) { - $el.parent().removeClass( 'fancybox-is-scaling' ); - } - } - - }; - - - // Default click handler for "fancyboxed" links - // ============================================ - - function _run( e ) { - var $target = $( e.currentTarget ), - opts = e.data ? e.data.options : {}, - value = $target.attr( 'data-fancybox' ) || '', - index = 0, - items = []; - - // Avoid opening multiple times - if ( e.isDefaultPrevented() ) { - return; - } - - e.preventDefault(); - - // Get all related items and find index for clicked one - if ( value ) { - items = opts.selector ? $( opts.selector ) : ( e.data ? e.data.items : [] ); - items = items.length ? items.filter( '[data-fancybox="' + value + '"]' ) : $( '[data-fancybox="' + value + '"]' ); - - index = items.index( $target ); - - // Sometimes current item can not be found - // (for example, when slider clones items) - if ( index < 0 ) { - index = 0; - } - - } else { - items = [ $target ]; - } - - $.fancybox.open( items, opts, index ); - } - - - // Create a jQuery plugin - // ====================== - - $.fn.fancybox = function (options) { - var selector; - - options = options || {}; - selector = options.selector || false; - - if ( selector ) { - - $( 'body' ).off( 'click.fb-start', selector ).on( 'click.fb-start', selector, { - options : options - }, _run ); - - } else { - - this.off( 'click.fb-start' ).on( 'click.fb-start', { - items : this, - options : options - }, _run); - - } - - return this; - }; - - - // Self initializing plugin - // ======================== - - $D.on( 'click.fb-start', '[data-fancybox]', _run ); - -}( window, document, window.jQuery || jQuery )); - -// ========================================================================== -// -// Media -// Adds additional media type support -// -// ========================================================================== -;(function ($) { - - 'use strict'; - - // Formats matching url to final form - - var format = function (url, rez, params) { - if ( !url ) { - return; - } - - params = params || ''; - - if ( $.type(params) === "object" ) { - params = $.param(params, true); - } - - $.each(rez, function (key, value) { - url = url.replace('$' + key, value || ''); - }); - - if (params.length) { - url += (url.indexOf('?') > 0 ? '&' : '?') + params; - } - - return url; - }; - - // Object containing properties for each media type - - var defaults = { - youtube : { - matcher : /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, - params : { - autoplay : 1, - autohide : 1, - fs : 1, - rel : 0, - hd : 1, - wmode : 'transparent', - enablejsapi : 1, - html5 : 1 - }, - paramPlace : 8, - type : 'iframe', - url : '//www.youtube.com/embed/$4', - thumb : '//img.youtube.com/vi/$4/hqdefault.jpg' - }, - - vimeo : { - matcher : /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, - params : { - autoplay : 1, - hd : 1, - show_title : 1, - show_byline : 1, - show_portrait : 0, - fullscreen : 1, - api : 1 - }, - paramPlace : 3, - type : 'iframe', - url : '//player.vimeo.com/video/$2' - }, - - metacafe : { - matcher : /metacafe.com\/watch\/(\d+)\/(.*)?/, - type : 'iframe', - url : '//www.metacafe.com/embed/$1/?ap=1' - }, - - dailymotion : { - matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, - params : { - additionalInfos : 0, - autoStart : 1 - }, - type : 'iframe', - url : '//www.dailymotion.com/embed/video/$1' - }, - - vine : { - matcher : /vine.co\/v\/([a-zA-Z0-9\?\=\-]+)/, - type : 'iframe', - url : '//vine.co/v/$1/embed/simple' - }, - - instagram : { - matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, - type : 'image', - url : '//$1/p/$2/media/?size=l' - }, - - // Examples: - // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 - // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z - // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 - gmap_place : { - matcher : /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, - type : 'iframe', - url : function (rez) { - return '//maps.google.' + rez[2] + '/?ll=' + ( rez[9] ? rez[9] + '&z=' + Math.floor( rez[10] ) + ( rez[12] ? rez[12].replace(/^\//, "&") : '' ) : rez[12] ) + '&output=' + ( rez[12] && rez[12].indexOf('layer=c') > 0 ? 'svembed' : 'embed' ); - } - }, - - // Examples: - // https://www.google.com/maps/search/Empire+State+Building/ - // https://www.google.com/maps/search/?api=1&query=centurylink+field - // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 - gmap_search : { - matcher : /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, - type : 'iframe', - url : function (rez) { - return '//maps.google.' + rez[2] + '/maps?q=' + rez[5].replace('query=', 'q=').replace('api=1', '') + '&output=embed'; - } - } - }; - - $(document).on('objectNeedsType.fb', function (e, instance, item) { - - var url = item.src || '', - type = false, - media, - thumb, - rez, - params, - urlParams, - paramObj, - provider; - - media = $.extend( true, {}, defaults, item.opts.media ); - - // Look for any matching media type - $.each(media, function ( providerName, providerOpts ) { - rez = url.match( providerOpts.matcher ); - - if ( !rez ) { - return; - } - - type = providerOpts.type; - paramObj = {}; - - if ( providerOpts.paramPlace && rez[ providerOpts.paramPlace ] ) { - urlParams = rez[ providerOpts.paramPlace ]; - - if ( urlParams[ 0 ] == '?' ) { - urlParams = urlParams.substring(1); - } - - urlParams = urlParams.split('&'); - - for ( var m = 0; m < urlParams.length; ++m ) { - var p = urlParams[ m ].split('=', 2); - - if ( p.length == 2 ) { - paramObj[ p[0] ] = decodeURIComponent( p[1].replace(/\+/g, " ") ); - } - } - } - - params = $.extend( true, {}, providerOpts.params, item.opts[ providerName ], paramObj ); - - url = $.type( providerOpts.url ) === "function" ? providerOpts.url.call( this, rez, params, item ) : format( providerOpts.url, rez, params ); - thumb = $.type( providerOpts.thumb ) === "function" ? providerOpts.thumb.call( this, rez, params, item ) : format( providerOpts.thumb, rez ); - - if ( providerName === 'vimeo' ) { - url = url.replace('&%23', '#'); - } - - return false; - }); - - // If it is found, then change content type and update the url - - if ( type ) { - item.src = url; - item.type = type; - - if ( !item.opts.thumb && !( item.opts.$thumb && item.opts.$thumb.length ) ) { - item.opts.thumb = thumb; - } - - if ( type === 'iframe' ) { - $.extend(true, item.opts, { - iframe : { - preload : false, - attr : { - scrolling : "no" - } - } - }); - - item.contentProvider = provider; - - item.opts.slideClass += ' fancybox-slide--' + ( provider == 'gmap_place' || provider == 'gmap_search' ? 'map' : 'video' ); - } - - } else if ( url ) { - item.type = item.opts.defaultType; - } - - }); - -}( window.jQuery || jQuery )); - -// ========================================================================== -// -// Guestures -// Adds touch guestures, handles click and tap events -// -// ========================================================================== -;(function (window, document, $) { - 'use strict'; - - var requestAFrame = (function () { - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - // if all else fails, use setTimeout - function (callback) { - return window.setTimeout(callback, 1000 / 60); - }; - })(); - - var cancelAFrame = (function () { - return window.cancelAnimationFrame || - window.webkitCancelAnimationFrame || - window.mozCancelAnimationFrame || - window.oCancelAnimationFrame || - function (id) { - window.clearTimeout(id); - }; - })(); - - var pointers = function( e ) { - var result = []; - - e = e.originalEvent || e || window.e; - e = e.touches && e.touches.length ? e.touches : ( e.changedTouches && e.changedTouches.length ? e.changedTouches : [ e ] ); - - for ( var key in e ) { - - if ( e[ key ].pageX ) { - result.push( { x : e[ key ].pageX, y : e[ key ].pageY } ); - - } else if ( e[ key ].clientX ) { - result.push( { x : e[ key ].clientX, y : e[ key ].clientY } ); - } - } - - return result; - }; - - var distance = function( point2, point1, what ) { - if ( !point1 || !point2 ) { - return 0; - } - - if ( what === 'x' ) { - return point2.x - point1.x; - - } else if ( what === 'y' ) { - return point2.y - point1.y; - } - - return Math.sqrt( Math.pow( point2.x - point1.x, 2 ) + Math.pow( point2.y - point1.y, 2 ) ); - }; - - var isClickable = function( $el ) { - if ( $el.is('a,area,button,[role="button"],input,label,select,summary,textarea') || $.isFunction( $el.get(0).onclick ) || $el.data('selectable') ) { - return true; - } - - // Check for attributes like data-fancybox-next or data-fancybox-close - for ( var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++ ) { - if ( atts[i].nodeName.substr(0, 14) === 'data-fancybox-' ) { - return true; - } - } - - return false; - }; - - var hasScrollbars = function( el ) { - var overflowY = window.getComputedStyle( el )['overflow-y']; - var overflowX = window.getComputedStyle( el )['overflow-x']; - - var vertical = (overflowY === 'scroll' || overflowY === 'auto') && el.scrollHeight > el.clientHeight; - var horizontal = (overflowX === 'scroll' || overflowX === 'auto') && el.scrollWidth > el.clientWidth; - - return vertical || horizontal; - }; - - var isScrollable = function ( $el ) { - var rez = false; - - while ( true ) { - rez = hasScrollbars( $el.get(0) ); - - if ( rez ) { - break; - } - - $el = $el.parent(); - - if ( !$el.length || $el.hasClass( 'fancybox-stage' ) || $el.is( 'body' ) ) { - break; - } - } - - return rez; - }; - - - var Guestures = function ( instance ) { - var self = this; - - self.instance = instance; - - self.$bg = instance.$refs.bg; - self.$stage = instance.$refs.stage; - self.$container = instance.$refs.container; - - self.destroy(); - - self.$container.on( 'touchstart.fb.touch mousedown.fb.touch', $.proxy(self, 'ontouchstart') ); - }; - - Guestures.prototype.destroy = function() { - this.$container.off( '.fb.touch' ); - }; - - Guestures.prototype.ontouchstart = function( e ) { - var self = this; - - var $target = $( e.target ); - var instance = self.instance; - var current = instance.current; - var $content = current.$content; - - var isTouchDevice = ( e.type == 'touchstart' ); - - // Do not respond to both (touch and mouse) events - if ( isTouchDevice ) { - self.$container.off( 'mousedown.fb.touch' ); - } - - // Ignore right click - if ( e.originalEvent && e.originalEvent.button == 2 ) { - return; - } - - // Ignore taping on links, buttons, input elements - if ( !$target.length || isClickable( $target ) || isClickable( $target.parent() ) ) { - return; - } - - // Ignore clicks on the scrollbar - if ( !$target.is('img') && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left ) { - return; - } - - // Ignore clicks while zooming or closing - if ( !current || self.instance.isAnimating || self.instance.isClosing ) { - e.stopPropagation(); - e.preventDefault(); - - return; - } - - self.realPoints = self.startPoints = pointers( e ); - - if ( !self.startPoints ) { - return; - } - - e.stopPropagation(); - - self.startEvent = e; - - self.canTap = true; - self.$target = $target; - self.$content = $content; - self.opts = current.opts.touch; - - self.isPanning = false; - self.isSwiping = false; - self.isZooming = false; - self.isScrolling = false; - - self.sliderStartPos = self.sliderLastPos || { top: 0, left: 0 }; - self.contentStartPos = $.fancybox.getTranslate( self.$content ); - self.contentLastPos = null; - - self.startTime = new Date().getTime(); - self.distanceX = self.distanceY = self.distance = 0; - - self.canvasWidth = Math.round( current.$slide[0].clientWidth ); - self.canvasHeight = Math.round( current.$slide[0].clientHeight ); - - $(document) - .off( '.fb.touch' ) - .on( isTouchDevice ? 'touchend.fb.touch touchcancel.fb.touch' : 'mouseup.fb.touch mouseleave.fb.touch', $.proxy(self, "ontouchend")) - .on( isTouchDevice ? 'touchmove.fb.touch' : 'mousemove.fb.touch', $.proxy(self, "ontouchmove")); - - if ( $.fancybox.isMobile ) { - document.addEventListener('scroll', self.onscroll, true); - } - - if ( !(self.opts || instance.canPan() ) || !( $target.is( self.$stage ) || self.$stage.find( $target ).length ) ) { - - // Prevent image ghosting while dragging - if ( $target.is('img') ) { - e.preventDefault(); - } - - return; - } - - if ( !( $.fancybox.isMobile && ( isScrollable( $target ) || isScrollable( $target.parent() ) ) ) ) { - e.preventDefault(); - } - - if ( self.startPoints.length === 1 ) { - if ( current.type === 'image' && ( self.contentStartPos.width > self.canvasWidth + 1 || self.contentStartPos.height > self.canvasHeight + 1 ) ) { - $.fancybox.stop( self.$content ); - - self.$content.css( 'transition-duration', '' ); - - self.isPanning = true; - - } else { - self.isSwiping = true; - } - - self.$container.addClass( 'fancybox-controls--isGrabbing' ); - } - - if ( self.startPoints.length === 2 && !instance.isAnimating && !current.hasError && current.type === 'image' && ( current.isLoaded || current.$ghost ) ) { - self.canTap = false; - self.isSwiping = false; - self.isPanning = false; - - self.isZooming = true; - - $.fancybox.stop( self.$content ); - - self.$content.css( 'transition-duration', '' ); - - self.centerPointStartX = ( ( self.startPoints[0].x + self.startPoints[1].x ) * 0.5 ) - $(window).scrollLeft(); - self.centerPointStartY = ( ( self.startPoints[0].y + self.startPoints[1].y ) * 0.5 ) - $(window).scrollTop(); - - self.percentageOfImageAtPinchPointX = ( self.centerPointStartX - self.contentStartPos.left ) / self.contentStartPos.width; - self.percentageOfImageAtPinchPointY = ( self.centerPointStartY - self.contentStartPos.top ) / self.contentStartPos.height; - - self.startDistanceBetweenFingers = distance( self.startPoints[0], self.startPoints[1] ); - } - - }; - - Guestures.prototype.onscroll = function(e) { - self.isScrolling = true; - }; - - Guestures.prototype.ontouchmove = function( e ) { - var self = this, - $target = $(e.target); - - if ( self.isScrolling || !( $target.is( self.$stage ) || self.$stage.find( $target ).length ) ) { - self.canTap = false; - - return; - } - - self.newPoints = pointers( e ); - - if ( !( self.opts || self.instance.canPan() ) || !self.newPoints || !self.newPoints.length ) { - return; - } - - if ( !(self.isSwiping && self.isSwiping === true) ) { - e.preventDefault(); - } - - self.distanceX = distance( self.newPoints[0], self.startPoints[0], 'x' ); - self.distanceY = distance( self.newPoints[0], self.startPoints[0], 'y' ); - - self.distance = distance( self.newPoints[0], self.startPoints[0] ) - - // Skip false ontouchmove events (Chrome) - if ( self.distance > 0 ) { - if ( self.isSwiping ) { - self.onSwipe(e); - - } else if ( self.isPanning ) { - self.onPan(); - - } else if ( self.isZooming ) { - self.onZoom(); - } - } - - }; - - Guestures.prototype.onSwipe = function(e) { - var self = this, - swiping = self.isSwiping, - left = self.sliderStartPos.left || 0, - angle; - - // If direction is not yet determined - if ( swiping === true ) { - - // We need at least 10px distance to correctly calculate an angle - if ( Math.abs( self.distance ) > 10 ) { - self.canTap = false; - - if ( self.instance.group.length < 2 && self.opts.vertical ) { - self.isSwiping = 'y'; - - } else if ( self.instance.isDragging || self.opts.vertical === false || ( self.opts.vertical === 'auto' && $( window ).width() > 800 ) ) { - self.isSwiping = 'x'; - - } else { - angle = Math.abs( Math.atan2( self.distanceY, self.distanceX ) * 180 / Math.PI ); - - self.isSwiping = ( angle > 45 && angle < 135 ) ? 'y' : 'x'; - } - - self.canTap = false; - - if ( self.isSwiping === 'y' && $.fancybox.isMobile && ( isScrollable( self.$target ) || isScrollable( self.$target.parent() ) ) ) { - self.isScrolling = true; - - return; - } - - self.instance.isDragging = self.isSwiping; - - // Reset points to avoid jumping, because we dropped first swipes to calculate the angle - self.startPoints = self.newPoints; - - $.each(self.instance.slides, function( index, slide ) { - $.fancybox.stop( slide.$slide ); - - slide.$slide.css( 'transition-duration', '' ); - - slide.inTransition = false; - - if ( slide.pos === self.instance.current.pos ) { - self.sliderStartPos.left = $.fancybox.getTranslate( slide.$slide ).left; - } - }); - - // Stop slideshow - if ( self.instance.SlideShow && self.instance.SlideShow.isActive ) { - self.instance.SlideShow.stop(); - } - } - - return; - } - - // Sticky edges - if ( swiping == 'x' ) { - if ( self.distanceX > 0 && ( self.instance.group.length < 2 || ( self.instance.current.index === 0 && !self.instance.current.opts.loop ) ) ) { - left = left + Math.pow( self.distanceX, 0.8 ); - - } else if ( self.distanceX < 0 && ( self.instance.group.length < 2 || ( self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop ) ) ) { - left = left - Math.pow( -self.distanceX, 0.8 ); - - } else { - left = left + self.distanceX; - } - } - - self.sliderLastPos = { - top : swiping == 'x' ? 0 : self.sliderStartPos.top + self.distanceY, - left : left - }; - - if ( self.requestId ) { - cancelAFrame( self.requestId ); - - self.requestId = null; - } - - self.requestId = requestAFrame(function() { - - if ( self.sliderLastPos ) { - $.each(self.instance.slides, function( index, slide ) { - var pos = slide.pos - self.instance.currPos; - - $.fancybox.setTranslate( slide.$slide, { - top : self.sliderLastPos.top, - left : self.sliderLastPos.left + ( pos * self.canvasWidth ) + ( pos * slide.opts.gutter ) - }); - }); - - self.$container.addClass( 'fancybox-is-sliding' ); - } - - }); - - }; - - Guestures.prototype.onPan = function() { - var self = this; - - // Sometimes, when tapping causally, image can move a bit and that breaks double tapping - if ( distance( self.newPoints[0], self.realPoints[0] ) < ($.fancybox.isMobile ? 10 : 5) ) { - self.startPoints = self.newPoints; - return; - } - - self.canTap = false; - - self.contentLastPos = self.limitMovement(); - - if ( self.requestId ) { - cancelAFrame( self.requestId ); - - self.requestId = null; - } - - self.requestId = requestAFrame(function() { - $.fancybox.setTranslate( self.$content, self.contentLastPos ); - }); - }; - - // Make panning sticky to the edges - Guestures.prototype.limitMovement = function() { - var self = this; - - var canvasWidth = self.canvasWidth; - var canvasHeight = self.canvasHeight; - - var distanceX = self.distanceX; - var distanceY = self.distanceY; - - var contentStartPos = self.contentStartPos; - - var currentOffsetX = contentStartPos.left; - var currentOffsetY = contentStartPos.top; - - var currentWidth = contentStartPos.width; - var currentHeight = contentStartPos.height; - - var minTranslateX, minTranslateY, - maxTranslateX, maxTranslateY, - newOffsetX, newOffsetY; - - if ( currentWidth > canvasWidth ) { - newOffsetX = currentOffsetX + distanceX; - - } else { - newOffsetX = currentOffsetX; - } - - newOffsetY = currentOffsetY + distanceY; - - // Slow down proportionally to traveled distance - minTranslateX = Math.max( 0, canvasWidth * 0.5 - currentWidth * 0.5 ); - minTranslateY = Math.max( 0, canvasHeight * 0.5 - currentHeight * 0.5 ); - - maxTranslateX = Math.min( canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5 ); - maxTranslateY = Math.min( canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5 ); - - if ( currentWidth > canvasWidth ) { - - // -> - if ( distanceX > 0 && newOffsetX > minTranslateX ) { - newOffsetX = minTranslateX - 1 + Math.pow( -minTranslateX + currentOffsetX + distanceX, 0.8 ) || 0; - } - - // <- - if ( distanceX < 0 && newOffsetX < maxTranslateX ) { - newOffsetX = maxTranslateX + 1 - Math.pow( maxTranslateX - currentOffsetX - distanceX, 0.8 ) || 0; - } - - } - - if ( currentHeight > canvasHeight ) { - - // \/ - if ( distanceY > 0 && newOffsetY > minTranslateY ) { - newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8 ) || 0; - } - - // /\ - if ( distanceY < 0 && newOffsetY < maxTranslateY ) { - newOffsetY = maxTranslateY + 1 - Math.pow ( maxTranslateY - currentOffsetY - distanceY, 0.8 ) || 0; - } - - } - - return { - top : newOffsetY, - left : newOffsetX, - scaleX : contentStartPos.scaleX, - scaleY : contentStartPos.scaleY - }; - - }; - - Guestures.prototype.limitPosition = function( newOffsetX, newOffsetY, newWidth, newHeight ) { - var self = this; - - var canvasWidth = self.canvasWidth; - var canvasHeight = self.canvasHeight; - - if ( newWidth > canvasWidth ) { - newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; - newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; - - } else { - - // Center horizontally - newOffsetX = Math.max( 0, canvasWidth / 2 - newWidth / 2 ); - - } - - if ( newHeight > canvasHeight ) { - newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; - newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; - - } else { - - // Center vertically - newOffsetY = Math.max( 0, canvasHeight / 2 - newHeight / 2 ); - - } - - return { - top : newOffsetY, - left : newOffsetX - }; - - }; - - Guestures.prototype.onZoom = function() { - var self = this; - - // Calculate current distance between points to get pinch ratio and new width and height - - var currentWidth = self.contentStartPos.width; - var currentHeight = self.contentStartPos.height; - - var currentOffsetX = self.contentStartPos.left; - var currentOffsetY = self.contentStartPos.top; - - var endDistanceBetweenFingers = distance( self.newPoints[0], self.newPoints[1] ); - - var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; - - var newWidth = Math.floor( currentWidth * pinchRatio ); - var newHeight = Math.floor( currentHeight * pinchRatio ); - - // This is the translation due to pinch-zooming - var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; - var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; - - //Point between the two touches - - var centerPointEndX = ((self.newPoints[0].x + self.newPoints[1].x) / 2) - $(window).scrollLeft(); - var centerPointEndY = ((self.newPoints[0].y + self.newPoints[1].y) / 2) - $(window).scrollTop(); - - // And this is the translation due to translation of the centerpoint - // between the two fingers - - var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; - var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; - - // The new offset is the old/current one plus the total translation - - var newOffsetX = currentOffsetX + ( translateFromZoomingX + translateFromTranslatingX ); - var newOffsetY = currentOffsetY + ( translateFromZoomingY + translateFromTranslatingY ); - - var newPos = { - top : newOffsetY, - left : newOffsetX, - scaleX : self.contentStartPos.scaleX * pinchRatio, - scaleY : self.contentStartPos.scaleY * pinchRatio - }; - - self.canTap = false; - - self.newWidth = newWidth; - self.newHeight = newHeight; - - self.contentLastPos = newPos; - - if ( self.requestId ) { - cancelAFrame( self.requestId ); - - self.requestId = null; - } - - self.requestId = requestAFrame(function() { - $.fancybox.setTranslate( self.$content, self.contentLastPos ); - }); - - }; - - Guestures.prototype.ontouchend = function( e ) { - var self = this; - var dMs = Math.max( (new Date().getTime() ) - self.startTime, 1); - - var swiping = self.isSwiping; - var panning = self.isPanning; - var zooming = self.isZooming; - var scrolling = self.isScrolling; - - self.endPoints = pointers( e ); - - self.$container.removeClass( 'fancybox-controls--isGrabbing' ); - - $(document).off( '.fb.touch' ); - - document.removeEventListener('scroll', self.onscroll, true); - - if ( self.requestId ) { - cancelAFrame( self.requestId ); - - self.requestId = null; - } - - self.isSwiping = false; - self.isPanning = false; - self.isZooming = false; - self.isScrolling = false; - - self.instance.isDragging = false; - - if ( self.canTap ) { - return self.onTap( e ); - } - - self.speed = 366; - - // Speed in px/ms - self.velocityX = self.distanceX / dMs * 0.5; - self.velocityY = self.distanceY / dMs * 0.5; - - self.speedX = Math.max( self.speed * 0.5, Math.min( self.speed * 1.5, ( 1 / Math.abs( self.velocityX ) ) * self.speed ) ); - - if ( panning ) { - self.endPanning(); - - } else if ( zooming ) { - self.endZooming(); - - } else { - self.endSwiping( swiping, scrolling ); - } - - return; - }; - - Guestures.prototype.endSwiping = function( swiping, scrolling ) { - var self = this, - ret = false, - len = self.instance.group.length; - - self.sliderLastPos = null; - - // Close if swiped vertically / navigate if horizontally - if ( swiping == 'y' && !scrolling && Math.abs( self.distanceY ) > 50 ) { - - // Continue vertical movement - $.fancybox.animate( self.instance.current.$slide, { - top : self.sliderStartPos.top + self.distanceY + ( self.velocityY * 150 ), - opacity : 0 - }, 150 ); - - ret = self.instance.close( true, 300 ); - - } else if ( swiping == 'x' && self.distanceX > 50 && len > 1 ) { - ret = self.instance.previous( self.speedX ); - - } else if ( swiping == 'x' && self.distanceX < -50 && len > 1 ) { - ret = self.instance.next( self.speedX ); - } - - if ( ret === false && ( swiping == 'x' || swiping == 'y' ) ) { - if ( scrolling || len < 2 ) { - self.instance.centerSlide( self.instance.current, 150 ); - } else { - self.instance.jumpTo( self.instance.current.index ); - } - } - - self.$container.removeClass( 'fancybox-is-sliding' ); - - }; - - // Limit panning from edges - // ======================== - - Guestures.prototype.endPanning = function() { - - var self = this; - var newOffsetX, newOffsetY, newPos; - - if ( !self.contentLastPos ) { - return; - } - - if ( self.opts.momentum === false ) { - newOffsetX = self.contentLastPos.left; - newOffsetY = self.contentLastPos.top; - - } else { - - // Continue movement - newOffsetX = self.contentLastPos.left + ( self.velocityX * self.speed ); - newOffsetY = self.contentLastPos.top + ( self.velocityY * self.speed ); - } - - newPos = self.limitPosition( newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height ); - - newPos.width = self.contentStartPos.width; - newPos.height = self.contentStartPos.height; - - $.fancybox.animate( self.$content, newPos, 330 ); - }; - - - Guestures.prototype.endZooming = function() { - var self = this; - - var current = self.instance.current; - - var newOffsetX, newOffsetY, newPos, reset; - - var newWidth = self.newWidth; - var newHeight = self.newHeight; - - if ( !self.contentLastPos ) { - return; - } - - newOffsetX = self.contentLastPos.left; - newOffsetY = self.contentLastPos.top; - - reset = { - top : newOffsetY, - left : newOffsetX, - width : newWidth, - height : newHeight, - scaleX : 1, - scaleY : 1 - }; - - // Reset scalex/scaleY values; this helps for perfomance and does not break animation - $.fancybox.setTranslate( self.$content, reset ); - - if ( newWidth < self.canvasWidth && newHeight < self.canvasHeight ) { - self.instance.scaleToFit( 150 ); - - } else if ( newWidth > current.width || newHeight > current.height ) { - self.instance.scaleToActual( self.centerPointStartX, self.centerPointStartY, 150 ); - - } else { - - newPos = self.limitPosition( newOffsetX, newOffsetY, newWidth, newHeight ); - - // Switch from scale() to width/height or animation will not work correctly - $.fancybox.setTranslate( self.content, $.fancybox.getTranslate( self.$content ) ); - - $.fancybox.animate( self.$content, newPos, 150 ); - } - - }; - - Guestures.prototype.onTap = function(e) { - var self = this; - var $target = $( e.target ); - - var instance = self.instance; - var current = instance.current; - - var endPoints = ( e && pointers( e ) ) || self.startPoints; - - var tapX = endPoints[0] ? endPoints[0].x - self.$stage.offset().left : 0; - var tapY = endPoints[0] ? endPoints[0].y - self.$stage.offset().top : 0; - - var where; - - var process = function ( prefix ) { - - var action = current.opts[ prefix ]; - - if ( $.isFunction( action ) ) { - action = action.apply( instance, [ current, e ] ); - } - - if ( !action) { - return; - } - - switch ( action ) { - - case "close" : - - instance.close( self.startEvent ); - - break; - - case "toggleControls" : - - instance.toggleControls( true ); - - break; - - case "next" : - - instance.next(); - - break; - - case "nextOrClose" : - - if ( instance.group.length > 1 ) { - instance.next(); - - } else { - instance.close( self.startEvent ); - } - - break; - - case "zoom" : - - if ( current.type == 'image' && ( current.isLoaded || current.$ghost ) ) { - - if ( instance.canPan() ) { - instance.scaleToFit(); - - } else if ( instance.isScaledDown() ) { - instance.scaleToActual( tapX, tapY ); - - } else if ( instance.group.length < 2 ) { - instance.close( self.startEvent ); - } - } - - break; - } - - }; - - // Ignore right click - if ( e.originalEvent && e.originalEvent.button == 2 ) { - return; - } - - // Skip if clicked on the scrollbar - if ( !$target.is('img') && tapX > $target[0].clientWidth + $target.offset().left ) { - return; - } - - // Check where is clicked - if ( $target.is( '.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container' ) ) { - where = 'Outside'; - - } else if ( $target.is( '.fancybox-slide' ) ) { - where = 'Slide'; - - } else if ( instance.current.$content && instance.current.$content.find( $target ).addBack().filter( $target ).length ) { - where = 'Content'; - - } else { - return; - } - - // Check if this is a double tap - if ( self.tapped ) { - - // Stop previously created single tap - clearTimeout( self.tapped ); - self.tapped = null; - - // Skip if distance between taps is too big - if ( Math.abs( tapX - self.tapX ) > 50 || Math.abs( tapY - self.tapY ) > 50 ) { - return this; - } - - // OK, now we assume that this is a double-tap - process( 'dblclick' + where ); - - } else { - - // Single tap will be processed if user has not clicked second time within 300ms - // or there is no need to wait for double-tap - self.tapX = tapX; - self.tapY = tapY; - - if ( current.opts[ 'dblclick' + where ] && current.opts[ 'dblclick' + where ] !== current.opts[ 'click' + where ] ) { - - self.tapped = setTimeout(function() { - self.tapped = null; - - process( 'click' + where ); - - }, 500); - - } else { - process( 'click' + where ); - } - - } - - return this; - }; - - $(document).on('onActivate.fb', function (e, instance) { - if ( instance && !instance.Guestures ) { - instance.Guestures = new Guestures( instance ); - } - }); - -}( window, document, window.jQuery || jQuery )); - -// ========================================================================== -// -// SlideShow -// Enables slideshow functionality -// -// Example of usage: -// $.fancybox.getInstance().SlideShow.start() -// -// ========================================================================== -;(function (document, $) { - 'use strict'; - - $.extend(true, $.fancybox.defaults, { - btnTpl : { - slideShow : - '' - }, - slideShow : { - autoStart : false, - speed : 3000 - } - }); - - var SlideShow = function( instance ) { - this.instance = instance; - this.init(); - }; - - $.extend( SlideShow.prototype, { - timer : null, - isActive : false, - $button : null, - - init : function() { - var self = this; - - self.$button = self.instance.$refs.toolbar.find('[data-fancybox-play]').on('click', function() { - self.toggle(); - }); - - if ( self.instance.group.length < 2 || !self.instance.group[ self.instance.currIndex ].opts.slideShow ) { - self.$button.hide(); - } - }, - - set : function( force ) { - var self = this; - - // Check if reached last element - if ( self.instance && self.instance.current && (force === true || self.instance.current.opts.loop || self.instance.currIndex < self.instance.group.length - 1 )) { - self.timer = setTimeout(function() { - if ( self.isActive ) { - self.instance.jumpTo( (self.instance.currIndex + 1) % self.instance.group.length ); - } - - }, self.instance.current.opts.slideShow.speed); - - } else { - self.stop(); - self.instance.idleSecondsCounter = 0; - self.instance.showControls(); - } - }, - - clear : function() { - var self = this; - - clearTimeout( self.timer ); - - self.timer = null; - }, - - start : function() { - var self = this; - var current = self.instance.current; - - if ( current ) { - self.isActive = true; - - self.$button - .attr( 'title', current.opts.i18n[ current.opts.lang ].PLAY_STOP ) - .removeClass( 'fancybox-button--play' ) - .addClass( 'fancybox-button--pause' ); - - self.set( true ); - } - }, - - stop : function() { - var self = this; - var current = self.instance.current; - - self.clear(); - - self.$button - .attr( 'title', current.opts.i18n[ current.opts.lang ].PLAY_START ) - .removeClass( 'fancybox-button--pause' ) - .addClass( 'fancybox-button--play' ); - - self.isActive = false; - }, - - toggle : function() { - var self = this; - - if ( self.isActive ) { - self.stop(); - - } else { - self.start(); - } - } - - }); - - $(document).on({ - 'onInit.fb' : function(e, instance) { - if ( instance && !instance.SlideShow ) { - instance.SlideShow = new SlideShow( instance ); - } - }, - - 'beforeShow.fb' : function(e, instance, current, firstRun) { - var SlideShow = instance && instance.SlideShow; - - if ( firstRun ) { - - if ( SlideShow && current.opts.slideShow.autoStart ) { - SlideShow.start(); - } - - } else if ( SlideShow && SlideShow.isActive ) { - SlideShow.clear(); - } - }, - - 'afterShow.fb' : function(e, instance, current) { - var SlideShow = instance && instance.SlideShow; - - if ( SlideShow && SlideShow.isActive ) { - SlideShow.set(); - } - }, - - 'afterKeydown.fb' : function(e, instance, current, keypress, keycode) { - var SlideShow = instance && instance.SlideShow; - - // "P" or Spacebar - if ( SlideShow && current.opts.slideShow && ( keycode === 80 || keycode === 32 ) && !$(document.activeElement).is( 'button,a,input' ) ) { - keypress.preventDefault(); - - SlideShow.toggle(); - } - }, - - 'beforeClose.fb onDeactivate.fb' : function(e, instance) { - var SlideShow = instance && instance.SlideShow; - - if ( SlideShow ) { - SlideShow.stop(); - } - } - }); - - // Page Visibility API to pause slideshow when window is not active - $(document).on("visibilitychange", function() { - var instance = $.fancybox.getInstance(); - var SlideShow = instance && instance.SlideShow; - - if ( SlideShow && SlideShow.isActive ) { - if ( document.hidden ) { - SlideShow.clear(); - - } else { - SlideShow.set(); - } - } - }); - -}( document, window.jQuery || jQuery )); - -// ========================================================================== -// -// FullScreen -// Adds fullscreen functionality -// -// ========================================================================== -;(function (document, $) { - 'use strict'; - - // Collection of methods supported by user browser - var fn = (function () { - - var fnMap = [ - [ - 'requestFullscreen', - 'exitFullscreen', - 'fullscreenElement', - 'fullscreenEnabled', - 'fullscreenchange', - 'fullscreenerror' - ], - // new WebKit - [ - 'webkitRequestFullscreen', - 'webkitExitFullscreen', - 'webkitFullscreenElement', - 'webkitFullscreenEnabled', - 'webkitfullscreenchange', - 'webkitfullscreenerror' - - ], - // old WebKit (Safari 5.1) - [ - 'webkitRequestFullScreen', - 'webkitCancelFullScreen', - 'webkitCurrentFullScreenElement', - 'webkitCancelFullScreen', - 'webkitfullscreenchange', - 'webkitfullscreenerror' - - ], - [ - 'mozRequestFullScreen', - 'mozCancelFullScreen', - 'mozFullScreenElement', - 'mozFullScreenEnabled', - 'mozfullscreenchange', - 'mozfullscreenerror' - ], - [ - 'msRequestFullscreen', - 'msExitFullscreen', - 'msFullscreenElement', - 'msFullscreenEnabled', - 'MSFullscreenChange', - 'MSFullscreenError' - ] - ]; - - var val; - var ret = {}; - var i, j; - - for ( i = 0; i < fnMap.length; i++ ) { - val = fnMap[ i ]; - - if ( val && val[ 1 ] in document ) { - for ( j = 0; j < val.length; j++ ) { - ret[ fnMap[ 0 ][ j ] ] = val[ j ]; - } - - return ret; - } - } - - return false; - })(); - - // If browser does not have Full Screen API, then simply unset default button template and stop - if ( !fn ) { - - if ( $ && $.fancybox ) { - $.fancybox.defaults.btnTpl.fullScreen = false; - } - - return; - } - - var FullScreen = { - - request : function ( elem ) { - - elem = elem || document.documentElement; - - elem[ fn.requestFullscreen ]( elem.ALLOW_KEYBOARD_INPUT ); - - }, - exit : function () { - - document[ fn.exitFullscreen ](); - - }, - toggle : function ( elem ) { - - elem = elem || document.documentElement; - - if ( this.isFullscreen() ) { - this.exit(); - - } else { - this.request( elem ); - } - - }, - isFullscreen : function() { - - return Boolean( document[ fn.fullscreenElement ] ); - - }, - enabled : function() { - - return Boolean( document[ fn.fullscreenEnabled ] ); - - } - }; - - $.extend(true, $.fancybox.defaults, { - btnTpl : { - fullScreen : - '' - }, - fullScreen : { - autoStart : false - } - }); - - $(document).on({ - 'onInit.fb' : function(e, instance) { - var $container; - - if ( instance && instance.group[ instance.currIndex ].opts.fullScreen ) { - $container = instance.$refs.container; - - $container.on('click.fb-fullscreen', '[data-fancybox-fullscreen]', function(e) { - - e.stopPropagation(); - e.preventDefault(); - - FullScreen.toggle( $container[ 0 ] ); - - }); - - if ( instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true ) { - FullScreen.request( $container[ 0 ] ); - } - - // Expose API - instance.FullScreen = FullScreen; - - } else if ( instance ) { - instance.$refs.toolbar.find('[data-fancybox-fullscreen]').hide(); - } - - }, - - 'afterKeydown.fb' : function(e, instance, current, keypress, keycode) { - - // "P" or Spacebar - if ( instance && instance.FullScreen && keycode === 70 ) { - keypress.preventDefault(); - - instance.FullScreen.toggle( instance.$refs.container[ 0 ] ); - } - - }, - - 'beforeClose.fb' : function( instance ) { - if ( instance && instance.FullScreen ) { - FullScreen.exit(); - } - } - }); - - $(document).on(fn.fullscreenchange, function() { - var isFullscreen = FullScreen.isFullscreen(), - instance = $.fancybox.getInstance(); - - if ( instance ) { - - // If image is zooming, then force to stop and reposition properly - if ( instance.current && instance.current.type === 'image' && instance.isAnimating ) { - instance.current.$content.css( 'transition', 'none' ); - - instance.isAnimating = false; - - instance.update( true, true, 0 ); - } - - instance.trigger( 'onFullscreenChange', isFullscreen ); - - instance.$refs.container.toggleClass( 'fancybox-is-fullscreen', isFullscreen ); - } - - }); - -}( document, window.jQuery || jQuery )); - -// ========================================================================== -// -// Thumbs -// Displays thumbnails in a grid -// -// ========================================================================== -;(function (document, $) { - 'use strict'; - - // Make sure there are default values - $.fancybox.defaults = $.extend(true, { - btnTpl : { - thumbs : - '' - }, - thumbs : { - autoStart : false, // Display thumbnails on opening - hideOnClose : true, // Hide thumbnail grid when closing animation starts - parentEl : '.fancybox-container', // Container is injected into this element - axis : 'y' // Vertical (y) or horizontal (x) scrolling - } - }, $.fancybox.defaults); - - var FancyThumbs = function( instance ) { - this.init( instance ); - }; - - $.extend( FancyThumbs.prototype, { - - $button : null, - $grid : null, - $list : null, - isVisible : false, - isActive : false, - - init : function( instance ) { - var self = this; - - self.instance = instance; - - instance.Thumbs = self; - - // Enable thumbs if at least two group items have thumbnails - var first = instance.group[0], - second = instance.group[1]; - - self.opts = instance.group[ instance.currIndex ].opts.thumbs; - - self.$button = instance.$refs.toolbar.find( '[data-fancybox-thumbs]' ); - - if ( self.opts && first && second && ( - ( first.type == 'image' || first.opts.thumb || first.opts.$thumb ) && - ( second.type == 'image' || second.opts.thumb || second.opts.$thumb ) - )) { - - self.$button.show().on('click', function() { - self.toggle(); - }); - - self.isActive = true; - - } else { - self.$button.hide(); - } - }, - - create : function() { - var self = this, - instance = self.instance, - parentEl = self.opts.parentEl, - list, - src; - - self.$grid = $('
').appendTo( instance.$refs.container.find( parentEl ).addBack().filter( parentEl ) ); - - // Build list HTML - list = '
    '; - - $.each(instance.group, function( i, item ) { - src = item.opts.thumb || ( item.opts.$thumb ? item.opts.$thumb.attr( 'src' ) : null ); - - if ( !src && item.type === 'image' ) { - src = item.src; - } - - if ( src && src.length ) { - list += '
  • '; - } - }); - - list += '
'; - - self.$list = $( list ).appendTo( self.$grid ).on('click', 'li', function() { - instance.jumpTo( $(this).data('index') ); - }); - - self.$list.find( 'img' ).hide().one('load', function() { - var $parent = $(this).parent().removeClass( 'fancybox-thumbs-loading' ), - thumbWidth = $parent.outerWidth(), - thumbHeight = $parent.outerHeight(), - width, - height, - widthRatio, - heightRatio; - - width = this.naturalWidth || this.width; - height = this.naturalHeight || this.height; - - // Calculate thumbnail dimensions; center vertically and horizontally - widthRatio = width / thumbWidth; - heightRatio = height / thumbHeight; - - if (widthRatio >= 1 && heightRatio >= 1) { - if (widthRatio > heightRatio) { - width = width / heightRatio; - height = thumbHeight; - - } else { - width = thumbWidth; - height = height / widthRatio; - } - } - - $(this).css({ - width : Math.floor(width), - height : Math.floor(height), - 'margin-top' : height > thumbHeight ? ( Math.floor(thumbHeight * 0.3 - height * 0.3 ) ) : Math.floor(thumbHeight * 0.5 - height * 0.5 ), - 'margin-left' : Math.floor(thumbWidth * 0.5 - width * 0.5 ) - }).show(); - - }) - .each(function() { - this.src = $( this ).data( 'src' ); - }); - - if ( self.opts.axis === 'x' ) { - self.$list.width( parseInt( self.$grid.css("padding-right") ) + ( instance.group.length * self.$list.children().eq(0).outerWidth(true) ) + 'px' ); - } - }, - - focus : function( duration ) { - var self = this, - $list = self.$list, - thumb, - thumbPos; - - if ( self.instance.current ) { - thumb = $list.children() - .removeClass( 'fancybox-thumbs-active' ) - .filter('[data-index="' + self.instance.current.index + '"]') - .addClass('fancybox-thumbs-active'); - - thumbPos = thumb.position(); - - // Check if need to scroll to make current thumb visible - if ( self.opts.axis === 'y' && ( thumbPos.top < 0 || thumbPos.top > ( $list.height() - thumb.outerHeight() ) ) ) { - $list.stop().animate({ 'scrollTop' : $list.scrollTop() + thumbPos.top }, duration); - - } else if ( self.opts.axis === 'x' && ( - thumbPos.left < $list.parent().scrollLeft() || - thumbPos.left > ( $list.parent().scrollLeft() + ( $list.parent().width() - thumb.outerWidth() ) ) - ) - ) { - $list.parent().stop().animate({ 'scrollLeft' : thumbPos.left }, duration); - } - } - }, - - update : function() { - this.instance.$refs.container.toggleClass( 'fancybox-show-thumbs', this.isVisible ); - - if ( this.isVisible ) { - if ( !this.$grid ) { - this.create(); - } - - this.instance.trigger( 'onThumbsShow' ); - - this.focus( 0 ); - - } else if ( this.$grid ) { - this.instance.trigger( 'onThumbsHide' ); - } - - // Update content position - this.instance.update(); - }, - - hide : function() { - this.isVisible = false; - this.update(); - }, - - show : function() { - this.isVisible = true; - this.update(); - }, - - toggle : function() { - this.isVisible = !this.isVisible; - this.update(); - } - }); - - $(document).on({ - - 'onInit.fb' : function(e, instance) { - var Thumbs; - - if ( instance && !instance.Thumbs ) { - Thumbs = new FancyThumbs( instance ); - - if ( Thumbs.isActive && Thumbs.opts.autoStart === true ) { - Thumbs.show(); - } - } - }, - - 'beforeShow.fb' : function(e, instance, item, firstRun) { - var Thumbs = instance && instance.Thumbs; - - if ( Thumbs && Thumbs.isVisible ) { - Thumbs.focus( firstRun ? 0 : 250 ); - } - }, - - 'afterKeydown.fb' : function(e, instance, current, keypress, keycode) { - var Thumbs = instance && instance.Thumbs; - - // "G" - if ( Thumbs && Thumbs.isActive && keycode === 71 ) { - keypress.preventDefault(); - - Thumbs.toggle(); - } - }, - - 'beforeClose.fb' : function( e, instance ) { - var Thumbs = instance && instance.Thumbs; - - if ( Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false ) { - Thumbs.$grid.hide(); - } - } - - }); - -}(document, window.jQuery)); - -//// ========================================================================== -// -// Share -// Displays simple form for sharing current url -// -// ========================================================================== -;(function (document, $) { - 'use strict'; - - $.extend(true, $.fancybox.defaults, { - btnTpl : { - share : - '' - }, - share : { - tpl : - '
' + - '

{{SHARE}}

' + - '' + - '

' + - '
' - } - }); - - function escapeHtml(string) { - var entityMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/', - '`': '`', - '=': '=' - }; - - return String(string).replace(/[&<>"'`=\/]/g, function (s) { - return entityMap[s]; - }); - } - - $(document).on('click', '[data-fancybox-share]', function() { - var f = $.fancybox.getInstance(), - url, - tpl; - - if ( f ) { - url = f.current.opts.hash === false ? f.current.src : window.location; - tpl = f.current.opts.share.tpl - .replace( /\{\{media\}\}/g, f.current.type === 'image' ? encodeURIComponent( f.current.src ) : '' ) - .replace( /\{\{url\}\}/g, encodeURIComponent( url ) ) - .replace( /\{\{url_raw\}\}/g, escapeHtml( url ) ) - .replace( /\{\{descr\}\}/g, f.$caption ? encodeURIComponent( f.$caption.text() ) : '' ); - - $.fancybox.open({ - src : f.translate( f, tpl ), - type : 'html', - opts : { - animationEffect : "fade", - animationDuration : 250, - afterLoad : function(instance, current) { - // Opening links in a popup window - current.$content.find('.fancybox-share__links a').click(function() { - window.open(this.href, "Share", "width=550, height=450"); - return false; - }); - } - } - }); - } - - }); - -}( document, window.jQuery || jQuery )); - -// ========================================================================== -// -// Hash -// Enables linking to each modal -// -// ========================================================================== -;(function (document, window, $) { - 'use strict'; - - // Simple $.escapeSelector polyfill (for jQuery prior v3) - if ( !$.escapeSelector ) { - $.escapeSelector = function( sel ) { - var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - var fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }; - - return ( sel + "" ).replace( rcssescape, fcssescape ); - }; - } - - // Create new history entry only once - var shouldCreateHistory = true; - - // Variable containing last hash value set by fancyBox - // It will be used to determine if fancyBox needs to close after hash change is detected - var currentHash = null; - - // Throttling the history change - var timerID = null; - - // Get info about gallery name and current index from url - function parseUrl() { - var hash = window.location.hash.substr( 1 ); - var rez = hash.split( '-' ); - var index = rez.length > 1 && /^\+?\d+$/.test( rez[ rez.length - 1 ] ) ? parseInt( rez.pop( -1 ), 10 ) || 1 : 1; - var gallery = rez.join( '-' ); - - // Index is starting from 1 - if ( index < 1 ) { - index = 1; - } - - return { - hash : hash, - index : index, - gallery : gallery - }; - } - - // Trigger click evnt on links to open new fancyBox instance - function triggerFromUrl( url ) { - var $el; - - if ( url.gallery !== '' ) { - - // If we can find element matching 'data-fancybox' atribute, then trigger click event for that .. - $el = $( "[data-fancybox='" + $.escapeSelector( url.gallery ) + "']" ).eq( url.index - 1 ); - - if ( !$el.length ) { - // .. if not, try finding element by ID - $el = $( "#" + $.escapeSelector( url.gallery ) + "" ); - } - - if ( $el.length ) { - shouldCreateHistory = false; - - $el.trigger( 'click' ); - } - - } - } - - // Get gallery name from current instance - function getGalleryID( instance ) { - var opts; - - if ( !instance ) { - return false; - } - - opts = instance.current ? instance.current.opts : instance.opts; - - return opts.hash || ( opts.$orig ? opts.$orig.data( 'fancybox' ) : '' ); - } - - // Start when DOM becomes ready - $(function() { - - // Check if user has disabled this module - if ( $.fancybox.defaults.hash === false ) { - return; - } - - // Update hash when opening/closing fancyBox - $(document).on({ - 'onInit.fb' : function( e, instance ) { - var url, gallery; - - if ( instance.group[ instance.currIndex ].opts.hash === false ) { - return; - } - - url = parseUrl(); - gallery = getGalleryID( instance ); - - // Make sure gallery start index matches index from hash - if ( gallery && url.gallery && gallery == url.gallery ) { - instance.currIndex = url.index - 1; - } - }, - - 'beforeShow.fb' : function( e, instance, current ) { - var gallery; - - if ( !current || current.opts.hash === false ) { - return; - } - - gallery = getGalleryID( instance ); - - // Update window hash - if ( gallery && gallery !== '' ) { - - if ( window.location.hash.indexOf( gallery ) < 0 ) { - instance.opts.origHash = window.location.hash; - } - - currentHash = gallery + ( instance.group.length > 1 ? '-' + ( current.index + 1 ) : '' ); - - if ( 'replaceState' in window.history ) { - if ( timerID ) { - clearTimeout( timerID ); - } - - timerID = setTimeout(function() { - window.history[ shouldCreateHistory ? 'pushState' : 'replaceState' ]( {} , document.title, window.location.pathname + window.location.search + '#' + currentHash ); - - timerID = null; - - shouldCreateHistory = false; - - }, 300); - - } else { - window.location.hash = currentHash; - } - - } - - }, - - 'beforeClose.fb' : function( e, instance, current ) { - var gallery, origHash; - - if ( timerID ) { - clearTimeout( timerID ); - } - - if ( current.opts.hash === false ) { - return; - } - - gallery = getGalleryID( instance ); - origHash = instance && instance.opts.origHash ? instance.opts.origHash : ''; - - // Remove hash from location bar - if ( gallery && gallery !== '' ) { - - if ( 'replaceState' in history ) { - window.history.replaceState( {} , document.title, window.location.pathname + window.location.search + origHash ); - - } else { - window.location.hash = origHash; - - // Keep original scroll position - $( window ).scrollTop( instance.scrollTop ).scrollLeft( instance.scrollLeft ); - } - } - - currentHash = null; - } - }); - - // Check if need to close after url has changed - $(window).on('hashchange.fb', function() { - var url = parseUrl(); - - if ( $.fancybox.getInstance() ) { - if ( currentHash && currentHash !== url.gallery + '-' + url.index && !( url.index === 1 && currentHash == url.gallery ) ) { - currentHash = null; - - $.fancybox.close(); - } - - } else if ( url.gallery !== '' ) { - triggerFromUrl( url ); - } - }); - - // Check current hash and trigger click event on matching element to start fancyBox, if needed - setTimeout(function() { - triggerFromUrl( parseUrl() ); - }, 50); - }); - -}( document, window, window.jQuery || jQuery )); - -;(function (document, $) { - 'use strict'; - - var prevTime = new Date().getTime(); - - $(document).on({ - 'onInit.fb' : function( e, instance, current ) { - instance.$refs.stage.on('mousewheel DOMMouseScroll wheel MozMousePixelScroll', function(e) { - var current = instance.current, - currTime = new Date().getTime(); - - if ( instance.group.length < 1 || current.opts.wheel === false || ( current.opts.wheel === 'auto' && current.type !== 'image' ) ) { - return; - } - - e.preventDefault(); - e.stopPropagation(); - - if ( current.$slide.hasClass( 'fancybox-animated' ) ) { - return; - } - - e = e.originalEvent || e; - - if ( currTime - prevTime < 250 ) { - return; - } - - prevTime = currTime; - - instance[ ( -e.deltaY || -e.deltaX || e.wheelDelta || -e.detail ) < 0 ? 'next' : 'previous' ](); - - }); - } - }); - -}( document, window.jQuery || jQuery )); diff --git a/public/assets/js/jquery.js b/public/assets/js/jquery.js deleted file mode 100644 index e836475..0000000 --- a/public/assets/js/jquery.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; -}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("' ); - html.attr( 'height', height ); - html.attr( 'width', width ); - if (video.type === 'youtube') { - html.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id ); - } else if (video.type === 'vimeo') { - html.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' ); - } else if (video.type === 'vzaar') { - html.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' ); - } - - iframe = $(html).wrap( '
' ).insertAfter(item.find('.owl-video')); - - this._playing = item.addClass('owl-video-playing'); - }; - - /** - * Checks whether an video is currently in full screen mode or not. - * @todo Bad style because looks like a readonly method but changes members. - * @protected - * @returns {Boolean} - */ - Video.prototype.isInFullScreen = function() { - var element = document.fullscreenElement || document.mozFullScreenElement || - document.webkitFullscreenElement; - - return element && $(element).parent().hasClass('owl-video-frame'); - }; - - /** - * Destroys the plugin. - */ - Video.prototype.destroy = function() { - var handler, property; - - this._core.$element.off('click.owl.video'); - - for (handler in this._handlers) { - this._core.$element.off(handler, this._handlers[handler]); - } - for (property in Object.getOwnPropertyNames(this)) { - typeof this[property] != 'function' && (this[property] = null); - } - }; - - $.fn.owlCarousel.Constructor.Plugins.Video = Video; - -})(window.Zepto || window.jQuery, window, document); - -/** - * Animate Plugin - * @version 2.3.4 - * @author Bartosz Wojciechowski - * @author David Deutsch - * @license The MIT License (MIT) - */ -;(function($, window, document, undefined) { - - /** - * Creates the animate plugin. - * @class The Navigation Plugin - * @param {Owl} scope - The Owl Carousel - */ - var Animate = function(scope) { - this.core = scope; - this.core.options = $.extend({}, Animate.Defaults, this.core.options); - this.swapping = true; - this.previous = undefined; - this.next = undefined; - - this.handlers = { - 'change.owl.carousel': $.proxy(function(e) { - if (e.namespace && e.property.name == 'position') { - this.previous = this.core.current(); - this.next = e.property.value; - } - }, this), - 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) { - if (e.namespace) { - this.swapping = e.type == 'translated'; - } - }, this), - 'translate.owl.carousel': $.proxy(function(e) { - if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) { - this.swap(); - } - }, this) - }; - - this.core.$element.on(this.handlers); - }; - - /** - * Default options. - * @public - */ - Animate.Defaults = { - animateOut: false, - animateIn: false - }; - - /** - * Toggles the animation classes whenever an translations starts. - * @protected - * @returns {Boolean|undefined} - */ - Animate.prototype.swap = function() { - - if (this.core.settings.items !== 1) { - return; - } - - if (!$.support.animation || !$.support.transition) { - return; - } - - this.core.speed(0); - - var left, - clear = $.proxy(this.clear, this), - previous = this.core.$stage.children().eq(this.previous), - next = this.core.$stage.children().eq(this.next), - incoming = this.core.settings.animateIn, - outgoing = this.core.settings.animateOut; - - if (this.core.current() === this.previous) { - return; - } - - if (outgoing) { - left = this.core.coordinates(this.previous) - this.core.coordinates(this.next); - previous.one($.support.animation.end, clear) - .css( { 'left': left + 'px' } ) - .addClass('animated owl-animated-out') - .addClass(outgoing); - } - - if (incoming) { - next.one($.support.animation.end, clear) - .addClass('animated owl-animated-in') - .addClass(incoming); - } - }; - - Animate.prototype.clear = function(e) { - $(e.target).css( { 'left': '' } ) - .removeClass('animated owl-animated-out owl-animated-in') - .removeClass(this.core.settings.animateIn) - .removeClass(this.core.settings.animateOut); - this.core.onTransitionEnd(); - }; - - /** - * Destroys the plugin. - * @public - */ - Animate.prototype.destroy = function() { - var handler, property; - - for (handler in this.handlers) { - this.core.$element.off(handler, this.handlers[handler]); - } - for (property in Object.getOwnPropertyNames(this)) { - typeof this[property] != 'function' && (this[property] = null); - } - }; - - $.fn.owlCarousel.Constructor.Plugins.Animate = Animate; - -})(window.Zepto || window.jQuery, window, document); - -/** - * Autoplay Plugin - * @version 2.3.4 - * @author Bartosz Wojciechowski - * @author Artus Kolanowski - * @author David Deutsch - * @author Tom De Caluwé - * @license The MIT License (MIT) - */ -;(function($, window, document, undefined) { - - /** - * Creates the autoplay plugin. - * @class The Autoplay Plugin - * @param {Owl} scope - The Owl Carousel - */ - var Autoplay = function(carousel) { - /** - * Reference to the core. - * @protected - * @type {Owl} - */ - this._core = carousel; - - /** - * The autoplay timeout id. - * @type {Number} - */ - this._call = null; - - /** - * Depending on the state of the plugin, this variable contains either - * the start time of the timer or the current timer value if it's - * paused. Since we start in a paused state we initialize the timer - * value. - * @type {Number} - */ - this._time = 0; - - /** - * Stores the timeout currently used. - * @type {Number} - */ - this._timeout = 0; - - /** - * Indicates whenever the autoplay is paused. - * @type {Boolean} - */ - this._paused = true; - - /** - * All event handlers. - * @protected - * @type {Object} - */ - this._handlers = { - 'changed.owl.carousel': $.proxy(function(e) { - if (e.namespace && e.property.name === 'settings') { - if (this._core.settings.autoplay) { - this.play(); - } else { - this.stop(); - } - } else if (e.namespace && e.property.name === 'position' && this._paused) { - // Reset the timer. This code is triggered when the position - // of the carousel was changed through user interaction. - this._time = 0; - } - }, this), - 'initialized.owl.carousel': $.proxy(function(e) { - if (e.namespace && this._core.settings.autoplay) { - this.play(); - } - }, this), - 'play.owl.autoplay': $.proxy(function(e, t, s) { - if (e.namespace) { - this.play(t, s); - } - }, this), - 'stop.owl.autoplay': $.proxy(function(e) { - if (e.namespace) { - this.stop(); - } - }, this), - 'mouseover.owl.autoplay': $.proxy(function() { - if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { - this.pause(); - } - }, this), - 'mouseleave.owl.autoplay': $.proxy(function() { - if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { - this.play(); - } - }, this), - 'touchstart.owl.core': $.proxy(function() { - if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { - this.pause(); - } - }, this), - 'touchend.owl.core': $.proxy(function() { - if (this._core.settings.autoplayHoverPause) { - this.play(); - } - }, this) - }; - - // register event handlers - this._core.$element.on(this._handlers); - - // set default options - this._core.options = $.extend({}, Autoplay.Defaults, this._core.options); - }; - - /** - * Default options. - * @public - */ - Autoplay.Defaults = { - autoplay: false, - autoplayTimeout: 5000, - autoplayHoverPause: false, - autoplaySpeed: false - }; - - /** - * Transition to the next slide and set a timeout for the next transition. - * @private - * @param {Number} [speed] - The animation speed for the animations. - */ - Autoplay.prototype._next = function(speed) { - this._call = window.setTimeout( - $.proxy(this._next, this, speed), - this._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read() - ); - - if (this._core.is('interacting') || document.hidden) { - return; - } - this._core.next(speed || this._core.settings.autoplaySpeed); - } - - /** - * Reads the current timer value when the timer is playing. - * @public - */ - Autoplay.prototype.read = function() { - return new Date().getTime() - this._time; - }; - - /** - * Starts the autoplay. - * @public - * @param {Number} [timeout] - The interval before the next animation starts. - * @param {Number} [speed] - The animation speed for the animations. - */ - Autoplay.prototype.play = function(timeout, speed) { - var elapsed; - - if (!this._core.is('rotating')) { - this._core.enter('rotating'); - } - - timeout = timeout || this._core.settings.autoplayTimeout; - - // Calculate the elapsed time since the last transition. If the carousel - // wasn't playing this calculation will yield zero. - elapsed = Math.min(this._time % (this._timeout || timeout), timeout); - - if (this._paused) { - // Start the clock. - this._time = this.read(); - this._paused = false; - } else { - // Clear the active timeout to allow replacement. - window.clearTimeout(this._call); - } - - // Adjust the origin of the timer to match the new timeout value. - this._time += this.read() % timeout - elapsed; - - this._timeout = timeout; - this._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed); - }; - - /** - * Stops the autoplay. - * @public - */ - Autoplay.prototype.stop = function() { - if (this._core.is('rotating')) { - // Reset the clock. - this._time = 0; - this._paused = true; - - window.clearTimeout(this._call); - this._core.leave('rotating'); - } - }; - - /** - * Pauses the autoplay. - * @public - */ - Autoplay.prototype.pause = function() { - if (this._core.is('rotating') && !this._paused) { - // Pause the clock. - this._time = this.read(); - this._paused = true; - - window.clearTimeout(this._call); - } - }; - - /** - * Destroys the plugin. - */ - Autoplay.prototype.destroy = function() { - var handler, property; - - this.stop(); - - for (handler in this._handlers) { - this._core.$element.off(handler, this._handlers[handler]); - } - for (property in Object.getOwnPropertyNames(this)) { - typeof this[property] != 'function' && (this[property] = null); - } - }; - - $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay; - -})(window.Zepto || window.jQuery, window, document); - -/** - * Navigation Plugin - * @version 2.3.4 - * @author Artus Kolanowski - * @author David Deutsch - * @license The MIT License (MIT) - */ -;(function($, window, document, undefined) { - 'use strict'; - - /** - * Creates the navigation plugin. - * @class The Navigation Plugin - * @param {Owl} carousel - The Owl Carousel. - */ - var Navigation = function(carousel) { - /** - * Reference to the core. - * @protected - * @type {Owl} - */ - this._core = carousel; - - /** - * Indicates whether the plugin is initialized or not. - * @protected - * @type {Boolean} - */ - this._initialized = false; - - /** - * The current paging indexes. - * @protected - * @type {Array} - */ - this._pages = []; - - /** - * All DOM elements of the user interface. - * @protected - * @type {Object} - */ - this._controls = {}; - - /** - * Markup for an indicator. - * @protected - * @type {Array.} - */ - this._templates = []; - - /** - * The carousel element. - * @type {jQuery} - */ - this.$element = this._core.$element; - - /** - * Overridden methods of the carousel. - * @protected - * @type {Object} - */ - this._overrides = { - next: this._core.next, - prev: this._core.prev, - to: this._core.to - }; - - /** - * All event handlers. - * @protected - * @type {Object} - */ - this._handlers = { - 'prepared.owl.carousel': $.proxy(function(e) { - if (e.namespace && this._core.settings.dotsData) { - this._templates.push('
' + - $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '
'); - } - }, this), - 'added.owl.carousel': $.proxy(function(e) { - if (e.namespace && this._core.settings.dotsData) { - this._templates.splice(e.position, 0, this._templates.pop()); - } - }, this), - 'remove.owl.carousel': $.proxy(function(e) { - if (e.namespace && this._core.settings.dotsData) { - this._templates.splice(e.position, 1); - } - }, this), - 'changed.owl.carousel': $.proxy(function(e) { - if (e.namespace && e.property.name == 'position') { - this.draw(); - } - }, this), - 'initialized.owl.carousel': $.proxy(function(e) { - if (e.namespace && !this._initialized) { - this._core.trigger('initialize', null, 'navigation'); - this.initialize(); - this.update(); - this.draw(); - this._initialized = true; - this._core.trigger('initialized', null, 'navigation'); - } - }, this), - 'refreshed.owl.carousel': $.proxy(function(e) { - if (e.namespace && this._initialized) { - this._core.trigger('refresh', null, 'navigation'); - this.update(); - this.draw(); - this._core.trigger('refreshed', null, 'navigation'); - } - }, this) - }; - - // set default options - this._core.options = $.extend({}, Navigation.Defaults, this._core.options); - - // register event handlers - this.$element.on(this._handlers); - }; - - /** - * Default options. - * @public - * @todo Rename `slideBy` to `navBy` - */ - Navigation.Defaults = { - nav: false, - navText: [ - '', - '' - ], - navSpeed: false, - navElement: 'button type="button" role="presentation"', - navContainer: false, - navContainerClass: 'owl-nav', - navClass: [ - 'owl-prev', - 'owl-next' - ], - slideBy: 1, - dotClass: 'owl-dot', - dotsClass: 'owl-dots', - dots: true, - dotsEach: false, - dotsData: false, - dotsSpeed: false, - dotsContainer: false - }; - - /** - * Initializes the layout of the plugin and extends the carousel. - * @protected - */ - Navigation.prototype.initialize = function() { - var override, - settings = this._core.settings; - - // create DOM structure for relative navigation - this._controls.$relative = (settings.navContainer ? $(settings.navContainer) - : $('
').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled'); - - this._controls.$previous = $('<' + settings.navElement + '>') - .addClass(settings.navClass[0]) - .html(settings.navText[0]) - .prependTo(this._controls.$relative) - .on('click', $.proxy(function(e) { - this.prev(settings.navSpeed); - }, this)); - this._controls.$next = $('<' + settings.navElement + '>') - .addClass(settings.navClass[1]) - .html(settings.navText[1]) - .appendTo(this._controls.$relative) - .on('click', $.proxy(function(e) { - this.next(settings.navSpeed); - }, this)); - - // create DOM structure for absolute navigation - if (!settings.dotsData) { - this._templates = [ $('