UNPKG

zurb-foundation-5-prebuilt

Version:

Get started quickly with the most advanced responsive front-end framework in the world.

1,515 lines (1,264 loc) 217 kB
/* * Foundation Responsive Library * http://foundation.zurb.com * Copyright 2015, ZURB * Free to use under the MIT license. * http://www.opensource.org/licenses/mit-license.php */ (function ($, window, document, undefined) { 'use strict'; var header_helpers = function (class_array) { var head = $('head'); head.prepend($.map(class_array, function (class_name) { if (head.has('.' + class_name).length === 0) { return '<meta class="' + class_name + '" />'; } })); }; header_helpers([ 'foundation-mq-small', 'foundation-mq-small-only', 'foundation-mq-medium', 'foundation-mq-medium-only', 'foundation-mq-large', 'foundation-mq-large-only', 'foundation-mq-xlarge', 'foundation-mq-xlarge-only', 'foundation-mq-xxlarge', 'foundation-data-attribute-namespace']); // Enable FastClick if present $(function () { if (typeof FastClick !== 'undefined') { // Don't attach to body if undefined if (typeof document.body !== 'undefined') { FastClick.attach(document.body); } } }); // private Fast Selector wrapper, // returns jQuery object. Only use where // getElementById is not available. var S = function (selector, context) { if (typeof selector === 'string') { if (context) { var cont; if (context.jquery) { cont = context[0]; if (!cont) { return context; } } else { cont = context; } return $(cont.querySelectorAll(selector)); } return $(document.querySelectorAll(selector)); } return $(selector, context); }; // Namespace functions. var attr_name = function (init) { var arr = []; if (!init) { arr.push('data'); } if (this.namespace.length > 0) { arr.push(this.namespace); } arr.push(this.name); return arr.join('-'); }; var add_namespace = function (str) { var parts = str.split('-'), i = parts.length, arr = []; while (i--) { if (i !== 0) { arr.push(parts[i]); } else { if (this.namespace.length > 0) { arr.push(this.namespace, parts[i]); } else { arr.push(parts[i]); } } } return arr.reverse().join('-'); }; // Event binding and data-options updating. var bindings = function (method, options) { var self = this, bind = function(){ var $this = S(this), should_bind_events = !$this.data(self.attr_name(true) + '-init'); $this.data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options($this))); if (should_bind_events) { self.events(this); } }; if (S(this.scope).is('[' + this.attr_name() +']')) { bind.call(this.scope); } else { S('[' + this.attr_name() +']', this.scope).each(bind); } // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating. if (typeof method === 'string') { return this[method].call(this, options); } }; var single_image_loaded = function (image, callback) { function loaded () { callback(image[0]); } function bindLoad () { this.one('load', loaded); if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { var src = this.attr( 'src' ), param = src.match( /\?/ ) ? '&' : '?'; param += 'random=' + (new Date()).getTime(); this.attr('src', src + param); } } if (!image.attr('src')) { loaded(); return; } if (image[0].complete || image[0].readyState === 4) { loaded(); } else { bindLoad.call(image); } }; /*! 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' }; }; }()); /* * jquery.requestAnimationFrame * https://github.com/gnarf37/jquery-requestAnimationFrame * Requires jQuery 1.8+ * * Copyright (c) 2012 Corey Frang * Licensed under the MIT license. */ (function(jQuery) { // requestAnimationFrame polyfill adapted from Erik Möller // fixes from Paul Irish and Tino Zijdel // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating var animating, lastTime = 0, vendors = ['webkit', 'moz'], requestAnimationFrame = window.requestAnimationFrame, cancelAnimationFrame = window.cancelAnimationFrame, jqueryFxAvailable = 'undefined' !== typeof jQuery.fx; for (; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ]; cancelAnimationFrame = cancelAnimationFrame || window[ vendors[lastTime] + 'CancelAnimationFrame' ] || window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ]; } function raf() { if (animating) { requestAnimationFrame(raf); if (jqueryFxAvailable) { jQuery.fx.tick(); } } } if (requestAnimationFrame) { // use rAF window.requestAnimationFrame = requestAnimationFrame; window.cancelAnimationFrame = cancelAnimationFrame; if (jqueryFxAvailable) { jQuery.fx.timer = function (timer) { if (timer() && jQuery.timers.push(timer) && !animating) { animating = true; raf(); } }; jQuery.fx.stop = function () { animating = false; }; } } else { // polyfill window.requestAnimationFrame = function (callback) { var currTime = new Date().getTime(), timeToCall = Math.max(0, 16 - (currTime - lastTime)), id = window.setTimeout(function () { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; window.cancelAnimationFrame = function (id) { clearTimeout(id); }; } }( $ )); function removeQuotes (string) { if (typeof string === 'string' || string instanceof String) { string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, ''); } return string; } function MediaQuery(selector) { this.selector = selector; this.query = ''; } MediaQuery.prototype.toString = function () { return this.query || (this.query = S(this.selector).css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '')); }; window.Foundation = { name : 'Foundation', version : '5.5.3', media_queries : { 'small' : new MediaQuery('.foundation-mq-small'), 'small-only' : new MediaQuery('.foundation-mq-small-only'), 'medium' : new MediaQuery('.foundation-mq-medium'), 'medium-only' : new MediaQuery('.foundation-mq-medium-only'), 'large' : new MediaQuery('.foundation-mq-large'), 'large-only' : new MediaQuery('.foundation-mq-large-only'), 'xlarge' : new MediaQuery('.foundation-mq-xlarge'), 'xlarge-only' : new MediaQuery('.foundation-mq-xlarge-only'), 'xxlarge' : new MediaQuery('.foundation-mq-xxlarge') }, stylesheet : $('<style></style>').appendTo('head')[0].sheet, global : { namespace : undefined }, init : function (scope, libraries, method, options, response) { var args = [scope, method, options, response], responses = []; // check RTL this.rtl = /rtl/i.test(S('html').attr('dir')); // set foundation global scope this.scope = scope || this.scope; this.set_namespace(); if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { if (this.libs.hasOwnProperty(libraries)) { responses.push(this.init_lib(libraries, args)); } } else { for (var lib in this.libs) { responses.push(this.init_lib(lib, libraries)); } } S(window).load(function () { S(window) .trigger('resize.fndtn.clearing') .trigger('resize.fndtn.dropdown') .trigger('resize.fndtn.equalizer') .trigger('resize.fndtn.interchange') .trigger('resize.fndtn.joyride') .trigger('resize.fndtn.magellan') .trigger('resize.fndtn.topbar') .trigger('resize.fndtn.slider'); }); return scope; }, init_lib : function (lib, args) { if (this.libs.hasOwnProperty(lib)) { this.patch(this.libs[lib]); if (args && args.hasOwnProperty(lib)) { if (typeof this.libs[lib].settings !== 'undefined') { $.extend(true, this.libs[lib].settings, args[lib]); } else if (typeof this.libs[lib].defaults !== 'undefined') { $.extend(true, this.libs[lib].defaults, args[lib]); } return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); } args = args instanceof Array ? args : new Array(args); return this.libs[lib].init.apply(this.libs[lib], args); } return function () {}; }, patch : function (lib) { lib.scope = this.scope; lib.namespace = this.global.namespace; lib.rtl = this.rtl; lib['data_options'] = this.utils.data_options; lib['attr_name'] = attr_name; lib['add_namespace'] = add_namespace; lib['bindings'] = bindings; lib['S'] = this.utils.S; }, inherit : function (scope, methods) { var methods_arr = methods.split(' '), i = methods_arr.length; while (i--) { if (this.utils.hasOwnProperty(methods_arr[i])) { scope[methods_arr[i]] = this.utils[methods_arr[i]]; } } }, set_namespace : function () { // Description: // Don't bother reading the namespace out of the meta tag // if the namespace has been set globally in javascript // // Example: // Foundation.global.namespace = 'my-namespace'; // or make it an empty string: // Foundation.global.namespace = ''; // // // If the namespace has not been set (is undefined), try to read it out of the meta element. // Otherwise use the globally defined namespace, even if it's empty ('') var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace; // Finally, if the namsepace is either undefined or false, set it to an empty string. // Otherwise use the namespace value. this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace; }, libs : {}, // methods that can be inherited in libraries utils : { // Description: // Fast Selector wrapper returns jQuery object. Only use where getElementById // is not available. // // Arguments: // Selector (String): CSS selector describing the element(s) to be // returned as a jQuery object. // // Scope (String): CSS selector describing the area to be searched. Default // is document. // // Returns: // Element (jQuery Object): jQuery object containing elements matching the // selector within the scope. S : S, // Description: // Executes a function a max of once every n milliseconds // // Arguments: // Func (Function): Function to be throttled. // // Delay (Integer): Function execution threshold in milliseconds. // // Returns: // Lazy_function (Function): Function with throttling applied. throttle : function (func, delay) { var timer = null; return function () { var context = this, args = arguments; if (timer == null) { timer = setTimeout(function () { func.apply(context, args); timer = null; }, delay); } }; }, // Description: // Executes a function when it stops being invoked for n seconds // Modified version of _.debounce() http://underscorejs.org // // Arguments: // Func (Function): Function to be debounced. // // Delay (Integer): Function execution threshold in milliseconds. // // Immediate (Bool): Whether the function should be called at the beginning // of the delay instead of the end. Default is false. // // Returns: // Lazy_function (Function): Function with debouncing applied. debounce : function (func, delay, immediate) { var timeout, result; return function () { var context = this, args = arguments; var later = function () { timeout = null; if (!immediate) { result = func.apply(context, args); } }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, delay); if (callNow) { result = func.apply(context, args); } return result; }; }, // Description: // Parses data-options attribute // // Arguments: // El (jQuery Object): Element to be parsed. // // Returns: // Options (Javascript Object): Contents of the element's data-options // attribute. data_options : function (el, data_attr_name) { data_attr_name = data_attr_name || 'options'; var opts = {}, ii, p, opts_arr, data_options = function (el) { var namespace = Foundation.global.namespace; if (namespace.length > 0) { return el.data(namespace + '-' + data_attr_name); } return el.data(data_attr_name); }; var cached_options = data_options(el); if (typeof cached_options === 'object') { return cached_options; } opts_arr = (cached_options || ':').split(';'); ii = opts_arr.length; function isNumber (o) { return !isNaN (o - 0) && o !== null && o !== '' && o !== false && o !== true; } function trim (str) { if (typeof str === 'string') { return $.trim(str); } return str; } while (ii--) { p = opts_arr[ii].split(':'); p = [p[0], p.slice(1).join(':')]; if (/true/i.test(p[1])) { p[1] = true; } if (/false/i.test(p[1])) { p[1] = false; } if (isNumber(p[1])) { if (p[1].indexOf('.') === -1) { p[1] = parseInt(p[1], 10); } else { p[1] = parseFloat(p[1]); } } if (p.length === 2 && p[0].length > 0) { opts[trim(p[0])] = trim(p[1]); } } return opts; }, // Description: // Adds JS-recognizable media queries // // Arguments: // Media (String): Key string for the media query to be stored as in // Foundation.media_queries // // Class (String): Class name for the generated <meta> tag register_media : function (media, media_class) { if (Foundation.media_queries[media] === undefined) { $('head').append('<meta class="' + media_class + '"/>'); Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); } }, // Description: // Add custom CSS within a JS-defined media query // // Arguments: // Rule (String): CSS rule to be appended to the document. // // Media (String): Optional media query string for the CSS rule to be // nested under. add_custom_rule : function (rule, media) { if (media === undefined && Foundation.stylesheet) { Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); } else { var query = Foundation.media_queries[media]; if (query !== undefined) { Foundation.stylesheet.insertRule('@media ' + Foundation.media_queries[media] + '{ ' + rule + ' }', Foundation.stylesheet.cssRules.length); } } }, // Description: // Performs a callback function when an image is fully loaded // // Arguments: // Image (jQuery Object): Image(s) to check if loaded. // // Callback (Function): Function to execute when image is fully loaded. image_loaded : function (images, callback) { var self = this, unloaded = images.length; function pictures_has_height(images) { var pictures_number = images.length; for (var i = pictures_number - 1; i >= 0; i--) { if(images.attr('height') === undefined) { return false; }; }; return true; } if (unloaded === 0 || pictures_has_height(images)) { callback(images); } images.each(function () { single_image_loaded(self.S(this), function () { unloaded -= 1; if (unloaded === 0) { callback(images); } }); }); }, // Description: // Returns a random, alphanumeric string // // Arguments: // Length (Integer): Length of string to be generated. Defaults to random // integer. // // Returns: // Rand (String): Pseudo-random, alphanumeric string. random_str : function () { if (!this.fidx) { this.fidx = 0; } this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-'); return this.prefix + (this.fidx++).toString(36); }, // Description: // Helper for window.matchMedia // // Arguments: // mq (String): Media query // // Returns: // (Boolean): Whether the media query passes or not match : function (mq) { return window.matchMedia(mq).matches; }, // Description: // Helpers for checking Foundation default media queries with JS // // Returns: // (Boolean): Whether the media query passes or not is_small_up : function () { return this.match(Foundation.media_queries.small); }, is_medium_up : function () { return this.match(Foundation.media_queries.medium); }, is_large_up : function () { return this.match(Foundation.media_queries.large); }, is_xlarge_up : function () { return this.match(Foundation.media_queries.xlarge); }, is_xxlarge_up : function () { return this.match(Foundation.media_queries.xxlarge); }, is_small_only : function () { return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); }, is_medium_only : function () { return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); }, is_large_only : function () { return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); }, is_xlarge_only : function () { return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up(); }, is_xxlarge_only : function () { return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up(); } } }; $.fn.foundation = function () { var args = Array.prototype.slice.call(arguments, 0); return this.each(function () { Foundation.init.apply(Foundation, [this].concat(args)); return this; }); }; }(jQuery, window, window.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.abide = { name : 'abide', version : '5.5.3', settings : { live_validate : true, // validate the form as you go validate_on_blur : true, // validate whenever you focus/blur on an input field // validate_on: 'tab', // tab (when user tabs between fields), change (input changes), manual (call custom events) focus_on_invalid : true, // automatically bring the focus to an invalid input field error_labels : true, // labels with a for="inputId" will receive an `error` class error_class : 'error', // labels with a for="inputId" will receive an `error` class // the amount of time Abide will take before it validates the form (in ms). // smaller time will result in faster validation timeout : 1000, 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])?)+$/, // http://blogs.lse.ac.uk/lti/2008/04/23/a-regular-expression-to-match-any-url/ url: /^(https?|ftp|file|ssh):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+~%\/\.\w]+)?\??([-\+=&;%@\.\w]+)?#?([\w]+)?)?/, // 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) { var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value, to = el.value, valid = (from === to); return valid; } } }, timer : null, init : function (scope, method, options) { this.bindings(method, options); }, events : function (scope) { var self = this, form = self.S(scope).attr('novalidate', 'novalidate'), settings = form.data(this.attr_name(true) + '-init') || {}; this.invalid_attr = this.add_namespace('data-invalid'); function validate(originalSelf, e) { clearTimeout(self.timer); self.timer = setTimeout(function () { self.validate([originalSelf], e); }.bind(originalSelf), settings.timeout); } form .off('.abide') .on('submit.fndtn.abide', function (e) { var is_ajax = /ajax/i.test(self.S(this).attr(self.attr_name())); return self.validate(self.S(this).find('input, textarea, select').not(":hidden, [data-abide-ignore]").get(), e, is_ajax); }) .on('validate.fndtn.abide', function (e) { if (settings.validate_on === 'manual') { self.validate([e.target], e); } }) .on('reset', function (e) { return self.reset($(this), e); }) .find('input, textarea, select').not(":hidden, [data-abide-ignore]") .off('.abide') .on('blur.fndtn.abide change.fndtn.abide', function (e) { var id = this.getAttribute('id'), eqTo = form.find('[data-equalto="'+ id +'"]'); // old settings fallback // will be deprecated with F6 release if (settings.validate_on_blur && settings.validate_on_blur === true) { validate(this, e); } // checks if there is an equalTo equivalent related by id if(typeof eqTo.get(0) !== "undefined" && eqTo.val().length){ validate(eqTo.get(0),e); } // new settings combining validate options into one setting if (settings.validate_on === 'change') { validate(this, e); } }) .on('keydown.fndtn.abide', function (e) { var id = this.getAttribute('id'), eqTo = form.find('[data-equalto="'+ id +'"]'); // old settings fallback // will be deprecated with F6 release if (settings.live_validate && settings.live_validate === true && e.which != 9) { validate(this, e); } // checks if there is an equalTo equivalent related by id if(typeof eqTo.get(0) !== "undefined" && eqTo.val().length){ validate(eqTo.get(0),e); } // new settings combining validate options into one setting if (settings.validate_on === 'tab' && e.which === 9) { validate(this, e); } else if (settings.validate_on === 'change') { validate(this, e); } }) .on('focus', function (e) { if (navigator.userAgent.match(/iPad|iPhone|Android|BlackBerry|Windows Phone|webOS/i)) { $('html, body').animate({ scrollTop: $(e.target).offset().top }, 100); } }); }, reset : function (form, e) { var self = this; form.removeAttr(self.invalid_attr); $('[' + self.invalid_attr + ']', form).removeAttr(self.invalid_attr); $('.' + self.settings.error_class, form).not('small').removeClass(self.settings.error_class); $(':input', form).not(':button, :submit, :reset, :hidden, [data-abide-ignore]').val('').removeAttr(self.invalid_attr); }, validate : function (els, e, is_ajax) { var validations = this.parse_patterns(els), validation_count = validations.length, form = this.S(els[0]).closest('form'), submit_event = /submit/.test(e.type); // Has to count up to make sure the focus gets applied to the top error for (var i = 0; i < validation_count; i++) { if (!validations[i] && (submit_event || is_ajax)) { if (this.settings.focus_on_invalid) { els[i].focus(); } form.trigger('invalid.fndtn.abide'); this.S(els[i]).closest('form').attr(this.invalid_attr, ''); return false; } } if (submit_event || is_ajax) { form.trigger('valid.fndtn.abide'); } form.removeAttr(this.invalid_attr); if (is_ajax) { return false; } return true; }, parse_patterns : function (els) { var i = els.length, el_patterns = []; while (i--) { el_patterns.push(this.pattern(els[i])); } return this.check_validation_and_apply_styles(el_patterns); }, pattern : function (el) { var type = el.getAttribute('type'), required = typeof el.getAttribute('required') === 'string'; var pattern = el.getAttribute('pattern') || ''; if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) { return [el, this.settings.patterns[pattern], required]; } else if (pattern.length > 0) { return [el, new RegExp(pattern), required]; } if (this.settings.patterns.hasOwnProperty(type)) { return [el, this.settings.patterns[type], required]; } pattern = /.*/; return [el, pattern, required]; }, // TODO: Break this up into smaller methods, getting hard to read. check_validation_and_apply_styles : function (el_patterns) { var i = el_patterns.length, validations = []; if (i == 0) { return validations; } var form = this.S(el_patterns[0][0]).closest('[data-' + this.attr_name(true) + ']'), settings = form.data(this.attr_name(true) + '-init') || {}; while (i--) { var el = el_patterns[i][0], required = el_patterns[i][2], value = el.value.trim(), direct_parent = this.S(el).parent(), validator = el.getAttribute(this.add_namespace('data-abide-validator')), is_radio = el.type === 'radio', is_checkbox = el.type === 'checkbox', label = this.S('label[for="' + el.getAttribute('id') + '"]'), valid_length = (required) ? (el.value.length > 0) : true, el_validations = []; var parent, valid; // support old way to do equalTo validations if (el.getAttribute(this.add_namespace('data-equalto'))) { validator = 'equalTo' } if (!direct_parent.is('label')) { parent = direct_parent; } else { parent = direct_parent.parent(); } if (is_radio && required) { el_validations.push(this.valid_radio(el, required)); } else if (is_checkbox && required) { el_validations.push(this.valid_checkbox(el, required)); } else if (validator) { // Validate using each of the specified (space-delimited) validators. var validators = validator.split(' '); var last_valid = true, all_valid = true; for (var iv = 0; iv < validators.length; iv++) { valid = this.settings.validators[validators[iv]].apply(this, [el, required, parent]) el_validations.push(valid); all_valid = valid && last_valid; last_valid = valid; } if (all_valid) { this.S(el).removeAttr(this.invalid_attr); parent.removeClass('error'); if (label.length > 0 && this.settings.error_labels) { label.removeClass(this.settings.error_class).removeAttr('role'); } $(el).triggerHandler('valid'); } else { this.S(el).attr(this.invalid_attr, ''); parent.addClass('error'); if (label.length > 0 && this.settings.error_labels) { label.addClass(this.settings.error_class).attr('role', 'alert'); } $(el).triggerHandler('invalid'); } } else { if (el_patterns[i][1].test(value) && valid_length || !required && el.value.length < 1 || $(el).attr('disabled')) { el_validations.push(true); } else { el_validations.push(false); } el_validations = [el_validations.every(function (valid) {return valid;})]; if (el_validations[0]) { this.S(el).removeAttr(this.invalid_attr); el.setAttribute('aria-invalid', 'false'); el.removeAttribute('aria-describedby'); parent.removeClass(this.settings.error_class); if (label.length > 0 && this.settings.error_labels) { label.removeClass(this.settings.error_class).removeAttr('role'); } $(el).triggerHandler('valid'); } else { this.S(el).attr(this.invalid_attr, ''); el.setAttribute('aria-invalid', 'true'); // Try to find the error associated with the input var errorElem = parent.find('small.' + this.settings.error_class, 'span.' + this.settings.error_class); var errorID = errorElem.length > 0 ? errorElem[0].id : ''; if (errorID.length > 0) { el.setAttribute('aria-describedby', errorID); } // el.setAttribute('aria-describedby', $(el).find('.error')[0].id); parent.addClass(this.settings.error_class); if (label.length > 0 && this.settings.error_labels) { label.addClass(this.settings.error_class).attr('role', 'alert'); } $(el).triggerHandler('invalid'); } } validations = validations.concat(el_validations); } return validations; }, valid_checkbox : function (el, required) { var el = this.S(el), valid = (el.is(':checked') || !required || el.get(0).getAttribute('disabled')); if (valid) { el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); $(el).triggerHandler('valid'); } else { el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); $(el).triggerHandler('invalid'); } return valid; }, valid_radio : function (el, required) { var name = el.getAttribute('name'), group = this.S(el).closest('[data-' + this.attr_name(true) + ']').find("[name='" + name + "']"), count = group.length, valid = false, disabled = false; // Has to count up to make sure the focus gets applied to the top error for (var i=0; i < count; i++) { if( group[i].getAttribute('disabled') ){ disabled=true; valid=true; } else { if (group[i].checked){ valid = true; } else { if( disabled ){ valid = false; } } } } // Has to count up to make sure the focus gets applied to the top error for (var i = 0; i < count; i++) { if (valid) { this.S(group[i]).removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); $(group[i]).triggerHandler('valid'); } else { this.S(group[i]).attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); $(group[i]).triggerHandler('invalid'); } } return valid; }, valid_equal : function (el, required, parent) { var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value, to = el.value, valid = (from === to); if (valid) { this.S(el).removeAttr(this.invalid_attr); parent.removeClass(this.settings.error_class); if (label.length > 0 && settings.error_labels) { label.removeClass(this.settings.error_class); } } else { this.S(el).attr(this.invalid_attr, ''); parent.addClass(this.settings.error_class); if (label.length > 0 && settings.error_labels) { label.addClass(this.settings.error_class); } } return valid; }, valid_oneof : function (el, required, parent, doNotValidateOthers) { var el = this.S(el), others = this.S('[' + this.add_namespace('data-oneof') + ']'), valid = others.filter(':checked').length > 0; if (valid) { el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); } else { el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); } if (!doNotValidateOthers) { var _this = this; others.each(function () { _this.valid_oneof.call(_this, this, null, null, true); }); } return valid; }, reflow : function(scope, options) { var self = this, form = self.S('[' + this.attr_name() + ']').attr('novalidate', 'novalidate'); self.S(form).each(function (idx, el) { self.events(el); }); } }; }(jQuery, window, window.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.accordion = { name : 'accordion', version : '5.5.3', settings : { content_class : 'content', active_class : 'active', multi_expand : false, toggleable : true, callback : function () {} }, init : function (scope, method, options) { this.bindings(method, options); }, events : function (instance) { var self = this; var S = this.S; self.create(this.S(instance)); S(this.scope) .off('.fndtn.accordion') .on('click.fndtn.accordion', '[' + this.attr_name() + '] > dd > a, [' + this.attr_name() + '] > li > a', function (e) { var accordion = S(this).closest('[' + self.attr_name() + ']'), groupSelector = self.attr_name() + '=' + accordion.attr(self.attr_name()), settings = accordion.data(self.attr_name(true) + '-init') || self.settings, target = S('#' + this.href.split('#')[1]), aunts = $('> dd, > li', accordion), siblings = aunts.children('.' + settings.content_class), active_content = siblings.filter('.' + settings.active_class); e.preventDefault(); if (accordion.attr(self.attr_name())) { siblings = siblings.add('[' + groupSelector + '] dd > ' + '.' + settings.content_class + ', [' + groupSelector + '] li > ' + '.' + settings.content_class); aunts = aunts.add('[' + groupSelector + '] dd, [' + groupSelector + '] li'); } if (settings.toggleable && target.is(active_content)) { target.parent('dd, li').toggleClass(settings.active_class, false); target.toggleClass(settings.active_class, false); S(this).attr('aria-expanded', function(i, attr){ return attr === 'true' ? 'false' : 'true'; }); settings.callback(target); target.triggerHandler('toggled', [accordion]); accordion.triggerHandler('toggled', [target]); return; } if (!settings.multi_expand) { siblings.removeClass(settings.active_class); aunts.removeClass(settings.active_class); aunts.children('a').attr('aria-expanded','false'); } target.addClass(settings.active_class).parent().addClass(settings.active_class); settings.callback(target); target.triggerHandler('toggled', [accordion]); accordion.triggerHandler('toggled', [target]); S(this).attr('aria-expanded','true'); }); }, create: function($instance) { var self = this, accordion = $instance, aunts = $('> .accordion-navigation', accordion), settings = accordion.data(self.attr_name(true) + '-init') || self.settings; aunts.children('a').attr('aria-expanded','false'); aunts.has('.' + settings.content_class + '.' + settings.active_class).addClass(settings.active_class).children('a').attr('aria-expanded','true'); if (settings.multi_expand) { $instance.attr('aria-multiselectable','true'); } }, toggle : function(options) { var options = typeof options !== 'undefined' ? options : {}; var selector = typeof options.selector !== 'undefined' ? options.selector : ''; var toggle_state = typeof options.toggle_state !== 'undefined' ? options.toggle_state : ''; var $accordion = typeof options.$accordion !== 'undefined' ? options.$accordion : this.S(this.scope).closest('[' + this.attr_name() + ']'); var $items = $accordion.find('> dd' + selector + ', > li' + selector); if ( $items.length < 1 ) { if ( window.console ) { console.error('Selection not found.', selector); } return false; } var S = this.S; var active_class = this.settings.active_class; $items.each(function() { var $item = S(this); var is_active = $item.hasClass(active_class); if ( ( is_active && toggle_state === 'close' ) || ( !is_active && toggle_state === 'open' ) || toggle_state === '' ) { $item.find('> a').trigger('click.fndtn.accordion'); } }); }, open : function(options) { var options = typeof options !== 'undefined' ? options : {}; options.toggle_state = 'open'; this.toggle(options); }, close : function(options) { var options = typeof options !== 'undefined' ? options : {}; options.toggle_state = 'close'; this.toggle(options); }, off : function () {}, reflow : function () {} }; }(jQuery, window, window.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.alert = { name : 'alert', version : '5.5.3', settings : { callback : function () {} }, init : function (scope, method, options) { this.bindings(method, options); }, events : function () { var self = this, S = this.S; $(this.scope).off('.alert').on('click.fndtn.alert', '[' + this.attr_name() + '] .close', function (e) { var alertBox = S(this).closest('[' + self.attr_name() + ']'), settings = alertBox.data(self.attr_name(true) + '-init') || self.settings; e.preventDefault(); if (Modernizr.csstransitions) { alertBox.addClass('alert-close'); alertBox.on('transitionend webkitTransitionEnd oTransitionEnd', function (e) { S(this).trigger('close.fndtn.alert').remove(); settings.callback(); }); } else { alertBox.fadeOut(300, function () { S(this).trigger('close.fndtn.alert').remove(); settings.callback(); }); } }); }, reflow : function () {} }; }(jQuery, window, window.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.clearing = { name : 'clearing', version : '5.5.3', settings : { templates : { viewing : '<a href="#" class="clearing-close">&times;</a>' + '<div class="visible-img" style="display: none"><div class="clearing-touch-label"></div><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" alt="" />' + '<p class="clearing-caption"></p><a href="#" class="clearing-main-prev"><span></span></a>' + '<a href="#" class="clearing-main-next"><span></span></a></div>' + '<img class="clearing-preload-next" style="display: none" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" alt="" />' + '<img class="clearing-preload-prev" style="display: none" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" alt="" />' }, // comma delimited list of selectors that, on click, will close clearing, // add 'div.clearing-blackout, div.visible-img' to close on background click close_selectors : '.clearing-close, div.clearing-blackout', // Default to the entire li element. open_selectors : '', // Image will be skipped in carousel. skip_selector : '', touch_label : '', // event initializer and locks init : false, locked : false }, init : function (scope, method, options) { var self = this; Foundation.inherit(this, 'throttle image_loaded'); this.bindings(method, options); if (self.S(this.scope).is('[' + this.attr_name() + ']')) { this.assemble(self.S('li', this.scope)); } else { self.S('[' + this.attr_name() + ']', this.scope).each(function () { self.assemble(self.S('li', this)); }); } }, events : function (scope) { var self = this, S = self.S, $scroll_container = $('.scroll-container'); if ($scroll_container.length > 0) { this.scope = $scroll_container; } S(this.scope) .off('.clearing') .on('click.fndtn.clearing', 'ul[' + this.attr_name() + '] li ' + this.settings.open_selectors, function (e, current, target) { var current = current || S(this), target = target || current, next = current.next('li'), settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'), image = S(e.target); e.preventDefault(); if (!settings) { self.init(); settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'); } // if clearing is open and the current image is // clicked, go to the next image in sequence if (target.hasClass('visible') && current[0] === target[0] && next.length > 0 && self.is_open(current)) { target = next; image = S('img', target); } // set current and target to the clicked li if not otherwise defined. self.open(image, current, target); self.update_paddles(target); }) .on('click.fndtn.clearing', '.clearing-main-next', function (e) { self.nav(e, 'next') }) .on('click.fndtn.clearing', '.clearing-main-prev', function (e) { self.nav(e, 'prev') }) .on('click.fndtn.clearing', this.settings.close_selectors, function (e) { Foundation.libs.clearing.close(e, this) }); $(document).on('keydown.fndtn.clearing', function (e) { self.keydown(e) }); S(window).off('.clearing').on('resize.fndtn.clearing', function () { self.resize() }); this.swipe_events(scope); }, swipe_events : function (scope) { var self = this, S = self.S; S(this.scope) .on('touchstart.fndtn.clearing', '.visible-img', function (e) { if (!e.touches) { e = e.originalEvent; } var data = { start_page_x : e.touches[0].pageX, start_page_y : e.touches[0].pageY, start_time : (new Date()).getTime(), delta_x : 0, is_scrolling : undefined }; S(this).data('swipe-transition', data); e.stopPropagation(); }) .on('touchmove.fndtn.clearing', '.visible-img', function (e) { if (!e.touches) { e = e.originalEvent; } // Ignore pinch/zoom events if (e.touches.length > 1 || e.scale && e.scale !== 1) { return; } var data = S(this).data('swipe-transition'); if (typeof data === 'undefined') { data = {}; } data.delta_x = e.touches[0].pageX - data.start_page_x; if (Foundation.rtl) { data.delta_x = -data.delta_x; } if (typeof data.is_scrolling === 'undefined') { data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); } if (!data.is_scrolling && !data.active) { e.preventDefault(); var direction = (data.delta_x < 0) ? 'next' : 'prev'; data.active = true; self.nav(e, direction); } }) .on('touchend.fndtn.clearing', '.visible-img', function (e) { S(this).data('swipe-transition', {}); e.stopPropagation(); }); }, assemble : function ($li) { var $el = $li.parent(); if ($el.parent().hasClass('carousel')) { return; } $el.after('<div id="foundationClearingHolder"></div>'); var grid = $el.detach(), grid_outerHTML = ''; if (grid[0] == null) { return; } else { grid_outerHTML = grid[0].outerHTML; } var holder = this.S('#foundationClearingHolder'), settings = $el.data(this.attr_name(true) + '-init'), data = { grid : '<div class="carousel">' + grid_outerHTML + '</div>', viewing : settings.templates.viewing