!function($) { "use strict"; var FOUNDATION_VERSION = '6.1.1'; // Global Foundation object // This is attached to the window, or used as a module for AMD/Browserify var Foundation = { version: FOUNDATION_VERSION, _plugins: {}, _uuids: [], _activePlugins: {}, rtl: function(){ return $('html').attr('dir') === 'rtl'; }, plugin: function(plugin, name) { // Object key to use when adding to global Foundation object // Examples: Foundation.Reveal, Foundation.OffCanvas var className = (name || functionName(plugin)); // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin // Examples: data-reveal, data-off-canvas var attrName = hyphenate(className); // Add to the Foundation object and the plugins list (for reflowing) this._plugins[attrName] = this[className] = plugin; }, registerPlugin: function(plugin, name){ var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase(); plugin.uuid = this.GetYoDigits(6, pluginName); if(!plugin.$element.attr('data-' + pluginName)){ plugin.$element.attr('data-' + pluginName, plugin.uuid); } if(!plugin.$element.data('zfPlugin')){ plugin.$element.data('zfPlugin', plugin); } plugin.$element.trigger('init.zf.' + pluginName); this._uuids.push(plugin.uuid); return; }, unregisterPlugin: function(plugin){ var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor)); this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1); plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin') .trigger('destroyed.zf.' + pluginName); for(var prop in plugin){ plugin[prop] = null;//clean up script to prep for garbage collection. } return; }, reInit: function(plugins){ var isJQ = plugins instanceof $; try{ if(isJQ){ plugins.each(function(){ $(this).data('zfPlugin')._init(); }); }else{ var type = typeof plugins, _this = this, fns = { 'object': function(plgs){ plgs.forEach(function(p){ $('[data-'+ p +']').foundation('_init'); }); }, 'string': function(){ $('[data-'+ plugins +']').foundation('_init'); }, 'undefined': function(){ this['object'](Object.keys(_this._plugins)); } }; fns[type](plugins); } }catch(err){ console.error(err); }finally{ return plugins; } }, GetYoDigits: function(length, namespace){ length = length || 6; return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1) + (namespace ? '-' + namespace : ''); }, reflow: function(elem, plugins) { // If plugins is undefined, just grab everything if (typeof plugins === 'undefined') { plugins = Object.keys(this._plugins); } // If plugins is a string, convert it to an array with one item else if (typeof plugins === 'string') { plugins = [plugins]; } var _this = this; // Iterate through each plugin $.each(plugins, function(i, name) { // Get the current plugin var plugin = _this._plugins[name]; // Localize the search to all elements inside elem, as well as elem itself, unless elem === document var $elem = $(elem).find('[data-'+name+']').addBack('[data-'+name+']'); // For each plugin found, initialize it $elem.each(function() { var $el = $(this), opts = {}; // Don't double-dip on plugins if ($el.data('zfPlugin')) { console.warn("Tried to initialize "+name+" on an element that already has a Foundation plugin."); return; } if($el.attr('data-options')){ var thing = $el.attr('data-options').split(';').forEach(function(e, i){ var opt = e.split(':').map(function(el){ return el.trim(); }); if(opt[0]) opts[opt[0]] = parseValue(opt[1]); }); } try{ $el.data('zfPlugin', new plugin($(this), opts)); }catch(er){ console.error(er); }finally{ return; } }); }); }, getFnName: functionName, transitionend: function($elem){ var transitions = { 'transition': 'transitionend', 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'otransitionend' }; var elem = document.createElement('div'), end; for (var t in transitions){ if (typeof elem.style[t] !== 'undefined'){ end = transitions[t]; } } if(end){ return end; }else{ end = setTimeout(function(){ $elem.triggerHandler('transitionend', [$elem]); }, 1); return 'transitionend'; } } }; Foundation.util = { 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); } }; } }; // TODO: consider not making this a jQuery function // TODO: need way to reflow vs. re-initialize var foundation = function(method) { var type = typeof method, $meta = $('meta.foundation-mq'), $noJS = $('.no-js'); if(!$meta.length){ $('').appendTo(document.head); } if($noJS.length){ $noJS.removeClass('no-js'); } if(type === 'undefined'){//needs to initialize the Foundation object, or an individual plugin. Foundation.MediaQuery._init(); Foundation.reflow(this); }else if(type === 'string'){//an individual method to invoke on a plugin or group of plugins var args = Array.prototype.slice.call(arguments, 1);//collect all the arguments, if necessary var plugClass = this.data('zfPlugin');//determine the class of plugin if(plugClass !== undefined && plugClass[method] !== undefined){//make sure both the class and method exist if(this.length === 1){//if there's only one, call it directly. plugClass[method].apply(plugClass, args); }else{ this.each(function(i, el){//otherwise loop through the jQuery collection and invoke the method on each plugClass[method].apply($(el).data('zfPlugin'), args); }); } }else{//error for no class or no method throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.'); } }else{//error for invalid argument type throw new TypeError("We're sorry, '" + type + "' is not a valid parameter. You must use a string representing the method you wish to invoke."); } return this; }; window.Foundation = Foundation; $.fn.foundation = foundation; // Polyfill for requestAnimationFrame (function() { if (!Date.now || !window.Date.now) window.Date.now = Date.now = function() { return new Date().getTime(); }; var vendors = ['webkit', 'moz']; for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { var vp = vendors[i]; window.requestAnimationFrame = window[vp+'RequestAnimationFrame']; window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame'] || window[vp+'CancelRequestAnimationFrame']); } if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) { var lastTime = 0; window.requestAnimationFrame = function(callback) { var now = Date.now(); var nextTime = Math.max(lastTime + 16, now); return setTimeout(function() { callback(lastTime = nextTime); }, nextTime - now); }; window.cancelAnimationFrame = clearTimeout; } if(!window.performance || !window.performance.now){ window.performance = { start: Date.now(), now: function(){ return Date.now() - this.start; } }; } })(); if (!Function.prototype.bind) { Function.prototype.bind = function(oThis) { if (typeof this !== 'function') { // closest thing possible to the ECMAScript 5 // internal IsCallable function throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function() {}, fBound = function() { return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); }; if (this.prototype) { // native functions don't have a prototype fNOP.prototype = this.prototype; } fBound.prototype = new fNOP(); return fBound; }; } // Polyfill to get the name of a function in IE9 function functionName(fn) { if (Function.prototype.name === undefined) { var funcNameRegex = /function\s([^(]{1,})\(/; var results = (funcNameRegex).exec((fn).toString()); return (results && results.length > 1) ? results[1].trim() : ""; } else if (fn.prototype === undefined) { return fn.constructor.name; } else { return fn.prototype.constructor.name; } } function parseValue(str){ if(/true/.test(str)) return true; else if(/false/.test(str)) return false; else if(!isNaN(str * 1)) return parseFloat(str); return str; } // Convert PascalCase to kebab-case // Thank you: http://stackoverflow.com/a/8955580 function hyphenate(str) { return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); } }(jQuery); !function(Foundation, window){ var ImNotTouchingYou = function(element, parent, lrOnly, tbOnly){ var eleDims = GetDimensions(element), top, bottom, left, right; if(parent){ var parDims = GetDimensions(parent); bottom = (eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top); top = (eleDims.offset.top >= parDims.offset.top); left = (eleDims.offset.left >= parDims.offset.left); right = (eleDims.offset.left + eleDims.width <= parDims.width); }else{ bottom = (eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top); top = (eleDims.offset.top >= eleDims.windowDims.offset.top); left = (eleDims.offset.left >= eleDims.windowDims.offset.left); right = (eleDims.offset.left + eleDims.width <= eleDims.windowDims.width); } var allDirs = [bottom, top, left, right]; if(lrOnly){ return left === right === true; } if(tbOnly){ return top === bottom === true; } return allDirs.indexOf(false) === -1; }; var GetDimensions = function(elem, test){ elem = elem.length ? elem[0] : elem; if(elem === window || elem === document){ throw new Error("I'm sorry, Dave. I'm afraid I can't do that."); } var rect = elem.getBoundingClientRect(), parRect = elem.parentNode.getBoundingClientRect(), winRect = document.body.getBoundingClientRect(), winY = window.pageYOffset, winX = window.pageXOffset; return { width: rect.width, height: rect.height, offset: { top: rect.top + winY, left: rect.left + winX }, parentDims: { width: parRect.width, height: parRect.height, offset: { top: parRect.top + winY, left: parRect.left + winX } }, windowDims: { width: winRect.width, height: winRect.height, offset: { top: winY, left: winX } } }; }; var GetOffsets = function(element, anchor, position, vOffset, hOffset, isOverflow){ var $eleDims = GetDimensions(element), // var $eleDims = GetDimensions(element), $anchorDims = anchor ? GetDimensions(anchor) : null; // $anchorDims = anchor ? GetDimensions(anchor) : null; switch(position){ case 'top': return { left: $anchorDims.offset.left, top: $anchorDims.offset.top - ($eleDims.height + vOffset) }; break; case 'left': return { left: $anchorDims.offset.left - ($eleDims.width + hOffset), top: $anchorDims.offset.top }; break; case 'right': return { left: $anchorDims.offset.left + $anchorDims.width + hOffset, top: $anchorDims.offset.top }; break; case 'center top': return { left: ($anchorDims.offset.left + ($anchorDims.width / 2)) - ($eleDims.width / 2), top: $anchorDims.offset.top - ($eleDims.height + vOffset) }; break; case 'center bottom': return { left: isOverflow ? hOffset : (($anchorDims.offset.left + ($anchorDims.width / 2)) - ($eleDims.width / 2)), top: $anchorDims.offset.top + $anchorDims.height + vOffset }; break; case 'center left': return { left: $anchorDims.offset.left - ($eleDims.width + hOffset), top: ($anchorDims.offset.top + ($anchorDims.height / 2)) - ($eleDims.height / 2) }; break; case 'center right': return { left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1, top: ($anchorDims.offset.top + ($anchorDims.height / 2)) - ($eleDims.height / 2) }; break; case 'center': return { left: ($eleDims.windowDims.offset.left + ($eleDims.windowDims.width / 2)) - ($eleDims.width / 2), top: ($eleDims.windowDims.offset.top + ($eleDims.windowDims.height / 2)) - ($eleDims.height / 2) }; break; case 'reveal': return { left: ($eleDims.windowDims.width - $eleDims.width) / 2, top: $eleDims.windowDims.offset.top + vOffset }; case 'reveal full': return { left: $eleDims.windowDims.offset.left, top: $eleDims.windowDims.offset.top }; break; default: return { left: $anchorDims.offset.left, top: $anchorDims.offset.top + $anchorDims.height + vOffset }; } }; Foundation.Box = { ImNotTouchingYou: ImNotTouchingYou, GetDimensions: GetDimensions, GetOffsets: GetOffsets }; }(window.Foundation, window); !function($, Foundation){ 'use strict'; Foundation.Keyboard = {}; var keyCodes = { 9: 'TAB', 13: 'ENTER', 27: 'ESCAPE', 32: 'SPACE', 37: 'ARROW_LEFT', 38: 'ARROW_UP', 39: 'ARROW_RIGHT', 40: 'ARROW_DOWN' }; var keys = (function(kcs) { var k = {}; for (var kc in kcs) k[kcs[kc]] = kcs[kc]; return k; })(keyCodes); Foundation.Keyboard.keys = keys; var parseKey = function(event) { var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase(); if (event.shiftKey) key = 'SHIFT_' + key; if (event.ctrlKey) key = 'CTRL_' + key; if (event.altKey) key = 'ALT_' + key; return key; }; Foundation.Keyboard.parseKey = parseKey; // plain commands per component go here, ltr and rtl are merged based on orientation var commands = {}; var handleKey = function(event, component, functions) { var commandList = commands[component], keyCode = parseKey(event), cmds, command, fn; if (!commandList) return console.warn('Component not defined!'); if (typeof commandList.ltr === 'undefined') { // this component does not differentiate between ltr and rtl cmds = commandList; // use plain list } else { // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl); else cmds = $.extend({}, commandList.rtl, commandList.ltr); } command = cmds[keyCode]; fn = functions[command]; if (fn && typeof fn === 'function') { // execute function if exists fn.apply(); if (functions.handled || typeof functions.handled === 'function') { // execute function when event was handled functions.handled.apply(); } } else { if (functions.unhandled || typeof functions.unhandled === 'function') { // execute function when event was not handled functions.unhandled.apply(); } } }; Foundation.Keyboard.handleKey = handleKey; var findFocusable = function($element) { return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function() { if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) { return false; } //only have visible elements and those that have a tabindex greater or equal 0 return true; }); }; Foundation.Keyboard.findFocusable = findFocusable; var register = function(componentName, cmds) { commands[componentName] = cmds; }; Foundation.Keyboard.register = register; }(jQuery, window.Foundation); !function($, Foundation) { // Default set of media queries var defaultQueries = { 'default' : 'only screen', landscape : 'only screen and (orientation: landscape)', portrait : 'only screen and (orientation: portrait)', retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)' }; var MediaQuery = { queries: [], current: '', atLeast: function(size) { var query = this.get(size); if (query) { return window.matchMedia(query).matches; } return false; }, get: function(size) { for (var i in this.queries) { var query = this.queries[i]; if (size === query.name) return query.value; } return null; }, _init: function() { var self = this; var extractedStyles = $('.foundation-mq').css('font-family'); var namedQueries; namedQueries = parseStyleToObject(extractedStyles); for (var key in namedQueries) { self.queries.push({ name: key, value: 'only screen and (min-width: ' + namedQueries[key] + ')' }); } this.current = this._getCurrentSize(); this._watcher(); // Extend default queries // namedQueries = $.extend(defaultQueries, namedQueries); }, _getCurrentSize: function() { var matched; for (var i in this.queries) { var query = this.queries[i]; if (window.matchMedia(query.value).matches) { matched = query; } } if(typeof matched === 'object') { return matched.name; } else { return matched; } }, _watcher: function() { var _this = this; $(window).on('resize.zf.mediaquery', function() { var newSize = _this._getCurrentSize(); if (newSize !== _this.current) { // Broadcast the media query change on the window $(window).trigger('changed.zf.mediaquery', [newSize, _this.current]); // Change the current media query _this.current = newSize; } }); } }; Foundation.MediaQuery = MediaQuery; // matchMedia() polyfill - Test a CSS media type/query in JS. // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license window.matchMedia || (window.matchMedia = function() { 'use strict'; // For browsers that support matchMedium api such as IE 9 and webkit var styleMedia = (window.styleMedia || window.media); // For those that don't support matchMedium if (!styleMedia) { var style = document.createElement('style'), script = document.getElementsByTagName('script')[0], info = null; style.type = 'text/css'; style.id = 'matchmediajs-test'; script.parentNode.insertBefore(style, script); // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; styleMedia = { matchMedium: function(media) { var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers if (style.styleSheet) { style.styleSheet.cssText = text; } else { style.textContent = text; } // Test if media query is true or false return info.width === '1px'; } }; } return function(media) { return { matches: styleMedia.matchMedium(media || 'all'), media: media || 'all' }; }; }()); // Thank you: https://github.com/sindresorhus/query-string function parseStyleToObject(str) { var styleObject = {}; if (typeof str !== 'string') { return styleObject; } str = str.trim().slice(1, -1); // browsers re-quote string style values if (!str) { return styleObject; } styleObject = str.split('&').reduce(function(ret, param) { var parts = param.replace(/\+/g, ' ').split('='); var key = parts[0]; var val = parts[1]; key = decodeURIComponent(key); // missing `=` should be `null`: // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters val = val === undefined ? null : decodeURIComponent(val); if (!ret.hasOwnProperty(key)) { ret[key] = val; } else if (Array.isArray(ret[key])) { ret[key].push(val); } else { ret[key] = [ret[key], val]; } return ret; }, {}); return styleObject; } }(jQuery, Foundation); !function($, Foundation) { var initClasses = ['mui-enter', 'mui-leave']; var activeClasses = ['mui-enter-active', 'mui-leave-active']; function animate(isIn, element, animation, cb) { element = $(element).eq(0); if (!element.length) return; var initClass = isIn ? initClasses[0] : initClasses[1]; var activeClass = isIn ? activeClasses[0] : activeClasses[1]; // Set up the animation reset(); element.addClass(animation) .css('transition', 'none'); // .addClass(initClass); // if(isIn) element.show(); requestAnimationFrame(function() { element.addClass(initClass); if (isIn) element.show(); }); // Start the animation requestAnimationFrame(function() { element[0].offsetWidth; element.css('transition', ''); element.addClass(activeClass); }); // Move(500, element, function(){ // // element[0].offsetWidth; // element.css('transition', ''); // element.addClass(activeClass); // }); // Clean up the animation when it finishes element.one(Foundation.transitionend(element), finish);//.one('finished.zf.animate', finish); // Hides the element (for out animations), resets the element, and runs a callback function finish() { if (!isIn) element.hide(); reset(); if (cb) cb.apply(element); } // Resets transitions and removes motion-specific classes function reset() { element[0].style.transitionDuration = 0; element.removeClass(initClass + ' ' + activeClass + ' ' + animation); } } var Motion = { animateIn: function(element, animation, cb) { animate(true, element, animation, cb); }, animateOut: function(element, animation, cb) { animate(false, element, animation, cb); } }; var Move = function(duration, elem, fn){ var anim, prog, start = null; // console.log('called'); function move(ts){ if(!start) start = window.performance.now(); // console.log(start, ts); prog = ts - start; fn.apply(elem); if(prog < duration){ anim = window.requestAnimationFrame(move, elem); } else{ window.cancelAnimationFrame(anim); elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]); } } anim = window.requestAnimationFrame(move); }; Foundation.Move = Move; Foundation.Motion = Motion; }(jQuery, Foundation); !function($, Foundation){ 'use strict'; Foundation.Nest = { Feather: function(menu, type){ menu.attr('role', 'menubar'); type = type || 'zf'; var items = menu.find('li').attr({'role': 'menuitem'}), subMenuClass = 'is-' + type + '-submenu', subItemClass = subMenuClass + '-item', hasSubClass = 'is-' + type + '-submenu-parent'; menu.find('a:first').attr('tabindex', 0); items.each(function(){ var $item = $(this), $sub = $item.children('ul'); if($sub.length){ $item.addClass('has-submenu ' + hasSubClass) .attr({ 'aria-haspopup': true, 'aria-selected': false, 'aria-expanded': false, 'aria-label': $item.children('a:first').text() }); $sub.addClass('submenu ' + subMenuClass) .attr({ 'data-submenu': '', 'aria-hidden': true, 'role': 'menu' }); } if($item.parent('[data-submenu]').length){ $item.addClass('is-submenu-item ' + subItemClass); } }); return; }, Burn: function(menu, type){ var items = menu.find('li').removeAttr('tabindex'), subMenuClass = 'is-' + type + '-submenu', subItemClass = subMenuClass + '-item', hasSubClass = 'is-' + type + '-submenu-parent'; // menu.find('.is-active').removeClass('is-active'); menu.find('*') // menu.find('.' + subMenuClass + ', .' + subItemClass + ', .is-active, .has-submenu, .is-submenu-item, .submenu, [data-submenu]') .removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' has-submenu is-submenu-item submenu is-active') .removeAttr('data-submenu').css('display', ''); // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]') // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu') // .removeAttr('data-submenu')); // items.each(function(){ // var $item = $(this), // $sub = $item.children('ul'); // if($item.parent('[data-submenu]').length){ // $item.removeClass('is-submenu-item ' + subItemClass); // } // if($sub.length){ // $item.removeClass('has-submenu'); // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu'); // } // }); } }; }(jQuery, window.Foundation); !function($, Foundation){ 'use strict'; var Timer = function(elem, options, cb){ var _this = this, duration = options.duration,//options is an object for easily adding features later. nameSpace = Object.keys(elem.data())[0] || 'timer', remain = -1, start, timer; this.restart = function(){ remain = -1; clearTimeout(timer); this.start(); }; this.start = function(){ // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. clearTimeout(timer); remain = remain <= 0 ? duration : remain; elem.data('paused', false); start = Date.now(); timer = setTimeout(function(){ if(options.infinite){ _this.restart();//rerun the timer. } cb(); }, remain); elem.trigger('timerstart.zf.' + nameSpace); }; this.pause = function(){ //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. clearTimeout(timer); elem.data('paused', true); var end = Date.now(); remain = remain - (end - start); elem.trigger('timerpaused.zf.' + nameSpace); }; }; var onImagesLoaded = function(images, callback){ var self = this, unloaded = images.length; if (unloaded === 0) { callback(); } var singleImageLoaded = function() { unloaded--; if (unloaded === 0) { callback(); } }; images.each(function() { if (this.complete) { singleImageLoaded(); } else if (typeof this.naturalWidth !== 'undefined' && this.naturalWidth > 0) { singleImageLoaded(); } else { $(this).one('load', function() { singleImageLoaded(); }); } }); }; Foundation.Timer = Timer; Foundation.onImagesLoaded = onImagesLoaded; }(jQuery, window.Foundation); / !function($){ $.fn.addTouch = function(){ this.each(function(i,el){ $(el).bind('touchstart touchmove touchend touchcancel',function(){ //we pass the original event object because the jQuery event //object is normalized to w3c specs and does not provide the TouchList handleTouch(event); }); }); var handleTouch = function(event){ var touches = event.changedTouches, first = touches[0], eventTypes = { touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup' }, type = eventTypes[event.type]; var simulatedEvent = document.createEvent('MouseEvent'); simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0, null); first.target.dispatchEvent(simulatedEvent); }; }; }(jQuery); / !function(Foundation, $) { 'use strict'; // Elements with [data-open] will reveal a plugin that supports it when clicked. $(document).on('click.zf.trigger', '[data-open]', function() { var id = $(this).data('open'); $('#' + id).triggerHandler('open.zf.trigger', [$(this)]); }); // Elements with [data-close] will close a plugin that supports it when clicked. // If used without a value on [data-close], the event will bubble, allowing it to close a parent component. $(document).on('click.zf.trigger', '[data-close]', function() { var id = $(this).data('close'); if (id) { $('#' + id).triggerHandler('close.zf.trigger', [$(this)]); } else { $(this).trigger('close.zf.trigger'); } }); // Elements with [data-toggle] will toggle a plugin that supports it when clicked. $(document).on('click.zf.trigger', '[data-toggle]', function() { var id = $(this).data('toggle'); $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]); }); // Elements with [data-closable] will respond to close.zf.trigger events. $(document).on('close.zf.trigger', '[data-closable]', function() { var animation = $(this).data('closable') || 'fade-out'; if(Foundation.Motion){ Foundation.Motion.animateOut($(this), animation, function() { $(this).trigger('closed.zf'); }); }else{ $(this).fadeOut().trigger('closed.zf'); } }); var MutationObserver = (function () { var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; for (var i=0; i < prefixes.length; i++) { if (prefixes[i] + 'MutationObserver' in window) { return window[prefixes[i] + 'MutationObserver']; } } return false; }()); var checkListeners = function(){ eventsListener(); resizeListener(); scrollListener(); closemeListener(); }; $(window).load(function(){ checkListeners(); }); / function Abide(element, options) { this.$element = element; this.options = $.extend({}, Abide.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Abide'); } Abide.defaults = { validateOn: 'fieldChange', labelErrorClass: 'is-invalid-label', inputErrorClass: 'is-invalid-input', formErrorSelector: '.form-error', formErrorClass: 'is-visible', liveValidate: false, patterns: { alpha : /^[a-zA-Z]+$/, alpha_numeric : /^[a-zA-Z0-9]+$/, integer : /^[-+]?\d+$/, number : /^[-+]?\d*(?:[\.\,]\d+)?$/, // amex, visa, diners card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, cvv : /^([0-9]){3,4}$/, // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/, url : /^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/, // abc.de domain : /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/, datetime : /^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/, // YYYY-MM-DD date : /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/, // HH:MM:SS time : /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/, dateISO : /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/, // MM/DD/YYYY month_day_year : /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/, // DD/MM/YYYY day_month_year : /^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/, // #FFF or #FFFFFF color : /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ }, validators: { equalTo: function (el, required, parent) { return $('#' + el.attr('data-equalto')).val() === el.val(); } } }; Abide.prototype._init = function(){ this.$inputs = this.$element.find('input, textarea, select').not('[data-abide-ignore]'); this._events(); }; Abide.prototype._events = function() { var _this = this; this.$element.off('.abide') .on('reset.zf.abide', function(e){ _this.resetForm(); }) .on('submit.zf.abide', function(e){ return _this.validateForm(); }); if(this.options.validateOn === 'fieldChange'){ this.$inputs.off('change.zf.abide') .on('change.zf.abide', function(e){ _this.validateInput($(this)); }); } if(this.options.liveValidate){ this.$inputs.off('input.zf.abide') .on('input.zf.abide', function(e){ _this.validateInput($(this)); }); } }, Abide.prototype._reflow = function() { this._init(); }; Abide.prototype.requiredCheck = function($el) { if(!$el.attr('required')) return true; var isGood = true; switch ($el[0].type) { case 'checkbox': case 'radio': isGood = $el[0].checked; break; case 'select': case 'select-one': case 'select-multiple': var opt = $el.find('option:selected'); if(!opt.length || !opt.val()) isGood = false; break; default: if(!$el.val() || !$el.val().length) isGood = false; } return isGood; }; Abide.prototype.findFormError = function($el){ var $error = $el.siblings(this.options.formErrorSelector) if(!$error.length){ $error = $el.parent().find(this.options.formErrorSelector); } return $error; }; Abide.prototype.findLabel = function($el) { var $label = this.$element.find('label[for="' + $el[0].id + '"]'); if(!$label.length){ return $el.closest('label'); } return $label; }; Abide.prototype.addErrorClasses = function($el){ var $label = this.findLabel($el), $formError = this.findFormError($el); if($label.length){ $label.addClass(this.options.labelErrorClass); } if($formError.length){ $formError.addClass(this.options.formErrorClass); } $el.addClass(this.options.inputErrorClass).attr('data-invalid', ''); }; Abide.prototype.removeErrorClasses = function($el){ var $label = this.findLabel($el), $formError = this.findFormError($el); if($label.length){ $label.removeClass(this.options.labelErrorClass); } if($formError.length){ $formError.removeClass(this.options.formErrorClass); } $el.removeClass(this.options.inputErrorClass).removeAttr('data-invalid'); }; Abide.prototype.validateInput = function($el){ var clearRequire = this.requiredCheck($el), validated = false, customValidator = true, validator = $el.attr('data-validator'), equalTo = true; switch ($el[0].type) { case 'radio': validated = this.validateRadio($el.attr('name')); break; case 'checkbox': validated = clearRequire; break; case 'select': case 'select-one': case 'select-multiple': validated = clearRequire; break; default: validated = this.validateText($el); } if(validator){ customValidator = this.matchValidation($el, validator, $el.attr('required')); } if($el.attr('data-equalto')){ equalTo = this.options.validators.equalTo($el); } var goodToGo = [clearRequire, validated, customValidator, equalTo].indexOf(false) === -1, message = (goodToGo ? 'valid' : 'invalid') + '.zf.abide'; this[goodToGo ? 'removeErrorClasses' : 'addErrorClasses']($el); $el.trigger(message, $el[0]); return goodToGo; }; Abide.prototype.validateForm = function(){ var acc = [], _this = this; this.$inputs.each(function(){ acc.push(_this.validateInput($(this))); }); var noError = acc.indexOf(false) === -1; this.$element.find('[data-abide-error]').css('display', (noError ? 'none' : 'block')); this.$element.trigger((noError ? 'formvalid' : 'forminvalid') + '.zf.abide', [this.$element]); return noError; }; Abide.prototype.validateText = function($el, pattern){ // pattern = pattern ? pattern : $el.attr('pattern') ? $el.attr('pattern') : $el.attr('type'); pattern = (pattern || $el.attr('pattern') || $el.attr('type')); var inputText = $el.val(); return inputText.length ?//if text, check if the pattern exists, if so, test it, if no text or no pattern, return true. this.options.patterns.hasOwnProperty(pattern) ? this.options.patterns[pattern].test(inputText) : pattern && pattern !== $el.attr('type') ? new RegExp(pattern).test(inputText) : true : true; }; Abide.prototype.validateRadio = function(groupName){ var $group = this.$element.find(':radio[name="' + groupName + '"]'), counter = [], _this = this; $group.each(function(){ var rdio = $(this), clear = _this.requiredCheck(rdio); counter.push(clear); if(clear) _this.removeErrorClasses(rdio); }); return counter.indexOf(false) === -1; }; Abide.prototype.matchValidation = function($el, validators, required){ var _this = this; required = required ? true : false; var clear = validators.split(' ').map(function(v){ return _this.options.validators[v]($el, required, $el.parent()); }); return clear.indexOf(false) === -1; }; Abide.prototype.resetForm = function() { var $form = this.$element, opts = this.options; $('.' + opts.labelErrorClass, $form).not('small').removeClass(opts.labelErrorClass); $('.' + opts.inputErrorClass, $form).not('small').removeClass(opts.inputErrorClass); $(opts.formErrorSelector + '.' + opts.formErrorClass).removeClass(opts.formErrorClass); $form.find('[data-abide-error]').css('display', 'none'); $(':input', $form).not(':button, :submit, :reset, :hidden, [data-abide-ignore]').val('').removeAttr('data-invalid'); $form.trigger('formreset.zf.abide', [$form]); }; Abide.prototype.destroy = function(){ var _this = this; this.$element.off('.abide') .find('[data-abide-error]').css('display', 'none'); this.$inputs.off('.abide') .each(function(){ _this.removeErrorClasses($(this)); }); Foundation.unregisterPlugin(this); }; Foundation.plugin(Abide, 'Abide'); // Exports for AMD/Browserify if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') module.exports = Abide; if (typeof define === 'function') define(['foundation'], function() { return Abide; }); }(Foundation, jQuery); !function($, Foundation) { 'use strict'; function Accordion(element, options){ this.$element = element; this.options = $.extend({}, Accordion.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Accordion'); Foundation.Keyboard.register('Accordion', { 'ENTER': 'toggle', 'SPACE': 'toggle', 'ARROW_DOWN': 'next', 'ARROW_UP': 'previous' }); } Accordion.defaults = { slideSpeed: 250, multiExpand: false, allowAllClosed: false }; Accordion.prototype._init = function() { this.$element.attr('role', 'tablist'); this.$tabs = this.$element.children('li'); if (this.$tabs.length == 0) { this.$tabs = this.$element.children('[data-accordion-item]'); } this.$tabs.each(function(idx, el){ var $el = $(el), $content = $el.find('[data-tab-content]'), id = $content[0].id || Foundation.GetYoDigits(6, 'accordion'), linkId = el.id || id + '-label'; $el.find('a:first').attr({ 'aria-controls': id, 'role': 'tab', 'id': linkId, 'aria-expanded': false, 'aria-selected': false }); $content.attr({'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id}); }); var $initActive = this.$element.find('.is-active').children('[data-tab-content]'); if($initActive.length){ this.down($initActive, true); } this._events(); }; Accordion.prototype._events = function() { var _this = this; this.$tabs.each(function(){ var $elem = $(this); var $tabContent = $elem.children('[data-tab-content]'); if ($tabContent.length) { $elem.children('a').off('click.zf.accordion keydown.zf.accordion') .on('click.zf.accordion', function(e){ // $(this).children('a').on('click.zf.accordion', function(e) { e.preventDefault(); if ($elem.hasClass('is-active')) { if(_this.options.allowAllClosed || $elem.siblings().hasClass('is-active')){ _this.up($tabContent); } } else { _this.down($tabContent); } }).on('keydown.zf.accordion', function(e){ Foundation.Keyboard.handleKey(e, 'Accordion', { toggle: function() { _this.toggle($tabContent); }, next: function() { $elem.next().find('a').focus().trigger('click.zf.accordion'); }, previous: function() { $elem.prev().find('a').focus().trigger('click.zf.accordion'); }, handled: function() { e.preventDefault(); e.stopPropagation(); } }); }); } }); }; Accordion.prototype.toggle = function($target){ if($target.parent().hasClass('is-active')){ if(this.options.allowAllClosed || $target.parent().siblings().hasClass('is-active')){ this.up($target); }else{ return; } }else{ this.down($target); } }; Accordion.prototype.down = function($target, firstTime) { var _this = this; if(!this.options.multiExpand && !firstTime){ var $currentActive = this.$element.find('.is-active').children('[data-tab-content]'); if($currentActive.length){ this.up($currentActive); } } $target .attr('aria-hidden', false) .parent('[data-tab-content]') .addBack() .parent().addClass('is-active'); // Foundation.Move(_this.options.slideSpeed, $target, function(){ $target.slideDown(_this.options.slideSpeed); // }); // if(!firstTime){ // Foundation._reflow(this.$element.attr('data-accordion')); // } $('#' + $target.attr('aria-labelledby')).attr({ 'aria-expanded': true, 'aria-selected': true }); this.$element.trigger('down.zf.accordion', [$target]); }; Accordion.prototype.up = function($target) { var $aunts = $target.parent().siblings(), _this = this; var canClose = this.options.multiExpand ? $aunts.hasClass('is-active') : $target.parent().hasClass('is-active'); if(!this.options.allowAllClosed && !canClose){ return; } // Foundation.Move(this.options.slideSpeed, $target, function(){ $target.slideUp(_this.options.slideSpeed); // }); $target.attr('aria-hidden', true) .parent().removeClass('is-active'); $('#' + $target.attr('aria-labelledby')).attr({ 'aria-expanded': false, 'aria-selected': false }); this.$element.trigger('up.zf.accordion', [$target]); }; Accordion.prototype.destroy = function() { this.$element.find('[data-tab-content]').slideUp(0).css('display', ''); this.$element.find('a').off('.zf.accordion'); Foundation.unregisterPlugin(this); }; Foundation.plugin(Accordion, 'Accordion'); }(jQuery, window.Foundation); !function($) { 'use strict'; function AccordionMenu(element, options) { this.$element = element; this.options = $.extend({}, AccordionMenu.defaults, this.$element.data(), options); Foundation.Nest.Feather(this.$element, 'accordion'); this._init(); Foundation.registerPlugin(this, 'AccordionMenu'); Foundation.Keyboard.register('AccordionMenu', { 'ENTER': 'toggle', 'SPACE': 'toggle', 'ARROW_RIGHT': 'open', 'ARROW_UP': 'up', 'ARROW_DOWN': 'down', 'ARROW_LEFT': 'close', 'ESCAPE': 'closeAll', 'TAB': 'down', 'SHIFT_TAB': 'up' }); } AccordionMenu.defaults = { slideSpeed: 250, multiOpen: true }; AccordionMenu.prototype._init = function() { this.$element.find('[data-submenu]').not('.is-active').slideUp(0);//.find('a').css('padding-left', '1rem'); this.$element.attr({ 'role': 'tablist', 'aria-multiselectable': this.options.multiOpen }); this.$menuLinks = this.$element.find('.has-submenu'); this.$menuLinks.each(function(){ var linkId = this.id || Foundation.GetYoDigits(6, 'acc-menu-link'), $elem = $(this), $sub = $elem.children('[data-submenu]'), subId = $sub[0].id || Foundation.GetYoDigits(6, 'acc-menu'), isActive = $sub.hasClass('is-active'); $elem.attr({ 'aria-controls': subId, 'aria-expanded': isActive, 'aria-selected': false, 'role': 'tab', 'id': linkId }); $sub.attr({ 'aria-labelledby': linkId, 'aria-hidden': !isActive, 'role': 'tabpanel', 'id': subId }); }); var initPanes = this.$element.find('.is-active'); if(initPanes.length){ var _this = this; initPanes.each(function(){ _this.down($(this)); }); } this._events(); }; AccordionMenu.prototype._events = function() { var _this = this; this.$element.find('li').each(function() { var $submenu = $(this).children('[data-submenu]'); if ($submenu.length) { $(this).children('a').off('click.zf.accordionmenu').on('click.zf.accordionmenu', function(e) { e.preventDefault(); _this.toggle($submenu); }); } }).on('keydown.zf.accordionmenu', function(e){ var $element = $(this), $elements = $element.parent('ul').children('li'), $prevElement, $nextElement, $target = $element.children('[data-submenu]'); $elements.each(function(i) { if ($(this).is($element)) { $prevElement = $elements.eq(Math.max(0, i-1)); $nextElement = $elements.eq(Math.min(i+1, $elements.length-1)); if ($(this).children('[data-submenu]:visible').length) { // has open sub menu $nextElement = $element.find('li:first-child'); } if ($(this).is(':first-child')) { // is first element of sub menu $prevElement = $element.parents('li').first(); } else if ($prevElement.children('[data-submenu]:visible').length) { // if previous element has open sub menu $prevElement = $prevElement.find('li:last-child'); } if ($(this).is(':last-child')) { // is last element of sub menu $nextElement = $element.parents('li').first().next('li'); } return; } }); Foundation.Keyboard.handleKey(e, 'AccordionMenu', { open: function() { if ($target.is(':hidden')) { _this.down($target); $target.find('li').first().focus(); } }, close: function() { if ($target.length && !$target.is(':hidden')) { // close active sub of this item _this.up($target); } else if ($element.parent('[data-submenu]').length) { // close currently open sub _this.up($element.parent('[data-submenu]')); $element.parents('li').first().focus(); } }, up: function() { $prevElement.focus(); }, down: function() { $nextElement.focus(); }, toggle: function() { if ($element.children('[data-submenu]').length) { _this.toggle($element.children('[data-submenu]')); } }, closeAll: function() { _this.hideAll(); }, handled: function() { e.preventDefault(); e.stopImmediatePropagation(); } }); });//.attr('tabindex', 0); }; AccordionMenu.prototype.hideAll = function(){ this.$element.find('[data-submenu]').slideUp(this.options.slideSpeed); }; AccordionMenu.prototype.toggle = function($target){ if(!$target.is(':animated')) { if (!$target.is(':hidden')) { this.up($target); } else { this.down($target); } } }; AccordionMenu.prototype.down = function($target) { var _this = this; if(!this.options.multiOpen){ this.up(this.$element.find('.is-active').not($target.parentsUntil(this.$element).add($target))); } $target.addClass('is-active').attr({'aria-hidden': false}) .parent('.has-submenu').attr({'aria-expanded': true, 'aria-selected': true}); Foundation.Move(this.options.slideSpeed, $target, function(){ $target.slideDown(_this.options.slideSpeed); }); this.$element.trigger('down.zf.accordionMenu', [$target]); }; AccordionMenu.prototype.up = function($target) { var _this = this; Foundation.Move(this.options.slideSpeed, $target, function(){ $target.slideUp(_this.options.slideSpeed); }); $target.attr('aria-hidden', true) .find('[data-submenu]').slideUp(0).attr('aria-hidden', true).end() .parent('.has-submenu') .attr({'aria-expanded': false, 'aria-selected': false}); // $target.slideUp(this.options.slideSpeed, function() { // $target.find('[data-submenu]').slideUp(0).attr('aria-hidden', true); // }).attr('aria-hidden', true).parent('.has-submenu').attr({'aria-expanded': false, 'aria-selected': false}); this.$element.trigger('up.zf.accordionMenu', [$target]); }; AccordionMenu.prototype.destroy = function(){ this.$element.find('[data-submenu]').slideDown(0).css('display', ''); this.$element.find('a').off('click.zf.accordionMenu'); Foundation.Nest.Burn(this.$element, 'accordion'); Foundation.unregisterPlugin(this); }; Foundation.plugin(AccordionMenu, 'AccordionMenu'); }(jQuery, window.Foundation); !function($, Foundation){ 'use strict'; function Drilldown(element, options){ this.$element = element; this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options); Foundation.Nest.Feather(this.$element, 'drilldown'); this._init(); Foundation.registerPlugin(this, 'Drilldown'); Foundation.Keyboard.register('Drilldown', { 'ENTER': 'open', 'SPACE': 'open', 'ARROW_RIGHT': 'next', 'ARROW_UP': 'up', 'ARROW_DOWN': 'down', 'ARROW_LEFT': 'previous', 'ESCAPE': 'close', 'TAB': 'down', 'SHIFT_TAB': 'up' }); } Drilldown.defaults = { backButton: '
  • Back
  • ', wrapper: '
    ', closeOnClick: false // holdOpen: false }; Drilldown.prototype._init = function(){ this.$submenuAnchors = this.$element.find('li.has-submenu'); this.$submenus = this.$submenuAnchors.children('[data-submenu]'); this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem'); this._prepareMenu(); this._keyboardEvents(); }; Drilldown.prototype._prepareMenu = function(){ var _this = this; // if(!this.options.holdOpen){ // this._menuLinkEvents(); // } this.$submenuAnchors.each(function(){ var $sub = $(this); var $link = $sub.find('a:first'); $link.data('savedHref', $link.attr('href')).removeAttr('href'); $sub.children('[data-submenu]') .attr({ 'aria-hidden': true, 'tabindex': 0, 'role': 'menu' }); _this._events($sub); }); this.$submenus.each(function(){ var $menu = $(this), $back = $menu.find('.js-drilldown-back'); if(!$back.length){ $menu.prepend(_this.options.backButton); } _this._back($menu); }); if(!this.$element.parent().hasClass('is-drilldown')){ this.$wrapper = $(this.options.wrapper).addClass('is-drilldown').css(this._getMaxDims()); this.$element.wrap(this.$wrapper); } }; Drilldown.prototype._events = function($elem){ var _this = this; $elem.off('click.zf.drilldown') .on('click.zf.drilldown', function(e){ if($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')){ e.stopImmediatePropagation(); e.preventDefault(); } // if(e.target !== e.currentTarget.firstElementChild){ // return false; // } _this._show($elem); if(_this.options.closeOnClick){ var $body = $('body').not(_this.$wrapper); $body.off('.zf.drilldown').on('click.zf.drilldown', function(e){ e.preventDefault(); _this._hideAll(); $body.off('.zf.drilldown'); }); } }); }; Drilldown.prototype._keyboardEvents = function() { var _this = this; this.$menuItems.add(this.$element.find('.js-drilldown-back')).on('keydown.zf.drilldown', function(e){ var $element = $(this), $elements = $element.parent('ul').children('li'), $prevElement, $nextElement; $elements.each(function(i) { if ($(this).is($element)) { $prevElement = $elements.eq(Math.max(0, i-1)); $nextElement = $elements.eq(Math.min(i+1, $elements.length-1)); return; } }); Foundation.Keyboard.handleKey(e, 'Drilldown', { next: function() { if ($element.is(_this.$submenuAnchors)) { _this._show($element); $element.on(Foundation.transitionend($element), function(){ $element.find('ul li').filter(_this.$menuItems).first().focus(); }); } }, previous: function() { _this._hide($element.parent('ul')); $element.parent('ul').on(Foundation.transitionend($element), function(){ setTimeout(function() { $element.parent('ul').parent('li').focus(); }, 1); }); }, up: function() { $prevElement.focus(); }, down: function() { $nextElement.focus(); }, close: function() { _this._back(); //_this.$menuItems.first().focus(); // focus to first element }, open: function() { if (!$element.is(_this.$menuItems)) { // not menu item means back button _this._hide($element.parent('ul')); setTimeout(function(){$element.parent('ul').parent('li').focus();}, 1); } else if ($element.is(_this.$submenuAnchors)) { _this._show($element); setTimeout(function(){$element.find('ul li').filter(_this.$menuItems).first().focus();}, 1); } }, handled: function() { e.preventDefault(); e.stopImmediatePropagation(); } }); }); // end keyboardAccess }; Drilldown.prototype._hideAll = function(){ var $elem = this.$element.find('.is-drilldown-sub.is-active').addClass('is-closing'); $elem.one(Foundation.transitionend($elem), function(e){ $elem.removeClass('is-active is-closing'); }); this.$element.trigger('closed.zf.drilldown'); }; Drilldown.prototype._back = function($elem){ var _this = this; $elem.off('click.zf.drilldown'); $elem.children('.js-drilldown-back') .on('click.zf.drilldown', function(e){ e.stopImmediatePropagation(); // console.log('mouseup on back'); _this._hide($elem); }); }; Drilldown.prototype._menuLinkEvents = function(){ var _this = this; this.$menuItems.not('.has-submenu') .off('click.zf.drilldown') .on('click.zf.drilldown', function(e){ // e.stopImmediatePropagation(); setTimeout(function(){ _this._hideAll(); }, 0); }); }; Drilldown.prototype._show = function($elem){ $elem.children('[data-submenu]').addClass('is-active'); this.$element.trigger('open.zf.drilldown', [$elem]); }; Drilldown.prototype._hide = function($elem){ var _this = this; $elem.addClass('is-closing') .one(Foundation.transitionend($elem), function(){ $elem.removeClass('is-active is-closing'); }); $elem.trigger('hide.zf.drilldown', [$elem]); }; Drilldown.prototype._getMaxDims = function(){ var max = 0, result = {}; this.$submenus.add(this.$element).each(function(){ var numOfElems = $(this).children('li').length; max = numOfElems > max ? numOfElems : max; }); result.height = max * this.$menuItems[0].getBoundingClientRect().height + 'px'; result.width = this.$element[0].getBoundingClientRect().width + 'px'; return result; }; Drilldown.prototype.destroy = function(){ this._hideAll(); Foundation.Nest.Burn(this.$element, 'drilldown'); this.$element.unwrap() .find('.js-drilldown-back').remove() .end().find('.is-active, .is-closing, .is-drilldown-sub').removeClass('is-active is-closing is-drilldown-sub') .end().find('[data-submenu]').removeAttr('aria-hidden tabindex role') .off('.zf.drilldown').end().off('zf.drilldown'); this.$element.find('a').each(function(){ var $link = $(this); if($link.data('savedHref')){ $link.attr('href', $link.data('savedHref')).removeData('savedHref'); }else{ return; } }); Foundation.unregisterPlugin(this); }; Foundation.plugin(Drilldown, 'Drilldown'); }(jQuery, window.Foundation); !function($, Foundation){ 'use strict'; function Dropdown(element, options){ this.$element = element; this.options = $.extend({}, Dropdown.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Dropdown'); Foundation.Keyboard.register('Dropdown', { 'ENTER': 'open', 'SPACE': 'open', 'ESCAPE': 'close', 'TAB': 'tab_forward', 'SHIFT_TAB': 'tab_backward' }); } Dropdown.defaults = { hoverDelay: 250, hover: false, hoverPane: false, vOffset: 1, hOffset: 1, positionClass: '', trapFocus: false, autoFocus: false, closeOnClick: false }; Dropdown.prototype._init = function(){ var $id = this.$element.attr('id'); this.$anchor = $('[data-toggle="' + $id + '"]') || $('[data-open="' + $id + '"]'); this.$anchor.attr({ 'aria-controls': $id, 'data-is-focus': false, 'data-yeti-box': $id, 'aria-haspopup': true, 'aria-expanded': false // 'data-resize': $id }); this.options.positionClass = this.getPositionClass(); this.counter = 4; this.usedPositions = []; this.$element.attr({ 'aria-hidden': 'true', 'data-yeti-box': $id, 'data-resize': $id, 'aria-labelledby': this.$anchor[0].id || Foundation.GetYoDigits(6, 'dd-anchor') }); this._events(); }; Dropdown.prototype.getPositionClass = function(){ var position = this.$element[0].className.match(/(top|left|right)/g); position = position ? position[0] : ''; return position; }; Dropdown.prototype._reposition = function(position){ this.usedPositions.push(position ? position : 'bottom'); //default, try switching to opposite side if(!position && (this.usedPositions.indexOf('top') < 0)){ this.$element.addClass('top'); }else if(position === 'top' && (this.usedPositions.indexOf('bottom') < 0)){ this.$element.removeClass(position); }else if(position === 'left' && (this.usedPositions.indexOf('right') < 0)){ this.$element.removeClass(position) .addClass('right'); }else if(position === 'right' && (this.usedPositions.indexOf('left') < 0)){ this.$element.removeClass(position) .addClass('left'); } //if default change didn't work, try bottom or left first else if(!position && (this.usedPositions.indexOf('top') > -1) && (this.usedPositions.indexOf('left') < 0)){ this.$element.addClass('left'); }else if(position === 'top' && (this.usedPositions.indexOf('bottom') > -1) && (this.usedPositions.indexOf('left') < 0)){ this.$element.removeClass(position) .addClass('left'); }else if(position === 'left' && (this.usedPositions.indexOf('right') > -1) && (this.usedPositions.indexOf('bottom') < 0)){ this.$element.removeClass(position); }else if(position === 'right' && (this.usedPositions.indexOf('left') > -1) && (this.usedPositions.indexOf('bottom') < 0)){ this.$element.removeClass(position); } //if nothing cleared, set to bottom else{ this.$element.removeClass(position); } this.classChanged = true; this.counter--; }; Dropdown.prototype._setPosition = function(){ if(this.$anchor.attr('aria-expanded') === 'false'){ return false; } var position = this.getPositionClass(), $eleDims = Foundation.Box.GetDimensions(this.$element), $anchorDims = Foundation.Box.GetDimensions(this.$anchor), _this = this, direction = (position === 'left' ? 'left' : ((position === 'right') ? 'left' : 'top')), param = (direction === 'top') ? 'height' : 'width', offset = (param === 'height') ? this.options.vOffset : this.options.hOffset; if(($eleDims.width >= $eleDims.windowDims.width) || (!this.counter && !Foundation.Box.ImNotTouchingYou(this.$element))){ this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({ 'width': $eleDims.windowDims.width - (this.options.hOffset * 2), 'height': 'auto' }); this.classChanged = true; return false; } this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, position, this.options.vOffset, this.options.hOffset)); while(!Foundation.Box.ImNotTouchingYou(this.$element) && this.counter){ this._reposition(position); this._setPosition(); } }; Dropdown.prototype._events = function(){ var _this = this; this.$element.on({ 'open.zf.trigger': this.open.bind(this), 'close.zf.trigger': this.close.bind(this), 'toggle.zf.trigger': this.toggle.bind(this), 'resizeme.zf.trigger': this._setPosition.bind(this) }); if(this.options.hover){ this.$anchor.off('mouseenter.zf.dropdown mouseleave.zf.dropdown') .on('mouseenter.zf.dropdown', function(){ clearTimeout(_this.timeout); _this.timeout = setTimeout(function(){ _this.open(); _this.$anchor.data('hover', true); }, _this.options.hoverDelay); }).on('mouseleave.zf.dropdown', function(){ clearTimeout(_this.timeout); _this.timeout = setTimeout(function(){ _this.close(); _this.$anchor.data('hover', false); }, _this.options.hoverDelay); }); if(this.options.hoverPane){ this.$element.off('mouseenter.zf.dropdown mouseleave.zf.dropdown') .on('mouseenter.zf.dropdown', function(){ clearTimeout(_this.timeout); }).on('mouseleave.zf.dropdown', function(){ clearTimeout(_this.timeout); _this.timeout = setTimeout(function(){ _this.close(); _this.$anchor.data('hover', false); }, _this.options.hoverDelay); }); } } this.$anchor.add(this.$element).on('keydown.zf.dropdown', function(e) { var $target = $(this), visibleFocusableElements = Foundation.Keyboard.findFocusable(_this.$element); Foundation.Keyboard.handleKey(e, 'Dropdown', { tab_forward: function() { if (_this.$element.find(':focus').is(visibleFocusableElements.eq(-1))) { // left modal downwards, setting focus to first element if (_this.options.trapFocus) { // if focus shall be trapped visibleFocusableElements.eq(0).focus(); e.preventDefault(); } else { // if focus is not trapped, close dropdown on focus out _this.close(); } } }, tab_backward: function() { if (_this.$element.find(':focus').is(visibleFocusableElements.eq(0)) || _this.$element.is(':focus')) { // left modal upwards, setting focus to last element if (_this.options.trapFocus) { // if focus shall be trapped visibleFocusableElements.eq(-1).focus(); e.preventDefault(); } else { // if focus is not trapped, close dropdown on focus out _this.close(); } } }, open: function() { if ($target.is(_this.$anchor)) { _this.open(); _this.$element.attr('tabindex', -1).focus(); e.preventDefault(); } }, close: function() { _this.close(); _this.$anchor.focus(); } }); }); }; Dropdown.prototype._addBodyHandler = function(){ var $body = $(document.body).not(this.$element), _this = this; $body.off('click.zf.dropdown') .on('click.zf.dropdown', function(e){ if(_this.$anchor.is(e.target) || _this.$anchor.find(e.target).length) { return; } if(_this.$element.find(e.target).length) { return; } _this.close(); $body.off('click.zf.dropdown'); }); }; Dropdown.prototype.open = function(){ // var _this = this; this.$element.trigger('closeme.zf.dropdown', this.$element.attr('id')); this.$anchor.addClass('hover') .attr({'aria-expanded': true}); // this.$element; this._setPosition(); this.$element.addClass('is-open') .attr({'aria-hidden': false}); if(this.options.autoFocus){ var $focusable = Foundation.Keyboard.findFocusable(this.$element); if($focusable.length){ $focusable.eq(0).focus(); } } if(this.options.closeOnClick){ this._addBodyHandler(); } this.$element.trigger('show.zf.dropdown', [this.$element]); //why does this not work correctly for this plugin? // Foundation.reflow(this.$element, 'dropdown'); // Foundation._reflow(this.$element.attr('data-dropdown')); }; Dropdown.prototype.close = function(){ if(!this.$element.hasClass('is-open')){ return false; } this.$element.removeClass('is-open') .attr({'aria-hidden': true}); this.$anchor.removeClass('hover') .attr('aria-expanded', false); if(this.classChanged){ var curPositionClass = this.getPositionClass(); if(curPositionClass){ this.$element.removeClass(curPositionClass); } this.$element.addClass(this.options.positionClass) .css({height: '', width: ''}); this.classChanged = false; this.counter = 4; this.usedPositions.length = 0; } this.$element.trigger('hide.zf.dropdown', [this.$element]); // Foundation.reflow(this.$element, 'dropdown'); }; Dropdown.prototype.toggle = function(){ if(this.$element.hasClass('is-open')){ if(this.$anchor.data('hover')) return; this.close(); }else{ this.open(); } }; Dropdown.prototype.destroy = function(){ this.$element.off('.zf.trigger').hide(); this.$anchor.off('.zf.dropdown'); Foundation.unregisterPlugin(this); }; Foundation.plugin(Dropdown, 'Dropdown'); }(jQuery, window.Foundation); !function($, Foundation){ 'use strict'; function DropdownMenu(element, options){ this.$element = element; this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options); Foundation.Nest.Feather(this.$element, 'dropdown'); this._init(); Foundation.registerPlugin(this, 'DropdownMenu'); Foundation.Keyboard.register('DropdownMenu', { 'ENTER': 'open', 'SPACE': 'open', 'ARROW_RIGHT': 'next', 'ARROW_UP': 'up', 'ARROW_DOWN': 'down', 'ARROW_LEFT': 'previous', 'ESCAPE': 'close' }); } DropdownMenu.defaults = { disableHover: false, autoclose: true, hoverDelay: 50, clickOpen: false, closingTime: 500, alignment: 'left', closeOnClick: true, verticalClass: 'vertical', rightClass: 'align-right', forceFollow: true }; DropdownMenu.prototype._init = function(){ var subs = this.$element.find('li.is-dropdown-submenu-parent'); this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub'); this.$menuItems = this.$element.find('[role="menuitem"]'); this.$tabs = this.$element.children('[role="menuitem"]'); this.isVert = this.$element.hasClass(this.options.verticalClass); this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass); if(this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right'){ this.options.alignment = 'right'; subs.addClass('is-left-arrow opens-left'); }else{ subs.addClass('is-right-arrow opens-right'); } if(!this.isVert){ this.$tabs.filter('.is-dropdown-submenu-parent').removeClass('is-right-arrow is-left-arrow opens-right opens-left') .addClass('is-down-arrow'); } this.changed = false; this._events(); }; DropdownMenu.prototype._events = function(){ var _this = this, hasTouch = 'ontouchstart' in window || (typeof window.ontouchstart !== 'undefined'), parClass = 'is-dropdown-submenu-parent', delay; if(this.options.clickOpen || hasTouch){ this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', function(e){ var $elem = $(e.target).parentsUntil('ul', '.' + parClass), hasSub = $elem.hasClass(parClass), hasClicked = $elem.attr('data-is-click') === 'true', $sub = $elem.children('.is-dropdown-submenu'); if(hasSub){ if(hasClicked){ if(!_this.options.closeOnClick || (!_this.options.clickOpen && !hasTouch) || (_this.options.forceFollow && hasTouch)){ return; } else{ e.stopImmediatePropagation(); e.preventDefault(); _this._hide($elem); } }else{ e.preventDefault(); e.stopImmediatePropagation(); _this._show($elem.children('.is-dropdown-submenu')); $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true); } }else{ return; } }); } if(!this.options.disableHover){ this.$menuItems.on('mouseenter.zf.dropdownmenu', function(e){ e.stopImmediatePropagation(); var $elem = $(this), hasSub = $elem.hasClass(parClass); if(hasSub){ clearTimeout(delay); delay = setTimeout(function(){ _this._show($elem.children('.is-dropdown-submenu')); }, _this.options.hoverDelay); } }).on('mouseleave.zf.dropdownmenu', function(e){ var $elem = $(this), hasSub = $elem.hasClass(parClass); if(hasSub && _this.options.autoclose){ if($elem.attr('data-is-click') === 'true' && _this.options.clickOpen){ return false; } // clearTimeout(delay); delay = setTimeout(function(){ _this._hide($elem); }, _this.options.closingTime); } }); } this.$menuItems.on('keydown.zf.dropdownmenu', function(e){ var $element = $(e.target).parentsUntil('ul', '[role="menuitem"]'), isTab = _this.$tabs.index($element) > -1, $elements = isTab ? _this.$tabs : $element.siblings('li').add($element), $prevElement, $nextElement; $elements.each(function(i) { if ($(this).is($element)) { $prevElement = $elements.eq(i-1); $nextElement = $elements.eq(i+1); return; } }); var nextSibling = function() { if (!$element.is(':last-child')) $nextElement.children('a:first').focus(); }, prevSibling = function() { $prevElement.children('a:first').focus(); }, openSub = function() { var $sub = $element.children('ul.is-dropdown-submenu'); if($sub.length){ _this._show($sub); $element.find('li > a:first').focus(); }else{ return; } }, closeSub = function() { //if ($element.is(':first-child')) { var close = $element.parent('ul').parent('li'); close.children('a:first').focus(); _this._hide(close); //} }; var functions = { open: openSub, close: function() { _this._hide(_this.$element); _this.$menuItems.find('a:first').focus(); // focus to first element }, handled: function() { e.preventDefault(); e.stopImmediatePropagation(); } }; if (isTab) { if (_this.vertical) { // vertical menu if (_this.options.alignment === 'left') { // left aligned $.extend(functions, { down: nextSibling, up: prevSibling, next: openSub, previous: closeSub }); } else { // right aligned $.extend(functions, { down: nextSibling, up: prevSibling, next: closeSub, previous: openSub }); } } else { // horizontal menu $.extend(functions, { next: nextSibling, previous: prevSibling, down: openSub, up: closeSub }); } } else { // not tabs -> one sub if (_this.options.alignment === 'left') { // left aligned $.extend(functions, { next: openSub, previous: closeSub, down: nextSibling, up: prevSibling }); } else { // right aligned $.extend(functions, { next: closeSub, previous: openSub, down: nextSibling, up: prevSibling }); } } Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions); }); }; DropdownMenu.prototype._addBodyHandler = function(){ var $body = $(document.body), _this = this; $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu') .on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function(e){ var $link = _this.$element.find(e.target); if($link.length){ return; } _this._hide(); $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu'); }); }; DropdownMenu.prototype._show = function($sub){ var idx = this.$tabs.index(this.$tabs.filter(function(i, el){ return $(el).find($sub).length > 0; })); var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent'); this._hide($sibs, idx); $sub.css('visibility', 'hidden').addClass('js-dropdown-active').attr({'aria-hidden': false}) .parent('li.is-dropdown-submenu-parent').addClass('is-active') .attr({'aria-selected': true, 'aria-expanded': true}); var clear = Foundation.Box.ImNotTouchingYou($sub, null, true); if(!clear){ var oldClass = this.options.alignment === 'left' ? '-right' : '-left', $parentLi = $sub.parent('.is-dropdown-submenu-parent'); $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment); clear = Foundation.Box.ImNotTouchingYou($sub, null, true); if(!clear){ $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner'); } this.changed = true; } $sub.css('visibility', ''); if(this.options.closeOnClick){ this._addBodyHandler(); } this.$element.trigger('show.zf.dropdownmenu', [$sub]); }; DropdownMenu.prototype._hide = function($elem, idx){ var $toClose; if($elem && $elem.length){ $toClose = $elem; }else if(idx !== undefined){ $toClose = this.$tabs.not(function(i, el){ return i === idx; }); } else{ $toClose = this.$element; } var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0; if(somethingToClose){ $toClose.find('li.is-active').add($toClose).attr({ 'aria-selected': false, 'aria-expanded': false, 'data-is-click': false }).removeClass('is-active'); $toClose.find('ul.js-dropdown-active').attr({ 'aria-hidden': true }).removeClass('js-dropdown-active'); if(this.changed || $toClose.find('opens-inner').length){ var oldClass = this.options.alignment === 'left' ? 'right' : 'left'; $toClose.find('li.is-dropdown-submenu-parent').add($toClose) .removeClass('opens-inner opens-' + this.options.alignment) .addClass('opens-' + oldClass); this.changed = false; } this.$element.trigger('hide.zf.dropdownmenu', [$toClose]); } }; DropdownMenu.prototype.destroy = function(){ this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click') .removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner'); Foundation.Nest.Burn(this.$element, 'dropdown'); Foundation.unregisterPlugin(this); }; Foundation.plugin(DropdownMenu, 'DropdownMenu'); }(jQuery, window.Foundation); !function(Foundation, $) { 'use strict'; function Equalizer(element, options){ this.$element = element; this.options = $.extend({}, Equalizer.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Equalizer'); } Equalizer.defaults = { equalizeOnStack: true, equalizeByRow: false, equalizeOn: '' }; Equalizer.prototype._init = function(){ var eqId = this.$element.attr('data-equalizer') || ''; var $watched = this.$element.find('[data-equalizer-watch="' + eqId + '"]'); this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]'); this.$element.attr('data-resize', (eqId || Foundation.GetYoDigits(6, 'eq'))); this.hasNested = this.$element.find('[data-equalizer]').length > 0; this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0; this.isOn = false; var imgs = this.$element.find('img'); var tooSmall; if(this.options.equalizeOn){ tooSmall = this._checkMQ(); $(window).on('changed.zf.mediaquery', this._checkMQ.bind(this)); }else{ this._events(); } if((tooSmall !== undefined && tooSmall === false) || tooSmall === undefined){ if(imgs.length){ Foundation.onImagesLoaded(imgs, this._reflow.bind(this)); }else{ this._reflow(); } } }; Equalizer.prototype._pauseEvents = function(){ this.isOn = false; this.$element.off('.zf.equalizer resizeme.zf.trigger'); }; Equalizer.prototype._events = function(){ var _this = this; this._pauseEvents(); if(this.hasNested){ this.$element.on('postequalized.zf.equalizer', function(e){ if(e.target !== _this.$element[0]){ _this._reflow(); } }); }else{ this.$element.on('resizeme.zf.trigger', this._reflow.bind(this)); } this.isOn = true; }; Equalizer.prototype._checkMQ = function(){ var tooSmall = !Foundation.MediaQuery.atLeast(this.options.equalizeOn); if(tooSmall){ if(this.isOn){ this._pauseEvents(); this.$watched.css('height', 'auto'); } }else{ if(!this.isOn){ this._events(); } } return tooSmall; } Equalizer.prototype._killswitch = function(){ return; }; Equalizer.prototype._reflow = function(){ if(!this.options.equalizeOnStack){ if(this._isStacked()){ this.$watched.css('height', 'auto'); return false; } } if (this.options.equalizeByRow) { this.getHeightsByRow(this.applyHeightByRow.bind(this)); }else{ this.getHeights(this.applyHeight.bind(this)); } }; Equalizer.prototype._isStacked = function(){ return this.$watched[0].offsetTop !== this.$watched[1].offsetTop; }; Equalizer.prototype.getHeights = function(cb){ var heights = []; for(var i = 0, len = this.$watched.length; i < len; i++){ this.$watched[i].style.height = 'auto'; heights.push(this.$watched[i].offsetHeight); } cb(heights); }; Equalizer.prototype.getHeightsByRow = function(cb) { var lastElTopOffset = this.$watched.first().offset().top, groups = [], group = 0; //group by Row groups[group] = []; for(var i = 0, len = this.$watched.length; i < len; i++){ this.$watched[i].style.height = 'auto'; //maybe could use this.$watched[i].offsetTop var elOffsetTop = $(this.$watched[i]).offset().top; if (elOffsetTop!=lastElTopOffset) { group++; groups[group] = []; lastElTopOffset=elOffsetTop; }; groups[group].push([this.$watched[i],this.$watched[i].offsetHeight]); } for (var i = 0, len = groups.length; i < len; i++) { var heights = $(groups[i]).map(function () { return this[1]}).get(); var max = Math.max.apply(null, heights); groups[i].push(max); } cb(groups); }; Equalizer.prototype.applyHeight = function(heights){ var max = Math.max.apply(null, heights); this.$element.trigger('preequalized.zf.equalizer'); this.$watched.css('height', max); this.$element.trigger('postequalized.zf.equalizer'); }; Equalizer.prototype.applyHeightByRow = function(groups){ this.$element.trigger('preequalized.zf.equalizer'); for (var i = 0, len = groups.length; i < len ; i++) { var groupsILength = groups[i].length, max = groups[i][groupsILength - 1]; if (groupsILength<=2) { $(groups[i][0][0]).css({'height':'auto'}); continue; }; this.$element.trigger('preequalizedrow.zf.equalizer'); for (var j = 0, lenJ = (groupsILength-1); j < lenJ ; j++) { $(groups[i][j][0]).css({'height':max}); } this.$element.trigger('postequalizedrow.zf.equalizer'); } this.$element.trigger('postequalized.zf.equalizer'); }; Equalizer.prototype.destroy = function(){ this._pauseEvents(); this.$watched.css('height', 'auto'); Foundation.unregisterPlugin(this); }; Foundation.plugin(Equalizer, 'Equalizer'); // Exports for AMD/Browserify if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') module.exports = Equalizer; if (typeof define === 'function') define(['foundation'], function() { return Equalizer; }); }(Foundation, jQuery); !function(Foundation, $) { 'use strict'; function Interchange(element, options) { this.$element = element; this.options = $.extend({}, Interchange.defaults, options); this.rules = []; this.currentPath = ''; this._init(); this._events(); Foundation.registerPlugin(this, 'Interchange'); } Interchange.defaults = { rules: null }; Interchange.SPECIAL_QUERIES = { 'landscape': 'screen and (orientation: landscape)', 'portrait': 'screen and (orientation: portrait)', 'retina': 'only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)' }; Interchange.prototype._init = function() { this._addBreakpoints(); this._generateRules(); this._reflow(); }; Interchange.prototype._events = function() { $(window).on('resize.zf.interchange', Foundation.util.throttle(this._reflow.bind(this), 50)); }; Interchange.prototype._reflow = function() { var match; // Iterate through each rule, but only save the last match for (var i in this.rules) { var rule = this.rules[i]; if (window.matchMedia(rule.query).matches) { match = rule; } } if (match) { this.replace(match.path); } }; Interchange.prototype._addBreakpoints = function() { for (var i in Foundation.MediaQuery.queries) { var query = Foundation.MediaQuery.queries[i]; Interchange.SPECIAL_QUERIES[query.name] = query.value; } }; Interchange.prototype._generateRules = function() { var rulesList = []; var rules; if (this.options.rules) { rules = this.options.rules; } else { rules = this.$element.data('interchange').match(/\[.*?\]/g); } for (var i in rules) { var rule = rules[i].slice(1, -1).split(', '); var path = rule.slice(0, -1).join(''); var query = rule[rule.length - 1]; if (Interchange.SPECIAL_QUERIES[query]) { query = Interchange.SPECIAL_QUERIES[query]; } rulesList.push({ path: path, query: query }); } this.rules = rulesList; }; Interchange.prototype.replace = function(path) { if (this.currentPath === path) return; var _this = this; // Replacing images if (this.$element[0].nodeName === 'IMG') { this.$element.attr('src', path).load(function() { _this.currentPath = path; }); } // Replacing background images else if (path.match(/\.(gif|jpg|jpeg|tiff|png)([?#].*)?/i)) { this.$element.css({ 'background-image': 'url('+path+')' }); } // Replacing HTML else { $.get(path, function(response) { _this.$element.html(response); $(response).foundation(); _this.currentPath = path; }); } this.$element.trigger('replaced.zf.interchange'); }; Interchange.prototype.destroy = function(){ //TODO this. }; Foundation.plugin(Interchange, 'Interchange'); // Exports for AMD/Browserify if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') module.exports = Interchange; if (typeof define === 'function') define(['foundation'], function() { return Interchange; }); }(Foundation, jQuery); !function(Foundation, $) { 'use strict'; function Magellan(element, options) { this.$element = element; this.options = $.extend({}, Magellan.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Magellan'); } Magellan.defaults = { animationDuration: 500, animationEasing: 'linear', threshold: 50, activeClass: 'active', deepLinking: false, barOffset: 0 }; Magellan.prototype._init = function() { var id = this.$element[0].id || Foundation.GetYoDigits(6, 'magellan'), _this = this; this.$targets = $('[data-magellan-target]'); this.$links = this.$element.find('a'); this.$element.attr({ 'data-resize': id, 'data-scroll': id, 'id': id }); this.$active = $(); this.scrollPos = parseInt(window.pageYOffset, 10); this._events(); }; Magellan.prototype.calcPoints = function(){ var _this = this, body = document.body, html = document.documentElement; this.points = []; this.winHeight = Math.round(Math.max(window.innerHeight, html.clientHeight)); this.docHeight = Math.round(Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight)); this.$targets.each(function(){ var $tar = $(this), pt = Math.round($tar.offset().top - _this.options.threshold); $tar.targetPoint = pt; _this.points.push(pt); }); }; Magellan.prototype._events = function() { var _this = this, $body = $('html, body'), opts = { duration: _this.options.animationDuration, easing: _this.options.animationEasing }; $(window).one('load', function(){ _this.calcPoints(); _this._updateActive(); }); this.$element.on({ 'resizeme.zf.trigger': this.reflow.bind(this), 'scrollme.zf.trigger': this._updateActive.bind(this) }).on('click.zf.magellan', 'a[href^="#"]', function(e) { e.preventDefault(); var arrival = this.getAttribute('href'), scrollPos = $(arrival).offset().top - _this.options.threshold / 2 - _this.options.barOffset; // requestAnimationFrame is disabled for this plugin currently // Foundation.Move(_this.options.animationDuration, $body, function(){ $body.stop(true).animate({ scrollTop: scrollPos }, opts); }); // }); }; Magellan.prototype.reflow = function(){ this.calcPoints(); this._updateActive(); }; Magellan.prototype._updateActive = function(){ var winPos = parseInt(window.pageYOffset, 10), curIdx; if(winPos + this.winHeight === this.docHeight){ curIdx = this.points.length - 1; } else if(winPos < this.points[0]){ curIdx = 0; } else{ var isDown = this.scrollPos < winPos, _this = this, curVisible = this.points.filter(function(p, i){ return isDown ? p <= winPos : p - _this.options.threshold <= winPos;//&& winPos >= _this.points[i -1] - _this.options.threshold; }); curIdx = curVisible.length ? curVisible.length - 1 : 0; } this.$active.removeClass(this.options.activeClass); this.$active = this.$links.eq(curIdx).addClass(this.options.activeClass); if(this.options.deepLinking){ var hash = this.$active[0].getAttribute('href'); if(window.history.pushState){ window.history.pushState(null, null, hash); }else{ window.location.hash = hash; } } this.scrollPos = winPos; this.$element.trigger('update.zf.magellan', [this.$active]); }; Magellan.prototype.destroy = function(){ this.$element.off('.zf.trigger .zf.magellan') .find('.' + this.options.activeClass).removeClass(this.options.activeClass); if(this.options.deepLinking){ var hash = this.$active[0].getAttribute('href'); window.location.hash.replace(hash, ''); } Foundation.unregisterPlugin(this); }; Foundation.plugin(Magellan, 'Magellan'); // Exports for AMD/Browserify if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') module.exports = Magellan; if (typeof define === 'function') define(['foundation'], function() { return Magellan; }); }(Foundation, jQuery); !function($, Foundation) { 'use strict'; function OffCanvas(element, options) { this.$element = element; this.options = $.extend({}, OffCanvas.defaults, this.$element.data(), options); this.$lastTrigger = $(); this._init(); this._events(); Foundation.registerPlugin(this, 'OffCanvas'); } OffCanvas.defaults = { closeOnClick: true, transitionTime: 0, position: 'left', forceTop: true, // isSticky: false, isRevealed: false, revealOn: null, autoFocus: true, revealClass: 'reveal-for-', trapFocus: false }; OffCanvas.prototype._init = function() { var id = this.$element.attr('id'); this.$element.attr('aria-hidden', 'true'); // Find triggers that affect this element and add aria-expanded to them $(document) .find('[data-open="'+id+'"], [data-close="'+id+'"], [data-toggle="'+id+'"]') .attr('aria-expanded', 'false') .attr('aria-controls', id); // Add a close trigger over the body if necessary if (this.options.closeOnClick){ if($('.js-off-canvas-exit').length){ this.$exiter = $('.js-off-canvas-exit'); }else{ var exiter = document.createElement('div'); exiter.setAttribute('class', 'js-off-canvas-exit'); $('[data-off-canvas-content]').append(exiter); this.$exiter = $(exiter); } } this.options.isRevealed = this.options.isRevealed || new RegExp(this.options.revealClass, 'g').test(this.$element[0].className); if(this.options.isRevealed){ this.options.revealOn = this.options.revealOn || this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split('-')[2]; this._setMQChecker(); } if(!this.options.transitionTime){ this.options.transitionTime = parseFloat(window.getComputedStyle($('[data-off-canvas-wrapper]')[0]).transitionDuration) * 1000; } }; OffCanvas.prototype._events = function() { this.$element.off('.zf.trigger .zf.offcanvas').on({ 'open.zf.trigger': this.open.bind(this), 'close.zf.trigger': this.close.bind(this), 'toggle.zf.trigger': this.toggle.bind(this), 'keydown.zf.offcanvas': this._handleKeyboard.bind(this) }); if (this.$exiter.length) { var _this = this; this.$exiter.on({'click.zf.offcanvas': this.close.bind(this)}); } }; OffCanvas.prototype._setMQChecker = function(){ var _this = this; $(window).on('changed.zf.mediaquery', function(){ if(Foundation.MediaQuery.atLeast(_this.options.revealOn)){ _this.reveal(true); }else{ _this.reveal(false); } }).one('load.zf.offcanvas', function(){ if(Foundation.MediaQuery.atLeast(_this.options.revealOn)){ _this.reveal(true); } }); }; OffCanvas.prototype.reveal = function(isRevealed){ var $closer = this.$element.find('[data-close]'); if(isRevealed){ this.close(); this.isRevealed = true; // if(!this.options.forceTop){ // var scrollPos = parseInt(window.pageYOffset); // this.$element[0].style.transform = 'translate(0,' + scrollPos + 'px)'; // } // if(this.options.isSticky){ this._stick(); } this.$element.off('open.zf.trigger toggle.zf.trigger'); if($closer.length){ $closer.hide(); } }else{ this.isRevealed = false; // if(this.options.isSticky || !this.options.forceTop){ // this.$element[0].style.transform = ''; // $(window).off('scroll.zf.offcanvas'); // } this.$element.on({ 'open.zf.trigger': this.open.bind(this), 'toggle.zf.trigger': this.toggle.bind(this) }); if($closer.length){ $closer.show(); } } }; OffCanvas.prototype.open = function(event, trigger) { if (this.$element.hasClass('is-open') || this.isRevealed){ return; } var _this = this, $body = $(document.body); $('body').scrollTop(0); // window.pageYOffset = 0; // if(!this.options.forceTop){ // var scrollPos = parseInt(window.pageYOffset); // this.$element[0].style.transform = 'translate(0,' + scrollPos + 'px)'; // if(this.$exiter.length){ // this.$exiter[0].style.transform = 'translate(0,' + scrollPos + 'px)'; // } // } Foundation.Move(this.options.transitionTime, this.$element, function(){ $('[data-off-canvas-wrapper]').addClass('is-off-canvas-open is-open-'+ _this.options.position); _this.$element .addClass('is-open') // if(_this.options.isSticky){ // _this._stick(); // } }); this.$element.attr('aria-hidden', 'false') .trigger('opened.zf.offcanvas'); if(trigger){ this.$lastTrigger = trigger.attr('aria-expanded', 'true'); } if(this.options.autoFocus){ this.$element.one('finished.zf.animate', function(){ _this.$element.find('a, button').eq(0).focus(); }); } if(this.options.trapFocus){ $('[data-off-canvas-content]').attr('tabindex', '-1'); this._trapFocus(); } }; OffCanvas.prototype._trapFocus = function(){ var focusable = Foundation.Keyboard.findFocusable(this.$element), first = focusable.eq(0), last = focusable.eq(-1); focusable.off('.zf.offcanvas').on('keydown.zf.offcanvas', function(e){ if(e.which === 9 || e.keycode === 9){ if(e.target === last[0] && !e.shiftKey){ e.preventDefault(); first.focus(); } if(e.target === first[0] && e.shiftKey){ e.preventDefault(); last.focus(); } } }); }; // OffCanvas.prototype._stick = function(){ // var elStyle = this.$element[0].style; // // if(this.options.closeOnClick){ // var exitStyle = this.$exiter[0].style; // } // // $(window).on('scroll.zf.offcanvas', function(e){ // console.log(e); // var pageY = window.pageYOffset; // elStyle.transform = 'translate(0,' + pageY + 'px)'; // if(exitStyle !== undefined){ exitStyle.transform = 'translate(0,' + pageY + 'px)'; } // }); // // this.$element.trigger('stuck.zf.offcanvas'); // }; OffCanvas.prototype.close = function(cb) { if(!this.$element.hasClass('is-open') || this.isRevealed){ return; } var _this = this; // Foundation.Move(this.options.transitionTime, this.$element, function(){ $('[data-off-canvas-wrapper]').removeClass('is-off-canvas-open is-open-' + _this.options.position); _this.$element.removeClass('is-open'); // Foundation._reflow(); // }); this.$element.attr('aria-hidden', 'true') .trigger('closed.zf.offcanvas'); // if(_this.options.isSticky || !_this.options.forceTop){ // setTimeout(function(){ // _this.$element[0].style.transform = ''; // $(window).off('scroll.zf.offcanvas'); // }, this.options.transitionTime); // } this.$lastTrigger.attr('aria-expanded', 'false'); if(this.options.trapFocus){ $('[data-off-canvas-content]').removeAttr('tabindex'); } }; OffCanvas.prototype.toggle = function(event, trigger) { if (this.$element.hasClass('is-open')) { this.close(event, trigger); } else { this.open(event, trigger); } }; OffCanvas.prototype._handleKeyboard = function(event) { if (event.which !== 27) return; event.stopPropagation(); event.preventDefault(); this.close(); this.$lastTrigger.focus(); }; OffCanvas.prototype.destroy = function(){ this.close(); this.$element.off('.zf.trigger .zf.offcanvas'); this.$exiter.off('.zf.offcanvas'); Foundation.unregisterPlugin(this); }; Foundation.plugin(OffCanvas, 'OffCanvas'); }(jQuery, Foundation); !function($, Foundation){ 'use strict'; function Orbit(element, options){ this.$element = element; this.options = $.extend({}, Orbit.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Orbit'); Foundation.Keyboard.register('Orbit', { 'ltr': { 'ARROW_RIGHT': 'next', 'ARROW_LEFT': 'previous' }, 'rtl': { 'ARROW_LEFT': 'next', 'ARROW_RIGHT': 'previous' } }); } Orbit.defaults = { bullets: true, navButtons: true, animInFromRight: 'slide-in-right', animOutToRight: 'slide-out-right', animInFromLeft: 'slide-in-left', animOutToLeft: 'slide-out-left', autoPlay: true, timerDelay: 5000, infiniteWrap: true, swipe: true, pauseOnHover: true, accessible: true, containerClass: 'orbit-container', slideClass: 'orbit-slide', boxOfBullets: 'orbit-bullets', nextClass: 'orbit-next', prevClass: 'orbit-previous', useMUI: true }; Orbit.prototype._init = function(){ this.$wrapper = this.$element.find('.' + this.options.containerClass); this.$slides = this.$element.find('.' + this.options.slideClass); var $images = this.$element.find('img'), initActive = this.$slides.filter('.is-active'); if(!initActive.length){ this.$slides.eq(0).addClass('is-active'); } if(!this.options.useMUI){ this.$slides.addClass('no-motionui'); } if($images.length){ Foundation.onImagesLoaded($images, this._prepareForOrbit.bind(this)); }else{ this._prepareForOrbit();//hehe } if(this.options.bullets){ this._loadBullets(); } this._events(); if(this.options.autoPlay){ this.geoSync(); } if(this.options.accessible){ // allow wrapper to be focusable to enable arrow navigation this.$wrapper.attr('tabindex', 0); } }; Orbit.prototype._loadBullets = function(){ this.$bullets = this.$element.find('.' + this.options.boxOfBullets).find('button'); }; Orbit.prototype.geoSync = function(){ var _this = this; this.timer = new Foundation.Timer( this.$element, {duration: this.options.timerDelay, infinite: false}, function(){ _this.changeSlide(true); }); this.timer.start(); }; Orbit.prototype._prepareForOrbit = function(){ var _this = this; this._setWrapperHeight(function(max){ _this._setSlideHeight(max); }); }; Orbit.prototype._setWrapperHeight = function(cb){//rewrite this to `for` loop var max = 0, temp, counter = 0; this.$slides.each(function(){ temp = this.getBoundingClientRect().height; $(this).attr('data-slide', counter); if(counter){//if not the first slide, set css position and display property $(this).css({'position': 'relative', 'display': 'none'}); } max = temp > max ? temp : max; counter++; }); if(counter === this.$slides.length){ this.$wrapper.css({'height': max});//only change the wrapper height property once. cb(max);//fire callback with max height dimension. } }; Orbit.prototype._setSlideHeight = function(height){ this.$slides.each(function(){ $(this).css('max-height', height); }); }; Orbit.prototype._events = function(){ var _this = this; / Orbit.prototype.changeSlide = function(isLTR, chosenSlide, idx){ var $curSlide = this.$slides.filter('.is-active').eq(0); if(/mui/g.test($curSlide[0].className)){ return false; }//if the slide is currently animating, kick out of the function var $firstSlide = this.$slides.first(), $lastSlide = this.$slides.last(), dirIn = isLTR ? 'Right' : 'Left', dirOut = isLTR ? 'Left' : 'Right', _this = this, $newSlide; if(!chosenSlide){//most of the time, this will be auto played or clicked from the navButtons. $newSlide = isLTR ? //if wrapping enabled, check to see if there is a `next` or `prev` sibling, if not, select the first or last slide to fill in. if wrapping not enabled, attempt to select `next` or `prev`, if there's nothing there, the function will kick out on next step. CRAZY NESTED TERNARIES!!!!! (this.options.infiniteWrap ? $curSlide.next('.' + this.options.slideClass).length ? $curSlide.next('.' + this.options.slideClass) : $firstSlide : $curSlide.next('.' + this.options.slideClass))//pick next slide if moving left to right : (this.options.infiniteWrap ? $curSlide.prev('.' + this.options.slideClass).length ? $curSlide.prev('.' + this.options.slideClass) : $lastSlide : $curSlide.prev('.' + this.options.slideClass));//pick prev slide if moving right to left }else{ $newSlide = chosenSlide; } if($newSlide.length){ if(this.options.bullets){ idx = idx || this.$slides.index($newSlide);//grab index to update bullets this._updateBullets(idx); } if(this.options.useMUI){ Foundation.Motion.animateIn( $newSlide.addClass('is-active').css({'position': 'absolute', 'top': 0}), this.options['animInFrom' + dirIn], function(){ $newSlide.css({'position': 'relative', 'display': 'block'}) .attr('aria-live', 'polite'); }); Foundation.Motion.animateOut( $curSlide.removeClass('is-active'), this.options['animOutTo' + dirOut], function(){ $curSlide.removeAttr('aria-live'); if(_this.options.autoPlay){ _this.timer.restart(); } //do stuff? }); }else{ $curSlide.removeClass('is-active is-in').removeAttr('aria-live').hide(); $newSlide.addClass('is-active is-in').attr('aria-live', 'polite').show(); if(this.options.autoPlay){ this.timer.restart(); } } this.$element.trigger('slidechange.zf.orbit', [$newSlide]); } }; Orbit.prototype._updateBullets = function(idx){ var $oldBullet = this.$element.find('.' + this.options.boxOfBullets) .find('.is-active').removeClass('is-active').blur(), span = $oldBullet.find('span:last').detach(), $newBullet = this.$bullets.eq(idx).addClass('is-active').append(span); }; Orbit.prototype.destroy = function(){ delete this.timer; this.$element.off('.zf.orbit').find('*').off('.zf.orbit').end().hide(); Foundation.unregisterPlugin(this); }; Foundation.plugin(Orbit, 'Orbit'); }(jQuery, window.Foundation); !function(Foundation, $) { 'use strict'; // The plugin matches the plugin classes with these plugin instances. var MenuPlugins = { dropdown: { cssClass: 'dropdown', plugin: Foundation._plugins['dropdown-menu'] || null }, drilldown: { cssClass: 'drilldown', plugin: Foundation._plugins['drilldown'] || null }, accordion: { cssClass: 'accordion-menu', plugin: Foundation._plugins['accordion-menu'] || null } }; // [PH] Media queries var phMedia = { small: '(min-width: 0px)', medium: '(min-width: 640px)' }; function ResponsiveMenu(element) { this.$element = $(element); this.rules = this.$element.data('responsive-menu'); this.currentMq = null; this.currentPlugin = null; this._init(); this._events(); Foundation.registerPlugin(this, 'ResponsiveMenu'); } ResponsiveMenu.defaults = {}; ResponsiveMenu.prototype._init = function() { var rulesTree = {}; // Parse rules from "classes" in data attribute var rules = this.rules.split(' '); // Iterate through every rule found for (var i = 0; i < rules.length; i++) { var rule = rules[i].split('-'); var ruleSize = rule.length > 1 ? rule[0] : 'small'; var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; if (MenuPlugins[rulePlugin] !== null) { rulesTree[ruleSize] = MenuPlugins[rulePlugin]; } } this.rules = rulesTree; if (!$.isEmptyObject(rulesTree)) { this._checkMediaQueries(); } }; ResponsiveMenu.prototype._events = function() { var _this = this; $(window).on('changed.zf.mediaquery', function() { _this._checkMediaQueries(); }); // $(window).on('resize.zf.ResponsiveMenu', function() { // _this._checkMediaQueries(); // }); }; ResponsiveMenu.prototype._checkMediaQueries = function() { var matchedMq, _this = this; // Iterate through each rule and find the last matching rule $.each(this.rules, function(key) { if (Foundation.MediaQuery.atLeast(key)) { matchedMq = key; } }); // No match? No dice if (!matchedMq) return; // Plugin already initialized? We good if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; // Remove existing plugin-specific CSS classes $.each(MenuPlugins, function(key, value) { _this.$element.removeClass(value.cssClass); }); // Add the CSS class for the new plugin this.$element.addClass(this.rules[matchedMq].cssClass); // Create an instance of the new plugin if (this.currentPlugin) this.currentPlugin.destroy(); this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); }; ResponsiveMenu.prototype.destroy = function() { this.currentPlugin.destroy(); $(window).off('.zf.ResponsiveMenu'); Foundation.unregisterPlugin(this); }; Foundation.plugin(ResponsiveMenu, 'ResponsiveMenu'); }(Foundation, jQuery); !function($, Foundation) { 'use strict'; function ResponsiveToggle(element, options) { this.$element = $(element); this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options); this._init(); this._events(); Foundation.registerPlugin(this, 'ResponsiveToggle'); } ResponsiveToggle.defaults = { hideFor: 'medium' }; ResponsiveToggle.prototype._init = function() { var targetID = this.$element.data('responsive-toggle'); if (!targetID) { console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.'); } this.$targetMenu = $('#'+targetID); this.$toggler = this.$element.find('[data-toggle]'); this._update(); }; ResponsiveToggle.prototype._events = function() { var _this = this; $(window).on('changed.zf.mediaquery', this._update.bind(this)); this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this)); }; ResponsiveToggle.prototype._update = function() { // Mobile if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) { this.$element.show(); this.$targetMenu.hide(); } // Desktop else { this.$element.hide(); this.$targetMenu.show(); } }; ResponsiveToggle.prototype.toggleMenu = function() { if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) { this.$targetMenu.toggle(0); this.$element.trigger('toggled.zf.responsiveToggle'); } }; ResponsiveToggle.prototype.destroy = function(){ //TODO this... }; Foundation.plugin(ResponsiveToggle, 'ResponsiveToggle'); }(jQuery, Foundation); !function(Foundation, $) { 'use strict'; function Reveal(element, options) { this.$element = element; this.options = $.extend({}, Reveal.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Reveal'); Foundation.Keyboard.register('Reveal', { 'ENTER': 'open', 'SPACE': 'open', 'ESCAPE': 'close', 'TAB': 'tab_forward', 'SHIFT_TAB': 'tab_backward' }); } Reveal.defaults = { animationIn: '', animationOut: '', showDelay: 0, hideDelay: 0, closeOnClick: true, closeOnEsc: true, multipleOpened: false, vOffset: 100, hOffset: 0, fullScreen: false, btmOffsetPct: 10, overlay: true, resetOnClose: false }; Reveal.prototype._init = function(){ this.id = this.$element.attr('id'); this.isActive = false; this.$anchor = $('[data-open="' + this.id + '"]').length ? $('[data-open="' + this.id + '"]') : $('[data-toggle="' + this.id + '"]'); if(this.$anchor.length){ var anchorId = this.$anchor[0].id || Foundation.GetYoDigits(6, 'reveal'); this.$anchor.attr({ 'aria-controls': this.id, 'id': anchorId, 'aria-haspopup': true, 'tabindex': 0 }); this.$element.attr({'aria-labelledby': anchorId}); } // this.options.fullScreen = this.$element.hasClass('full'); if(this.options.fullScreen || this.$element.hasClass('full')){ this.options.fullScreen = true; this.options.overlay = false; } if(this.options.overlay && !this.$overlay){ this.$overlay = this._makeOverlay(this.id); } this.$element.attr({ 'role': 'dialog', 'aria-hidden': true, 'data-yeti-box': this.id, 'data-resize': this.id }); this._events(); }; Reveal.prototype._makeOverlay = function(id){ var $overlay = $('
    ') .addClass('reveal-overlay') .attr({'tabindex': -1, 'aria-hidden': true}) .appendTo('body'); if(this.options.closeOnClick){ $overlay.attr({ 'data-close': id }); } return $overlay; }; Reveal.prototype._events = function(){ var _this = this; this.$element.on({ 'open.zf.trigger': this.open.bind(this), 'close.zf.trigger': this.close.bind(this), 'toggle.zf.trigger': this.toggle.bind(this), 'resizeme.zf.trigger': function(){ if(_this.$element.is(':visible')){ _this._setPosition(function(){}); } } }); if(this.$anchor.length){ this.$anchor.on('keydown.zf.reveal', function(e){ if(e.which === 13 || e.which === 32){ e.stopPropagation(); e.preventDefault(); _this.open(); } }); } if(this.options.closeOnClick && this.options.overlay){ this.$overlay.off('.zf.reveal').on('click.zf.reveal', this.close.bind(this)); } }; Reveal.prototype._setPosition = function(cb){ var eleDims = Foundation.Box.GetDimensions(this.$element); var elePos = this.options.fullScreen ? 'reveal full' : (eleDims.height >= (0.5 * eleDims.windowDims.height)) ? 'reveal' : 'center'; if(elePos === 'reveal full'){ //set to full height/width this.$element .offset(Foundation.Box.GetOffsets(this.$element, null, elePos, this.options.vOffset)) .css({ 'height': eleDims.windowDims.height, 'width': eleDims.windowDims.width }); }else if(!Foundation.MediaQuery.atLeast('medium') || !Foundation.Box.ImNotTouchingYou(this.$element, null, true, false)){ //if smaller than medium, resize to 100% width minus any custom L/R margin this.$element .css({ 'width': eleDims.windowDims.width - (this.options.hOffset * 2) }) .offset(Foundation.Box.GetOffsets(this.$element, null, 'center', this.options.vOffset, this.options.hOffset)); //flag a boolean so we can reset the size after the element is closed. this.changedSize = true; }else{ this.$element .css({ 'max-height': eleDims.windowDims.height - (this.options.vOffset * (this.options.btmOffsetPct / 100 + 1)), 'width': '' }) .offset(Foundation.Box.GetOffsets(this.$element, null, elePos, this.options.vOffset)); //the max height based on a percentage of vertical offset plus vertical offset } cb(); }; Reveal.prototype.open = function(){ var _this = this; this.isActive = true; //make element invisible, but remove display: none so we can get size and positioning this.$element .css({'visibility': 'hidden'}) .show() .scrollTop(0); this._setPosition(function(){ _this.$element.hide() .css({'visibility': ''}); if(!_this.options.multipleOpened){ _this.$element.trigger('closeme.zf.reveal', _this.id); } if(_this.options.animationIn){ if(_this.options.overlay){ Foundation.Motion.animateIn(_this.$overlay, 'fade-in', function(){ Foundation.Motion.animateIn(_this.$element, _this.options.animationIn, function(){ _this.focusableElements = Foundation.Keyboard.findFocusable(_this.$element); }); }); }else{ Foundation.Motion.animateIn(_this.$element, _this.options.animationIn, function(){ _this.focusableElements = Foundation.Keyboard.findFocusable(_this.$element); }); } }else{ if(_this.options.overlay){ _this.$overlay.show(0, function(){ _this.$element.show(_this.options.showDelay, function(){ }); }); }else{ _this.$element.show(_this.options.showDelay, function(){ }); } } }); // handle accessibility this.$element.attr({'aria-hidden': false}).attr('tabindex', -1).focus() .trigger('open.zf.reveal'); $('body').addClass('is-reveal-open') .attr({'aria-hidden': (this.options.overlay || this.options.fullScreen) ? true : false}); setTimeout(function(){ _this._extraHandlers(); // Foundation.reflow(); }, 0); }; Reveal.prototype._extraHandlers = function(){ var _this = this; this.focusableElements = Foundation.Keyboard.findFocusable(this.$element); if(!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen){ $('body').on('click.zf.reveal', function(e){ // if() _this.close(); }); } if(this.options.closeOnEsc){ $(window).on('keydown.zf.reveal', function(e){ Foundation.Keyboard.handleKey(e, 'Reveal', { close: function() { if (_this.options.closeOnEsc) { _this.close(); _this.$anchor.focus(); } } }); if (_this.focusableElements.length === 0) { // no focusable elements inside the modal at all, prevent tabbing in general e.preventDefault(); } }); } // lock focus within modal while tabbing this.$element.on('keydown.zf.reveal', function(e) { var $target = $(this); // handle keyboard event with keyboard util Foundation.Keyboard.handleKey(e, 'Reveal', { tab_forward: function() { if (_this.$element.find(':focus').is(_this.focusableElements.eq(-1))) { // left modal downwards, setting focus to first element _this.focusableElements.eq(0).focus(); e.preventDefault(); } }, tab_backward: function() { if (_this.$element.find(':focus').is(_this.focusableElements.eq(0)) || _this.$element.is(':focus')) { // left modal upwards, setting focus to last element _this.focusableElements.eq(-1).focus(); e.preventDefault(); } }, open: function() { if (_this.$element.find(':focus').is(_this.$element.find('[data-close]'))) { setTimeout(function() { // set focus back to anchor if close button has been activated _this.$anchor.focus(); }, 1); } else if ($target.is(_this.focusableElements)) { // dont't trigger if acual element has focus (i.e. inputs, links, ...) _this.open(); } }, close: function() { if (_this.options.closeOnEsc) { _this.close(); _this.$anchor.focus(); } } }); }); }; Reveal.prototype.close = function(){ if(!this.isActive || !this.$element.is(':visible')){ return false; } var _this = this; if(this.options.animationOut){ Foundation.Motion.animateOut(this.$element, this.options.animationOut, function(){ if(_this.options.overlay){ Foundation.Motion.animateOut(_this.$overlay, 'fade-out', function(){ }); } }); }else{ this.$element.hide(_this.options.hideDelay, function(){ if(_this.options.overlay){ _this.$overlay.hide(0, function(){ }); } }); } //conditionals to remove extra event listeners added on open if(this.options.closeOnEsc){ $(window).off('keydown.zf.reveal'); } if(!this.options.overlay && this.options.closeOnClick){ $('body').off('click.zf.reveal'); } this.$element.off('keydown.zf.reveal'); //if the modal changed size, reset it if(this.changedSize){ this.$element.css({ 'height': '', 'width': '' }); } $('body').removeClass('is-reveal-open').attr({'aria-hidden': false, 'tabindex': ''}); if(this.options.resetOnClose) { this.$element.html(this.$element.html()); } this.isActive = false; this.$element.attr({'aria-hidden': true}) .trigger('closed.zf.reveal'); }; Reveal.prototype.toggle = function(){ if(this.isActive){ this.close(); }else{ this.open(); } }; Reveal.prototype.destroy = function() { if(this.options.overlay){ this.$overlay.hide().off().remove(); } this.$element.hide(); this.$anchor.off(); Foundation.unregisterPlugin(this); }; Foundation.plugin(Reveal, 'Reveal'); // Exports for AMD/Browserify if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') module.exports = Reveal; if (typeof define === 'function') define(['foundation'], function() { return Reveal; }); }(Foundation, jQuery); !function($, Foundation){ 'use strict'; function Slider(element, options){ this.$element = element; this.options = $.extend({}, Slider.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Slider'); Foundation.Keyboard.register('Slider', { 'ltr': { 'ARROW_RIGHT': 'increase', 'ARROW_UP': 'increase', 'ARROW_DOWN': 'decrease', 'ARROW_LEFT': 'decrease', 'SHIFT_ARROW_RIGHT': 'increase_fast', 'SHIFT_ARROW_UP': 'increase_fast', 'SHIFT_ARROW_DOWN': 'decrease_fast', 'SHIFT_ARROW_LEFT': 'decrease_fast' }, 'rtl': { 'ARROW_LEFT': 'increase', 'ARROW_RIGHT': 'decrease', 'SHIFT_ARROW_LEFT': 'increase_fast', 'SHIFT_ARROW_RIGHT': 'decrease_fast' } }); } Slider.defaults = { start: 0, end: 100, step: 1, initialStart: 0, initialEnd: 100, binding: false, clickSelect: true, vertical: false, draggable: true, disabled: false, doubleSided: false, // steps: 100, decimal: 2, // dragDelay: 0, moveTime: 200,//update this if changing the transition time in the sass disabledClass: 'disabled' }; Slider.prototype._init = function(){ this.inputs = this.$element.find('input'); this.handles = this.$element.find('[data-slider-handle]'); this.$handle = this.handles.eq(0); this.$input = this.inputs.length ? this.inputs.eq(0) : $('#' + this.$handle.attr('aria-controls')); this.$fill = this.$element.find('[data-slider-fill]').css(this.options.vertical ? 'height' : 'width', 0); var isDbl = false, _this = this; if(this.options.disabled || this.$element.hasClass(this.options.disabledClass)){ this.options.disabled = true; this.$element.addClass(this.options.disabledClass); } if(!this.inputs.length){ this.inputs = $().add(this.$input); this.options.binding = true; } this._setInitAttr(0); this._events(this.$handle); if(this.handles[1]){ this.options.doubleSided = true; this.$handle2 = this.handles.eq(1); this.$input2 = this.inputs.length > 1 ? this.inputs.eq(1) : $('#' + this.$handle2.attr('aria-controls')); if(!this.inputs[1]){ this.inputs = this.inputs.add(this.$input2); } isDbl = true; this._setHandlePos(this.$handle, this.options.initialStart, true, function(){ _this._setHandlePos(_this.$handle2, _this.options.initialEnd); }); // this.$handle.triggerHandler('click.zf.slider'); this._setInitAttr(1); this._events(this.$handle2); } if(!isDbl){ this._setHandlePos(this.$handle, this.options.initialStart, true); } }; Slider.prototype._setHandlePos = function($hndl, location, noInvert, cb){ //might need to alter that slightly for bars that will have odd number selections. location = parseFloat(location);//on input change events, convert string to number...grumble. // prevent slider from running out of bounds if(location < this.options.start){ location = this.options.start; } else if(location > this.options.end){ location = this.options.end; } var isDbl = this.options.doubleSided, callback = cb || null; if(isDbl){ if(this.handles.index($hndl) === 0){ var h2Val = parseFloat(this.$handle2.attr('aria-valuenow')); location = location >= h2Val ? h2Val - this.options.step : location; }else{ var h1Val = parseFloat(this.$handle.attr('aria-valuenow')); location = location <= h1Val ? h1Val + this.options.step : location; } } if(this.options.vertical && !noInvert){ location = this.options.end - location; } var _this = this, vert = this.options.vertical, hOrW = vert ? 'height' : 'width', lOrT = vert ? 'top' : 'left', halfOfHandle = $hndl[0].getBoundingClientRect()[hOrW] / 2, elemDim = this.$element[0].getBoundingClientRect()[hOrW], pctOfBar = percent(location, this.options.end).toFixed(2), pxToMove = (elemDim - halfOfHandle) * pctOfBar, movement = (percent(pxToMove, elemDim) * 100).toFixed(this.options.decimal), location = location > 0 ? parseFloat(location.toFixed(this.options.decimal)) : 0, anim, prog, start = null, css = {}; this._setValues($hndl, location); if(this.options.doubleSided){//update to calculate based on values set to respective inputs?? var isLeftHndl = this.handles.index($hndl) === 0, dim, idx = this.handles.index($hndl); if(isLeftHndl){ css[lOrT] = (pctOfBar > 0 ? pctOfBar * 100 : 0) + '%';// dim = ((percent(this.$handle2.position()[lOrT] + halfOfHandle, elemDim) - parseFloat(pctOfBar)) * 100).toFixed(this.options.decimal) + '%'; css['min-' + hOrW] = dim; if(cb && typeof cb === 'function'){ cb(); } }else{ var handleLeft = parseFloat(this.$handle[0].style.left); location = (location < 100 ? location : 100) - (!isNaN(handleLeft) ? handleLeft : this.options.end - location); css['min-' + hOrW] = location + '%'; } } this.$element.one('finished.zf.animate', function(){ _this.animComplete = true; _this.$element.trigger('moved.zf.slider', [$hndl]); }); var moveTime = _this.$element.data('dragging') ? 1000/60 : _this.options.moveTime; Foundation.Move(moveTime, $hndl, function(){ $hndl.css(lOrT, movement + '%'); if(!_this.options.doubleSided){ _this.$fill.css(hOrW, pctOfBar * 100 + '%'); }else{ _this.$fill.css(css); } }); // move.do(); }; Slider.prototype._setInitAttr = function(idx){ var id = this.inputs.eq(idx).attr('id') || Foundation.GetYoDigits(6, 'slider'); this.inputs.eq(idx).attr({ 'id': id, 'max': this.options.end, 'min': this.options.start }); this.handles.eq(idx).attr({ 'role': 'slider', 'aria-controls': id, 'aria-valuemax': this.options.end, 'aria-valuemin': this.options.start, 'aria-valuenow': idx === 0 ? this.options.initialStart : this.options.initialEnd, 'aria-orientation': this.options.vertical ? 'vertical' : 'horizontal', 'tabindex': 0 }); }; Slider.prototype._setValues = function($handle, val){ var idx = this.options.doubleSided ? this.handles.index($handle) : 0; this.inputs.eq(idx).val(val); $handle.attr('aria-valuenow', val); }; Slider.prototype._handleEvent = function(e, $handle, val){ var value, hasVal; if(!val){//click or drag events e.preventDefault(); var _this = this, vertical = this.options.vertical, param = vertical ? 'height' : 'width', direction = vertical ? 'top' : 'left', pageXY = vertical ? e.pageY : e.pageX, halfOfHandle = this.$handle[0].getBoundingClientRect()[param] / 2, barDim = this.$element[0].getBoundingClientRect()[param], barOffset = (this.$element.offset()[direction] - pageXY), barXY = barOffset > 0 ? -halfOfHandle : (barOffset - halfOfHandle) < -barDim ? barDim : Math.abs(barOffset),//if the cursor position is less than or greater than the elements bounding coordinates, set coordinates within those bounds // eleDim = this.$element[0].getBoundingClientRect()[param], offsetPct = percent(barXY, barDim); value = (this.options.end - this.options.start) * offsetPct; hasVal = false; if(!$handle){//figure out which handle it is, pass it to the next function. var firstHndlPos = absPosition(this.$handle, direction, barXY, param), secndHndlPos = absPosition(this.$handle2, direction, barXY, param); $handle = firstHndlPos <= secndHndlPos ? this.$handle : this.$handle2; } }else{//change event on input value = val; hasVal = true; } this._setHandlePos($handle, value, hasVal); }; Slider.prototype._events = function($handle){ if(this.options.disabled){ return false; } var _this = this, curHandle, timer; this.inputs.off('change.zf.slider').on('change.zf.slider', function(e){ var idx = _this.inputs.index($(this)); _this._handleEvent(e, _this.handles.eq(idx), $(this).val()); }); if(this.options.clickSelect){ this.$element.off('click.zf.slider').on('click.zf.slider', function(e){ if(_this.$element.data('dragging')){ return false; } _this.animComplete = false; if(_this.options.doubleSided){ _this._handleEvent(e); }else{ _this._handleEvent(e, _this.$handle); } }); } if(this.options.draggable){ this.handles.addTouch(); // var curHandle, // timer, var $body = $('body'); $handle .off('mousedown.zf.slider') .on('mousedown.zf.slider', function(e){ $handle.addClass('is-dragging'); _this.$fill.addClass('is-dragging');// _this.$element.data('dragging', true); _this.animComplete = false; curHandle = $(e.currentTarget); $body.on('mousemove.zf.slider', function(e){ e.preventDefault(); // timer = setTimeout(function(){ _this._handleEvent(e, curHandle); // }, _this.options.dragDelay); }).on('mouseup.zf.slider', function(e){ // clearTimeout(timer); _this.animComplete = true; _this._handleEvent(e, curHandle); $handle.removeClass('is-dragging'); _this.$fill.removeClass('is-dragging'); _this.$element.data('dragging', false); // Foundation.reflow(_this.$element, 'slider'); $body.off('mousemove.zf.slider mouseup.zf.slider'); }); }); } $handle.off('keydown.zf.slider').on('keydown.zf.slider', function(e){ var idx = _this.options.doubleSided ? _this.handles.index($(this)) : 0, oldValue = parseFloat(_this.inputs.eq(idx).val()), newValue; var _$handle = $(this); // handle keyboard event with keyboard util Foundation.Keyboard.handleKey(e, 'Slider', { decrease: function() { newValue = oldValue - _this.options.step; }, increase: function() { newValue = oldValue + _this.options.step; }, decrease_fast: function() { newValue = oldValue - _this.options.step * 10; }, increase_fast: function() { newValue = oldValue + _this.options.step * 10; }, handled: function() { // only set handle pos when event was handled specially e.preventDefault(); _this._setHandlePos(_$handle, newValue, true); } }); }); }; Slider.prototype.destroy = function(){ this.handles.off('.zf.slider'); this.inputs.off('.zf.slider'); this.$element.off('.zf.slider'); Foundation.unregisterPlugin(this); }; Foundation.plugin(Slider, 'Slider'); function percent(frac, num){ return (frac / num); } function absPosition($handle, dir, clickPos, param){ return Math.abs(($handle.position()[dir] + ($handle[param]() / 2)) - clickPos); } }(jQuery, window.Foundation); / !function($, Foundation){ 'use strict'; function Sticky(element, options){ this.$element = element; this.options = $.extend({}, Sticky.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Sticky'); } Sticky.defaults = { container: '
    ', stickTo: 'top', anchor: '', topAnchor: '', btmAnchor: '', marginTop: 1, marginBottom: 1, stickyOn: 'medium', stickyClass: 'sticky', containerClass: 'sticky-container', checkEvery: -1 }; Sticky.prototype._init = function(){ var $parent = this.$element.parent('[data-sticky-container]'), id = this.$element[0].id || Foundation.GetYoDigits(6, 'sticky'), _this = this; if(!$parent.length){ this.wasWrapped = true; } this.$container = $parent.length ? $parent : $(this.options.container).wrapInner(this.$element); this.$container.addClass(this.options.containerClass); this.$element.addClass(this.options.stickyClass) .attr({'data-resize': id}); this.scrollCount = this.options.checkEvery; this.isStuck = false; if(this.options.anchor !== ''){ this.$anchor = $('#' + this.options.anchor); }else{ this._parsePoints(); } this._setSizes(function(){ _this._calc(false); }); this._events(id.split('-').reverse().join('-')); }; Sticky.prototype._parsePoints = function(){ var top = this.options.topAnchor, btm = this.options.btmAnchor, pts = [top, btm], breaks = {}; if(top && btm){ for(var i = 0, len = pts.length; i < len && pts[i]; i++){ var pt; if(typeof pts[i] === 'number'){ pt = pts[i]; }else{ var place = pts[i].split(':'), anchor = $('#' + place[0]); pt = anchor.offset().top; if(place[1] && place[1].toLowerCase() === 'bottom'){ pt += anchor[0].getBoundingClientRect().height; } } breaks[i] = pt; } }else{ breaks = {0: 1, 1: document.documentElement.scrollHeight}; } this.points = breaks; return; }; Sticky.prototype._events = function(id){ var _this = this, scrollListener = this.scrollListener = 'scroll.zf.' + id; if(this.isOn){ return; } if(this.canStick){ this.isOn = true; $(window).off(scrollListener) .on(scrollListener, function(e){ if(_this.scrollCount === 0){ _this.scrollCount = _this.options.checkEvery; _this._setSizes(function(){ _this._calc(false, window.pageYOffset); }); }else{ _this.scrollCount--; _this._calc(false, window.pageYOffset); } }); } this.$element.off('resizeme.zf.trigger') .on('resizeme.zf.trigger', function(e, el){ _this._setSizes(function(){ _this._calc(false); if(_this.canStick){ if(!_this.isOn){ _this._events(id); } }else if(_this.isOn){ _this._pauseListeners(scrollListener); } }); }); }; Sticky.prototype._pauseListeners = function(scrollListener){ this.isOn = false; $(window).off(scrollListener); this.$element.trigger('pause.zf.sticky'); }; Sticky.prototype._calc = function(checkSizes, scroll){ if(checkSizes){ this._setSizes(); } if(!this.canStick){ if(this.isStuck){ this._removeSticky(true); } return false; } if(!scroll){ scroll = window.pageYOffset; } if(scroll >= this.topPoint){ if(scroll <= this.bottomPoint){ if(!this.isStuck){ this._setSticky(); } }else{ if(this.isStuck){ this._removeSticky(false); } } }else{ if(this.isStuck){ this._removeSticky(true); } } }; Sticky.prototype._setSticky = function(){ var stickTo = this.options.stickTo, mrgn = stickTo === 'top' ? 'marginTop' : 'marginBottom', notStuckTo = stickTo === 'top' ? 'bottom' : 'top', css = {}; css[mrgn] = this.options[mrgn] + 'em'; css[stickTo] = 0; css[notStuckTo] = 'auto'; css['left'] = this.$container.offset().left + parseInt(window.getComputedStyle(this.$container[0])["padding-left"], 10); this.isStuck = true; this.$element.removeClass('is-anchored is-at-' + notStuckTo) .addClass('is-stuck is-at-' + stickTo) .css(css) .trigger('sticky.zf.stuckto:' + stickTo); }; Sticky.prototype._removeSticky = function(isTop){ var stickTo = this.options.stickTo, stickToTop = stickTo === 'top', css = {}, anchorPt = (this.points ? this.points[1] - this.points[0] : this.anchorHeight) - this.elemHeight, mrgn = stickToTop ? 'marginTop' : 'marginBottom', notStuckTo = stickToTop ? 'bottom' : 'top', topOrBottom = isTop ? 'top' : 'bottom'; css[mrgn] = 0; if((isTop && !stickToTop) || (stickToTop && !isTop)){ css[stickTo] = anchorPt; css[notStuckTo] = 0; }else{ css[stickTo] = 0; css[notStuckTo] = anchorPt; } css['left'] = ''; this.isStuck = false; this.$element.removeClass('is-stuck is-at-' + stickTo) .addClass('is-anchored is-at-' + topOrBottom) .css(css) .trigger('sticky.zf.unstuckfrom:' + topOrBottom); }; Sticky.prototype._setSizes = function(cb){ this.canStick = Foundation.MediaQuery.atLeast(this.options.stickyOn); if(!this.canStick){ cb(); } var _this = this, newElemWidth = this.$container[0].getBoundingClientRect().width, comp = window.getComputedStyle(this.$container[0]), pdng = parseInt(comp['padding-right'], 10); if(this.$anchor && this.$anchor.length){ this.anchorHeight = this.$anchor[0].getBoundingClientRect().height; }else{ this._parsePoints(); } this.$element.css({ 'max-width': newElemWidth - pdng + 'px' }); var newContainerHeight = this.$element[0].getBoundingClientRect().height || this.containerHeight; this.containerHeight = newContainerHeight; this.$container.css({ height: newContainerHeight }); this.elemHeight = newContainerHeight; if (this.isStuck) { this.$element.css({"left":this.$container.offset().left + parseInt(comp['padding-left'], 10)}); } this._setBreakPoints(newContainerHeight, function(){ if(cb){ cb(); } }); }; Sticky.prototype._setBreakPoints = function(elemHeight, cb){ if(!this.canStick){ if(cb){ cb(); } else{ return false; } } var mTop = emCalc(this.options.marginTop), mBtm = emCalc(this.options.marginBottom), topPoint = this.points ? this.points[0] : this.$anchor.offset().top, bottomPoint = this.points ? this.points[1] : topPoint + this.anchorHeight, // topPoint = this.$anchor.offset().top || this.points[0], // bottomPoint = topPoint + this.anchorHeight || this.points[1], winHeight = window.innerHeight; if(this.options.stickTo === 'top'){ topPoint -= mTop; bottomPoint -= (elemHeight + mTop); }else if(this.options.stickTo === 'bottom'){ topPoint -= (winHeight - (elemHeight + mBtm)); bottomPoint -= (winHeight - mBtm); }else{ //this would be the stickTo: both option... tricky } this.topPoint = topPoint; this.bottomPoint = bottomPoint; if(cb){ cb(); } }; Sticky.prototype.destroy = function(){ this._removeSticky(true); this.$element.removeClass(this.options.stickyClass + ' is-anchored is-at-top') .css({ height: '', top: '', bottom: '', 'max-width': '' }) .off('resizeme.zf.trigger'); this.$anchor.off('change.zf.sticky'); $(window).off(this.scrollListener); if(this.wasWrapped){ this.$element.unwrap(); }else{ this.$container.removeClass(this.options.containerClass) .css({ height: '' }); } Foundation.unregisterPlugin(this); }; function emCalc(em){ return parseInt(window.getComputedStyle(document.body, null).fontSize, 10) * em; } Foundation.plugin(Sticky, 'Sticky'); }(jQuery, window.Foundation); !function($, Foundation) { 'use strict'; function Tabs(element, options){ this.$element = element; this.options = $.extend({}, Tabs.defaults, this.$element.data(), options); this._init(); Foundation.registerPlugin(this, 'Tabs'); Foundation.Keyboard.register('Tabs', { 'ENTER': 'open', 'SPACE': 'open', 'ARROW_RIGHT': 'next', 'ARROW_UP': 'previous', 'ARROW_DOWN': 'next', 'ARROW_LEFT': 'previous' // 'TAB': 'next', // 'SHIFT_TAB': 'previous' }); } Tabs.defaults = { // // deepLinking: false, // // scrollToContent: false, autoFocus: false, wrapOnKeys: true, matchHeight: false, linkClass: 'tabs-title', // contentClass: 'tabs-content', panelClass: 'tabs-panel' }; Tabs.prototype._init = function(){ var _this = this; this.$tabTitles = this.$element.find('.' + this.options.linkClass); this.$tabContent = $('[data-tabs-content="' + this.$element[0].id + '"]'); this.$tabTitles.each(function(){ var $elem = $(this), $link = $elem.find('a'), isActive = $elem.hasClass('is-active'), hash = $link.attr('href').slice(1), linkId = hash + '-label', $tabContent = $(hash); $elem.attr({'role': 'presentation'}); $link.attr({ 'role': 'tab', 'aria-controls': hash, 'aria-selected': isActive, 'id': linkId }); $tabContent.attr({ 'role': 'tabpanel', 'aria-hidden': !isActive, 'aria-labelledby': linkId }); if(isActive && _this.options.autoFocus){ $link.focus(); } }); if(this.options.matchHeight){ var $images = this.$tabContent.find('img'); if($images.length){ Foundation.onImagesLoaded($images, this._setHeight.bind(this)); }else{ this._setHeight(); } } this._events(); }; Tabs.prototype._events = function(){ this._addKeyHandler(); this._addClickHandler(); if(this.options.matchHeight){ $(window).on('changed.zf.mediaquery', this._setHeight.bind(this)); } }; Tabs.prototype._addClickHandler = function(){ var _this = this; this.$element.off('click.zf.tabs') .on('click.zf.tabs', '.' + this.options.linkClass, function(e){ e.preventDefault(); e.stopPropagation(); if($(this).hasClass('is-active')){ return; } _this._handleTabChange($(this)); }); }; Tabs.prototype._addKeyHandler = function(){ var _this = this; var $firstTab = _this.$element.find('li:first-of-type'); var $lastTab = _this.$element.find('li:last-of-type'); this.$tabTitles.off('keydown.zf.tabs').on('keydown.zf.tabs', function(e){ if(e.which === 9) return; e.stopPropagation(); e.preventDefault(); var $element = $(this), $elements = $element.parent('ul').children('li'), $prevElement, $nextElement; $elements.each(function(i) { if ($(this).is($element)) { if (_this.options.wrapOnKeys) { $prevElement = i === 0 ? $elements.last() : $elements.eq(i-1); $nextElement = i === $elements.length -1 ? $elements.first() : $elements.eq(i+1); } else { $prevElement = $elements.eq(Math.max(0, i-1)); $nextElement = $elements.eq(Math.min(i+1, $elements.length-1)); } return; } }); // handle keyboard event with keyboard util Foundation.Keyboard.handleKey(e, 'Tabs', { open: function() { $element.find('[role="tab"]').focus(); _this._handleTabChange($element); }, previous: function() { $prevElement.find('[role="tab"]').focus(); _this._handleTabChange($prevElement); }, next: function() { $nextElement.find('[role="tab"]').focus(); _this._handleTabChange($nextElement); } }); }); }; Tabs.prototype._handleTabChange = function($target){ var $tabLink = $target.find('[role="tab"]'), hash = $tabLink.attr('href'), $targetContent = $(hash), $oldTab = this.$element.find('.' + this.options.linkClass + '.is-active') .removeClass('is-active').find('[role="tab"]') .attr({'aria-selected': 'false'}).attr('href'); $($oldTab).removeClass('is-active').attr({'aria-hidden': 'true'}); $target.addClass('is-active'); $tabLink.attr({'aria-selected': 'true'}); $targetContent .addClass('is-active') .attr({'aria-hidden': 'false'}); this.$element.trigger('change.zf.tabs', [$target]); // Foundation.reflow(this.$element, 'tabs'); }; Tabs.prototype.selectTab = function(elem){ var idStr; if(typeof elem === 'object'){ idStr = elem[0].id; }else{ idStr = elem; } if(idStr.indexOf('#') < 0){ idStr = '#' + idStr; } var $target = this.$tabTitles.find('[href="' + idStr + '"]').parent('.' + this.options.linkClass); this._handleTabChange($target); }; Tabs.prototype._setHeight = function(){ var max = 0; this.$tabContent.find('.' + this.options.panelClass) .css('height', '') .each(function(){ var panel = $(this), isActive = panel.hasClass('is-active'); if(!isActive){ panel.css({'visibility': 'hidden', 'display': 'block'}); } var temp = this.getBoundingClientRect().height; if(!isActive){ panel.css({'visibility': '', 'display': ''}); } max = temp > max ? temp : max; }) .css('height', max + 'px'); }; Tabs.prototype.destroy = function() { this.$element.find('.' + this.options.linkClass) .off('.zf.tabs').hide().end() .find('.' + this.options.panelClass) .hide(); if(this.options.matchHeight){ $(window).off('changed.zf.mediaquery'); } Foundation.unregisterPlugin(this); }; Foundation.plugin(Tabs, 'Tabs'); function checkClass($elem){ return $elem.hasClass('is-active'); } }(jQuery, window.Foundation); !function(Foundation, $) { 'use strict'; function Toggler(element, options) { this.$element = element; this.options = $.extend({}, Toggler.defaults, element.data(), options); this.className = ''; this._init(); this._events(); Foundation.registerPlugin(this, 'Toggler'); } Toggler.defaults = { animate: false }; Toggler.prototype._init = function() { var input; // Parse animation classes if they were set if (this.options.animate) { input = this.options.animate.split(' '); this.animationIn = input[0]; this.animationOut = input[1] || null; } // Otherwise, parse toggle class else { input = this.$element.data('toggler'); // Allow for a . at the beginning of the string this.className = input[0] === '.' ? input.slice(1) : input; } // Add ARIA attributes to triggers var id = this.$element[0].id; $('[data-open="'+id+'"], [data-close="'+id+'"], [data-toggle="'+id+'"]') .attr('aria-controls', id); // If the target is hidden, add aria-hidden this.$element.attr('aria-expanded', this.$element.is(':hidden') ? false : true); }; Toggler.prototype._events = function() { this.$element.off('toggle.zf.trigger').on('toggle.zf.trigger', this.toggle.bind(this)); }; Toggler.prototype.toggle = function() { this[ this.options.animate ? '_toggleAnimate' : '_toggleClass'](); }; Toggler.prototype._toggleClass = function() { this.$element.toggleClass(this.className); var isOn = this.$element.hasClass(this.className); if (isOn) { this.$element.trigger('on.zf.toggler'); } else { this.$element.trigger('off.zf.toggler'); } this._updateARIA(isOn); }; Toggler.prototype._toggleAnimate = function() { var _this = this; if (this.$element.is(':hidden')) { Foundation.Motion.animateIn(this.$element, this.animationIn, function() { this.trigger('on.zf.toggler'); _this._updateARIA(true); }); } else { Foundation.Motion.animateOut(this.$element, this.animationOut, function() { this.trigger('off.zf.toggler'); _this._updateARIA(false); }); } }; Toggler.prototype._updateARIA = function(isOn) { this.$element.attr('aria-expanded', isOn ? true : false); }; Toggler.prototype.destroy= function() { this.$element.off('.zf.toggler'); Foundation.unregisterPlugin(this); }; Foundation.plugin(Toggler, 'Toggler'); // Exports for AMD/Browserify if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') module.exports = Toggler; if (typeof define === 'function') define(['foundation'], function() { return Toggler; }); }(Foundation, jQuery); !function($, document, Foundation){ 'use strict'; function Tooltip(element, options){ this.$element = element; this.options = $.extend({}, Tooltip.defaults, this.$element.data(), options); this.isActive = false; this.isClick = false; this._init(); Foundation.registerPlugin(this, 'Tooltip'); } Tooltip.defaults = { disableForTouch: false, hoverDelay: 200, fadeInDuration: 150, fadeOutDuration: 150, disableHover: false, templateClasses: '', tooltipClass: 'tooltip', triggerClass: 'has-tip', showOn: 'small', template: '', tipText: '', touchCloseText: 'Tap to close.', clickOpen: true, positionClass: '', vOffset: 10, hOffset: 12 }; Tooltip.prototype._init = function(){ var elemId = this.$element.attr('aria-describedby') || Foundation.GetYoDigits(6, 'tooltip'); this.options.positionClass = this._getPositionClass(this.$element); this.options.tipText = this.options.tipText || this.$element.attr('title'); this.template = this.options.template ? $(this.options.template) : this._buildTemplate(elemId); this.template.appendTo(document.body) .text(this.options.tipText) .hide(); this.$element.attr({ 'title': '', 'aria-describedby': elemId, 'data-yeti-box': elemId, 'data-toggle': elemId, 'data-resize': elemId }).addClass(this.triggerClass); //helper variables to track movement on collisions this.usedPositions = []; this.counter = 4; this.classChanged = false; this._events(); }; Tooltip.prototype._getPositionClass = function(element){ if(!element){ return ''; } // var position = element.attr('class').match(/top|left|right/g); var position = element[0].className.match(/(top|left|right)/g); position = position ? position[0] : ''; return position; }; Tooltip.prototype._buildTemplate = function(id){ var templateClasses = (this.options.tooltipClass + ' ' + this.options.positionClass).trim(); var $template = $('
    ').addClass(templateClasses).attr({ 'role': 'tooltip', 'aria-hidden': true, 'data-is-active': false, 'data-is-focus': false, 'id': id }); return $template; }; Tooltip.prototype._reposition = function(position){ this.usedPositions.push(position ? position : 'bottom'); //default, try switching to opposite side if(!position && (this.usedPositions.indexOf('top') < 0)){ this.template.addClass('top'); }else if(position === 'top' && (this.usedPositions.indexOf('bottom') < 0)){ this.template.removeClass(position); }else if(position === 'left' && (this.usedPositions.indexOf('right') < 0)){ this.template.removeClass(position) .addClass('right'); }else if(position === 'right' && (this.usedPositions.indexOf('left') < 0)){ this.template.removeClass(position) .addClass('left'); } //if default change didn't work, try bottom or left first else if(!position && (this.usedPositions.indexOf('top') > -1) && (this.usedPositions.indexOf('left') < 0)){ this.template.addClass('left'); }else if(position === 'top' && (this.usedPositions.indexOf('bottom') > -1) && (this.usedPositions.indexOf('left') < 0)){ this.template.removeClass(position) .addClass('left'); }else if(position === 'left' && (this.usedPositions.indexOf('right') > -1) && (this.usedPositions.indexOf('bottom') < 0)){ this.template.removeClass(position); }else if(position === 'right' && (this.usedPositions.indexOf('left') > -1) && (this.usedPositions.indexOf('bottom') < 0)){ this.template.removeClass(position); } //if nothing cleared, set to bottom else{ this.template.removeClass(position); } this.classChanged = true; this.counter--; }; Tooltip.prototype._setPosition = function(){ var position = this._getPositionClass(this.template), $tipDims = Foundation.Box.GetDimensions(this.template), $anchorDims = Foundation.Box.GetDimensions(this.$element), direction = (position === 'left' ? 'left' : ((position === 'right') ? 'left' : 'top')), param = (direction === 'top') ? 'height' : 'width', offset = (param === 'height') ? this.options.vOffset : this.options.hOffset, _this = this; if(($tipDims.width >= $tipDims.windowDims.width) || (!this.counter && !Foundation.Box.ImNotTouchingYou(this.template))){ this.template.offset(Foundation.Box.GetOffsets(this.template, this.$element, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({ // this.$element.offset(Foundation.GetOffsets(this.template, this.$element, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({ 'width': $anchorDims.windowDims.width - (this.options.hOffset * 2), 'height': 'auto' }); return false; } this.template.offset(Foundation.Box.GetOffsets(this.template, this.$element,'center ' + (position || 'bottom'), this.options.vOffset, this.options.hOffset)); while(!Foundation.Box.ImNotTouchingYou(this.template) && this.counter){ this._reposition(position); this._setPosition(); } }; Tooltip.prototype.show = function(){ if(this.options.showOn !== 'all' && !Foundation.MediaQuery.atLeast(this.options.showOn)){ // console.error('The screen is too small to display this tooltip'); return false; } var _this = this; this.template.css('visibility', 'hidden').show(); this._setPosition(); this.$element.trigger('closeme.zf.tooltip', this.template.attr('id')); this.template.attr({ 'data-is-active': true, 'aria-hidden': false }); _this.isActive = true; // console.log(this.template); this.template.stop().hide().css('visibility', '').fadeIn(this.options.fadeInDuration, function(){ //maybe do stuff? }); this.$element.trigger('show.zf.tooltip'); }; Tooltip.prototype.hide = function(){ // console.log('hiding', this.$element.data('yeti-box')); var _this = this; this.template.stop().attr({ 'aria-hidden': true, 'data-is-active': false }).fadeOut(this.options.fadeOutDuration, function(){ _this.isActive = false; _this.isClick = false; if(_this.classChanged){ _this.template .removeClass(_this._getPositionClass(_this.template)) .addClass(_this.options.positionClass); _this.usedPositions = []; _this.counter = 4; _this.classChanged = false; } }); this.$element.trigger('hide.zf.tooltip'); }; Tooltip.prototype._events = function(){ var _this = this; var $template = this.template; var isFocus = false; if(!this.options.disableHover){ this.$element .on('mouseenter.zf.tooltip', function(e){ if(!_this.isActive){ _this.timeout = setTimeout(function(){ _this.show(); }, _this.options.hoverDelay); } }) .on('mouseleave.zf.tooltip', function(e){ clearTimeout(_this.timeout); if(!isFocus || (!_this.isClick && _this.options.clickOpen)){ _this.hide(); } }); } if(this.options.clickOpen){ this.$element.on('mousedown.zf.tooltip', function(e){ e.stopImmediatePropagation(); if(_this.isClick){ _this.hide(); // _this.isClick = false; }else{ _this.isClick = true; if((_this.options.disableHover || !_this.$element.attr('tabindex')) && !_this.isActive){ _this.show(); } } }); } if(!this.options.disableForTouch){ this.$element .on('tap.zf.tooltip touchend.zf.tooltip', function(e){ _this.isActive ? _this.hide() : _this.show(); }); } this.$element.on({ // 'toggle.zf.trigger': this.toggle.bind(this), // 'close.zf.trigger': this.hide.bind(this) 'close.zf.trigger': this.hide.bind(this) }); this.$element .on('focus.zf.tooltip', function(e){ isFocus = true; // console.log(_this.isClick); if(_this.isClick){ return false; }else{ // $(window) _this.show(); } }) .on('focusout.zf.tooltip', function(e){ isFocus = false; _this.isClick = false; _this.hide(); }) .on('resizeme.zf.trigger', function(){ if(_this.isActive){ _this._setPosition(); } }); }; Tooltip.prototype.toggle = function(){ if(this.isActive){ this.hide(); }else{ this.show(); } }; Tooltip.prototype.destroy = function(){ this.$element.attr('title', this.template.text()) .off('.zf.trigger .zf.tootip') // .removeClass('has-tip') .removeAttr('aria-describedby') .removeAttr('data-yeti-box') .removeAttr('data-toggle') .removeAttr('data-resize'); this.template.remove(); Foundation.unregisterPlugin(this); }; Foundation.plugin(Tooltip, 'Tooltip'); }(jQuery, window.document, window.Foundation);