{"version":3,"file":"main.min.js","sources":["main.min.js"],"sourcesContent":["/*!\r\n* Clamp.js 0.5.1\r\n*\r\n* Copyright 2011-2013, Joseph Schmitt http://joe.sh\r\n* Released under the WTFPL license\r\n* http://sam.zoy.org/wtfpl/\r\n*/\r\n\r\n(function () {\r\n\t/**\r\n * Clamps a text node.\r\n * @param {HTMLElement} element. Element containing the text node to clamp.\r\n * @param {Object} options. Options to pass to the clamper.\r\n */\r\n\tfunction clamp(element, options) {\r\n\t\toptions = options || {};\r\n\r\n\t\tvar self = this,\r\n win = window,\r\n opt = {\r\n \tclamp: options.clamp || 2,\r\n \tuseNativeClamp: typeof (options.useNativeClamp) != 'undefined' ? options.useNativeClamp : true,\r\n \tsplitOnChars: options.splitOnChars || ['.', '-', '–', '—', ' '], //Split on sentences (periods), hypens, en-dashes, em-dashes, and words (spaces).\r\n \tanimate: options.animate || false,\r\n \ttruncationChar: options.truncationChar || '…',\r\n \ttruncationHTML: options.truncationHTML\r\n },\r\n\r\n sty = element.style,\r\n originalText = element.innerHTML,\r\n\r\n supportsNativeClamp = typeof (element.style.webkitLineClamp) != 'undefined',\r\n clampValue = opt.clamp,\r\n isCSSValue = clampValue.indexOf && (clampValue.indexOf('px') > -1 || clampValue.indexOf('em') > -1),\r\n truncationHTMLContainer;\r\n\r\n\t\tif (opt.truncationHTML) {\r\n\t\t\ttruncationHTMLContainer = document.createElement('span');\r\n\t\t\ttruncationHTMLContainer.innerHTML = opt.truncationHTML;\r\n\t\t}\r\n\r\n\r\n\t\t// UTILITY FUNCTIONS __________________________________________________________\r\n\r\n\t\t/**\r\n * Return the current style for an element.\r\n * @param {HTMLElement} elem The element to compute.\r\n * @param {string} prop The style property.\r\n * @returns {number}\r\n */\r\n\t\tfunction computeStyle(elem, prop) {\r\n\t\t\tif (!win.getComputedStyle) {\r\n\t\t\t\twin.getComputedStyle = function (el, pseudo) {\r\n\t\t\t\t\tthis.el = el;\r\n\t\t\t\t\tthis.getPropertyValue = function (prop) {\r\n\t\t\t\t\t\tvar re = /(\\-([a-z]){1})/g;\r\n\t\t\t\t\t\tif (prop == 'float') prop = 'styleFloat';\r\n\t\t\t\t\t\tif (re.test(prop)) {\r\n\t\t\t\t\t\t\tprop = prop.replace(re, function () {\r\n\t\t\t\t\t\t\t\treturn arguments[2].toUpperCase();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn el.currentStyle && el.currentStyle[prop] ? el.currentStyle[prop] : null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn win.getComputedStyle(elem, null).getPropertyValue(prop);\r\n\t\t}\r\n\r\n\t\t/**\r\n * Returns the maximum number of lines of text that should be rendered based\r\n * on the current height of the element and the line-height of the text.\r\n */\r\n\t\tfunction getMaxLines(height) {\r\n\t\t\tvar availHeight = height || element.clientHeight,\r\n lineHeight = getLineHeight(element);\r\n\r\n\t\t\treturn Math.max(Math.floor(availHeight / lineHeight), 0);\r\n\t\t}\r\n\r\n\t\t/**\r\n * Returns the maximum height a given element should have based on the line-\r\n * height of the text and the given clamp value.\r\n */\r\n\t\tfunction getMaxHeight(clmp) {\r\n\t\t\tvar lineHeight = getLineHeight(element);\r\n\t\t\treturn lineHeight * clmp;\r\n\t\t}\r\n\r\n\t\t/**\r\n * Returns the line-height of an element as an integer.\r\n */\r\n\t\tfunction getLineHeight(elem) {\r\n\t\t\tvar lh = computeStyle(elem, 'line-height');\r\n\t\t\tif (lh == 'normal') {\r\n\t\t\t\t// Normal line heights vary from browser to browser. The spec recommends\r\n\t\t\t\t// a value between 1.0 and 1.2 of the font size. Using 1.1 to split the diff.\r\n\t\t\t\tlh = parseInt(computeStyle(elem, 'font-size')) * 1.2;\r\n\t\t\t}\r\n\t\t\treturn parseInt(lh);\r\n\t\t}\r\n\r\n\r\n\t\t// MEAT AND POTATOES (MMMM, POTATOES...) ______________________________________\r\n\t\tvar splitOnChars = opt.splitOnChars.slice(0),\r\n splitChar = splitOnChars[0],\r\n chunks,\r\n lastChunk;\r\n\r\n\t\t/**\r\n * Gets an element's last child. That may be another node or a node's contents.\r\n */\r\n\t\tfunction getLastChild(elem) {\r\n\t\t\t//Current element has children, need to go deeper and get last child as a text node\r\n\t\t\tif (elem.lastChild.children && elem.lastChild.children.length > 0) {\r\n\t\t\t\treturn getLastChild(Array.prototype.slice.call(elem.children).pop());\r\n\t\t\t}\r\n\t\t\t\t//This is the absolute last child, a text node, but something's wrong with it. Remove it and keep trying\r\n\t\t\telse if (!elem.lastChild || !elem.lastChild.nodeValue || elem.lastChild.nodeValue == '' || elem.lastChild.nodeValue == opt.truncationChar) {\r\n\t\t\t\telem.lastChild.parentNode.removeChild(elem.lastChild);\r\n\t\t\t\treturn getLastChild(element);\r\n\t\t\t}\r\n\t\t\t\t//This is the last child we want, return it\r\n\t\t\telse {\r\n\t\t\t\treturn elem.lastChild;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n * Removes one character at a time from the text until its width or\r\n * height is beneath the passed-in max param.\r\n */\r\n\t\tfunction truncate(target, maxHeight) {\r\n\t\t\tif (!maxHeight) { return; }\r\n\r\n\t\t\t/**\r\n * Resets global variables.\r\n */\r\n\t\t\tfunction reset() {\r\n\t\t\t\tsplitOnChars = opt.splitOnChars.slice(0);\r\n\t\t\t\tsplitChar = splitOnChars[0];\r\n\t\t\t\tchunks = null;\r\n\t\t\t\tlastChunk = null;\r\n\t\t\t}\r\n\r\n\t\t\tvar nodeValue = target.nodeValue.replace(opt.truncationChar, '');\r\n\r\n\t\t\t//Grab the next chunks\r\n\t\t\tif (!chunks) {\r\n\t\t\t\t//If there are more characters to try, grab the next one\r\n\t\t\t\tif (splitOnChars.length > 0) {\r\n\t\t\t\t\tsplitChar = splitOnChars.shift();\r\n\t\t\t\t}\r\n\t\t\t\t\t//No characters to chunk by. Go character-by-character\r\n\t\t\t\telse {\r\n\t\t\t\t\tsplitChar = '';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchunks = nodeValue.split(splitChar);\r\n\t\t\t}\r\n\r\n\t\t\t//If there are chunks left to remove, remove the last one and see if\r\n\t\t\t// the nodeValue fits.\r\n\t\t\tif (chunks.length > 1) {\r\n\t\t\t\t// console.log('chunks', chunks);\r\n\t\t\t\tlastChunk = chunks.pop();\r\n\t\t\t\t// console.log('lastChunk', lastChunk);\r\n\t\t\t\tapplyEllipsis(target, chunks.join(splitChar));\r\n\t\t\t}\r\n\t\t\t\t//No more chunks can be removed using this character\r\n\t\t\telse {\r\n\t\t\t\tchunks = null;\r\n\t\t\t}\r\n\r\n\t\t\t//Insert the custom HTML before the truncation character\r\n\t\t\tif (truncationHTMLContainer) {\r\n\t\t\t\ttarget.nodeValue = target.nodeValue.replace(opt.truncationChar, '');\r\n\t\t\t\telement.innerHTML = target.nodeValue + ' ' + truncationHTMLContainer.innerHTML + opt.truncationChar;\r\n\t\t\t}\r\n\r\n\t\t\t//Search produced valid chunks\r\n\t\t\tif (chunks) {\r\n\t\t\t\t//It fits\r\n\t\t\t\tif (element.clientHeight <= maxHeight) {\r\n\t\t\t\t\t//There's still more characters to try splitting on, not quite done yet\r\n\t\t\t\t\tif (splitOnChars.length >= 0 && splitChar != '') {\r\n\t\t\t\t\t\tapplyEllipsis(target, chunks.join(splitChar) + splitChar + lastChunk);\r\n\t\t\t\t\t\tchunks = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\t//Finished!\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treturn element.innerHTML;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\t//No valid chunks produced\r\n\t\t\telse {\r\n\t\t\t\t//No valid chunks even when splitting by letter, time to move\r\n\t\t\t\t//on to the next node\r\n\t\t\t\tif (splitChar == '') {\r\n\t\t\t\t\tapplyEllipsis(target, '');\r\n\t\t\t\t\ttarget = getLastChild(element);\r\n\r\n\t\t\t\t\treset();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//If you get here it means still too big, let's keep truncating\r\n\t\t\tif (opt.animate) {\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\ttruncate(target, maxHeight);\r\n\t\t\t\t}, opt.animate === true ? 10 : opt.animate);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn truncate(target, maxHeight);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction applyEllipsis(elem, str) {\r\n\t\t\telem.nodeValue = str + opt.truncationChar;\r\n\t\t}\r\n\r\n\r\n\t\t// CONSTRUCTOR ________________________________________________________________\r\n\r\n\t\tif (clampValue == 'auto') {\r\n\t\t\tclampValue = getMaxLines();\r\n\t\t}\r\n\t\telse if (isCSSValue) {\r\n\t\t\tclampValue = getMaxLines(parseInt(clampValue));\r\n\t\t}\r\n\r\n\t\tvar clampedText;\r\n\t\tif (supportsNativeClamp && opt.useNativeClamp) {\r\n\t\t\tsty.overflow = 'hidden';\r\n\t\t\tsty.textOverflow = 'ellipsis';\r\n\t\t\tsty.webkitBoxOrient = 'vertical';\r\n\t\t\tsty.display = '-webkit-box';\r\n\t\t\tsty.webkitLineClamp = clampValue;\r\n\r\n\t\t\tif (isCSSValue) {\r\n\t\t\t\tsty.height = opt.clamp + 'px';\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tvar height = getMaxHeight(clampValue);\r\n\t\t\tif (height <= element.clientHeight) {\r\n\t\t\t\tclampedText = truncate(getLastChild(element), height);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\t'original': originalText,\r\n\t\t\t'clamped': clampedText\r\n\t\t}\r\n\t}\r\n\r\n\twindow.$clamp = clamp;\r\n})();\r\n\n/*!\r\n * headroom.js v0.9.3 - Give your page some headroom. Hide your header until you need it\r\n * Copyright (c) 2016 Nick Williams - http://wicky.nillia.ms/headroom.js\r\n * License: MIT\r\n */\r\n\r\n(function (root, factory) {\r\n 'use strict';\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as an anonymous module.\r\n define([], factory);\r\n }\r\n else if (typeof exports === 'object') {\r\n // COMMONJS\r\n module.exports = factory();\r\n }\r\n else {\r\n // BROWSER\r\n root.Headroom = factory();\r\n }\r\n}(this, function () {\r\n 'use strict';\r\n\r\n /* exported features */\r\n\r\n var features = {\r\n bind: !!(function () { }.bind),\r\n classList: 'classList' in document.documentElement,\r\n rAF: !!(window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame)\r\n };\r\n window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\r\n\r\n /**\r\n * Handles debouncing of events via requestAnimationFrame\r\n * @see http://www.html5rocks.com/en/tutorials/speed/animations/\r\n * @param {Function} callback The callback to handle whichever event\r\n */\r\n function Debouncer(callback) {\r\n this.callback = callback;\r\n this.ticking = false;\r\n }\r\n Debouncer.prototype = {\r\n constructor: Debouncer,\r\n\r\n /**\r\n * dispatches the event to the supplied callback\r\n * @private\r\n */\r\n update: function () {\r\n this.callback && this.callback();\r\n this.ticking = false;\r\n },\r\n\r\n /**\r\n * ensures events don't get stacked\r\n * @private\r\n */\r\n requestTick: function () {\r\n if (!this.ticking) {\r\n requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));\r\n this.ticking = true;\r\n }\r\n },\r\n\r\n /**\r\n * Attach this as the event listeners\r\n */\r\n handleEvent: function () {\r\n this.requestTick();\r\n }\r\n };\r\n /**\r\n * Check if object is part of the DOM\r\n * @constructor\r\n * @param {Object} obj element to check\r\n */\r\n function isDOMElement(obj) {\r\n return obj && typeof window !== 'undefined' && (obj === window || obj.nodeType);\r\n }\r\n\r\n /**\r\n * Helper function for extending objects\r\n */\r\n function extend(object /*, objectN ... */) {\r\n if (arguments.length <= 0) {\r\n throw new Error('Missing arguments in extend function');\r\n }\r\n\r\n var result = object || {},\r\n key,\r\n i;\r\n\r\n for (i = 1; i < arguments.length; i++) {\r\n var replacement = arguments[i] || {};\r\n\r\n for (key in replacement) {\r\n // Recurse into object except if the object is a DOM element\r\n if (typeof result[key] === 'object' && !isDOMElement(result[key])) {\r\n result[key] = extend(result[key], replacement[key]);\r\n }\r\n else {\r\n result[key] = result[key] || replacement[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Helper function for normalizing tolerance option to object format\r\n */\r\n function normalizeTolerance(t) {\r\n return t === Object(t) ? t : { down: t, up: t };\r\n }\r\n\r\n /**\r\n * UI enhancement for fixed headers.\r\n * Hides header when scrolling down\r\n * Shows header when scrolling up\r\n * @constructor\r\n * @param {DOMElement} elem the header element\r\n * @param {Object} options options for the widget\r\n */\r\n function Headroom(elem, options) {\r\n options = extend(options, Headroom.options);\r\n\r\n this.lastKnownScrollY = 0;\r\n this.elem = elem;\r\n this.tolerance = normalizeTolerance(options.tolerance);\r\n this.classes = options.classes;\r\n this.offset = options.offset;\r\n this.scroller = options.scroller;\r\n this.initialised = false;\r\n this.onPin = options.onPin;\r\n this.onUnpin = options.onUnpin;\r\n this.onTop = options.onTop;\r\n this.onNotTop = options.onNotTop;\r\n this.onBottom = options.onBottom;\r\n this.onNotBottom = options.onNotBottom;\r\n }\r\n Headroom.prototype = {\r\n constructor: Headroom,\r\n\r\n /**\r\n * Initialises the widget\r\n */\r\n init: function () {\r\n if (!Headroom.cutsTheMustard) {\r\n return;\r\n }\r\n\r\n this.debouncer = new Debouncer(this.update.bind(this));\r\n this.elem.classList.add(this.classes.initial);\r\n\r\n // defer event registration to handle browser\r\n // potentially restoring previous scroll position\r\n setTimeout(this.attachEvent.bind(this), 100);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * Unattaches events and removes any classes that were added\r\n */\r\n destroy: function () {\r\n var classes = this.classes;\r\n\r\n this.initialised = false;\r\n this.elem.classList.remove(classes.unpinned, classes.pinned, classes.top, classes.notTop, classes.initial);\r\n this.scroller.removeEventListener('scroll', this.debouncer, false);\r\n },\r\n\r\n /**\r\n * Attaches the scroll event\r\n * @private\r\n */\r\n attachEvent: function () {\r\n if (!this.initialised) {\r\n this.lastKnownScrollY = this.getScrollY();\r\n this.initialised = true;\r\n this.scroller.addEventListener('scroll', this.debouncer, false);\r\n\r\n this.debouncer.handleEvent();\r\n }\r\n },\r\n\r\n /**\r\n * Unpins the header if it's currently pinned\r\n */\r\n unpin: function () {\r\n var classList = this.elem.classList,\r\n classes = this.classes;\r\n\r\n if (classList.contains(classes.pinned) || !classList.contains(classes.unpinned)) {\r\n classList.add(classes.unpinned);\r\n classList.remove(classes.pinned);\r\n this.onUnpin && this.onUnpin.call(this);\r\n }\r\n },\r\n\r\n /**\r\n * Pins the header if it's currently unpinned\r\n */\r\n pin: function () {\r\n var classList = this.elem.classList,\r\n classes = this.classes;\r\n\r\n if (classList.contains(classes.unpinned)) {\r\n classList.remove(classes.unpinned);\r\n classList.add(classes.pinned);\r\n this.onPin && this.onPin.call(this);\r\n }\r\n },\r\n\r\n /**\r\n * Handles the top states\r\n */\r\n top: function () {\r\n var classList = this.elem.classList,\r\n classes = this.classes;\r\n\r\n if (!classList.contains(classes.top)) {\r\n classList.add(classes.top);\r\n classList.remove(classes.notTop);\r\n this.onTop && this.onTop.call(this);\r\n }\r\n },\r\n\r\n /**\r\n * Handles the not top state\r\n */\r\n notTop: function () {\r\n var classList = this.elem.classList,\r\n classes = this.classes;\r\n\r\n if (!classList.contains(classes.notTop)) {\r\n classList.add(classes.notTop);\r\n classList.remove(classes.top);\r\n this.onNotTop && this.onNotTop.call(this);\r\n }\r\n },\r\n\r\n bottom: function () {\r\n var classList = this.elem.classList,\r\n classes = this.classes;\r\n\r\n if (!classList.contains(classes.bottom)) {\r\n classList.add(classes.bottom);\r\n classList.remove(classes.notBottom);\r\n this.onBottom && this.onBottom.call(this);\r\n }\r\n },\r\n\r\n /**\r\n * Handles the not top state\r\n */\r\n notBottom: function () {\r\n var classList = this.elem.classList,\r\n classes = this.classes;\r\n\r\n if (!classList.contains(classes.notBottom)) {\r\n classList.add(classes.notBottom);\r\n classList.remove(classes.bottom);\r\n this.onNotBottom && this.onNotBottom.call(this);\r\n }\r\n },\r\n\r\n /**\r\n * Gets the Y scroll position\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY\r\n * @return {Number} pixels the page has scrolled along the Y-axis\r\n */\r\n getScrollY: function () {\r\n return (this.scroller.pageYOffset !== undefined)\r\n ? this.scroller.pageYOffset\r\n : (this.scroller.scrollTop !== undefined)\r\n ? this.scroller.scrollTop\r\n : (document.documentElement || document.body.parentNode || document.body).scrollTop;\r\n },\r\n\r\n /**\r\n * Gets the height of the viewport\r\n * @see http://andylangton.co.uk/blog/development/get-viewport-size-width-and-height-javascript\r\n * @return {int} the height of the viewport in pixels\r\n */\r\n getViewportHeight: function () {\r\n return window.innerHeight\r\n || document.documentElement.clientHeight\r\n || document.body.clientHeight;\r\n },\r\n\r\n /**\r\n * Gets the physical height of the DOM element\r\n * @param {Object} elm the element to calculate the physical height of which\r\n * @return {int} the physical height of the element in pixels\r\n */\r\n getElementPhysicalHeight: function (elm) {\r\n return Math.max(\r\n elm.offsetHeight,\r\n elm.clientHeight\r\n );\r\n },\r\n\r\n /**\r\n * Gets the physical height of the scroller element\r\n * @return {int} the physical height of the scroller element in pixels\r\n */\r\n getScrollerPhysicalHeight: function () {\r\n return (this.scroller === window || this.scroller === document.body)\r\n ? this.getViewportHeight()\r\n : this.getElementPhysicalHeight(this.scroller);\r\n },\r\n\r\n /**\r\n * Gets the height of the document\r\n * @see http://james.padolsey.com/javascript/get-document-height-cross-browser/\r\n * @return {int} the height of the document in pixels\r\n */\r\n getDocumentHeight: function () {\r\n var body = document.body,\r\n documentElement = document.documentElement;\r\n\r\n return Math.max(\r\n body.scrollHeight, documentElement.scrollHeight,\r\n body.offsetHeight, documentElement.offsetHeight,\r\n body.clientHeight, documentElement.clientHeight\r\n );\r\n },\r\n\r\n /**\r\n * Gets the height of the DOM element\r\n * @param {Object} elm the element to calculate the height of which\r\n * @return {int} the height of the element in pixels\r\n */\r\n getElementHeight: function (elm) {\r\n return Math.max(\r\n elm.scrollHeight,\r\n elm.offsetHeight,\r\n elm.clientHeight\r\n );\r\n },\r\n\r\n /**\r\n * Gets the height of the scroller element\r\n * @return {int} the height of the scroller element in pixels\r\n */\r\n getScrollerHeight: function () {\r\n return (this.scroller === window || this.scroller === document.body)\r\n ? this.getDocumentHeight()\r\n : this.getElementHeight(this.scroller);\r\n },\r\n\r\n /**\r\n * determines if the scroll position is outside of document boundaries\r\n * @param {int} currentScrollY the current y scroll position\r\n * @return {bool} true if out of bounds, false otherwise\r\n */\r\n isOutOfBounds: function (currentScrollY) {\r\n var pastTop = currentScrollY < 0,\r\n pastBottom = currentScrollY + this.getScrollerPhysicalHeight() > this.getScrollerHeight();\r\n\r\n return pastTop || pastBottom;\r\n },\r\n\r\n /**\r\n * determines if the tolerance has been exceeded\r\n * @param {int} currentScrollY the current scroll y position\r\n * @return {bool} true if tolerance exceeded, false otherwise\r\n */\r\n toleranceExceeded: function (currentScrollY, direction) {\r\n return Math.abs(currentScrollY - this.lastKnownScrollY) >= this.tolerance[direction];\r\n },\r\n\r\n /**\r\n * determine if it is appropriate to unpin\r\n * @param {int} currentScrollY the current y scroll position\r\n * @param {bool} toleranceExceeded has the tolerance been exceeded?\r\n * @return {bool} true if should unpin, false otherwise\r\n */\r\n shouldUnpin: function (currentScrollY, toleranceExceeded) {\r\n var scrollingDown = currentScrollY > this.lastKnownScrollY,\r\n pastOffset = currentScrollY >= this.offset;\r\n\r\n return scrollingDown && pastOffset && toleranceExceeded;\r\n },\r\n\r\n /**\r\n * determine if it is appropriate to pin\r\n * @param {int} currentScrollY the current y scroll position\r\n * @param {bool} toleranceExceeded has the tolerance been exceeded?\r\n * @return {bool} true if should pin, false otherwise\r\n */\r\n shouldPin: function (currentScrollY, toleranceExceeded) {\r\n var scrollingUp = currentScrollY < this.lastKnownScrollY,\r\n pastOffset = currentScrollY <= this.offset;\r\n\r\n return (scrollingUp && toleranceExceeded) || pastOffset;\r\n },\r\n\r\n /**\r\n * Handles updating the state of the widget\r\n */\r\n update: function () {\r\n var currentScrollY = this.getScrollY(),\r\n scrollDirection = currentScrollY > this.lastKnownScrollY ? 'down' : 'up',\r\n toleranceExceeded = this.toleranceExceeded(currentScrollY, scrollDirection);\r\n\r\n if (this.isOutOfBounds(currentScrollY)) { // Ignore bouncy scrolling in OSX\r\n return;\r\n }\r\n\r\n if (currentScrollY <= this.offset) {\r\n this.top();\r\n } else {\r\n this.notTop();\r\n }\r\n\r\n if (currentScrollY + this.getViewportHeight() >= this.getScrollerHeight()) {\r\n this.bottom();\r\n }\r\n else {\r\n this.notBottom();\r\n }\r\n\r\n if (this.shouldUnpin(currentScrollY, toleranceExceeded)) {\r\n this.unpin();\r\n }\r\n else if (this.shouldPin(currentScrollY, toleranceExceeded)) {\r\n this.pin();\r\n }\r\n\r\n this.lastKnownScrollY = currentScrollY;\r\n }\r\n };\r\n /**\r\n * Default options\r\n * @type {Object}\r\n */\r\n Headroom.options = {\r\n tolerance: {\r\n up: 0,\r\n down: 0\r\n },\r\n offset: 0,\r\n scroller: window,\r\n classes: {\r\n pinned: 'headroom--pinned',\r\n unpinned: 'headroom--unpinned',\r\n top: 'headroom--top',\r\n notTop: 'headroom--not-top',\r\n bottom: 'headroom--bottom',\r\n notBottom: 'headroom--not-bottom',\r\n initial: 'headroom'\r\n }\r\n };\r\n Headroom.cutsTheMustard = typeof features !== 'undefined' && features.rAF && features.bind && features.classList;\r\n\r\n return Headroom;\r\n}));\r\n\n/*! lightslider - v1.1.6 - 2016-10-25\r\n* https://github.com/sachinchoolur/lightslider\r\n* Copyright (c) 2016 Sachin N; Licensed MIT */\r\n(function ($, undefined) {\r\n 'use strict';\r\n var defaults = {\r\n item: 3,\r\n autoWidth: false,\r\n slideMove: 1,\r\n slideMargin: 10,\r\n addClass: '',\r\n mode: 'slide',\r\n useCSS: true,\r\n cssEasing: 'ease', //'cubic-bezier(0.25, 0, 0.25, 1)',\r\n easing: 'linear', //'for jquery animation',//\r\n speed: 400, //ms'\r\n auto: false,\r\n pauseOnHover: false,\r\n loop: false,\r\n slideEndAnimation: true,\r\n pause: 2000,\r\n keyPress: false,\r\n controls: true,\r\n prevHtml: '',\r\n nextHtml: '',\r\n rtl: false,\r\n adaptiveHeight: false,\r\n vertical: false,\r\n verticalHeight: 500,\r\n vThumbWidth: 100,\r\n thumbItem: 10,\r\n pager: true,\r\n gallery: false,\r\n galleryMargin: 5,\r\n thumbMargin: 5,\r\n currentPagerPosition: 'middle',\r\n enableTouch: true,\r\n enableDrag: true,\r\n freeMove: true,\r\n swipeThreshold: 40,\r\n responsive: [],\r\n /* jshint ignore:start */\r\n onBeforeStart: function ($el) {},\r\n onSliderLoad: function ($el) {},\r\n onBeforeSlide: function ($el, scene) {},\r\n onAfterSlide: function ($el, scene) {},\r\n onBeforeNextSlide: function ($el, scene) {},\r\n onBeforePrevSlide: function ($el, scene) {}\r\n /* jshint ignore:end */\r\n };\r\n $.fn.lightSlider = function (options) {\r\n if (this.length === 0) {\r\n return this;\r\n }\r\n\r\n if (this.length > 1) {\r\n this.each(function () {\r\n $(this).lightSlider(options);\r\n });\r\n return this;\r\n }\r\n\r\n var plugin = {},\r\n settings = $.extend(true, {}, defaults, options),\r\n settingsTemp = {},\r\n $el = this;\r\n plugin.$el = this;\r\n\r\n if (settings.mode === 'fade') {\r\n settings.vertical = false;\r\n }\r\n var $children = $el.children(),\r\n windowW = $(window).width(),\r\n breakpoint = null,\r\n resposiveObj = null,\r\n length = 0,\r\n w = 0,\r\n on = false,\r\n elSize = 0,\r\n $slide = '',\r\n scene = 0,\r\n property = (settings.vertical === true) ? 'height' : 'width',\r\n gutter = (settings.vertical === true) ? 'margin-bottom' : 'margin-right',\r\n slideValue = 0,\r\n pagerWidth = 0,\r\n slideWidth = 0,\r\n thumbWidth = 0,\r\n interval = null,\r\n isTouch = ('ontouchstart' in document.documentElement);\r\n var refresh = {};\r\n\r\n refresh.chbreakpoint = function () {\r\n windowW = $(window).width();\r\n if (settings.responsive.length) {\r\n var item;\r\n if (settings.autoWidth === false) {\r\n item = settings.item;\r\n }\r\n if (windowW < settings.responsive[0].breakpoint) {\r\n for (var i = 0; i < settings.responsive.length; i++) {\r\n if (windowW < settings.responsive[i].breakpoint) {\r\n breakpoint = settings.responsive[i].breakpoint;\r\n resposiveObj = settings.responsive[i];\r\n }\r\n }\r\n }\r\n if (typeof resposiveObj !== 'undefined' && resposiveObj !== null) {\r\n for (var j in resposiveObj.settings) {\r\n if (resposiveObj.settings.hasOwnProperty(j)) {\r\n if (typeof settingsTemp[j] === 'undefined' || settingsTemp[j] === null) {\r\n settingsTemp[j] = settings[j];\r\n }\r\n settings[j] = resposiveObj.settings[j];\r\n }\r\n }\r\n }\r\n if (!$.isEmptyObject(settingsTemp) && windowW > settings.responsive[0].breakpoint) {\r\n for (var k in settingsTemp) {\r\n if (settingsTemp.hasOwnProperty(k)) {\r\n settings[k] = settingsTemp[k];\r\n }\r\n }\r\n }\r\n if (settings.autoWidth === false) {\r\n if (slideValue > 0 && slideWidth > 0) {\r\n if (item !== settings.item) {\r\n scene = Math.round(slideValue / ((slideWidth + settings.slideMargin) * settings.slideMove));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n refresh.calSW = function () {\r\n if (settings.autoWidth === false) {\r\n slideWidth = (elSize - ((settings.item * (settings.slideMargin)) - settings.slideMargin)) / settings.item;\r\n }\r\n };\r\n\r\n refresh.calWidth = function (cln) {\r\n var ln = cln === true ? $slide.find('.lslide').length : $children.length;\r\n if (settings.autoWidth === false) {\r\n w = ln * (slideWidth + settings.slideMargin);\r\n } else {\r\n w = 0;\r\n for (var i = 0; i < ln; i++) {\r\n w += (parseInt($children.eq(i).width()) + settings.slideMargin);\r\n }\r\n }\r\n return w;\r\n };\r\n plugin = {\r\n doCss: function () {\r\n var support = function () {\r\n var transition = ['transition', 'MozTransition', 'WebkitTransition', 'OTransition', 'msTransition', 'KhtmlTransition'];\r\n var root = document.documentElement;\r\n for (var i = 0; i < transition.length; i++) {\r\n if (transition[i] in root.style) {\r\n return true;\r\n }\r\n }\r\n };\r\n if (settings.useCSS && support()) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n keyPress: function () {\r\n if (settings.keyPress) {\r\n $(document).on('keyup.lightslider', function (e) {\r\n if (!$(':focus').is('input, textarea')) {\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n } else {\r\n e.returnValue = false;\r\n }\r\n if (e.keyCode === 37) {\r\n $el.goToPrevSlide();\r\n } else if (e.keyCode === 39) {\r\n $el.goToNextSlide();\r\n }\r\n }\r\n });\r\n }\r\n },\r\n controls: function () {\r\n if (settings.controls) {\r\n $el.after('
' + settings.prevHtml + '' + settings.nextHtml + '
');\r\n if (!settings.autoWidth) {\r\n if (length <= settings.item) {\r\n $slide.find('.lSAction').hide();\r\n }\r\n } else {\r\n if (refresh.calWidth(false) < elSize) {\r\n $slide.find('.lSAction').hide();\r\n }\r\n }\r\n $slide.find('.lSAction a').on('click', function (e) {\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n } else {\r\n e.returnValue = false;\r\n }\r\n if ($(this).attr('class') === 'lSPrev') {\r\n $el.goToPrevSlide();\r\n } else {\r\n $el.goToNextSlide();\r\n }\r\n return false;\r\n });\r\n }\r\n },\r\n initialStyle: function () {\r\n var $this = this;\r\n if (settings.mode === 'fade') {\r\n settings.autoWidth = false;\r\n settings.slideEndAnimation = false;\r\n }\r\n if (settings.auto) {\r\n settings.slideEndAnimation = false;\r\n }\r\n if (settings.autoWidth) {\r\n settings.slideMove = 1;\r\n settings.item = 1;\r\n }\r\n if (settings.loop) {\r\n settings.slideMove = 1;\r\n settings.freeMove = false;\r\n }\r\n settings.onBeforeStart.call(this, $el);\r\n refresh.chbreakpoint();\r\n $el.addClass('lightSlider').wrap('
');\r\n $slide = $el.parent('.lSSlideWrapper');\r\n if (settings.rtl === true) {\r\n $slide.parent().addClass('lSrtl');\r\n }\r\n if (settings.vertical) {\r\n $slide.parent().addClass('vertical');\r\n elSize = settings.verticalHeight;\r\n $slide.css('height', elSize + 'px');\r\n } else {\r\n elSize = $el.outerWidth();\r\n }\r\n $children.addClass('lslide');\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n refresh.calSW();\r\n refresh.clone = function () {\r\n if (refresh.calWidth(true) > elSize) {\r\n /**/\r\n var tWr = 0,\r\n tI = 0;\r\n for (var k = 0; k < $children.length; k++) {\r\n tWr += (parseInt($el.find('.lslide').eq(k).width()) + settings.slideMargin);\r\n tI++;\r\n if (tWr >= (elSize + settings.slideMargin)) {\r\n break;\r\n }\r\n }\r\n var tItem = settings.autoWidth === true ? tI : settings.item;\r\n\r\n /**/\r\n if (tItem < $el.find('.clone.left').length) {\r\n for (var i = 0; i < $el.find('.clone.left').length - tItem; i++) {\r\n $children.eq(i).remove();\r\n }\r\n }\r\n if (tItem < $el.find('.clone.right').length) {\r\n for (var j = $children.length - 1; j > ($children.length - 1 - $el.find('.clone.right').length); j--) {\r\n scene--;\r\n $children.eq(j).remove();\r\n }\r\n }\r\n /**/\r\n for (var n = $el.find('.clone.right').length; n < tItem; n++) {\r\n $el.find('.lslide').eq(n).clone().removeClass('lslide').addClass('clone right').appendTo($el);\r\n scene++;\r\n }\r\n for (var m = $el.find('.lslide').length - $el.find('.clone.left').length; m > ($el.find('.lslide').length - tItem); m--) {\r\n $el.find('.lslide').eq(m - 1).clone().removeClass('lslide').addClass('clone left').prependTo($el);\r\n }\r\n $children = $el.children();\r\n } else {\r\n if ($children.hasClass('clone')) {\r\n $el.find('.clone').remove();\r\n $this.move($el, 0);\r\n }\r\n }\r\n };\r\n refresh.clone();\r\n }\r\n refresh.sSW = function () {\r\n length = $children.length;\r\n if (settings.rtl === true && settings.vertical === false) {\r\n gutter = 'margin-left';\r\n }\r\n if (settings.autoWidth === false) {\r\n $children.css(property, slideWidth + 'px');\r\n }\r\n $children.css(gutter, settings.slideMargin + 'px');\r\n w = refresh.calWidth(false);\r\n $el.css(property, w + 'px');\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n if (on === false) {\r\n scene = $el.find('.clone.left').length;\r\n }\r\n }\r\n };\r\n refresh.calL = function () {\r\n $children = $el.children();\r\n length = $children.length;\r\n };\r\n if (this.doCss()) {\r\n $slide.addClass('usingCss');\r\n }\r\n refresh.calL();\r\n if (settings.mode === 'slide') {\r\n refresh.calSW();\r\n refresh.sSW();\r\n if (settings.loop === true) {\r\n slideValue = $this.slideValue();\r\n this.move($el, slideValue);\r\n }\r\n if (settings.vertical === false) {\r\n this.setHeight($el, false);\r\n }\r\n\r\n } else {\r\n this.setHeight($el, true);\r\n $el.addClass('lSFade');\r\n if (!this.doCss()) {\r\n $children.fadeOut(0);\r\n $children.eq(scene).fadeIn(0);\r\n }\r\n }\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n $children.eq(scene).addClass('active');\r\n } else {\r\n $children.first().addClass('active');\r\n }\r\n },\r\n pager: function () {\r\n var $this = this;\r\n refresh.createPager = function () {\r\n thumbWidth = (elSize - ((settings.thumbItem * (settings.thumbMargin)) - settings.thumbMargin)) / settings.thumbItem;\r\n var $children = $slide.find('.lslide');\r\n var length = $slide.find('.lslide').length;\r\n var i = 0,\r\n pagers = '',\r\n v = 0;\r\n for (i = 0; i < length; i++) {\r\n if (settings.mode === 'slide') {\r\n // calculate scene * slide value\r\n if (!settings.autoWidth) {\r\n v = i * ((slideWidth + settings.slideMargin) * settings.slideMove);\r\n } else {\r\n v += ((parseInt($children.eq(i).width()) + settings.slideMargin) * settings.slideMove);\r\n }\r\n }\r\n var thumb = $children.eq(i * settings.slideMove).attr('data-thumb');\r\n if (settings.gallery === true) {\r\n //pagers += '
  • ';\r\n pagers += '
  • ';\r\n } else {\r\n pagers += '
  • ' + (i + 1) + '
  • ';\r\n }\r\n if (settings.mode === 'slide') {\r\n if ((v) >= w - elSize - settings.slideMargin) {\r\n i = i + 1;\r\n var minPgr = 2;\r\n if (settings.autoWidth) {\r\n pagers += '
  • ' + (i + 1) + '
  • ';\r\n minPgr = 1;\r\n }\r\n if (i < minPgr) {\r\n pagers = null;\r\n $slide.parent().addClass('noPager');\r\n } else {\r\n $slide.parent().removeClass('noPager');\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n var $cSouter = $slide.parent();\r\n $cSouter.find('.lSPager').html(pagers);\r\n if (settings.gallery === true) {\r\n if (settings.vertical === true) {\r\n // set Gallery thumbnail width\r\n $cSouter.find('.lSPager').css('width', settings.vThumbWidth + 'px');\r\n }\r\n pagerWidth = (i * (settings.thumbMargin + thumbWidth)) + 0.5;\r\n $cSouter.find('.lSPager').css({\r\n property: pagerWidth + 'px',\r\n 'transition-duration': settings.speed + 'ms'\r\n });\r\n if (settings.vertical === true) {\r\n $slide.parent().css('padding-right', (settings.vThumbWidth + settings.galleryMargin) + 'px');\r\n }\r\n $cSouter.find('.lSPager').css(property, pagerWidth + 'px');\r\n }\r\n var $pager = $cSouter.find('.lSPager').find('li');\r\n $pager.first().addClass('active');\r\n $pager.on('click', function () {\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n scene = scene + ($pager.index(this) - $cSouter.find('.lSPager').find('li.active').index());\r\n } else {\r\n scene = $pager.index(this);\r\n }\r\n $el.mode(false);\r\n if (settings.gallery === true) {\r\n $this.slideThumb();\r\n }\r\n return false;\r\n });\r\n };\r\n if (settings.pager) {\r\n var cl = 'lSpg';\r\n if (settings.gallery) {\r\n cl = 'lSGallery';\r\n }\r\n $slide.after('');\r\n var gMargin = (settings.vertical) ? 'margin-left' : 'margin-top';\r\n $slide.parent().find('.lSPager').css(gMargin, settings.galleryMargin + 'px');\r\n refresh.createPager();\r\n }\r\n\r\n setTimeout(function () {\r\n refresh.init();\r\n }, 0);\r\n },\r\n setHeight: function (ob, fade) {\r\n var obj = null,\r\n $this = this;\r\n if (settings.loop) {\r\n obj = ob.children('.lslide ').first();\r\n } else {\r\n obj = ob.children().first();\r\n }\r\n var setCss = function () {\r\n var tH = obj.outerHeight(),\r\n tP = 0,\r\n tHT = tH;\r\n if (fade) {\r\n tH = 0;\r\n tP = ((tHT) * 100) / elSize;\r\n }\r\n ob.css({\r\n 'height': tH + 'px',\r\n 'padding-bottom': tP + '%'\r\n });\r\n };\r\n setCss();\r\n if (obj.find('img').length) {\r\n if ( obj.find('img')[0].complete) {\r\n setCss();\r\n if (!interval) {\r\n $this.auto();\r\n }\r\n }else{\r\n obj.find('img').on('load', function () {\r\n setTimeout(function () {\r\n setCss();\r\n if (!interval) {\r\n $this.auto();\r\n }\r\n }, 100);\r\n });\r\n }\r\n }else{\r\n if (!interval) {\r\n $this.auto();\r\n }\r\n }\r\n },\r\n active: function (ob, t) {\r\n if (this.doCss() && settings.mode === 'fade') {\r\n $slide.addClass('on');\r\n }\r\n var sc = 0;\r\n if (scene * settings.slideMove < length) {\r\n ob.removeClass('active');\r\n if (!this.doCss() && settings.mode === 'fade' && t === false) {\r\n ob.fadeOut(settings.speed);\r\n }\r\n if (t === true) {\r\n sc = scene;\r\n } else {\r\n sc = scene * settings.slideMove;\r\n }\r\n //t === true ? sc = scene : sc = scene * settings.slideMove;\r\n var l, nl;\r\n if (t === true) {\r\n l = ob.length;\r\n nl = l - 1;\r\n if (sc + 1 >= l) {\r\n sc = nl;\r\n }\r\n }\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n //t === true ? sc = scene - $el.find('.clone.left').length : sc = scene * settings.slideMove;\r\n if (t === true) {\r\n sc = scene - $el.find('.clone.left').length;\r\n } else {\r\n sc = scene * settings.slideMove;\r\n }\r\n if (t === true) {\r\n l = ob.length;\r\n nl = l - 1;\r\n if (sc + 1 === l) {\r\n sc = nl;\r\n } else if (sc + 1 > l) {\r\n sc = 0;\r\n }\r\n }\r\n }\r\n\r\n if (!this.doCss() && settings.mode === 'fade' && t === false) {\r\n ob.eq(sc).fadeIn(settings.speed);\r\n }\r\n ob.eq(sc).addClass('active');\r\n } else {\r\n ob.removeClass('active');\r\n ob.eq(ob.length - 1).addClass('active');\r\n if (!this.doCss() && settings.mode === 'fade' && t === false) {\r\n ob.fadeOut(settings.speed);\r\n ob.eq(sc).fadeIn(settings.speed);\r\n }\r\n }\r\n },\r\n move: function (ob, v) {\r\n if (settings.rtl === true) {\r\n v = -v;\r\n }\r\n if (this.doCss()) {\r\n if (settings.vertical === true) {\r\n ob.css({\r\n 'transform': 'translate3d(0px, ' + (-v) + 'px, 0px)',\r\n '-webkit-transform': 'translate3d(0px, ' + (-v) + 'px, 0px)'\r\n });\r\n } else {\r\n ob.css({\r\n 'transform': 'translate3d(' + (-v) + 'px, 0px, 0px)',\r\n '-webkit-transform': 'translate3d(' + (-v) + 'px, 0px, 0px)',\r\n });\r\n }\r\n } else {\r\n if (settings.vertical === true) {\r\n ob.css('position', 'relative').animate({\r\n top: -v + 'px'\r\n }, settings.speed, settings.easing);\r\n } else {\r\n ob.css('position', 'relative').animate({\r\n left: -v + 'px'\r\n }, settings.speed, settings.easing);\r\n }\r\n }\r\n var $thumb = $slide.parent().find('.lSPager').find('li');\r\n this.active($thumb, true);\r\n },\r\n fade: function () {\r\n this.active($children, false);\r\n var $thumb = $slide.parent().find('.lSPager').find('li');\r\n this.active($thumb, true);\r\n },\r\n slide: function () {\r\n var $this = this;\r\n refresh.calSlide = function () {\r\n if (w > elSize) {\r\n slideValue = $this.slideValue();\r\n $this.active($children, false);\r\n if ((slideValue) > w - elSize - settings.slideMargin) {\r\n slideValue = w - elSize - settings.slideMargin;\r\n } else if (slideValue < 0) {\r\n slideValue = 0;\r\n }\r\n $this.move($el, slideValue);\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n if (scene >= (length - ($el.find('.clone.left').length / settings.slideMove))) {\r\n $this.resetSlide($el.find('.clone.left').length);\r\n }\r\n if (scene === 0) {\r\n $this.resetSlide($slide.find('.lslide').length);\r\n }\r\n }\r\n }\r\n };\r\n refresh.calSlide();\r\n },\r\n resetSlide: function (s) {\r\n var $this = this;\r\n $slide.find('.lSAction a').addClass('disabled');\r\n setTimeout(function () {\r\n scene = s;\r\n $slide.css('transition-duration', '0ms');\r\n slideValue = $this.slideValue();\r\n $this.active($children, false);\r\n plugin.move($el, slideValue);\r\n setTimeout(function () {\r\n $slide.css('transition-duration', settings.speed + 'ms');\r\n $slide.find('.lSAction a').removeClass('disabled');\r\n }, 50);\r\n }, settings.speed + 100);\r\n },\r\n slideValue: function () {\r\n var _sV = 0;\r\n if (settings.autoWidth === false) {\r\n _sV = scene * ((slideWidth + settings.slideMargin) * settings.slideMove);\r\n } else {\r\n _sV = 0;\r\n for (var i = 0; i < scene; i++) {\r\n _sV += (parseInt($children.eq(i).width()) + settings.slideMargin);\r\n }\r\n }\r\n return _sV;\r\n },\r\n slideThumb: function () {\r\n var position;\r\n switch (settings.currentPagerPosition) {\r\n case 'left':\r\n position = 0;\r\n break;\r\n case 'middle':\r\n position = (elSize / 2) - (thumbWidth / 2);\r\n break;\r\n case 'right':\r\n position = elSize - thumbWidth;\r\n }\r\n var sc = scene - $el.find('.clone.left').length;\r\n var $pager = $slide.parent().find('.lSPager');\r\n if (settings.mode === 'slide' && settings.loop === true) {\r\n if (sc >= $pager.children().length) {\r\n sc = 0;\r\n } else if (sc < 0) {\r\n sc = $pager.children().length;\r\n }\r\n }\r\n var thumbSlide = sc * ((thumbWidth + settings.thumbMargin)) - (position);\r\n if ((thumbSlide + elSize) > pagerWidth) {\r\n thumbSlide = pagerWidth - elSize - settings.thumbMargin;\r\n }\r\n if (thumbSlide < 0) {\r\n thumbSlide = 0;\r\n }\r\n this.move($pager, thumbSlide);\r\n },\r\n auto: function () {\r\n if (settings.auto) {\r\n clearInterval(interval);\r\n interval = setInterval(function () {\r\n $el.goToNextSlide();\r\n }, settings.pause);\r\n }\r\n },\r\n pauseOnHover: function(){\r\n var $this = this;\r\n if (settings.auto && settings.pauseOnHover) {\r\n $slide.on('mouseenter', function(){\r\n $(this).addClass('ls-hover');\r\n $el.pause();\r\n settings.auto = true;\r\n });\r\n $slide.on('mouseleave',function(){\r\n $(this).removeClass('ls-hover');\r\n if (!$slide.find('.lightSlider').hasClass('lsGrabbing')) {\r\n $this.auto();\r\n }\r\n });\r\n }\r\n },\r\n touchMove: function (endCoords, startCoords) {\r\n $slide.css('transition-duration', '0ms');\r\n if (settings.mode === 'slide') {\r\n var distance = endCoords - startCoords;\r\n var swipeVal = slideValue - distance;\r\n if ((swipeVal) >= w - elSize - settings.slideMargin) {\r\n if (settings.freeMove === false) {\r\n swipeVal = w - elSize - settings.slideMargin;\r\n } else {\r\n var swipeValT = w - elSize - settings.slideMargin;\r\n swipeVal = swipeValT + ((swipeVal - swipeValT) / 5);\r\n\r\n }\r\n } else if (swipeVal < 0) {\r\n if (settings.freeMove === false) {\r\n swipeVal = 0;\r\n } else {\r\n swipeVal = swipeVal / 5;\r\n }\r\n }\r\n this.move($el, swipeVal);\r\n }\r\n },\r\n\r\n touchEnd: function (distance) {\r\n $slide.css('transition-duration', settings.speed + 'ms');\r\n if (settings.mode === 'slide') {\r\n var mxVal = false;\r\n var _next = true;\r\n slideValue = slideValue - distance;\r\n if ((slideValue) > w - elSize - settings.slideMargin) {\r\n slideValue = w - elSize - settings.slideMargin;\r\n if (settings.autoWidth === false) {\r\n mxVal = true;\r\n }\r\n } else if (slideValue < 0) {\r\n slideValue = 0;\r\n }\r\n var gC = function (next) {\r\n var ad = 0;\r\n if (!mxVal) {\r\n if (next) {\r\n ad = 1;\r\n }\r\n }\r\n if (!settings.autoWidth) {\r\n var num = slideValue / ((slideWidth + settings.slideMargin) * settings.slideMove);\r\n scene = parseInt(num) + ad;\r\n if (slideValue >= (w - elSize - settings.slideMargin)) {\r\n if (num % 1 !== 0) {\r\n scene++;\r\n }\r\n }\r\n } else {\r\n var tW = 0;\r\n for (var i = 0; i < $children.length; i++) {\r\n tW += (parseInt($children.eq(i).width()) + settings.slideMargin);\r\n scene = i + ad;\r\n if (tW >= slideValue) {\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n if (distance >= settings.swipeThreshold) {\r\n gC(false);\r\n _next = false;\r\n } else if (distance <= -settings.swipeThreshold) {\r\n gC(true);\r\n _next = false;\r\n }\r\n $el.mode(_next);\r\n this.slideThumb();\r\n } else {\r\n if (distance >= settings.swipeThreshold) {\r\n $el.goToPrevSlide();\r\n } else if (distance <= -settings.swipeThreshold) {\r\n $el.goToNextSlide();\r\n }\r\n }\r\n },\r\n\r\n\r\n\r\n enableDrag: function () {\r\n var $this = this;\r\n if (!isTouch) {\r\n var startCoords = 0,\r\n endCoords = 0,\r\n isDraging = false;\r\n $slide.find('.lightSlider').addClass('lsGrab');\r\n $slide.on('mousedown', function (e) {\r\n if (w < elSize) {\r\n if (w !== 0) {\r\n return false;\r\n }\r\n }\r\n if ($(e.target).attr('class') !== ('lSPrev') && $(e.target).attr('class') !== ('lSNext')) {\r\n startCoords = (settings.vertical === true) ? e.pageY : e.pageX;\r\n isDraging = true;\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n } else {\r\n e.returnValue = false;\r\n }\r\n // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723\r\n $slide.scrollLeft += 1;\r\n $slide.scrollLeft -= 1;\r\n // *\r\n $slide.find('.lightSlider').removeClass('lsGrab').addClass('lsGrabbing');\r\n clearInterval(interval);\r\n }\r\n });\r\n $(window).on('mousemove', function (e) {\r\n if (isDraging) {\r\n endCoords = (settings.vertical === true) ? e.pageY : e.pageX;\r\n $this.touchMove(endCoords, startCoords);\r\n }\r\n });\r\n $(window).on('mouseup', function (e) {\r\n if (isDraging) {\r\n $slide.find('.lightSlider').removeClass('lsGrabbing').addClass('lsGrab');\r\n isDraging = false;\r\n endCoords = (settings.vertical === true) ? e.pageY : e.pageX;\r\n var distance = endCoords - startCoords;\r\n if (Math.abs(distance) >= settings.swipeThreshold) {\r\n $(window).on('click.ls', function (e) {\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n } else {\r\n e.returnValue = false;\r\n }\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n $(window).off('click.ls');\r\n });\r\n }\r\n\r\n $this.touchEnd(distance);\r\n\r\n }\r\n });\r\n }\r\n },\r\n\r\n\r\n\r\n\r\n enableTouch: function () {\r\n var $this = this;\r\n if (isTouch) {\r\n var startCoords = {},\r\n endCoords = {};\r\n $slide.on('touchstart', function (e) {\r\n endCoords = e.originalEvent.targetTouches[0];\r\n startCoords.pageX = e.originalEvent.targetTouches[0].pageX;\r\n startCoords.pageY = e.originalEvent.targetTouches[0].pageY;\r\n clearInterval(interval);\r\n });\r\n $slide.on('touchmove', function (e) {\r\n if (w < elSize) {\r\n if (w !== 0) {\r\n return false;\r\n }\r\n }\r\n var orig = e.originalEvent;\r\n endCoords = orig.targetTouches[0];\r\n var xMovement = Math.abs(endCoords.pageX - startCoords.pageX);\r\n var yMovement = Math.abs(endCoords.pageY - startCoords.pageY);\r\n if (settings.vertical === true) {\r\n if ((yMovement * 3) > xMovement) {\r\n e.preventDefault();\r\n }\r\n $this.touchMove(endCoords.pageY, startCoords.pageY);\r\n } else {\r\n if ((xMovement * 3) > yMovement) {\r\n e.preventDefault();\r\n }\r\n $this.touchMove(endCoords.pageX, startCoords.pageX);\r\n }\r\n\r\n });\r\n $slide.on('touchend', function () {\r\n if (w < elSize) {\r\n if (w !== 0) {\r\n return false;\r\n }\r\n }\r\n var distance;\r\n if (settings.vertical === true) {\r\n distance = endCoords.pageY - startCoords.pageY;\r\n } else {\r\n distance = endCoords.pageX - startCoords.pageX;\r\n }\r\n $this.touchEnd(distance);\r\n });\r\n }\r\n },\r\n build: function () {\r\n var $this = this;\r\n $this.initialStyle();\r\n if (this.doCss()) {\r\n\r\n if (settings.enableTouch === true) {\r\n $this.enableTouch();\r\n }\r\n if (settings.enableDrag === true) {\r\n $this.enableDrag();\r\n }\r\n }\r\n\r\n $(window).on('focus', function(){\r\n $this.auto();\r\n });\r\n\r\n $(window).on('blur', function(){\r\n clearInterval(interval);\r\n });\r\n\r\n $this.pager();\r\n $this.pauseOnHover();\r\n $this.controls();\r\n $this.keyPress();\r\n }\r\n };\r\n plugin.build();\r\n refresh.init = function () {\r\n refresh.chbreakpoint();\r\n if (settings.vertical === true) {\r\n if (settings.item > 1) {\r\n elSize = settings.verticalHeight;\r\n } else {\r\n elSize = $children.outerHeight();\r\n }\r\n $slide.css('height', elSize + 'px');\r\n } else {\r\n elSize = $slide.outerWidth();\r\n }\r\n if (settings.loop === true && settings.mode === 'slide') {\r\n refresh.clone();\r\n }\r\n refresh.calL();\r\n if (settings.mode === 'slide') {\r\n $el.removeClass('lSSlide');\r\n }\r\n if (settings.mode === 'slide') {\r\n refresh.calSW();\r\n refresh.sSW();\r\n }\r\n setTimeout(function () {\r\n if (settings.mode === 'slide') {\r\n $el.addClass('lSSlide');\r\n }\r\n }, 1000);\r\n if (settings.pager) {\r\n refresh.createPager();\r\n }\r\n if (settings.adaptiveHeight === true && settings.vertical === false) {\r\n $el.css('height', $children.eq(scene).outerHeight(true));\r\n }\r\n if (settings.adaptiveHeight === false) {\r\n if (settings.mode === 'slide') {\r\n if (settings.vertical === false) {\r\n plugin.setHeight($el, false);\r\n }else{\r\n plugin.auto();\r\n }\r\n } else {\r\n plugin.setHeight($el, true);\r\n }\r\n }\r\n if (settings.gallery === true) {\r\n plugin.slideThumb();\r\n }\r\n if (settings.mode === 'slide') {\r\n plugin.slide();\r\n }\r\n if (settings.autoWidth === false) {\r\n if ($children.length <= settings.item) {\r\n $slide.find('.lSAction').hide();\r\n } else {\r\n $slide.find('.lSAction').show();\r\n }\r\n } else {\r\n if ((refresh.calWidth(false) < elSize) && (w !== 0)) {\r\n $slide.find('.lSAction').hide();\r\n } else {\r\n $slide.find('.lSAction').show();\r\n }\r\n }\r\n };\r\n $el.goToPrevSlide = function () {\r\n if (scene > 0) {\r\n settings.onBeforePrevSlide.call(this, $el, scene);\r\n scene--;\r\n $el.mode(false);\r\n if (settings.gallery === true) {\r\n plugin.slideThumb();\r\n }\r\n } else {\r\n if (settings.loop === true) {\r\n settings.onBeforePrevSlide.call(this, $el, scene);\r\n if (settings.mode === 'fade') {\r\n var l = (length - 1);\r\n scene = parseInt(l / settings.slideMove);\r\n }\r\n $el.mode(false);\r\n if (settings.gallery === true) {\r\n plugin.slideThumb();\r\n }\r\n } else if (settings.slideEndAnimation === true) {\r\n $el.addClass('leftEnd');\r\n setTimeout(function () {\r\n $el.removeClass('leftEnd');\r\n }, 400);\r\n }\r\n }\r\n };\r\n $el.goToNextSlide = function () {\r\n var nextI = true;\r\n if (settings.mode === 'slide') {\r\n var _slideValue = plugin.slideValue();\r\n nextI = _slideValue < w - elSize - settings.slideMargin;\r\n }\r\n if (((scene * settings.slideMove) < length - settings.slideMove) && nextI) {\r\n settings.onBeforeNextSlide.call(this, $el, scene);\r\n scene++;\r\n $el.mode(false);\r\n if (settings.gallery === true) {\r\n plugin.slideThumb();\r\n }\r\n } else {\r\n if (settings.loop === true) {\r\n settings.onBeforeNextSlide.call(this, $el, scene);\r\n scene = 0;\r\n $el.mode(false);\r\n if (settings.gallery === true) {\r\n plugin.slideThumb();\r\n }\r\n } else if (settings.slideEndAnimation === true) {\r\n $el.addClass('rightEnd');\r\n setTimeout(function () {\r\n $el.removeClass('rightEnd');\r\n }, 400);\r\n }\r\n }\r\n };\r\n $el.mode = function (_touch) {\r\n if (settings.adaptiveHeight === true && settings.vertical === false) {\r\n $el.css('height', $children.eq(scene).outerHeight(true));\r\n }\r\n if (on === false) {\r\n if (settings.mode === 'slide') {\r\n if (plugin.doCss()) {\r\n $el.addClass('lSSlide');\r\n if (settings.speed !== '') {\r\n $slide.css('transition-duration', settings.speed + 'ms');\r\n }\r\n if (settings.cssEasing !== '') {\r\n $slide.css('transition-timing-function', settings.cssEasing);\r\n }\r\n }\r\n } else {\r\n if (plugin.doCss()) {\r\n if (settings.speed !== '') {\r\n $el.css('transition-duration', settings.speed + 'ms');\r\n }\r\n if (settings.cssEasing !== '') {\r\n $el.css('transition-timing-function', settings.cssEasing);\r\n }\r\n }\r\n }\r\n }\r\n if (!_touch) {\r\n settings.onBeforeSlide.call(this, $el, scene);\r\n }\r\n if (settings.mode === 'slide') {\r\n plugin.slide();\r\n } else {\r\n plugin.fade();\r\n }\r\n if (!$slide.hasClass('ls-hover')) {\r\n plugin.auto();\r\n }\r\n setTimeout(function () {\r\n if (!_touch) {\r\n settings.onAfterSlide.call(this, $el, scene);\r\n }\r\n }, settings.speed);\r\n on = true;\r\n };\r\n $el.play = function () {\r\n $el.goToNextSlide();\r\n settings.auto = true;\r\n plugin.auto();\r\n };\r\n $el.pause = function () {\r\n settings.auto = false;\r\n clearInterval(interval);\r\n };\r\n $el.refresh = function () {\r\n refresh.init();\r\n };\r\n $el.getCurrentSlideCount = function () {\r\n var sc = scene;\r\n if (settings.loop) {\r\n var ln = $slide.find('.lslide').length,\r\n cl = $el.find('.clone.left').length;\r\n if (scene <= cl - 1) {\r\n sc = ln + (scene - cl);\r\n } else if (scene >= (ln + cl)) {\r\n sc = scene - ln - cl;\r\n } else {\r\n sc = scene - cl;\r\n }\r\n }\r\n return sc + 1;\r\n };\r\n $el.getTotalSlideCount = function () {\r\n return $slide.find('.lslide').length;\r\n };\r\n $el.goToSlide = function (s) {\r\n if (settings.loop) {\r\n scene = (s + $el.find('.clone.left').length - 1);\r\n } else {\r\n scene = s;\r\n }\r\n $el.mode(false);\r\n if (settings.gallery === true) {\r\n plugin.slideThumb();\r\n }\r\n };\r\n $el.destroy = function () {\r\n if ($el.lightSlider) {\r\n $el.goToPrevSlide = function(){};\r\n $el.goToNextSlide = function(){};\r\n $el.mode = function(){};\r\n $el.play = function(){};\r\n $el.pause = function(){};\r\n $el.refresh = function(){};\r\n $el.getCurrentSlideCount = function(){};\r\n $el.getTotalSlideCount = function(){};\r\n $el.goToSlide = function(){};\r\n $el.lightSlider = null;\r\n refresh = {\r\n init : function(){}\r\n };\r\n $el.parent().parent().find('.lSAction, .lSPager').remove();\r\n $el.removeClass('lightSlider lSFade lSSlide lsGrab lsGrabbing leftEnd right').removeAttr('style').unwrap().unwrap();\r\n $el.children().removeAttr('style');\r\n $children.removeClass('lslide active');\r\n $el.find('.clone').remove();\r\n $children = null;\r\n interval = null;\r\n on = false;\r\n scene = 0;\r\n }\r\n\r\n };\r\n setTimeout(function () {\r\n settings.onSliderLoad.call(this, $el);\r\n }, 10);\r\n $(window).on('resize orientationchange', function (e) {\r\n setTimeout(function () {\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n } else {\r\n e.returnValue = false;\r\n }\r\n refresh.init();\r\n }, 200);\r\n });\r\n return this;\r\n };\r\n}(jQuery));\r\n\n;(function(root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define(['jquery'], factory);\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n root.jquery_mmenu_js = factory(root.jQuery);\r\n }\r\n}(this, function(jQuery) {\r\n/*\r\n * jQuery mmenu v6.1.1\r\n * @requires jQuery 1.7.0 or later\r\n *\r\n * mmenu.frebsite.nl\r\n *\r\n * Copyright (c) Fred Heusschen\r\n * www.frebsite.nl\r\n *\r\n * License: CC-BY-NC-4.0\r\n * http://creativecommons.org/licenses/by-nc/4.0/\r\n */\r\n!function(t){function e(){t[n].glbl||(o={$wndw:t(window),$docu:t(document),$html:t(\"html\"),$body:t(\"body\")},s={},a={},r={},t.each([s,a,r],function(t,e){e.add=function(t){t=t.split(\" \");for(var n=0,i=t.length;n