From f46fce1dc62b3b7201cb267f80c367283d74e54d Mon Sep 17 00:00:00 2001 From: Nick Stakenburg Date: Thu, 15 Mar 2018 00:36:06 +0100 Subject: [PATCH 1/5] stricter equality checks --- .gitignore | 3 +- dist/css/strip.css | 4 +- dist/js/strip.pkgd.js | 120 +++++++++++++++++++------------------- dist/js/strip.pkgd.min.js | 8 +-- src/js/api.js | 18 +++--- src/js/keyboard.js | 2 +- src/js/options.js | 6 +- src/js/page.js | 28 ++++----- src/js/view.js | 4 +- src/js/window.js | 42 ++++++------- 10 files changed, 118 insertions(+), 117 deletions(-) diff --git a/.gitignore b/.gitignore index b608297..1fe5977 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ strip-*.zip -*.log \ No newline at end of file +*.log +.idea diff --git a/dist/css/strip.css b/dist/css/strip.css index 2ba03f6..93dd587 100644 --- a/dist/css/strip.css +++ b/dist/css/strip.css @@ -1,6 +1,6 @@ /*! - * Strip - An Unobtrusive Responsive Lightbox - v1.6.4 - * (c) 2014-2016 Nick Stakenburg + * Strip - An Unobtrusive Responsive Lightbox - v1.6.5 + * (c) 2014-2018 Nick Stakenburg * * http://www.stripjs.com * diff --git a/dist/js/strip.pkgd.js b/dist/js/strip.pkgd.js index cd61c64..7045450 100644 --- a/dist/js/strip.pkgd.js +++ b/dist/js/strip.pkgd.js @@ -1,6 +1,6 @@ /*! - * Strip - An Unobtrusive Responsive Lightbox - v1.6.4 - * (c) 2014-2016 Nick Stakenburg + * Strip - An Unobtrusive Responsive Lightbox - v1.6.5 + * (c) 2014-2018 Nick Stakenburg * * http://www.stripjs.com * @@ -25,7 +25,7 @@ }(this, function($) { var Strip = { - version: '1.6.4' + version: '1.6.5' }; Strip.Skins = { @@ -852,7 +852,7 @@ var Options = { // keyboard if (options.keyboard) { // when keyboard is true, enable all keys - if ($.type(options.keyboard) == 'boolean') { + if ($.type(options.keyboard) === 'boolean') { options.keyboard = {}; $.each(this.defaults.keyboard, function(key, bool) { options.keyboard[key] = true; @@ -861,13 +861,13 @@ var Options = { // disable left and right keys for video, because players like // youtube use these keys - if (type == 'vimeo' || type == 'youtube') { + if (type === 'vimeo' || type === 'youtube') { $.extend(options.keyboard, { left: false, right: false }); } } // vimeo & youtube always have no overlap - if (type == 'vimeo' || type == 'youtube') { + if (type === 'vimeo' || type === 'youtube') { options.overlap = false; } @@ -882,23 +882,23 @@ $.extend(View.prototype, { data = {}; // string -> element - if ($.type(object) == 'string') { + if ($.type(object) === 'string') { // turn the string into an element object = { url: object }; } // element -> object - else if (object && object.nodeType == 1) { + else if (object && object.nodeType === 1) { var element = $(object); object = { element: element[0], url: element.attr('href'), - caption: element.data('strip-caption'), - group: element.data('strip-group'), - extension: element.data('strip-extension'), - type: element.data('strip-type'), - options: (element.data('strip-options') && eval('({' + element.data('strip-options') + '})')) || {} + caption: element.attr('data-strip-caption'), + group: element.attr('data-strip-group'), + extension: element.attr('data-strip-extension'), + type: element.attr('data-strip-type'), + options: (element.attr('data-strip-options') && eval('({' + element.attr('data-strip-options') + '})')) || {} }; } @@ -1111,7 +1111,7 @@ var Pages = { $(element).addClass('strip-active-element strip-active-group'); // also give other items in the group the active group class - var group = $(element).data('strip-group'); + var group = $(element).attr('data-strip-group'); if (group) { $('.strip[data-strip-group="' + group + '"]').addClass('strip-active-group'); } @@ -1240,7 +1240,7 @@ $.extend(Page.prototype, { // so that it doesn't interfere with our regular load preload: function() { if (this.preloading || this.preloaded - || this.view.type != 'image' + || this.view.type !== 'image' || !this.view.options.preload || this.loaded // page might be loaded before it's preloaded so also stop there ) { @@ -1379,7 +1379,7 @@ $.extend(Page.prototype, { return; } - var protocol = 'http' + (window.location && window.location.protocol == 'https:' ? 's' : '') + ':', + var protocol = 'http' + (window.location && window.location.protocol === 'https:' ? 's' : '') + ':', playerVars = $.extend({}, this.view.options[this.view.type] || {}), queryString = $.param(playerVars), urls = { @@ -1407,7 +1407,7 @@ $.extend(Page.prototype, { // no need to raise if we're already the topmost element // this helps avoid unnecessary detaching of the element var lastChild = Pages.element[0].lastChild; - if (lastChild && lastChild == this.element[0]) { + if (lastChild && lastChild === this.element[0]) { return; } @@ -1487,11 +1487,11 @@ $.extend(Page.prototype, { var fx = 3; // store duration on resize and use it for the other animations - var z = this.getOrientation() == 'horizontal' ? 'width' : 'height'; + var z = this.getOrientation() === 'horizontal' ? 'width' : 'height'; // onShow callback var onShow = this.view && this.view.options.onShow; - if ($.type(onShow) == 'function') { + if ($.type(onShow) === 'function') { onShow.call(Strip); } @@ -1539,7 +1539,7 @@ $.extend(Page.prototype, { _show: function(callback, alternateDuration) { var duration = !Window.visible ? 0 : - ($.type(alternateDuration) == 'number') ? alternateDuration : + ($.type(alternateDuration) === 'number') ? alternateDuration : this.view.options.effects.transition.min; this.element.stop(true).show().fadeTo(duration || 0, 1, callback); @@ -1554,7 +1554,7 @@ $.extend(Page.prototype, { this.abort(); var duration = this.view.options.effects.transition.min; - if ($.type(alternateDuration) == 'number') duration = alternateDuration; + if ($.type(alternateDuration) === 'number') duration = alternateDuration; // hide video instantly var isVideo = this.isVideo(); @@ -1632,7 +1632,7 @@ $.extend(Page.prototype, { }, getOrientation: function(side) { - return (this.view.options.side == 'left' || this.view.options.side == 'right') ? 'horizontal' : 'vertical'; + return (this.view.options.side === 'left' || this.view.options.side === 'right') ? 'horizontal' : 'vertical'; }, fitToWindow: function() { @@ -1641,16 +1641,16 @@ $.extend(Page.prototype, { viewport = Bounds.viewport(), bounds = $.extend({}, viewport), orientation = this.getOrientation(), - z = orientation == 'horizontal' ? 'width' : 'height'; + z = orientation === 'horizontal' ? 'width' : 'height'; var container = page.find('.strp-container'); // add the safety Window.element.removeClass('strp-measured'); var win = Window.element, - isFullscreen = (z == 'width') ? parseInt(win.css('min-width')) > 0 : + isFullscreen = (z === 'width') ? parseInt(win.css('min-width')) > 0 : parseInt(win.css('min-height')) > 0, - safety = isFullscreen ? 0 : parseInt(win.css('margin-' + (z == 'width' ? 'left' : 'bottom'))); + safety = isFullscreen ? 0 : parseInt(win.css('margin-' + (z === 'width' ? 'left' : 'bottom'))); Window.element.addClass('strp-measured'); bounds[z] -= safety; @@ -1684,7 +1684,7 @@ $.extend(Page.prototype, { if (!pageVisible) page.show(); // width - if (z == 'width') { + if (z === 'width') { page.css({ width: (isFullscreen ? viewport.width : fitted.width + paddingX) }); @@ -1720,7 +1720,7 @@ $.extend(Page.prototype, { this.position ? this.position.outerWidth() + paddingX : 0); content.show(); - if (cH == previousCH && (newCW <= (fitted.width + paddingX - shrunkW))) { + if (cH === previousCH && (newCW <= (fitted.width + paddingX - shrunkW))) { // safe to keep this width, so store it fitted.width -= shrunkW; } else { @@ -1772,7 +1772,7 @@ $.extend(Page.prototype, { // fullscreen mode uses viewport dimensions for the page if (isFullscreen) pageDimensions = viewport; - if (z == 'width') { + if (z === 'width') { page.css({ width: pageDimensions.width }); } else { page.css({ height: pageDimensions.height }); @@ -1955,7 +1955,7 @@ var Window = { resize: function(wh, callback, alternateDuration) { var orientation = this.getOrientation(), - Z = orientation == 'vertical' ? 'Height' : 'Width', + Z = orientation === 'vertical' ? 'Height' : 'Width', z = Z.toLowerCase(); if (wh > 0) { @@ -1967,13 +1967,13 @@ var Window = { duration; // if we're opening use the show duration - if (fromZ == 0) { + if (fromZ === 0) { duration = this.view.options.effects.window.show; // add opening class this.element.addClass('strp-opening'); this.opening = true; - } else if ($.type(alternateDuration) == 'number') { + } else if ($.type(alternateDuration) === 'number') { // alternate when set duration = alternateDuration; } else { @@ -1993,7 +1993,7 @@ var Window = { } - if (wh == 0) { + if (wh === 0) { this.closing = true; // we only add the closing class if we're not currently animating the window if (!this.element.is(':animated')) { @@ -2014,7 +2014,7 @@ var Window = { this._offsetLeft = null; var onResize = this.view.options.onResize, - hasOnResize = $.type(onResize) == 'function'; + hasOnResize = $.type(onResize) === 'function'; this.element.stop(true).animate(css, $.extend({ duration: duration, @@ -2024,7 +2024,7 @@ var Window = { }, !hasOnResize ? {} : { // we only add step if there's an onResize callback step: $.proxy(function(now, fx) { - if (fx.prop == z) { + if (fx.prop === z) { onResize.call(Strip, fx.prop, now, this.side); } }, this) @@ -2076,7 +2076,7 @@ var Window = { css = { 'margin-top': pnMarginTop - iH * .5 }; var duration = this.view.options.effects.transition.min; - if ($.type(alternateDuration) == 'number') duration = alternateDuration; + if ($.type(alternateDuration) === 'number') duration = alternateDuration; // adjust <> instantly when opening if (this.opening) duration = 0; @@ -2107,7 +2107,7 @@ var Window = { // adjust the size based on the current view // this might require closing the window first setSide: function(side, callback) { - if (this.side == side) { + if (this.side === side) { if (callback) callback(); return; } @@ -2162,7 +2162,7 @@ var Window = { }, getOrientation: function(side) { - return (this.side == 'left' || this.side == 'right') ? 'horizontal' : 'vertical'; + return (this.side === 'left' || this.side === 'right') ? 'horizontal' : 'vertical'; }, // loading indicator @@ -2200,7 +2200,7 @@ var Window = { // store the page and show it this.page = Pages.show(position, $.proxy(function() { var afterPosition = this.view.options.afterPosition; - if ($.type(afterPosition) == 'function') { + if ($.type(afterPosition) === 'function') { afterPosition.call(Strip, position); } if (callback) callback(); @@ -2260,7 +2260,7 @@ var Window = { // afterHide callback var afterHide = this.view && this.view.options.afterHide; - if ($.type(afterHide) == 'function') { + if ($.type(afterHide) === 'function') { afterHide.call(Strip); } @@ -2269,7 +2269,7 @@ var Window = { next_after_resize(); }, this)); - if ($.type(callback) == 'function') { + if ($.type(callback) === 'function') { hideQueue.queue($.proxy(function(next_callback) { callback(); next_callback(); @@ -2303,7 +2303,7 @@ var Window = { // Previous / Next mayPrevious: function() { - return (this.view && this.view.options.loop && this.views && this.views.length > 1) || this._position != 1; + return (this.view && this.view.options.loop && this.views && this.views.length > 1) || this._position !== 1; }, previous: function(force) { @@ -2317,7 +2317,7 @@ var Window = { mayNext: function() { var hasViews = this.views && this.views.length > 1; - return (this.view && this.view.options.loop && hasViews) || (hasViews && this.getSurroundingIndexes().next != 1); + return (this.view && this.view.options.loop && hasViews) || (hasViews && this.getSurroundingIndexes().next !== 1); }, next: function(force) { @@ -2386,7 +2386,7 @@ var Window = { var x = event.pageX, y = event.pageY; - if (this._hoveringNav || (y == this._y && x == this._x)) { + if (this._hoveringNav || (y === this._y && x === this._x)) { return; } @@ -2451,8 +2451,8 @@ var Window = { side = Side.toLowerCase(); this.element[(this['may' + Side]() ? 'add' : 'remove') + 'Class']('strp-hovering-clickable'); - this._previous[(side != 'next' ? 'add' : 'remove') + 'Class']('strp-nav-previous-hover strp-nav-hover'); - this._next[(side == 'next' ? 'add' : 'remove') + 'Class']('strp-nav-next-hover strp-nav-hover'); + this._previous[(side !== 'next' ? 'add' : 'remove') + 'Class']('strp-nav-previous-hover strp-nav-hover'); + this._next[(side === 'next' ? 'add' : 'remove') + 'Class']('strp-nav-next-hover strp-nav-hover'); }, _onMouseLeave: function(event) { @@ -2509,11 +2509,11 @@ var Window = { var elements = this.element.find('.strp-nav-button'); var duration = this.view ? this.view.options.effects.ui.show : 0; - if ($.type(alternateDuration) == 'number') duration = alternateDuration; + if ($.type(alternateDuration) === 'number') duration = alternateDuration; elements.stop(true).fadeTo(duration, 1, 'stripEaseInSine', $.proxy(function() { this.startUITimer(); - if ($.type(callback) == 'function') callback(); + if ($.type(callback) === 'function') callback(); }, this)); }, @@ -2521,10 +2521,10 @@ var Window = { var elements = this.element.find('.strp-nav-button'); var duration = this.view ? this.view.options.effects.ui.hide : 0; - if ($.type(alternateDuration) == 'number') duration = alternateDuration; + if ($.type(alternateDuration) === 'number') duration = alternateDuration; elements.stop(true).fadeOut(duration, 'stripEaseOutSine', function() { - if ($.type(callback) == 'function') callback(); + if ($.type(callback) === 'function') callback(); }); }, @@ -2616,7 +2616,7 @@ var Keyboard = { getKeyByKeyCode: function(keyCode) { for(var key in this.keyCode) { - if (this.keyCode[key] == keyCode) return key; + if (this.keyCode[key] === keyCode) return key; } return null; } @@ -2667,13 +2667,13 @@ var _Strip = { var options = arguments[1] || {}, position = arguments[2]; - if (arguments[1] && $.type(arguments[1]) == 'number') { + if (arguments[1] && $.type(arguments[1]) === 'number') { position = arguments[1]; options = {}; } var views = [], object_type, - isElement = object && object.nodeType == 1; + isElement = object && object.nodeType === 1; switch ((object_type = $.type(object))) { case 'string': @@ -2686,7 +2686,7 @@ var _Strip = { // if we have an element, look for other elements if (isElement) { - var elements = $('.strip[data-strip-group="' + $(object).data('strip-group') + '"]'); + var elements = $('.strip[data-strip-group="' + $(object).attr('data-strip-group') + '"]'); // find possible group options var groupOptions = {}; @@ -2697,7 +2697,7 @@ var _Strip = { elements.each(function(i, element) { // adjust the position if we find the given object position - if (!position && element == object) position = i + 1; + if (!position && element === object) position = i + 1; views.push(new View(element, $.extend({}, groupOptions, options))); }); } @@ -2742,7 +2742,7 @@ var _Strip = { // if we've clicked the exact same element it'll never re-enable // hideOnClickOutside delegation because Pages.show() won't let it // through, we re-enable it here in that case - if (positionInAPG == Window._position) { + if (positionInAPG === Window._position) { Window.bindHideOnClickOutside(); } @@ -2758,12 +2758,12 @@ var _Strip = { function getUrl(object) { var url, type = $.type(object); - if (type == 'string') { + if (type === 'string') { url = object; - } else if (type == 'array' && object[0]) { + } else if (type === 'array' && object[0]) { url = getUrl(object[0]); } else if (_.isElement(object) && $(object).attr('href')) { - var url = $(object).attr('href'); + url = $(object).attr('href'); } else if (object.url) { url = object.url; } else { @@ -2823,9 +2823,9 @@ if ( // old Android // added a version check because Firefox on Android doesn't have a // version number above 4.2 anymore - || ($.type(Browser.Android) == 'number' && Browser.Android < 3) + || ($.type(Browser.Android) === 'number' && Browser.Android < 3) // old WebKit - || (Browser.MobileSafari && ($.type(Browser.WebKit) == 'number' && Browser.WebKit < 533.18)) + || (Browser.MobileSafari && ($.type(Browser.WebKit) === 'number' && Browser.WebKit < 533.18)) ) { // we'll reset the show function _Strip.show = _Strip.showFallback; diff --git a/dist/js/strip.pkgd.min.js b/dist/js/strip.pkgd.min.js index 6b2e58c..4c3730c 100644 --- a/dist/js/strip.pkgd.min.js +++ b/dist/js/strip.pkgd.min.js @@ -1,6 +1,6 @@ /*! - * Strip - An Unobtrusive Responsive Lightbox - v1.6.4 - * (c) 2014-2016 Nick Stakenburg + * Strip - An Unobtrusive Responsive Lightbox - v1.6.5 + * (c) 2014-2018 Nick Stakenburg * * http://www.stripjs.com * @@ -9,5 +9,5 @@ * - Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0 * */ -!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):a.Strip=b(jQuery)}(this,function($){function Spinner(){return this.initialize.apply(this,_slice.call(arguments))}function Timers(){return this.initialize.apply(this,_slice.call(arguments))}function getURIData(a){var b={type:"image"};return $.each(Types,function(c,d){var e=d.data(a);e&&(b=e,b.type=c,b.url=a)}),b}function detectExtension(a){var b=(a||"").replace(/\?.*/g,"").match(/\.([^.]{3,4})$/);return b?b[1].toLowerCase():null}function View(){this.initialize.apply(this,_slice.call(arguments))}var Strip={version:"1.6.4"};Strip.Skins={strip:{}};var Browser=function(a){function b(b){var c=new RegExp(b+"([\\d.]+)").exec(a);return c?parseFloat(c[1]):!0}return{IE:!(!window.attachEvent||-1!==a.indexOf("Opera"))&&b("MSIE "),Opera:a.indexOf("Opera")>-1&&(!!window.opera&&opera.version&&parseFloat(opera.version())||7.55),WebKit:a.indexOf("AppleWebKit/")>-1&&b("AppleWebKit/"),Gecko:a.indexOf("Gecko")>-1&&-1===a.indexOf("KHTML")&&b("rv:"),MobileSafari:!!a.match(/Apple.*Mobile.*Safari/),Chrome:a.indexOf("Chrome")>-1&&b("Chrome/"),ChromeMobile:a.indexOf("CrMo")>-1&&b("CrMo/"),Android:a.indexOf("Android")>-1&&b("Android "),IEMobile:a.indexOf("IEMobile")>-1&&b("IEMobile/")}}(navigator.userAgent),_slice=Array.prototype.slice,Fit={within:function(a,b){for(var c=$.extend({height:!0,width:!0},arguments[2]||{}),d=$.extend({},b),e=1,f=5,g={width:c.width,height:c.height};f>0&&(g.width&&d.width>a.width||g.height&&d.height>a.height);){var h=1,i=1;g.width&&d.width>a.width&&(h=a.width/d.width),g.height&&d.height>a.height&&(i=a.height/d.height);var e=Math.min(h,i);d={width:Math.round(b.width*e),height:Math.round(b.height*e)},f--}return d.width=Math.max(d.width,0),d.height=Math.max(d.height,0),d}};$.extend($.easing,{stripEaseInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},stripEaseInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},stripEaseOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c}});var Support=function(){function a(a){return c(a,"prefix")}function b(a,b){for(var c in a)if(void 0!==d.style[a[c]])return"prefix"==b?a[c]:!0;return!1}function c(a,c){var d=a.charAt(0).toUpperCase()+a.substr(1),f=(a+" "+e.join(d+" ")+d).split(" ");return b(f,c)}var d=document.createElement("div"),e="Webkit Moz O ms Khtml".split(" ");return{css:{animation:c("animation"),transform:c("transform"),prefixed:a},svg:!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,touch:function(){try{return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)}catch(a){return!1}}()}}();Support.mobileTouch=Support.touch&&(Browser.MobileSafari||Browser.Android||Browser.IEMobile||Browser.ChromeMobile||!/^(Win|Mac|Linux)/.test(navigator.platform));var Bounds={viewport:function(){var a={width:$(window).width()};if(Browser.MobileSafari||Browser.Android&&Browser.Gecko){var b=document.documentElement.clientWidth/window.innerWidth;a.height=window.innerHeight*b}else a.height=$(window).height();return a}},ImageReady=function(a){var b=function(){return this.initialize.apply(this,Array.prototype.slice.call(arguments))};a.extend(b.prototype,{initialize:function(){this.options=a.extend({test:function(){},success:function(){},timeout:function(){},callAt:!1,intervals:[[0,0],[1e3,10],[2e3,50],[4e3,100],[2e4,500]]},arguments[0]||{}),this._test=this.options.test,this._success=this.options.success,this._timeout=this.options.timeout,this._ipos=0,this._time=0,this._delay=this.options.intervals[this._ipos][1],this._callTimeouts=[],this.poll(),this._createCallsAt()},poll:function(){this._polling=setTimeout(a.proxy(function(){if(this._test())return void this.success();if(this._time+=this._delay,this._time>=this.options.intervals[this._ipos][0]){if(!this.options.intervals[this._ipos+1])return void("function"==a.type(this._timeout)&&this._timeout());this._ipos++,this._delay=this.options.intervals[this._ipos][1]}this.poll()},this),this._delay)},success:function(){this.abort(),this._success()},_createCallsAt:function(){this.options.callAt&&a.each(this.options.callAt,a.proxy(function(b,c){var d=c[0],e=c[1],f=setTimeout(a.proxy(function(){e()},this),d);this._callTimeouts.push(f)},this))},_stopCallTimeouts:function(){a.each(this._callTimeouts,function(a,b){clearTimeout(b)}),this._callTimeouts=[]},abort:function(){this._stopCallTimeouts(),this._polling&&(clearTimeout(this._polling),this._polling=null)}});var c=function(){return this.initialize.apply(this,Array.prototype.slice.call(arguments))};return a.extend(c.prototype,{supports:{naturalWidth:function(){return"naturalWidth"in new Image}()},initialize:function(b,c,d){return this.img=a(b)[0],this.successCallback=c,this.errorCallback=d,this.isLoaded=!1,this.options=a.extend({method:"onload",pollFallbackAfter:1e3},arguments[3]||{}),"onload"!=this.options.method&&this.supports.naturalWidth?void this.poll():void this.load()},poll:function(){this._poll=new b({test:a.proxy(function(){return this.img.naturalWidth>0},this),success:a.proxy(function(){this.success()},this),timeout:a.proxy(function(){this.error()},this),callAt:[[this.options.pollFallbackAfter,a.proxy(function(){this.load()},this)]]})},load:function(){this._loading=setTimeout(a.proxy(function(){var b=new Image;this._onloadImage=b,b.onload=a.proxy(function(){b.onload=function(){},this.supports.naturalWidth||(this.img.naturalWidth=b.width,this.img.naturalHeight=b.height,b.naturalWidth=b.width,b.naturalHeight=b.height),this.success()},this),b.onerror=a.proxy(this.error,this),b.src=this.img.src},this))},success:function(){this._calledSuccess||(this._calledSuccess=!0,this.abort(),this.waitForRender(a.proxy(function(){this.isLoaded=!0,this.successCallback(this)},this)))},error:function(){this._calledError||(this._calledError=!0,this.abort(),this._errorRenderTimeout=setTimeout(a.proxy(function(){this.errorCallback&&this.errorCallback(this)},this)))},abort:function(){this.stopLoading(),this.stopPolling(),this.stopWaitingForRender()},stopPolling:function(){this._poll&&(this._poll.abort(),this._poll=null)},stopLoading:function(){this._loading&&(clearTimeout(this._loading),this._loading=null),this._onloadImage&&(this._onloadImage.onload=function(){},this._onloadImage.onerror=function(){})},waitForRender:function(a){this._renderTimeout=setTimeout(a)},stopWaitingForRender:function(){this._renderTimeout&&(clearTimeout(this._renderTimeout),this._renderTimeout=null),this._errorRenderTimeout&&(clearTimeout(this._errorRenderTimeout),this._errorRenderTimeout=null)}}),c}(jQuery);Spinner.supported=Support.css.transform&&Support.css.animation,$.extend(Spinner.prototype,{initialize:function(a){this.element=$(a),this.element[0]&&(this.classPrefix="strp-",this.setOptions(arguments[1]||{}),this.element.addClass(this.classPrefix+"spinner"),this.element.append(this._rotate=$("
").addClass(this.classPrefix+"spinner-rotate")),this.build(),this.start())},setOptions:function(a){this.options=$.extend({show:200,hide:200},a||{})},build:function(){if(!this._build){this._rotate.html("");var a=(2*(this.options.length+this.options.radius),this.element.is(":visible"));a||this.element.show();var b,c;this._rotate.append(b=$("
").addClass(this.classPrefix+"spinner-frame").append(c=$("
").addClass(this.classPrefix+"spinner-line")));var d=parseInt($(c).css("z-index"));this.lines=d,c.css({"z-index":"inherit"}),b.remove(),a||this.element.hide();for(var e,f=0;d>f;f++){var b,c;this._rotate.append(b=$("
").addClass(this.classPrefix+"spinner-frame").append(c=$("
").addClass(this.classPrefix+"spinner-line"))),e=e||c.css("color"),c.css({background:e}),b.css({opacity:(1/d*(f+1)).toFixed(2)});var g={};g[Support.css.prefixed("transform")]="rotate("+360/d*(f+1)+"deg)",b.css(g)}this._build=!0}},start:function(){var a={};a[Support.css.prefixed("animation")]=this.classPrefix+"spinner-spin 1s infinite steps("+this.lines+")",this._rotate.css(a)},stop:function(){var a={};a[Support.css.prefixed("animation")]="none",this._rotate.css(a)},show:function(a){this.build(),this.start(),this.element.stop(!0).fadeTo(this.options.show,1,a)},hide:function(a){this.element.stop(!0).fadeOut(this.options.hide,$.proxy(function(){this.stop(),a&&a()},this))},refresh:function(){this._build=!1,this.build()}}),$.extend(Timers.prototype,{initialize:function(){this._timers={}},set:function(a,b,c){this._timers[a]=setTimeout(b,c)},get:function(a){return this._timers[a]},clear:function(a){a?this._timers[a]&&(clearTimeout(this._timers[a]),delete this._timers[a]):this.clearAll()},clearAll:function(){$.each(this._timers,function(a,b){clearTimeout(b)}),this._timers={}}});var Types={image:{extensions:"bmp gif jpeg jpg png webp",detect:function(a){return $.inArray(detectExtension(a),this.extensions.split(" "))>-1},data:function(a){return this.detect()?{extension:detectExtension(a)}:!1}},youtube:{detect:function(a){var b=/(youtube\.com|youtu\.be)\/watch\?(?=.*vi?=([a-zA-Z0-9-_]+))(?:\S+)?$/.exec(a);return b&&b[2]?b[2]:(b=/(youtube\.com|youtu\.be)\/(vi?\/|u\/|embed\/)?([a-zA-Z0-9-_]+)(?:\S+)?$/i.exec(a),b&&b[3]?b[3]:!1)},data:function(a){var b=this.detect(a);return b?{id:b}:!1}},vimeo:{detect:function(a){var b=/(vimeo\.com)\/([a-zA-Z0-9-_]+)(?:\S+)?$/i.exec(a);return b&&b[2]?b[2]:!1},data:function(a){var b=this.detect(a);return b?{id:b}:!1}}},VimeoReady=function(){var a=function(){return this.initialize.apply(this,_slice.call(arguments))};$.extend(a.prototype,{initialize:function(a,b){this.url=a,this.callback=b,this.load()},load:function(){var a=b.get(this.url);if(a)return this.callback(a.data);var c="http"+(window.location&&"https:"==window.location.protocol?"s":"")+":",d=getURIData(this.url).id;this._xhr=$.getJSON(c+"//vimeo.com/api/oembed.json?url="+c+"//vimeo.com/"+d+"&maxwidth=9999999&maxheight=9999999&callback=?",$.proxy(function(a){var c={dimensions:{width:a.width,height:a.height}};b.set(this.url,c),this.callback&&this.callback(c)},this))},abort:function(){this._xhr&&(this._xhr.abort(),this._xhr=null)}});var b={cache:[],get:function(a){for(var b=null,c=0;c").addClass("strp-page").append(this.container=$("
").addClass("strp-container")).css({opacity:0}).hide());var a=this.view.options.position&&this._total>1;switch((this.view.caption||a)&&(this.element.append(this.info=$("
").addClass("strp-info").append(this.info_padder=$("
").addClass("strp-info-padder"))),a&&(this.element.addClass("strp-has-position"),this.info_padder.append($("
").addClass("strp-position").html(this._position+" / "+this._total))),this.view.caption&&this.info_padder.append(this.caption=$("
").addClass("strp-caption").html(this.view.caption))),this.view.type){case"image":this.container.append(this.content=$("").attr({src:this.view.url}));break;case"vimeo":case"youtube":this.container.append(this.content=$("
"))}this.element.addClass("strp"+(this.view.options.overlap?"":"-no")+"-overlap"),this._total<2&&this.element.addClass("strp-no-sides"),this.content.addClass("strp-content-element"),this._created=!0}},_getSurroundingPages:function(){var a;if(!(a=this.view.options.preload))return[];for(var b=[],c=Math.max(1,this._position-a[0]),d=Math.min(this._position+a[1],this._total),e=this._position,f=e;d>=f;f++){var g=Pages.pages[Pages.uid][f-1];g._position!=e&&b.push(g)}for(var f=e;f>=c;f--){var g=Pages.pages[Pages.uid][f-1];g._position!=e&&b.push(g)}return b},preloadSurroundingImages:function(){var a=this._getSurroundingPages();$.each(a,$.proxy(function(a,b){b.preload()},this))},preload:function(){this.preloading||this.preloaded||"image"!=this.view.type||!this.view.options.preload||this.loaded||(this.create(),this.preloading=!0,new ImageReady(this.content[0],$.proxy(function(a){this.loaded=!0,this.preloading=!1,this.preloaded=!0,this.dimensions={width:a.img.naturalWidth,height:a.img.naturalHeight}},this),null,{method:"naturalWidth"}))},load:function(a){if(this.create(),this.loaded)return void(a&&a());switch(this.abort(),this.loading=!0,this.view.options.spinner&&!c[this.view.url]&&Window.startLoading(),this.view.type){case"image":if(this.error)return void(a&&a());this.imageReady=new ImageReady(this.content[0],$.proxy(function(b){this._markAsLoaded(),this.dimensions={width:b.img.naturalWidth,height:b.img.naturalHeight},a&&a()},this),$.proxy(function(){this._markAsLoaded(),this.content.hide(),this.container.append(this.error=$("
").addClass("strp-error")),this.element.addClass("strp-has-error"),this.dimensions={width:this.error.outerWidth(),height:this.error.outerHeight()},a&&a()},this),{method:"naturalWidth"});break;case"vimeo":this.vimeoReady=new VimeoReady(this.view.url,$.proxy(function(b){this._markAsLoaded(),this.dimensions={width:b.dimensions.width,height:b.dimensions.height},a&&a()},this));break;case"youtube":this._markAsLoaded(),this.dimensions={width:this.view.options.width,height:this.view.options.height},a&&a()}},_markAsLoaded:function(){this.loading=!1,this.loaded=!0,c[this.view.url]=!0,Window.stopLoading()},isVideo:function(){return/^(youtube|vimeo)$/.test(this.view.type)},insertVideo:function(a){if(this.playerIframe||!this.isVideo())return void(a&&a());var b="http"+(window.location&&"https:"==window.location.protocol?"s":"")+":",c=$.extend({},this.view.options[this.view.type]||{}),d=$.param(c),e={vimeo:b+"//player.vimeo.com/video/{id}?{queryString}",youtube:b+"//www.youtube.com/embed/{id}?{queryString}"},f=e[this.view.type].replace("{id}",this.view._data.id).replace("{queryString}",d);this.content.append(this.playerIframe=$("