1/* global wpcom_reblog */ 2 3var jetpackLikesWidgetBatch = []; 4var jetpackLikesMasterReady = false; 5 6// Due to performance problems on pages with a large number of widget iframes that need to be loaded, 7// we are limiting the processing at any instant to unloaded widgets that are currently in viewport, 8// plus this constant that will allow processing of widgets above and bellow the current fold. 9// This aim of it is to improve the UX and hide the transition from unloaded to loaded state from users. 10var jetpackLikesLookAhead = 2000; // pixels 11 12// Keeps track of loaded comment likes widget so we can unload them when they are scrolled out of view. 13var jetpackCommentLikesLoadedWidgets = []; 14 15var jetpackLikesDocReadyPromise = new Promise( resolve => { 16 if ( document.readyState !== 'loading' ) { 17 resolve(); 18 } else { 19 window.addEventListener( 'DOMContentLoaded', () => resolve() ); 20 } 21} ); 22 23function JetpackLikesPostMessage( message, target ) { 24 if ( typeof message === 'string' ) { 25 try { 26 message = JSON.parse( message ); 27 } catch ( e ) { 28 return; 29 } 30 } 31 32 if ( target && typeof target.postMessage === 'function' ) { 33 try { 34 target.postMessage( 35 JSON.stringify( { 36 type: 'likesMessage', 37 data: message, 38 } ), 39 '*' 40 ); 41 } catch ( e ) { 42 return; 43 } 44 } 45} 46 47function JetpackLikesBatchHandler() { 48 const requests = []; 49 document.querySelectorAll( 'div.jetpack-likes-widget-unloaded' ).forEach( widget => { 50 if ( jetpackLikesWidgetBatch.indexOf( widget.id ) > -1 ) { 51 return; 52 } 53 54 if ( ! jetpackIsScrolledIntoView( widget ) ) { 55 return; 56 } 57 58 jetpackLikesWidgetBatch.push( widget.id ); 59 60 var regex = /like-(post|comment)-wrapper-(\d+)-(\d+)-(\w+)/, 61 match = regex.exec( widget.id ), 62 info; 63 64 if ( ! match || match.length !== 5 ) { 65 return; 66 } 67 68 info = { 69 blog_id: match[ 2 ], 70 width: widget.width, 71 }; 72 73 if ( 'post' === match[ 1 ] ) { 74 info.post_id = match[ 3 ]; 75 } else if ( 'comment' === match[ 1 ] ) { 76 info.comment_id = match[ 3 ]; 77 } 78 79 info.obj_id = match[ 4 ]; 80 81 requests.push( info ); 82 } ); 83 84 if ( requests.length > 0 ) { 85 JetpackLikesPostMessage( 86 { event: 'initialBatch', requests: requests }, 87 window.frames[ 'likes-master' ] 88 ); 89 } 90} 91 92function JetpackLikesMessageListener( event ) { 93 let message = event && event.data; 94 if ( typeof message === 'string' ) { 95 try { 96 message = JSON.parse( message ); 97 } catch ( err ) { 98 return; 99 } 100 } 101 102 const type = message && message.type; 103 const data = message && message.data; 104 105 if ( type !== 'likesMessage' || typeof data.event === 'undefined' ) { 106 return; 107 } 108 109 // We only allow messages from one origin 110 const allowedOrigin = 'https://widgets.wp.com'; 111 if ( allowedOrigin !== event.origin ) { 112 return; 113 } 114 115 switch ( data.event ) { 116 case 'masterReady': 117 jetpackLikesDocReadyPromise.then( () => { 118 jetpackLikesMasterReady = true; 119 120 const stylesData = { 121 event: 'injectStyles', 122 }; 123 const sdTextColor = document.querySelector( '.sd-text-color' ); 124 const sdLinkColor = document.querySelector( '.sd-link-color' ); 125 const sdTextColorStyles = ( sdTextColor && getComputedStyle( sdTextColor ) ) || {}; 126 const sdLinkColorStyles = ( sdLinkColor && getComputedStyle( sdLinkColor ) ) || {}; 127 128 // enable reblogs if they are enabled for the page 129 if ( document.body.classList.contains( 'jetpack-reblog-enabled' ) ) { 130 JetpackLikesPostMessage( { event: 'reblogsEnabled' }, window.frames[ 'likes-master' ] ); 131 } 132 133 stylesData.textStyles = { 134 color: sdTextColorStyles[ 'color' ],
135 fontFamily: sdTextColorStyles[ 'font-family' ], 136 fontSize: sdTextColorStyles[ 'font-size' ], 137 direction: sdTextColorStyles[ 'direction' ], 138 fontWeight: sdTextColorStyles[ 'font-weight' ], 139 fontStyle: sdTextColorStyles[ 'font-style' ], 140 textDecoration: sdTextColorStyles[ 'text-decoration' ], 141 }; 142 143 stylesData.linkStyles = { 144 color: sdLinkColorStyles[ 'color' ], 145 fontFamily: sdLinkColorStyles[ 'font-family' ], 146 fontSize: sdLinkColorStyles[ 'font-size' ], 147 textDecoration: sdLinkColorStyles[ 'text-decoration' ], 148 fontWeight: sdLinkColorStyles[ 'font-weight' ], 149 fontStyle: sdLinkColorStyles[ 'font-style' ], 150 }; 151 152 JetpackLikesPostMessage( stylesData, window.frames[ 'likes-master' ] ); 153 154 JetpackLikesBatchHandler(); 155 } ); 156 157 break; 158 159 // We're keeping this for planned future follow ups. 160 // @see: https://github.com/Automattic/jetpack/pull/42361#discussion_r1995338815 161 case 'showLikeWidget': 162 break; 163 164 // We're keeping this for planned future follow ups. 165 // @see: https://github.com/Automattic/jetpack/pull/42361#discussion_r1995338815 166 case 'showCommentLikeWidget': 167 break; 168 169 case 'killCommentLikes': 170 // If kill switch for comment likes is enabled remove all widgets wrappers and `Loading...` placeholders. 171 document 172 .querySelectorAll( '.jetpack-comment-likes-widget-wrapper' ) 173 .forEach( wrapper => wrapper.remove() ); 174 break; 175 176 case 'clickReblogFlair': 177 if ( wpcom_reblog && typeof wpcom_reblog.toggle_reblog_box_flair === 'function' ) { 178 wpcom_reblog.toggle_reblog_box_flair( data.obj_id, data.post_id ); 179 } 180 break; 181 182 case 'hideOtherGravatars': { 183 hideLikersPopover(); 184 break; 185 } 186 187 case 'showOtherGravatars': { 188 const container = document.querySelector( '#likes-other-gravatars' ); 189 190 if ( ! container ) { 191 break; 192 } 193 194 const list = container.querySelector( 'ul' ); 195 196 container.style.display = 'none'; 197 list.innerHTML = ''; 198 199 container 200 .querySelectorAll( '.likes-text span' ) 201 .forEach( item => ( item.textContent = data.totalLikesLabel ) ); 202 203 ( data.likers || [] ).forEach( async ( liker, index ) => { 204 if ( liker.profile_URL.substr( 0, 4 ) !== 'http' ) { 205 // We only display gravatars with http or https schema 206 return; 207 } 208 209 const element = document.createElement( 'li' ); 210 list.append( element ); 211 212 element.innerHTML = ` 213 <a href="${ encodeURI( liker.profile_URL ) }" rel="nofollow" target="_parent" class="wpl-liker"> 214 <img src="${ encodeURI( liker.avatar_URL ) }" 215 alt="" 216 style="width: 28px; height: 28px;" /> 217 <span></span> 218 </a> 219 `; 220 221 222 // Add some extra attributes through native methods, to ensure strings are sanitized. 223 element.classList.add( liker.css_class ); 224 element.querySelector( 'img' ).alt = data.avatarAltTitle.replace( '%s', liker.name ); 225 element.querySelector( 'span' ).innerText = liker.name; 226 227 if ( index === data.likers.length - 1 ) { 228 element.addEventListener( 'keydown', ( e ) => { 229 if ( e.key === 'Tab' && ! e.shiftKey ) { 230 e.preventDefault(); 231 hideLikersPopover(); 232 233 JetpackLikesPostMessage( 234 { event: 'focusLikesCount', parent: data.parent }, 235 window.frames[ 'likes-master' ] 236 ); 237 } 238 } ); 239 } 240 } ); 241 242 const positionPopup = function() { 243 const containerStyle = getComputedStyle(container); 244 const isRtl = containerStyle.direction === 'rtl'; 245 246 const el = document.querySelector( `*[name='${ data.parent }']` ); 247 const rect = el.getBoundingClientRect(); 248 const win = el.ownerDocument.defaultView; 249 250 const offset = { 251 top: rect.top + win.pageYOffset, 252 left: rect.left + win.pageXOffset, 253 }; 254 255 // don't display yet or we get skewed window.innerWidth later 256 container.style.display = 'none'; 257 258 let containerLeft = 0; 259 container.style.top = offset.top + data.position.top - 1 + 'px'; 260 261 if ( isRtl ) { 262 const visibleAvatarsCount = data && data.likers ? Math.min( data.likers.length, 5 ) : 0; 263 // 24px is the width of the avatar + 4px is the padding between avatars 264 containerLeft = offset.left + data.position.left + 24 * visibleAvatarsCount + 4; 265 container.style.transform = 'translateX(-100%)'; 266 } else { 267 containerLeft = offset.left + data.position.left; 268 } 269 container.style.left = containerLeft + 'px'; 270 271 // Container width - padding
272 const initContainerWidth = data.width - 20; 273 const rowLength = Math.floor( initContainerWidth / 37 ); 274 // # of rows + (avatar + avatar padding) + text above + container padding 275 let height = Math.ceil( data.likers.length / rowLength ) * 37 + 17 + 22; 276 if ( height > 204 ) { 277 height = 204; 278 } 279 280 // If the popup is overflows viewport width, we should show it on the next line 281 // Push it offscreen to calculated rendered width 282 const windowWidth = win.innerWidth; 283 container.style.left = '-9999px'; 284 container.style.display = 'block'; 285 286 // If the popup exceeds the viewport width, 287 // flip the position of the popup. 288 const containerWidth = container.offsetWidth; 289 const containerRight = containerLeft + containerWidth; 290 291 if ( containerRight > windowWidth && ! isRtl) { 292 containerLeft = rect.left + rect.width - containerWidth; 293 } else if ( containerLeft - containerWidth < 0 && isRtl ) { 294 container.style.transform = 'none'; 295 containerLeft = rect.left; 296 } 297 // Set the container left 298 container.style.left = containerLeft + 'px'; 299 300 container.setAttribute( 'aria-hidden', 'false' ); 301 } 302 303 positionPopup(); 304 container.focus(); 305 306 const debounce = function( func, wait ) { 307 var timeout; 308 return function() { 309 var context = this; 310 var args = arguments; 311 clearTimeout( timeout ); 312 timeout = setTimeout( function() { 313 func.apply( context, args ); 314 }, wait ); 315 }; 316 }; 317 318 const debouncedPositionPopup = debounce( positionPopup, 100 ); 319 320 // Keep a reference of this function in the element itself 321 // so that we can destroy it later 322 container.__resizeHandler = debouncedPositionPopup; 323 324 // When window is resized, resize the popup. 325 window.addEventListener( "resize", debouncedPositionPopup ); 326 } 327 } 328} 329 330window.addEventListener( 'message', JetpackLikesMessageListener ); 331 332function hideLikersPopover() { 333 const container = document.querySelector( '#likes-other-gravatars' ); 334 335 if ( container ) { 336 container.style.display = 'none'; 337 container.setAttribute( 'aria-hidden', 'true' ); 338 339 // Remove the resize event listener and cleanup. 340 const resizeHandler = container.__resizeHandler; 341 if ( resizeHandler ) { 342 window.removeEventListener( "resize", resizeHandler ); 343 delete container.__resizeHandler; 344 } 345 } 346} 347 348document.addEventListener( 'click', hideLikersPopover ); 349 350function JetpackLikesWidgetQueueHandler() { 351 var wrapperID; 352 353 if ( ! jetpackLikesMasterReady ) { 354 setTimeout( JetpackLikesWidgetQueueHandler, 500 ); 355 return; 356 } 357 358 // Restore widgets to initial unloaded state when they are scrolled out of view. 359 jetpackUnloadScrolledOutWidgets(); 360 361 var unloadedWidgetsInView = jetpackGetUnloadedWidgetsInView(); 362 363 if ( unloadedWidgetsInView.length > 0 ) { 364 // Grab any unloaded widgets for a batch request 365 JetpackLikesBatchHandler(); 366 } 367 368 for ( var i = 0, length = unloadedWidgetsInView.length; i <= length - 1; i++ ) { 369 wrapperID = unloadedWidgetsInView[ i ].id; 370 371 if ( ! wrapperID ) { 372 continue; 373 } 374 375 jetpackLoadLikeWidgetIframe( wrapperID ); 376 } 377} 378 379function jetpackLoadLikeWidgetIframe( wrapperID ) { 380 if ( typeof wrapperID === 'undefined' ) { 381 return; 382 } 383 384 const wrapper = document.querySelector( '#' + wrapperID ); 385 wrapper.querySelectorAll( 'iframe' ).forEach( iFrame => iFrame.remove() ); 386 387 const placeholder = wrapper.querySelector( '.likes-widget-placeholder' ); 388 389 // Post like iframe 390 if ( placeholder && placeholder.classList.contains( 'post-likes-widget-placeholder' ) ) { 391 const postLikesFrame = document.createElement( 'iframe' ); 392 393 postLikesFrame.classList.add( 'post-likes-widget', 'jetpack-likes-widget' ); 394 postLikesFrame.name = wrapper.dataset.name; 395 postLikesFrame.src = wrapper.dataset.src; 396 postLikesFrame.height = '55px'; 397 postLikesFrame.width = '100%'; 398 postLikesFrame.frameBorder = '0'; 399 postLikesFrame.scrolling = 'no'; 400 postLikesFrame.title = wrapper.dataset.title; 401 402 placeholder.after( postLikesFrame ); 403 } 404 405 // Comment like iframe 406 if ( placeholder.classList.contains( 'comment-likes-widget-placeholder' ) ) { 407 const commentLikesFrame = document.createElement( 'iframe' ); 408 409 commentLikesFrame.class = 'comment-likes-widget-frame jetpack-likes-widget-frame'; 410 commentLikesFrame.name = wrapper.dataset.name; 411 commentLikesFrame.src = wrapper.dataset.src; 412 commentLikesFrame.height = '18px'; 413 commentLikesFrame.width = '100%'; 414 commentLikesFrame.frameBorder = '0'; 415 commentLikesFrame.scrolling = 'no'; 416 417 wrapper.querySelector( '.comment-like-feedback' ).after( commentLikesFrame ); 418 419 jetpackCommentLikesLoadedWidgets.push( commentLikesFrame ); 420 } 421 422 wrapper.classList.remove( 'jetpack-likes-widget-unloaded' ); 423 wrapper.classList.add( 'jetpack-likes-widget-loading' ); 424 425 wrapper.querySelector( 'iframe' ).addEventListener( 'load', e => { 426 JetpackLikesPostMessage( 427 { event: 'loadLikeWidget', name: e.target.name, width: e.target.width }, 428 window.frames[ 'likes-master' ] 429 ); 430 431 wrapper.classList.remove( 'jetpack-likes-widget-loading' ); 432 wrapper.classList.add( 'jetpack-likes-widget-loaded' ); 433 } ); 434} 435 436function jetpackGetUnloadedWidgetsInView() { 437 const unloadedWidgets = document.querySelectorAll( 'div.jetpack-likes-widget-unloaded' ); 438 439 return [ ...unloadedWidgets ].filter( item => jetpackIsScrolledIntoView( item ) ); 440} 441 442function jetpackIsScrolledIntoView( element ) { 443 const top = element.getBoundingClientRect().top; 444 const bottom = element.getBoundingClientRect().bottom; 445
446 // Allow some slack above and bellow the fold with jetpackLikesLookAhead, 447 // with the aim of hiding the transition from unloaded to loaded widget from users. 448 return top + jetpackLikesLookAhead >= 0 && bottom <= window.innerHeight + jetpackLikesLookAhead; 449} 450 451function jetpackUnloadScrolledOutWidgets() { 452 for ( let i = jetpackCommentLikesLoadedWidgets.length - 1; i >= 0; i-- ) { 453 const currentWidgetIframe = jetpackCommentLikesLoadedWidgets[ i ]; 454 455 if ( ! jetpackIsScrolledIntoView( currentWidgetIframe ) ) { 456 const widgetWrapper = 457 currentWidgetIframe && 458 currentWidgetIframe.parentElement && 459 currentWidgetIframe.parentElement.parentElement; 460 461 // Restore parent class to 'unloaded' so this widget can be picked up by queue manager again if needed. 462 widgetWrapper.classList.remove( 'jetpack-likes-widget-loaded' ); 463 widgetWrapper.classList.remove( 'jetpack-likes-widget-loading' ); 464 widgetWrapper.classList.add( 'jetpack-likes-widget-unloaded' ); 465 466 // Bring back the loading placeholder into view. 467 widgetWrapper 468 .querySelectorAll( '.comment-likes-widget-placeholder' ) 469 .forEach( item => ( item.style.display = 'block' ) ); 470 471 // Remove it from the list of loaded widgets. 472 jetpackCommentLikesLoadedWidgets.splice( i, 1 ); 473 474 // Remove comment like widget iFrame. 475 currentWidgetIframe.remove(); 476 } 477 } 478} 479 480var jetpackWidgetsDelayedExec = function ( after, fn ) { 481 var timer; 482 return function () { 483 clearTimeout( timer ); 484 timer = setTimeout( fn, after ); 485 }; 486}; 487 488var jetpackOnScrollStopped = jetpackWidgetsDelayedExec( 250, JetpackLikesWidgetQueueHandler ); 489 490// Load initial batch of widgets, prior to any scrolling events. 491JetpackLikesWidgetQueueHandler(); 492 493// Add event listener to execute queue handler after scroll. 494window.addEventListener( 'scroll', jetpackOnScrollStopped, true ); 495; 496(()=>{(function(){var Scroller,stats,type,text,totop,loading_text,isIE=-1!==navigator.userAgent.
496search("MSIE");if(isIE){var IEVersion=navigator.userAgent.match(/MSIE\s?(\d+)\.?\d*;/);IEVersion=parseInt(IEVersion[1])}function fullscreenState(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?1:0}"https:"===document.location.protocol&&(infiniteScroll.settings.ajaxurl=infiniteScroll.settings.ajaxurl.replace("http://","https://")),Scroller=function(e){var t=this;this.id=e.id,this.body=document.body,this.window=window,this.element=document.getElementById(e.id),this.wrapperClass=e.wrapper_class,this.ready=!0,this.disabled=!1,this.page=1,this.offset=e.offset,this.currentday=e.currentday,this.order=e.order,this.throttle=!1,this.click_handle=e.click_handle,this.google_analytics=e.google_analytics,this.history=e.history,this.origURL=window.location.href,this.handle=document.createElement("div"),this.handle.setAttribute("id","infinite-handle");var n=document.createElement("span"),i=document.createElement("button");i.textContent=text,n.appendChild(i),this.handle.appendChild(n),this.footer={el:document.getElementById("infinite-footer"),wrap:e.footer},this.checkViewportOnLoadBound=t.checkViewportOnLoad.bind(this),this.wpMediaelement=null,"scroll"===type?(this.window.addEventListener("scroll",function(){t.throttle=!0}),t.gotop(),setInterval(function(){t.throttle&&(t.throttle=!1,t.thefooter(),t.refresh(),t.determineURL())},250),t.ensureFilledViewport(),this.body.addEventListener("is.post-load",t.checkViewportOnLoadBound)):"click"===type&&(this.click_handle&&this.element.appendChild(this.handle),this.handle.addEventListener("click",function(){t.click_handle&&t.handle.parentNode.removeChild(t.handle),t.refresh()})),this.body.addEventListener("is.post-load",t.initializeMejs)},Scroller.prototype.getScrollTop=function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},Scroller.prototype.extend=function(e){e=e||{};for(var t=1;t<arguments.length;t++)if(arguments[t])for(var n in arguments[t])Object.hasOwn(arguments[t],n)&&(e[n]=arguments[t][n]);return e},Scroller.prototype.check=function(){return this.measure(this.element,[this.wrapperClass]).bottom<2*this.window.innerHeight},Scroller.prototype.render=function(e){var t=Array.prototype.slice.call(e.fragment.childNodes);for(this.body.classList.add("infinity-success");t.length>0;){var n=t.shift();this.element.appendChild(n)}this.trigger(this.body,"is.post-load",{jqueryEventName:"post-load",data:e}),this.ready=!0},Scroller.prototype.query=function(){return{page:this.page+this.offset,currentday:this.currentday,order:this.order,scripts:window.infiniteScroll.settings.scripts,styles:window.infiniteScroll.settings.styles,query_args:window.infiniteScroll.settings.query_args,query_before:window.infiniteScroll.settings.query_before,last_post_date:window.infiniteScroll.settings.last_post_date}},Scroller.prototype.animate=function(e,t){var n=performance.now();requestAnimationFrame(function i(o){var r=Math.min(1,(o-n)/t);e(r),r<1&&requestAnimationFrame(i)})},Scroller.prototype.gotop=function(){var e=document.getElementById("infinity-blog-title"),t=this;e&&(e.setAttribute("title",totop),e.addEventListener("click",function(e){var n=t.window.pageYOffset;e.preventDefault(),t.animate(function(e){var t=n-n*e;document.documentElement.scrollTop=document.body.scrollTop=t},200)}))},Scroller.prototype.thefooter=function(){var e,t,n,i,o=this;if(this.footer&&this.footer.el){if("string"==typeof this.footer.wrap){try{t=(t=document.getElementById(this.footer.wrap).getBoundingClientRect()).width}catch{t=0}t>479&&(e=this.footer.el.querySelector(".container"))&&(e.style.width=t+"px")}n=parseInt(o.footer.el.style.bottom||-50,10),i=this.window.pageYOffset>=350?0:-50,n!==i&&o.animate(function(e){var t=n+(i-n)*e;o.footer.el.style.bottom=t+"px",1===e&&(n=i)},200)}},Scroller.prototype.urlEncodeJSON=function(e,t){var n,i,o=[];for(var r in e)n=encodeURIComponent(r),i=t?t+"["+n+"]":n,"object"==typeof e[r]?!Array.isArray(e[r])||e[r].length>0?o.push(this.urlEncodeJSON(e[r],i)):o.push(i+"[]="):o.push(i+"="+encodeURIComponent(e[r]));return o.join("&")},Scroller.prototype.refresh=function(){var self=this,query,xhr,loader,customized;if(!this.disabled&&this.ready&&this.check())return this.ready=!1,this.click_handle&&(loader||(document.getElementById("infinite-aria").textContent=loading_text,loader=document.createElement("div"),loader.classList.add("infinite-loader"),loader.setAttribute("role","progress"),loader.innerHTML='<svg class="jetpack-spinner infinite-loader-spinner spinner" width="28" height="28" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indef
496inite"/></path></svg>'),this.element.appendChild(loader)),query=self.extend({action:"infinite_scroll"},this.query()),"undefined"!=typeof wp&&wp.customize&&wp.customize.settings.theme&&(customized={},query.wp_customize="on",query.theme=wp.customize.settings.theme.stylesheet,wp.customize.each(function(e){e._dirty&&(customized[e.id]=e())}),query.customized=JSON.stringify(customized),query.nonce=wp.customize.settings.nonce.preview),xhr=new XMLHttpRequest,xhr.open("POST",infiniteScroll.settings.ajaxurl,!0),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),xhr.send(self.urlEncodeJSON(query)),xhr.onerror=function(){self.click_handle&&loader.parentNode&&loader.parentNode.removeChild(loader),self.ready=!0},xhr.onload=function(){var response=JSON.parse(xhr.responseText),httpCheck=xhr.status>=200&&xhr.status<300,responseCheck=void 0!==response.html;if(response&&httpCheck&&responseCheck){if(self.click_handle&&loader.parentNode&&loader.parentNode.removeChild(loader),response.scripts&&Array.isArray(response.scripts)&&response.scripts.forEach(function(e){var t=e.footer?"body":"head";window.infiniteScroll.settings.scripts.push(e.handle),e.extra_data&&self.appendInlineScript(e.extra_data,t),e.before_handle&&self.appendInlineScript(e.before_handle,t);var n=document.createElement("script");n.type="text/javascript",n.src=e.src,n.id=e.handle,n.async=!1,e.after_handle&&(n.onload=function(){self.appendInlineScript(e.after_handle,t)}),"wp-mediaelement"===e.handle&&self.body.removeEventListener("is.post-load",self.initializeMejs),"wp-mediaelement"===e.handle&&"undefined"==typeof mejs?(self.wpMediaelement={},self.wpMediaelement.tag=n,self.wpMediaelement.element=t,setTimeout(self.maybeLoadMejs.bind(self),250)):document.getElementsByTagName(t)[0].appendChild(n)}),response.styles&&Array.isArray(response.styles)&&response.styles.forEach(function(item){window.infiniteScroll.settings.styles.push(item.handle);var style=document.createElement("link");style.rel="stylesheet",style.href=item.src,style.id=item.handle+"-css",!item.conditional||isIE&&eval(item.conditional.replace(/%ver/g,IEVersion))||(style=!1),style&&document.getElementsByTagName("head")[0].appendChild(style)}),response.fragment=document.createElement("div"),response.fragment.innerHTML=response.html,self.page++,stats&&((new Image).src=document.location.protocol+"//pixel.wp.com/g.gif?"+stats+"&post=0&baba="+Math.random()),"object"==typeof response.postflair&&"object"==typeof WPCOM_sharing_counts&&(WPCOM_sharing_counts=self.extend(WPCOM_sharing_counts,response.postflair)),self.render.call(self,response),"click"===type?(infiniteScroll.settings.wrapper&&document.querySelector("#infinite-view-"+(self.page+self.offset-1)+" a:first-of-type").focus({preventScroll:!0}),response.lastbatch?self.click_handle?(self.body.classList.add("infinity-end"),self.body.classList.remove("infinity-success")):self.trigger(this.body,"infinite-scroll-posts-end"):self.click_handle?self.element.appendChild(self.handle):self.trigger(this.body,"infinite-scroll-posts-more")):response.lastbatch&&(self.disabled=!0,self.body.classList.add("infinity-end"),self.body.classList.remove("infinity-success")),response.currentday&&(self.currentday=response.currentday),self.google_analytics){var ga_url=self.history.path.replace(/%d/,self.page);"object"==typeof _gaq&&_gaq.push(["_trackPageview",ga_url]),"function"==typeof ga&&ga("send","pageview",ga_url)}}else self.click_handle&&loader.parentNode&&loader.parentNode.removeChild(loader)},xhr},Scroller.prototype.appendInlineScript=function(e,t){var n=document.createElement("script"),i=document.createTextNode("//<![CDATA[ \n"+e+"\n//]]>");n.type="text/javascript",n.appendChild(i),document.getElementsByTagName(t)[0].appendChild(n)},Scroller.prototype.maybeLoadMejs=function(){null!==this.wpMediaelement&&("undefined"==typeof mejs?setTimeout(this.maybeLoadMejs.bind(this),250):(document.getElementsByTagName(this.wpMediaelement.element)[0].appendChild(this.wpMediaelement.tag),this.wpMediaelement=null,this.body.addEventListener("is.post-load",this.initializeMejs)))},Scroller.prototype.initializeMejs=function(e){if(e.detail&&e.detail.html&&(-1!==e.detail.html.indexOf("wp-audio-shortcode")||-1!==e.detail.html.indexOf("wp-video-shortcode"))&&"undefined"!=typeof mejs){var t,n={};"undefined"!=typeof _wpmejsSettings&&(n.pluginPath=_wpmejsSettings.pluginPath),n.success=function(e){var t=e.attributes.autoplay&&"false"!==e.attributes.autoplay;"flash"===e.pluginType&&t&&e.addEventListener("canplay",function(){e.play()},!1)},t=document.querySelectorAll(".wp-audio-shortcode, .wp-video-shortcode"),t=(t=Array.prototype.slice.call(t)).filter(function(e){for(;e.parentNode;){if(e.classList.contains("mejs-container"))return!1;e=e.parentNode}return!0});for(var i=0;i<t.length;i++)new MediaElementPlayer(t[i],n)}},Scroller.prototype.measure=function(e,t){t=t||[];for(var n,i,o,r=Array.prototype.slice.call(e.children),s=Number.MAX_VALUE,l=0;r.length>0;){for(n=r.shift(),o=0;o<t.length;o++)if(n.classList.contains(t[o])){r=r.concat(Array.prototype.slice.call(n.children));break}i=n.getBoundingClientRect(),s=Math.min(s,i.top),l=Math.max(l,i.bottom)}var a=Math.round(window.innerHeight/2),d=s<=a&&l>=a;return{top:s,bottom:l,height:l-s,factor:(Math.min(l,a)-Math.max(s,0))/a,isActive:d}},Scroller.prototype.ensureFilledViewport=function(){var e=this,t=e.window.innerHeight,n=e.measure(e.element,[e.wrapperClass]);e.body.removeEventListener("is.post-load",e.checkViewportOnLoadBound),0!==n.bottom&&n.bottom<t&&(e.ready=!0,e.refresh())},Scroller.prototype.checkViewportOnLoad=function(){this.ensureFilledViewport()};var previousFullScrenState=fullscreenState();Scroller.prototype.determineURL=function(){var e,t=this,n=-1,i=fullscreenState(),o=0;if(previousFullScrenState^i)previousFullScrenState=i;else{previousFullScrenState=i,e=document.querySelectorAll("."+t.wrapperClass);for(var r=0;r<e.length;r++){var s=t.measure(e[r]);if(s.isActive){n=parseInt(e[r].dataset.pageNum,10);break}s.factor>o&&(n=parseInt(e[r].dataset.pageNum,10),o=s.factor)}t.updateURL(n)}},Scroller.prototype.updateURL=function(e){if(window.history.pushState){var t=this,n=t.origURL;-1!==e&&(n=window.location.protocol+"//"+t.history.host+t.history.path.replace(/%d/,e)+t.history.parameters),window.location.href!==n&&history.pushState(null,null,n)}},Scroller.prototype.pause=function(){this.disabled=!0},Scroller.prototype.resume=function(){this.disabled=!1},Scroller.prototype.trigger=function(e,t,n){var i;(n=n||{}).jqueryEventName&&"undefined"!=typeof jQuery&&jQuery(e).trigger(n.jqueryEventName,n.data||null);try{i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n.data||null})}catch{(i=document.createEvent("CustomEvent")).initCustomEvent(t,!0,!0,n.data||null)}e.dispatchEvent(i)};var jetpackInfinityModule=function(){if("object"==typeof infiniteScroll&&(infiniteScroll.
496settings.body_class.split(" ").forEach(function(e){e&&document.body.classList.add(e)}),stats=infiniteScroll.settings.stats,type=infiniteScroll.settings.type,text=infiniteScroll.settings.text,totop=infiniteScroll.settings.totop,loading_text=infiniteScroll.settings.loading_text,infiniteScroll.scroller=new Scroller(infiniteScroll.settings),"click"===type)){var e=null;window.addEventListener("scroll",function(){e||(e=setTimeout(function(){infiniteScroll.scroller.determineURL(),e=null},250))})}};"interactive"===document.readyState||"complete"===document.readyState?jetpackInfinityModule():document.addEventListener("DOMContentLoaded",jetpackInfinityModule)})()})();; 497!function(e){var o={};function n(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=o,n.d=function(e,o,t){n.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,o){if(1&o&&(e=n(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var r in e)n.d(t,r,function(o){return e[o]}.bind(null,r));return t},n.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(o,"a",o),o},n.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},n.p="",n(n.s=273)}({273:function(e,o){!function(){"use strict";let e,o;function n(e){return new Promise((o,n)=>{const t=document.createElement("script");t.onload=()=>o(),t.onerror=e=>n(e),t.src=e,document.body.appendChild(t)})}function t(){if(e)return e;const o=window.wpcom_coblocks_js;return e=n(o.coblocks_lightbox_js),e}function r(){if(o)return o;window.wpcomJQueryUsageLoggerDisabled=!0;const e=window.wpcom_coblocks_js,t=window.jQuery?Promise.resolve():n(e.jquery_core_js).then(()=>n(e.jquery_migrate_js)),r=t.then(()=>window.imagesLoaded?Promise.resolve():n(e.imagesloaded_js)),c=t.then(()=>window.Masonry?Promise.resolve():n(e.masonry_js)),u=Promise.all([t,r,c]).then(()=>n(e.coblocks_masonry_js));return o=u,o}function c(){document.querySelector(".wp-block-coblocks-gallery-masonry")&&r(),document.querySelector(".has-lightbox")&&t(),document.body.classList.contains("block-editor-page")&&(r(),t())}"loading"!==document.readyState?c():document.addEventListener("DOMContentLoaded",c)}()}});; 498/** 499 * File skip-link-focus-fix.js. 500 * 501 * Helps with accessibility for keyboard only users. 502 * 503 * Learn more: https://git.io/vWdr2 504 */ 505( function() { 506 var isWebkit = navigator.userAgent.toLowerCase().indexOf( 'webkit' ) > -1, 507 isOpera = navigator.userAgent.toLowerCase().indexOf( 'opera' ) > -1, 508 isIe = navigator.userAgent.toLowerCase().indexOf( 'msie' ) > -1; 509 510 if ( ( isWebkit || isOpera || isIe ) && document.getElementById && window.addEventListener ) { 511 window.addEventListener( 'hashchange', function() { 512 var id = location.hash.substring( 1 ), 513 element; 514 515 if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) { 516 return; 517 } 518 519 element = document.getElementById( id ); 520 521 if ( element ) { 522 if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) { 523 element.tabIndex = -1; 524 } 525 526 element.focus(); 527 } 528 }, false ); 529 } 530})();; 531/* 532 * jQuery FlexSlider v2.4.0 533 * Copyright 2012 WooThemes 534 * Contributing Author: Tyler Smith 535 */ 536; 537(function ($) { 538 539 //FlexSlider: Object Instance 540 $.flexslider = function(el, options) { 541 var slider = $(el); 542 543 // making variables public 544 slider.vars = $.extend({}, $.flexslider.defaults, options); 545 546 var namespace = slider.vars.namespace, 547 msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture, 548 touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch, 549 // depricating this idea, as devices are being released with both of these events 550 //eventType = (touch) ? "touchend" : "click", 551 eventType = "click touchend MSPointerUp keyup", 552 watchedEvent = "", 553 watchedEventClearTimer, 554 vertical = slider.vars.direction === "vertical", 555 reverse = slider.vars.reverse, 556 carousel = (slider.vars.itemWidth > 0), 557 fade = slider.vars.animation === "fade", 558 asNav = slider.vars.asNavFor !== "", 559 methods = {}, 560 focused = true; 561 562 // Store a reference to the slider object 563 $.data(el, "flexslider", slider); 564 565 // Private slider methods 566 methods = { 567 init: function() { 568 slider.animating = false;
vendor: 45,927 bytes, lines 569-1631
569 // Get current slide and make sure it is a number 570 slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 ); 571 if ( isNaN( slider.currentSlide ) ) { slider.currentSlide = 0; } 572 slider.animatingTo = slider.currentSlide; 573 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last); 574 slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' ')); 575 slider.slides = $(slider.vars.selector, slider); 576 slider.container = $(slider.containerSelector, slider); 577 slider.count = slider.slides.length; 578 // SYNC: 579 slider.syncExists = $(slider.vars.sync).length > 0; 580 // SLIDE: 581 if (slider.vars.animation === "slide") { slider.vars.animation = "swing"; } 582 slider.prop = (vertical) ? "top" : "marginLeft"; 583 slider.args = {}; 584 // SLIDESHOW: 585 slider.manualPause = false; 586 slider.stopped = false; 587 //PAUSE WHEN INVISIBLE 588 slider.started = false; 589 slider.startTimeout = null; 590 // TOUCH/USECSS: 591 slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() { 592 var obj = document.createElement('div'), 593 props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']; 594 for (var i in props) { 595 if ( obj.style[ props[i] ] !== undefined ) { 596 slider.pfx = props[i].replace('Perspective','').toLowerCase(); 597 slider.prop = "-" + slider.pfx + "-transform"; 598 return true; 599 } 600 } 601 return false; 602 }()); 603 slider.ensureAnimationEnd = ''; 604 // CONTROLSCONTAINER: 605 if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer); 606 // MANUAL: 607 if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls); 608 609 // RANDOMIZE: 610 if (slider.vars.randomize) { 611 slider.slides.sort(function() { return (Math.round(Math.random())-0.5); }); 612 slider.container.empty().append(slider.slides); 613 } 614 615 slider.doMath(); 616 617 // INIT 618 slider.setup("init"); 619 620 // CONTROLNAV: 621 if (slider.vars.controlNav) { methods.controlNav.setup(); } 622 623 // DIRECTIONNAV: 624 if (slider.vars.directionNav) { methods.directionNav.setup(); } 625 626 // KEYBOARD: 627 if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) { 628 $(document).bind('keyup', function(event) { 629 var keycode = event.keyCode; 630 if (!slider.animating && (keycode === 39 || keycode === 37)) { 631 var target = (keycode === 39) ? slider.getTarget('next') : 632 (keycode === 37) ? slider.getTarget('prev') : false; 633 slider.flexAnimate(target, slider.vars.pauseOnAction); 634 } 635 }); 636 } 637 // MOUSEWHEEL: 638 if (slider.vars.mousewheel) { 639 slider.bind('mousewheel', function(event, delta, deltaX, deltaY) { 640 event.preventDefault(); 641 var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev'); 642 slider.flexAnimate(target, slider.vars.pauseOnAction); 643 }); 644 } 645 646 // PAUSEPLAY 647 if (slider.vars.pausePlay) { methods.pausePlay.setup(); } 648 649 //PAUSE WHEN INVISIBLE 650 if (slider.vars.slideshow && slider.vars.pauseInvisible) { methods.pauseInvisible.init(); } 651 652 // SLIDSESHOW 653 if (slider.vars.slideshow) { 654 if (slider.vars.pauseOnHover) { 655 slider.hover(function() { 656 if (!slider.manualPlay && !slider.manualPause) { slider.pause(); } 657 }, function() { 658 if (!slider.manualPause && !slider.manualPlay && !slider.stopped) { slider.play(); } 659 }); 660 } 661 // initialize animation 662 //If we're visible, or we don't use PageVisibility API 663 if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) { 664 (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play(); 665 } 666 } 667 668 // ASNAV: 669 if (asNav) { methods.asNav.setup(); } 670 671 // TOUCH 672 if (touch && slider.vars.touch) { methods.touch(); } 673 674 // FADE&&SMOOTHHEIGHT || SLIDE: 675 if (!fade || (fade && slider.vars.smoothHeight)) { $(window).bind("resize orientationchange focus", methods.resize); } 676 677 slider.find("img").attr("draggable", "false"); 678 679 // API: start() Callback 680 setTimeout(function(){ 681 slider.vars.start(slider); 682 }, 200); 683 }, 684 asNav: { 685 setup: function() { 686 slider.asNav = true; 687 slider.animatingTo = Math.floor(slider.currentSlide/slider.move); 688 slider.currentItem = slider.currentSlide; 689 slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide"); 690 if(!msGesture){ 691 slider.slides.on(eventType, function(e){ 692 e.preventDefault(); 693 var $slide = $(this), 694 target = $slide.index(); 695 var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container 696 if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) { 697 slider.flexAnimate(slider.getTarget("prev"), true); 698 } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) { 699 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 700 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true); 701 } 702 }); 703 }else{ 704 el._slider = slider; 705 slider.slides.each(function (){ 706 var that = this; 707 that._gesture = new MSGesture(); 708 that._gesture.target = that; 709 that.addEventListener("MSPointerDown", function (e){ 710 e.preventDefault(); 711 if(e.currentTarget._gesture) { 712 e.currentTarget._gesture.addPointer(e.pointerId); 713 } 714 }, false); 715 that.addEventListener("MSGestureTap", function (e){ 716 e.preventDefault(); 717 var $slide = $(this), 718 target = $slide.index(); 719 if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) { 720 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 721 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true); 722 } 723 }); 724 }); 725 } 726 } 727 }, 728 controlNav: { 729 setup: function() { 730 if (!slider.manualControls) { 731 methods.controlNav.setupPaging(); 732 } else { // MANUALCONTROLS: 733 methods.controlNav.setupManual(); 734 } 735 }, 736 setupPaging: function() { 737 var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging', 738 j = 1, 739 item, 740 slide; 741 742 slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>'); 743 744 if (slider.pagingCount > 1) { 745 for (var i = 0; i < slider.pagingCount; i++) { 746 slide = slider.slides.eq(i); 747 748 if ( undefined === slide.attr( 'data-thumb-alt' ) ) { 749 slide.attr( 'data-thumb-alt', '' ); 750 } 751 752 item = $( '<a></a>' ).attr( 'href', '#' ).text( j ); 753 if ( slider.vars.controlNav === "thumbnails" ) { 754 item = $( '<img/>' ).attr( 'src', slide.attr( 'data-thumb' ) ); 755 } 756 757 if ( '' !== slide.attr( 'data-thumb-alt' ) ) { 758 item.attr( 'alt', slide.attr( 'data-thumb-alt' ) ); 759 } 760 761 if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) { 762 var captn = slide.attr( 'data-thumbcaption' ); 763 if ( '' !== captn && undefined !== captn ) { 764 var caption = $('<span></span>' ).addClass( namespace + 'caption' ).text( captn ); 765 item.append( caption ); 766 } 767 } 768 769 var liElement = $( '<li>' ); 770 item.appendTo( liElement ); 771 liElement.append( '</li>' ); 772 773 slider.controlNavScaffold.append(liElement); 774 j++; 775 } 776 } 777 778 // CONTROLSCONTAINER: 779 (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold); 780 methods.controlNav.set(); 781 782 methods.controlNav.active(); 783 784 slider.controlNavScaffold.delegate('a, img', eventType, function(event) { 785 event.preventDefault(); 786 787 if (watchedEvent === "" || watchedEvent === event.type) { 788 var $this = $(this), 789 target = slider.controlNav.index($this); 790 791 if (!$this.hasClass(namespace + 'active')) { 792 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 793 slider.flexAnimate(target, slider.vars.pauseOnAction); 794 } 795 } 796 797 // setup flags to prevent event duplication 798 if (watchedEvent === "") { 799 watchedEvent = event.type; 800 } 801 methods.setToClearWatchedEvent(); 802 803 }); 804 }, 805 setupManual: function() { 806 slider.controlNav = slider.manualControls; 807 methods.controlNav.active(); 808 809 slider.controlNav.bind(eventType, function(event) { 810 event.preventDefault(); 811 812 if (watchedEvent === "" || watchedEvent === event.type) { 813 var $this = $(this), 814 target = slider.controlNav.index($this); 815 816 if (!$this.hasClass(namespace + 'active')) { 817 (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev"; 818 slider.flexAnimate(target, slider.vars.pauseOnAction); 819 } 820 } 821 822 // setup flags to prevent event duplication 823 if (watchedEvent === "") { 824 watchedEvent = event.type; 825 } 826 methods.setToClearWatchedEvent(); 827 }); 828 }, 829 set: function() { 830 var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a'; 831 slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider); 832 }, 833 active: function() { 834 slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active"); 835 }, 836 update: function(action, pos) { 837 if (slider.pagingCount > 1 && action === "add") { 838 slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>')); 839 } else if (slider.pagingCount === 1) { 840 slider.controlNavScaffold.find('li').remove(); 841 } else { 842 slider.controlNav.eq(pos).closest('li').remove(); 843 } 844 methods.controlNav.set(); 845 (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active(); 846 } 847 }, 848 directionNav: { 849 setup: function() { 850 var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li class="' + namespace + 'nav-prev"><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li class="' + namespace + 'nav-next"><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>'); 851 852 // CONTROLSCONTAINER: 853 if (slider.controlsContainer) { 854 $(slider.controlsContainer).append(directionNavScaffold); 855 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer); 856 } else { 857 slider.append(directionNavScaffold); 858 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider); 859 } 860 861 methods.directionNav.update(); 862 863 slider.directionNav.bind(eventType, function(event) { 864 event.preventDefault(); 865 var target; 866 867 if (watchedEvent === "" || watchedEvent === event.type) { 868 target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev'); 869 slider.flexAnimate(target, slider.vars.pauseOnAction); 870 } 871 872 // setup flags to prevent event duplication 873 if (watchedEvent === "") { 874 watchedEvent = event.type; 875 } 876 methods.setToClearWatchedEvent(); 877 }); 878 }, 879 update: function() { 880 var disabledClass = namespace + 'disabled'; 881 if (slider.pagingCount === 1) { 882 slider.directionNav.addClass(disabledClass).attr('tabindex', '-1'); 883 } else if (!slider.vars.animationLoop) { 884 if (slider.animatingTo === 0) { 885 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1'); 886 } else if (slider.animatingTo === slider.last) { 887 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1'); 888 } else { 889 slider.directionNav.removeClass(disabledClass).removeAttr('tabindex'); 890 } 891 } else { 892 slider.directionNav.removeClass(disabledClass).removeAttr('tabindex'); 893 } 894 } 895 }, 896 pausePlay: { 897 setup: function() { 898 var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>'); 899 900 // CONTROLSCONTAINER: 901 if (slider.controlsContainer) { 902 slider.controlsContainer.append(pausePlayScaffold); 903 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer); 904 } else { 905 slider.append(pausePlayScaffold); 906 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider); 907 } 908 909 methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play'); 910 911 slider.pausePlay.bind(eventType, function(event) { 912 event.preventDefault(); 913 914 if (watchedEvent === "" || watchedEvent === event.type) { 915 if ($(this).hasClass(namespace + 'pause')) { 916 slider.manualPause = true; 917 slider.manualPlay = false; 918 slider.pause(); 919 } else { 920 slider.manualPause = false; 921 slider.manualPlay = true; 922 slider.play(); 923 } 924 } 925 926 // setup flags to prevent event duplication 927 if (watchedEvent === "") { 928 watchedEvent = event.type; 929 } 930 methods.setToClearWatchedEvent(); 931 }); 932 }, 933 update: function(state) { 934 (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText); 935 } 936 }, 937 touch: function() { 938 var startX, 939 startY, 940 offset, 941 cwidth, 942 dx, 943 startT, 944 scrolling = false, 945 localX = 0, 946 localY = 0, 947 accDx = 0; 948 949 if(!msGesture){ 950 el.addEventListener('touchstart', onTouchStart, false); 951 952 function onTouchStart(e) { 953 if (slider.animating) { 954 e.preventDefault(); 955 } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) { 956 slider.pause(); 957 // CAROUSEL: 958 cwidth = (vertical) ? slider.h : slider. w; 959 startT = Number(new Date()); 960 // CAROUSEL: 961 962 // Local vars for X and Y points. 963 localX = e.touches[0].pageX; 964 localY = e.touches[0].pageY; 965 966 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 967 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 968 (carousel && slider.currentSlide === slider.last) ? slider.limit : 969 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 970 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 971 startX = (vertical) ? localY : localX; 972 startY = (vertical) ? localX : localY; 973 974 el.addEventListener('touchmove', onTouchMove, false); 975 el.addEventListener('touchend', onTouchEnd, false); 976 } 977 } 978 979 function onTouchMove(e) { 980 // Local vars for X and Y points. 981 982 localX = e.touches[0].pageX; 983 localY = e.touches[0].pageY; 984 985 dx = (vertical) ? startX - localY : startX - localX; 986 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY)); 987 988 var fxms = 500; 989 990 if ( ! scrolling || Number( new Date() ) - startT > fxms ) { 991 e.preventDefault(); 992 if (!fade && slider.transitions) { 993 if (!slider.vars.animationLoop) { 994 dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1); 995 } 996 slider.setProps(offset + dx, "setTouch"); 997 } 998 } 999 } 1000 1001 function onTouchEnd(e) { 1002 // finish the touch by undoing the touch session 1003 el.removeEventListener('touchmove', onTouchMove, false); 1004 1005 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 1006 var updateDx = (reverse) ? -dx : dx, 1007 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 1008 1009 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 1010 slider.flexAnimate(target, slider.vars.pauseOnAction); 1011 } else { 1012 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); } 1013 } 1014 } 1015 el.removeEventListener('touchend', onTouchEnd, false); 1016 1017 startX = null; 1018 startY = null; 1019 dx = null; 1020 offset = null; 1021 } 1022 }else{ 1023 el.style.msTouchAction = "none"; 1024 el._gesture = new MSGesture(); 1025 el._gesture.target = el; 1026 el.addEventListener("MSPointerDown", onMSPointerDown, false); 1027 el._slider = slider; 1028 el.addEventListener("MSGestureChange", onMSGestureChange, false); 1029 el.addEventListener("MSGestureEnd", onMSGestureEnd, false); 1030 1031 function onMSPointerDown(e){ 1032 e.stopPropagation(); 1033 if (slider.animating) { 1034 e.preventDefault(); 1035 }else{ 1036 slider.pause(); 1037 el._gesture.addPointer(e.pointerId); 1038 accDx = 0; 1039 cwidth = (vertical) ? slider.h : slider. w; 1040 startT = Number(new Date()); 1041 // CAROUSEL: 1042 1043 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 1044 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 1045 (carousel && slider.currentSlide === slider.last) ? slider.limit : 1046 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 1047 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 1048 } 1049 } 1050 1051 function onMSGestureChange(e) { 1052 e.stopPropagation(); 1053 var slider = e.target._slider; 1054 if(!slider){ 1055 return; 1056 } 1057 var transX = -e.translationX, 1058 transY = -e.translationY; 1059 1060 //Accumulate translations. 1061 accDx = accDx + ((vertical) ? transY : transX); 1062 dx = accDx; 1063 scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY)); 1064 1065 if(e.detail === e.MSGESTURE_FLAG_INERTIA){ 1066 setImmediate(function (){ 1067 el._gesture.stop(); 1068 }); 1069 1070 return; 1071 } 1072 1073 if (!scrolling || Number(new Date()) - startT > 500) { 1074 e.preventDefault(); 1075 if (!fade && slider.transitions) { 1076 if (!slider.vars.animationLoop) { 1077 dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1); 1078 } 1079 slider.setProps(offset + dx, "setTouch"); 1080 } 1081 } 1082 } 1083 1084 function onMSGestureEnd(e) { 1085 e.stopPropagation(); 1086 var slider = e.target._slider; 1087 if(!slider){ 1088 return; 1089 } 1090 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 1091 var updateDx = (reverse) ? -dx : dx, 1092 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 1093 1094 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 1095 slider.flexAnimate(target, slider.vars.pauseOnAction); 1096 } else { 1097 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); } 1098 } 1099 } 1100 1101 startX = null; 1102 startY = null; 1103 dx = null; 1104 offset = null; 1105 accDx = 0; 1106 } 1107 } 1108 }, 1109 resize: function() { 1110 if (!slider.animating && slider.is(':visible')) { 1111 if (!carousel) { slider.doMath(); } 1112 1113 if (fade) { 1114 // SMOOTH HEIGHT: 1115 methods.smoothHeight(); 1116 } else if (carousel) { //CAROUSEL: 1117 slider.slides.width(slider.computedW); 1118 slider.update(slider.pagingCount); 1119 slider.setProps(); 1120 } 1121 else if (vertical) { //VERTICAL: 1122 slider.viewport.height(slider.h); 1123 slider.setProps(slider.h, "setTotal"); 1124 } else { 1125 // SMOOTH HEIGHT: 1126 if (slider.vars.smoothHeight) { methods.smoothHeight(); } 1127 slider.newSlides.width(slider.computedW); 1128 slider.setProps(slider.computedW, "setTotal"); 1129 } 1130 } 1131 }, 1132 smoothHeight: function(dur) { 1133 if (!vertical || fade) { 1134 var $obj = (fade) ? slider : slider.viewport; 1135 (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height()); 1136 } 1137 }, 1138 sync: function(action) { 1139 var $obj = $(slider.vars.sync).data("flexslider"), 1140 target = slider.animatingTo; 1141 1142 switch (action) { 1143 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break; 1144 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break; 1145 case "pause": $obj.pause(); break; 1146 } 1147 }, 1148 uniqueID: function($clone) { 1149 // Append _clone to current level and children elements with id attributes 1150 $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() { 1151 var $this = $(this); 1152 $this.attr( 'id', $this.attr( 'id' ) + '_clone' ); 1153 }); 1154 return $clone; 1155 }, 1156 pauseInvisible: { 1157 visProp: null, 1158 init: function() { 1159 var visProp = methods.pauseInvisible.getHiddenProp(); 1160 if (visProp) { 1161 var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange'; 1162 document.addEventListener(evtname, function() { 1163 if (methods.pauseInvisible.isHidden()) { 1164 if(slider.startTimeout) { 1165 clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible 1166 } else { 1167 slider.pause(); //Or just pause 1168 } 1169 } 1170 else { 1171 if(slider.started) { 1172 slider.play(); //Initiated before, just play 1173 } else { 1174 if (slider.vars.initDelay > 0) { 1175 setTimeout(slider.play, slider.vars.initDelay); 1176 } else { 1177 slider.play(); //Didn't init before: simply init or wait for it 1178 } 1179 } 1180 } 1181 }); 1182 } 1183 }, 1184 isHidden: function() { 1185 var prop = methods.pauseInvisible.getHiddenProp(); 1186 if (!prop) { 1187 return false; 1188 } 1189 return document[prop]; 1190 }, 1191 getHiddenProp: function() { 1192 var prefixes = ['webkit','moz','ms','o']; 1193 // if 'hidden' is natively supported just return it 1194 if ('hidden' in document) { 1195 return 'hidden'; 1196 } 1197 // otherwise loop over all the known prefixes until we find one 1198 for ( var i = 0; i < prefixes.length; i++ ) { 1199 if ((prefixes[i] + 'Hidden') in document) { 1200 return prefixes[i] + 'Hidden'; 1201 } 1202 } 1203 // otherwise it's not supported 1204 return null; 1205 } 1206 }, 1207 setToClearWatchedEvent: function() { 1208 clearTimeout(watchedEventClearTimer); 1209 watchedEventClearTimer = setTimeout(function() { 1210 watchedEvent = ""; 1211 }, 3000); 1212 } 1213 }; 1214 1215 // public methods 1216 slider.flexAnimate = function(target, pause, override, withSync, fromNav) { 1217 if (!slider.vars.animationLoop && target !== slider.currentSlide) { 1218 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 1219 } 1220 1221 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev"; 1222 1223 if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) { 1224 if (asNav && withSync) { 1225 var master = $(slider.vars.asNavFor).data('flexslider'); 1226 slider.atEnd = target === 0 || target === slider.count - 1; 1227 master.flexAnimate(target, true, false, true, fromNav); 1228 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 1229 master.direction = slider.direction; 1230 1231 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) { 1232 slider.currentItem = target; 1233 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 1234 target = Math.floor(target/slider.visible); 1235 } else { 1236 slider.currentItem = target; 1237 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 1238 return false; 1239 } 1240 } 1241 1242 slider.animating = true; 1243 slider.animatingTo = target; 1244 1245 // SLIDESHOW: 1246 if (pause) { slider.pause(); } 1247 1248 // API: before() animation Callback 1249 slider.vars.before(slider); 1250 1251 // SYNC: 1252 if (slider.syncExists && !fromNav) { methods.sync("animate"); } 1253 1254 // CONTROLNAV 1255 if (slider.vars.controlNav) { methods.controlNav.active(); } 1256 1257 // !CAROUSEL: 1258 // CANDIDATE: slide active class (for add/remove slide) 1259 if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); } 1260 1261 // INFINITE LOOP: 1262 // CANDIDATE: atEnd 1263 slider.atEnd = target === 0 || target === slider.last; 1264 1265 // DIRECTIONNAV: 1266 if (slider.vars.directionNav) { methods.directionNav.update(); } 1267 1268 if (target === slider.last) { 1269 // API: end() of cycle Callback 1270 slider.vars.end(slider); 1271 // SLIDESHOW && !INFINITE LOOP: 1272 if (!slider.vars.animationLoop) { slider.pause(); } 1273 } 1274 1275 // SLIDE: 1276 if (!fade) { 1277 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW, 1278 margin, slideString, calcNext; 1279 1280 // INFINITE LOOP / REVERSE: 1281 if (carousel) { 1282 //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin; 1283 margin = slider.vars.itemMargin; 1284 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo; 1285 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext; 1286 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") { 1287 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0; 1288 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") { 1289 slideString = (reverse) ? 0 : (slider.count + 1) * dimension; 1290 } else { 1291 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension; 1292 } 1293 slider.setProps(slideString, "", slider.vars.animationSpeed); 1294 if (slider.transitions) { 1295 if (!slider.vars.animationLoop || !slider.atEnd) { 1296 slider.animating = false; 1297 slider.currentSlide = slider.animatingTo; 1298 } 1299 1300 // Unbind previous transitionEnd events and re-bind new transitionEnd event 1301 slider.container.unbind("webkitTransitionEnd transitionend"); 1302 slider.container.bind("webkitTransitionEnd transitionend", function() { 1303 clearTimeout(slider.ensureAnimationEnd); 1304 slider.wrapup(dimension); 1305 }); 1306 1307 // Insurance for the ever-so-fickle transitionEnd event 1308 clearTimeout(slider.ensureAnimationEnd); 1309 slider.ensureAnimationEnd = setTimeout(function() { 1310 slider.wrapup(dimension); 1311 }, slider.vars.animationSpeed + 100); 1312 1313 } else { 1314 slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){ 1315 slider.wrapup(dimension); 1316 }); 1317 } 1318 } else { // FADE: 1319 if (!touch) { 1320 //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing); 1321 //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 1322 1323 slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing); 1324 slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 1325 1326 } else { 1327 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 }); 1328 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 }); 1329 slider.wrapup(dimension); 1330 } 1331 } 1332 // SMOOTH HEIGHT: 1333 if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); } 1334 } 1335 }; 1336 slider.wrapup = function(dimension) { 1337 // SLIDE: 1338 if (!fade && !carousel) { 1339 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) { 1340 slider.setProps(dimension, "jumpEnd"); 1341 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) { 1342 slider.setProps(dimension, "jumpStart"); 1343 } 1344 } 1345 slider.animating = false; 1346 slider.currentSlide = slider.animatingTo; 1347 // API: after() animation Callback 1348 slider.vars.after(slider); 1349 }; 1350 1351 // SLIDESHOW: 1352 slider.animateSlides = function() { 1353 if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); } 1354 }; 1355 // SLIDESHOW: 1356 slider.pause = function() { 1357 clearInterval(slider.animatedSlides); 1358 slider.animatedSlides = null; 1359 slider.playing = false; 1360 // PAUSEPLAY: 1361 if (slider.vars.pausePlay) { methods.pausePlay.update("play"); } 1362 // SYNC: 1363 if (slider.syncExists) { methods.sync("pause"); } 1364 }; 1365 // SLIDESHOW: 1366 slider.play = function() { 1367 if (slider.playing) { clearInterval(slider.animatedSlides); } 1368 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed); 1369 slider.started = slider.playing = true; 1370 // PAUSEPLAY: 1371 if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); } 1372 // SYNC: 1373 if (slider.syncExists) { methods.sync("play"); } 1374 }; 1375 // STOP: 1376 slider.stop = function () { 1377 slider.pause(); 1378 slider.stopped = true; 1379 }; 1380 slider.canAdvance = function(target, fromNav) { 1381 // ASNAV: 1382 var last = (asNav) ? slider.pagingCount - 1 : slider.last; 1383 return (fromNav) ? true : 1384 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true : 1385 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false : 1386 (target === slider.currentSlide && !asNav) ? false : 1387 (slider.vars.animationLoop) ? true : 1388 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false : 1389 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false : 1390 true; 1391 }; 1392 slider.getTarget = function(dir) { 1393 slider.direction = dir; 1394 if (dir === "next") { 1395 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1; 1396 } else { 1397 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1; 1398 } 1399 }; 1400 1401 // SLIDE: 1402 slider.setProps = function(pos, special, dur) { 1403 var target = (function() { 1404 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo, 1405 posCalc = (function() { 1406 if (carousel) { 1407 return (special === "setTouch") ? pos : 1408 (reverse && slider.animatingTo === slider.last) ? 0 : 1409 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 1410 (slider.animatingTo === slider.last) ? slider.limit : posCheck; 1411 } else { 1412 switch (special) { 1413 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos; 1414 case "setTouch": return (reverse) ? pos : pos; 1415 case "jumpEnd": return (reverse) ? pos : slider.count * pos; 1416 case "jumpStart": return (reverse) ? slider.count * pos : pos; 1417 default: return pos; 1418 } 1419 } 1420 }()); 1421 1422 return (posCalc * -1) + "px"; 1423 }()); 1424 1425 if (slider.transitions) { 1426 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)"; 1427 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s"; 1428 slider.container.css("-" + slider.pfx + "-transition-duration", dur); 1429 slider.container.css("transition-duration", dur); 1430 } 1431 1432 slider.args[slider.prop] = target; 1433 if (slider.transitions || dur === undefined) { slider.container.css(slider.args); } 1434 1435 slider.container.css('transform',target); 1436 }; 1437 1438 slider.setup = function(type) { 1439 // SLIDE: 1440 if (!fade) { 1441 var sliderOffset, arr; 1442 1443 if (type === "init") { 1444 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container); 1445 // INFINITE LOOP: 1446 slider.cloneCount = 0; 1447 slider.cloneOffset = 0; 1448 // REVERSE: 1449 if (reverse) { 1450 arr = $.makeArray(slider.slides).reverse(); 1451 slider.slides = $(arr); 1452 slider.container.empty().append(slider.slides); 1453 } 1454 } 1455 // INFINITE LOOP && !CAROUSEL: 1456 if (slider.vars.animationLoop && !carousel) { 1457 slider.cloneCount = 2; 1458 slider.cloneOffset = 1; 1459 // clear out old clones 1460 if (type !== "init") { slider.container.find('.clone').remove(); } 1461 slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true')) 1462 .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true')); 1463 } 1464 slider.newSlides = $(slider.vars.selector, slider); 1465 1466 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset; 1467 // VERTICAL: 1468 if (vertical && !carousel) { 1469 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%"); 1470 setTimeout(function(){ 1471 slider.newSlides.css({"display": "block"}); 1472 slider.doMath(); 1473 slider.viewport.height(slider.h); 1474 slider.setProps(sliderOffset * slider.h, "init"); 1475 }, (type === "init") ? 100 : 0); 1476 } else { 1477 slider.container.width((slider.count + slider.cloneCount) * 200 + "%"); 1478 slider.setProps(sliderOffset * slider.computedW, "init"); 1479 setTimeout(function(){ 1480 slider.doMath(); 1481 slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"}); 1482 // SMOOTH HEIGHT: 1483 if (slider.vars.smoothHeight) { methods.smoothHeight(); } 1484 }, (type === "init") ? 100 : 0); 1485 } 1486 } else { // FADE: 1487 slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"}); 1488 if (type === "init") { 1489 if (!touch) { 1490 //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing); 1491 if (slider.vars.fadeFirstSlide == false) { 1492 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1}); 1493 } else { 1494 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing); 1495 } 1496 } else { 1497 slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2}); 1498 } 1499 } 1500 // SMOOTH HEIGHT: 1501 if (slider.vars.smoothHeight) { methods.smoothHeight(); } 1502 } 1503 // !CAROUSEL: 1504 // CANDIDATE: active slide 1505 if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); } 1506 1507 //FlexSlider: init() Callback 1508 slider.vars.init(slider); 1509 }; 1510 1511 slider.doMath = function() { 1512 var slide = slider.slides.first(), 1513 slideMargin = slider.vars.itemMargin, 1514 minItems = slider.vars.minItems, 1515 maxItems = slider.vars.maxItems; 1516 1517 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width(); 1518 slider.h = slide.height(); 1519 slider.boxPadding = slide.outerWidth() - slide.width(); 1520 1521 // CAROUSEL: 1522 if (carousel) { 1523 slider.itemT = slider.vars.itemWidth + slideMargin; 1524 slider.minW = (minItems) ? minItems * slider.itemT : slider.w; 1525 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w; 1526 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems : 1527 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems : 1528 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth; 1529 1530 slider.visible = Math.floor(slider.w/(slider.itemW)); 1531 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible; 1532 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1); 1533 slider.last = slider.pagingCount - 1; 1534 slider.limit = (slider.pagingCount === 1) ? 0 : 1535 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin; 1536 } else { 1537 slider.itemW = slider.w; 1538 slider.pagingCount = slider.count; 1539 slider.last = slider.count - 1; 1540 } 1541 slider.computedW = slider.itemW - slider.boxPadding; 1542 }; 1543 1544 slider.update = function(pos, action) { 1545 slider.doMath(); 1546 1547 // update currentSlide and slider.animatingTo if necessary 1548 if (!carousel) { 1549 if (pos < slider.currentSlide) { 1550 slider.currentSlide += 1; 1551 } else if (pos <= slider.currentSlide && pos !== 0) { 1552 slider.currentSlide -= 1; 1553 } 1554 slider.animatingTo = slider.currentSlide; 1555 } 1556 1557 // update controlNav 1558 if (slider.vars.controlNav && !slider.manualControls) { 1559 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) { 1560 methods.controlNav.update("add"); 1561 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) { 1562 if (carousel && slider.currentSlide > slider.last) { 1563 slider.currentSlide -= 1; 1564 slider.animatingTo -= 1; 1565 } 1566 methods.controlNav.update("remove", slider.last); 1567 } 1568 } 1569 // update directionNav 1570 if (slider.vars.directionNav) { methods.directionNav.update(); } 1571 1572 }; 1573 1574 slider.addSlide = function(obj, pos) { 1575 var $obj = $(obj); 1576 1577 slider.count += 1; 1578 slider.last = slider.count - 1; 1579 1580 // append new slide 1581 if (vertical && reverse) { 1582 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj); 1583 } else { 1584 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj); 1585 } 1586 1587 // update currentSlide, animatingTo, controlNav, and directionNav 1588 slider.update(pos, "add"); 1589 1590 // update slider.slides 1591 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1592 // re-setup the slider to accomdate new slide 1593 slider.setup(); 1594 1595 //FlexSlider: added() Callback 1596 slider.vars.added(slider); 1597 }; 1598 slider.removeSlide = function(obj) { 1599 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj; 1600 1601 // update count 1602 slider.count -= 1; 1603 slider.last = slider.count - 1; 1604 1605 // remove slide 1606 if (isNaN(obj)) { 1607 $(obj, slider.slides).remove(); 1608 } else { 1609 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove(); 1610 } 1611 1612 // update currentSlide, animatingTo, controlNav, and directionNav 1613 slider.doMath(); 1614 slider.update(pos, "remove"); 1615 1616 // update slider.slides 1617 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1618 // re-setup the slider to accomdate new slide 1619 slider.setup(); 1620 1621 // FlexSlider: removed() Callback 1622 slider.vars.removed(slider); 1623 }; 1624 1625 //FlexSlider: Initialize 1626 methods.init(); 1627 }; 1628 1629 // Ensure the slider isn't focussed if the window loses focus. 1630 $( window ).blur( function ( e ) { 1631 focused = false;
1632 }).focus( function ( e ) { 1633 focused = true; 1634 }); 1635 1636 //FlexSlider: Default Settings 1637 $.flexslider.defaults = { 1638 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin 1639 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril 1640 animation: "fade", //String: Select your animation type, "fade" or "slide" 1641 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported! 1642 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical" 1643 reverse: false, //{NEW} Boolean: Reverse the animation direction 1644 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end 1645 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode 1646 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide) 1647 slideshow: true, //Boolean: Animate slider automatically 1648 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds 1649 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds 1650 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds 1651 randomize: false, //Boolean: Randomize slide order 1652 fadeFirstSlide: true, //Boolean: Fade in the first slide when animation type is "fade" 1653 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav. 1654 1655 // Usability features 1656 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended. 1657 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering 1658 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage. 1659 useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available 1660 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices 1661 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches 1662 1663 // Primary Controls 1664 controlNav: true, //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage 1665 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) 1666 prevText: "Previous", //String: Set the text for the "previous" directionNav item 1667 nextText: "Next", //String: Set the text for the "next" directionNav item 1668 1669 // Secondary Navigation 1670 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys 1671 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present. 1672 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel 1673 pausePlay: false, //Boolean: Create pause/play dynamic element 1674 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item 1675 playText: "Play", //String: Set the text for the "play" pausePlay item 1676 1677 // Special properties 1678 controlsContainer: "", //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found. 1679 manualControls: "", //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs. 1680 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care. 1681 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider 1682 1683 // Carousel Options 1684 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding. 1685 itemMargin: 0, //{NEW} Integer: Margin between carousel items. 1686 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this. 1687 maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit. 1688 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items. 1689 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide 1690 1691 // Callback API 1692 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide 1693 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation 1694 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes 1695 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) 1696 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added 1697 removed: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is removed 1698 init: function() {} //{NEW}
1698 Callback: function(slider) - Fires after the slider is initially setup 1699 }; 1700 1701 //FlexSlider: Plugin Function 1702 $.fn.flexslider = function(options) { 1703 if (options === undefined) { options = {}; } 1704 1705 if (typeof options === "object") { 1706 return this.each(function() { 1707 var $this = $(this), 1708 selector = (options.selector) ? options.selector : ".slides > li", 1709 $slides = $this.find(selector); 1710 1711 if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) { 1712 $slides.fadeIn(400); 1713 if (options.start) { options.start($this); } 1714 } else if ($this.data('flexslider') === undefined) { 1715 new $.flexslider(this, options); 1716 } 1717 }); 1718 } else { 1719 // Helper strings to quickly perform functions on the slider 1720 var $slider = $(this).data('flexslider'); 1721 switch (options) { 1722 case "play": $slider.play(); break; 1723 case "pause": $slider.pause(); break; 1724 case "stop": $slider.stop(); break; 1725 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break; 1726 case "prev": 1727 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break; 1728 default: if (typeof options === "number") { $slider.flexAnimate(options, true); } 1729 } 1730 } 1731 }; 1732})(jQuery); 1733; 1734/* 1735 By Osvaldas Valutis, www.osvaldas.info 1736 Available for use under the MIT License 1737*/ 1738 1739 1740 1741;(function( $, window, document, undefined ) 1742{ 1743 $.fn.doubleTapToGo = function( params ) 1744 { 1745 if( !( 'ontouchstart' in window ) && 1746 !navigator.msMaxTouchPoints && 1747 !navigator.userAgent.toLowerCase().match( /windows phone os 7/i ) ) return false; 1748 1749 this.each( function() 1750 { 1751 var curItem = false; 1752 1753 $( this ).on( 'click', function( e ) 1754 { 1755 var item = $( this ); 1756 if( item[ 0 ] != curItem[ 0 ] ) 1757 { 1758 e.preventDefault(); 1759 curItem = item; 1760 } 1761 }); 1762 1763 $( document ).on( 'click touchstart MSPointerDown', function( e ) 1764 { 1765 var resetItem = true, 1766 parents = $( e.target ).parents(); 1767 1768 for( var i = 0; i < parents.length; i++ ) 1769 if( parents[ i ] == curItem[ 0 ] ) 1770 resetItem = false; 1771 1772 if( resetItem ) 1773 curItem = false; 1774 }); 1775 }); 1776 return this; 1777 }; 1778})( jQuery, window, document );; 1779/** 1780 * global.js 1781 * 1782 * Handles various UI actions 1783 * - Mobile menu 1784 * - Search form show/hide 1785 * - Touch device dropdowns (requires: doubletaptogo.js) 1786 * - Flexslider (requires: flexslider.js) 1787 * - Scroll to top 1788 * - Smooth page load 1789 * 1790 * @package Rowling 1791 */ 1792( function( $ ) { 1793 1794/** 1795 * On ready 1796 */ 1797 $( document ).ready( function() { 1798 var windowWidth = $( window ).width(); 1799 1800 1801 // Toggle mobile menu 1802 $( ".nav-toggle" ).on( "click", function() { 1803 $( this ).toggleClass( "active" ); 1804 $( ".header-bottom-menu" ).slideToggle(); 1805 if ( $( ".search-toggle" ).hasClass( "active" ) ) { 1806 $( ".search-toggle" ).removeClass( "active" ); 1807 $( ".search-container" ).slideToggle(); 1808 } 1809 return false; 1810 }); 1811 1812 1813 // Toggle search container 1814 $( ".search-toggle" ).on( "click", function() { 1815 $( this ).toggleClass( "active" ); 1816 $( ".search-container" ).slideToggle(); 1817 if ( $( ".nav-toggle" ).hasClass( "active" ) ) { 1818 $( ".nav-toggle" ).removeClass( "active" ); 1819 $( ".header-bottom-menu" ).slideToggle(); 1820 } 1821 return false; 1822 }); 1823 1824 $( window ).resize( function() { 1825 1826 // Prevent the Android keyboard from triggering the following code 1827 if ( windowWidth !== $( window ).width() ) { 1828 1829 // Hide mobile menu/search container at resize 1830 if ( $(window).width() >= 851 ) { 1831 $( ".nav-toggle" ).removeClass( "active" ); 1832 $( ".header-bottom-menu" ).show(); 1833 } 1834 1835 if ( $(window).width() <= 850 ) { 1836 $( ".search-toggle" ).removeClass( "active" ); 1837 $( ".search-container" ).hide(); 1838 } 1839 1840 // Dropdown menus on touch devices, excluding mobile menu 1841 if ( $(window).width() <= 851 ) { 1842 $( ".header-bottom-menu li:has(ul)" ).doubleTapToGo(); 1843 $( ".header-top-menu li:has(ul)" ).doubleTapToGo(); 1844 } 1845 1846 if ( $(window).width() >= 850 ) { 1847 $( ".header-bottom-menu li:has(ul)" ).unbind(); 1848 $( ".header-top-menu li:has(ul)" ).unbind(); 1849 } 1850 } 1851 1852 windowWidth = $( window ).width(); 1853 1854 }).resize(); 1855 1856 // Load Flexslider 1857 $( ".flexslider" ).flexslider( { 1858 animation: "slide", 1859 controlNav: false, 1860 prevText: "", 1861 nextText: "", 1862 smoothHeight: true 1863 }); 1864 1865 // smooth scroll to the top 1866 $( ".to-the-top" ).click( function() { 1867 $( "html, body" ).animate( { scrollTop: 0 }, 500 ); 1868 return false;
1869 }); 1870 1871 }); 1872 1873 1874 /** 1875 * On load 1876 */ 1877 $( document.body ).on( 'post-load', function () { 1878 1879 // Load Flexslider after new posts have been added to the page. 1880 $( ".flexslider" ).flexslider( { 1881 animation: "slide", 1882 controlNav: false, 1883 prevText: "", 1884 nextText: "", 1885 smoothHeight: true 1886 }); 1887 1888 }); 1889 1890} ) ( jQuery ); 1891; 1892(()=>{var e={8885(e,t,o){(e=o.nmd(e))&&(e.exports=function(){var e,t="en",o=/[?&#]lang=([a-zA-Z\-_]+)/;"object"==typeof _wp_google_translate_widget&&"string"==typeof _wp_google_translate_widget.lang&&(t=_wp_google_translate_widget.lang),(e=window.location.href.match(o))&&(window.location.href=window.location.href.replace(o,"").replace(/#googtrans\([a-zA-Z\-_|]+\)/,"")+"#googtrans("+t+"|"+e[1]+")"),new google.translate.TranslateElement({pageLanguage:t,layout:_wp_google_translate_widget.layout,autoDisplay:!1},"google_translate_element")})}};const t={};function o(a){const n=t[a];if(void 0!==n)return n.exports;const l=t[a]={id:a,loaded:!1,exports:{}};return e[a](l,l.exports,o),l.loaded=!0,l.exports}o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);let a=o(8885);googleTranslateElementInit=a})();;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.