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
2016-12-28 08:23:08 +00:00
/ * ! p i c t u r e f i l l - v 3 . 0 . 2 - 2 0 1 6 - 0 2 - 1 2
* https : //scottjehl.github.io/picturefill/
* Copyright ( c ) 2016 https : //github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT
* /
/ * ! G e c k o - P i c t u r e - v 1 . 0
* https : //github.com/scottjehl/picturefill/tree/3.0/src/plugins/gecko-picture
* Firefox ' s early picture implementation ( prior to FF41 ) is static and does
* not react to viewport changes . This tiny module fixes this .
* /
( function ( window ) {
/*jshint eqnull:true */
var ua = navigator . userAgent ;
if ( window . HTMLPictureElement && ( ( /ecko/ ) . test ( ua ) && ua . match ( /rv\:(\d+)/ ) && RegExp . $1 < 45 ) ) {
addEventListener ( "resize" , ( function ( ) {
var timer ;
var dummySrc = document . createElement ( "source" ) ;
var fixRespimg = function ( img ) {
var source , sizes ;
var picture = img . parentNode ;
if ( picture . nodeName . toUpperCase ( ) === "PICTURE" ) {
source = dummySrc . cloneNode ( ) ;
picture . insertBefore ( source , picture . firstElementChild ) ;
setTimeout ( function ( ) {
picture . removeChild ( source ) ;
} ) ;
} else if ( ! img . _pfLastSize || img . offsetWidth > img . _pfLastSize ) {
img . _pfLastSize = img . offsetWidth ;
sizes = img . sizes ;
img . sizes += ",100vw" ;
setTimeout ( function ( ) {
img . sizes = sizes ;
} ) ;
}
} ;
var findPictureImgs = function ( ) {
var i ;
var imgs = document . querySelectorAll ( "picture > img, img[srcset][sizes]" ) ;
for ( i = 0 ; i < imgs . length ; i ++ ) {
fixRespimg ( imgs [ i ] ) ;
}
} ;
var onResize = function ( ) {
clearTimeout ( timer ) ;
timer = setTimeout ( findPictureImgs , 99 ) ;
} ;
var mq = window . matchMedia && matchMedia ( "(orientation: landscape)" ) ;
var init = function ( ) {
onResize ( ) ;
if ( mq && mq . addListener ) {
mq . addListener ( onResize ) ;
}
} ;
dummySrc . srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" ;
if ( /^[c|i]|d$/ . test ( document . readyState || "" ) ) {
init ( ) ;
} else {
document . addEventListener ( "DOMContentLoaded" , init ) ;
}
return onResize ;
} ) ( ) ) ;
}
} ) ( window ) ;
/ * ! P i c t u r e f i l l - v 3 . 0 . 2
* http : //scottjehl.github.io/picturefill
* Copyright ( c ) 2015 https : //github.com/scottjehl/picturefill/blob/master/Authors.txt;
* License : MIT
* /
( function ( window , document , undefined ) {
// Enable strict mode
"use strict" ;
// HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround)
document . createElement ( "picture" ) ;
var warn , eminpx , alwaysCheckWDescriptor , evalId ;
// local object for method references and testing exposure
var pf = { } ;
var isSupportTestReady = false ;
var noop = function ( ) {
} ;
var image = document . createElement ( "img" ) ;
var getImgAttr = image . getAttribute ;
var setImgAttr = image . setAttribute ;
var removeImgAttr = image . removeAttribute ;
var docElem = document . documentElement ;
var types = { } ;
var cfg = {
//resource selection:
algorithm : ""
} ;
var srcAttr = "data-pfsrc" ;
var srcsetAttr = srcAttr + "set" ;
// ua sniffing is done for undetectable img loading features,
// to do some non crucial perf optimizations
var ua = navigator . userAgent ;
var supportAbort = ( /rident/ ) . test ( ua ) || ( ( /ecko/ ) . test ( ua ) && ua . match ( /rv\:(\d+)/ ) && RegExp . $1 > 35 ) ;
var curSrcProp = "currentSrc" ;
var regWDesc = /\s+\+?\d+(e\d+)?w/ ;
var regSize = /(\([^)]+\))?\s*(.+)/ ;
var setOptions = window . picturefillCFG ;
/ * *
* Shortcut property for https : //w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests )
* /
// baseStyle also used by getEmValue (i.e.: width: 1em is important)
var baseStyle = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)" ;
var fsCss = "font-size:100%!important;" ;
var isVwDirty = true ;
var cssCache = { } ;
var sizeLengthCache = { } ;
var DPR = window . devicePixelRatio ;
var units = {
px : 1 ,
"in" : 96
} ;
var anchor = document . createElement ( "a" ) ;
/ * *
* alreadyRun flag used for setOptions . is it true setOptions will reevaluate
* @ type { boolean }
* /
var alreadyRun = false ;
// Reusable, non-"g" Regexes
// (Don't use \s, to avoid matching non-breaking space.)
var regexLeadingSpaces = /^[ \t\n\r\u000c]+/ ,
regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/ ,
regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/ ,
regexTrailingCommas = /[,]+$/ ,
regexNonNegativeInteger = /^\d+$/ ,
// ( Positive or negative or unsigned integers or decimals, without or without exponents.
// Must include at least one digit.
// According to spec tests any decimal point must be followed by a digit.
// No leading plus sign is allowed.)
// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number
regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/ ;
var on = function ( obj , evt , fn , capture ) {
if ( obj . addEventListener ) {
obj . addEventListener ( evt , fn , capture || false ) ;
} else if ( obj . attachEvent ) {
obj . attachEvent ( "on" + evt , fn ) ;
}
} ;
/ * *
* simple memoize function :
* /
var memoize = function ( fn ) {
var cache = { } ;
return function ( input ) {
if ( ! ( input in cache ) ) {
cache [ input ] = fn ( input ) ;
}
return cache [ input ] ;
} ;
} ;
// UTILITY FUNCTIONS
// Manual is faster than RegEx
// http://jsperf.com/whitespace-character/5
function isSpace ( c ) {
return ( c === "\u0020" || // space
c === "\u0009" || // horizontal tab
c === "\u000A" || // new line
c === "\u000C" || // form feed
c === "\u000D" ) ; // carriage return
}
/ * *
* gets a mediaquery and returns a boolean or gets a css length and returns a number
* @ param css mediaqueries or css length
* @ returns { boolean | number }
*
* based on : https : //gist.github.com/jonathantneal/db4f77009b155f083738
* /
var evalCSS = ( function ( ) {
var regLength = /^([\d\.]+)(em|vw|px)$/ ;
var replace = function ( ) {
var args = arguments , index = 0 , string = args [ 0 ] ;
while ( ++ index in args ) {
string = string . replace ( args [ index ] , args [ ++ index ] ) ;
}
return string ;
} ;
var buildStr = memoize ( function ( css ) {
return "return " + replace ( ( css || "" ) . toLowerCase ( ) ,
// interpret `and`
/\band\b/g , "&&" ,
// interpret `,`
/,/g , "||" ,
// interpret `min-` as >=
/min-([a-z-\s]+):/g , "e.$1>=" ,
// interpret `max-` as <=
/max-([a-z-\s]+):/g , "e.$1<=" ,
//calc value
/calc([^)]+)/g , "($1)" ,
// interpret css values
/(\d+[\.]*[\d]*)([a-z]+)/g , "($1 * e.$2)" ,
//make eval less evil
/^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/ig , ""
) + ";" ;
} ) ;
return function ( css , length ) {
var parsedLength ;
if ( ! ( css in cssCache ) ) {
cssCache [ css ] = false ;
if ( length && ( parsedLength = css . match ( regLength ) ) ) {
cssCache [ css ] = parsedLength [ 1 ] * units [ parsedLength [ 2 ] ] ;
} else {
/*jshint evil:true */
try {
cssCache [ css ] = new Function ( "e" , buildStr ( css ) ) ( units ) ;
} catch ( e ) {
}
/*jshint evil:false */
}
}
return cssCache [ css ] ;
} ;
} ) ( ) ;
var setResolution = function ( candidate , sizesattr ) {
if ( candidate . w ) { // h = means height: || descriptor.type === 'h' do not handle yet...
candidate . cWidth = pf . calcListLength ( sizesattr || "100vw" ) ;
candidate . res = candidate . w / candidate . cWidth ;
} else {
candidate . res = candidate . d ;
}
return candidate ;
} ;
/ * *
*
* @ param opt
* /
var picturefill = function ( opt ) {
if ( ! isSupportTestReady ) {
return ;
}
var elements , i , plen ;
var options = opt || { } ;
if ( options . elements && options . elements . nodeType === 1 ) {
if ( options . elements . nodeName . toUpperCase ( ) === "IMG" ) {
options . elements = [ options . elements ] ;
} else {
options . context = options . elements ;
options . elements = null ;
}
}
elements = options . elements || pf . qsa ( ( options . context || document ) , ( options . reevaluate || options . reselect ) ? pf . sel : pf . selShort ) ;
if ( ( plen = elements . length ) ) {
pf . setupRun ( options ) ;
alreadyRun = true ;
// Loop through all elements
for ( i = 0 ; i < plen ; i ++ ) {
pf . fillImg ( elements [ i ] , options ) ;
}
pf . teardownRun ( options ) ;
}
} ;
/ * *
* outputs a warning for the developer
* @ param { message }
* @ type { Function }
* /
warn = ( window . console && console . warn ) ?
function ( message ) {
console . warn ( message ) ;
} :
noop
;
if ( ! ( curSrcProp in image ) ) {
curSrcProp = "src" ;
}
// Add support for standard mime types.
types [ "image/jpeg" ] = true ;
types [ "image/gif" ] = true ;
types [ "image/png" ] = true ;
function detectTypeSupport ( type , typeUri ) {
// based on Modernizr's lossless img-webp test
// note: asynchronous
var image = new window . Image ( ) ;
image . onerror = function ( ) {
types [ type ] = false ;
picturefill ( ) ;
} ;
image . onload = function ( ) {
types [ type ] = image . width === 1 ;
picturefill ( ) ;
} ;
image . src = typeUri ;
return "pending" ;
}
// test svg support
types [ "image/svg+xml" ] = document . implementation . hasFeature ( "http://www.w3.org/TR/SVG11/feature#Image" , "1.1" ) ;
/ * *
* updates the internal vW property with the current viewport width in px
* /
function updateMetrics ( ) {
isVwDirty = false ;
DPR = window . devicePixelRatio ;
cssCache = { } ;
sizeLengthCache = { } ;
pf . DPR = DPR || 1 ;
units . width = Math . max ( window . innerWidth || 0 , docElem . clientWidth ) ;
units . height = Math . max ( window . innerHeight || 0 , docElem . clientHeight ) ;
units . vw = units . width / 100 ;
units . vh = units . height / 100 ;
evalId = [ units . height , units . width , DPR ] . join ( "-" ) ;
units . em = pf . getEmValue ( ) ;
units . rem = units . em ;
}
function chooseLowRes ( lowerValue , higherValue , dprValue , isCached ) {
var bonusFactor , tooMuch , bonus , meanDensity ;
//experimental
if ( cfg . algorithm === "saveData" ) {
if ( lowerValue > 2.7 ) {
meanDensity = dprValue + 1 ;
} else {
tooMuch = higherValue - dprValue ;
bonusFactor = Math . pow ( lowerValue - 0.6 , 1.5 ) ;
bonus = tooMuch * bonusFactor ;
if ( isCached ) {
bonus += 0.1 * bonusFactor ;
}
meanDensity = lowerValue + bonus ;
}
} else {
meanDensity = ( dprValue > 1 ) ?
Math . sqrt ( lowerValue * higherValue ) :
lowerValue ;
}
return meanDensity > dprValue ;
}
function applyBestCandidate ( img ) {
var srcSetCandidates ;
var matchingSet = pf . getSet ( img ) ;
var evaluated = false ;
if ( matchingSet !== "pending" ) {
evaluated = evalId ;
if ( matchingSet ) {
srcSetCandidates = pf . setRes ( matchingSet ) ;
pf . applySetCandidate ( srcSetCandidates , img ) ;
}
}
img [ pf . ns ] . evaled = evaluated ;
}
function ascendingSort ( a , b ) {
return a . res - b . res ;
}
function setSrcToCur ( img , src , set ) {
var candidate ;
if ( ! set && src ) {
set = img [ pf . ns ] . sets ;
set = set && set [ set . length - 1 ] ;
}
candidate = getCandidateForSrc ( src , set ) ;
if ( candidate ) {
src = pf . makeUrl ( src ) ;
img [ pf . ns ] . curSrc = src ;
img [ pf . ns ] . curCan = candidate ;
if ( ! candidate . res ) {
setResolution ( candidate , candidate . set . sizes ) ;
}
}
return candidate ;
}
function getCandidateForSrc ( src , set ) {
var i , candidate , candidates ;
if ( src && set ) {
candidates = pf . parseSet ( set ) ;
src = pf . makeUrl ( src ) ;
for ( i = 0 ; i < candidates . length ; i ++ ) {
if ( src === pf . makeUrl ( candidates [ i ] . url ) ) {
candidate = candidates [ i ] ;
break ;
}
}
}
return candidate ;
}
function getAllSourceElements ( picture , candidates ) {
var i , len , source , srcset ;
// SPEC mismatch intended for size and perf:
// actually only source elements preceding the img should be used
// also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector
var sources = picture . getElementsByTagName ( "source" ) ;
for ( i = 0 , len = sources . length ; i < len ; i ++ ) {
source = sources [ i ] ;
source [ pf . ns ] = true ;
srcset = source . getAttribute ( "srcset" ) ;
// if source does not have a srcset attribute, skip
if ( srcset ) {
candidates . push ( {
srcset : srcset ,
media : source . getAttribute ( "media" ) ,
type : source . getAttribute ( "type" ) ,
sizes : source . getAttribute ( "sizes" )
} ) ;
}
}
}
/ * *
* Srcset Parser
* By Alex Bell | MIT License
*
* @ returns Array [ { url : _ , d : _ , w : _ , h : _ , set : _ ( ? ? ? ? ) } , ... ]
*
* Based super duper closely on the reference algorithm at :
* https : //html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute
* /
// 1. Let input be the value passed to this algorithm.
// (TO-DO : Explain what "set" argument is here. Maybe choose a more
// descriptive & more searchable name. Since passing the "set" in really has
// nothing to do with parsing proper, I would prefer this assignment eventually
// go in an external fn.)
function parseSrcset ( input , set ) {
function collectCharacters ( regEx ) {
var chars ,
match = regEx . exec ( input . substring ( pos ) ) ;
if ( match ) {
chars = match [ 0 ] ;
pos += chars . length ;
return chars ;
}
}
var inputLength = input . length ,
url ,
descriptors ,
currentDescriptor ,
state ,
c ,
// 2. Let position be a pointer into input, initially pointing at the start
// of the string.
pos = 0 ,
// 3. Let candidates be an initially empty source set.
candidates = [ ] ;
/ * *
* Adds descriptor properties to a candidate , pushes to the candidates array
* @ return undefined
* /
// (Declared outside of the while loop so that it's only created once.
// (This fn is defined before it is used, in order to pass JSHINT.
// Unfortunately this breaks the sequencing of the spec comments. :/ )
function parseDescriptors ( ) {
// 9. Descriptor parser: Let error be no.
var pError = false ,
// 10. Let width be absent.
// 11. Let density be absent.
// 12. Let future-compat-h be absent. (We're implementing it now as h)
w , d , h , i ,
candidate = { } ,
desc , lastChar , value , intVal , floatVal ;
// 13. For each descriptor in descriptors, run the appropriate set of steps
// from the following list:
for ( i = 0 ; i < descriptors . length ; i ++ ) {
desc = descriptors [ i ] ;
lastChar = desc [ desc . length - 1 ] ;
value = desc . substring ( 0 , desc . length - 1 ) ;
intVal = parseInt ( value , 10 ) ;
floatVal = parseFloat ( value ) ;
// If the descriptor consists of a valid non-negative integer followed by
// a U+0077 LATIN SMALL LETTER W character
if ( regexNonNegativeInteger . test ( value ) && ( lastChar === "w" ) ) {
// If width and density are not both absent, then let error be yes.
if ( w || d ) {
pError = true ;
}
// Apply the rules for parsing non-negative integers to the descriptor.
// If the result is zero, let error be yes.
// Otherwise, let width be the result.
if ( intVal === 0 ) {
pError = true ;
} else {
w = intVal ;
}
// If the descriptor consists of a valid floating-point number followed by
// a U+0078 LATIN SMALL LETTER X character
} else if ( regexFloatingPoint . test ( value ) && ( lastChar === "x" ) ) {
// If width, density and future-compat-h are not all absent, then let error
// be yes.
if ( w || d || h ) {
pError = true ;
}
// Apply the rules for parsing floating-point number values to the descriptor.
// If the result is less than zero, let error be yes. Otherwise, let density
// be the result.
if ( floatVal < 0 ) {
pError = true ;
} else {
d = floatVal ;
}
// If the descriptor consists of a valid non-negative integer followed by
// a U+0068 LATIN SMALL LETTER H character
} else if ( regexNonNegativeInteger . test ( value ) && ( lastChar === "h" ) ) {
// If height and density are not both absent, then let error be yes.
if ( h || d ) {
pError = true ;
}
// Apply the rules for parsing non-negative integers to the descriptor.
// If the result is zero, let error be yes. Otherwise, let future-compat-h
// be the result.
if ( intVal === 0 ) {
pError = true ;
} else {
h = intVal ;
}
// Anything else, Let error be yes.
} else {
pError = true ;
}
} // (close step 13 for loop)
// 15. If error is still no, then append a new image source to candidates whose
// URL is url, associated with a width width if not absent and a pixel
// density density if not absent. Otherwise, there is a parse error.
if ( ! pError ) {
candidate . url = url ;
if ( w ) {
candidate . w = w ;
}
if ( d ) {
candidate . d = d ;
}
if ( h ) {
candidate . h = h ;
}
if ( ! h && ! d && ! w ) {
candidate . d = 1 ;
}
if ( candidate . d === 1 ) {
set . has1x = true ;
}
candidate . set = set ;
candidates . push ( candidate ) ;
}
} // (close parseDescriptors fn)
/ * *
* Tokenizes descriptor properties prior to parsing
* Returns undefined .
* ( Again , this fn is defined before it is used , in order to pass JSHINT .
* Unfortunately this breaks the logical sequencing of the spec comments . : / )
* /
function tokenize ( ) {
// 8.1. Descriptor tokeniser: Skip whitespace
collectCharacters ( regexLeadingSpaces ) ;
// 8.2. Let current descriptor be the empty string.
currentDescriptor = "" ;
// 8.3. Let state be in descriptor.
state = "in descriptor" ;
while ( true ) {
// 8.4. Let c be the character at position.
c = input . charAt ( pos ) ;
// Do the following depending on the value of state.
// For the purpose of this step, "EOF" is a special character representing
// that position is past the end of input.
// In descriptor
if ( state === "in descriptor" ) {
// Do the following, depending on the value of c:
// Space character
// If current descriptor is not empty, append current descriptor to
// descriptors and let current descriptor be the empty string.
// Set state to after descriptor.
if ( isSpace ( c ) ) {
if ( currentDescriptor ) {
descriptors . push ( currentDescriptor ) ;
currentDescriptor = "" ;
state = "after descriptor" ;
}
// U+002C COMMA (,)
// Advance position to the next character in input. If current descriptor
// is not empty, append current descriptor to descriptors. Jump to the step
// labeled descriptor parser.
} else if ( c === "," ) {
pos += 1 ;
if ( currentDescriptor ) {
descriptors . push ( currentDescriptor ) ;
}
parseDescriptors ( ) ;
return ;
// U+0028 LEFT PARENTHESIS (()
// Append c to current descriptor. Set state to in parens.
} else if ( c === "\u0028" ) {
currentDescriptor = currentDescriptor + c ;
state = "in parens" ;
// EOF
// If current descriptor is not empty, append current descriptor to
// descriptors. Jump to the step labeled descriptor parser.
} else if ( c === "" ) {
if ( currentDescriptor ) {
descriptors . push ( currentDescriptor ) ;
}
parseDescriptors ( ) ;
return ;
// Anything else
// Append c to current descriptor.
} else {
currentDescriptor = currentDescriptor + c ;
}
// (end "in descriptor"
// In parens
} else if ( state === "in parens" ) {
// U+0029 RIGHT PARENTHESIS ())
// Append c to current descriptor. Set state to in descriptor.
if ( c === ")" ) {
currentDescriptor = currentDescriptor + c ;
state = "in descriptor" ;
// EOF
// Append current descriptor to descriptors. Jump to the step labeled
// descriptor parser.
} else if ( c === "" ) {
descriptors . push ( currentDescriptor ) ;
parseDescriptors ( ) ;
return ;
// Anything else
// Append c to current descriptor.
} else {
currentDescriptor = currentDescriptor + c ;
}
// After descriptor
} else if ( state === "after descriptor" ) {
// Do the following, depending on the value of c:
// Space character: Stay in this state.
if ( isSpace ( c ) ) {
// EOF: Jump to the step labeled descriptor parser.
} else if ( c === "" ) {
parseDescriptors ( ) ;
return ;
// Anything else
// Set state to in descriptor. Set position to the previous character in input.
} else {
state = "in descriptor" ;
pos -= 1 ;
}
}
// Advance position to the next character in input.
pos += 1 ;
// Repeat this step.
} // (close while true loop)
}
// 4. Splitting loop: Collect a sequence of characters that are space
// characters or U+002C COMMA characters. If any U+002C COMMA characters
// were collected, that is a parse error.
while ( true ) {
collectCharacters ( regexLeadingCommasOrSpaces ) ;
// 5. If position is past the end of input, return candidates and abort these steps.
if ( pos >= inputLength ) {
return candidates ; // (we're done, this is the sole return path)
}
// 6. Collect a sequence of characters that are not space characters,
// and let that be url.
url = collectCharacters ( regexLeadingNotSpaces ) ;
// 7. Let descriptors be a new empty list.
descriptors = [ ] ;
// 8. If url ends with a U+002C COMMA character (,), follow these substeps:
// (1). Remove all trailing U+002C COMMA characters from url. If this removed
// more than one character, that is a parse error.
if ( url . slice ( - 1 ) === "," ) {
url = url . replace ( regexTrailingCommas , "" ) ;
// (Jump ahead to step 9 to skip tokenization and just push the candidate).
parseDescriptors ( ) ;
// Otherwise, follow these substeps:
} else {
tokenize ( ) ;
} // (close else of step 8)
// 16. Return to the step labeled splitting loop.
} // (Close of big while loop.)
}
/ *
* Sizes Parser
*
* By Alex Bell | MIT License
*
* Non - strict but accurate and lightweight JS Parser for the string value < img sizes = "here" >
*
* Reference algorithm at :
* https : //html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute
*
* Most comments are copied in directly from the spec
* ( except for comments in parens ) .
*
* Grammar is :
* < source - size - list > = < source - size > # [ , < source - size - value > ] ? | < source - size - value >
* < source - size > = < media - condition > < source - size - value >
* < source - size - value > = < length >
* http : //www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes
*
* E . g . "(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw"
* or "(min-width: 30em), calc(30vw - 15px)" or just "30vw"
*
* Returns the first valid < css - length > with a media condition that evaluates to true ,
* or "100vw" if all valid media conditions evaluate to false .
*
* /
function parseSizes ( strValue ) {
// (Percentage CSS lengths are not allowed in this case, to avoid confusion:
// https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list
// CSS allows a single optional plus or minus sign:
// http://www.w3.org/TR/CSS2/syndata.html#numbers
// CSS is ASCII case-insensitive:
// http://www.w3.org/TR/CSS2/syndata.html#characters )
// Spec allows exponential notation for <number> type:
// http://dev.w3.org/csswg/css-values/#numbers
var regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i ;
// (This is a quick and lenient test. Because of optional unlimited-depth internal
// grouping parens and strict spacing rules, this could get very complicated.)
var regexCssCalc = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i ;
var i ;
var unparsedSizesList ;
var unparsedSizesListLength ;
var unparsedSize ;
var lastComponentValue ;
var size ;
// UTILITY FUNCTIONS
// (Toy CSS parser. The goals here are:
// 1) expansive test coverage without the weight of a full CSS parser.
// 2) Avoiding regex wherever convenient.
// Quick tests: http://jsfiddle.net/gtntL4gr/3/
// Returns an array of arrays.)
function parseComponentValues ( str ) {
var chrctr ;
var component = "" ;
var componentArray = [ ] ;
var listArray = [ ] ;
var parenDepth = 0 ;
var pos = 0 ;
var inComment = false ;
function pushComponent ( ) {
if ( component ) {
componentArray . push ( component ) ;
component = "" ;
}
}
function pushComponentArray ( ) {
if ( componentArray [ 0 ] ) {
listArray . push ( componentArray ) ;
componentArray = [ ] ;
}
}
// (Loop forwards from the beginning of the string.)
while ( true ) {
chrctr = str . charAt ( pos ) ;
if ( chrctr === "" ) { // ( End of string reached.)
pushComponent ( ) ;
pushComponentArray ( ) ;
return listArray ;
} else if ( inComment ) {
if ( ( chrctr === "*" ) && ( str [ pos + 1 ] === "/" ) ) { // (At end of a comment.)
inComment = false ;
pos += 2 ;
pushComponent ( ) ;
continue ;
} else {
pos += 1 ; // (Skip all characters inside comments.)
continue ;
}
} else if ( isSpace ( chrctr ) ) {
// (If previous character in loop was also a space, or if
// at the beginning of the string, do not add space char to
// component.)
if ( ( str . charAt ( pos - 1 ) && isSpace ( str . charAt ( pos - 1 ) ) ) || ! component ) {
pos += 1 ;
continue ;
} else if ( parenDepth === 0 ) {
pushComponent ( ) ;
pos += 1 ;
continue ;
} else {
// (Replace any space character with a plain space for legibility.)
chrctr = " " ;
}
} else if ( chrctr === "(" ) {
parenDepth += 1 ;
} else if ( chrctr === ")" ) {
parenDepth -= 1 ;
} else if ( chrctr === "," ) {
pushComponent ( ) ;
pushComponentArray ( ) ;
pos += 1 ;
continue ;
} else if ( ( chrctr === "/" ) && ( str . charAt ( pos + 1 ) === "*" ) ) {
inComment = true ;
pos += 2 ;
continue ;
}
component = component + chrctr ;
pos += 1 ;
}
}
function isValidNonNegativeSourceSizeValue ( s ) {
if ( regexCssLengthWithUnits . test ( s ) && ( parseFloat ( s ) >= 0 ) ) {
return true ;
}
if ( regexCssCalc . test ( s ) ) {
return true ;
}
// ( http://www.w3.org/TR/CSS2/syndata.html#numbers says:
// "-0 is equivalent to 0 and is not a negative number." which means that
// unitless zero and unitless negative zero must be accepted as special cases.)
if ( ( s === "0" ) || ( s === "-0" ) || ( s === "+0" ) ) {
return true ;
}
2016-08-18 16:37:38 +00:00
return false ;
}
2016-12-28 08:23:08 +00:00
// When asked to parse a sizes attribute from an element, parse a
// comma-separated list of component values from the value of the element's
// sizes attribute (or the empty string, if the attribute is absent), and let
// unparsed sizes list be the result.
// http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values
unparsedSizesList = parseComponentValues ( strValue ) ;
unparsedSizesListLength = unparsedSizesList . length ;
// For each unparsed size in unparsed sizes list:
for ( i = 0 ; i < unparsedSizesListLength ; i ++ ) {
unparsedSize = unparsedSizesList [ i ] ;
// 1. Remove all consecutive <whitespace-token>s from the end of unparsed size.
// ( parseComponentValues() already omits spaces outside of parens. )
// If unparsed size is now empty, that is a parse error; continue to the next
// iteration of this algorithm.
// ( parseComponentValues() won't push an empty array. )
// 2. If the last component value in unparsed size is a valid non-negative
// <source-size-value>, let size be its value and remove the component value
// from unparsed size. Any CSS function other than the calc() function is
// invalid. Otherwise, there is a parse error; continue to the next iteration
// of this algorithm.
// http://dev.w3.org/csswg/css-syntax/#parse-component-value
lastComponentValue = unparsedSize [ unparsedSize . length - 1 ] ;
if ( isValidNonNegativeSourceSizeValue ( lastComponentValue ) ) {
size = lastComponentValue ;
unparsedSize . pop ( ) ;
} else {
continue ;
}
// 3. Remove all consecutive <whitespace-token>s from the end of unparsed
// size. If unparsed size is now empty, return size and exit this algorithm.
// If this was not the last item in unparsed sizes list, that is a parse error.
if ( unparsedSize . length === 0 ) {
return size ;
}
// 4. Parse the remaining component values in unparsed size as a
// <media-condition>. If it does not parse correctly, or it does parse
// correctly but the <media-condition> evaluates to false, continue to the
// next iteration of this algorithm.
// (Parsing all possible compound media conditions in JS is heavy, complicated,
// and the payoff is unclear. Is there ever an situation where the
// media condition parses incorrectly but still somehow evaluates to true?
// Can we just rely on the browser/polyfill to do it?)
unparsedSize = unparsedSize . join ( " " ) ;
if ( ! ( pf . matchesMedia ( unparsedSize ) ) ) {
continue ;
}
// 5. Return size and exit this algorithm.
return size ;
}
// If the above algorithm exhausts unparsed sizes list without returning a
// size value, return 100vw.
return "100vw" ;
}
// namespace
pf . ns = ( "pf" + new Date ( ) . getTime ( ) ) . substr ( 0 , 9 ) ;
// srcset support test
pf . supSrcset = "srcset" in image ;
pf . supSizes = "sizes" in image ;
pf . supPicture = ! ! window . HTMLPictureElement ;
// UC browser does claim to support srcset and picture, but not sizes,
// this extended test reveals the browser does support nothing
if ( pf . supSrcset && pf . supPicture && ! pf . supSizes ) {
( function ( image2 ) {
image . srcset = "data:,a" ;
image2 . src = "data:,a" ;
pf . supSrcset = image . complete === image2 . complete ;
pf . supPicture = pf . supSrcset && pf . supPicture ;
} ) ( document . createElement ( "img" ) ) ;
}
// Safari9 has basic support for sizes, but does't expose the `sizes` idl attribute
if ( pf . supSrcset && ! pf . supSizes ) {
( function ( ) {
var width2 = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==" ;
var width1 = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" ;
var img = document . createElement ( "img" ) ;
var test = function ( ) {
var width = img . width ;
if ( width === 2 ) {
pf . supSizes = true ;
}
alwaysCheckWDescriptor = pf . supSrcset && ! pf . supSizes ;
isSupportTestReady = true ;
// force async
setTimeout ( picturefill ) ;
} ;
img . onload = test ;
img . onerror = test ;
img . setAttribute ( "sizes" , "9px" ) ;
img . srcset = width1 + " 1w," + width2 + " 9w" ;
img . src = width1 ;
} ) ( ) ;
} else {
isSupportTestReady = true ;
}
// using pf.qsa instead of dom traversing does scale much better,
// especially on sites mixing responsive and non-responsive images
pf . selShort = "picture>img,img[srcset]" ;
pf . sel = pf . selShort ;
pf . cfg = cfg ;
/ * *
* Shortcut property for ` devicePixelRatio ` ( for easy overriding in tests )
* /
pf . DPR = ( DPR || 1 ) ;
pf . u = units ;
// container of supported mime types that one might need to qualify before using
pf . types = types ;
pf . setSize = noop ;
/ * *
* Gets a string and returns the absolute URL
* @ param src
* @ returns { String } absolute URL
* /
pf . makeUrl = memoize ( function ( src ) {
anchor . href = src ;
return anchor . href ;
} ) ;
/ * *
* Gets a DOM element or document and a selctor and returns the found matches
* Can be extended with jQuery / Sizzle for IE7 support
* @ param context
* @ param sel
* @ returns { NodeList | Array }
* /
pf . qsa = function ( context , sel ) {
return ( "querySelector" in context ) ? context . querySelectorAll ( sel ) : [ ] ;
} ;
/ * *
* Shortcut method for matchMedia ( for easy overriding in tests )
* wether native or pf . mMQ is used will be decided lazy on first call
* @ returns { boolean }
* /
pf . matchesMedia = function ( ) {
if ( window . matchMedia && ( matchMedia ( "(min-width: 0.1em)" ) || { } ) . matches ) {
pf . matchesMedia = function ( media ) {
return ! media || ( matchMedia ( media ) . matches ) ;
} ;
} else {
pf . matchesMedia = pf . mMQ ;
}
return pf . matchesMedia . apply ( this , arguments ) ;
} ;
/ * *
* A simplified matchMedia implementation for IE8 and IE9
* handles only min - width / max - width with px or em values
* @ param media
* @ returns { boolean }
* /
pf . mMQ = function ( media ) {
return media ? evalCSS ( media ) : true ;
} ;
/ * *
* Returns the calculated length in css pixel from the given sourceSizeValue
* http : //dev.w3.org/csswg/css-values-3/#length-value
* intended Spec mismatches :
* * Does not check for invalid use of CSS functions
* * Does handle a computed length of 0 the same as a negative and therefore invalid value
* @ param sourceSizeValue
* @ returns { Number }
* /
pf . calcLength = function ( sourceSizeValue ) {
var value = evalCSS ( sourceSizeValue , true ) || false ;
if ( value < 0 ) {
value = false ;
}
return value ;
} ;
/ * *
* Takes a type string and checks if its supported
* /
pf . supportsType = function ( type ) {
return ( type ) ? types [ type ] : true ;
} ;
/ * *
* Parses a sourceSize into mediaCondition ( media ) and sourceSizeValue ( length )
* @ param sourceSizeStr
* @ returns { * }
* /
pf . parseSize = memoize ( function ( sourceSizeStr ) {
var match = ( sourceSizeStr || "" ) . match ( regSize ) ;
return {
media : match && match [ 1 ] ,
length : match && match [ 2 ]
} ;
} ) ;
pf . parseSet = function ( set ) {
if ( ! set . cands ) {
set . cands = parseSrcset ( set . srcset , set ) ;
}
return set . cands ;
} ;
/ * *
* returns 1 em in css px for html / body default size
* function taken from respondjs
* @ returns { * | number }
* /
pf . getEmValue = function ( ) {
var body ;
if ( ! eminpx && ( body = document . body ) ) {
var div = document . createElement ( "div" ) ,
originalHTMLCSS = docElem . style . cssText ,
originalBodyCSS = body . style . cssText ;
div . style . cssText = baseStyle ;
// 1em in a media query is the value of the default font size of the browser
// reset docElem and body to ensure the correct value is returned
docElem . style . cssText = fsCss ;
body . style . cssText = fsCss ;
body . appendChild ( div ) ;
eminpx = div . offsetWidth ;
body . removeChild ( div ) ;
//also update eminpx before returning
eminpx = parseFloat ( eminpx , 10 ) ;
// restore the original values
docElem . style . cssText = originalHTMLCSS ;
body . style . cssText = originalBodyCSS ;
}
return eminpx || 16 ;
} ;
/ * *
* Takes a string of sizes and returns the width in pixels as a number
* /
pf . calcListLength = function ( sourceSizeListStr ) {
// Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33%
//
// or (min-width:30em) calc(30% - 15px)
if ( ! ( sourceSizeListStr in sizeLengthCache ) || cfg . uT ) {
var winningLength = pf . calcLength ( parseSizes ( sourceSizeListStr ) ) ;
sizeLengthCache [ sourceSizeListStr ] = ! winningLength ? units . width : winningLength ;
}
return sizeLengthCache [ sourceSizeListStr ] ;
} ;
/ * *
* Takes a candidate object with a srcset property 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 , res is calculated
* /
pf . setRes = function ( set ) {
var candidates ;
if ( set ) {
candidates = pf . parseSet ( set ) ;
for ( var i = 0 , len = candidates . length ; i < len ; i ++ ) {
setResolution ( candidates [ i ] , set . sizes ) ;
}
}
return candidates ;
} ;
pf . setRes . res = setResolution ;
pf . applySetCandidate = function ( candidates , img ) {
if ( ! candidates . length ) {
return ;
}
var candidate ,
i ,
j ,
length ,
bestCandidate ,
curSrc ,
curCan ,
candidateSrc ,
abortCurSrc ;
var imageData = img [ pf . ns ] ;
var dpr = pf . DPR ;
curSrc = imageData . curSrc || img [ curSrcProp ] ;
curCan = imageData . curCan || setSrcToCur ( img , curSrc , candidates [ 0 ] . set ) ;
// if we have a current source, we might either become lazy or give this source some advantage
if ( curCan && curCan . set === candidates [ 0 ] . set ) {
// if browser can abort image request and the image has a higher pixel density than needed
// and this image isn't downloaded yet, we skip next part and try to save bandwidth
abortCurSrc = ( supportAbort && ! img . complete && curCan . res - 0.1 > dpr ) ;
if ( ! abortCurSrc ) {
curCan . cached = true ;
// if current candidate is "best", "better" or "okay",
// set it to bestCandidate
if ( curCan . res >= dpr ) {
bestCandidate = curCan ;
}
}
}
if ( ! bestCandidate ) {
candidates . sort ( ascendingSort ) ;
length = candidates . length ;
bestCandidate = candidates [ length - 1 ] ;
for ( i = 0 ; i < length ; i ++ ) {
candidate = candidates [ i ] ;
if ( candidate . res >= dpr ) {
j = i - 1 ;
// we have found the perfect candidate,
// but let's improve this a little bit with some assumptions ;-)
if ( candidates [ j ] &&
( abortCurSrc || curSrc !== pf . makeUrl ( candidate . url ) ) &&
chooseLowRes ( candidates [ j ] . res , candidate . res , dpr , candidates [ j ] . cached ) ) {
bestCandidate = candidates [ j ] ;
} else {
bestCandidate = candidate ;
}
break ;
}
}
}
if ( bestCandidate ) {
candidateSrc = pf . makeUrl ( bestCandidate . url ) ;
imageData . curSrc = candidateSrc ;
imageData . curCan = bestCandidate ;
if ( candidateSrc !== curSrc ) {
pf . setSrc ( img , bestCandidate ) ;
}
pf . setSize ( img ) ;
}
} ;
pf . setSrc = function ( img , bestCandidate ) {
var origWidth ;
img . src = bestCandidate . url ;
// although this is a specific Safari issue, we don't want to take too much different code paths
if ( bestCandidate . set . type === "image/svg+xml" ) {
origWidth = img . style . width ;
img . style . width = ( img . offsetWidth + 1 ) + "px" ;
// next line only should trigger a repaint
// if... is only done to trick dead code removal
if ( img . offsetWidth + 1 ) {
img . style . width = origWidth ;
}
}
} ;
pf . getSet = function ( img ) {
var i , set , supportsType ;
var match = false ;
var sets = img [ pf . ns ] . sets ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
for ( i = 0 ; i < sets . length && ! match ; i ++ ) {
set = sets [ i ] ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( ! set . srcset || ! pf . matchesMedia ( set . media ) || ! ( supportsType = pf . supportsType ( set . type ) ) ) {
continue ;
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( supportsType === "pending" ) {
set = supportsType ;
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
match = set ;
break ;
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
return match ;
} ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
pf . parseSets = function ( element , parent , options ) {
var srcsetAttribute , imageSet , isWDescripor , srcsetParsed ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
var hasPicture = parent && parent . nodeName . toUpperCase ( ) === "PICTURE" ;
var imageData = element [ pf . ns ] ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( imageData . src === undefined || options . src ) {
imageData . src = getImgAttr . call ( element , "src" ) ;
if ( imageData . src ) {
setImgAttr . call ( element , srcAttr , imageData . src ) ;
} else {
removeImgAttr . call ( element , srcAttr ) ;
}
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( imageData . srcset === undefined || options . srcset || ! pf . supSrcset || element . srcset ) {
srcsetAttribute = getImgAttr . call ( element , "srcset" ) ;
imageData . srcset = srcsetAttribute ;
srcsetParsed = true ;
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
imageData . sets = [ ] ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( hasPicture ) {
imageData . pic = true ;
getAllSourceElements ( parent , imageData . sets ) ;
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( imageData . srcset ) {
imageSet = {
srcset : imageData . srcset ,
sizes : getImgAttr . call ( element , "sizes" )
} ;
imageData . sets . push ( imageSet ) ;
isWDescripor = ( alwaysCheckWDescriptor || imageData . src ) && regWDesc . test ( imageData . srcset || "" ) ;
// add normal src as candidate, if source has no w descriptor
if ( ! isWDescripor && imageData . src && ! getCandidateForSrc ( imageData . src , imageSet ) && ! imageSet . has1x ) {
imageSet . srcset += ", " + imageData . src ;
imageSet . cands . push ( {
url : imageData . src ,
d : 1 ,
set : imageSet
} ) ;
}
} else if ( imageData . src ) {
imageData . sets . push ( {
srcset : imageData . src ,
sizes : null
} ) ;
}
imageData . curCan = null ;
imageData . curSrc = undefined ;
// if img has picture or the srcset was removed or has a srcset and does not support srcset at all
// or has a w descriptor (and does not support sizes) set support to false to evaluate
imageData . supported = ! ( hasPicture || ( imageSet && ! pf . supSrcset ) || ( isWDescripor && ! pf . supSizes ) ) ;
if ( srcsetParsed && pf . supSrcset && ! imageData . supported ) {
if ( srcsetAttribute ) {
setImgAttr . call ( element , srcsetAttr , srcsetAttribute ) ;
element . srcset = "" ;
} else {
removeImgAttr . call ( element , srcsetAttr ) ;
}
}
if ( imageData . supported && ! imageData . srcset && ( ( ! imageData . src && element . src ) || element . src !== pf . makeUrl ( imageData . src ) ) ) {
if ( imageData . src === null ) {
element . removeAttribute ( "src" ) ;
} else {
element . src = imageData . src ;
}
}
imageData . parsed = true ;
} ;
pf . fillImg = function ( element , options ) {
var imageData ;
var extreme = options . reselect || options . reevaluate ;
// expando for caching data on the img
if ( ! element [ pf . ns ] ) {
element [ pf . ns ] = { } ;
}
imageData = 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 ( ! extreme && imageData . evaled === evalId ) {
return ;
}
if ( ! imageData . parsed || options . reevaluate ) {
pf . parseSets ( element , element . parentNode , options ) ;
}
if ( ! imageData . supported ) {
applyBestCandidate ( element ) ;
} else {
imageData . evaled = evalId ;
}
2016-08-18 16:37:38 +00:00
} ;
2016-12-28 08:23:08 +00:00
pf . setupRun = function ( ) {
if ( ! alreadyRun || isVwDirty || ( DPR !== window . devicePixelRatio ) ) {
updateMetrics ( ) ;
}
2016-08-18 16:37:38 +00:00
} ;
2016-12-28 08:23:08 +00:00
// If picture is supported, well, that's awesome.
if ( pf . supPicture ) {
picturefill = noop ;
pf . fillImg = noop ;
} else {
// Set up picture polyfill by polling the document
( function ( ) {
var isDomReady ;
var regReady = window . attachEvent ? /d$|^c/ : /d$|^c|^i/ ;
var run = function ( ) {
var readyState = document . readyState || "" ;
timerId = setTimeout ( run , readyState === "loading" ? 200 : 999 ) ;
if ( document . body ) {
pf . fillImgs ( ) ;
isDomReady = isDomReady || regReady . test ( readyState ) ;
if ( isDomReady ) {
clearTimeout ( timerId ) ;
}
}
} ;
var timerId = setTimeout ( run , document . body ? 9 : 99 ) ;
// Also attach picturefill on resize and readystatechange
// http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html
var debounce = function ( func , wait ) {
var timeout , timestamp ;
var later = function ( ) {
var last = ( new Date ( ) ) - timestamp ;
if ( last < wait ) {
timeout = setTimeout ( later , wait - last ) ;
} else {
timeout = null ;
func ( ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
} ;
return function ( ) {
timestamp = new Date ( ) ;
if ( ! timeout ) {
timeout = setTimeout ( later , wait ) ;
}
} ;
} ;
var lastClientWidth = docElem . clientHeight ;
var onResize = function ( ) {
isVwDirty = Math . max ( window . innerWidth || 0 , docElem . clientWidth ) !== units . width || docElem . clientHeight !== lastClientWidth ;
lastClientWidth = docElem . clientHeight ;
if ( isVwDirty ) {
pf . fillImgs ( ) ;
}
} ;
on ( window , "resize" , debounce ( onResize , 99 ) ) ;
on ( document , "readystatechange" , run ) ;
} ) ( ) ;
}
pf . picturefill = picturefill ;
//use this internally for easy monkey patching/performance testing
pf . fillImgs = picturefill ;
pf . teardownRun = noop ;
/* expose methods for testing */
picturefill . _ = pf ;
window . picturefillCFG = {
pf : pf ,
push : function ( args ) {
var name = args . shift ( ) ;
if ( typeof pf [ name ] === "function" ) {
pf [ name ] . apply ( pf , args ) ;
} else {
cfg [ name ] = args [ 0 ] ;
if ( alreadyRun ) {
pf . fillImgs ( { reselect : true } ) ;
}
}
}
} ;
while ( setOptions && setOptions . length ) {
window . picturefillCFG . push ( setOptions . shift ( ) ) ;
}
/* expose picturefill */
window . picturefill = 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 ;
} ) ;
}
// IE8 evals this sync, so it must be the last thing we do
if ( ! pf . supPicture ) {
types [ "image/webp" ] = detectTypeSupport ( "image/webp" , "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==" ) ;
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
} ) ( window , document ) ;
2016-08-18 16:37:38 +00:00
/*! 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 ) ) ;
/ *
_ _ _ _
_ _ _ | ( _ ) _ _ _ | | _ _ ( _ ) _ _ _
/ __| | |/ _ _ | | / / | / _ _ |
\ _ _ \ | | ( _ _ | < _ | \ _ _ \
| _ _ _ / _ | _ | \ _ _ _ | _ | \ _ ( _ ) / | _ _ _ /
| _ _ /
2016-12-28 08:23:08 +00:00
Version : 1.6 . 0
2016-08-18 16:37:38 +00:00
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 ) {
2016-12-28 08:23:08 +00:00
var _ = this , dataSettings ;
2016-08-18 16:37:38 +00:00
_ . defaults = {
accessibility : true ,
adaptiveHeight : false ,
appendArrows : $ ( element ) ,
appendDots : $ ( element ) ,
arrows : true ,
asNavFor : null ,
2016-12-28 08:23:08 +00:00
prevArrow : '<button type="button" data-role="none" class="slick-prev" aria-label="Previous" tabindex="0" role="button">Previous</button>' ,
nextArrow : '<button type="button" data-role="none" class="slick-next" aria-label="Next" tabindex="0" role="button">Next</button>' ,
2016-08-18 16:37:38 +00:00
autoplay : false ,
autoplaySpeed : 3000 ,
centerMode : false ,
centerPadding : '50px' ,
cssEase : 'ease' ,
customPaging : function ( slider , i ) {
2016-12-28 08:23:08 +00:00
return $ ( '<button type="button" data-role="none" role="button" tabindex="0" />' ) . text ( i + 1 ) ;
2016-08-18 16:37:38 +00:00
} ,
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 ,
2016-12-28 08:23:08 +00:00
pauseOnFocus : true ,
2016-08-18 16:37:38 +00:00
pauseOnDotsHover : false ,
respondTo : 'window' ,
responsive : null ,
2016-12-28 08:23:08 +00:00
rows : 1 ,
2016-08-18 16:37:38 +00:00
rtl : false ,
slide : '' ,
2016-12-28 08:23:08 +00:00
slidesPerRow : 1 ,
2016-08-18 16:37:38 +00:00
slidesToShow : 1 ,
slidesToScroll : 1 ,
speed : 500 ,
swipe : true ,
swipeToSlide : false ,
touchMove : true ,
touchThreshold : 5 ,
useCSS : true ,
2016-12-28 08:23:08 +00:00
useTransform : true ,
2016-08-18 16:37:38 +00:00
variableWidth : false ,
vertical : false ,
2016-12-28 08:23:08 +00:00
verticalSwiping : false ,
waitForAnimate : true ,
zIndex : 1000
2016-08-18 16:37:38 +00:00
} ;
_ . 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 : { } ,
2016-12-28 08:23:08 +00:00
transformsEnabled : false ,
unslicked : false
2016-08-18 16:37:38 +00:00
} ;
$ . extend ( _ , _ . initials ) ;
_ . activeBreakpoint = null ;
_ . animType = null ;
_ . animProp = null ;
_ . breakpoints = [ ] ;
_ . breakpointSettings = [ ] ;
_ . cssTransitions = false ;
2016-12-28 08:23:08 +00:00
_ . focussed = false ;
_ . interrupted = false ;
_ . hidden = 'hidden' ;
_ . paused = true ;
2016-08-18 16:37:38 +00:00
_ . positionProp = null ;
_ . respondTo = null ;
2016-12-28 08:23:08 +00:00
_ . rowCount = 1 ;
2016-08-18 16:37:38 +00:00
_ . shouldClick = true ;
_ . $slider = $ ( element ) ;
_ . $slidesCache = null ;
_ . transformType = null ;
_ . transitionType = null ;
2016-12-28 08:23:08 +00:00
_ . visibilityChange = 'visibilitychange' ;
2016-08-18 16:37:38 +00:00
_ . windowWidth = 0 ;
_ . windowTimer = null ;
dataSettings = $ ( element ) . data ( 'slick' ) || { } ;
2016-12-28 08:23:08 +00:00
_ . options = $ . extend ( { } , _ . defaults , settings , dataSettings ) ;
2016-08-18 16:37:38 +00:00
_ . currentSlide = _ . options . initialSlide ;
_ . originalSettings = _ . options ;
2016-12-28 08:23:08 +00:00
if ( typeof document . mozHidden !== 'undefined' ) {
_ . hidden = 'mozHidden' ;
_ . visibilityChange = 'mozvisibilitychange' ;
} else if ( typeof document . webkitHidden !== 'undefined' ) {
_ . hidden = 'webkitHidden' ;
_ . visibilityChange = 'webkitvisibilitychange' ;
2016-08-18 16:37:38 +00:00
}
_ . autoPlay = $ . proxy ( _ . autoPlay , _ ) ;
_ . autoPlayClear = $ . proxy ( _ . autoPlayClear , _ ) ;
2016-12-28 08:23:08 +00:00
_ . autoPlayIterator = $ . proxy ( _ . autoPlayIterator , _ ) ;
2016-08-18 16:37:38 +00:00
_ . changeSlide = $ . proxy ( _ . changeSlide , _ ) ;
_ . clickHandler = $ . proxy ( _ . clickHandler , _ ) ;
_ . selectHandler = $ . proxy ( _ . selectHandler , _ ) ;
_ . setPosition = $ . proxy ( _ . setPosition , _ ) ;
_ . swipeHandler = $ . proxy ( _ . swipeHandler , _ ) ;
_ . dragHandler = $ . proxy ( _ . dragHandler , _ ) ;
_ . keyHandler = $ . proxy ( _ . keyHandler , _ ) ;
_ . 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]+>)[^>]*)$/ ;
2016-12-28 08:23:08 +00:00
_ . registerBreakpoints ( ) ;
_ . init ( true ) ;
2016-08-18 16:37:38 +00:00
}
return Slick ;
} ( ) ) ;
2016-12-28 08:23:08 +00:00
Slick . prototype . activateADA = function ( ) {
var _ = this ;
_ . $slideTrack . find ( '.slick-active' ) . attr ( {
'aria-hidden' : 'false'
} ) . find ( 'a, input, button, select' ) . attr ( {
'tabindex' : '0'
} ) ;
} ;
2016-08-18 16:37:38 +00:00
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 ) {
2016-12-28 08:23:08 +00:00
$ ( element ) . attr ( 'data-slick-index' , index ) ;
2016-08-18 16:37:38 +00:00
} ) ;
_ . $slidesCache = _ . $slides ;
_ . reinit ( ) ;
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . animateHeight = function ( ) {
2016-08-18 16:37:38 +00:00
var _ = this ;
2016-12-28 08:23:08 +00:00
if ( _ . options . slidesToShow === 1 && _ . options . adaptiveHeight === true && _ . options . vertical === false ) {
2016-08-18 16:37:38 +00:00
var targetHeight = _ . $slides . eq ( _ . currentSlide ) . outerHeight ( true ) ;
2016-12-28 08:23:08 +00:00
_ . $list . animate ( {
height : targetHeight
} , _ . options . speed ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . animateSlide = function ( targetLeft , callback ) {
2016-12-28 08:23:08 +00:00
var animProps = { } ,
_ = this ;
2016-08-18 16:37:38 +00:00
_ . 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 ) ;
}
}
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . getNavTarget = function ( ) {
var _ = this ,
asNavFor = _ . options . asNavFor ;
if ( asNavFor && asNavFor !== null ) {
asNavFor = $ ( asNavFor ) . not ( _ . $slider ) ;
}
return asNavFor ;
} ;
2016-08-18 16:37:38 +00:00
Slick . prototype . asNavFor = function ( index ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
asNavFor = _ . getNavTarget ( ) ;
if ( asNavFor !== null && typeof asNavFor === 'object' ) {
asNavFor . each ( function ( ) {
var target = $ ( this ) . slick ( 'getSlick' ) ;
if ( ! target . unslicked ) {
target . slideHandler ( index , true ) ;
}
} ) ;
}
2016-08-18 16:37:38 +00:00
} ;
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 ;
2016-12-28 08:23:08 +00:00
_ . autoPlayClear ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . slideCount > _ . options . slidesToShow ) {
_ . autoPlayTimer = setInterval ( _ . autoPlayIterator , _ . options . autoplaySpeed ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . autoPlayClear = function ( ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
if ( _ . autoPlayTimer ) {
clearInterval ( _ . autoPlayTimer ) ;
}
} ;
Slick . prototype . autoPlayIterator = function ( ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
slideTo = _ . currentSlide + _ . options . slidesToScroll ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( ! _ . paused && ! _ . interrupted && ! _ . focussed ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . options . infinite === false ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . direction === 1 && ( _ . currentSlide + 1 ) === ( _ . slideCount - 1 ) ) {
2016-08-18 16:37:38 +00:00
_ . direction = 0 ;
}
2016-12-28 08:23:08 +00:00
else if ( _ . direction === 0 ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
slideTo = _ . currentSlide - _ . options . slidesToScroll ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . currentSlide - 1 === 0 ) {
_ . direction = 1 ;
}
2016-08-18 16:37:38 +00:00
}
}
2016-12-28 08:23:08 +00:00
_ . slideHandler ( slideTo ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . buildArrows = function ( ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
if ( _ . options . arrows === true ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $prevArrow = $ ( _ . options . prevArrow ) . addClass ( 'slick-arrow' ) ;
_ . $nextArrow = $ ( _ . options . nextArrow ) . addClass ( 'slick-arrow' ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . slideCount > _ . options . slidesToShow ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $prevArrow . removeClass ( 'slick-hidden' ) . removeAttr ( 'aria-hidden tabindex' ) ;
_ . $nextArrow . removeClass ( 'slick-hidden' ) . removeAttr ( 'aria-hidden tabindex' ) ;
if ( _ . htmlExpr . test ( _ . options . prevArrow ) ) {
_ . $prevArrow . prependTo ( _ . options . appendArrows ) ;
}
if ( _ . htmlExpr . test ( _ . options . nextArrow ) ) {
_ . $nextArrow . appendTo ( _ . options . appendArrows ) ;
}
if ( _ . options . infinite !== true ) {
_ . $prevArrow
. addClass ( 'slick-disabled' )
. attr ( 'aria-disabled' , 'true' ) ;
}
} else {
_ . $prevArrow . add ( _ . $nextArrow )
. addClass ( 'slick-hidden' )
. attr ( {
'aria-disabled' : 'true' ,
'tabindex' : '-1'
} ) ;
2016-08-18 16:37:38 +00:00
}
}
} ;
Slick . prototype . buildDots = function ( ) {
var _ = this ,
2016-12-28 08:23:08 +00:00
i , dot ;
2016-08-18 16:37:38 +00:00
if ( _ . options . dots === true && _ . slideCount > _ . options . slidesToShow ) {
2016-12-28 08:23:08 +00:00
_ . $slider . addClass ( 'slick-dotted' ) ;
dot = $ ( '<ul />' ) . addClass ( _ . options . dotsClass ) ;
2016-08-18 16:37:38 +00:00
for ( i = 0 ; i <= _ . getDotCount ( ) ; i += 1 ) {
2016-12-28 08:23:08 +00:00
dot . append ( $ ( '<li />' ) . append ( _ . options . customPaging . call ( this , _ , i ) ) ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
_ . $dots = dot . appendTo ( _ . options . appendDots ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $dots . find ( 'li' ) . first ( ) . addClass ( 'slick-active' ) . attr ( 'aria-hidden' , 'false' ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . buildOut = function ( ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
_ . $slides =
_ . $slider
. children ( _ . options . slide + ':not(.slick-cloned)' )
. addClass ( 'slick-slide' ) ;
2016-08-18 16:37:38 +00:00
_ . slideCount = _ . $slides . length ;
_ . $slides . each ( function ( index , element ) {
2016-12-28 08:23:08 +00:00
$ ( element )
. attr ( 'data-slick-index' , index )
. data ( 'originalStyling' , $ ( element ) . attr ( 'style' ) || '' ) ;
2016-08-18 16:37:38 +00:00
} ) ;
_ . $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 ( ) ;
2016-12-28 08:23:08 +00:00
_ . setSlideClasses ( typeof _ . currentSlide === 'number' ? _ . currentSlide : 0 ) ;
2016-08-18 16:37:38 +00:00
if ( _ . options . draggable === true ) {
_ . $list . addClass ( 'draggable' ) ;
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . buildRows = function ( ) {
var _ = this , a , b , c , newSlides , numOfSlides , originalSlides , slidesPerSection ;
newSlides = document . createDocumentFragment ( ) ;
originalSlides = _ . $slider . children ( ) ;
if ( _ . options . rows > 1 ) {
slidesPerSection = _ . options . slidesPerRow * _ . options . rows ;
numOfSlides = Math . ceil (
originalSlides . length / slidesPerSection
) ;
for ( a = 0 ; a < numOfSlides ; a ++ ) {
var slide = document . createElement ( 'div' ) ;
for ( b = 0 ; b < _ . options . rows ; b ++ ) {
var row = document . createElement ( 'div' ) ;
for ( c = 0 ; c < _ . options . slidesPerRow ; c ++ ) {
var target = ( a * slidesPerSection + ( ( b * _ . options . slidesPerRow ) + c ) ) ;
if ( originalSlides . get ( target ) ) {
row . appendChild ( originalSlides . get ( target ) ) ;
}
}
slide . appendChild ( row ) ;
}
newSlides . appendChild ( slide ) ;
}
_ . $slider . empty ( ) . append ( newSlides ) ;
_ . $slider . children ( ) . children ( ) . children ( )
. css ( {
'width' : ( 100 / _ . options . slidesPerRow ) + '%' ,
'display' : 'inline-block'
} ) ;
}
} ;
Slick . prototype . checkResponsive = function ( initial , forceUpdate ) {
2016-08-18 16:37:38 +00:00
var _ = this ,
2016-12-28 08:23:08 +00:00
breakpoint , targetBreakpoint , respondToWidth , triggerBreakpoint = false ;
2016-08-18 16:37:38 +00:00
var sliderWidth = _ . $slider . width ( ) ;
var windowWidth = window . innerWidth || $ ( window ) . width ( ) ;
2016-12-28 08:23:08 +00:00
if ( _ . respondTo === 'window' ) {
respondToWidth = windowWidth ;
} else if ( _ . respondTo === 'slider' ) {
respondToWidth = sliderWidth ;
} else if ( _ . respondTo === 'min' ) {
respondToWidth = Math . min ( windowWidth , sliderWidth ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
if ( _ . options . responsive &&
_ . options . responsive . length &&
_ . options . responsive !== null ) {
2016-08-18 16:37:38 +00:00
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 ) {
2016-12-28 08:23:08 +00:00
if ( targetBreakpoint !== _ . activeBreakpoint || forceUpdate ) {
2016-08-18 16:37:38 +00:00
_ . activeBreakpoint =
targetBreakpoint ;
2016-12-28 08:23:08 +00:00
if ( _ . breakpointSettings [ targetBreakpoint ] === 'unslick' ) {
_ . unslick ( targetBreakpoint ) ;
2016-08-18 16:37:38 +00:00
} else {
_ . options = $ . extend ( { } , _ . originalSettings ,
_ . breakpointSettings [
targetBreakpoint ] ) ;
2016-12-28 08:23:08 +00:00
if ( initial === true ) {
2016-08-18 16:37:38 +00:00
_ . currentSlide = _ . options . initialSlide ;
2016-12-28 08:23:08 +00:00
}
_ . refresh ( initial ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
triggerBreakpoint = targetBreakpoint ;
2016-08-18 16:37:38 +00:00
}
} else {
_ . activeBreakpoint = targetBreakpoint ;
2016-12-28 08:23:08 +00:00
if ( _ . breakpointSettings [ targetBreakpoint ] === 'unslick' ) {
_ . unslick ( targetBreakpoint ) ;
2016-08-18 16:37:38 +00:00
} else {
_ . options = $ . extend ( { } , _ . originalSettings ,
_ . breakpointSettings [
targetBreakpoint ] ) ;
2016-12-28 08:23:08 +00:00
if ( initial === true ) {
2016-08-18 16:37:38 +00:00
_ . currentSlide = _ . options . initialSlide ;
2016-12-28 08:23:08 +00:00
}
_ . refresh ( initial ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
triggerBreakpoint = targetBreakpoint ;
2016-08-18 16:37:38 +00:00
}
} else {
if ( _ . activeBreakpoint !== null ) {
_ . activeBreakpoint = null ;
_ . options = _ . originalSettings ;
2016-12-28 08:23:08 +00:00
if ( initial === true ) {
2016-08-18 16:37:38 +00:00
_ . currentSlide = _ . options . initialSlide ;
2016-12-28 08:23:08 +00:00
}
_ . refresh ( initial ) ;
triggerBreakpoint = targetBreakpoint ;
2016-08-18 16:37:38 +00:00
}
}
2016-12-28 08:23:08 +00:00
// only trigger breakpoints during an actual break. not on initialize.
if ( ! initial && triggerBreakpoint !== false ) {
_ . $slider . trigger ( 'breakpoint' , [ _ , triggerBreakpoint ] ) ;
}
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . changeSlide = function ( event , dontAnimate ) {
var _ = this ,
2016-12-28 08:23:08 +00:00
$target = $ ( event . currentTarget ) ,
2016-08-18 16:37:38 +00:00
indexOffset , slideOffset , unevenOffset ;
// If target is a link, prevent default action.
2016-12-28 08:23:08 +00:00
if ( $target . is ( 'a' ) ) {
event . preventDefault ( ) ;
}
// If target is not the <li> element (ie: a child), find the <li>.
if ( ! $target . is ( 'li' ) ) {
$target = $target . closest ( 'li' ) ;
}
2016-08-18 16:37:38 +00:00
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 ) {
2016-12-28 08:23:08 +00:00
_ . slideHandler ( _ . currentSlide - slideOffset , false , dontAnimate ) ;
2016-08-18 16:37:38 +00:00
}
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 :
2016-12-28 08:23:08 +00:00
event . data . index || $target . index ( ) * _ . options . slidesToScroll ;
2016-08-18 16:37:38 +00:00
_ . slideHandler ( _ . checkNavigable ( index ) , false , dontAnimate ) ;
2016-12-28 08:23:08 +00:00
$target . children ( ) . trigger ( 'focus' ) ;
2016-08-18 16:37:38 +00:00
break ;
default :
return ;
}
} ;
Slick . prototype . checkNavigable = function ( index ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
navigables , prevNavigable ;
2016-08-18 16:37:38 +00:00
navigables = _ . getNavigableIndexes ( ) ;
prevNavigable = 0 ;
2016-12-28 08:23:08 +00:00
if ( index > navigables [ navigables . length - 1 ] ) {
index = navigables [ navigables . length - 1 ] ;
2016-08-18 16:37:38 +00:00
} else {
2016-12-28 08:23:08 +00:00
for ( var n in navigables ) {
if ( index < navigables [ n ] ) {
2016-08-18 16:37:38 +00:00
index = prevNavigable ;
break ;
}
prevNavigable = navigables [ n ] ;
}
}
return index ;
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . cleanUpEvents = function ( ) {
var _ = this ;
if ( _ . options . dots && _ . $dots !== null ) {
$ ( 'li' , _ . $dots )
. off ( 'click.slick' , _ . changeSlide )
. off ( 'mouseenter.slick' , $ . proxy ( _ . interrupt , _ , true ) )
. off ( 'mouseleave.slick' , $ . proxy ( _ . interrupt , _ , false ) ) ;
}
_ . $slider . off ( 'focus.slick blur.slick' ) ;
if ( _ . options . arrows === true && _ . slideCount > _ . options . slidesToShow ) {
_ . $prevArrow && _ . $prevArrow . off ( 'click.slick' , _ . changeSlide ) ;
_ . $nextArrow && _ . $nextArrow . off ( 'click.slick' , _ . changeSlide ) ;
}
_ . $list . off ( 'touchstart.slick mousedown.slick' , _ . swipeHandler ) ;
_ . $list . off ( 'touchmove.slick mousemove.slick' , _ . swipeHandler ) ;
_ . $list . off ( 'touchend.slick mouseup.slick' , _ . swipeHandler ) ;
_ . $list . off ( 'touchcancel.slick mouseleave.slick' , _ . swipeHandler ) ;
_ . $list . off ( 'click.slick' , _ . clickHandler ) ;
$ ( document ) . off ( _ . visibilityChange , _ . visibility ) ;
_ . cleanUpSlideEvents ( ) ;
if ( _ . options . accessibility === true ) {
_ . $list . off ( 'keydown.slick' , _ . keyHandler ) ;
}
if ( _ . options . focusOnSelect === true ) {
$ ( _ . $slideTrack ) . children ( ) . off ( 'click.slick' , _ . selectHandler ) ;
}
$ ( window ) . off ( 'orientationchange.slick.slick-' + _ . instanceUid , _ . orientationChange ) ;
$ ( window ) . off ( 'resize.slick.slick-' + _ . instanceUid , _ . resize ) ;
$ ( '[draggable!=true]' , _ . $slideTrack ) . off ( 'dragstart' , _ . preventDefault ) ;
$ ( window ) . off ( 'load.slick.slick-' + _ . instanceUid , _ . setPosition ) ;
$ ( document ) . off ( 'ready.slick.slick-' + _ . instanceUid , _ . setPosition ) ;
} ;
Slick . prototype . cleanUpSlideEvents = function ( ) {
var _ = this ;
_ . $list . off ( 'mouseenter.slick' , $ . proxy ( _ . interrupt , _ , true ) ) ;
_ . $list . off ( 'mouseleave.slick' , $ . proxy ( _ . interrupt , _ , false ) ) ;
} ;
Slick . prototype . cleanUpRows = function ( ) {
var _ = this , originalSlides ;
if ( _ . options . rows > 1 ) {
originalSlides = _ . $slides . children ( ) . children ( ) ;
originalSlides . removeAttr ( 'style' ) ;
_ . $slider . empty ( ) . append ( originalSlides ) ;
}
} ;
2016-08-18 16:37:38 +00:00
Slick . prototype . clickHandler = function ( event ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
if ( _ . shouldClick === false ) {
2016-08-18 16:37:38 +00:00
event . stopImmediatePropagation ( ) ;
event . stopPropagation ( ) ;
event . preventDefault ( ) ;
}
2016-12-28 08:23:08 +00:00
} ;
Slick . prototype . destroy = function ( refresh ) {
var _ = this ;
_ . autoPlayClear ( ) ;
_ . touchObject = { } ;
_ . cleanUpEvents ( ) ;
$ ( '.slick-cloned' , _ . $slider ) . detach ( ) ;
if ( _ . $dots ) {
_ . $dots . remove ( ) ;
}
if ( _ . $prevArrow && _ . $prevArrow . length ) {
_ . $prevArrow
. removeClass ( 'slick-disabled slick-arrow slick-hidden' )
. removeAttr ( 'aria-hidden aria-disabled tabindex' )
. css ( 'display' , '' ) ;
if ( _ . htmlExpr . test ( _ . options . prevArrow ) ) {
_ . $prevArrow . remove ( ) ;
}
}
if ( _ . $nextArrow && _ . $nextArrow . length ) {
_ . $nextArrow
. removeClass ( 'slick-disabled slick-arrow slick-hidden' )
. removeAttr ( 'aria-hidden aria-disabled tabindex' )
. css ( 'display' , '' ) ;
if ( _ . htmlExpr . test ( _ . options . nextArrow ) ) {
_ . $nextArrow . remove ( ) ;
}
}
if ( _ . $slides ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slides
. removeClass ( 'slick-slide slick-active slick-center slick-visible slick-current' )
. removeAttr ( 'aria-hidden' )
. removeAttr ( 'data-slick-index' )
. each ( function ( ) {
$ ( this ) . attr ( 'style' , $ ( this ) . data ( 'originalStyling' ) ) ;
} ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slideTrack . children ( this . options . slide ) . detach ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slideTrack . detach ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $list . detach ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slider . append ( _ . $slides ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
_ . cleanUpRows ( ) ;
2016-08-18 16:37:38 +00:00
_ . $slider . removeClass ( 'slick-slider' ) ;
_ . $slider . removeClass ( 'slick-initialized' ) ;
2016-12-28 08:23:08 +00:00
_ . $slider . removeClass ( 'slick-dotted' ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . unslicked = true ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( ! refresh ) {
_ . $slider . trigger ( 'destroy' , [ _ ] ) ;
}
2016-08-18 16:37:38 +00:00
} ;
Slick . prototype . disableTransition = function ( slide ) {
var _ = this ,
transition = { } ;
2016-12-28 08:23:08 +00:00
transition [ _ . transitionType ] = '' ;
2016-08-18 16:37:38 +00:00
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 ( {
2016-12-28 08:23:08 +00:00
zIndex : _ . options . zIndex
2016-08-18 16:37:38 +00:00
} ) ;
_ . $slides . eq ( slideIndex ) . animate ( {
opacity : 1
} , _ . options . speed , _ . options . easing , callback ) ;
} else {
_ . applyTransition ( slideIndex ) ;
_ . $slides . eq ( slideIndex ) . css ( {
opacity : 1 ,
2016-12-28 08:23:08 +00:00
zIndex : _ . options . zIndex
2016-08-18 16:37:38 +00:00
} ) ;
if ( callback ) {
setTimeout ( function ( ) {
_ . disableTransition ( slideIndex ) ;
callback . call ( ) ;
} , _ . options . speed ) ;
}
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . fadeSlideOut = function ( slideIndex ) {
var _ = this ;
if ( _ . cssTransitions === false ) {
_ . $slides . eq ( slideIndex ) . animate ( {
opacity : 0 ,
zIndex : _ . options . zIndex - 2
} , _ . options . speed , _ . options . easing ) ;
} else {
_ . applyTransition ( slideIndex ) ;
_ . $slides . eq ( slideIndex ) . css ( {
opacity : 0 ,
zIndex : _ . options . zIndex - 2
} ) ;
}
} ;
2016-08-18 16:37:38 +00:00
Slick . prototype . filterSlides = Slick . prototype . slickFilter = function ( filter ) {
var _ = this ;
if ( filter !== null ) {
2016-12-28 08:23:08 +00:00
_ . $slidesCache = _ . $slides ;
2016-08-18 16:37:38 +00:00
_ . unload ( ) ;
_ . $slideTrack . children ( this . options . slide ) . detach ( ) ;
_ . $slidesCache . filter ( filter ) . appendTo ( _ . $slideTrack ) ;
_ . reinit ( ) ;
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . focusHandler = function ( ) {
var _ = this ;
_ . $slider
. off ( 'focus.slick blur.slick' )
. on ( 'focus.slick blur.slick' ,
'*:not(.slick-arrow)' , function ( event ) {
event . stopImmediatePropagation ( ) ;
var $sf = $ ( this ) ;
setTimeout ( function ( ) {
if ( _ . options . pauseOnFocus ) {
_ . focussed = $sf . is ( ':focus' ) ;
_ . autoPlay ( ) ;
}
} , 0 ) ;
} ) ;
} ;
2016-08-18 16:37:38 +00:00
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 ;
2016-12-28 08:23:08 +00:00
if ( _ . options . infinite === true ) {
while ( breakPoint < _ . slideCount ) {
++ pagerQty ;
breakPoint = counter + _ . options . slidesToScroll ;
counter += _ . options . slidesToScroll <= _ . options . slidesToShow ? _ . options . slidesToScroll : _ . options . slidesToShow ;
}
2016-08-18 16:37:38 +00:00
} else if ( _ . options . centerMode === true ) {
pagerQty = _ . slideCount ;
2016-12-28 08:23:08 +00:00
} else if ( ! _ . options . asNavFor ) {
pagerQty = 1 + Math . ceil ( ( _ . slideCount - _ . options . slidesToShow ) / _ . options . slidesToScroll ) ;
} else {
while ( breakPoint < _ . slideCount ) {
2016-08-18 16:37:38 +00:00
++ pagerQty ;
2016-12-28 08:23:08 +00:00
breakPoint = counter + _ . options . slidesToScroll ;
counter += _ . options . slidesToScroll <= _ . options . slidesToShow ? _ . options . slidesToScroll : _ . options . slidesToShow ;
2016-08-18 16:37:38 +00:00
}
}
return pagerQty - 1 ;
} ;
Slick . prototype . getLeft = function ( slideIndex ) {
var _ = this ,
targetLeft ,
verticalHeight ,
verticalOffset = 0 ,
targetSlide ;
_ . slideOffset = 0 ;
2016-12-28 08:23:08 +00:00
verticalHeight = _ . $slides . first ( ) . outerHeight ( true ) ;
2016-08-18 16:37:38 +00:00
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 ) {
2016-12-28 08:23:08 +00:00
if ( slideIndex > _ . slideCount ) {
2016-08-18 16:37:38 +00:00
_ . 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 {
2016-12-28 08:23:08 +00:00
if ( slideIndex + _ . options . slidesToShow > _ . slideCount ) {
2016-08-18 16:37:38 +00:00
_ . slideOffset = ( ( slideIndex + _ . options . slidesToShow ) - _ . slideCount ) * _ . slideWidth ;
verticalOffset = ( ( slideIndex + _ . options . slidesToShow ) - _ . slideCount ) * verticalHeight ;
}
}
2016-12-28 08:23:08 +00:00
if ( _ . slideCount <= _ . options . slidesToShow ) {
2016-08-18 16:37:38 +00:00
_ . 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 ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . rtl === true ) {
if ( targetSlide [ 0 ] ) {
targetLeft = ( _ . $slideTrack . width ( ) - targetSlide [ 0 ] . offsetLeft - targetSlide . width ( ) ) * - 1 ;
} else {
targetLeft = 0 ;
}
} else {
targetLeft = targetSlide [ 0 ] ? targetSlide [ 0 ] . offsetLeft * - 1 : 0 ;
}
2016-08-18 16:37:38 +00:00
if ( _ . options . centerMode === true ) {
2016-12-28 08:23:08 +00:00
if ( _ . slideCount <= _ . options . slidesToShow || _ . options . infinite === false ) {
2016-08-18 16:37:38 +00:00
targetSlide = _ . $slideTrack . children ( '.slick-slide' ) . eq ( slideIndex ) ;
} else {
targetSlide = _ . $slideTrack . children ( '.slick-slide' ) . eq ( slideIndex + _ . options . slidesToShow + 1 ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . rtl === true ) {
if ( targetSlide [ 0 ] ) {
targetLeft = ( _ . $slideTrack . width ( ) - targetSlide [ 0 ] . offsetLeft - targetSlide . width ( ) ) * - 1 ;
} else {
targetLeft = 0 ;
}
} else {
targetLeft = targetSlide [ 0 ] ? targetSlide [ 0 ] . offsetLeft * - 1 : 0 ;
}
2016-08-18 16:37:38 +00:00
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 ( ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
breakPoint = 0 ,
counter = 0 ,
indexes = [ ] ,
max ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . options . infinite === false ) {
max = _ . slideCount ;
2016-08-18 16:37:38 +00:00
} else {
2016-12-28 08:23:08 +00:00
breakPoint = _ . options . slidesToScroll * - 1 ;
counter = _ . options . slidesToScroll * - 1 ;
2016-08-18 16:37:38 +00:00
max = _ . slideCount * 2 ;
}
2016-12-28 08:23:08 +00:00
while ( breakPoint < max ) {
2016-08-18 16:37:38 +00:00
indexes . push ( breakPoint ) ;
breakPoint = counter + _ . options . slidesToScroll ;
2016-12-28 08:23:08 +00:00
counter += _ . options . slidesToScroll <= _ . options . slidesToShow ? _ . options . slidesToScroll : _ . options . slidesToShow ;
2016-08-18 16:37:38 +00:00
}
return indexes ;
} ;
Slick . prototype . getSlick = function ( ) {
return this ;
} ;
Slick . prototype . getSlideCount = function ( ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
slidesTraversed , swipedSlide , centerOffset ;
2016-08-18 16:37:38 +00:00
centerOffset = _ . options . centerMode === true ? _ . slideWidth * Math . floor ( _ . options . slidesToShow / 2 ) : 0 ;
2016-12-28 08:23:08 +00:00
if ( _ . options . swipeToSlide === true ) {
_ . $slideTrack . find ( '.slick-slide' ) . each ( function ( index , slide ) {
2016-08-18 16:37:38 +00:00
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 ) ;
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . init = function ( creation ) {
2016-08-18 16:37:38 +00:00
var _ = this ;
if ( ! $ ( _ . $slider ) . hasClass ( 'slick-initialized' ) ) {
$ ( _ . $slider ) . addClass ( 'slick-initialized' ) ;
2016-12-28 08:23:08 +00:00
_ . buildRows ( ) ;
2016-08-18 16:37:38 +00:00
_ . buildOut ( ) ;
_ . setProps ( ) ;
_ . startLoad ( ) ;
_ . loadSlider ( ) ;
_ . initializeEvents ( ) ;
_ . updateArrows ( ) ;
_ . updateDots ( ) ;
2016-12-28 08:23:08 +00:00
_ . checkResponsive ( true ) ;
_ . focusHandler ( ) ;
}
if ( creation ) {
_ . $slider . trigger ( 'init' , [ _ ] ) ;
}
if ( _ . options . accessibility === true ) {
_ . initADA ( ) ;
}
if ( _ . options . autoplay ) {
_ . paused = false ;
_ . autoPlay ( ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
} ;
Slick . prototype . initADA = function ( ) {
var _ = this ;
_ . $slides . add ( _ . $slideTrack . find ( '.slick-cloned' ) ) . attr ( {
'aria-hidden' : 'true' ,
'tabindex' : '-1'
} ) . find ( 'a, input, button, select' ) . attr ( {
'tabindex' : '-1'
} ) ;
_ . $slideTrack . attr ( 'role' , 'listbox' ) ;
_ . $slides . not ( _ . $slideTrack . find ( '.slick-cloned' ) ) . each ( function ( i ) {
$ ( this ) . attr ( {
'role' : 'option' ,
'aria-describedby' : 'slick-slide' + _ . instanceUid + i + ''
} ) ;
} ) ;
if ( _ . $dots !== null ) {
_ . $dots . attr ( 'role' , 'tablist' ) . find ( 'li' ) . each ( function ( i ) {
$ ( this ) . attr ( {
'role' : 'presentation' ,
'aria-selected' : 'false' ,
'aria-controls' : 'navigation' + _ . instanceUid + i + '' ,
'id' : 'slick-slide' + _ . instanceUid + i + ''
} ) ;
} )
. first ( ) . attr ( 'aria-selected' , 'true' ) . end ( )
. find ( 'button' ) . attr ( 'role' , 'button' ) . end ( )
. closest ( 'div' ) . attr ( 'role' , 'toolbar' ) ;
}
_ . activateADA ( ) ;
2016-08-18 16:37:38 +00:00
} ;
Slick . prototype . initArrowEvents = function ( ) {
var _ = this ;
if ( _ . options . arrows === true && _ . slideCount > _ . options . slidesToShow ) {
2016-12-28 08:23:08 +00:00
_ . $prevArrow
. off ( 'click.slick' )
. on ( 'click.slick' , {
message : 'previous'
} , _ . changeSlide ) ;
_ . $nextArrow
. off ( 'click.slick' )
. on ( 'click.slick' , {
message : 'next'
} , _ . changeSlide ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . initDotEvents = function ( ) {
var _ = this ;
if ( _ . options . dots === true && _ . slideCount > _ . options . slidesToShow ) {
$ ( 'li' , _ . $dots ) . on ( 'click.slick' , {
message : 'index'
} , _ . changeSlide ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . dots === true && _ . options . pauseOnDotsHover === true ) {
2016-08-18 16:37:38 +00:00
$ ( 'li' , _ . $dots )
2016-12-28 08:23:08 +00:00
. on ( 'mouseenter.slick' , $ . proxy ( _ . interrupt , _ , true ) )
. on ( 'mouseleave.slick' , $ . proxy ( _ . interrupt , _ , false ) ) ;
}
} ;
Slick . prototype . initSlideEvents = function ( ) {
var _ = this ;
if ( _ . options . pauseOnHover ) {
_ . $list . on ( 'mouseenter.slick' , $ . proxy ( _ . interrupt , _ , true ) ) ;
_ . $list . on ( 'mouseleave.slick' , $ . proxy ( _ . interrupt , _ , false ) ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . initializeEvents = function ( ) {
var _ = this ;
_ . initArrowEvents ( ) ;
_ . initDotEvents ( ) ;
2016-12-28 08:23:08 +00:00
_ . initSlideEvents ( ) ;
2016-08-18 16:37:38 +00:00
_ . $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 ) ;
2016-12-28 08:23:08 +00:00
$ ( document ) . on ( _ . visibilityChange , $ . proxy ( _ . visibility , _ ) ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . options . accessibility === true ) {
2016-08-18 16:37:38 +00:00
_ . $list . on ( 'keydown.slick' , _ . keyHandler ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . focusOnSelect === true ) {
2016-08-18 16:37:38 +00:00
$ ( _ . $slideTrack ) . children ( ) . on ( 'click.slick' , _ . selectHandler ) ;
}
2016-12-28 08:23:08 +00:00
$ ( window ) . on ( 'orientationchange.slick.slick-' + _ . instanceUid , $ . proxy ( _ . orientationChange , _ ) ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
$ ( window ) . on ( 'resize.slick.slick-' + _ . instanceUid , $ . proxy ( _ . resize , _ ) ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
$ ( '[draggable!=true]' , _ . $slideTrack ) . on ( 'dragstart' , _ . preventDefault ) ;
2016-08-18 16:37:38 +00:00
$ ( 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 ( ) ;
}
} ;
Slick . prototype . keyHandler = function ( event ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
//Dont slide if the cursor is inside the form fields and arrow keys are pressed
if ( ! event . target . tagName . match ( 'TEXTAREA|INPUT|SELECT' ) ) {
if ( event . keyCode === 37 && _ . options . accessibility === true ) {
_ . changeSlide ( {
data : {
message : _ . options . rtl === true ? 'next' : 'previous'
}
} ) ;
} else if ( event . keyCode === 39 && _ . options . accessibility === true ) {
_ . changeSlide ( {
data : {
message : _ . options . rtl === true ? 'previous' : 'next'
}
} ) ;
}
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . lazyLoad = function ( ) {
var _ = this ,
loadRange , cloneRange , rangeStart , rangeEnd ;
function loadImages ( imagesScope ) {
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
$ ( 'img[data-lazy]' , imagesScope ) . each ( function ( ) {
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
var image = $ ( this ) ,
2016-12-28 08:23:08 +00:00
imageSource = $ ( this ) . attr ( 'data-lazy' ) ,
imageToLoad = document . createElement ( 'img' ) ;
imageToLoad . onload = function ( ) {
image
. animate ( { opacity : 0 } , 100 , function ( ) {
image
. attr ( 'src' , imageSource )
. animate ( { opacity : 1 } , 200 , function ( ) {
image
. removeAttr ( 'data-lazy' )
. removeClass ( 'slick-loading' ) ;
} ) ;
_ . $slider . trigger ( 'lazyLoaded' , [ _ , image , imageSource ] ) ;
} ) ;
} ;
imageToLoad . onerror = function ( ) {
image
. removeAttr ( 'data-lazy' )
. removeClass ( 'slick-loading' )
. addClass ( 'slick-lazyload-error' ) ;
_ . $slider . trigger ( 'lazyLoadError' , [ _ , image , imageSource ] ) ;
} ;
imageToLoad . src = imageSource ;
2016-08-18 16:37:38 +00:00
} ) ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
if ( _ . options . centerMode === true ) {
if ( _ . options . infinite === true ) {
2016-12-28 08:23:08 +00:00
rangeStart = _ . currentSlide + ( _ . options . slidesToShow / 2 + 1 ) ;
2016-08-18 16:37:38 +00:00
rangeEnd = rangeStart + _ . options . slidesToShow + 2 ;
} else {
2016-12-28 08:23:08 +00:00
rangeStart = Math . max ( 0 , _ . currentSlide - ( _ . options . slidesToShow / 2 + 1 ) ) ;
rangeEnd = 2 + ( _ . options . slidesToShow / 2 + 1 ) + _ . currentSlide ;
2016-08-18 16:37:38 +00:00
}
} else {
rangeStart = _ . options . infinite ? _ . options . slidesToShow + _ . currentSlide : _ . currentSlide ;
2016-12-28 08:23:08 +00:00
rangeEnd = Math . ceil ( rangeStart + _ . options . slidesToShow ) ;
if ( _ . options . fade === true ) {
if ( rangeStart > 0 ) rangeStart -- ;
if ( rangeEnd <= _ . slideCount ) rangeEnd ++ ;
2016-08-18 16:37:38 +00:00
}
}
loadRange = _ . $slider . find ( '.slick-slide' ) . slice ( rangeStart , rangeEnd ) ;
loadImages ( loadRange ) ;
2016-12-28 08:23:08 +00:00
if ( _ . slideCount <= _ . options . slidesToShow ) {
cloneRange = _ . $slider . find ( '.slick-slide' ) ;
loadImages ( cloneRange ) ;
} else
2016-08-18 16:37:38 +00:00
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 ( ) ;
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . next = Slick . prototype . slickNext = function ( ) {
var _ = this ;
_ . changeSlide ( {
data : {
message : 'next'
}
} ) ;
} ;
Slick . prototype . orientationChange = function ( ) {
var _ = this ;
_ . checkResponsive ( ) ;
_ . setPosition ( ) ;
} ;
Slick . prototype . pause = Slick . prototype . slickPause = function ( ) {
var _ = this ;
_ . autoPlayClear ( ) ;
_ . paused = true ;
} ;
Slick . prototype . play = Slick . prototype . slickPlay = function ( ) {
var _ = this ;
_ . autoPlay ( ) ;
_ . options . autoplay = true ;
_ . paused = false ;
_ . focussed = false ;
_ . interrupted = false ;
} ;
Slick . prototype . postSlide = function ( index ) {
var _ = this ;
if ( ! _ . unslicked ) {
_ . $slider . trigger ( 'afterChange' , [ _ , index ] ) ;
_ . animating = false ;
_ . setPosition ( ) ;
_ . swipeLeft = null ;
if ( _ . options . autoplay ) {
_ . autoPlay ( ) ;
}
if ( _ . options . accessibility === true ) {
_ . initADA ( ) ;
}
}
} ;
Slick . prototype . prev = Slick . prototype . slickPrev = function ( ) {
var _ = this ;
_ . changeSlide ( {
data : {
message : 'previous'
}
} ) ;
} ;
Slick . prototype . preventDefault = function ( event ) {
event . preventDefault ( ) ;
} ;
Slick . prototype . progressiveLazyLoad = function ( tryCount ) {
tryCount = tryCount || 1 ;
var _ = this ,
$imgsToLoad = $ ( 'img[data-lazy]' , _ . $slider ) ,
image ,
imageSource ,
imageToLoad ;
if ( $imgsToLoad . length ) {
image = $imgsToLoad . first ( ) ;
imageSource = image . attr ( 'data-lazy' ) ;
imageToLoad = document . createElement ( 'img' ) ;
imageToLoad . onload = function ( ) {
image
. attr ( 'src' , imageSource )
. removeAttr ( 'data-lazy' )
. removeClass ( 'slick-loading' ) ;
if ( _ . options . adaptiveHeight === true ) {
_ . setPosition ( ) ;
}
_ . $slider . trigger ( 'lazyLoaded' , [ _ , image , imageSource ] ) ;
_ . progressiveLazyLoad ( ) ;
} ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
imageToLoad . onerror = function ( ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( tryCount < 3 ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
/ * *
* try to load the image 3 times ,
* leave a slight delay so we don ' t get
* servers blocking the request .
* /
setTimeout ( function ( ) {
_ . progressiveLazyLoad ( tryCount + 1 ) ;
} , 500 ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
} else {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
image
. removeAttr ( 'data-lazy' )
. removeClass ( 'slick-loading' )
. addClass ( 'slick-lazyload-error' ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slider . trigger ( 'lazyLoadError' , [ _ , image , imageSource ] ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . progressiveLazyLoad ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
} ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
imageToLoad . src = imageSource ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
} else {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slider . trigger ( 'allImagesLoaded' , [ _ ] ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
} ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
Slick . prototype . refresh = function ( initializing ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
var _ = this , currentSlide , lastVisibleIndex ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
lastVisibleIndex = _ . slideCount - _ . options . slidesToShow ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
// in non-infinite sliders, we don't want to go past the
// last visible index.
if ( ! _ . options . infinite && ( _ . currentSlide > lastVisibleIndex ) ) {
_ . currentSlide = lastVisibleIndex ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
// if less slides than to show, go to start.
if ( _ . slideCount <= _ . options . slidesToShow ) {
_ . currentSlide = 0 ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
}
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
currentSlide = _ . currentSlide ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . destroy ( true ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
$ . extend ( _ , _ . initials , { currentSlide : currentSlide } ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . init ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( ! initializing ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . changeSlide ( {
data : {
message : 'index' ,
index : currentSlide
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
} , false ) ;
2016-08-18 16:37:38 +00:00
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . registerBreakpoints = function ( ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
var _ = this , breakpoint , currentBreakpoint , l ,
responsiveSettings = _ . options . responsive || null ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( $ . type ( responsiveSettings ) === 'array' && responsiveSettings . length ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . respondTo = _ . options . respondTo || 'window' ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
for ( breakpoint in responsiveSettings ) {
l = _ . breakpoints . length - 1 ;
currentBreakpoint = responsiveSettings [ breakpoint ] . breakpoint ;
if ( responsiveSettings . hasOwnProperty ( breakpoint ) ) {
// loop through the breakpoints and cut out any existing
// ones with the same breakpoint number, we don't want dupes.
while ( l >= 0 ) {
if ( _ . breakpoints [ l ] && _ . breakpoints [ l ] === currentBreakpoint ) {
_ . breakpoints . splice ( l , 1 ) ;
}
l -- ;
}
_ . breakpoints . push ( currentBreakpoint ) ;
_ . breakpointSettings [ currentBreakpoint ] = responsiveSettings [ breakpoint ] . settings ;
}
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
_ . breakpoints . sort ( function ( a , b ) {
return ( _ . options . mobileFirst ) ? a - b : b - a ;
} ) ;
}
2016-08-18 16:37:38 +00:00
} ;
Slick . prototype . reinit = function ( ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
_ . $slides =
_ . $slideTrack
. children ( _ . options . slide )
. addClass ( 'slick-slide' ) ;
2016-08-18 16:37:38 +00:00
_ . slideCount = _ . $slides . length ;
if ( _ . currentSlide >= _ . slideCount && _ . currentSlide !== 0 ) {
_ . currentSlide = _ . currentSlide - _ . options . slidesToScroll ;
}
if ( _ . slideCount <= _ . options . slidesToShow ) {
_ . currentSlide = 0 ;
}
2016-12-28 08:23:08 +00:00
_ . registerBreakpoints ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . setProps ( ) ;
2016-08-18 16:37:38 +00:00
_ . setupInfinite ( ) ;
_ . buildArrows ( ) ;
_ . updateArrows ( ) ;
_ . initArrowEvents ( ) ;
_ . buildDots ( ) ;
_ . updateDots ( ) ;
_ . initDotEvents ( ) ;
2016-12-28 08:23:08 +00:00
_ . cleanUpSlideEvents ( ) ;
_ . initSlideEvents ( ) ;
_ . checkResponsive ( false , true ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . options . focusOnSelect === true ) {
2016-08-18 16:37:38 +00:00
$ ( _ . $slideTrack ) . children ( ) . on ( 'click.slick' , _ . selectHandler ) ;
}
2016-12-28 08:23:08 +00:00
_ . setSlideClasses ( typeof _ . currentSlide === 'number' ? _ . currentSlide : 0 ) ;
2016-08-18 16:37:38 +00:00
_ . setPosition ( ) ;
2016-12-28 08:23:08 +00:00
_ . focusHandler ( ) ;
_ . paused = ! _ . options . autoplay ;
_ . autoPlay ( ) ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
_ . $slider . trigger ( 'reInit' , [ _ ] ) ;
2016-08-18 16:37:38 +00:00
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . resize = function ( ) {
var _ = this ;
if ( $ ( window ) . width ( ) !== _ . windowWidth ) {
clearTimeout ( _ . windowDelay ) ;
_ . windowDelay = window . setTimeout ( function ( ) {
_ . windowWidth = $ ( window ) . width ( ) ;
_ . checkResponsive ( ) ;
if ( ! _ . unslicked ) { _ . setPosition ( ) ; }
} , 50 ) ;
}
} ;
2016-08-18 16:37:38 +00:00
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 ( ) ;
2016-12-28 08:23:08 +00:00
if ( removeAll === true ) {
2016-08-18 16:37:38 +00:00
_ . $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 ,
2016-12-28 08:23:08 +00:00
positionProps = { } ,
x , y ;
2016-08-18 16:37:38 +00:00
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 ( ) ;
2016-12-28 08:23:08 +00:00
if ( _ . options . vertical === false && _ . options . variableWidth === false ) {
2016-08-18 16:37:38 +00:00
_ . slideWidth = Math . ceil ( _ . listWidth / _ . options . slidesToShow ) ;
_ . $slideTrack . width ( Math . ceil ( ( _ . slideWidth * _ . $slideTrack . children ( '.slick-slide' ) . length ) ) ) ;
} else if ( _ . options . variableWidth === true ) {
2016-12-28 08:23:08 +00:00
_ . $slideTrack . width ( 5000 * _ . slideCount ) ;
2016-08-18 16:37:38 +00:00
} 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 ,
2016-12-28 08:23:08 +00:00
zIndex : _ . options . zIndex - 2 ,
2016-08-18 16:37:38 +00:00
opacity : 0
} ) ;
} else {
$ ( element ) . css ( {
position : 'relative' ,
left : targetLeft ,
top : 0 ,
2016-12-28 08:23:08 +00:00
zIndex : _ . options . zIndex - 2 ,
2016-08-18 16:37:38 +00:00
opacity : 0
} ) ;
}
} ) ;
_ . $slides . eq ( _ . currentSlide ) . css ( {
2016-12-28 08:23:08 +00:00
zIndex : _ . options . zIndex - 1 ,
2016-08-18 16:37:38 +00:00
opacity : 1
} ) ;
} ;
Slick . prototype . setHeight = function ( ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
if ( _ . options . slidesToShow === 1 && _ . options . adaptiveHeight === true && _ . options . vertical === false ) {
2016-08-18 16:37:38 +00:00
var targetHeight = _ . $slides . eq ( _ . currentSlide ) . outerHeight ( true ) ;
_ . $list . css ( 'height' , targetHeight ) ;
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . setOption =
Slick . prototype . slickSetOption = function ( ) {
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
/ * *
* accepts arguments in format of :
*
* - for changing a single option ' s value :
* . slick ( "setOption" , option , value , refresh )
*
* - for changing a set of responsive options :
* . slick ( "setOption" , 'responsive' , [ { } , ... ] , refresh )
*
* - for updating multiple values at once ( not responsive )
* . slick ( "setOption" , { 'option' : value , ... } , refresh )
* /
var _ = this , l , item , option , value , refresh = false , type ;
if ( $ . type ( arguments [ 0 ] ) === 'object' ) {
option = arguments [ 0 ] ;
refresh = arguments [ 1 ] ;
type = 'multiple' ;
} else if ( $ . type ( arguments [ 0 ] ) === 'string' ) {
option = arguments [ 0 ] ;
value = arguments [ 1 ] ;
refresh = arguments [ 2 ] ;
if ( arguments [ 0 ] === 'responsive' && $ . type ( arguments [ 1 ] ) === 'array' ) {
type = 'responsive' ;
} else if ( typeof arguments [ 1 ] !== 'undefined' ) {
type = 'single' ;
}
}
if ( type === 'single' ) {
_ . options [ option ] = value ;
} else if ( type === 'multiple' ) {
$ . each ( option , function ( opt , val ) {
_ . options [ opt ] = val ;
} ) ;
} else if ( type === 'responsive' ) {
for ( item in value ) {
if ( $ . type ( _ . options . responsive ) !== 'array' ) {
_ . options . responsive = [ value [ item ] ] ;
} else {
l = _ . options . responsive . length - 1 ;
// loop through the responsive object and splice out duplicates.
while ( l >= 0 ) {
if ( _ . options . responsive [ l ] . breakpoint === value [ item ] . breakpoint ) {
_ . options . responsive . splice ( l , 1 ) ;
}
l -- ;
}
_ . options . responsive . push ( value [ item ] ) ;
}
}
}
if ( refresh ) {
2016-08-18 16:37:38 +00:00
_ . unload ( ) ;
_ . reinit ( ) ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . setPosition = function ( ) {
var _ = this ;
_ . setDimensions ( ) ;
_ . setHeight ( ) ;
if ( _ . options . fade === false ) {
_ . setCSS ( _ . getLeft ( _ . currentSlide ) ) ;
} else {
_ . setFade ( ) ;
}
2016-12-28 08:23:08 +00:00
_ . $slider . trigger ( 'setPosition' , [ _ ] ) ;
2016-08-18 16:37:38 +00:00
} ;
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 ) {
2016-12-28 08:23:08 +00:00
if ( _ . options . useCSS === true ) {
2016-08-18 16:37:38 +00:00
_ . cssTransitions = true ;
}
}
2016-12-28 08:23:08 +00:00
if ( _ . options . fade ) {
if ( typeof _ . options . zIndex === 'number' ) {
if ( _ . options . zIndex < 3 ) {
_ . options . zIndex = 3 ;
}
} else {
_ . options . zIndex = _ . defaults . zIndex ;
}
}
2016-08-18 16:37:38 +00:00
if ( bodyStyle . OTransform !== undefined ) {
_ . animType = 'OTransform' ;
2016-12-28 08:23:08 +00:00
_ . transformType = '-o-transform' ;
2016-08-18 16:37:38 +00:00
_ . transitionType = 'OTransition' ;
if ( bodyStyle . perspectiveProperty === undefined && bodyStyle . webkitPerspective === undefined ) _ . animType = false ;
}
if ( bodyStyle . MozTransform !== undefined ) {
_ . animType = 'MozTransform' ;
2016-12-28 08:23:08 +00:00
_ . transformType = '-moz-transform' ;
2016-08-18 16:37:38 +00:00
_ . transitionType = 'MozTransition' ;
if ( bodyStyle . perspectiveProperty === undefined && bodyStyle . MozPerspective === undefined ) _ . animType = false ;
}
if ( bodyStyle . webkitTransform !== undefined ) {
_ . animType = 'webkitTransform' ;
2016-12-28 08:23:08 +00:00
_ . transformType = '-webkit-transform' ;
2016-08-18 16:37:38 +00:00
_ . transitionType = 'webkitTransition' ;
if ( bodyStyle . perspectiveProperty === undefined && bodyStyle . webkitPerspective === undefined ) _ . animType = false ;
}
if ( bodyStyle . msTransform !== undefined ) {
_ . animType = 'msTransform' ;
2016-12-28 08:23:08 +00:00
_ . transformType = '-ms-transform' ;
2016-08-18 16:37:38 +00:00
_ . transitionType = 'msTransition' ;
if ( bodyStyle . msTransform === undefined ) _ . animType = false ;
}
if ( bodyStyle . transform !== undefined && _ . animType !== false ) {
_ . animType = 'transform' ;
2016-12-28 08:23:08 +00:00
_ . transformType = 'transform' ;
2016-08-18 16:37:38 +00:00
_ . transitionType = 'transition' ;
}
2016-12-28 08:23:08 +00:00
_ . transformsEnabled = _ . options . useTransform && ( _ . animType !== null && _ . animType !== false ) ;
2016-08-18 16:37:38 +00:00
} ;
Slick . prototype . setSlideClasses = function ( index ) {
var _ = this ,
centerOffset , allSlides , indexOffset , remainder ;
2016-12-28 08:23:08 +00:00
allSlides = _ . $slider
. find ( '.slick-slide' )
. removeClass ( 'slick-active slick-center slick-current' )
. attr ( 'aria-hidden' , 'true' ) ;
_ . $slides
. eq ( index )
. addClass ( 'slick-current' ) ;
2016-08-18 16:37:38 +00:00
if ( _ . options . centerMode === true ) {
centerOffset = Math . floor ( _ . options . slidesToShow / 2 ) ;
2016-12-28 08:23:08 +00:00
if ( _ . options . infinite === true ) {
2016-08-18 16:37:38 +00:00
if ( index >= centerOffset && index <= ( _ . slideCount - 1 ) - centerOffset ) {
2016-12-28 08:23:08 +00:00
_ . $slides
. slice ( index - centerOffset , index + centerOffset + 1 )
. addClass ( 'slick-active' )
. attr ( 'aria-hidden' , 'false' ) ;
2016-08-18 16:37:38 +00:00
} else {
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
indexOffset = _ . options . slidesToShow + index ;
2016-12-28 08:23:08 +00:00
allSlides
. slice ( indexOffset - centerOffset + 1 , indexOffset + centerOffset + 2 )
. addClass ( 'slick-active' )
. attr ( 'aria-hidden' , 'false' ) ;
2016-08-18 16:37:38 +00:00
}
if ( index === 0 ) {
2016-12-28 08:23:08 +00:00
allSlides
. eq ( allSlides . length - 1 - _ . options . slidesToShow )
. addClass ( 'slick-center' ) ;
2016-08-18 16:37:38 +00:00
} else if ( index === _ . slideCount - 1 ) {
2016-12-28 08:23:08 +00:00
allSlides
. eq ( _ . options . slidesToShow )
. addClass ( 'slick-center' ) ;
2016-08-18 16:37:38 +00:00
}
}
2016-12-28 08:23:08 +00:00
_ . $slides
. eq ( index )
. addClass ( 'slick-center' ) ;
2016-08-18 16:37:38 +00:00
} else {
if ( index >= 0 && index <= ( _ . slideCount - _ . options . slidesToShow ) ) {
2016-12-28 08:23:08 +00:00
_ . $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' ) ;
2016-08-18 16:37:38 +00:00
} else {
2016-12-28 08:23:08 +00:00
remainder = _ . slideCount % _ . options . slidesToShow ;
2016-08-18 16:37:38 +00:00
indexOffset = _ . options . infinite === true ? _ . options . slidesToShow + index : index ;
2016-12-28 08:23:08 +00:00
if ( _ . options . slidesToShow == _ . options . slidesToScroll && ( _ . slideCount - index ) < _ . options . slidesToShow ) {
allSlides
. slice ( indexOffset - ( _ . options . slidesToShow - remainder ) , indexOffset + remainder )
. addClass ( 'slick-active' )
. attr ( 'aria-hidden' , 'false' ) ;
2016-08-18 16:37:38 +00:00
} else {
2016-12-28 08:23:08 +00:00
allSlides
. slice ( indexOffset , indexOffset + _ . options . slidesToShow )
. addClass ( 'slick-active' )
. attr ( 'aria-hidden' , 'false' ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
}
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 -
2016-12-28 08:23:08 +00:00
infiniteCount ) ; i -= 1 ) {
2016-08-18 16:37:38 +00:00
slideIndex = i - 1 ;
$ ( _ . $slides [ slideIndex ] ) . clone ( true ) . attr ( 'id' , '' )
2016-12-28 08:23:08 +00:00
. attr ( 'data-slick-index' , slideIndex - _ . slideCount )
2016-08-18 16:37:38 +00:00
. prependTo ( _ . $slideTrack ) . addClass ( 'slick-cloned' ) ;
}
for ( i = 0 ; i < infiniteCount ; i += 1 ) {
slideIndex = i ;
$ ( _ . $slides [ slideIndex ] ) . clone ( true ) . attr ( 'id' , '' )
2016-12-28 08:23:08 +00:00
. attr ( 'data-slick-index' , slideIndex + _ . slideCount )
2016-08-18 16:37:38 +00:00
. appendTo ( _ . $slideTrack ) . addClass ( 'slick-cloned' ) ;
}
_ . $slideTrack . find ( '.slick-cloned' ) . find ( '[id]' ) . each ( function ( ) {
$ ( this ) . attr ( 'id' , '' ) ;
} ) ;
}
}
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . interrupt = function ( toggle ) {
var _ = this ;
if ( ! toggle ) {
_ . autoPlay ( ) ;
}
_ . interrupted = toggle ;
} ;
2016-08-18 16:37:38 +00:00
Slick . prototype . selectHandler = function ( event ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
var targetElement =
$ ( event . target ) . is ( '.slick-slide' ) ?
$ ( event . target ) :
$ ( event . target ) . parents ( '.slick-slide' ) ;
var index = parseInt ( targetElement . attr ( 'data-slick-index' ) ) ;
if ( ! index ) index = 0 ;
if ( _ . slideCount <= _ . options . slidesToShow ) {
_ . setSlideClasses ( index ) ;
2016-08-18 16:37:38 +00:00
_ . asNavFor ( index ) ;
return ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
_ . slideHandler ( index ) ;
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . slideHandler = function ( index , sync , dontAnimate ) {
2016-08-18 16:37:38 +00:00
var targetSlide , animSlide , oldSlide , slideLeft , targetLeft = null ,
2016-12-28 08:23:08 +00:00
_ = this , navTarget ;
2016-08-18 16:37:38 +00:00
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 ) ) {
2016-12-28 08:23:08 +00:00
if ( _ . options . fade === false ) {
2016-08-18 16:37:38 +00:00
targetSlide = _ . currentSlide ;
2016-12-28 08:23:08 +00:00
if ( dontAnimate !== true ) {
2016-08-18 16:37:38 +00:00
_ . animateSlide ( slideLeft , function ( ) {
_ . postSlide ( targetSlide ) ;
} ) ;
} else {
_ . postSlide ( targetSlide ) ;
}
}
return ;
} else if ( _ . options . infinite === false && _ . options . centerMode === true && ( index < 0 || index > ( _ . slideCount - _ . options . slidesToScroll ) ) ) {
2016-12-28 08:23:08 +00:00
if ( _ . options . fade === false ) {
2016-08-18 16:37:38 +00:00
targetSlide = _ . currentSlide ;
2016-12-28 08:23:08 +00:00
if ( dontAnimate !== true ) {
2016-08-18 16:37:38 +00:00
_ . animateSlide ( slideLeft , function ( ) {
_ . postSlide ( targetSlide ) ;
} ) ;
} else {
_ . postSlide ( targetSlide ) ;
}
}
return ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . autoplay ) {
2016-08-18 16:37:38 +00:00
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 ;
2016-12-28 08:23:08 +00:00
_ . $slider . trigger ( 'beforeChange' , [ _ , _ . currentSlide , animSlide ] ) ;
2016-08-18 16:37:38 +00:00
oldSlide = _ . currentSlide ;
_ . currentSlide = animSlide ;
_ . setSlideClasses ( _ . currentSlide ) ;
2016-12-28 08:23:08 +00:00
if ( _ . options . asNavFor ) {
navTarget = _ . getNavTarget ( ) ;
navTarget = navTarget . slick ( 'getSlick' ) ;
if ( navTarget . slideCount <= navTarget . options . slidesToShow ) {
navTarget . setSlideClasses ( _ . currentSlide ) ;
}
}
2016-08-18 16:37:38 +00:00
_ . updateDots ( ) ;
_ . updateArrows ( ) ;
if ( _ . options . fade === true ) {
2016-12-28 08:23:08 +00:00
if ( dontAnimate !== true ) {
_ . fadeSlideOut ( oldSlide ) ;
2016-08-18 16:37:38 +00:00
_ . fadeSlide ( animSlide , function ( ) {
_ . postSlide ( animSlide ) ;
} ) ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
} else {
_ . postSlide ( animSlide ) ;
}
_ . animateHeight ( ) ;
return ;
}
2016-12-28 08:23:08 +00:00
if ( dontAnimate !== true ) {
2016-08-18 16:37:38 +00:00
_ . 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' ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . verticalSwiping === true ) {
if ( ( swipeAngle >= 35 ) && ( swipeAngle <= 135 ) ) {
return 'down' ;
} else {
return 'up' ;
}
}
2016-08-18 16:37:38 +00:00
return 'vertical' ;
} ;
Slick . prototype . swipeEnd = function ( event ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
slideCount ,
direction ;
2016-08-18 16:37:38 +00:00
_ . dragging = false ;
2016-12-28 08:23:08 +00:00
_ . interrupted = false ;
_ . shouldClick = ( _ . touchObject . swipeLength > 10 ) ? false : true ;
2016-08-18 16:37:38 +00:00
2016-12-28 08:23:08 +00:00
if ( _ . touchObject . curX === undefined ) {
2016-08-18 16:37:38 +00:00
return false ;
}
2016-12-28 08:23:08 +00:00
if ( _ . touchObject . edgeHit === true ) {
_ . $slider . trigger ( 'edge' , [ _ , _ . swipeDirection ( ) ] ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
if ( _ . touchObject . swipeLength >= _ . touchObject . minSwipe ) {
direction = _ . swipeDirection ( ) ;
switch ( direction ) {
2016-08-18 16:37:38 +00:00
case 'left' :
2016-12-28 08:23:08 +00:00
case 'down' :
slideCount =
_ . options . swipeToSlide ?
_ . checkNavigable ( _ . currentSlide + _ . getSlideCount ( ) ) :
_ . currentSlide + _ . getSlideCount ( ) ;
2016-08-18 16:37:38 +00:00
_ . currentDirection = 0 ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
break ;
case 'right' :
2016-12-28 08:23:08 +00:00
case 'up' :
slideCount =
_ . options . swipeToSlide ?
_ . checkNavigable ( _ . currentSlide - _ . getSlideCount ( ) ) :
_ . currentSlide - _ . getSlideCount ( ) ;
2016-08-18 16:37:38 +00:00
_ . currentDirection = 1 ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
break ;
2016-12-28 08:23:08 +00:00
default :
}
if ( direction != 'vertical' ) {
_ . slideHandler ( slideCount ) ;
_ . touchObject = { } ;
_ . $slider . trigger ( 'swipe' , [ _ , direction ] ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
} else {
2016-12-28 08:23:08 +00:00
if ( _ . touchObject . startX !== _ . touchObject . curX ) {
_ . slideHandler ( _ . currentSlide ) ;
2016-08-18 16:37:38 +00:00
_ . touchObject = { } ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . swipeHandler = function ( event ) {
var _ = this ;
if ( ( _ . options . swipe === false ) || ( 'ontouchend' in document && _ . options . swipe === false ) ) {
2016-12-28 08:23:08 +00:00
return ;
2016-08-18 16:37:38 +00:00
} else if ( _ . options . draggable === false && event . type . indexOf ( 'mouse' ) !== - 1 ) {
2016-12-28 08:23:08 +00:00
return ;
2016-08-18 16:37:38 +00:00
}
_ . touchObject . fingerCount = event . originalEvent && event . originalEvent . touches !== undefined ?
event . originalEvent . touches . length : 1 ;
_ . touchObject . minSwipe = _ . listWidth / _ . options
. touchThreshold ;
2016-12-28 08:23:08 +00:00
if ( _ . options . verticalSwiping === true ) {
_ . touchObject . minSwipe = _ . listHeight / _ . options
. touchThreshold ;
}
2016-08-18 16:37:38 +00:00
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 ) ) ) ;
2016-12-28 08:23:08 +00:00
if ( _ . options . verticalSwiping === true ) {
_ . touchObject . swipeLength = Math . round ( Math . sqrt (
Math . pow ( _ . touchObject . curY - _ . touchObject . startY , 2 ) ) ) ;
}
2016-08-18 16:37:38 +00:00
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 ) ;
2016-12-28 08:23:08 +00:00
if ( _ . options . verticalSwiping === true ) {
positionOffset = _ . touchObject . curY > _ . touchObject . startY ? 1 : - 1 ;
}
2016-08-18 16:37:38 +00:00
swipeLength = _ . touchObject . swipeLength ;
_ . touchObject . edgeHit = false ;
if ( _ . options . infinite === false ) {
2016-12-28 08:23:08 +00:00
if ( ( _ . currentSlide === 0 && swipeDirection === 'right' ) || ( _ . currentSlide >= _ . getDotCount ( ) && swipeDirection === 'left' ) ) {
2016-08-18 16:37:38 +00:00
swipeLength = _ . touchObject . swipeLength * _ . options . edgeFriction ;
_ . touchObject . edgeHit = true ;
}
}
if ( _ . options . vertical === false ) {
_ . swipeLeft = curLeft + swipeLength * positionOffset ;
} else {
_ . swipeLeft = curLeft + ( swipeLength * ( _ . $list . height ( ) / _ . listWidth ) ) * positionOffset ;
}
2016-12-28 08:23:08 +00:00
if ( _ . options . verticalSwiping === true ) {
_ . swipeLeft = curLeft + swipeLength * positionOffset ;
}
2016-08-18 16:37:38 +00:00
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 ;
2016-12-28 08:23:08 +00:00
_ . interrupted = true ;
2016-08-18 16:37:38 +00:00
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 ( ) ;
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
if ( _ . $dots ) {
_ . $dots . remove ( ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . $prevArrow && _ . htmlExpr . test ( _ . options . prevArrow ) ) {
2016-08-18 16:37:38 +00:00
_ . $prevArrow . remove ( ) ;
}
2016-12-28 08:23:08 +00:00
if ( _ . $nextArrow && _ . htmlExpr . test ( _ . options . nextArrow ) ) {
2016-08-18 16:37:38 +00:00
_ . $nextArrow . remove ( ) ;
}
2016-12-28 08:23:08 +00:00
_ . $slides
. removeClass ( 'slick-slide slick-active slick-visible slick-current' )
. attr ( 'aria-hidden' , 'true' )
. css ( 'width' , '' ) ;
2016-08-18 16:37:38 +00:00
} ;
2016-12-28 08:23:08 +00:00
Slick . prototype . unslick = function ( fromBreakpoint ) {
2016-08-18 16:37:38 +00:00
var _ = this ;
2016-12-28 08:23:08 +00:00
_ . $slider . trigger ( 'unslick' , [ _ , fromBreakpoint ] ) ;
2016-08-18 16:37:38 +00:00
_ . destroy ( ) ;
} ;
Slick . prototype . updateArrows = function ( ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
centerOffset ;
2016-08-18 16:37:38 +00:00
centerOffset = Math . floor ( _ . options . slidesToShow / 2 ) ;
2016-12-28 08:23:08 +00:00
if ( _ . options . arrows === true &&
_ . slideCount > _ . options . slidesToShow &&
! _ . options . infinite ) {
_ . $prevArrow . removeClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'false' ) ;
_ . $nextArrow . removeClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'false' ) ;
2016-08-18 16:37:38 +00:00
if ( _ . currentSlide === 0 ) {
2016-12-28 08:23:08 +00:00
_ . $prevArrow . addClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'true' ) ;
_ . $nextArrow . removeClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'false' ) ;
2016-08-18 16:37:38 +00:00
} else if ( _ . currentSlide >= _ . slideCount - _ . options . slidesToShow && _ . options . centerMode === false ) {
2016-12-28 08:23:08 +00:00
_ . $nextArrow . addClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'true' ) ;
_ . $prevArrow . removeClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'false' ) ;
2016-08-18 16:37:38 +00:00
} else if ( _ . currentSlide >= _ . slideCount - 1 && _ . options . centerMode === true ) {
2016-12-28 08:23:08 +00:00
_ . $nextArrow . addClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'true' ) ;
_ . $prevArrow . removeClass ( 'slick-disabled' ) . attr ( 'aria-disabled' , 'false' ) ;
2016-08-18 16:37:38 +00:00
}
2016-12-28 08:23:08 +00:00
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . updateDots = function ( ) {
var _ = this ;
if ( _ . $dots !== null ) {
2016-12-28 08:23:08 +00:00
_ . $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' ) ;
2016-08-18 16:37:38 +00:00
}
} ;
Slick . prototype . visibility = function ( ) {
var _ = this ;
2016-12-28 08:23:08 +00:00
if ( _ . options . autoplay ) {
if ( document [ _ . hidden ] ) {
_ . interrupted = true ;
} else {
_ . interrupted = false ;
}
2016-08-18 16:37:38 +00:00
}
} ;
$ . fn . slick = function ( ) {
2016-12-28 08:23:08 +00:00
var _ = this ,
opt = arguments [ 0 ] ,
args = Array . prototype . slice . call ( arguments , 1 ) ,
l = _ . length ,
i ,
ret ;
for ( i = 0 ; i < l ; i ++ ) {
2016-08-18 16:37:38 +00:00
if ( typeof opt == 'object' || typeof opt == 'undefined' )
2016-12-28 08:23:08 +00:00
_ [ i ] . slick = new Slick ( _ [ i ] , opt ) ;
2016-08-18 16:37:38 +00:00
else
ret = _ [ i ] . slick [ opt ] . apply ( _ [ i ] . slick , args ) ;
2016-12-28 08:23:08 +00:00
if ( typeof ret != 'undefined' ) return ret ;
2016-08-18 16:37:38 +00:00
}
return _ ;
} ;
} ) ) ;
// 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 $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 ) ;
}
/ *
===
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 ( ) ;
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 ( ) ;
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 ( ) ;