2016-08-18 16:37:38 +00:00
/ * M o d e r n i z r 2 . 8 . 3 ( C u s t o m B u i l d ) | M I T & B S D
* Build : http : //modernizr.com/download/#-shiv-cssclasses-load
* /
; window . Modernizr = function ( a , b , c ) { function u ( a ) { j . cssText = a } function v ( a , b ) { return u ( prefixes . join ( a + ";" ) + ( b || "" ) ) } function w ( a , b ) { return typeof a === b } function x ( a , b ) { return ! ! ~ ( "" + a ) . indexOf ( b ) } function y ( a , b , d ) { for ( var e in a ) { var f = b [ a [ e ] ] ; if ( f !== c ) return d === ! 1 ? a [ e ] : w ( f , "function" ) ? f . bind ( d || b ) : f } return ! 1 } var d = "2.8.3" , e = { } , f = ! 0 , g = b . documentElement , h = "modernizr" , i = b . createElement ( h ) , j = i . style , k , l = { } . toString , m = { } , n = { } , o = { } , p = [ ] , q = p . slice , r , s = { } . hasOwnProperty , t ; ! w ( s , "undefined" ) && ! w ( s . call , "undefined" ) ? t = function ( a , b ) { return s . call ( a , b ) } : t = function ( a , b ) { return b in a && w ( a . constructor . prototype [ b ] , "undefined" ) } , Function . prototype . bind || ( Function . prototype . bind = function ( b ) { var c = this ; if ( typeof c != "function" ) throw new TypeError ; var d = q . call ( arguments , 1 ) , e = function ( ) { if ( this instanceof e ) { var a = function ( ) { } ; a . prototype = c . prototype ; var f = new a , g = c . apply ( f , d . concat ( q . call ( arguments ) ) ) ; return Object ( g ) === g ? g : f } return c . apply ( b , d . concat ( q . call ( arguments ) ) ) } ; return e } ) ; for ( var z in m ) t ( m , z ) && ( r = z . toLowerCase ( ) , e [ r ] = m [ z ] ( ) , p . push ( ( e [ r ] ? "" : "no-" ) + r ) ) ; return e . addTest = function ( a , b ) { if ( typeof a == "object" ) for ( var d in a ) t ( a , d ) && e . addTest ( d , a [ d ] ) ; else { a = a . toLowerCase ( ) ; if ( e [ a ] !== c ) return e ; b = typeof b == "function" ? b ( ) : b , typeof f != "undefined" && f && ( g . className += " " + ( b ? "" : "no-" ) + a ) , e [ a ] = b } return e } , u ( "" ) , i = k = null , function ( a , b ) { function l ( a , b ) { var c = a . createElement ( "p" ) , d = a . getElementsByTagName ( "head" ) [ 0 ] || a . documentElement ; return c . innerHTML = "x<style>" + b + "</style>" , d . insertBefore ( c . lastChild , d . firstChild ) } function m ( ) { var a = s . elements ; return typeof a == "string" ? a . split ( " " ) : a } function n ( a ) { var b = j [ a [ h ] ] ; return b || ( b = { } , i ++ , a [ h ] = i , j [ i ] = b ) , b } function o ( a , c , d ) { c || ( c = b ) ; if ( k ) return c . createElement ( a ) ; d || ( d = n ( c ) ) ; var g ; return d . cache [ a ] ? g = d . cache [ a ] . cloneNode ( ) : f . test ( a ) ? g = ( d . cache [ a ] = d . createElem ( a ) ) . cloneNode ( ) : g = d . createElem ( a ) , g . canHaveChildren && ! e . test ( a ) && ! g . tagUrn ? d . frag . appendChild ( g ) : g } function p ( a , c ) { a || ( a = b ) ; if ( k ) return a . createDocumentFragment ( ) ; c = c || n ( a ) ; var d = c . frag . cloneNode ( ) , e = 0 , f = m ( ) , g = f . length ; for ( ; e < g ; e ++ ) d . createElement ( f [ e ] ) ; return d } function q ( a , b ) { b . cache || ( b . cache = { } , b . createElem = a . createElement , b . createFrag = a . createDocumentFragment , b . frag = b . createFrag ( ) ) , a . createElement = function ( c ) { return s . shivMethods ? o ( c , a , b ) : b . createElem ( c ) } , a . createDocumentFragment = Function ( "h,f" , "return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" + m ( ) . join ( ) . replace ( /[\w\-]+/g , function ( a ) { return b . createElem ( a ) , b . frag . createElement ( a ) , 'c("' + a + '")' } ) + ");return n}" ) ( s , b . frag ) } function r ( a ) { a || ( a = b ) ; var c = n ( a ) ; return s . shivCSS && ! g && ! c . hasCSS && ( c . hasCSS = ! ! l ( a , "article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}" ) ) , k || q ( a , c ) , a } var c = "3.7.0" , d = a . html5 || { } , e = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i , f = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i , g , h = "_html5shiv" , i = 0 , j = { } , k ; ( function ( ) { try { var a = b . createElement ( "a" ) ; a . innerHTML = "<xyz></xyz>" , g = "hidden" in a , k = a . childNodes . length == 1 || function ( ) { b . createElement ( "a" ) ; var a = b . createDocumentFragment ( ) ; return typeof a . cloneNode == "undefined" || typeof a . createDocumentFragment == "undefined" || typeof a . createElement == "undefined" } ( ) } catch ( c ) { g = ! 0 , k = ! 0 } } ) ( ) ; var s = { elements : d . elements || "abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video" , version : c , shivCSS : d . shivCSS !== ! 1 , supportsUnknownElements : k , shivMethods : d . shivMethods !== ! 1 , type : "default" , shivDocument : r , createElement : o , createDocumentFragment : p } ; a . html5 = s , r ( b ) } ( this , b ) , e . _version = d , g . className = g . className . replace ( /(^|\s)no-js(\s|$)/ , "$1$2" ) + ( f ? " js " + p . join ( " " ) : "" ) , e } ( this , this . document ) , function ( a , b , c ) { function d ( a ) { return "[object Function]" == o . call ( a ) } function e ( a ) { return "string" == typeof a } function f ( ) { } function g ( a ) { return ! a || "loaded" == a || "complete" == a || "uninitialized" == a } function h ( ) { var a = p . shift ( ) ; q = 1 , a ? a . t ? m ( function ( ) { ( "c" == a . t ? B . inje
/ * ! P i c t u r e f i l l - v 2 . 3 . 0 - 2 0 1 5 - 0 3 - 2 3
* http : //scottjehl.github.io/picturefill
* Copyright ( c ) 2015 https : //github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT */
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
window . matchMedia || ( window . matchMedia = function ( ) {
"use strict" ;
// For browsers that support matchMedium api such as IE 9 and webkit
var styleMedia = ( window . styleMedia || window . media ) ;
// For those that don't support matchMedium
if ( ! styleMedia ) {
var style = document . createElement ( 'style' ) ,
script = document . getElementsByTagName ( 'script' ) [ 0 ] ,
info = null ;
style . type = 'text/css' ;
style . id = 'matchmediajs-test' ;
script . parentNode . insertBefore ( style , script ) ;
// 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
info = ( 'getComputedStyle' in window ) && window . getComputedStyle ( style , null ) || style . currentStyle ;
styleMedia = {
matchMedium : function ( media ) {
var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }' ;
// 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
if ( style . styleSheet ) {
style . styleSheet . cssText = text ;
} else {
style . textContent = text ;
}
// Test if media query is true or false
return info . width === '1px' ;
}
} ;
}
return function ( media ) {
return {
matches : styleMedia . matchMedium ( media || 'all' ) ,
media : media || 'all'
} ;
} ;
} ( ) ) ;
/ * ! P i c t u r e f i l l - R e s p o n s i v e I m a g e s t h a t w o r k t o d a y .
* Author : Scott Jehl , Filament Group , 2012 ( new proposal implemented by Shawn Jansepar )
* License : MIT / GPLv2
* Spec : http : //picture.responsiveimages.org/
* /
( function ( w , doc , image ) {
// Enable strict mode
"use strict" ;
function expose ( picturefill ) {
/* expose picturefill */
if ( typeof module === "object" && typeof module . exports === "object" ) {
// CommonJS, just export
module . exports = picturefill ;
} else if ( typeof define === "function" && define . amd ) {
// AMD support
define ( "picturefill" , function ( ) { return picturefill ; } ) ;
}
if ( typeof w === "object" ) {
// If no AMD and we are in the browser, attach to window
w . picturefill = picturefill ;
}
}
// If picture is supported, well, that's awesome. Let's get outta here...
if ( w . HTMLPictureElement ) {
expose ( function ( ) { } ) ;
return ;
}
// HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround)
doc . createElement ( "picture" ) ;
// local object for method references and testing exposure
var pf = w . picturefill || { } ;
var regWDesc = /\s+\+?\d+(e\d+)?w/ ;
// namespace
pf . ns = "picturefill" ;
// srcset support test
( function ( ) {
pf . srcsetSupported = "srcset" in image ;
pf . sizesSupported = "sizes" in image ;
} ) ( ) ;
// just a string trim workaround
pf . trim = function ( str ) {
return str . trim ? str . trim ( ) : str . replace ( /^\s+|\s+$/g , "" ) ;
} ;
/ * *
* Gets a string and returns the absolute URL
* @ param src
* @ returns { String } absolute URL
* /
pf . makeUrl = ( function ( ) {
var anchor = doc . createElement ( "a" ) ;
return function ( src ) {
anchor . href = src ;
return anchor . href ;
} ;
} ) ( ) ;
/ * *
* Shortcut method for https : //w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests )
* /
pf . restrictsMixedContent = function ( ) {
return w . location . protocol === "https:" ;
} ;
/ * *
* Shortcut method for matchMedia ( for easy overriding in tests )
* /
pf . matchesMedia = function ( media ) {
return w . matchMedia && w . matchMedia ( media ) . matches ;
} ;
// Shortcut method for `devicePixelRatio` ( for easy overriding in tests )
pf . getDpr = function ( ) {
return ( w . devicePixelRatio || 1 ) ;
} ;
/ * *
* Get width in css pixel value from a "length" value
* http : //dev.w3.org/csswg/css-values-3/#length-value
* /
pf . getWidthFromLength = function ( length ) {
var cssValue ;
// If a length is specified and doesn’ t contain a percentage, and it is greater than 0 or using `calc`, use it. Else, abort.
if ( ! ( length && length . indexOf ( "%" ) > - 1 === false && ( parseFloat ( length ) > 0 || length . indexOf ( "calc(" ) > - 1 ) ) ) {
return false ;
}
/ * *
* If length is specified in ` vw ` units , use ` % ` instead since the div we ’ re measuring
* is injected at the top of the document .
*
* TODO : maybe we should put this behind a feature test for ` vw ` ? The risk of doing this is possible browser inconsistancies with vw vs %
* /
length = length . replace ( "vw" , "%" ) ;
// Create a cached element for getting length value widths
if ( ! pf . lengthEl ) {
pf . lengthEl = doc . createElement ( "div" ) ;
// Positioning styles help prevent padding/margin/width on `html` or `body` from throwing calculations off.
pf . lengthEl . style . cssText = "border:0;display:block;font-size:1em;left:0;margin:0;padding:0;position:absolute;visibility:hidden" ;
// Add a class, so that everyone knows where this element comes from
pf . lengthEl . className = "helper-from-picturefill-js" ;
}
pf . lengthEl . style . width = "0px" ;
try {
pf . lengthEl . style . width = length ;
} catch ( e ) { }
doc . body . appendChild ( pf . lengthEl ) ;
cssValue = pf . lengthEl . offsetWidth ;
if ( cssValue <= 0 ) {
cssValue = false ;
}
doc . body . removeChild ( pf . lengthEl ) ;
return cssValue ;
} ;
pf . detectTypeSupport = function ( type , typeUri ) {
// based on Modernizr's lossless img-webp test
// note: asynchronous
var image = new w . Image ( ) ;
image . onerror = function ( ) {
pf . types [ type ] = false ;
picturefill ( ) ;
} ;
image . onload = function ( ) {
pf . types [ type ] = image . width === 1 ;
picturefill ( ) ;
} ;
image . src = typeUri ;
return "pending" ;
} ;
// container of supported mime types that one might need to qualify before using
pf . types = pf . types || { } ;
pf . initTypeDetects = function ( ) {
// Add support for standard mime types
pf . types [ "image/jpeg" ] = true ;
pf . types [ "image/gif" ] = true ;
pf . types [ "image/png" ] = true ;
pf . types [ "image/svg+xml" ] = doc . implementation . hasFeature ( "http://www.w3.org/TR/SVG11/feature#Image" , "1.1" ) ;
pf . types [ "image/webp" ] = pf . detectTypeSupport ( "image/webp" , "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=" ) ;
} ;
pf . verifyTypeSupport = function ( source ) {
var type = source . getAttribute ( "type" ) ;
// if type attribute exists, return test result, otherwise return true
if ( type === null || type === "" ) {
return true ;
} else {
var pfType = pf . types [ type ] ;
// if the type test is a function, run it and return "pending" status. The function will rerun picturefill on pending elements once finished.
if ( typeof pfType === "string" && pfType !== "pending" ) {
pf . types [ type ] = pf . detectTypeSupport ( type , pfType ) ;
return "pending" ;
} else if ( typeof pfType === "function" ) {
pfType ( ) ;
return "pending" ;
} else {
return pfType ;
}
}
} ;
// Parses an individual `size` and returns the length, and optional media query
pf . parseSize = function ( sourceSizeStr ) {
var match = /(\([^)]+\))?\s*(.+)/g . exec ( sourceSizeStr ) ;
return {
media : match && match [ 1 ] ,
length : match && match [ 2 ]
} ;
} ;
// Takes a string of sizes and returns the width in pixels as a number
pf . findWidthFromSourceSize = function ( sourceSizeListStr ) {
// Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33%
// or (min-width:30em) calc(30% - 15px)
var sourceSizeList = pf . trim ( sourceSizeListStr ) . split ( /\s*,\s*/ ) ,
winningLength ;
for ( var i = 0 , len = sourceSizeList . length ; i < len ; i ++ ) {
// Match <media-condition>? length, ie ( min-width: 50em ) 100%
var sourceSize = sourceSizeList [ i ] ,
// Split "( min-width: 50em ) 100%" into separate strings
parsedSize = pf . parseSize ( sourceSize ) ,
length = parsedSize . length ,
media = parsedSize . media ;
if ( ! length ) {
continue ;
}
// if there is no media query or it matches, choose this as our winning length
if ( ( ! media || pf . matchesMedia ( media ) ) &&
// pass the length to a method that can properly determine length
// in pixels based on these formats: http://dev.w3.org/csswg/css-values-3/#length-value
( winningLength = pf . getWidthFromLength ( length ) ) ) {
break ;
}
}
//if we have no winningLength fallback to 100vw
return winningLength || Math . max ( w . innerWidth || 0 , doc . documentElement . clientWidth ) ;
} ;
pf . parseSrcset = function ( srcset ) {
/ * *
* A lot of this was pulled from Boris Smus ’ parser for the now - defunct WHATWG ` srcset `
* https : //github.com/borismus/srcset-polyfill/blob/master/js/srcset-info.js
*
* 1. Let input ( ` srcset ` ) be the value passed to this algorithm .
* 2. Let position be a pointer into input , initially pointing at the start of the string .
* 3. Let raw candidates be an initially empty ordered list of URLs with associated
* unparsed descriptors . The order of entries in the list is the order in which entries
* are added to the list .
* /
var candidates = [ ] ;
while ( srcset !== "" ) {
srcset = srcset . replace ( /^\s+/g , "" ) ;
// 5. Collect a sequence of characters that are not space characters, and let that be url.
var pos = srcset . search ( /\s/g ) ,
url , descriptor = null ;
if ( pos !== - 1 ) {
url = srcset . slice ( 0 , pos ) ;
var last = url . slice ( - 1 ) ;
// 6. If url ends with a U+002C COMMA character (,), remove that character from url
// and let descriptors be the empty string. Otherwise, follow these substeps
// 6.1. If url is empty, then jump to the step labeled descriptor parser.
if ( last === "," || url === "" ) {
url = url . replace ( /,+$/ , "" ) ;
descriptor = "" ;
}
srcset = srcset . slice ( pos + 1 ) ;
// 6.2. Collect a sequence of characters that are not U+002C COMMA characters (,), and
// let that be descriptors.
if ( descriptor === null ) {
var descpos = srcset . indexOf ( "," ) ;
if ( descpos !== - 1 ) {
descriptor = srcset . slice ( 0 , descpos ) ;
srcset = srcset . slice ( descpos + 1 ) ;
} else {
descriptor = srcset ;
srcset = "" ;
}
}
} else {
url = srcset ;
srcset = "" ;
}
// 7. Add url to raw candidates, associated with descriptors.
if ( url || descriptor ) {
candidates . push ( {
url : url ,
descriptor : descriptor
} ) ;
}
}
return candidates ;
} ;
pf . parseDescriptor = function ( descriptor , sizesattr ) {
// 11. Descriptor parser: Let candidates be an initially empty source set. The order of entries in the list
// is the order in which entries are added to the list.
var sizes = sizesattr || "100vw" ,
sizeDescriptor = descriptor && descriptor . replace ( /(^\s+|\s+$)/g , "" ) ,
widthInCssPixels = pf . findWidthFromSourceSize ( sizes ) ,
resCandidate ;
if ( sizeDescriptor ) {
var splitDescriptor = sizeDescriptor . split ( " " ) ;
for ( var i = splitDescriptor . length - 1 ; i >= 0 ; i -- ) {
var curr = splitDescriptor [ i ] ,
lastchar = curr && curr . slice ( curr . length - 1 ) ;
if ( ( lastchar === "h" || lastchar === "w" ) && ! pf . sizesSupported ) {
resCandidate = parseFloat ( ( parseInt ( curr , 10 ) / widthInCssPixels ) ) ;
} else if ( lastchar === "x" ) {
var res = curr && parseFloat ( curr , 10 ) ;
resCandidate = res && ! isNaN ( res ) ? res : 1 ;
}
}
}
return resCandidate || 1 ;
} ;
/ * *
* Takes a srcset in the form of url /
* ex . "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or
* "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or
* "images/pic-small.png"
* Get an array of image candidates in the form of
* { url : "/foo/bar.png" , resolution : 1 }
* where resolution is http : //dev.w3.org/csswg/css-values-3/#resolution-value
* If sizes is specified , resolution is calculated
* /
pf . getCandidatesFromSourceSet = function ( srcset , sizes ) {
var candidates = pf . parseSrcset ( srcset ) ,
formattedCandidates = [ ] ;
for ( var i = 0 , len = candidates . length ; i < len ; i ++ ) {
var candidate = candidates [ i ] ;
formattedCandidates . push ( {
url : candidate . url ,
resolution : pf . parseDescriptor ( candidate . descriptor , sizes )
} ) ;
}
return formattedCandidates ;
} ;
/ * *
* if it ' s an img element and it has a srcset property ,
* we need to remove the attribute so we can manipulate src
* ( the property 's existence infers native srcset support, and a srcset-supporting browser will prioritize srcset' s value over our winning picture candidate )
* this moves srcset ' s value to memory for later use and removes the attr
* /
pf . dodgeSrcset = function ( img ) {
if ( img . srcset ) {
img [ pf . ns ] . srcset = img . srcset ;
img . srcset = "" ;
img . setAttribute ( "data-pfsrcset" , img [ pf . ns ] . srcset ) ;
}
} ;
// Accept a source or img element and process its srcset and sizes attrs
pf . processSourceSet = function ( el ) {
var srcset = el . getAttribute ( "srcset" ) ,
sizes = el . getAttribute ( "sizes" ) ,
candidates = [ ] ;
// if it's an img element, use the cached srcset property (defined or not)
if ( el . nodeName . toUpperCase ( ) === "IMG" && el [ pf . ns ] && el [ pf . ns ] . srcset ) {
srcset = el [ pf . ns ] . srcset ;
}
if ( srcset ) {
candidates = pf . getCandidatesFromSourceSet ( srcset , sizes ) ;
}
return candidates ;
} ;
pf . backfaceVisibilityFix = function ( picImg ) {
// See: https://github.com/scottjehl/picturefill/issues/332
var style = picImg . style || { } ,
WebkitBackfaceVisibility = "webkitBackfaceVisibility" in style ,
currentZoom = style . zoom ;
if ( WebkitBackfaceVisibility ) {
style . zoom = ".999" ;
WebkitBackfaceVisibility = picImg . offsetWidth ;
style . zoom = currentZoom ;
}
} ;
pf . setIntrinsicSize = ( function ( ) {
var urlCache = { } ;
var setSize = function ( picImg , width , res ) {
if ( width ) {
picImg . setAttribute ( "width" , parseInt ( width / res , 10 ) ) ;
}
} ;
return function ( picImg , bestCandidate ) {
var img ;
if ( ! picImg [ pf . ns ] || w . pfStopIntrinsicSize ) {
return ;
}
if ( picImg [ pf . ns ] . dims === undefined ) {
picImg [ pf . ns ] . dims = picImg . getAttribute ( "width" ) || picImg . getAttribute ( "height" ) ;
}
if ( picImg [ pf . ns ] . dims ) { return ; }
if ( bestCandidate . url in urlCache ) {
setSize ( picImg , urlCache [ bestCandidate . url ] , bestCandidate . resolution ) ;
} else {
img = doc . createElement ( "img" ) ;
img . onload = function ( ) {
urlCache [ bestCandidate . url ] = img . width ;
//IE 10/11 don't calculate width for svg outside document
if ( ! urlCache [ bestCandidate . url ] ) {
try {
doc . body . appendChild ( img ) ;
urlCache [ bestCandidate . url ] = img . width || img . offsetWidth ;
doc . body . removeChild ( img ) ;
} catch ( e ) { }
}
if ( picImg . src === bestCandidate . url ) {
setSize ( picImg , urlCache [ bestCandidate . url ] , bestCandidate . resolution ) ;
}
picImg = null ;
img . onload = null ;
img = null ;
} ;
img . src = bestCandidate . url ;
}
} ;
} ) ( ) ;
pf . applyBestCandidate = function ( candidates , picImg ) {
var candidate ,
length ,
bestCandidate ;
candidates . sort ( pf . ascendingSort ) ;
length = candidates . length ;
bestCandidate = candidates [ length - 1 ] ;
for ( var i = 0 ; i < length ; i ++ ) {
candidate = candidates [ i ] ;
if ( candidate . resolution >= pf . getDpr ( ) ) {
bestCandidate = candidate ;
break ;
}
}
if ( bestCandidate ) {
bestCandidate . url = pf . makeUrl ( bestCandidate . url ) ;
if ( picImg . src !== bestCandidate . url ) {
if ( pf . restrictsMixedContent ( ) && bestCandidate . url . substr ( 0 , "http:" . length ) . toLowerCase ( ) === "http:" ) {
if ( window . console !== undefined ) {
console . warn ( "Blocked mixed content image " + bestCandidate . url ) ;
}
} else {
picImg . src = bestCandidate . url ;
// currentSrc attribute and property to match
// http://picture.responsiveimages.org/#the-img-element
picImg . currentSrc = picImg . src ;
pf . backfaceVisibilityFix ( picImg ) ;
}
}
pf . setIntrinsicSize ( picImg , bestCandidate ) ;
}
} ;
pf . ascendingSort = function ( a , b ) {
return a . resolution - b . resolution ;
} ;
/ * *
* In IE9 , < source > elements get removed if they aren ' t children of
* video elements . Thus , we conditionally wrap source elements
* using <!-- [ if IE 9 ] > < video style = "display: none;" > < ! [ endif ] -- >
* and must account for that here by moving those source elements
* back into the picture element .
* /
pf . removeVideoShim = function ( picture ) {
var videos = picture . getElementsByTagName ( "video" ) ;
if ( videos . length ) {
var video = videos [ 0 ] ,
vsources = video . getElementsByTagName ( "source" ) ;
while ( vsources . length ) {
picture . insertBefore ( vsources [ 0 ] , video ) ;
}
// Remove the video element once we're finished removing its children
video . parentNode . removeChild ( video ) ;
}
} ;
/ * *
* Find all ` img ` elements , and add them to the candidate list if they have
* a ` picture ` parent , a ` sizes ` attribute in basic ` srcset ` supporting browsers ,
* a ` srcset ` attribute at all , and they haven ’ t been evaluated already .
* /
pf . getAllElements = function ( ) {
var elems = [ ] ,
imgs = doc . getElementsByTagName ( "img" ) ;
for ( var h = 0 , len = imgs . length ; h < len ; h ++ ) {
var currImg = imgs [ h ] ;
if ( currImg . parentNode . nodeName . toUpperCase ( ) === "PICTURE" ||
( currImg . getAttribute ( "srcset" ) !== null ) || currImg [ pf . ns ] && currImg [ pf . ns ] . srcset !== null ) {
elems . push ( currImg ) ;
}
}
return elems ;
} ;
pf . getMatch = function ( img , picture ) {
var sources = picture . childNodes ,
match ;
// Go through each child, and if they have media queries, evaluate them
for ( var j = 0 , slen = sources . length ; j < slen ; j ++ ) {
var source = sources [ j ] ;
// ignore non-element nodes
if ( source . nodeType !== 1 ) {
continue ;
}
// Hitting the `img` element that started everything stops the search for `sources`.
// If no previous `source` matches, the `img` itself is evaluated later.
if ( source === img ) {
return match ;
}
// ignore non-`source` nodes
if ( source . nodeName . toUpperCase ( ) !== "SOURCE" ) {
continue ;
}
// if it's a source element that has the `src` property set, throw a warning in the console
if ( source . getAttribute ( "src" ) !== null && typeof console !== undefined ) {
console . warn ( "The `src` attribute is invalid on `picture` `source` element; instead, use `srcset`." ) ;
}
var media = source . getAttribute ( "media" ) ;
// if source does not have a srcset attribute, skip
if ( ! source . getAttribute ( "srcset" ) ) {
continue ;
}
// if there's no media specified, OR w.matchMedia is supported
if ( ( ! media || pf . matchesMedia ( media ) ) ) {
var typeSupported = pf . verifyTypeSupport ( source ) ;
if ( typeSupported === true ) {
match = source ;
break ;
} else if ( typeSupported === "pending" ) {
return false ;
}
}
}
return match ;
} ;
function picturefill ( opt ) {
var elements ,
element ,
parent ,
firstMatch ,
candidates ,
options = opt || { } ;
elements = options . elements || pf . getAllElements ( ) ;
// Loop through all elements
for ( var i = 0 , plen = elements . length ; i < plen ; i ++ ) {
element = elements [ i ] ;
parent = element . parentNode ;
firstMatch = undefined ;
candidates = undefined ;
// immediately skip non-`img` nodes
if ( element . nodeName . toUpperCase ( ) !== "IMG" ) {
continue ;
}
// expando for caching data on the img
if ( ! element [ pf . ns ] ) {
element [ pf . ns ] = { } ;
}
// if the element has already been evaluated, skip it unless
// `options.reevaluate` is set to true ( this, for example,
// is set to true when running `picturefill` on `resize` ).
if ( ! options . reevaluate && element [ pf . ns ] . evaluated ) {
continue ;
}
// if `img` is in a `picture` element
if ( parent && parent . nodeName . toUpperCase ( ) === "PICTURE" ) {
// IE9 video workaround
pf . removeVideoShim ( parent ) ;
// return the first match which might undefined
// returns false if there is a pending source
// TODO the return type here is brutal, cleanup
firstMatch = pf . getMatch ( element , parent ) ;
// if any sources are pending in this picture due to async type test(s)
// remove the evaluated attr and skip for now ( the pending test will
// rerun picturefill on this element when complete)
if ( firstMatch === false ) {
continue ;
}
} else {
firstMatch = undefined ;
}
// Cache and remove `srcset` if present and we’ re going to be doing `picture`/`srcset`/`sizes` polyfilling to it.
if ( ( parent && parent . nodeName . toUpperCase ( ) === "PICTURE" ) ||
( ! pf . sizesSupported && ( element . srcset && regWDesc . test ( element . srcset ) ) ) ) {
pf . dodgeSrcset ( element ) ;
}
if ( firstMatch ) {
candidates = pf . processSourceSet ( firstMatch ) ;
pf . applyBestCandidate ( candidates , element ) ;
} else {
// No sources matched, so we’ re down to processing the inner `img` as a source.
candidates = pf . processSourceSet ( element ) ;
if ( element . srcset === undefined || element [ pf . ns ] . srcset ) {
// Either `srcset` is completely unsupported, or we need to polyfill `sizes` functionality.
pf . applyBestCandidate ( candidates , element ) ;
} // Else, resolution-only `srcset` is supported natively.
}
// set evaluated to true to avoid unnecessary reparsing
element [ pf . ns ] . evaluated = true ;
}
}
/ * *
* Sets up picture polyfill by polling the document and running
* the polyfill every 250 ms until the document is ready .
* Also attaches picturefill on resize
* /
function runPicturefill ( ) {
pf . initTypeDetects ( ) ;
picturefill ( ) ;
var intervalId = setInterval ( function ( ) {
// When the document has finished loading, stop checking for new images
// https://github.com/ded/domready/blob/master/ready.js#L15
picturefill ( ) ;
if ( /^loaded|^i|^c/ . test ( doc . readyState ) ) {
clearInterval ( intervalId ) ;
return ;
}
} , 250 ) ;
function checkResize ( ) {
var resizeThrottle ;
if ( ! w . _picturefillWorking ) {
w . _picturefillWorking = true ;
w . clearTimeout ( resizeThrottle ) ;
resizeThrottle = w . setTimeout ( function ( ) {
picturefill ( { reevaluate : true } ) ;
w . _picturefillWorking = false ;
} , 60 ) ;
}
}
if ( w . addEventListener ) {
w . addEventListener ( "resize" , checkResize , false ) ;
} else if ( w . attachEvent ) {
w . attachEvent ( "onresize" , checkResize ) ;
}
}
runPicturefill ( ) ;
/* expose methods for testing */
picturefill . _ = pf ;
expose ( picturefill ) ;
} ) ( window , window . document , new window . Image ( ) ) ;
/*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */
! function ( a , b ) { "object" == typeof module && "object" == typeof module . exports ? module . exports = a . document ? b ( a , ! 0 ) : function ( a ) { if ( ! a . document ) throw new Error ( "jQuery requires a window with a document" ) ; return b ( a ) } : b ( a ) } ( "undefined" != typeof window ? window : this , function ( a , b ) { var c = [ ] , d = a . document , e = c . slice , f = c . concat , g = c . push , h = c . indexOf , i = { } , j = i . toString , k = i . hasOwnProperty , l = { } , m = "2.2.0" , n = function ( a , b ) { return new n . fn . init ( a , b ) } , o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g , p = /^-ms-/ , q = /-([\da-z])/gi , r = function ( a , b ) { return b . toUpperCase ( ) } ; n . fn = n . prototype = { jquery : m , constructor : n , selector : "" , length : 0 , toArray : function ( ) { return e . call ( this ) } , get : function ( a ) { return null != a ? 0 > a ? this [ a + this . length ] : this [ a ] : e . call ( this ) } , pushStack : function ( a ) { var b = n . merge ( this . constructor ( ) , a ) ; return b . prevObject = this , b . context = this . context , b } , each : function ( a ) { return n . each ( this , a ) } , map : function ( a ) { return this . pushStack ( n . map ( this , function ( b , c ) { return a . call ( b , c , b ) } ) ) } , slice : function ( ) { return this . pushStack ( e . apply ( this , arguments ) ) } , first : function ( ) { return this . eq ( 0 ) } , last : function ( ) { return this . eq ( - 1 ) } , eq : function ( a ) { var b = this . length , c = + a + ( 0 > a ? b : 0 ) ; return this . pushStack ( c >= 0 && b > c ? [ this [ c ] ] : [ ] ) } , end : function ( ) { return this . prevObject || this . constructor ( ) } , push : g , sort : c . sort , splice : c . splice } , n . extend = n . fn . extend = function ( ) { var a , b , c , d , e , f , g = arguments [ 0 ] || { } , h = 1 , i = arguments . length , j = ! 1 ; for ( "boolean" == typeof g && ( j = g , g = arguments [ h ] || { } , h ++ ) , "object" == typeof g || n . isFunction ( g ) || ( g = { } ) , h === i && ( g = this , h -- ) ; i > h ; h ++ ) if ( null != ( a = arguments [ h ] ) ) for ( b in a ) c = g [ b ] , d = a [ b ] , g !== d && ( j && d && ( n . isPlainObject ( d ) || ( e = n . isArray ( d ) ) ) ? ( e ? ( e = ! 1 , f = c && n . isArray ( c ) ? c : [ ] ) : f = c && n . isPlainObject ( c ) ? c : { } , g [ b ] = n . extend ( j , f , d ) ) : void 0 !== d && ( g [ b ] = d ) ) ; return g } , n . extend ( { expando : "jQuery" + ( m + Math . random ( ) ) . replace ( /\D/g , "" ) , isReady : ! 0 , error : function ( a ) { throw new Error ( a ) } , noop : function ( ) { } , isFunction : function ( a ) { return "function" === n . type ( a ) } , isArray : Array . isArray , isWindow : function ( a ) { return null != a && a === a . window } , isNumeric : function ( a ) { var b = a && a . toString ( ) ; return ! n . isArray ( a ) && b - parseFloat ( b ) + 1 >= 0 } , isPlainObject : function ( a ) { return "object" !== n . type ( a ) || a . nodeType || n . isWindow ( a ) ? ! 1 : a . constructor && ! k . call ( a . constructor . prototype , "isPrototypeOf" ) ? ! 1 : ! 0 } , isEmptyObject : function ( a ) { var b ; for ( b in a ) return ! 1 ; return ! 0 } , type : function ( a ) { return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? i [ j . call ( a ) ] || "object" : typeof a } , globalEval : function ( a ) { var b , c = eval ; a = n . trim ( a ) , a && ( 1 === a . indexOf ( "use strict" ) ? ( b = d . createElement ( "script" ) , b . text = a , d . head . appendChild ( b ) . parentNode . removeChild ( b ) ) : c ( a ) ) } , camelCase : function ( a ) { return a . replace ( p , "ms-" ) . replace ( q , r ) } , nodeName : function ( a , b ) { return a . nodeName && a . nodeName . toLowerCase ( ) === b . toLowerCase ( ) } , each : function ( a , b ) { var c , d = 0 ; if ( s ( a ) ) { for ( c = a . length ; c > d ; d ++ ) if ( b . call ( a [ d ] , d , a [ d ] ) === ! 1 ) break } else for ( d in a ) if ( b . call ( a [ d ] , d , a [ d ] ) === ! 1 ) break ; return a } , trim : function ( a ) { return null == a ? "" : ( a + "" ) . replace ( o , "" ) } , makeArray : function ( a , b ) { var c = b || [ ] ; return null != a && ( s ( Object ( a ) ) ? n . merge ( c , "string" == typeof a ? [ a ] : a ) : g . call ( c , a ) ) , c } , inArray : function ( a , b , c ) { return null == b ? - 1 : h . call ( b , a , c ) } , merge : function ( a , b ) { for ( var c = + b . length , d = 0 , e = a . length ; c > d ; d ++ ) a [ e ++ ] = b [ d ] ; return a . length = e , a } , grep : function ( a , b , c ) { for ( var d , e = [ ] , f = 0 , g = a . length , h = ! c ; g > f ; f ++ ) d = ! b ( a [ f ] , f ) , d !== h && e . push ( a [ f ] ) ; return e } , map : function ( a , b , c ) { var d , e , g = 0 , h = [ ] ; if ( s ( a ) ) for ( d = a . length ; d > g ; g ++ ) e = b ( a [ g ] , g , c ) , null != e && h . push ( e ) ; else for ( g in a ) e = b ( a [ g ] , g , c ) , null != e && h . push ( e ) ; return f . apply ( [ ] , h ) } , guid : 1 , proxy : function ( a , b ) { var c , d , f ; return "string" == typeof b && ( c = a [ b ] , b = a , a = c ) , n . isFunction ( a ) ? ( d = e . call ( arguments , 2 ) , f = function ( ) { return a . apply ( b || this , d . concat ( e . call ( arguments ) ) ) } , f . guid = a . guid = a . guid || n . guid ++ , f ) : void 0 } , now : Date . now , support : l } ) , "function" == typeof Symbol && ( n . fn [ Symbol . iterator ] = c [ Symbol . iterator ] ) , n . each ( "Boolean Number String Function Array Date RegExp Object Error Symbol" . split ( " " ) , function ( a , b ) { i [ "[object " + b + "]" ] = b . toLowerCase ( ) } ) ; function s ( a ) { var b = ! ! a && "length" in a && a . length , c = n . type ( a ) ; return "function" === c || n . isWindow ( a ) ? ! 1 : "array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a } var t = funct
} else c = void 0 ; return c } n . extend ( { hasData : function ( a ) { return O . hasData ( a ) || N . hasData ( a ) } , data : function ( a , b , c ) { return O . access ( a , b , c ) } , removeData : function ( a , b ) { O . remove ( a , b ) } , _data : function ( a , b , c ) { return N . access ( a , b , c ) } , _removeData : function ( a , b ) { N . remove ( a , b ) } } ) , n . fn . extend ( { data : function ( a , b ) { var c , d , e , f = this [ 0 ] , g = f && f . attributes ; if ( void 0 === a ) { if ( this . length && ( e = O . get ( f ) , 1 === f . nodeType && ! N . get ( f , "hasDataAttrs" ) ) ) { c = g . length ; while ( c -- ) g [ c ] && ( d = g [ c ] . name , 0 === d . indexOf ( "data-" ) && ( d = n . camelCase ( d . slice ( 5 ) ) , R ( f , d , e [ d ] ) ) ) ; N . set ( f , "hasDataAttrs" , ! 0 ) } return e } return "object" == typeof a ? this . each ( function ( ) { O . set ( this , a ) } ) : K ( this , function ( b ) { var c , d ; if ( f && void 0 === b ) { if ( c = O . get ( f , a ) || O . get ( f , a . replace ( Q , "-$&" ) . toLowerCase ( ) ) , void 0 !== c ) return c ; if ( d = n . camelCase ( a ) , c = O . get ( f , d ) , void 0 !== c ) return c ; if ( c = R ( f , d , void 0 ) , void 0 !== c ) return c } else d = n . camelCase ( a ) , this . each ( function ( ) { var c = O . get ( this , d ) ; O . set ( this , d , b ) , a . indexOf ( "-" ) > - 1 && void 0 !== c && O . set ( this , a , b ) } ) } , null , b , arguments . length > 1 , null , ! 0 ) } , removeData : function ( a ) { return this . each ( function ( ) { O . remove ( this , a ) } ) } } ) , n . extend ( { queue : function ( a , b , c ) { var d ; return a ? ( b = ( b || "fx" ) + "queue" , d = N . get ( a , b ) , c && ( ! d || n . isArray ( c ) ? d = N . access ( a , b , n . makeArray ( c ) ) : d . push ( c ) ) , d || [ ] ) : void 0 } , dequeue : function ( a , b ) { b = b || "fx" ; var c = n . queue ( a , b ) , d = c . length , e = c . shift ( ) , f = n . _queueHooks ( a , b ) , g = function ( ) { n . dequeue ( a , b ) } ; "inprogress" === e && ( e = c . shift ( ) , d -- ) , e && ( "fx" === b && c . unshift ( "inprogress" ) , delete f . stop , e . call ( a , g , f ) ) , ! d && f && f . empty . fire ( ) } , _queueHooks : function ( a , b ) { var c = b + "queueHooks" ; return N . get ( a , c ) || N . access ( a , c , { empty : n . Callbacks ( "once memory" ) . add ( function ( ) { N . remove ( a , [ b + "queue" , c ] ) } ) } ) } } ) , n . fn . extend ( { queue : function ( a , b ) { var c = 2 ; return "string" != typeof a && ( b = a , a = "fx" , c -- ) , arguments . length < c ? n . queue ( this [ 0 ] , a ) : void 0 === b ? this : this . each ( function ( ) { var c = n . queue ( this , a , b ) ; n . _queueHooks ( this , a ) , "fx" === a && "inprogress" !== c [ 0 ] && n . dequeue ( this , a ) } ) } , dequeue : function ( a ) { return this . each ( function ( ) { n . dequeue ( this , a ) } ) } , clearQueue : function ( a ) { return this . queue ( a || "fx" , [ ] ) } , promise : function ( a , b ) { var c , d = 1 , e = n . Deferred ( ) , f = this , g = this . length , h = function ( ) { -- d || e . resolveWith ( f , [ f ] ) } ; "string" != typeof a && ( b = a , a = void 0 ) , a = a || "fx" ; while ( g -- ) c = N . get ( f [ g ] , a + "queueHooks" ) , c && c . empty && ( d ++ , c . empty . add ( h ) ) ; return h ( ) , e . promise ( b ) } } ) ; var S = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ . source , T = new RegExp ( "^(?:([+-])=|)(" + S + ")([a-z%]*)$" , "i" ) , U = [ "Top" , "Right" , "Bottom" , "Left" ] , V = function ( a , b ) { return a = b || a , "none" === n . css ( a , "display" ) || ! n . contains ( a . ownerDocument , a ) } ; function W ( a , b , c , d ) { var e , f = 1 , g = 20 , h = d ? function ( ) { return d . cur ( ) } : function ( ) { return n . css ( a , b , "" ) } , i = h ( ) , j = c && c [ 3 ] || ( n . cssNumber [ b ] ? "" : "px" ) , k = ( n . cssNumber [ b ] || "px" !== j && + i ) && T . exec ( n . css ( a , b ) ) ; if ( k && k [ 3 ] !== j ) { j = j || k [ 3 ] , c = c || [ ] , k = + i || 1 ; do f = f || ".5" , k /= f , n . style ( a , b , k + j ) ; while ( f !== ( f = h ( ) / i ) && 1 !== f && -- g ) } return c && ( k = + k || + i || 0 , e = c [ 1 ] ? k + ( c [ 1 ] + 1 ) * c [ 2 ] : + c [ 2 ] , d && ( d . unit = j , d . start = k , d . end = e ) ) , e } var X = /^(?:checkbox|radio)$/i , Y = /<([\w:-]+)/ , Z = /^$|\/(?:java|ecma)script/i , $ = { option : [ 1 , "<select multiple='multiple'>" , "</select>" ] , thead : [ 1 , "<table>" , "</table>" ] , col : [ 2 , "<table><colgroup>" , "</colgroup></table>" ] , tr : [ 2 , "<table><tbody>" , "</tbody></table>" ] , td : [ 3 , "<table><tbody><tr>" , "</tr></tbody></table>" ] , _default : [ 0 , "" , "" ] } ; $ . optgroup = $ . option , $ . tbody = $ . tfoot = $ . colgroup = $ . caption = $ . thead , $ . th = $ . td ; function _ ( a , b ) { var c = "undefined" != typeof a . getElementsByTagName ? a . getElementsByTagName ( b || "*" ) : "undefined" != typeof a . querySelectorAll ? a . querySelectorAll ( b || "*" ) : [ ] ; return void 0 === b || b && n . nodeName ( a , b ) ? n . merge ( [ a ] , c ) : c } function aa ( a , b ) { for ( var c = 0 , d = a . length ; d > c ; c ++ ) N . set ( a [ c ] , "globalEval" , ! b || N . get ( b [ c ] , "globalEval" ) ) } var ba = /<|&#?\w+;/ ; function ca ( a , b , c , d , e ) { for ( var f , g , h , i , j , k , l = b . createDocumentFragment ( ) , m = [ ] , o = 0 , p = a . length ; p > o ; o ++ ) if ( f = a [ o ] , f || 0 === f ) if ( "object" === n . type ( f ) ) n . merge ( m , f . nodeType ? [ f ] : f ) ; else if ( ba . test ( f ) ) { g = g || l . appendChild ( b . createElement ( "div" ) ) , h = ( Y . exec ( f ) || [ "" , "" ] ) [ 1 ] . toLowerCase ( ) , i = $ [ h ] || $ . _default , g . innerHTML = i [ 1 ] + n . htmlPrefilter ( f ) + i [ 2 ] , k = i [ 0 ] ; while ( k -- ) g = g . lastChild ; n . merge ( m , g . childNodes ) , g = l . firstChild , g . textContent = "" } else m . push ( b . createTextNode ( f ) ) ; l
} , propHooks : { tabIndex : { get : function ( a ) { var b = n . find . attr ( a , "tabindex" ) ; return b ? parseInt ( b , 10 ) : cb . test ( a . nodeName ) || db . test ( a . nodeName ) && a . href ? 0 : - 1 } } } , propFix : { "for" : "htmlFor" , "class" : "className" } } ) , l . optSelected || ( n . propHooks . selected = { get : function ( a ) { var b = a . parentNode ; return b && b . parentNode && b . parentNode . selectedIndex , null } } ) , n . each ( [ "tabIndex" , "readOnly" , "maxLength" , "cellSpacing" , "cellPadding" , "rowSpan" , "colSpan" , "useMap" , "frameBorder" , "contentEditable" ] , function ( ) { n . propFix [ this . toLowerCase ( ) ] = this } ) ; var eb = /[\t\r\n\f]/g ; function fb ( a ) { return a . getAttribute && a . getAttribute ( "class" ) || "" } n . fn . extend ( { addClass : function ( a ) { var b , c , d , e , f , g , h , i = 0 ; if ( n . isFunction ( a ) ) return this . each ( function ( b ) { n ( this ) . addClass ( a . call ( this , b , fb ( this ) ) ) } ) ; if ( "string" == typeof a && a ) { b = a . match ( G ) || [ ] ; while ( c = this [ i ++ ] ) if ( e = fb ( c ) , d = 1 === c . nodeType && ( " " + e + " " ) . replace ( eb , " " ) ) { g = 0 ; while ( f = b [ g ++ ] ) d . indexOf ( " " + f + " " ) < 0 && ( d += f + " " ) ; h = n . trim ( d ) , e !== h && c . setAttribute ( "class" , h ) } } return this } , removeClass : function ( a ) { var b , c , d , e , f , g , h , i = 0 ; if ( n . isFunction ( a ) ) return this . each ( function ( b ) { n ( this ) . removeClass ( a . call ( this , b , fb ( this ) ) ) } ) ; if ( ! arguments . length ) return this . attr ( "class" , "" ) ; if ( "string" == typeof a && a ) { b = a . match ( G ) || [ ] ; while ( c = this [ i ++ ] ) if ( e = fb ( c ) , d = 1 === c . nodeType && ( " " + e + " " ) . replace ( eb , " " ) ) { g = 0 ; while ( f = b [ g ++ ] ) while ( d . indexOf ( " " + f + " " ) > - 1 ) d = d . replace ( " " + f + " " , " " ) ; h = n . trim ( d ) , e !== h && c . setAttribute ( "class" , h ) } } return this } , toggleClass : function ( a , b ) { var c = typeof a ; return "boolean" == typeof b && "string" === c ? b ? this . addClass ( a ) : this . removeClass ( a ) : n . isFunction ( a ) ? this . each ( function ( c ) { n ( this ) . toggleClass ( a . call ( this , c , fb ( this ) , b ) , b ) } ) : this . each ( function ( ) { var b , d , e , f ; if ( "string" === c ) { d = 0 , e = n ( this ) , f = a . match ( G ) || [ ] ; while ( b = f [ d ++ ] ) e . hasClass ( b ) ? e . removeClass ( b ) : e . addClass ( b ) } else ( void 0 === a || "boolean" === c ) && ( b = fb ( this ) , b && N . set ( this , "__className__" , b ) , this . setAttribute && this . setAttribute ( "class" , b || a === ! 1 ? "" : N . get ( this , "__className__" ) || "" ) ) } ) } , hasClass : function ( a ) { var b , c , d = 0 ; b = " " + a + " " ; while ( c = this [ d ++ ] ) if ( 1 === c . nodeType && ( " " + fb ( c ) + " " ) . replace ( eb , " " ) . indexOf ( b ) > - 1 ) return ! 0 ; return ! 1 } } ) ; var gb = /\r/g ; n . fn . extend ( { val : function ( a ) { var b , c , d , e = this [ 0 ] ; { if ( arguments . length ) return d = n . isFunction ( a ) , this . each ( function ( c ) { var e ; 1 === this . nodeType && ( e = d ? a . call ( this , c , n ( this ) . val ( ) ) : a , null == e ? e = "" : "number" == typeof e ? e += "" : n . isArray ( e ) && ( e = n . map ( e , function ( a ) { return null == a ? "" : a + "" } ) ) , b = n . valHooks [ this . type ] || n . valHooks [ this . nodeName . toLowerCase ( ) ] , b && "set" in b && void 0 !== b . set ( this , e , "value" ) || ( this . value = e ) ) } ) ; if ( e ) return b = n . valHooks [ e . type ] || n . valHooks [ e . nodeName . toLowerCase ( ) ] , b && "get" in b && void 0 !== ( c = b . get ( e , "value" ) ) ? c : ( c = e . value , "string" == typeof c ? c . replace ( gb , "" ) : null == c ? "" : c ) } } } ) , n . extend ( { valHooks : { option : { get : function ( a ) { return n . trim ( a . value ) } } , select : { get : function ( a ) { for ( var b , c , d = a . options , e = a . selectedIndex , f = "select-one" === a . type || 0 > e , g = f ? null : [ ] , h = f ? e + 1 : d . length , i = 0 > e ? h : f ? e : 0 ; h > i ; i ++ ) if ( c = d [ i ] , ( c . selected || i === e ) && ( l . optDisabled ? ! c . disabled : null === c . getAttribute ( "disabled" ) ) && ( ! c . parentNode . disabled || ! n . nodeName ( c . parentNode , "optgroup" ) ) ) { if ( b = n ( c ) . val ( ) , f ) return b ; g . push ( b ) } return g } , set : function ( a , b ) { var c , d , e = a . options , f = n . makeArray ( b ) , g = e . length ; while ( g -- ) d = e [ g ] , ( d . selected = n . inArray ( n . valHooks . option . get ( d ) , f ) > - 1 ) && ( c = ! 0 ) ; return c || ( a . selectedIndex = - 1 ) , f } } } } ) , n . each ( [ "radio" , "checkbox" ] , function ( ) { n . valHooks [ this ] = { set : function ( a , b ) { return n . isArray ( b ) ? a . checked = n . inArray ( n ( a ) . val ( ) , b ) > - 1 : void 0 } } , l . checkOn || ( n . valHooks [ this ] . get = function ( a ) { return null === a . getAttribute ( "value" ) ? "on" : a . value } ) } ) ; var hb = /^(?:focusinfocus|focusoutblur)$/ ; n . extend ( n . event , { trigger : function ( b , c , e , f ) { var g , h , i , j , l , m , o , p = [ e || d ] , q = k . call ( b , "type" ) ? b . type : b , r = k . call ( b , "namespace" ) ? b . namespace . split ( "." ) : [ ] ; if ( h = i = e = e || d , 3 !== e . nodeType && 8 !== e . nodeType && ! hb . test ( q + n . event . triggered ) && ( q . indexOf ( "." ) > - 1 && ( r = q . split ( "." ) , q = r . shift ( ) , r . sort ( ) ) , l = q . indexOf ( ":" ) < 0 && "on" + q , b = b [ n . expando ] ? b : new n . Event ( q , "object" == typeof b && b ) , b . isTrigger = f ? 2 : 3 , b . namespace = r . join ( "." ) , b . rnamespace = b . namespace ? new RegExp ( "(^|\\.)" + r . join ( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null , b . result = void 0 , b .
/ *
* Foundation Responsive Library
* http : //foundation.zurb.com
* Copyright 2014 , ZURB
* Free to use under the MIT license .
* http : //www.opensource.org/licenses/mit-license.php
* /
( function ( $ , window , document , undefined ) {
'use strict' ;
var header _helpers = function ( class _array ) {
var i = class _array . length ;
var head = $ ( 'head' ) ;
while ( i -- ) {
if ( head . has ( '.' + class _array [ i ] ) . length === 0 ) {
head . append ( '<meta class="' + class _array [ i ] + '" />' ) ;
}
}
} ;
header _helpers ( [
'foundation-mq-small' ,
'foundation-mq-small-only' ,
'foundation-mq-medium' ,
'foundation-mq-medium-only' ,
'foundation-mq-large' ,
'foundation-mq-large-only' ,
'foundation-mq-xlarge' ,
'foundation-mq-xlarge-only' ,
'foundation-mq-xxlarge' ,
'foundation-data-attribute-namespace' ] ) ;
// Enable FastClick if present
$ ( function ( ) {
if ( typeof FastClick !== 'undefined' ) {
// Don't attach to body if undefined
if ( typeof document . body !== 'undefined' ) {
FastClick . attach ( document . body ) ;
}
}
} ) ;
// private Fast Selector wrapper,
// returns jQuery object. Only use where
// getElementById is not available.
var S = function ( selector , context ) {
if ( typeof selector === 'string' ) {
if ( context ) {
var cont ;
if ( context . jquery ) {
cont = context [ 0 ] ;
if ( ! cont ) {
return context ;
}
} else {
cont = context ;
}
return $ ( cont . querySelectorAll ( selector ) ) ;
}
return $ ( document . querySelectorAll ( selector ) ) ;
}
return $ ( selector , context ) ;
} ;
// Namespace functions.
var attr _name = function ( init ) {
var arr = [ ] ;
if ( ! init ) {
arr . push ( 'data' ) ;
}
if ( this . namespace . length > 0 ) {
arr . push ( this . namespace ) ;
}
arr . push ( this . name ) ;
return arr . join ( '-' ) ;
} ;
var add _namespace = function ( str ) {
var parts = str . split ( '-' ) ,
i = parts . length ,
arr = [ ] ;
while ( i -- ) {
if ( i !== 0 ) {
arr . push ( parts [ i ] ) ;
} else {
if ( this . namespace . length > 0 ) {
arr . push ( this . namespace , parts [ i ] ) ;
} else {
arr . push ( parts [ i ] ) ;
}
}
}
return arr . reverse ( ) . join ( '-' ) ;
} ;
// Event binding and data-options updating.
var bindings = function ( method , options ) {
var self = this ,
bind = function ( ) {
var $this = S ( this ) ,
should _bind _events = ! $this . data ( self . attr _name ( true ) + '-init' ) ;
$this . data ( self . attr _name ( true ) + '-init' , $ . extend ( { } , self . settings , ( options || method ) , self . data _options ( $this ) ) ) ;
if ( should _bind _events ) {
self . events ( this ) ;
}
} ;
if ( S ( this . scope ) . is ( '[' + this . attr _name ( ) + ']' ) ) {
bind . call ( this . scope ) ;
} else {
S ( '[' + this . attr _name ( ) + ']' , this . scope ) . each ( bind ) ;
}
// # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating.
if ( typeof method === 'string' ) {
return this [ method ] . call ( this , options ) ;
}
} ;
var single _image _loaded = function ( image , callback ) {
function loaded ( ) {
callback ( image [ 0 ] ) ;
}
function bindLoad ( ) {
this . one ( 'load' , loaded ) ;
if ( /MSIE (\d+\.\d+);/ . test ( navigator . userAgent ) ) {
var src = this . attr ( 'src' ) ,
param = src . match ( /\?/ ) ? '&' : '?' ;
param += 'random=' + ( new Date ( ) ) . getTime ( ) ;
this . attr ( 'src' , src + param ) ;
}
}
if ( ! image . attr ( 'src' ) ) {
loaded ( ) ;
return ;
}
if ( image [ 0 ] . complete || image [ 0 ] . readyState === 4 ) {
loaded ( ) ;
} else {
bindLoad . call ( image ) ;
}
} ;
/ *
https : //github.com/paulirish/matchMedia.js
* /
window . matchMedia = window . matchMedia || ( function ( doc ) {
'use strict' ;
var bool ,
docElem = doc . documentElement ,
refNode = docElem . firstElementChild || docElem . firstChild ,
// fakeBody required for <FF4 when executed in <head>
fakeBody = doc . createElement ( 'body' ) ,
div = doc . createElement ( 'div' ) ;
div . id = 'mq-test-1' ;
div . style . cssText = 'position:absolute;top:-100em' ;
fakeBody . style . background = 'none' ;
fakeBody . appendChild ( div ) ;
return function ( q ) {
div . innerHTML = '­<style media="' + q + '"> #mq-test-1 { width: 42px; }</style>' ;
docElem . insertBefore ( fakeBody , refNode ) ;
bool = div . offsetWidth === 42 ;
docElem . removeChild ( fakeBody ) ;
return {
matches : bool ,
media : q
} ;
} ;
} ( document ) ) ;
/ *
* jquery . requestAnimationFrame
* https : //github.com/gnarf37/jquery-requestAnimationFrame
* Requires jQuery 1.8 +
*
* Copyright ( c ) 2012 Corey Frang
* Licensed under the MIT license .
* /
( function ( jQuery ) {
// requestAnimationFrame polyfill adapted from Erik Möller
// fixes from Paul Irish and Tino Zijdel
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
var animating ,
lastTime = 0 ,
vendors = [ 'webkit' , 'moz' ] ,
requestAnimationFrame = window . requestAnimationFrame ,
cancelAnimationFrame = window . cancelAnimationFrame ,
jqueryFxAvailable = 'undefined' !== typeof jQuery . fx ;
for ( ; lastTime < vendors . length && ! requestAnimationFrame ; lastTime ++ ) {
requestAnimationFrame = window [ vendors [ lastTime ] + 'RequestAnimationFrame' ] ;
cancelAnimationFrame = cancelAnimationFrame ||
window [ vendors [ lastTime ] + 'CancelAnimationFrame' ] ||
window [ vendors [ lastTime ] + 'CancelRequestAnimationFrame' ] ;
}
function raf ( ) {
if ( animating ) {
requestAnimationFrame ( raf ) ;
if ( jqueryFxAvailable ) {
jQuery . fx . tick ( ) ;
}
}
}
if ( requestAnimationFrame ) {
// use rAF
window . requestAnimationFrame = requestAnimationFrame ;
window . cancelAnimationFrame = cancelAnimationFrame ;
if ( jqueryFxAvailable ) {
jQuery . fx . timer = function ( timer ) {
if ( timer ( ) && jQuery . timers . push ( timer ) && ! animating ) {
animating = true ;
raf ( ) ;
}
} ;
jQuery . fx . stop = function ( ) {
animating = false ;
} ;
}
} else {
// polyfill
window . requestAnimationFrame = function ( callback ) {
var currTime = new Date ( ) . getTime ( ) ,
timeToCall = Math . max ( 0 , 16 - ( currTime - lastTime ) ) ,
id = window . setTimeout ( function ( ) {
callback ( currTime + timeToCall ) ;
} , timeToCall ) ;
lastTime = currTime + timeToCall ;
return id ;
} ;
window . cancelAnimationFrame = function ( id ) {
clearTimeout ( id ) ;
} ;
}
} ( $ ) ) ;
function removeQuotes ( string ) {
if ( typeof string === 'string' || string instanceof String ) {
string = string . replace ( /^['\\/"]+|(;\s?})+|['\\/"]+$/g , '' ) ;
}
return string ;
}
window . Foundation = {
name : 'Foundation' ,
version : '5.5.1' ,
media _queries : {
'small' : S ( '.foundation-mq-small' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'small-only' : S ( '.foundation-mq-small-only' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'medium' : S ( '.foundation-mq-medium' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'medium-only' : S ( '.foundation-mq-medium-only' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'large' : S ( '.foundation-mq-large' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'large-only' : S ( '.foundation-mq-large-only' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'xlarge' : S ( '.foundation-mq-xlarge' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'xlarge-only' : S ( '.foundation-mq-xlarge-only' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' ) ,
'xxlarge' : S ( '.foundation-mq-xxlarge' ) . css ( 'font-family' ) . replace ( /^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g , '' )
} ,
stylesheet : $ ( '<style></style>' ) . appendTo ( 'head' ) [ 0 ] . sheet ,
global : {
namespace : undefined
} ,
init : function ( scope , libraries , method , options , response ) {
var args = [ scope , method , options , response ] ,
responses = [ ] ;
// check RTL
this . rtl = /rtl/i . test ( S ( 'html' ) . attr ( 'dir' ) ) ;
// set foundation global scope
this . scope = scope || this . scope ;
this . set _namespace ( ) ;
if ( libraries && typeof libraries === 'string' && ! /reflow/i . test ( libraries ) ) {
if ( this . libs . hasOwnProperty ( libraries ) ) {
responses . push ( this . init _lib ( libraries , args ) ) ;
}
} else {
for ( var lib in this . libs ) {
responses . push ( this . init _lib ( lib , libraries ) ) ;
}
}
S ( window ) . load ( function ( ) {
S ( window )
. trigger ( 'resize.fndtn.clearing' )
. trigger ( 'resize.fndtn.dropdown' )
. trigger ( 'resize.fndtn.equalizer' )
. trigger ( 'resize.fndtn.interchange' )
. trigger ( 'resize.fndtn.joyride' )
. trigger ( 'resize.fndtn.magellan' )
. trigger ( 'resize.fndtn.topbar' )
. trigger ( 'resize.fndtn.slider' ) ;
} ) ;
return scope ;
} ,
init _lib : function ( lib , args ) {
if ( this . libs . hasOwnProperty ( lib ) ) {
this . patch ( this . libs [ lib ] ) ;
if ( args && args . hasOwnProperty ( lib ) ) {
if ( typeof this . libs [ lib ] . settings !== 'undefined' ) {
$ . extend ( true , this . libs [ lib ] . settings , args [ lib ] ) ;
} else if ( typeof this . libs [ lib ] . defaults !== 'undefined' ) {
$ . extend ( true , this . libs [ lib ] . defaults , args [ lib ] ) ;
}
return this . libs [ lib ] . init . apply ( this . libs [ lib ] , [ this . scope , args [ lib ] ] ) ;
}
args = args instanceof Array ? args : new Array ( args ) ;
return this . libs [ lib ] . init . apply ( this . libs [ lib ] , args ) ;
}
return function ( ) { } ;
} ,
patch : function ( lib ) {
lib . scope = this . scope ;
lib . namespace = this . global . namespace ;
lib . rtl = this . rtl ;
lib [ 'data_options' ] = this . utils . data _options ;
lib [ 'attr_name' ] = attr _name ;
lib [ 'add_namespace' ] = add _namespace ;
lib [ 'bindings' ] = bindings ;
lib [ 'S' ] = this . utils . S ;
} ,
inherit : function ( scope , methods ) {
var methods _arr = methods . split ( ' ' ) ,
i = methods _arr . length ;
while ( i -- ) {
if ( this . utils . hasOwnProperty ( methods _arr [ i ] ) ) {
scope [ methods _arr [ i ] ] = this . utils [ methods _arr [ i ] ] ;
}
}
} ,
set _namespace : function ( ) {
// Description:
// Don't bother reading the namespace out of the meta tag
// if the namespace has been set globally in javascript
//
// Example:
// Foundation.global.namespace = 'my-namespace';
// or make it an empty string:
// Foundation.global.namespace = '';
//
//
// If the namespace has not been set (is undefined), try to read it out of the meta element.
// Otherwise use the globally defined namespace, even if it's empty ('')
var namespace = ( this . global . namespace === undefined ) ? $ ( '.foundation-data-attribute-namespace' ) . css ( 'font-family' ) : this . global . namespace ;
// Finally, if the namsepace is either undefined or false, set it to an empty string.
// Otherwise use the namespace value.
this . global . namespace = ( namespace === undefined || /false/i . test ( namespace ) ) ? '' : namespace ;
} ,
libs : { } ,
// methods that can be inherited in libraries
utils : {
// Description:
// Fast Selector wrapper returns jQuery object. Only use where getElementById
// is not available.
//
// Arguments:
// Selector (String): CSS selector describing the element(s) to be
// returned as a jQuery object.
//
// Scope (String): CSS selector describing the area to be searched. Default
// is document.
//
// Returns:
// Element (jQuery Object): jQuery object containing elements matching the
// selector within the scope.
S : S ,
// Description:
// Executes a function a max of once every n milliseconds
//
// Arguments:
// Func (Function): Function to be throttled.
//
// Delay (Integer): Function execution threshold in milliseconds.
//
// Returns:
// Lazy_function (Function): Function with throttling applied.
throttle : function ( func , delay ) {
var timer = null ;
return function ( ) {
var context = this , args = arguments ;
if ( timer == null ) {
timer = setTimeout ( function ( ) {
func . apply ( context , args ) ;
timer = null ;
} , delay ) ;
}
} ;
} ,
// Description:
// Executes a function when it stops being invoked for n seconds
// Modified version of _.debounce() http://underscorejs.org
//
// Arguments:
// Func (Function): Function to be debounced.
//
// Delay (Integer): Function execution threshold in milliseconds.
//
// Immediate (Bool): Whether the function should be called at the beginning
// of the delay instead of the end. Default is false.
//
// Returns:
// Lazy_function (Function): Function with debouncing applied.
debounce : function ( func , delay , immediate ) {
var timeout , result ;
return function ( ) {
var context = this , args = arguments ;
var later = function ( ) {
timeout = null ;
if ( ! immediate ) {
result = func . apply ( context , args ) ;
}
} ;
var callNow = immediate && ! timeout ;
clearTimeout ( timeout ) ;
timeout = setTimeout ( later , delay ) ;
if ( callNow ) {
result = func . apply ( context , args ) ;
}
return result ;
} ;
} ,
// Description:
// Parses data-options attribute
//
// Arguments:
// El (jQuery Object): Element to be parsed.
//
// Returns:
// Options (Javascript Object): Contents of the element's data-options
// attribute.
data _options : function ( el , data _attr _name ) {
data _attr _name = data _attr _name || 'options' ;
var opts = { } , ii , p , opts _arr ,
data _options = function ( el ) {
var namespace = Foundation . global . namespace ;
if ( namespace . length > 0 ) {
return el . data ( namespace + '-' + data _attr _name ) ;
}
return el . data ( data _attr _name ) ;
} ;
var cached _options = data _options ( el ) ;
if ( typeof cached _options === 'object' ) {
return cached _options ;
}
opts _arr = ( cached _options || ':' ) . split ( ';' ) ;
ii = opts _arr . length ;
function isNumber ( o ) {
return ! isNaN ( o - 0 ) && o !== null && o !== '' && o !== false && o !== true ;
}
function trim ( str ) {
if ( typeof str === 'string' ) {
return $ . trim ( str ) ;
}
return str ;
}
while ( ii -- ) {
p = opts _arr [ ii ] . split ( ':' ) ;
p = [ p [ 0 ] , p . slice ( 1 ) . join ( ':' ) ] ;
if ( /true/i . test ( p [ 1 ] ) ) {
p [ 1 ] = true ;
}
if ( /false/i . test ( p [ 1 ] ) ) {
p [ 1 ] = false ;
}
if ( isNumber ( p [ 1 ] ) ) {
if ( p [ 1 ] . indexOf ( '.' ) === - 1 ) {
p [ 1 ] = parseInt ( p [ 1 ] , 10 ) ;
} else {
p [ 1 ] = parseFloat ( p [ 1 ] ) ;
}
}
if ( p . length === 2 && p [ 0 ] . length > 0 ) {
opts [ trim ( p [ 0 ] ) ] = trim ( p [ 1 ] ) ;
}
}
return opts ;
} ,
// Description:
// Adds JS-recognizable media queries
//
// Arguments:
// Media (String): Key string for the media query to be stored as in
// Foundation.media_queries
//
// Class (String): Class name for the generated <meta> tag
register _media : function ( media , media _class ) {
if ( Foundation . media _queries [ media ] === undefined ) {
$ ( 'head' ) . append ( '<meta class="' + media _class + '"/>' ) ;
Foundation . media _queries [ media ] = removeQuotes ( $ ( '.' + media _class ) . css ( 'font-family' ) ) ;
}
} ,
// Description:
// Add custom CSS within a JS-defined media query
//
// Arguments:
// Rule (String): CSS rule to be appended to the document.
//
// Media (String): Optional media query string for the CSS rule to be
// nested under.
add _custom _rule : function ( rule , media ) {
if ( media === undefined && Foundation . stylesheet ) {
Foundation . stylesheet . insertRule ( rule , Foundation . stylesheet . cssRules . length ) ;
} else {
var query = Foundation . media _queries [ media ] ;
if ( query !== undefined ) {
Foundation . stylesheet . insertRule ( '@media ' +
Foundation . media _queries [ media ] + '{ ' + rule + ' }' ) ;
}
}
} ,
// Description:
// Performs a callback function when an image is fully loaded
//
// Arguments:
// Image (jQuery Object): Image(s) to check if loaded.
//
// Callback (Function): Function to execute when image is fully loaded.
image _loaded : function ( images , callback ) {
var self = this ,
unloaded = images . length ;
if ( unloaded === 0 ) {
callback ( images ) ;
}
images . each ( function ( ) {
single _image _loaded ( self . S ( this ) , function ( ) {
unloaded -= 1 ;
if ( unloaded === 0 ) {
callback ( images ) ;
}
} ) ;
} ) ;
} ,
// Description:
// Returns a random, alphanumeric string
//
// Arguments:
// Length (Integer): Length of string to be generated. Defaults to random
// integer.
//
// Returns:
// Rand (String): Pseudo-random, alphanumeric string.
random _str : function ( ) {
if ( ! this . fidx ) {
this . fidx = 0 ;
}
this . prefix = this . prefix || [ ( this . name || 'F' ) , ( + new Date ) . toString ( 36 ) ] . join ( '-' ) ;
return this . prefix + ( this . fidx ++ ) . toString ( 36 ) ;
} ,
// Description:
// Helper for window.matchMedia
//
// Arguments:
// mq (String): Media query
//
// Returns:
// (Boolean): Whether the media query passes or not
match : function ( mq ) {
return window . matchMedia ( mq ) . matches ;
} ,
// Description:
// Helpers for checking Foundation default media queries with JS
//
// Returns:
// (Boolean): Whether the media query passes or not
is _small _up : function ( ) {
return this . match ( Foundation . media _queries . small ) ;
} ,
is _medium _up : function ( ) {
return this . match ( Foundation . media _queries . medium ) ;
} ,
is _large _up : function ( ) {
return this . match ( Foundation . media _queries . large ) ;
} ,
is _xlarge _up : function ( ) {
return this . match ( Foundation . media _queries . xlarge ) ;
} ,
is _xxlarge _up : function ( ) {
return this . match ( Foundation . media _queries . xxlarge ) ;
} ,
is _small _only : function ( ) {
return ! this . is _medium _up ( ) && ! this . is _large _up ( ) && ! this . is _xlarge _up ( ) && ! this . is _xxlarge _up ( ) ;
} ,
is _medium _only : function ( ) {
return this . is _medium _up ( ) && ! this . is _large _up ( ) && ! this . is _xlarge _up ( ) && ! this . is _xxlarge _up ( ) ;
} ,
is _large _only : function ( ) {
return this . is _medium _up ( ) && this . is _large _up ( ) && ! this . is _xlarge _up ( ) && ! this . is _xxlarge _up ( ) ;
} ,
is _xlarge _only : function ( ) {
return this . is _medium _up ( ) && this . is _large _up ( ) && this . is _xlarge _up ( ) && ! this . is _xxlarge _up ( ) ;
} ,
is _xxlarge _only : function ( ) {
return this . is _medium _up ( ) && this . is _large _up ( ) && this . is _xlarge _up ( ) && this . is _xxlarge _up ( ) ;
}
}
} ;
$ . fn . foundation = function ( ) {
var args = Array . prototype . slice . call ( arguments , 0 ) ;
return this . each ( function ( ) {
Foundation . init . apply ( Foundation , [ this ] . concat ( args ) ) ;
return this ;
} ) ;
} ;
} ( jQuery , window , window . document ) ) ;
; ( function ( $ , window , document , undefined ) {
'use strict' ;
Foundation . libs . topbar = {
name : 'topbar' ,
version : '5.5.1' ,
settings : {
index : 0 ,
sticky _class : 'sticky' ,
custom _back _text : true ,
back _text : 'Back' ,
mobile _show _parent _link : true ,
is _hover : true ,
scrolltop : true , // jump to top when sticky nav menu toggle is clicked
sticky _on : 'all'
} ,
init : function ( section , method , options ) {
Foundation . inherit ( this , 'add_custom_rule register_media throttle' ) ;
var self = this ;
self . register _media ( 'topbar' , 'foundation-mq-topbar' ) ;
this . bindings ( method , options ) ;
self . S ( '[' + this . attr _name ( ) + ']' , this . scope ) . each ( function ( ) {
var topbar = $ ( this ) ,
settings = topbar . data ( self . attr _name ( true ) + '-init' ) ,
section = self . S ( 'section, .top-bar-section' , this ) ;
topbar . data ( 'index' , 0 ) ;
var topbarContainer = topbar . parent ( ) ;
if ( topbarContainer . hasClass ( 'fixed' ) || self . is _sticky ( topbar , topbarContainer , settings ) ) {
self . settings . sticky _class = settings . sticky _class ;
self . settings . sticky _topbar = topbar ;
topbar . data ( 'height' , topbarContainer . outerHeight ( ) ) ;
topbar . data ( 'stickyoffset' , topbarContainer . offset ( ) . top ) ;
} else {
topbar . data ( 'height' , topbar . outerHeight ( ) ) ;
}
if ( ! settings . assembled ) {
self . assemble ( topbar ) ;
}
if ( settings . is _hover ) {
self . S ( '.has-dropdown' , topbar ) . addClass ( 'not-click' ) ;
} else {
self . S ( '.has-dropdown' , topbar ) . removeClass ( 'not-click' ) ;
}
// Pad body when sticky (scrolled) or fixed.
self . add _custom _rule ( '.f-topbar-fixed { padding-top: ' + topbar . data ( 'height' ) + 'px }' ) ;
if ( topbarContainer . hasClass ( 'fixed' ) ) {
self . S ( 'body' ) . addClass ( 'f-topbar-fixed' ) ;
}
} ) ;
} ,
is _sticky : function ( topbar , topbarContainer , settings ) {
var sticky = topbarContainer . hasClass ( settings . sticky _class ) ;
var smallMatch = matchMedia ( Foundation . media _queries . small ) . matches ;
var medMatch = matchMedia ( Foundation . media _queries . medium ) . matches ;
var lrgMatch = matchMedia ( Foundation . media _queries . large ) . matches ;
if ( sticky && settings . sticky _on === 'all' ) {
return true ;
}
if ( sticky && this . small ( ) && settings . sticky _on . indexOf ( 'small' ) !== - 1 ) {
if ( smallMatch && ! medMatch && ! lrgMatch ) { return true ; }
}
if ( sticky && this . medium ( ) && settings . sticky _on . indexOf ( 'medium' ) !== - 1 ) {
if ( smallMatch && medMatch && ! lrgMatch ) { return true ; }
}
if ( sticky && this . large ( ) && settings . sticky _on . indexOf ( 'large' ) !== - 1 ) {
if ( smallMatch && medMatch && lrgMatch ) { return true ; }
}
// fix for iOS browsers
if ( sticky && navigator . userAgent . match ( /(iPad|iPhone|iPod)/g ) ) {
return true ;
}
return false ;
} ,
toggle : function ( toggleEl ) {
var self = this ,
topbar ;
if ( toggleEl ) {
topbar = self . S ( toggleEl ) . closest ( '[' + this . attr _name ( ) + ']' ) ;
} else {
topbar = self . S ( '[' + this . attr _name ( ) + ']' ) ;
}
var settings = topbar . data ( this . attr _name ( true ) + '-init' ) ;
var section = self . S ( 'section, .top-bar-section' , topbar ) ;
if ( self . breakpoint ( ) ) {
if ( ! self . rtl ) {
section . css ( { left : '0%' } ) ;
$ ( '>.name' , section ) . css ( { left : '100%' } ) ;
} else {
section . css ( { right : '0%' } ) ;
$ ( '>.name' , section ) . css ( { right : '100%' } ) ;
}
self . S ( 'li.moved' , section ) . removeClass ( 'moved' ) ;
topbar . data ( 'index' , 0 ) ;
topbar
. toggleClass ( 'expanded' )
. css ( 'height' , '' ) ;
}
if ( settings . scrolltop ) {
if ( ! topbar . hasClass ( 'expanded' ) ) {
if ( topbar . hasClass ( 'fixed' ) ) {
topbar . parent ( ) . addClass ( 'fixed' ) ;
topbar . removeClass ( 'fixed' ) ;
self . S ( 'body' ) . addClass ( 'f-topbar-fixed' ) ;
}
} else if ( topbar . parent ( ) . hasClass ( 'fixed' ) ) {
if ( settings . scrolltop ) {
topbar . parent ( ) . removeClass ( 'fixed' ) ;
topbar . addClass ( 'fixed' ) ;
self . S ( 'body' ) . removeClass ( 'f-topbar-fixed' ) ;
window . scrollTo ( 0 , 0 ) ;
} else {
topbar . parent ( ) . removeClass ( 'expanded' ) ;
}
}
} else {
if ( self . is _sticky ( topbar , topbar . parent ( ) , settings ) ) {
topbar . parent ( ) . addClass ( 'fixed' ) ;
}
if ( topbar . parent ( ) . hasClass ( 'fixed' ) ) {
if ( ! topbar . hasClass ( 'expanded' ) ) {
topbar . removeClass ( 'fixed' ) ;
topbar . parent ( ) . removeClass ( 'expanded' ) ;
self . update _sticky _positioning ( ) ;
} else {
topbar . addClass ( 'fixed' ) ;
topbar . parent ( ) . addClass ( 'expanded' ) ;
self . S ( 'body' ) . addClass ( 'f-topbar-fixed' ) ;
}
}
}
} ,
timer : null ,
events : function ( bar ) {
var self = this ,
S = this . S ;
S ( this . scope )
. off ( '.topbar' )
. on ( 'click.fndtn.topbar' , '[' + this . attr _name ( ) + '] .toggle-topbar' , function ( e ) {
e . preventDefault ( ) ;
self . toggle ( this ) ;
} )
. on ( 'click.fndtn.topbar' , '.top-bar .top-bar-section li a[href^="#"],[' + this . attr _name ( ) + '] .top-bar-section li a[href^="#"]' , function ( e ) {
var li = $ ( this ) . closest ( 'li' ) ;
if ( self . breakpoint ( ) && ! li . hasClass ( 'back' ) && ! li . hasClass ( 'has-dropdown' ) ) {
self . toggle ( ) ;
}
} )
. on ( 'click.fndtn.topbar' , '[' + this . attr _name ( ) + '] li.has-dropdown' , function ( e ) {
var li = S ( this ) ,
target = S ( e . target ) ,
topbar = li . closest ( '[' + self . attr _name ( ) + ']' ) ,
settings = topbar . data ( self . attr _name ( true ) + '-init' ) ;
if ( target . data ( 'revealId' ) ) {
self . toggle ( ) ;
return ;
}
if ( self . breakpoint ( ) ) {
return ;
}
if ( settings . is _hover && ! Modernizr . touch ) {
return ;
}
e . stopImmediatePropagation ( ) ;
if ( li . hasClass ( 'hover' ) ) {
li
. removeClass ( 'hover' )
. find ( 'li' )
. removeClass ( 'hover' ) ;
li . parents ( 'li.hover' )
. removeClass ( 'hover' ) ;
} else {
li . addClass ( 'hover' ) ;
$ ( li ) . siblings ( ) . removeClass ( 'hover' ) ;
if ( target [ 0 ] . nodeName === 'A' && target . parent ( ) . hasClass ( 'has-dropdown' ) ) {
e . preventDefault ( ) ;
}
}
} )
. on ( 'click.fndtn.topbar' , '[' + this . attr _name ( ) + '] .has-dropdown>a' , function ( e ) {
if ( self . breakpoint ( ) ) {
e . preventDefault ( ) ;
var $this = S ( this ) ,
topbar = $this . closest ( '[' + self . attr _name ( ) + ']' ) ,
section = topbar . find ( 'section, .top-bar-section' ) ,
dropdownHeight = $this . next ( '.dropdown' ) . outerHeight ( ) ,
$selectedLi = $this . closest ( 'li' ) ;
topbar . data ( 'index' , topbar . data ( 'index' ) + 1 ) ;
$selectedLi . addClass ( 'moved' ) ;
if ( ! self . rtl ) {
section . css ( { left : - ( 100 * topbar . data ( 'index' ) ) + '%' } ) ;
section . find ( '>.name' ) . css ( { left : 100 * topbar . data ( 'index' ) + '%' } ) ;
} else {
section . css ( { right : - ( 100 * topbar . data ( 'index' ) ) + '%' } ) ;
section . find ( '>.name' ) . css ( { right : 100 * topbar . data ( 'index' ) + '%' } ) ;
}
topbar . css ( 'height' , $this . siblings ( 'ul' ) . outerHeight ( true ) + topbar . data ( 'height' ) ) ;
}
} ) ;
S ( window ) . off ( '.topbar' ) . on ( 'resize.fndtn.topbar' , self . throttle ( function ( ) {
self . resize . call ( self ) ;
} , 50 ) ) . trigger ( 'resize' ) . trigger ( 'resize.fndtn.topbar' ) . load ( function ( ) {
// Ensure that the offset is calculated after all of the pages resources have loaded
S ( this ) . trigger ( 'resize.fndtn.topbar' ) ;
} ) ;
S ( 'body' ) . off ( '.topbar' ) . on ( 'click.fndtn.topbar' , function ( e ) {
var parent = S ( e . target ) . closest ( 'li' ) . closest ( 'li.hover' ) ;
if ( parent . length > 0 ) {
return ;
}
S ( '[' + self . attr _name ( ) + '] li.hover' ) . removeClass ( 'hover' ) ;
} ) ;
// Go up a level on Click
S ( this . scope ) . on ( 'click.fndtn.topbar' , '[' + this . attr _name ( ) + '] .has-dropdown .back' , function ( e ) {
e . preventDefault ( ) ;
var $this = S ( this ) ,
topbar = $this . closest ( '[' + self . attr _name ( ) + ']' ) ,
section = topbar . find ( 'section, .top-bar-section' ) ,
settings = topbar . data ( self . attr _name ( true ) + '-init' ) ,
$movedLi = $this . closest ( 'li.moved' ) ,
$previousLevelUl = $movedLi . parent ( ) ;
topbar . data ( 'index' , topbar . data ( 'index' ) - 1 ) ;
if ( ! self . rtl ) {
section . css ( { left : - ( 100 * topbar . data ( 'index' ) ) + '%' } ) ;
section . find ( '>.name' ) . css ( { left : 100 * topbar . data ( 'index' ) + '%' } ) ;
} else {
section . css ( { right : - ( 100 * topbar . data ( 'index' ) ) + '%' } ) ;
section . find ( '>.name' ) . css ( { right : 100 * topbar . data ( 'index' ) + '%' } ) ;
}
if ( topbar . data ( 'index' ) === 0 ) {
topbar . css ( 'height' , '' ) ;
} else {
topbar . css ( 'height' , $previousLevelUl . outerHeight ( true ) + topbar . data ( 'height' ) ) ;
}
setTimeout ( function ( ) {
$movedLi . removeClass ( 'moved' ) ;
} , 300 ) ;
} ) ;
// Show dropdown menus when their items are focused
S ( this . scope ) . find ( '.dropdown a' )
. focus ( function ( ) {
$ ( this ) . parents ( '.has-dropdown' ) . addClass ( 'hover' ) ;
} )
. blur ( function ( ) {
$ ( this ) . parents ( '.has-dropdown' ) . removeClass ( 'hover' ) ;
} ) ;
} ,
resize : function ( ) {
var self = this ;
self . S ( '[' + this . attr _name ( ) + ']' ) . each ( function ( ) {
var topbar = self . S ( this ) ,
settings = topbar . data ( self . attr _name ( true ) + '-init' ) ;
var stickyContainer = topbar . parent ( '.' + self . settings . sticky _class ) ;
var stickyOffset ;
if ( ! self . breakpoint ( ) ) {
var doToggle = topbar . hasClass ( 'expanded' ) ;
topbar
. css ( 'height' , '' )
. removeClass ( 'expanded' )
. find ( 'li' )
. removeClass ( 'hover' ) ;
if ( doToggle ) {
self . toggle ( topbar ) ;
}
}
if ( self . is _sticky ( topbar , stickyContainer , settings ) ) {
if ( stickyContainer . hasClass ( 'fixed' ) ) {
// Remove the fixed to allow for correct calculation of the offset.
stickyContainer . removeClass ( 'fixed' ) ;
stickyOffset = stickyContainer . offset ( ) . top ;
if ( self . S ( document . body ) . hasClass ( 'f-topbar-fixed' ) ) {
stickyOffset -= topbar . data ( 'height' ) ;
}
topbar . data ( 'stickyoffset' , stickyOffset ) ;
stickyContainer . addClass ( 'fixed' ) ;
} else {
stickyOffset = stickyContainer . offset ( ) . top ;
topbar . data ( 'stickyoffset' , stickyOffset ) ;
}
}
} ) ;
} ,
breakpoint : function ( ) {
return ! matchMedia ( Foundation . media _queries [ 'topbar' ] ) . matches ;
} ,
small : function ( ) {
return matchMedia ( Foundation . media _queries [ 'small' ] ) . matches ;
} ,
medium : function ( ) {
return matchMedia ( Foundation . media _queries [ 'medium' ] ) . matches ;
} ,
large : function ( ) {
return matchMedia ( Foundation . media _queries [ 'large' ] ) . matches ;
} ,
assemble : function ( topbar ) {
var self = this ,
settings = topbar . data ( this . attr _name ( true ) + '-init' ) ,
section = self . S ( 'section, .top-bar-section' , topbar ) ;
// Pull element out of the DOM for manipulation
section . detach ( ) ;
self . S ( '.has-dropdown>a' , section ) . each ( function ( ) {
var $link = self . S ( this ) ,
$dropdown = $link . siblings ( '.dropdown' ) ,
url = $link . attr ( 'href' ) ,
$titleLi ;
if ( ! $dropdown . find ( '.title.back' ) . length ) {
if ( settings . mobile _show _parent _link == true && url ) {
$titleLi = $ ( '<li class="title back js-generated"><h5><a href="javascript:void(0)"></a></h5></li><li class="parent-link hide-for-large-up"><a class="parent-link js-generated" href="' + url + '">' + $link . html ( ) + '</a></li>' ) ;
} else {
$titleLi = $ ( '<li class="title back js-generated"><h5><a href="javascript:void(0)"></a></h5>' ) ;
}
// Copy link to subnav
if ( settings . custom _back _text == true ) {
$ ( 'h5>a' , $titleLi ) . html ( settings . back _text ) ;
} else {
$ ( 'h5>a' , $titleLi ) . html ( '« ' + $link . html ( ) ) ;
}
$dropdown . prepend ( $titleLi ) ;
}
} ) ;
// Put element back in the DOM
section . appendTo ( topbar ) ;
// check for sticky
this . sticky ( ) ;
this . assembled ( topbar ) ;
} ,
assembled : function ( topbar ) {
topbar . data ( this . attr _name ( true ) , $ . extend ( { } , topbar . data ( this . attr _name ( true ) ) , { assembled : true } ) ) ;
} ,
height : function ( ul ) {
var total = 0 ,
self = this ;
$ ( '> li' , ul ) . each ( function ( ) {
total += self . S ( this ) . outerHeight ( true ) ;
} ) ;
return total ;
} ,
sticky : function ( ) {
var self = this ;
this . S ( window ) . on ( 'scroll' , function ( ) {
self . update _sticky _positioning ( ) ;
} ) ;
} ,
update _sticky _positioning : function ( ) {
var klass = '.' + this . settings . sticky _class ,
$window = this . S ( window ) ,
self = this ;
if ( self . settings . sticky _topbar && self . is _sticky ( this . settings . sticky _topbar , this . settings . sticky _topbar . parent ( ) , this . settings ) ) {
var distance = this . settings . sticky _topbar . data ( 'stickyoffset' ) ;
if ( ! self . S ( klass ) . hasClass ( 'expanded' ) ) {
if ( $window . scrollTop ( ) > ( distance ) ) {
if ( ! self . S ( klass ) . hasClass ( 'fixed' ) ) {
self . S ( klass ) . addClass ( 'fixed' ) ;
self . S ( 'body' ) . addClass ( 'f-topbar-fixed' ) ;
}
} else if ( $window . scrollTop ( ) <= distance ) {
if ( self . S ( klass ) . hasClass ( 'fixed' ) ) {
self . S ( klass ) . removeClass ( 'fixed' ) ;
self . S ( 'body' ) . removeClass ( 'f-topbar-fixed' ) ;
}
}
}
}
} ,
off : function ( ) {
this . S ( this . scope ) . off ( '.fndtn.topbar' ) ;
this . S ( window ) . off ( '.fndtn.topbar' ) ;
} ,
reflow : function ( ) { }
} ;
} ( jQuery , window , window . document ) ) ;
; ( function ( $ , window , document , undefined ) {
'use strict' ;
Foundation . libs . clearing = {
name : 'clearing' ,
version : '5.5.1' ,
settings : {
templates : {
viewing : '<a href="#" class="clearing-close">×</a>' +
'<div class="visible-img" style="display: none"><div class="clearing-touch-label"></div><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" alt="" />' +
'<p class="clearing-caption"></p><a href="#" class="clearing-main-prev"><span></span></a>' +
'<a href="#" class="clearing-main-next"><span></span></a></div>'
} ,
// comma delimited list of selectors that, on click, will close clearing,
// add 'div.clearing-blackout, div.visible-img' to close on background click
close _selectors : '.clearing-close, div.clearing-blackout' ,
// Default to the entire li element.
open _selectors : '' ,
// Image will be skipped in carousel.
skip _selector : '' ,
touch _label : '' ,
// event initializers and locks
init : false ,
locked : false
} ,
init : function ( scope , method , options ) {
var self = this ;
Foundation . inherit ( this , 'throttle image_loaded' ) ;
this . bindings ( method , options ) ;
if ( self . S ( this . scope ) . is ( '[' + this . attr _name ( ) + ']' ) ) {
this . assemble ( self . S ( 'li' , this . scope ) ) ;
} else {
self . S ( '[' + this . attr _name ( ) + ']' , this . scope ) . each ( function ( ) {
self . assemble ( self . S ( 'li' , this ) ) ;
} ) ;
}
} ,
events : function ( scope ) {
var self = this ,
S = self . S ,
$scroll _container = $ ( '.scroll-container' ) ;
if ( $scroll _container . length > 0 ) {
this . scope = $scroll _container ;
}
S ( this . scope )
. off ( '.clearing' )
. on ( 'click.fndtn.clearing' , 'ul[' + this . attr _name ( ) + '] li ' + this . settings . open _selectors ,
function ( e , current , target ) {
var current = current || S ( this ) ,
target = target || current ,
next = current . next ( 'li' ) ,
settings = current . closest ( '[' + self . attr _name ( ) + ']' ) . data ( self . attr _name ( true ) + '-init' ) ,
image = S ( e . target ) ;
e . preventDefault ( ) ;
if ( ! settings ) {
self . init ( ) ;
settings = current . closest ( '[' + self . attr _name ( ) + ']' ) . data ( self . attr _name ( true ) + '-init' ) ;
}
// if clearing is open and the current image is
// clicked, go to the next image in sequence
if ( target . hasClass ( 'visible' ) &&
current [ 0 ] === target [ 0 ] &&
next . length > 0 && self . is _open ( current ) ) {
target = next ;
image = S ( 'img' , target ) ;
}
// set current and target to the clicked li if not otherwise defined.
self . open ( image , current , target ) ;
self . update _paddles ( target ) ;
} )
. on ( 'click.fndtn.clearing' , '.clearing-main-next' ,
function ( e ) { self . nav ( e , 'next' ) } )
. on ( 'click.fndtn.clearing' , '.clearing-main-prev' ,
function ( e ) { self . nav ( e , 'prev' ) } )
. on ( 'click.fndtn.clearing' , this . settings . close _selectors ,
function ( e ) { Foundation . libs . clearing . close ( e , this ) } ) ;
$ ( document ) . on ( 'keydown.fndtn.clearing' ,
function ( e ) { self . keydown ( e ) } ) ;
S ( window ) . off ( '.clearing' ) . on ( 'resize.fndtn.clearing' ,
function ( ) { self . resize ( ) } ) ;
this . swipe _events ( scope ) ;
} ,
swipe _events : function ( scope ) {
var self = this ,
S = self . S ;
S ( this . scope )
. on ( 'touchstart.fndtn.clearing' , '.visible-img' , function ( e ) {
if ( ! e . touches ) { e = e . originalEvent ; }
var data = {
start _page _x : e . touches [ 0 ] . pageX ,
start _page _y : e . touches [ 0 ] . pageY ,
start _time : ( new Date ( ) ) . getTime ( ) ,
delta _x : 0 ,
is _scrolling : undefined
} ;
S ( this ) . data ( 'swipe-transition' , data ) ;
e . stopPropagation ( ) ;
} )
. on ( 'touchmove.fndtn.clearing' , '.visible-img' , function ( e ) {
if ( ! e . touches ) {
e = e . originalEvent ;
}
// Ignore pinch/zoom events
if ( e . touches . length > 1 || e . scale && e . scale !== 1 ) {
return ;
}
var data = S ( this ) . data ( 'swipe-transition' ) ;
if ( typeof data === 'undefined' ) {
data = { } ;
}
data . delta _x = e . touches [ 0 ] . pageX - data . start _page _x ;
if ( Foundation . rtl ) {
data . delta _x = - data . delta _x ;
}
if ( typeof data . is _scrolling === 'undefined' ) {
data . is _scrolling = ! ! ( data . is _scrolling || Math . abs ( data . delta _x ) < Math . abs ( e . touches [ 0 ] . pageY - data . start _page _y ) ) ;
}
if ( ! data . is _scrolling && ! data . active ) {
e . preventDefault ( ) ;
var direction = ( data . delta _x < 0 ) ? 'next' : 'prev' ;
data . active = true ;
self . nav ( e , direction ) ;
}
} )
. on ( 'touchend.fndtn.clearing' , '.visible-img' , function ( e ) {
S ( this ) . data ( 'swipe-transition' , { } ) ;
e . stopPropagation ( ) ;
} ) ;
} ,
assemble : function ( $li ) {
var $el = $li . parent ( ) ;
if ( $el . parent ( ) . hasClass ( 'carousel' ) ) {
return ;
}
$el . after ( '<div id="foundationClearingHolder"></div>' ) ;
var grid = $el . detach ( ) ,
grid _outerHTML = '' ;
if ( grid [ 0 ] == null ) {
return ;
} else {
grid _outerHTML = grid [ 0 ] . outerHTML ;
}
var holder = this . S ( '#foundationClearingHolder' ) ,
settings = $el . data ( this . attr _name ( true ) + '-init' ) ,
data = {
grid : '<div class="carousel">' + grid _outerHTML + '</div>' ,
viewing : settings . templates . viewing
} ,
wrapper = '<div class="clearing-assembled"><div>' + data . viewing +
data . grid + '</div></div>' ,
touch _label = this . settings . touch _label ;
if ( Modernizr . touch ) {
wrapper = $ ( wrapper ) . find ( '.clearing-touch-label' ) . html ( touch _label ) . end ( ) ;
}
holder . after ( wrapper ) . remove ( ) ;
} ,
open : function ( $image , current , target ) {
var self = this ,
body = $ ( document . body ) ,
root = target . closest ( '.clearing-assembled' ) ,
container = self . S ( 'div' , root ) . first ( ) ,
visible _image = self . S ( '.visible-img' , container ) ,
image = self . S ( 'img' , visible _image ) . not ( $image ) ,
label = self . S ( '.clearing-touch-label' , container ) ,
error = false ;
// Event to disable scrolling on touch devices when Clearing is activated
$ ( 'body' ) . on ( 'touchmove' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
image . error ( function ( ) {
error = true ;
} ) ;
function startLoad ( ) {
setTimeout ( function ( ) {
this . image _loaded ( image , function ( ) {
if ( image . outerWidth ( ) === 1 && ! error ) {
startLoad . call ( this ) ;
} else {
cb . call ( this , image ) ;
}
} . bind ( this ) ) ;
} . bind ( this ) , 100 ) ;
}
function cb ( image ) {
var $image = $ ( image ) ;
$image . css ( 'visibility' , 'visible' ) ;
// toggle the gallery
body . css ( 'overflow' , 'hidden' ) ;
root . addClass ( 'clearing-blackout' ) ;
container . addClass ( 'clearing-container' ) ;
visible _image . show ( ) ;
this . fix _height ( target )
. caption ( self . S ( '.clearing-caption' , visible _image ) , self . S ( 'img' , target ) )
. center _and _label ( image , label )
. shift ( current , target , function ( ) {
target . closest ( 'li' ) . siblings ( ) . removeClass ( 'visible' ) ;
target . closest ( 'li' ) . addClass ( 'visible' ) ;
} ) ;
visible _image . trigger ( 'opened.fndtn.clearing' )
}
if ( ! this . locked ( ) ) {
visible _image . trigger ( 'open.fndtn.clearing' ) ;
// set the image to the selected thumbnail
image
. attr ( 'src' , this . load ( $image ) )
. css ( 'visibility' , 'hidden' ) ;
startLoad . call ( this ) ;
}
} ,
close : function ( e , el ) {
e . preventDefault ( ) ;
var root = ( function ( target ) {
if ( /blackout/ . test ( target . selector ) ) {
return target ;
} else {
return target . closest ( '.clearing-blackout' ) ;
}
} ( $ ( el ) ) ) ,
body = $ ( document . body ) , container , visible _image ;
if ( el === e . target && root ) {
body . css ( 'overflow' , '' ) ;
container = $ ( 'div' , root ) . first ( ) ;
visible _image = $ ( '.visible-img' , container ) ;
visible _image . trigger ( 'close.fndtn.clearing' ) ;
this . settings . prev _index = 0 ;
$ ( 'ul[' + this . attr _name ( ) + ']' , root )
. attr ( 'style' , '' ) . closest ( '.clearing-blackout' )
. removeClass ( 'clearing-blackout' ) ;
container . removeClass ( 'clearing-container' ) ;
visible _image . hide ( ) ;
visible _image . trigger ( 'closed.fndtn.clearing' ) ;
}
// Event to re-enable scrolling on touch devices
$ ( 'body' ) . off ( 'touchmove' ) ;
return false ;
} ,
is _open : function ( current ) {
return current . parent ( ) . prop ( 'style' ) . length > 0 ;
} ,
keydown : function ( e ) {
var clearing = $ ( '.clearing-blackout ul[' + this . attr _name ( ) + ']' ) ,
NEXT _KEY = this . rtl ? 37 : 39 ,
PREV _KEY = this . rtl ? 39 : 37 ,
ESC _KEY = 27 ;
if ( e . which === NEXT _KEY ) {
this . go ( clearing , 'next' ) ;
}
if ( e . which === PREV _KEY ) {
this . go ( clearing , 'prev' ) ;
}
if ( e . which === ESC _KEY ) {
this . S ( 'a.clearing-close' ) . trigger ( 'click' ) . trigger ( 'click.fndtn.clearing' ) ;
}
} ,
nav : function ( e , direction ) {
var clearing = $ ( 'ul[' + this . attr _name ( ) + ']' , '.clearing-blackout' ) ;
e . preventDefault ( ) ;
this . go ( clearing , direction ) ;
} ,
resize : function ( ) {
var image = $ ( 'img' , '.clearing-blackout .visible-img' ) ,
label = $ ( '.clearing-touch-label' , '.clearing-blackout' ) ;
if ( image . length ) {
this . center _and _label ( image , label ) ;
image . trigger ( 'resized.fndtn.clearing' )
}
} ,
// visual adjustments
fix _height : function ( target ) {
var lis = target . parent ( ) . children ( ) ,
self = this ;
lis . each ( function ( ) {
var li = self . S ( this ) ,
image = li . find ( 'img' ) ;
if ( li . height ( ) > image . outerHeight ( ) ) {
li . addClass ( 'fix-height' ) ;
}
} )
. closest ( 'ul' )
. width ( lis . length * 100 + '%' ) ;
return this ;
} ,
update _paddles : function ( target ) {
target = target . closest ( 'li' ) ;
var visible _image = target
. closest ( '.carousel' )
. siblings ( '.visible-img' ) ;
if ( target . next ( ) . length > 0 ) {
this . S ( '.clearing-main-next' , visible _image ) . removeClass ( 'disabled' ) ;
} else {
this . S ( '.clearing-main-next' , visible _image ) . addClass ( 'disabled' ) ;
}
if ( target . prev ( ) . length > 0 ) {
this . S ( '.clearing-main-prev' , visible _image ) . removeClass ( 'disabled' ) ;
} else {
this . S ( '.clearing-main-prev' , visible _image ) . addClass ( 'disabled' ) ;
}
} ,
center _and _label : function ( target , label ) {
if ( ! this . rtl && label . length > 0 ) {
label . css ( {
marginLeft : - ( label . outerWidth ( ) / 2 ) ,
marginTop : - ( target . outerHeight ( ) / 2 ) - label . outerHeight ( ) - 10
} ) ;
} else {
label . css ( {
marginRight : - ( label . outerWidth ( ) / 2 ) ,
marginTop : - ( target . outerHeight ( ) / 2 ) - label . outerHeight ( ) - 10 ,
left : 'auto' ,
right : '50%'
} ) ;
}
return this ;
} ,
// image loading and preloading
load : function ( $image ) {
var href ;
if ( $image [ 0 ] . nodeName === 'A' ) {
href = $image . attr ( 'href' ) ;
} else {
href = $image . closest ( 'a' ) . attr ( 'href' ) ;
}
this . preload ( $image ) ;
if ( href ) {
return href ;
}
return $image . attr ( 'src' ) ;
} ,
preload : function ( $image ) {
this
. img ( $image . closest ( 'li' ) . next ( ) )
. img ( $image . closest ( 'li' ) . prev ( ) ) ;
} ,
img : function ( img ) {
if ( img . length ) {
var new _img = new Image ( ) ,
new _a = this . S ( 'a' , img ) ;
if ( new _a . length ) {
new _img . src = new _a . attr ( 'href' ) ;
} else {
new _img . src = this . S ( 'img' , img ) . attr ( 'src' ) ;
}
}
return this ;
} ,
// image caption
caption : function ( container , $image ) {
var caption = $image . attr ( 'data-caption' ) ;
if ( caption ) {
container
. html ( caption )
. show ( ) ;
} else {
container
. text ( '' )
. hide ( ) ;
}
return this ;
} ,
// directional methods
go : function ( $ul , direction ) {
var current = this . S ( '.visible' , $ul ) ,
target = current [ direction ] ( ) ;
// Check for skip selector.
if ( this . settings . skip _selector && target . find ( this . settings . skip _selector ) . length != 0 ) {
target = target [ direction ] ( ) ;
}
if ( target . length ) {
this . S ( 'img' , target )
. trigger ( 'click' , [ current , target ] ) . trigger ( 'click.fndtn.clearing' , [ current , target ] )
. trigger ( 'change.fndtn.clearing' ) ;
}
} ,
shift : function ( current , target , callback ) {
var clearing = target . parent ( ) ,
old _index = this . settings . prev _index || target . index ( ) ,
direction = this . direction ( clearing , current , target ) ,
dir = this . rtl ? 'right' : 'left' ,
left = parseInt ( clearing . css ( 'left' ) , 10 ) ,
width = target . outerWidth ( ) ,
skip _shift ;
var dir _obj = { } ;
// we use jQuery animate instead of CSS transitions because we
// need a callback to unlock the next animation
// needs support for RTL **
if ( target . index ( ) !== old _index && ! /skip/ . test ( direction ) ) {
if ( /left/ . test ( direction ) ) {
this . lock ( ) ;
dir _obj [ dir ] = left + width ;
clearing . animate ( dir _obj , 300 , this . unlock ( ) ) ;
} else if ( /right/ . test ( direction ) ) {
this . lock ( ) ;
dir _obj [ dir ] = left - width ;
clearing . animate ( dir _obj , 300 , this . unlock ( ) ) ;
}
} else if ( /skip/ . test ( direction ) ) {
// the target image is not adjacent to the current image, so
// do we scroll right or not
skip _shift = target . index ( ) - this . settings . up _count ;
this . lock ( ) ;
if ( skip _shift > 0 ) {
dir _obj [ dir ] = - ( skip _shift * width ) ;
clearing . animate ( dir _obj , 300 , this . unlock ( ) ) ;
} else {
dir _obj [ dir ] = 0 ;
clearing . animate ( dir _obj , 300 , this . unlock ( ) ) ;
}
}
callback ( ) ;
} ,
direction : function ( $el , current , target ) {
var lis = this . S ( 'li' , $el ) ,
li _width = lis . outerWidth ( ) + ( lis . outerWidth ( ) / 4 ) ,
up _count = Math . floor ( this . S ( '.clearing-container' ) . outerWidth ( ) / li _width ) - 1 ,
target _index = lis . index ( target ) ,
response ;
this . settings . up _count = up _count ;
if ( this . adjacent ( this . settings . prev _index , target _index ) ) {
if ( ( target _index > up _count ) && target _index > this . settings . prev _index ) {
response = 'right' ;
} else if ( ( target _index > up _count - 1 ) && target _index <= this . settings . prev _index ) {
response = 'left' ;
} else {
response = false ;
}
} else {
response = 'skip' ;
}
this . settings . prev _index = target _index ;
return response ;
} ,
adjacent : function ( current _index , target _index ) {
for ( var i = target _index + 1 ; i >= target _index - 1 ; i -- ) {
if ( i === current _index ) {
return true ;
}
}
return false ;
} ,
// lock management
lock : function ( ) {
this . settings . locked = true ;
} ,
unlock : function ( ) {
this . settings . locked = false ;
} ,
locked : function ( ) {
return this . settings . locked ;
} ,
off : function ( ) {
this . S ( this . scope ) . off ( '.fndtn.clearing' ) ;
this . S ( window ) . off ( '.fndtn.clearing' ) ;
} ,
reflow : function ( ) {
this . init ( ) ;
}
} ;
} ( jQuery , window , window . document ) ) ;
/ *
_ _ _ _
_ _ _ | ( _ ) _ _ _ | | _ _ ( _ ) _ _ _
/ __| | |/ _ _ | | / / | / _ _ |
\ _ _ \ | | ( _ _ | < _ | \ _ _ \
| _ _ _ / _ | _ | \ _ _ _ | _ | \ _ ( _ ) / | _ _ _ /
| _ _ /
Version : 1.4 . 1
Author : Ken Wheeler
Website : http : //kenwheeler.github.io
Docs : http : //kenwheeler.github.io/slick
Repo : http : //github.com/kenwheeler/slick
Issues : http : //github.com/kenwheeler/slick/issues
* /
/* global window, document, define, jQuery, setInterval, clearInterval */
( function ( factory ) {
'use strict' ;
if ( typeof define === 'function' && define . amd ) {
define ( [ 'jquery' ] , factory ) ;
} else if ( typeof exports !== 'undefined' ) {
module . exports = factory ( require ( 'jquery' ) ) ;
} else {
factory ( jQuery ) ;
}
} ( function ( $ ) {
'use strict' ;
var Slick = window . Slick || { } ;
Slick = ( function ( ) {
var instanceUid = 0 ;
function Slick ( element , settings ) {
var _ = this ,
dataSettings , responsiveSettings , breakpoint ;
_ . defaults = {
accessibility : true ,
adaptiveHeight : false ,
appendArrows : $ ( element ) ,
appendDots : $ ( element ) ,
arrows : true ,
asNavFor : null ,
prevArrow : '<button type="button" data-role="none" class="slick-prev" aria-label="previous">Previous</button>' ,
nextArrow : '<button type="button" data-role="none" class="slick-next" aria-label="next">Next</button>' ,
autoplay : false ,
autoplaySpeed : 3000 ,
centerMode : false ,
centerPadding : '50px' ,
cssEase : 'ease' ,
customPaging : function ( slider , i ) {
return '<button type="button" data-role="none">' + ( i + 1 ) + '</button>' ;
} ,
dots : false ,
dotsClass : 'slick-dots' ,
draggable : true ,
easing : 'linear' ,
edgeFriction : 0.35 ,
fade : false ,
focusOnSelect : false ,
infinite : true ,
initialSlide : 0 ,
lazyLoad : 'ondemand' ,
mobileFirst : false ,
pauseOnHover : true ,
pauseOnDotsHover : false ,
respondTo : 'window' ,
responsive : null ,
rtl : false ,
slide : '' ,
slidesToShow : 1 ,
slidesToScroll : 1 ,
speed : 500 ,
swipe : true ,
swipeToSlide : false ,
touchMove : true ,
touchThreshold : 5 ,
useCSS : true ,
variableWidth : false ,
vertical : false ,
waitForAnimate : true
} ;
_ . initials = {
animating : false ,
dragging : false ,
autoPlayTimer : null ,
currentDirection : 0 ,
currentLeft : null ,
currentSlide : 0 ,
direction : 1 ,
$dots : null ,
listWidth : null ,
listHeight : null ,
loadIndex : 0 ,
$nextArrow : null ,
$prevArrow : null ,
slideCount : null ,
slideWidth : null ,
$slideTrack : null ,
$slides : null ,
sliding : false ,
slideOffset : 0 ,
swipeLeft : null ,
$list : null ,
touchObject : { } ,
transformsEnabled : false
} ;
$ . extend ( _ , _ . initials ) ;
_ . activeBreakpoint = null ;
_ . animType = null ;
_ . animProp = null ;
_ . breakpoints = [ ] ;
_ . breakpointSettings = [ ] ;
_ . cssTransitions = false ;
_ . hidden = "hidden" ;
_ . paused = false ;
_ . positionProp = null ;
_ . respondTo = null ;
_ . shouldClick = true ;
_ . $slider = $ ( element ) ;
_ . $slidesCache = null ;
_ . transformType = null ;
_ . transitionType = null ;
_ . visibilityChange = "visibilitychange" ;
_ . windowWidth = 0 ;
_ . windowTimer = null ;
dataSettings = $ ( element ) . data ( 'slick' ) || { } ;
_ . options = $ . extend ( { } , _ . defaults , dataSettings , settings ) ;
_ . currentSlide = _ . options . initialSlide ;
_ . originalSettings = _ . options ;
responsiveSettings = _ . options . responsive || null ;
if ( responsiveSettings && responsiveSettings . length > - 1 ) {
_ . respondTo = _ . options . respondTo || "window" ;
for ( breakpoint in responsiveSettings ) {
if ( responsiveSettings . hasOwnProperty ( breakpoint ) ) {
_ . breakpoints . push ( responsiveSettings [
breakpoint ] . breakpoint ) ;
_ . breakpointSettings [ responsiveSettings [
breakpoint ] . breakpoint ] =
responsiveSettings [ breakpoint ] . settings ;
}
}
_ . breakpoints . sort ( function ( a , b ) {
if ( _ . options . mobileFirst === true ) {
return a - b ;
} else {
return b - a ;
}
} ) ;
}
if ( typeof document . mozHidden !== "undefined" ) {
_ . hidden = "mozHidden" ;
_ . visibilityChange = "mozvisibilitychange" ;
} else if ( typeof document . msHidden !== "undefined" ) {
_ . hidden = "msHidden" ;
_ . visibilityChange = "msvisibilitychange" ;
} else if ( typeof document . webkitHidden !== "undefined" ) {
_ . hidden = "webkitHidden" ;
_ . visibilityChange = "webkitvisibilitychange" ;
}
_ . autoPlay = $ . proxy ( _ . autoPlay , _ ) ;
_ . autoPlayClear = $ . proxy ( _ . autoPlayClear , _ ) ;
_ . changeSlide = $ . proxy ( _ . changeSlide , _ ) ;
_ . clickHandler = $ . proxy ( _ . clickHandler , _ ) ;
_ . selectHandler = $ . proxy ( _ . selectHandler , _ ) ;
_ . setPosition = $ . proxy ( _ . setPosition , _ ) ;
_ . swipeHandler = $ . proxy ( _ . swipeHandler , _ ) ;
_ . dragHandler = $ . proxy ( _ . dragHandler , _ ) ;
_ . keyHandler = $ . proxy ( _ . keyHandler , _ ) ;
_ . autoPlayIterator = $ . proxy ( _ . autoPlayIterator , _ ) ;
_ . instanceUid = instanceUid ++ ;
// A simple way to check for HTML strings
// Strict HTML recognition (must start with <)
// Extracted from jQuery v1.11 source
_ . htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/ ;
_ . init ( ) ;
_ . checkResponsive ( true ) ;
}
return Slick ;
} ( ) ) ;
Slick . prototype . addSlide = Slick . prototype . slickAdd = function ( markup , index , addBefore ) {
var _ = this ;
if ( typeof ( index ) === 'boolean' ) {
addBefore = index ;
index = null ;
} else if ( index < 0 || ( index >= _ . slideCount ) ) {
return false ;
}
_ . unload ( ) ;
if ( typeof ( index ) === 'number' ) {
if ( index === 0 && _ . $slides . length === 0 ) {
$ ( markup ) . appendTo ( _ . $slideTrack ) ;
} else if ( addBefore ) {
$ ( markup ) . insertBefore ( _ . $slides . eq ( index ) ) ;
} else {
$ ( markup ) . insertAfter ( _ . $slides . eq ( index ) ) ;
}
} else {
if ( addBefore === true ) {
$ ( markup ) . prependTo ( _ . $slideTrack ) ;
} else {
$ ( markup ) . appendTo ( _ . $slideTrack ) ;
}
}
_ . $slides = _ . $slideTrack . children ( this . options . slide ) ;
_ . $slideTrack . children ( this . options . slide ) . detach ( ) ;
_ . $slideTrack . append ( _ . $slides ) ;
_ . $slides . each ( function ( index , element ) {
$ ( element ) . attr ( "data-slick-index" , index ) ;
} ) ;
_ . $slidesCache = _ . $slides ;
_ . reinit ( ) ;
} ;
Slick . prototype . animateHeight = function ( ) {
var _ = this ;
if ( _ . options . slidesToShow === 1 && _ . options . adaptiveHeight === true && _ . options . vertical === false ) {
var targetHeight = _ . $slides . eq ( _ . currentSlide ) . outerHeight ( true ) ;
_ . $list . animate ( { height : targetHeight } , _ . options . speed ) ;
}
} ;
Slick . prototype . animateSlide = function ( targetLeft , callback ) {
var animProps = { } , _ = this ;
_ . animateHeight ( ) ;
if ( _ . options . rtl === true && _ . options . vertical === false ) {
targetLeft = - targetLeft ;
}
if ( _ . transformsEnabled === false ) {
if ( _ . options . vertical === false ) {
_ . $slideTrack . animate ( {
left : targetLeft
} , _ . options . speed , _ . options . easing , callback ) ;
} else {
_ . $slideTrack . animate ( {
top : targetLeft
} , _ . options . speed , _ . options . easing , callback ) ;
}
} else {
if ( _ . cssTransitions === false ) {
if ( _ . options . rtl === true ) {
_ . currentLeft = - ( _ . currentLeft ) ;
}
$ ( {
animStart : _ . currentLeft
} ) . animate ( {
animStart : targetLeft
} , {
duration : _ . options . speed ,
easing : _ . options . easing ,
step : function ( now ) {
now = Math . ceil ( now ) ;
if ( _ . options . vertical === false ) {
animProps [ _ . animType ] = 'translate(' +
now + 'px, 0px)' ;
_ . $slideTrack . css ( animProps ) ;
} else {
animProps [ _ . animType ] = 'translate(0px,' +
now + 'px)' ;
_ . $slideTrack . css ( animProps ) ;
}
} ,
complete : function ( ) {
if ( callback ) {
callback . call ( ) ;
}
}
} ) ;
} else {
_ . applyTransition ( ) ;
targetLeft = Math . ceil ( targetLeft ) ;
if ( _ . options . vertical === false ) {
animProps [ _ . animType ] = 'translate3d(' + targetLeft + 'px, 0px, 0px)' ;
} else {
animProps [ _ . animType ] = 'translate3d(0px,' + targetLeft + 'px, 0px)' ;
}
_ . $slideTrack . css ( animProps ) ;
if ( callback ) {
setTimeout ( function ( ) {
_ . disableTransition ( ) ;
callback . call ( ) ;
} , _ . options . speed ) ;
}
}
}
} ;
Slick . prototype . asNavFor = function ( index ) {
var _ = this , asNavFor = _ . options . asNavFor !== null ? $ ( _ . options . asNavFor ) . slick ( 'getSlick' ) : null ;
if ( asNavFor !== null ) asNavFor . slideHandler ( index , true ) ;
} ;
Slick . prototype . applyTransition = function ( slide ) {
var _ = this ,
transition = { } ;
if ( _ . options . fade === false ) {
transition [ _ . transitionType ] = _ . transformType + ' ' + _ . options . speed + 'ms ' + _ . options . cssEase ;
} else {
transition [ _ . transitionType ] = 'opacity ' + _ . options . speed + 'ms ' + _ . options . cssEase ;
}
if ( _ . options . fade === false ) {
_ . $slideTrack . css ( transition ) ;
} else {
_ . $slides . eq ( slide ) . css ( transition ) ;
}
} ;
Slick . prototype . autoPlay = function ( ) {
var _ = this ;
if ( _ . autoPlayTimer ) {
clearInterval ( _ . autoPlayTimer ) ;
}
if ( _ . slideCount > _ . options . slidesToShow && _ . paused !== true ) {
_ . autoPlayTimer = setInterval ( _ . autoPlayIterator ,
_ . options . autoplaySpeed ) ;
}
} ;
Slick . prototype . autoPlayClear = function ( ) {
var _ = this ;
if ( _ . autoPlayTimer ) {
clearInterval ( _ . autoPlayTimer ) ;
}
} ;
Slick . prototype . autoPlayIterator = function ( ) {
var _ = this ;
if ( _ . options . infinite === false ) {
if ( _ . direction === 1 ) {
if ( ( _ . currentSlide + 1 ) === _ . slideCount -
1 ) {
_ . direction = 0 ;
}
_ . slideHandler ( _ . currentSlide + _ . options . slidesToScroll ) ;
} else {
if ( ( _ . currentSlide - 1 === 0 ) ) {
_ . direction = 1 ;
}
_ . slideHandler ( _ . currentSlide - _ . options . slidesToScroll ) ;
}
} else {
_ . slideHandler ( _ . currentSlide + _ . options . slidesToScroll ) ;
}
} ;
Slick . prototype . buildArrows = function ( ) {
var _ = this ;
if ( _ . options . arrows === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $prevArrow = $ ( _ . options . prevArrow ) ;
_ . $nextArrow = $ ( _ . options . nextArrow ) ;
if ( _ . htmlExpr . test ( _ . options . prevArrow ) ) {
_ . $prevArrow . appendTo ( _ . options . appendArrows ) ;
}
if ( _ . htmlExpr . test ( _ . options . nextArrow ) ) {
_ . $nextArrow . appendTo ( _ . options . appendArrows ) ;
}
if ( _ . options . infinite !== true ) {
_ . $prevArrow . addClass ( 'slick-disabled' ) ;
}
}
} ;
Slick . prototype . buildDots = function ( ) {
var _ = this ,
i , dotString ;
if ( _ . options . dots === true && _ . slideCount > _ . options . slidesToShow ) {
dotString = '<ul class="' + _ . options . dotsClass + '">' ;
for ( i = 0 ; i <= _ . getDotCount ( ) ; i += 1 ) {
dotString += '<li>' + _ . options . customPaging . call ( this , _ , i ) + '</li>' ;
}
dotString += '</ul>' ;
_ . $dots = $ ( dotString ) . appendTo (
_ . options . appendDots ) ;
_ . $dots . find ( 'li' ) . first ( ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
}
} ;
Slick . prototype . buildOut = function ( ) {
var _ = this ;
_ . $slides = _ . $slider . children ( _ . options . slide +
':not(.slick-cloned)' ) . addClass (
'slick-slide' ) ;
_ . slideCount = _ . $slides . length ;
_ . $slides . each ( function ( index , element ) {
$ ( element ) . attr ( "data-slick-index" , index ) ;
} ) ;
_ . $slidesCache = _ . $slides ;
_ . $slider . addClass ( 'slick-slider' ) ;
_ . $slideTrack = ( _ . slideCount === 0 ) ?
$ ( '<div class="slick-track"/>' ) . appendTo ( _ . $slider ) :
_ . $slides . wrapAll ( '<div class="slick-track"/>' ) . parent ( ) ;
_ . $list = _ . $slideTrack . wrap (
'<div aria-live="polite" class="slick-list"/>' ) . parent ( ) ;
_ . $slideTrack . css ( 'opacity' , 0 ) ;
if ( _ . options . centerMode === true || _ . options . swipeToSlide === true ) {
_ . options . slidesToScroll = 1 ;
}
$ ( 'img[data-lazy]' , _ . $slider ) . not ( '[src]' ) . addClass ( 'slick-loading' ) ;
_ . setupInfinite ( ) ;
_ . buildArrows ( ) ;
_ . buildDots ( ) ;
_ . updateDots ( ) ;
if ( _ . options . accessibility === true ) {
_ . $list . prop ( 'tabIndex' , 0 ) ;
}
_ . setSlideClasses ( typeof this . currentSlide === 'number' ? this . currentSlide : 0 ) ;
if ( _ . options . draggable === true ) {
_ . $list . addClass ( 'draggable' ) ;
}
} ;
Slick . prototype . checkResponsive = function ( initial ) {
var _ = this ,
breakpoint , targetBreakpoint , respondToWidth ;
var sliderWidth = _ . $slider . width ( ) ;
var windowWidth = window . innerWidth || $ ( window ) . width ( ) ;
if ( _ . respondTo === "window" ) {
respondToWidth = windowWidth ;
} else if ( _ . respondTo === "slider" ) {
respondToWidth = sliderWidth ;
} else if ( _ . respondTo === "min" ) {
respondToWidth = Math . min ( windowWidth , sliderWidth ) ;
}
if ( _ . originalSettings . responsive && _ . originalSettings
. responsive . length > - 1 && _ . originalSettings . responsive !== null ) {
targetBreakpoint = null ;
for ( breakpoint in _ . breakpoints ) {
if ( _ . breakpoints . hasOwnProperty ( breakpoint ) ) {
if ( _ . originalSettings . mobileFirst === false ) {
if ( respondToWidth < _ . breakpoints [ breakpoint ] ) {
targetBreakpoint = _ . breakpoints [ breakpoint ] ;
}
} else {
if ( respondToWidth > _ . breakpoints [ breakpoint ] ) {
targetBreakpoint = _ . breakpoints [ breakpoint ] ;
}
}
}
}
if ( targetBreakpoint !== null ) {
if ( _ . activeBreakpoint !== null ) {
if ( targetBreakpoint !== _ . activeBreakpoint ) {
_ . activeBreakpoint =
targetBreakpoint ;
if ( _ . breakpointSettings [ targetBreakpoint ] === "unslick" ) {
_ . unslick ( ) ;
} else {
_ . options = $ . extend ( { } , _ . originalSettings ,
_ . breakpointSettings [
targetBreakpoint ] ) ;
if ( initial === true )
_ . currentSlide = _ . options . initialSlide ;
_ . refresh ( ) ;
}
}
} else {
_ . activeBreakpoint = targetBreakpoint ;
if ( _ . breakpointSettings [ targetBreakpoint ] === "unslick" ) {
_ . unslick ( ) ;
} else {
_ . options = $ . extend ( { } , _ . originalSettings ,
_ . breakpointSettings [
targetBreakpoint ] ) ;
if ( initial === true )
_ . currentSlide = _ . options . initialSlide ;
_ . refresh ( ) ;
}
}
} else {
if ( _ . activeBreakpoint !== null ) {
_ . activeBreakpoint = null ;
_ . options = _ . originalSettings ;
if ( initial === true )
_ . currentSlide = _ . options . initialSlide ;
_ . refresh ( ) ;
}
}
}
} ;
Slick . prototype . changeSlide = function ( event , dontAnimate ) {
var _ = this ,
$target = $ ( event . target ) ,
indexOffset , slideOffset , unevenOffset ;
// If target is a link, prevent default action.
$target . is ( 'a' ) && event . preventDefault ( ) ;
unevenOffset = ( _ . slideCount % _ . options . slidesToScroll !== 0 ) ;
indexOffset = unevenOffset ? 0 : ( _ . slideCount - _ . currentSlide ) % _ . options . slidesToScroll ;
switch ( event . data . message ) {
case 'previous' :
slideOffset = indexOffset === 0 ? _ . options . slidesToScroll : _ . options . slidesToShow - indexOffset ;
if ( _ . slideCount > _ . options . slidesToShow ) {
_ . slideHandler ( _ . currentSlide - slideOffset , false , dontAnimate ) ;
}
break ;
case 'next' :
slideOffset = indexOffset === 0 ? _ . options . slidesToScroll : indexOffset ;
if ( _ . slideCount > _ . options . slidesToShow ) {
_ . slideHandler ( _ . currentSlide + slideOffset , false , dontAnimate ) ;
}
break ;
case 'index' :
var index = event . data . index === 0 ? 0 :
event . data . index || $ ( event . target ) . parent ( ) . index ( ) * _ . options . slidesToScroll ;
_ . slideHandler ( _ . checkNavigable ( index ) , false , dontAnimate ) ;
break ;
default :
return ;
}
} ;
Slick . prototype . checkNavigable = function ( index ) {
var _ = this , navigables , prevNavigable ;
navigables = _ . getNavigableIndexes ( ) ;
prevNavigable = 0 ;
if ( index > navigables [ navigables . length - 1 ] ) {
index = navigables [ navigables . length - 1 ] ;
} else {
for ( var n in navigables ) {
if ( index < navigables [ n ] ) {
index = prevNavigable ;
break ;
}
prevNavigable = navigables [ n ] ;
}
}
return index ;
} ;
Slick . prototype . clickHandler = function ( event ) {
var _ = this ;
if ( _ . shouldClick === false ) {
event . stopImmediatePropagation ( ) ;
event . stopPropagation ( ) ;
event . preventDefault ( ) ;
}
} ;
Slick . prototype . destroy = function ( ) {
var _ = this ;
_ . autoPlayClear ( ) ;
_ . touchObject = { } ;
$ ( '.slick-cloned' , _ . $slider ) . remove ( ) ;
if ( _ . $dots ) {
_ . $dots . remove ( ) ;
}
if ( _ . $prevArrow && ( typeof _ . options . prevArrow !== 'object' ) ) {
_ . $prevArrow . remove ( ) ;
}
if ( _ . $nextArrow && ( typeof _ . options . nextArrow !== 'object' ) ) {
_ . $nextArrow . remove ( ) ;
}
_ . $slides . removeClass ( 'slick-slide slick-active slick-center slick-visible' )
. attr ( "aria-hidden" , "true" )
. removeAttr ( 'data-slick-index' )
. css ( {
position : '' ,
left : '' ,
top : '' ,
zIndex : '' ,
opacity : '' ,
width : ''
} ) ;
_ . $slider . removeClass ( 'slick-slider' ) ;
_ . $slider . removeClass ( 'slick-initialized' ) ;
_ . $list . off ( '.slick' ) ;
$ ( window ) . off ( '.slick-' + _ . instanceUid ) ;
$ ( document ) . off ( '.slick-' + _ . instanceUid ) ;
_ . $slider . html ( _ . $slides ) ;
} ;
Slick . prototype . disableTransition = function ( slide ) {
var _ = this ,
transition = { } ;
transition [ _ . transitionType ] = "" ;
if ( _ . options . fade === false ) {
_ . $slideTrack . css ( transition ) ;
} else {
_ . $slides . eq ( slide ) . css ( transition ) ;
}
} ;
Slick . prototype . fadeSlide = function ( slideIndex , callback ) {
var _ = this ;
if ( _ . cssTransitions === false ) {
_ . $slides . eq ( slideIndex ) . css ( {
zIndex : 1000
} ) ;
_ . $slides . eq ( slideIndex ) . animate ( {
opacity : 1
} , _ . options . speed , _ . options . easing , callback ) ;
} else {
_ . applyTransition ( slideIndex ) ;
_ . $slides . eq ( slideIndex ) . css ( {
opacity : 1 ,
zIndex : 1000
} ) ;
if ( callback ) {
setTimeout ( function ( ) {
_ . disableTransition ( slideIndex ) ;
callback . call ( ) ;
} , _ . options . speed ) ;
}
}
} ;
Slick . prototype . filterSlides = Slick . prototype . slickFilter = function ( filter ) {
var _ = this ;
if ( filter !== null ) {
_ . unload ( ) ;
_ . $slideTrack . children ( this . options . slide ) . detach ( ) ;
_ . $slidesCache . filter ( filter ) . appendTo ( _ . $slideTrack ) ;
_ . reinit ( ) ;
}
} ;
Slick . prototype . getCurrent = Slick . prototype . slickCurrentSlide = function ( ) {
var _ = this ;
return _ . currentSlide ;
} ;
Slick . prototype . getDotCount = function ( ) {
var _ = this ;
var breakPoint = 0 ;
var counter = 0 ;
var pagerQty = 0 ;
if ( _ . options . infinite === true ) {
pagerQty = Math . ceil ( _ . slideCount / _ . options . slidesToScroll ) ;
} else if ( _ . options . centerMode === true ) {
pagerQty = _ . slideCount ;
} else {
while ( breakPoint < _ . slideCount ) {
++ pagerQty ;
breakPoint = counter + _ . options . slidesToShow ;
counter += _ . options . slidesToScroll <= _ . options . slidesToShow ? _ . options . slidesToScroll : _ . options . slidesToShow ;
}
}
return pagerQty - 1 ;
} ;
Slick . prototype . getLeft = function ( slideIndex ) {
var _ = this ,
targetLeft ,
verticalHeight ,
verticalOffset = 0 ,
targetSlide ;
_ . slideOffset = 0 ;
verticalHeight = _ . $slides . first ( ) . outerHeight ( ) ;
if ( _ . options . infinite === true ) {
if ( _ . slideCount > _ . options . slidesToShow ) {
_ . slideOffset = ( _ . slideWidth * _ . options . slidesToShow ) * - 1 ;
verticalOffset = ( verticalHeight * _ . options . slidesToShow ) * - 1 ;
}
if ( _ . slideCount % _ . options . slidesToScroll !== 0 ) {
if ( slideIndex + _ . options . slidesToScroll > _ . slideCount && _ . slideCount > _ . options . slidesToShow ) {
if ( slideIndex > _ . slideCount ) {
_ . slideOffset = ( ( _ . options . slidesToShow - ( slideIndex - _ . slideCount ) ) * _ . slideWidth ) * - 1 ;
verticalOffset = ( ( _ . options . slidesToShow - ( slideIndex - _ . slideCount ) ) * verticalHeight ) * - 1 ;
} else {
_ . slideOffset = ( ( _ . slideCount % _ . options . slidesToScroll ) * _ . slideWidth ) * - 1 ;
verticalOffset = ( ( _ . slideCount % _ . options . slidesToScroll ) * verticalHeight ) * - 1 ;
}
}
}
} else {
if ( slideIndex + _ . options . slidesToShow > _ . slideCount ) {
_ . slideOffset = ( ( slideIndex + _ . options . slidesToShow ) - _ . slideCount ) * _ . slideWidth ;
verticalOffset = ( ( slideIndex + _ . options . slidesToShow ) - _ . slideCount ) * verticalHeight ;
}
}
if ( _ . slideCount <= _ . options . slidesToShow ) {
_ . slideOffset = 0 ;
verticalOffset = 0 ;
}
if ( _ . options . centerMode === true && _ . options . infinite === true ) {
_ . slideOffset += _ . slideWidth * Math . floor ( _ . options . slidesToShow / 2 ) - _ . slideWidth ;
} else if ( _ . options . centerMode === true ) {
_ . slideOffset = 0 ;
_ . slideOffset += _ . slideWidth * Math . floor ( _ . options . slidesToShow / 2 ) ;
}
if ( _ . options . vertical === false ) {
targetLeft = ( ( slideIndex * _ . slideWidth ) * - 1 ) + _ . slideOffset ;
} else {
targetLeft = ( ( slideIndex * verticalHeight ) * - 1 ) + verticalOffset ;
}
if ( _ . options . variableWidth === true ) {
if ( _ . slideCount <= _ . options . slidesToShow || _ . options . infinite === false ) {
targetSlide = _ . $slideTrack . children ( '.slick-slide' ) . eq ( slideIndex ) ;
} else {
targetSlide = _ . $slideTrack . children ( '.slick-slide' ) . eq ( slideIndex + _ . options . slidesToShow ) ;
}
targetLeft = targetSlide [ 0 ] ? targetSlide [ 0 ] . offsetLeft * - 1 : 0 ;
if ( _ . options . centerMode === true ) {
if ( _ . options . infinite === false ) {
targetSlide = _ . $slideTrack . children ( '.slick-slide' ) . eq ( slideIndex ) ;
} else {
targetSlide = _ . $slideTrack . children ( '.slick-slide' ) . eq ( slideIndex + _ . options . slidesToShow + 1 ) ;
}
targetLeft = targetSlide [ 0 ] ? targetSlide [ 0 ] . offsetLeft * - 1 : 0 ;
targetLeft += ( _ . $list . width ( ) - targetSlide . outerWidth ( ) ) / 2 ;
}
}
return targetLeft ;
} ;
Slick . prototype . getOption = Slick . prototype . slickGetOption = function ( option ) {
var _ = this ;
return _ . options [ option ] ;
} ;
Slick . prototype . getNavigableIndexes = function ( ) {
var _ = this , breakPoint = 0 , counter = 0 , indexes = [ ] , max ;
if ( _ . options . infinite === false ) {
max = _ . slideCount - _ . options . slidesToShow + 1 ;
if ( _ . options . centerMode === true ) max = _ . slideCount ;
} else {
breakPoint = _ . slideCount * - 1 ;
counter = _ . slideCount * - 1 ;
max = _ . slideCount * 2 ;
}
while ( breakPoint < max ) {
indexes . push ( breakPoint ) ;
breakPoint = counter + _ . options . slidesToScroll ;
counter += _ . options . slidesToScroll <= _ . options . slidesToShow ? _ . options . slidesToScroll : _ . options . slidesToShow ;
}
return indexes ;
} ;
Slick . prototype . getSlick = function ( ) {
return this ;
} ;
Slick . prototype . getSlideCount = function ( ) {
var _ = this , slidesTraversed , swipedSlide , centerOffset ;
centerOffset = _ . options . centerMode === true ? _ . slideWidth * Math . floor ( _ . options . slidesToShow / 2 ) : 0 ;
if ( _ . options . swipeToSlide === true ) {
_ . $slideTrack . find ( '.slick-slide' ) . each ( function ( index , slide ) {
if ( slide . offsetLeft - centerOffset + ( $ ( slide ) . outerWidth ( ) / 2 ) > ( _ . swipeLeft * - 1 ) ) {
swipedSlide = slide ;
return false ;
}
} ) ;
slidesTraversed = Math . abs ( $ ( swipedSlide ) . attr ( 'data-slick-index' ) - _ . currentSlide ) || 1 ;
return slidesTraversed ;
} else {
return _ . options . slidesToScroll ;
}
} ;
Slick . prototype . goTo = Slick . prototype . slickGoTo = function ( slide , dontAnimate ) {
var _ = this ;
_ . changeSlide ( {
data : {
message : 'index' ,
index : parseInt ( slide )
}
} , dontAnimate ) ;
} ;
Slick . prototype . init = function ( ) {
var _ = this ;
if ( ! $ ( _ . $slider ) . hasClass ( 'slick-initialized' ) ) {
$ ( _ . $slider ) . addClass ( 'slick-initialized' ) ;
_ . buildOut ( ) ;
_ . setProps ( ) ;
_ . startLoad ( ) ;
_ . loadSlider ( ) ;
_ . initializeEvents ( ) ;
_ . updateArrows ( ) ;
_ . updateDots ( ) ;
}
_ . $slider . trigger ( "init" , [ _ ] ) ;
} ;
Slick . prototype . initArrowEvents = function ( ) {
var _ = this ;
if ( _ . options . arrows === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $prevArrow . on ( 'click.slick' , {
message : 'previous'
} , _ . changeSlide ) ;
_ . $nextArrow . on ( 'click.slick' , {
message : 'next'
} , _ . changeSlide ) ;
}
} ;
Slick . prototype . initDotEvents = function ( ) {
var _ = this ;
if ( _ . options . dots === true && _ . slideCount > _ . options . slidesToShow ) {
$ ( 'li' , _ . $dots ) . on ( 'click.slick' , {
message : 'index'
} , _ . changeSlide ) ;
}
if ( _ . options . dots === true && _ . options . pauseOnDotsHover === true && _ . options . autoplay === true ) {
$ ( 'li' , _ . $dots )
. on ( 'mouseenter.slick' , function ( ) {
_ . paused = true ;
_ . autoPlayClear ( ) ;
} )
. on ( 'mouseleave.slick' , function ( ) {
_ . paused = false ;
_ . autoPlay ( ) ;
} ) ;
}
} ;
Slick . prototype . initializeEvents = function ( ) {
var _ = this ;
_ . initArrowEvents ( ) ;
_ . initDotEvents ( ) ;
_ . $list . on ( 'touchstart.slick mousedown.slick' , {
action : 'start'
} , _ . swipeHandler ) ;
_ . $list . on ( 'touchmove.slick mousemove.slick' , {
action : 'move'
} , _ . swipeHandler ) ;
_ . $list . on ( 'touchend.slick mouseup.slick' , {
action : 'end'
} , _ . swipeHandler ) ;
_ . $list . on ( 'touchcancel.slick mouseleave.slick' , {
action : 'end'
} , _ . swipeHandler ) ;
_ . $list . on ( 'click.slick' , _ . clickHandler ) ;
if ( _ . options . autoplay === true ) {
$ ( document ) . on ( _ . visibilityChange , function ( ) {
_ . visibility ( ) ;
} ) ;
if ( _ . options . pauseOnHover === true ) {
_ . $list . on ( 'mouseenter.slick' , function ( ) {
_ . paused = true ;
_ . autoPlayClear ( ) ;
} ) ;
_ . $list . on ( 'mouseleave.slick' , function ( ) {
_ . paused = false ;
_ . autoPlay ( ) ;
} ) ;
}
}
if ( _ . options . accessibility === true ) {
_ . $list . on ( 'keydown.slick' , _ . keyHandler ) ;
}
if ( _ . options . focusOnSelect === true ) {
$ ( _ . $slideTrack ) . children ( ) . on ( 'click.slick' , _ . selectHandler ) ;
}
$ ( window ) . on ( 'orientationchange.slick.slick-' + _ . instanceUid , function ( ) {
_ . checkResponsive ( ) ;
_ . setPosition ( ) ;
} ) ;
$ ( window ) . on ( 'resize.slick.slick-' + _ . instanceUid , function ( ) {
if ( $ ( window ) . width ( ) !== _ . windowWidth ) {
clearTimeout ( _ . windowDelay ) ;
_ . windowDelay = window . setTimeout ( function ( ) {
_ . windowWidth = $ ( window ) . width ( ) ;
_ . checkResponsive ( ) ;
_ . setPosition ( ) ;
} , 50 ) ;
}
} ) ;
$ ( '*[draggable!=true]' , _ . $slideTrack ) . on ( 'dragstart' , function ( e ) { e . preventDefault ( ) ; } ) ;
$ ( window ) . on ( 'load.slick.slick-' + _ . instanceUid , _ . setPosition ) ;
$ ( document ) . on ( 'ready.slick.slick-' + _ . instanceUid , _ . setPosition ) ;
} ;
Slick . prototype . initUI = function ( ) {
var _ = this ;
if ( _ . options . arrows === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $prevArrow . show ( ) ;
_ . $nextArrow . show ( ) ;
}
if ( _ . options . dots === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $dots . show ( ) ;
}
if ( _ . options . autoplay === true ) {
_ . autoPlay ( ) ;
}
} ;
Slick . prototype . keyHandler = function ( event ) {
var _ = this ;
if ( event . keyCode === 37 && _ . options . accessibility === true ) {
_ . changeSlide ( {
data : {
message : 'previous'
}
} ) ;
} else if ( event . keyCode === 39 && _ . options . accessibility === true ) {
_ . changeSlide ( {
data : {
message : 'next'
}
} ) ;
}
} ;
Slick . prototype . lazyLoad = function ( ) {
var _ = this ,
loadRange , cloneRange , rangeStart , rangeEnd ;
function loadImages ( imagesScope ) {
$ ( 'img[data-lazy]' , imagesScope ) . each ( function ( ) {
var image = $ ( this ) ,
imageSource = $ ( this ) . attr ( 'data-lazy' ) ;
image
. load ( function ( ) { image . animate ( { opacity : 1 } , 200 ) ; } )
. css ( { opacity : 0 } )
. attr ( 'src' , imageSource )
. removeAttr ( 'data-lazy' )
. removeClass ( 'slick-loading' ) ;
} ) ;
}
if ( _ . options . centerMode === true ) {
if ( _ . options . infinite === true ) {
rangeStart = _ . currentSlide + ( _ . options . slidesToShow / 2 + 1 ) ;
rangeEnd = rangeStart + _ . options . slidesToShow + 2 ;
} else {
rangeStart = Math . max ( 0 , _ . currentSlide - ( _ . options . slidesToShow / 2 + 1 ) ) ;
rangeEnd = 2 + ( _ . options . slidesToShow / 2 + 1 ) + _ . currentSlide ;
}
} else {
rangeStart = _ . options . infinite ? _ . options . slidesToShow + _ . currentSlide : _ . currentSlide ;
rangeEnd = rangeStart + _ . options . slidesToShow ;
if ( _ . options . fade === true ) {
if ( rangeStart > 0 ) rangeStart -- ;
if ( rangeEnd <= _ . slideCount ) rangeEnd ++ ;
}
}
loadRange = _ . $slider . find ( '.slick-slide' ) . slice ( rangeStart , rangeEnd ) ;
loadImages ( loadRange ) ;
if ( _ . slideCount <= _ . options . slidesToShow ) {
cloneRange = _ . $slider . find ( '.slick-slide' ) ;
loadImages ( cloneRange ) ;
} else
if ( _ . currentSlide >= _ . slideCount - _ . options . slidesToShow ) {
cloneRange = _ . $slider . find ( '.slick-cloned' ) . slice ( 0 , _ . options . slidesToShow ) ;
loadImages ( cloneRange ) ;
} else if ( _ . currentSlide === 0 ) {
cloneRange = _ . $slider . find ( '.slick-cloned' ) . slice ( _ . options . slidesToShow * - 1 ) ;
loadImages ( cloneRange ) ;
}
} ;
Slick . prototype . loadSlider = function ( ) {
var _ = this ;
_ . setPosition ( ) ;
_ . $slideTrack . css ( {
opacity : 1
} ) ;
_ . $slider . removeClass ( 'slick-loading' ) ;
_ . initUI ( ) ;
if ( _ . options . lazyLoad === 'progressive' ) {
_ . progressiveLazyLoad ( ) ;
}
} ;
Slick . prototype . next = Slick . prototype . slickNext = function ( ) {
var _ = this ;
_ . changeSlide ( {
data : {
message : 'next'
}
} ) ;
} ;
Slick . prototype . pause = Slick . prototype . slickPause = function ( ) {
var _ = this ;
_ . autoPlayClear ( ) ;
_ . paused = true ;
} ;
Slick . prototype . play = Slick . prototype . slickPlay = function ( ) {
var _ = this ;
_ . paused = false ;
_ . autoPlay ( ) ;
} ;
Slick . prototype . postSlide = function ( index ) {
var _ = this ;
_ . $slider . trigger ( "afterChange" , [ _ , index ] ) ;
_ . animating = false ;
_ . setPosition ( ) ;
_ . swipeLeft = null ;
if ( _ . options . autoplay === true && _ . paused === false ) {
_ . autoPlay ( ) ;
}
} ;
Slick . prototype . prev = Slick . prototype . slickPrev = function ( ) {
var _ = this ;
_ . changeSlide ( {
data : {
message : 'previous'
}
} ) ;
} ;
Slick . prototype . progressiveLazyLoad = function ( ) {
var _ = this ,
imgCount , targetImage ;
imgCount = $ ( 'img[data-lazy]' , _ . $slider ) . length ;
if ( imgCount > 0 ) {
targetImage = $ ( 'img[data-lazy]' , _ . $slider ) . first ( ) ;
targetImage . attr ( 'src' , targetImage . attr ( 'data-lazy' ) ) . removeClass ( 'slick-loading' ) . load ( function ( ) {
targetImage . removeAttr ( 'data-lazy' ) ;
_ . progressiveLazyLoad ( ) ;
if ( _ . options . adaptiveHeight === true ) {
_ . setPosition ( ) ;
}
} )
. error ( function ( ) {
targetImage . removeAttr ( 'data-lazy' ) ;
_ . progressiveLazyLoad ( ) ;
} ) ;
}
} ;
Slick . prototype . refresh = function ( ) {
var _ = this ,
currentSlide = _ . currentSlide ;
_ . destroy ( ) ;
$ . extend ( _ , _ . initials ) ;
_ . init ( ) ;
_ . changeSlide ( {
data : {
message : 'index' ,
index : currentSlide
}
} , true ) ;
} ;
Slick . prototype . reinit = function ( ) {
var _ = this ;
_ . $slides = _ . $slideTrack . children ( _ . options . slide ) . addClass (
'slick-slide' ) ;
_ . slideCount = _ . $slides . length ;
if ( _ . currentSlide >= _ . slideCount && _ . currentSlide !== 0 ) {
_ . currentSlide = _ . currentSlide - _ . options . slidesToScroll ;
}
if ( _ . slideCount <= _ . options . slidesToShow ) {
_ . currentSlide = 0 ;
}
_ . setProps ( ) ;
_ . setupInfinite ( ) ;
_ . buildArrows ( ) ;
_ . updateArrows ( ) ;
_ . initArrowEvents ( ) ;
_ . buildDots ( ) ;
_ . updateDots ( ) ;
_ . initDotEvents ( ) ;
if ( _ . options . focusOnSelect === true ) {
$ ( _ . $slideTrack ) . children ( ) . on ( 'click.slick' , _ . selectHandler ) ;
}
_ . setSlideClasses ( 0 ) ;
_ . setPosition ( ) ;
_ . $slider . trigger ( "reInit" , [ _ ] ) ;
} ;
Slick . prototype . removeSlide = Slick . prototype . slickRemove = function ( index , removeBefore , removeAll ) {
var _ = this ;
if ( typeof ( index ) === 'boolean' ) {
removeBefore = index ;
index = removeBefore === true ? 0 : _ . slideCount - 1 ;
} else {
index = removeBefore === true ? -- index : index ;
}
if ( _ . slideCount < 1 || index < 0 || index > _ . slideCount - 1 ) {
return false ;
}
_ . unload ( ) ;
if ( removeAll === true ) {
_ . $slideTrack . children ( ) . remove ( ) ;
} else {
_ . $slideTrack . children ( this . options . slide ) . eq ( index ) . remove ( ) ;
}
_ . $slides = _ . $slideTrack . children ( this . options . slide ) ;
_ . $slideTrack . children ( this . options . slide ) . detach ( ) ;
_ . $slideTrack . append ( _ . $slides ) ;
_ . $slidesCache = _ . $slides ;
_ . reinit ( ) ;
} ;
Slick . prototype . setCSS = function ( position ) {
var _ = this ,
positionProps = { } , x , y ;
if ( _ . options . rtl === true ) {
position = - position ;
}
x = _ . positionProp == 'left' ? Math . ceil ( position ) + 'px' : '0px' ;
y = _ . positionProp == 'top' ? Math . ceil ( position ) + 'px' : '0px' ;
positionProps [ _ . positionProp ] = position ;
if ( _ . transformsEnabled === false ) {
_ . $slideTrack . css ( positionProps ) ;
} else {
positionProps = { } ;
if ( _ . cssTransitions === false ) {
positionProps [ _ . animType ] = 'translate(' + x + ', ' + y + ')' ;
_ . $slideTrack . css ( positionProps ) ;
} else {
positionProps [ _ . animType ] = 'translate3d(' + x + ', ' + y + ', 0px)' ;
_ . $slideTrack . css ( positionProps ) ;
}
}
} ;
Slick . prototype . setDimensions = function ( ) {
var _ = this ;
if ( _ . options . vertical === false ) {
if ( _ . options . centerMode === true ) {
_ . $list . css ( {
padding : ( '0px ' + _ . options . centerPadding )
} ) ;
}
} else {
_ . $list . height ( _ . $slides . first ( ) . outerHeight ( true ) * _ . options . slidesToShow ) ;
if ( _ . options . centerMode === true ) {
_ . $list . css ( {
padding : ( _ . options . centerPadding + ' 0px' )
} ) ;
}
}
_ . listWidth = _ . $list . width ( ) ;
_ . listHeight = _ . $list . height ( ) ;
if ( _ . options . vertical === false && _ . options . variableWidth === false ) {
_ . slideWidth = Math . ceil ( _ . listWidth / _ . options . slidesToShow ) ;
_ . $slideTrack . width ( Math . ceil ( ( _ . slideWidth * _ . $slideTrack . children ( '.slick-slide' ) . length ) ) ) ;
} else if ( _ . options . variableWidth === true ) {
var trackWidth = 0 ;
_ . slideWidth = Math . ceil ( _ . listWidth / _ . options . slidesToShow ) ;
_ . $slideTrack . children ( '.slick-slide' ) . each ( function ( ) {
trackWidth += _ . listWidth ;
} ) ;
_ . $slideTrack . width ( Math . ceil ( trackWidth ) + 1 ) ;
} else {
_ . slideWidth = Math . ceil ( _ . listWidth ) ;
_ . $slideTrack . height ( Math . ceil ( ( _ . $slides . first ( ) . outerHeight ( true ) * _ . $slideTrack . children ( '.slick-slide' ) . length ) ) ) ;
}
var offset = _ . $slides . first ( ) . outerWidth ( true ) - _ . $slides . first ( ) . width ( ) ;
if ( _ . options . variableWidth === false ) _ . $slideTrack . children ( '.slick-slide' ) . width ( _ . slideWidth - offset ) ;
} ;
Slick . prototype . setFade = function ( ) {
var _ = this ,
targetLeft ;
_ . $slides . each ( function ( index , element ) {
targetLeft = ( _ . slideWidth * index ) * - 1 ;
if ( _ . options . rtl === true ) {
$ ( element ) . css ( {
position : 'relative' ,
right : targetLeft ,
top : 0 ,
zIndex : 800 ,
opacity : 0
} ) ;
} else {
$ ( element ) . css ( {
position : 'relative' ,
left : targetLeft ,
top : 0 ,
zIndex : 800 ,
opacity : 0
} ) ;
}
} ) ;
_ . $slides . eq ( _ . currentSlide ) . css ( {
zIndex : 900 ,
opacity : 1
} ) ;
} ;
Slick . prototype . setHeight = function ( ) {
var _ = this ;
if ( _ . options . slidesToShow === 1 && _ . options . adaptiveHeight === true && _ . options . vertical === false ) {
var targetHeight = _ . $slides . eq ( _ . currentSlide ) . outerHeight ( true ) ;
_ . $list . css ( 'height' , targetHeight ) ;
}
} ;
Slick . prototype . setOption = Slick . prototype . slickSetOption = function ( option , value , refresh ) {
var _ = this ;
_ . options [ option ] = value ;
if ( refresh === true ) {
_ . unload ( ) ;
_ . reinit ( ) ;
}
} ;
Slick . prototype . setPosition = function ( ) {
var _ = this ;
_ . setDimensions ( ) ;
_ . setHeight ( ) ;
if ( _ . options . fade === false ) {
_ . setCSS ( _ . getLeft ( _ . currentSlide ) ) ;
} else {
_ . setFade ( ) ;
}
_ . $slider . trigger ( "setPosition" , [ _ ] ) ;
} ;
Slick . prototype . setProps = function ( ) {
var _ = this ,
bodyStyle = document . body . style ;
_ . positionProp = _ . options . vertical === true ? 'top' : 'left' ;
if ( _ . positionProp === 'top' ) {
_ . $slider . addClass ( 'slick-vertical' ) ;
} else {
_ . $slider . removeClass ( 'slick-vertical' ) ;
}
if ( bodyStyle . WebkitTransition !== undefined ||
bodyStyle . MozTransition !== undefined ||
bodyStyle . msTransition !== undefined ) {
if ( _ . options . useCSS === true ) {
_ . cssTransitions = true ;
}
}
if ( bodyStyle . OTransform !== undefined ) {
_ . animType = 'OTransform' ;
_ . transformType = "-o-transform" ;
_ . transitionType = 'OTransition' ;
if ( bodyStyle . perspectiveProperty === undefined && bodyStyle . webkitPerspective === undefined ) _ . animType = false ;
}
if ( bodyStyle . MozTransform !== undefined ) {
_ . animType = 'MozTransform' ;
_ . transformType = "-moz-transform" ;
_ . transitionType = 'MozTransition' ;
if ( bodyStyle . perspectiveProperty === undefined && bodyStyle . MozPerspective === undefined ) _ . animType = false ;
}
if ( bodyStyle . webkitTransform !== undefined ) {
_ . animType = 'webkitTransform' ;
_ . transformType = "-webkit-transform" ;
_ . transitionType = 'webkitTransition' ;
if ( bodyStyle . perspectiveProperty === undefined && bodyStyle . webkitPerspective === undefined ) _ . animType = false ;
}
if ( bodyStyle . msTransform !== undefined ) {
_ . animType = 'msTransform' ;
_ . transformType = "-ms-transform" ;
_ . transitionType = 'msTransition' ;
if ( bodyStyle . msTransform === undefined ) _ . animType = false ;
}
if ( bodyStyle . transform !== undefined && _ . animType !== false ) {
_ . animType = 'transform' ;
_ . transformType = "transform" ;
_ . transitionType = 'transition' ;
}
_ . transformsEnabled = ( _ . animType !== null && _ . animType !== false ) ;
} ;
Slick . prototype . setSlideClasses = function ( index ) {
var _ = this ,
centerOffset , allSlides , indexOffset , remainder ;
_ . $slider . find ( '.slick-slide' ) . removeClass ( 'slick-active' ) . attr ( "aria-hidden" , "true" ) . removeClass ( 'slick-center' ) ;
allSlides = _ . $slider . find ( '.slick-slide' ) ;
if ( _ . options . centerMode === true ) {
centerOffset = Math . floor ( _ . options . slidesToShow / 2 ) ;
if ( _ . options . infinite === true ) {
if ( index >= centerOffset && index <= ( _ . slideCount - 1 ) - centerOffset ) {
_ . $slides . slice ( index - centerOffset , index + centerOffset + 1 ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
} else {
indexOffset = _ . options . slidesToShow + index ;
allSlides . slice ( indexOffset - centerOffset + 1 , indexOffset + centerOffset + 2 ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
}
if ( index === 0 ) {
allSlides . eq ( allSlides . length - 1 - _ . options . slidesToShow ) . addClass ( 'slick-center' ) ;
} else if ( index === _ . slideCount - 1 ) {
allSlides . eq ( _ . options . slidesToShow ) . addClass ( 'slick-center' ) ;
}
}
_ . $slides . eq ( index ) . addClass ( 'slick-center' ) ;
} else {
if ( index >= 0 && index <= ( _ . slideCount - _ . options . slidesToShow ) ) {
_ . $slides . slice ( index , index + _ . options . slidesToShow ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
} else if ( allSlides . length <= _ . options . slidesToShow ) {
allSlides . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
} else {
remainder = _ . slideCount % _ . options . slidesToShow ;
indexOffset = _ . options . infinite === true ? _ . options . slidesToShow + index : index ;
if ( _ . options . slidesToShow == _ . options . slidesToScroll && ( _ . slideCount - index ) < _ . options . slidesToShow ) {
allSlides . slice ( indexOffset - ( _ . options . slidesToShow - remainder ) , indexOffset + remainder ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
} else {
allSlides . slice ( indexOffset , indexOffset + _ . options . slidesToShow ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
}
}
}
if ( _ . options . lazyLoad === 'ondemand' ) {
_ . lazyLoad ( ) ;
}
} ;
Slick . prototype . setupInfinite = function ( ) {
var _ = this ,
i , slideIndex , infiniteCount ;
if ( _ . options . fade === true ) {
_ . options . centerMode = false ;
}
if ( _ . options . infinite === true && _ . options . fade === false ) {
slideIndex = null ;
if ( _ . slideCount > _ . options . slidesToShow ) {
if ( _ . options . centerMode === true ) {
infiniteCount = _ . options . slidesToShow + 1 ;
} else {
infiniteCount = _ . options . slidesToShow ;
}
for ( i = _ . slideCount ; i > ( _ . slideCount -
infiniteCount ) ; i -= 1 ) {
slideIndex = i - 1 ;
$ ( _ . $slides [ slideIndex ] ) . clone ( true ) . attr ( 'id' , '' )
. attr ( 'data-slick-index' , slideIndex - _ . slideCount )
. prependTo ( _ . $slideTrack ) . addClass ( 'slick-cloned' ) ;
}
for ( i = 0 ; i < infiniteCount ; i += 1 ) {
slideIndex = i ;
$ ( _ . $slides [ slideIndex ] ) . clone ( true ) . attr ( 'id' , '' )
. attr ( 'data-slick-index' , slideIndex + _ . slideCount )
. appendTo ( _ . $slideTrack ) . addClass ( 'slick-cloned' ) ;
}
_ . $slideTrack . find ( '.slick-cloned' ) . find ( '[id]' ) . each ( function ( ) {
$ ( this ) . attr ( 'id' , '' ) ;
} ) ;
}
}
} ;
Slick . prototype . selectHandler = function ( event ) {
var _ = this ;
var index = parseInt ( $ ( event . target ) . parents ( '.slick-slide' ) . attr ( "data-slick-index" ) ) ;
if ( ! index ) index = 0 ;
if ( _ . slideCount <= _ . options . slidesToShow ) {
_ . $slider . find ( '.slick-slide' ) . removeClass ( 'slick-active' ) . attr ( "aria-hidden" , "true" ) ;
_ . $slides . eq ( index ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
if ( _ . options . centerMode === true ) {
_ . $slider . find ( '.slick-slide' ) . removeClass ( 'slick-center' ) ;
_ . $slides . eq ( index ) . addClass ( 'slick-center' ) ;
}
_ . asNavFor ( index ) ;
return ;
}
_ . slideHandler ( index ) ;
} ;
Slick . prototype . slideHandler = function ( index , sync , dontAnimate ) {
var targetSlide , animSlide , oldSlide , slideLeft , targetLeft = null ,
_ = this ;
sync = sync || false ;
if ( _ . animating === true && _ . options . waitForAnimate === true ) {
return ;
}
if ( _ . options . fade === true && _ . currentSlide === index ) {
return ;
}
if ( _ . slideCount <= _ . options . slidesToShow ) {
return ;
}
if ( sync === false ) {
_ . asNavFor ( index ) ;
}
targetSlide = index ;
targetLeft = _ . getLeft ( targetSlide ) ;
slideLeft = _ . getLeft ( _ . currentSlide ) ;
_ . currentLeft = _ . swipeLeft === null ? slideLeft : _ . swipeLeft ;
if ( _ . options . infinite === false && _ . options . centerMode === false && ( index < 0 || index > _ . getDotCount ( ) * _ . options . slidesToScroll ) ) {
if ( _ . options . fade === false ) {
targetSlide = _ . currentSlide ;
if ( dontAnimate !== true ) {
_ . animateSlide ( slideLeft , function ( ) {
_ . postSlide ( targetSlide ) ;
} ) ;
} else {
_ . postSlide ( targetSlide ) ;
}
}
return ;
} else if ( _ . options . infinite === false && _ . options . centerMode === true && ( index < 0 || index > ( _ . slideCount - _ . options . slidesToScroll ) ) ) {
if ( _ . options . fade === false ) {
targetSlide = _ . currentSlide ;
if ( dontAnimate !== true ) {
_ . animateSlide ( slideLeft , function ( ) {
_ . postSlide ( targetSlide ) ;
} ) ;
} else {
_ . postSlide ( targetSlide ) ;
}
}
return ;
}
if ( _ . options . autoplay === true ) {
clearInterval ( _ . autoPlayTimer ) ;
}
if ( targetSlide < 0 ) {
if ( _ . slideCount % _ . options . slidesToScroll !== 0 ) {
animSlide = _ . slideCount - ( _ . slideCount % _ . options . slidesToScroll ) ;
} else {
animSlide = _ . slideCount + targetSlide ;
}
} else if ( targetSlide >= _ . slideCount ) {
if ( _ . slideCount % _ . options . slidesToScroll !== 0 ) {
animSlide = 0 ;
} else {
animSlide = targetSlide - _ . slideCount ;
}
} else {
animSlide = targetSlide ;
}
_ . animating = true ;
_ . $slider . trigger ( "beforeChange" , [ _ , _ . currentSlide , animSlide ] ) ;
oldSlide = _ . currentSlide ;
_ . currentSlide = animSlide ;
_ . setSlideClasses ( _ . currentSlide ) ;
_ . updateDots ( ) ;
_ . updateArrows ( ) ;
if ( _ . options . fade === true ) {
if ( dontAnimate !== true ) {
_ . fadeSlide ( animSlide , function ( ) {
_ . postSlide ( animSlide ) ;
} ) ;
} else {
_ . postSlide ( animSlide ) ;
}
_ . animateHeight ( ) ;
return ;
}
if ( dontAnimate !== true ) {
_ . animateSlide ( targetLeft , function ( ) {
_ . postSlide ( animSlide ) ;
} ) ;
} else {
_ . postSlide ( animSlide ) ;
}
} ;
Slick . prototype . startLoad = function ( ) {
var _ = this ;
if ( _ . options . arrows === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $prevArrow . hide ( ) ;
_ . $nextArrow . hide ( ) ;
}
if ( _ . options . dots === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $dots . hide ( ) ;
}
_ . $slider . addClass ( 'slick-loading' ) ;
} ;
Slick . prototype . swipeDirection = function ( ) {
var xDist , yDist , r , swipeAngle , _ = this ;
xDist = _ . touchObject . startX - _ . touchObject . curX ;
yDist = _ . touchObject . startY - _ . touchObject . curY ;
r = Math . atan2 ( yDist , xDist ) ;
swipeAngle = Math . round ( r * 180 / Math . PI ) ;
if ( swipeAngle < 0 ) {
swipeAngle = 360 - Math . abs ( swipeAngle ) ;
}
if ( ( swipeAngle <= 45 ) && ( swipeAngle >= 0 ) ) {
return ( _ . options . rtl === false ? 'left' : 'right' ) ;
}
if ( ( swipeAngle <= 360 ) && ( swipeAngle >= 315 ) ) {
return ( _ . options . rtl === false ? 'left' : 'right' ) ;
}
if ( ( swipeAngle >= 135 ) && ( swipeAngle <= 225 ) ) {
return ( _ . options . rtl === false ? 'right' : 'left' ) ;
}
return 'vertical' ;
} ;
Slick . prototype . swipeEnd = function ( event ) {
var _ = this , slideCount ;
_ . dragging = false ;
_ . shouldClick = ( _ . touchObject . swipeLength > 10 ) ? false : true ;
if ( _ . touchObject . curX === undefined ) {
return false ;
}
if ( _ . touchObject . edgeHit === true ) {
_ . $slider . trigger ( "edge" , [ _ , _ . swipeDirection ( ) ] ) ;
}
if ( _ . touchObject . swipeLength >= _ . touchObject . minSwipe ) {
switch ( _ . swipeDirection ( ) ) {
case 'left' :
slideCount = _ . options . swipeToSlide ? _ . checkNavigable ( _ . currentSlide + _ . getSlideCount ( ) ) : _ . currentSlide + _ . getSlideCount ( ) ;
_ . slideHandler ( slideCount ) ;
_ . currentDirection = 0 ;
_ . touchObject = { } ;
_ . $slider . trigger ( "swipe" , [ _ , "left" ] ) ;
break ;
case 'right' :
slideCount = _ . options . swipeToSlide ? _ . checkNavigable ( _ . currentSlide - _ . getSlideCount ( ) ) : _ . currentSlide - _ . getSlideCount ( ) ;
_ . slideHandler ( slideCount ) ;
_ . currentDirection = 1 ;
_ . touchObject = { } ;
_ . $slider . trigger ( "swipe" , [ _ , "right" ] ) ;
break ;
}
} else {
if ( _ . touchObject . startX !== _ . touchObject . curX ) {
_ . slideHandler ( _ . currentSlide ) ;
_ . touchObject = { } ;
}
}
} ;
Slick . prototype . swipeHandler = function ( event ) {
var _ = this ;
if ( ( _ . options . swipe === false ) || ( 'ontouchend' in document && _ . options . swipe === false ) ) {
return ;
} else if ( _ . options . draggable === false && event . type . indexOf ( 'mouse' ) !== - 1 ) {
return ;
}
_ . touchObject . fingerCount = event . originalEvent && event . originalEvent . touches !== undefined ?
event . originalEvent . touches . length : 1 ;
_ . touchObject . minSwipe = _ . listWidth / _ . options
. touchThreshold ;
switch ( event . data . action ) {
case 'start' :
_ . swipeStart ( event ) ;
break ;
case 'move' :
_ . swipeMove ( event ) ;
break ;
case 'end' :
_ . swipeEnd ( event ) ;
break ;
}
} ;
Slick . prototype . swipeMove = function ( event ) {
var _ = this ,
edgeWasHit = false ,
curLeft , swipeDirection , swipeLength , positionOffset , touches ;
touches = event . originalEvent !== undefined ? event . originalEvent . touches : null ;
if ( ! _ . dragging || touches && touches . length !== 1 ) {
return false ;
}
curLeft = _ . getLeft ( _ . currentSlide ) ;
_ . touchObject . curX = touches !== undefined ? touches [ 0 ] . pageX : event . clientX ;
_ . touchObject . curY = touches !== undefined ? touches [ 0 ] . pageY : event . clientY ;
_ . touchObject . swipeLength = Math . round ( Math . sqrt (
Math . pow ( _ . touchObject . curX - _ . touchObject . startX , 2 ) ) ) ;
swipeDirection = _ . swipeDirection ( ) ;
if ( swipeDirection === 'vertical' ) {
return ;
}
if ( event . originalEvent !== undefined && _ . touchObject . swipeLength > 4 ) {
event . preventDefault ( ) ;
}
positionOffset = ( _ . options . rtl === false ? 1 : - 1 ) * ( _ . touchObject . curX > _ . touchObject . startX ? 1 : - 1 ) ;
swipeLength = _ . touchObject . swipeLength ;
_ . touchObject . edgeHit = false ;
if ( _ . options . infinite === false ) {
if ( ( _ . currentSlide === 0 && swipeDirection === "right" ) || ( _ . currentSlide >= _ . getDotCount ( ) && swipeDirection === "left" ) ) {
swipeLength = _ . touchObject . swipeLength * _ . options . edgeFriction ;
_ . touchObject . edgeHit = true ;
}
}
if ( _ . options . vertical === false ) {
_ . swipeLeft = curLeft + swipeLength * positionOffset ;
} else {
_ . swipeLeft = curLeft + ( swipeLength * ( _ . $list . height ( ) / _ . listWidth ) ) * positionOffset ;
}
if ( _ . options . fade === true || _ . options . touchMove === false ) {
return false ;
}
if ( _ . animating === true ) {
_ . swipeLeft = null ;
return false ;
}
_ . setCSS ( _ . swipeLeft ) ;
} ;
Slick . prototype . swipeStart = function ( event ) {
var _ = this ,
touches ;
if ( _ . touchObject . fingerCount !== 1 || _ . slideCount <= _ . options . slidesToShow ) {
_ . touchObject = { } ;
return false ;
}
if ( event . originalEvent !== undefined && event . originalEvent . touches !== undefined ) {
touches = event . originalEvent . touches [ 0 ] ;
}
_ . touchObject . startX = _ . touchObject . curX = touches !== undefined ? touches . pageX : event . clientX ;
_ . touchObject . startY = _ . touchObject . curY = touches !== undefined ? touches . pageY : event . clientY ;
_ . dragging = true ;
} ;
Slick . prototype . unfilterSlides = Slick . prototype . slickUnfilter = function ( ) {
var _ = this ;
if ( _ . $slidesCache !== null ) {
_ . unload ( ) ;
_ . $slideTrack . children ( this . options . slide ) . detach ( ) ;
_ . $slidesCache . appendTo ( _ . $slideTrack ) ;
_ . reinit ( ) ;
}
} ;
Slick . prototype . unload = function ( ) {
var _ = this ;
$ ( '.slick-cloned' , _ . $slider ) . remove ( ) ;
if ( _ . $dots ) {
_ . $dots . remove ( ) ;
}
if ( _ . $prevArrow && ( typeof _ . options . prevArrow !== 'object' ) ) {
_ . $prevArrow . remove ( ) ;
}
if ( _ . $nextArrow && ( typeof _ . options . nextArrow !== 'object' ) ) {
_ . $nextArrow . remove ( ) ;
}
_ . $slides . removeClass ( 'slick-slide slick-active slick-visible' ) . attr ( "aria-hidden" , "true" ) . css ( 'width' , '' ) ;
} ;
Slick . prototype . unslick = function ( ) {
var _ = this ;
_ . destroy ( ) ;
} ;
Slick . prototype . updateArrows = function ( ) {
var _ = this , centerOffset ;
centerOffset = Math . floor ( _ . options . slidesToShow / 2 ) ;
if ( _ . options . arrows === true && _ . options . infinite !==
true && _ . slideCount > _ . options . slidesToShow ) {
_ . $prevArrow . removeClass ( 'slick-disabled' ) ;
_ . $nextArrow . removeClass ( 'slick-disabled' ) ;
if ( _ . currentSlide === 0 ) {
_ . $prevArrow . addClass ( 'slick-disabled' ) ;
_ . $nextArrow . removeClass ( 'slick-disabled' ) ;
} else if ( _ . currentSlide >= _ . slideCount - _ . options . slidesToShow && _ . options . centerMode === false ) {
_ . $nextArrow . addClass ( 'slick-disabled' ) ;
_ . $prevArrow . removeClass ( 'slick-disabled' ) ;
} else if ( _ . currentSlide >= _ . slideCount - 1 && _ . options . centerMode === true ) {
_ . $nextArrow . addClass ( 'slick-disabled' ) ;
_ . $prevArrow . removeClass ( 'slick-disabled' ) ;
}
}
} ;
Slick . prototype . updateDots = function ( ) {
var _ = this ;
if ( _ . $dots !== null ) {
_ . $dots . find ( 'li' ) . removeClass ( 'slick-active' ) . attr ( "aria-hidden" , "true" ) ;
_ . $dots . find ( 'li' ) . eq ( Math . floor ( _ . currentSlide / _ . options . slidesToScroll ) ) . addClass ( 'slick-active' ) . attr ( "aria-hidden" , "false" ) ;
}
} ;
Slick . prototype . visibility = function ( ) {
var _ = this ;
if ( document [ _ . hidden ] ) {
_ . paused = true ;
_ . autoPlayClear ( ) ;
} else {
_ . paused = false ;
_ . autoPlay ( ) ;
}
} ;
$ . fn . slick = function ( ) {
var _ = this , opt = arguments [ 0 ] , args = Array . prototype . slice . call ( arguments , 1 ) , l = _ . length , i = 0 , ret ;
for ( i ; i < l ; i ++ ) {
if ( typeof opt == 'object' || typeof opt == 'undefined' )
_ [ i ] . slick = new Slick ( _ [ i ] , opt ) ;
else
ret = _ [ i ] . slick [ opt ] . apply ( _ [ i ] . slick , args ) ;
if ( typeof ret != 'undefined' ) return ret ;
}
return _ ;
} ;
$ ( function ( ) {
$ ( '[data-slick]' ) . slick ( ) ;
} ) ;
} ) ) ;
// https://github.com/ghiculescu/jekyll-table-of-contents
( function ( $ ) {
$ . fn . toc = function ( options ) {
var defaults = {
noBackToTopLinks : false ,
title : "<h2>Table of contents</h2>" ,
minimumHeaders : 3 ,
headers : "h1, h2, h3, h4, h5, h6" ,
listType : "ol" , // values: [ol|ul]
showEffect : "show" , // values: [show|slideDown|fadeIn|none]
showSpeed : "slow" // set to 0 to deactivate effect
} ,
settings = $ . extend ( defaults , options ) ;
function fixedEncodeURIComponent ( str ) {
return encodeURIComponent ( str ) . replace ( /[!"()*]/g , function ( c ) {
return "%" + c . charCodeAt ( 0 ) . toString ( 16 ) ;
} ) ;
}
var headers = $ ( settings . headers ) . filter ( function ( ) {
// get all headers with an ID
var previousSiblingName = $ ( this ) . prev ( ) . attr ( "name" ) ;
if ( ! this . id && previousSiblingName ) {
this . id = $ ( this ) . attr ( "id" , previousSiblingName . replace ( /\./g , "-" ) ) ;
}
return this . id ;
} ) , output = $ ( this ) ;
if ( ! headers . length || headers . length < settings . minimumHeaders || ! output . length ) {
return ;
}
if ( 0 === settings . showSpeed ) {
settings . showEffect = "none" ;
}
var render = {
show : function ( ) {
output . hide ( ) . html ( html ) . show ( settings . showSpeed ) ;
} ,
slideDown : function ( ) {
output . hide ( ) . html ( html ) . slideDown ( settings . showSpeed ) ;
} ,
fadeIn : function ( ) {
output . hide ( ) . html ( html ) . fadeIn ( settings . showSpeed ) ;
} ,
none : function ( ) {
output . html ( html ) ;
}
} ;
var get _level = function ( ele ) {
return parseInt ( ele . nodeName . replace ( "H" , "" ) , 10 ) ;
}
var highest _level = headers . map ( function ( _ , ele ) {
return get _level ( ele ) ;
} ) . get ( ) . sort ( ) [ 0 ] ;
var return _to _top = "<i class=\"fa fa-caret-up back-to-top\"> </i>" ;
var level = get _level ( headers [ 0 ] ) ,
this _level ,
html = "<" + settings . listType + ">" ;
headers . on ( "click" , function ( ) {
if ( ! settings . noBackToTopLinks ) {
window . location . hash = this . id ;
}
} )
. addClass ( "clickable-header" )
. each ( function ( _ , header ) {
this _level = get _level ( header ) ;
if ( ! settings . noBackToTopLinks && this _level === highest _level ) {
$ ( header ) . addClass ( "top-level-header" ) . after ( return _to _top ) ;
}
if ( this _level === level ) // same level as before; same indenting
html += "<li><a href=\"#" + fixedEncodeURIComponent ( header . id ) + "\">" + header . innerHTML + "</a>" ;
else if ( this _level <= level ) { // higher level than before; end parent ol
for ( i = this _level ; i < level ; i ++ ) {
html += "</li></" + settings . listType + ">"
}
html += "<li><a href=\"#" + fixedEncodeURIComponent ( header . id ) + "\">" + header . innerHTML + "</a>" ;
}
else if ( this _level > level ) { // lower level than before; expand the previous to contain a ol
for ( i = this _level ; i > level ; i -- ) {
html += "<" + settings . listType + "><li>"
}
html += "<a href=\"#" + fixedEncodeURIComponent ( header . id ) + "\">" + header . innerHTML + "</a>" ;
}
level = this _level ; // update for the next one
} ) ;
html += "</" + settings . listType + ">" ;
if ( ! settings . noBackToTopLinks ) {
$ ( document ) . on ( "click" , ".back-to-top" , function ( ) {
$ ( window ) . scrollTop ( 0 ) ;
window . location . hash = "" ;
return false ;
} ) ;
}
render [ settings . showEffect ] ( ) ;
} ;
} ) ( jQuery ) ;
String . format = function ( ) {
var myString = arguments [ 0 ] ;
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var regX = new RegExp ( "\\{" + ( i - 1 ) + "\\}" , "gm" ) ;
myString = myString . replace ( regX , arguments [ i ] ) ;
}
return myString ;
} ;
Date . prototype . addHours = function ( hours ) {
return new Date (
this . getFullYear ( ) ,
this . getMonth ( ) ,
this . getDate ( ) ,
this . getHours ( ) + hours ,
this . getMinutes ( ) ,
this . getSeconds ( ) ,
this . getMilliseconds ( )
) ;
} ;
window . utils = window . utils || { } ;
utils . getQueryParam = function ( name ) {
"use strict" ;
name = name . replace ( /[\[]/ , "\\[" ) . replace ( /[\]]/ , "\\]" ) ;
var regex = new RegExp ( "[\\?&]" + name + "=([^&#]*)" ) ,
results = regex . exec ( location . search ) ;
return results === null ? "" : decodeURIComponent ( results [ 1 ] . replace ( /\+/g , " " ) ) ;
} ;
utils . countOccurrences = function ( text , searchTerm ) {
text += "" ;
searchTerm += "" ;
if ( searchTerm . length <= 0 ) return text . length + 1 ;
var n = 0 , pos = 0 ;
var step = searchTerm . length ;
while ( true ) {
pos = text . indexOf ( searchTerm , pos ) ;
if ( pos >= 0 ) {
n ++ ;
pos += step ;
} else break ;
}
return ( n ) ;
} ;
window . app = window . app || { } ;
window . app . analytics = ( function ( ) {
function sendEvent ( category , action , label , value ) {
if ( ! window . ga ) {
return ;
}
try {
ga ( "send" , "event" , category , action , label , value ) ;
} catch ( ex ) { }
}
return {
sendEvent : sendEvent
} ;
} ) ( ) ;
window . app = window . app || { } ;
window . app . storage = ( function ( ) {
var prefix = "ace3_" ;
var timeToInvalidateItem = 1 ; // 1h
// gets an item from sessionStorage and checks if the time to invalidate the item is over
function getItem ( key ) {
var currentItem = window . sessionStorage . getItem ( prefix + key ) ;
if ( ! currentItem ) {
return null ;
}
currentItem = JSON . parse ( currentItem ) ;
// item is valid
if ( new Date ( currentItem . date ) . addHours ( timeToInvalidateItem ) > new Date ( ) ) {
return currentItem . item ;
}
return null ;
}
// saves an item in the sessionStorage and adds a timestamp
function setItem ( key , value ) {
var itemToSave = {
date : new Date ( ) ,
item : value
} ;
var currentItem = JSON . stringify ( itemToSave ) ;
window . sessionStorage . setItem ( prefix + key , currentItem ) ;
}
return {
getItem : getItem ,
setItem : setItem
} ;
} ) ( ) ;
window . app = window . app || { } ;
window . app . contentSearch = ( function ( $ ) {
var searchJsonUrl = "/js/search.json" ;
var storageKeyName = "searchResult" ;
var searchTermParamName = "searchTerm" ;
var _searchStartLength = 3 ;
var _maxEntriesLive = 10 ;
var _maxEntriesContent = 25 ;
var _maxDescriptionLengthLive = 80 ;
var _maxDescriptionLengthContent = 140 ;
var _searchTerm = "" ;
var _searchTermCombined = "" ;
var _timeOutID ;
var $liveSearch = $ ( "#liveSearch" ) ;
var $liveSearchField = $liveSearch . find ( ".liveSearch-field" ) ;
var $liveSearchResultList = $liveSearch . find ( ".liveSearch-result-list" ) ;
var $liveSearchButton = $liveSearch . find ( ".liveSearch-button" ) ;
//var $contentSearchButton = $liveSearch.find(".contentSearch-button");
var $contentSearchField = $liveSearch . find ( ".contentSearch-field" ) ;
var $contentSearchResultList = $ ( ".searchPage-result-list" ) ;
function init ( ) {
updateSearchFieldFromQueryParams ( ) ;
$liveSearchField . on ( "keyup" , handleLiveKeyDown ) ;
$liveSearchField . on ( "blur" , function ( ) {
setTimeout ( hideLiveResultList , 300 ) ;
} ) ;
$liveSearchButton . on ( "click" , openSearchPage ) ;
$contentSearchField . on ( "keyup" , handleContentKeyDown ) ;
//$contentSearchButton.on("click", openSearchPage);
}
/ *
===
UTIL
===
* /
function findSearchTermInArray ( response , maxEntries ) {
var results = [ ] ,
i = 0 ,
j = 0 ,
length = response . length ,
text = "" ,
multiplier = 0 ;
for ( i ; i < length ; i ++ ) {
var found = false ;
if ( results . length >= maxEntries ) {
break ;
}
var currentPage = response [ i ] ;
currentPage . value = 0 ;
var occurrences = 0 ;
for ( j = 0 ; j < 4 ; j ++ ) {
occurrences = 0 ;
switch ( j ) {
case 0 :
text = currentPage . description . toLowerCase ( ) ;
multiplier = 100 ;
break ;
case 1 :
text = currentPage . title . toLowerCase ( ) ;
multiplier = 1000 ;
break ;
case 2 :
text = currentPage . group . toLowerCase ( ) ;
multiplier = 10 ;
break ;
case 3 :
text = currentPage . content . toLowerCase ( ) ;
multiplier = 1 ;
}
if ( text . indexOf ( _searchTerm ) >= 0 || text . indexOf ( _searchTermCombined ) >= 0 ) {
found = true ;
occurrences = utils . countOccurrences ( text , _searchTerm ) ;
if ( _searchTermCombined !== _searchTerm ) {
occurrences += utils . countOccurrences ( text , _searchTermCombined ) ;
}
if ( occurrences > 0 ) {
currentPage . value += ( occurrences * multiplier ) ;
}
}
}
if ( found ) {
results . push ( currentPage ) ;
}
}
results = results . sort ( function ( x , y ) {
if ( x . value > y . value ) {
return - 1 ;
} else if ( y . value > x . value ) {
return 1 ;
} else {
return 0 ;
}
} ) ;
return results ;
}
function getSearchResults ( ) {
return $ . getJSON ( searchJsonUrl ) ;
}
function searchTermValid ( searchTerm ) {
if ( searchTerm === "" || searchTerm . length < _searchStartLength ) {
return false ;
} else {
return true ;
}
}
/ *
===
LIVE SEARCH
===
* /
function handleLiveKeyDown ( e ) {
// arrow down, arrow up
if ( e . keyCode === 38 || e . keyCode === 40 ) {
e . preventDefault ( ) ;
//navigateSearchResultsList(e.keyCode);
return false ;
}
// enter
if ( e . keyCode === 13 ) {
e . preventDefault ( ) ;
openSearchPage ( e ) ;
return false ;
}
// delays input and makes sure that only a complete search is sent
clearTimeout ( _timeOutID ) ;
_timeOutID = setTimeout ( search , 300 ) ;
}
function showLiveResultList ( results ) {
if ( ! results ) {
$liveSearchResultList . removeClass ( "hidden" ) ;
return ;
}
var i = 0 ,
length = results . length ;
var html = "" ;
for ( i ; i < length ; i ++ ) {
var currentPage = results [ i ] ;
var description = currentPage . description ;
if ( description . length > _maxDescriptionLengthLive ) {
description = description . substr ( 0 , _maxDescriptionLengthLive ) + "…"
}
html += String . format ( "<li><a href=\"{1}\">{0}<br><small>{2}</small></a></li>" , currentPage . title , currentPage . url , description ) ;
}
$liveSearchResultList . empty ( ) . append ( html ) . removeClass ( "hidden" ) ;
}
function hideLiveResultList ( ) {
$liveSearchResultList . addClass ( "hidden" ) ;
}
function search ( ) {
var term = $liveSearchField . val ( ) ;
_searchTerm = term . trim ( ) . toLowerCase ( ) ;
_searchTermCombined = _searchTerm . replace ( " " , "" ) ;
if ( ! searchTermValid ( _searchTerm ) ) {
$liveSearchResultList . empty ( ) ;
return false ;
}
startLiveSearch ( ) ;
}
function startLiveSearch ( ) {
var cachedSearchResults = app . storage . getItem ( storageKeyName ) ;
if ( ! cachedSearchResults ) {
getSearchResults ( ) . done ( function ( response ) {
app . storage . setItem ( storageKeyName , response ) ;
handleLiveSearchResult ( response ) ;
} ) ;
} else {
handleLiveSearchResult ( cachedSearchResults ) ;
}
}
function handleLiveSearchResult ( response ) {
var results = findSearchTermInArray ( response , _maxEntriesLive ) ;
app . analytics . sendEvent ( "LiveSearch" , "Search" , _searchTerm ) ;
showLiveResultList ( results ) ;
}
function openSearchPage ( e ) {
e . preventDefault ( ) ;
var searchTerm = $liveSearchField . val ( ) . trim ( ) ;
app . analytics . sendEvent ( "LiveSearch" , "OpenSearchPage" , searchTerm ) ;
document . location . href = String . format ( "search.html?{0}={1}" , searchTermParamName , encodeURIComponent ( searchTerm ) ) ;
return false ;
}
/ *
===
CONTENT SEARCH
===
* /
function handleContentKeyDown ( e ) {
// arrow down, arrow up
if ( e . keyCode === 38 || e . keyCode === 40 ) {
e . preventDefault ( ) ;
//navigateSearchResultsList(e.keyCode);
return false ;
}
// enter
if ( e . keyCode === 13 ) {
e . preventDefault ( ) ;
contentSearch ( ) ;
return false ;
}
// delays input and makes sure that only a complete search is sent
clearTimeout ( _timeOutID ) ;
_timeOutID = setTimeout ( contentSearch , 300 ) ;
}
function contentSearch ( ) {
var term = $contentSearchField . val ( ) ;
_searchTerm = term . trim ( ) . toLowerCase ( ) ;
_searchTermCombined = _searchTerm . replace ( " " , "" ) ;
if ( ! searchTermValid ( _searchTerm ) ) {
return false ;
}
startContentSearch ( ) ;
}
function updateSearchFieldFromQueryParams ( ) {
_searchTerm = utils . getQueryParam ( searchTermParamName ) ;
_searchTermCombined = _searchTerm . replace ( " " , "" ) ;
$contentSearchField . val ( _searchTerm ) ;
if ( searchTermValid ( _searchTerm ) ) {
startContentSearch ( ) ;
}
}
function startContentSearch ( ) {
var cachedSearchResults = app . storage . getItem ( storageKeyName ) ;
if ( ! cachedSearchResults ) {
getSearchResults ( ) . done ( function ( response ) {
app . storage . setItem ( storageKeyName , response ) ;
handleContentSearchResult ( response ) ;
} ) ;
} else {
handleContentSearchResult ( cachedSearchResults ) ;
}
}
function handleContentSearchResult ( response ) {
var results = findSearchTermInArray ( response , _maxEntriesContent ) ;
app . analytics . sendEvent ( "ContentSearch" , "Search" , _searchTerm ) ;
showContentResultList ( results ) ;
}
function showContentResultList ( results ) {
var i = 0 ,
length = results . length ;
var html = "" ;
for ( i ; i < length ; i ++ ) {
var currentPage = results [ i ] ;
var description = currentPage . description ;
if ( description . length > _maxDescriptionLengthContent ) {
description = description . substr ( 0 , _maxDescriptionLengthContent ) + "…"
}
html += String . format ( "<li><a href=\"{1}\">{0}</a><span class=\"additionalInfo\"><br><small><span class=\"url\">{3}</span><br><span class\"description\">{2}</small></small></span></li>" , currentPage . title , currentPage . url , description , document . location . origin + currentPage . url ) ;
}
$contentSearchResultList . empty ( ) . append ( html ) ;
}
return {
init : init
} ;
} ) ( jQuery ) ;
jQuery ( document ) . foundation ( ) ;
jQuery ( document ) . ready ( function ( ) {
var $slider = jQuery ( ".slider" ) ;
if ( $slider . length > 0 ) {
$slider . slick ( {
arrows : true ,
dots : true ,
slidesToShow : 1 ,
slidesToScroll : 1 ,
autoplay : true ,
autoplaySpeed : 6000 ,
responsive : [
{
breakpoint : 640 ,
settings : {
arrows : false
}
}
]
} ) ;
}
var $toc = jQuery ( "#toc" ) ;
if ( $toc . length > 0 ) {
$toc . toc ( {
headers : "#content h2, #content h3, #content h4, #content h5, #content h6" ,
showEffect : "none"
} ) ;
if ( $toc . html ( ) === "" ) {
jQuery ( ".js-expandToc" ) . remove ( ) ;
jQuery ( ".toc-header" ) . remove ( ) ;
}
}
2016-10-03 05:02:50 +00:00
var $tables = $ ( "#content table" ) ;
$tables . each ( function ( index , item ) {
var $table = $ ( item ) ;
$table . wrap ( "<div class=\"table-wrapper\">" )
} ) ;
2016-08-18 16:37:38 +00:00
} ) ;
window . app = window . app || { } ;
window . app . contentSearch . init ( ) ;