/*

* Foundation Responsive Library
* http://foundation.zurb.com
* Copyright 2014, ZURB
* Free to use under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*/

(function ($, window, document, undefined) {

'use strict';

var header_helpers = function (class_array) {
    var i = class_array.length;
    var head = $('head');

    while (i--) {
        if (head.has('.' + class_array[i]).length === 0) {
            head.append('<meta class="' + class_array[i] + '" />');
        }
    }
};

header_helpers([
    'foundation-mq-small',
    'foundation-mq-small-only',
    'foundation-mq-medium',
    'foundation-mq-medium-only',
    'foundation-mq-large',
    'foundation-mq-large-only',
    'foundation-mq-xlarge',
    'foundation-mq-xlarge-only',
    'foundation-mq-xxlarge',
    'foundation-data-attribute-namespace']);

// Enable FastClick if present

$(function () {
    if (typeof FastClick !== 'undefined') {
        // Don't attach to body if undefined
        if (typeof document.body !== 'undefined') {
            FastClick.attach(document.body);
        }
    }
});

// private Fast Selector wrapper,
// returns jQuery object. Only use where
// getElementById is not available.
var S = function (selector, context) {
    if (typeof selector === 'string') {
        if (context) {
            var cont;
            if (context.jquery) {
                cont = context[0];
                if (!cont) return context;
            } else {
                cont = context;
            }
            return $(cont.querySelectorAll(selector));
        }

        return $(document.querySelectorAll(selector));
    }

    return $(selector, context);
};

// Namespace functions.

var attr_name = function (init) {
    var arr = [];
    if (!init) arr.push('data');
    if (this.namespace.length > 0) arr.push(this.namespace);
    arr.push(this.name);

    return arr.join('-');
};

var add_namespace = function (str) {
    var parts = str.split('-'),
        i = parts.length,
        arr = [];

    while (i--) {
        if (i !== 0) {
            arr.push(parts[i]);
        } else {
            if (this.namespace.length > 0) {
                arr.push(this.namespace, parts[i]);
            } else {
                arr.push(parts[i]);
            }
        }
    }

    return arr.reverse().join('-');
};

// Event binding and data-options updating.

var bindings = function (method, options) {
    var self = this,
        should_bind_events = !S(this).data(this.attr_name(true));

    if (S(this.scope).is('[' + this.attr_name() + ']')) {
        S(this.scope).data(this.attr_name(true) + '-init', $.extend({}, this.settings, (options || method), this.data_options(S(this.scope))));

        if (should_bind_events) {
            this.events(this.scope);
        }

    } else {
        S('[' + this.attr_name() + ']', this.scope).each(function () {
            var should_bind_events = !S(this).data(self.attr_name(true) + '-init');
            S(this).data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options(S(this))));

            if (should_bind_events) {
                self.events(this);
            }
        });
    }
    // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating.
    if (typeof method === 'string') {
        return this[method].call(this, options);
    }

};

var single_image_loaded = function (image, callback) {
    function loaded() {
        callback(image[0]);
    }

    function bindLoad() {
        this.one('load', loaded);

        if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
            var src = this.attr('src'),
                param = src.match(/\?/) ? '&' : '?';

            param += 'random=' + (new Date()).getTime();
            this.attr('src', src + param);
        }
    }

    if (!image.attr('src')) {
        loaded();
        return;
    }

    if (image[0].complete || image[0].readyState === 4) {
        loaded();
    } else {
        bindLoad.call(image);
    }
};

/*
 https://github.com/paulirish/matchMedia.js
 */

window.matchMedia = window.matchMedia || (function (doc) {

    'use strict';

    var bool,
        docElem = doc.documentElement,
        refNode = docElem.firstElementChild || docElem.firstChild,
    // fakeBody required for <FF4 when executed in <head>
        fakeBody = doc.createElement('body'),
        div = doc.createElement('div');

    div.id = 'mq-test-1';
    div.style.cssText = 'position:absolute;top:-100em';
    fakeBody.style.background = 'none';
    fakeBody.appendChild(div);

    return function (q) {

        div.innerHTML = '&shy;<style media="' + q + '"> #mq-test-1 { width: 42px; }</style>';

        docElem.insertBefore(fakeBody, refNode);
        bool = div.offsetWidth === 42;
        docElem.removeChild(fakeBody);

        return {
            matches: bool,
            media: q
        };

    };

}(document));

/*
 * jquery.requestAnimationFrame
 * https://github.com/gnarf37/jquery-requestAnimationFrame
 * Requires jQuery 1.8+
 *
 * Copyright (c) 2012 Corey Frang
 * Licensed under the MIT license.
 */

(function ($) {

    // 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);
        };

    }

}(jQuery));

function removeQuotes(string) {
    if (typeof string === 'string' || string instanceof String) {
        string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, '');
    }

    return string;
}

window.Foundation = {
    name: 'Foundation',

    version: '5.5.0',

    media_queries: {
        'small': S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'small-only': S('.foundation-mq-small-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'medium': S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'medium-only': S('.foundation-mq-medium-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'large': S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'large-only': S('.foundation-mq-large-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'xlarge': S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'xlarge-only': S('.foundation-mq-xlarge-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''),
        'xxlarge': S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '')
    },

    stylesheet: $('<style></style>').appendTo('head')[0].sheet,

    global: {
        namespace: undefined
    },

    init: function (scope, libraries, method, options, response) {
        var args = [scope, method, options, response],
            responses = [];

        // check RTL
        this.rtl = /rtl/i.test(S('html').attr('dir'));

        // set foundation global scope
        this.scope = scope || this.scope;

        this.set_namespace();

        if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) {
            if (this.libs.hasOwnProperty(libraries)) {
                responses.push(this.init_lib(libraries, args));
            }
        } else {
            for (var lib in this.libs) {
                responses.push(this.init_lib(lib, libraries));
            }
        }

        S(window).load(function () {
            S(window)
                .trigger('resize.fndtn.clearing')
                .trigger('resize.fndtn.dropdown')
                .trigger('resize.fndtn.equalizer')
                .trigger('resize.fndtn.interchange')
                .trigger('resize.fndtn.joyride')
                .trigger('resize.fndtn.magellan')
                .trigger('resize.fndtn.topbar')
                .trigger('resize.fndtn.slider');
        });

        return scope;
    },

    init_lib: function (lib, args) {
        if (this.libs.hasOwnProperty(lib)) {
            this.patch(this.libs[lib]);

            if (args && args.hasOwnProperty(lib)) {
                if (typeof this.libs[lib].settings !== 'undefined') {
                    $.extend(true, this.libs[lib].settings, args[lib]);
                }
                else if (typeof this.libs[lib].defaults !== 'undefined') {
                    $.extend(true, this.libs[lib].defaults, args[lib]);
                }
                return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]);
            }

            args = args instanceof Array ? args : new Array(args);
            return this.libs[lib].init.apply(this.libs[lib], args);
        }

        return function () {
        };
    },

    patch: function (lib) {
        lib.scope = this.scope;
        lib.namespace = this.global.namespace;
        lib.rtl = this.rtl;
        lib['data_options'] = this.utils.data_options;
        lib['attr_name'] = attr_name;
        lib['add_namespace'] = add_namespace;
        lib['bindings'] = bindings;
        lib['S'] = this.utils.S;
    },

    inherit: function (scope, methods) {
        var methods_arr = methods.split(' '),
            i = methods_arr.length;

        while (i--) {
            if (this.utils.hasOwnProperty(methods_arr[i])) {
                scope[methods_arr[i]] = this.utils[methods_arr[i]];
            }
        }
    },

    set_namespace: function () {

        // Description:
        //    Don't bother reading the namespace out of the meta tag
        //    if the namespace has been set globally in javascript
        //
        // Example:
        //    Foundation.global.namespace = 'my-namespace';
        // or make it an empty string:
        //    Foundation.global.namespace = '';
        //
        //

        // If the namespace has not been set (is undefined), try to read it out of the meta element.
        // Otherwise use the globally defined namespace, even if it's empty ('')
        var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace;

        // Finally, if the namsepace is either undefined or false, set it to an empty string.
        // Otherwise use the namespace value.
        this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace;
    },

    libs: {},

    // methods that can be inherited in libraries
    utils: {

        // Description:
        //    Fast Selector wrapper returns jQuery object. Only use where getElementById
        //    is not available.
        //
        // Arguments:
        //    Selector (String): CSS selector describing the element(s) to be
        //    returned as a jQuery object.
        //
        //    Scope (String): CSS selector describing the area to be searched. Default
        //    is document.
        //
        // Returns:
        //    Element (jQuery Object): jQuery object containing elements matching the
        //    selector within the scope.
        S: S,

        // Description:
        //    Executes a function a max of once every n milliseconds
        //
        // Arguments:
        //    Func (Function): Function to be throttled.
        //
        //    Delay (Integer): Function execution threshold in milliseconds.
        //
        // Returns:
        //    Lazy_function (Function): Function with throttling applied.
        throttle: function (func, delay) {
            var timer = null;

            return function () {
                var context = this, args = arguments;

                if (timer == null) {
                    timer = setTimeout(function () {
                        func.apply(context, args);
                        timer = null;
                    }, delay);
                }
            };
        },

        // Description:
        //    Executes a function when it stops being invoked for n seconds
        //    Modified version of _.debounce() http://underscorejs.org
        //
        // Arguments:
        //    Func (Function): Function to be debounced.
        //
        //    Delay (Integer): Function execution threshold in milliseconds.
        //
        //    Immediate (Bool): Whether the function should be called at the beginning
        //    of the delay instead of the end. Default is false.
        //
        // Returns:
        //    Lazy_function (Function): Function with debouncing applied.
        debounce: function (func, delay, immediate) {
            var timeout, result;
            return function () {
                var context = this, args = arguments;
                var later = function () {
                    timeout = null;
                    if (!immediate) result = func.apply(context, args);
                };
                var callNow = immediate && !timeout;
                clearTimeout(timeout);
                timeout = setTimeout(later, delay);
                if (callNow) result = func.apply(context, args);
                return result;
            };
        },

        // Description:
        //    Parses data-options attribute
        //
        // Arguments:
        //    El (jQuery Object): Element to be parsed.
        //
        // Returns:
        //    Options (Javascript Object): Contents of the element's data-options
        //    attribute.
        data_options: function (el, data_attr_name) {
            data_attr_name = data_attr_name || 'options';
            var opts = {}, ii, p, opts_arr,
                data_options = function (el) {
                    var namespace = Foundation.global.namespace;

                    if (namespace.length > 0) {
                        return el.data(namespace + '-' + data_attr_name);
                    }

                    return el.data(data_attr_name);
                };

            var cached_options = data_options(el);

            if (typeof cached_options === 'object') {
                return cached_options;
            }

            opts_arr = (cached_options || ':').split(';');
            ii = opts_arr.length;

            function isNumber(o) {
                return !isNaN(o - 0) && o !== null && o !== '' && o !== false && o !== true;
            }

            function trim(str) {
                if (typeof str === 'string') return $.trim(str);
                return str;
            }

            while (ii--) {
                p = opts_arr[ii].split(':');
                p = [p[0], p.slice(1).join(':')];

                if (/true/i.test(p[1])) p[1] = true;
                if (/false/i.test(p[1])) p[1] = false;
                if (isNumber(p[1])) {
                    if (p[1].indexOf('.') === -1) {
                        p[1] = parseInt(p[1], 10);
                    } else {
                        p[1] = parseFloat(p[1]);
                    }
                }

                if (p.length === 2 && p[0].length > 0) {
                    opts[trim(p[0])] = trim(p[1]);
                }
            }

            return opts;
        },

        // Description:
        //    Adds JS-recognizable media queries
        //
        // Arguments:
        //    Media (String): Key string for the media query to be stored as in
        //    Foundation.media_queries
        //
        //    Class (String): Class name for the generated <meta> tag
        register_media: function (media, media_class) {
            if (Foundation.media_queries[media] === undefined) {
                $('head').append('<meta class="' + media_class + '"/>');
                Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family'));
            }
        },

        // Description:
        //    Add custom CSS within a JS-defined media query
        //
        // Arguments:
        //    Rule (String): CSS rule to be appended to the document.
        //
        //    Media (String): Optional media query string for the CSS rule to be
        //    nested under.
        add_custom_rule: function (rule, media) {
            if (media === undefined && Foundation.stylesheet) {
                Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length);
            } else {
                var query = Foundation.media_queries[media];

                if (query !== undefined) {
                    Foundation.stylesheet.insertRule('@media ' +
                    Foundation.media_queries[media] + '{ ' + rule + ' }');
                }
            }
        },

        // Description:
        //    Performs a callback function when an image is fully loaded
        //
        // Arguments:
        //    Image (jQuery Object): Image(s) to check if loaded.
        //
        //    Callback (Function): Function to execute when image is fully loaded.
        image_loaded: function (images, callback) {
            var self = this,
                unloaded = images.length;

            if (unloaded === 0) {
                callback(images);
            }

            images.each(function () {
                single_image_loaded(self.S(this), function () {
                    unloaded -= 1;
                    if (unloaded === 0) {
                        callback(images);
                    }
                });
            });
        },

        // Description:
        //    Returns a random, alphanumeric string
        //
        // Arguments:
        //    Length (Integer): Length of string to be generated. Defaults to random
        //    integer.
        //
        // Returns:
        //    Rand (String): Pseudo-random, alphanumeric string.
        random_str: function () {
            if (!this.fidx) this.fidx = 0;
            this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-');

            return this.prefix + (this.fidx++).toString(36);
        },

        // Description:
        //    Helper for window.matchMedia
        //
        // Arguments:
        //    mq (String): Media query
        //
        // Returns:
        //    (Boolean): Whether the media query passes or not
        match: function (mq) {
            return window.matchMedia(mq).matches;
        },

        // Description:
        //    Helpers for checking Foundation default media queries with JS
        //
        // Returns:
        //    (Boolean): Whether the media query passes or not

        is_small_up: function () {
            return this.match(Foundation.media_queries.small);
        },

        is_medium_up: function () {
            return this.match(Foundation.media_queries.medium);
        },

        is_large_up: function () {
            return this.match(Foundation.media_queries.large);
        },

        is_xlarge_up: function () {
            return this.match(Foundation.media_queries.xlarge);
        },

        is_xxlarge_up: function () {
            return this.match(Foundation.media_queries.xxlarge);
        },

        is_small_only: function () {
            return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up();
        },

        is_medium_only: function () {
            return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up();
        },

        is_large_only: function () {
            return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up();
        },

        is_xlarge_only: function () {
            return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up();
        },

        is_xxlarge_only: function () {
            return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up();
        }
    }
};

$.fn.foundation = function () {
    var args = Array.prototype.slice.call(arguments, 0);

    return this.each(function () {
        Foundation.init.apply(Foundation, [this].concat(args));
        return this;
    });
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.slider = {
    name: 'slider',

    version: '5.5.0',

    settings: {
        start: 0,
        end: 100,
        step: 1,
        precision: null,
        initial: null,
        display_selector: '',
        vertical: false,
        trigger_input_change: false,
        on_change: function () {
        }
    },

    cache: {},

    init: function (scope, method, options) {
        Foundation.inherit(this, 'throttle');
        this.bindings(method, options);
        this.reflow();
    },

    events: function () {
        var self = this;

        $(this.scope)
            .off('.slider')
            .on('mousedown.fndtn.slider touchstart.fndtn.slider pointerdown.fndtn.slider',
            '[' + self.attr_name() + ']:not(.disabled, [disabled]) .range-slider-handle', function (e) {
                if (!self.cache.active) {
                    e.preventDefault();
                    self.set_active_slider($(e.target));
                }
            })
            .on('mousemove.fndtn.slider touchmove.fndtn.slider pointermove.fndtn.slider', function (e) {
                if (!!self.cache.active) {
                    e.preventDefault();
                    if ($.data(self.cache.active[0], 'settings').vertical) {
                        var scroll_offset = 0;
                        if (!e.pageY) {
                            scroll_offset = window.scrollY;
                        }
                        self.calculate_position(self.cache.active, self.get_cursor_position(e, 'y') + scroll_offset);
                    } else {
                        self.calculate_position(self.cache.active, self.get_cursor_position(e, 'x'));
                    }
                }
            })
            .on('mouseup.fndtn.slider touchend.fndtn.slider pointerup.fndtn.slider', function (e) {
                self.remove_active_slider();
            })
            .on('change.fndtn.slider', function (e) {
                self.settings.on_change();
            });

        self.S(window)
            .on('resize.fndtn.slider', self.throttle(function (e) {
                self.reflow();
            }, 300));
    },

    get_cursor_position: function (e, xy) {
        var pageXY = 'page' + xy.toUpperCase(),
            clientXY = 'client' + xy.toUpperCase(),
            position;

        if (typeof e[pageXY] !== 'undefined') {
            position = e[pageXY];
        }
        else if (typeof e.originalEvent[clientXY] !== 'undefined') {
            position = e.originalEvent[clientXY];
        }
        else if (e.originalEvent.touches && e.originalEvent.touches[0] && typeof e.originalEvent.touches[0][clientXY] !== 'undefined') {
            position = e.originalEvent.touches[0][clientXY];
        }
        else if (e.currentPoint && typeof e.currentPoint[xy] !== 'undefined') {
            position = e.currentPoint[xy];
        }
        return position;
    },

    set_active_slider: function ($handle) {
        this.cache.active = $handle;
    },

    remove_active_slider: function () {
        this.cache.active = null;
    },

    calculate_position: function ($handle, cursor_x) {
        var self = this,
            settings = $.data($handle[0], 'settings'),
            handle_l = $.data($handle[0], 'handle_l'),
            handle_o = $.data($handle[0], 'handle_o'),
            bar_l = $.data($handle[0], 'bar_l'),
            bar_o = $.data($handle[0], 'bar_o');

        requestAnimationFrame(function () {
            var pct;

            if (Foundation.rtl && !settings.vertical) {
                pct = self.limit_to(((bar_o + bar_l - cursor_x) / bar_l), 0, 1);
            } else {
                pct = self.limit_to(((cursor_x - bar_o) / bar_l), 0, 1);
            }

            pct = settings.vertical ? 1 - pct : pct;

            var norm = self.normalized_value(pct, settings.start, settings.end, settings.step, settings.precision);

            self.set_ui($handle, norm);
        });
    },

    set_ui: function ($handle, value) {
        var settings = $.data($handle[0], 'settings'),
            handle_l = $.data($handle[0], 'handle_l'),
            bar_l = $.data($handle[0], 'bar_l'),
            norm_pct = this.normalized_percentage(value, settings.start, settings.end),
            handle_offset = norm_pct * (bar_l - handle_l) - 1,
            progress_bar_length = norm_pct * 100,
            $handle_parent = $handle.parent(),
            $hidden_inputs = $handle.parent().children('input[type=hidden]');

        if (Foundation.rtl && !settings.vertical) {
            handle_offset = -handle_offset;
        }

        handle_offset = settings.vertical ? -handle_offset + bar_l - handle_l + 1 : handle_offset;
        this.set_translate($handle, handle_offset, settings.vertical);

        if (settings.vertical) {
            $handle.siblings('.range-slider-active-segment').css('height', progress_bar_length + '%');
        } else {
            $handle.siblings('.range-slider-active-segment').css('width', progress_bar_length + '%');
        }

        $handle_parent.attr(this.attr_name(), value).trigger('change').trigger('change.fndtn.slider');

        $hidden_inputs.val(value);
        if (settings.trigger_input_change) {
            $hidden_inputs.trigger('change');
        }

        if (!$handle[0].hasAttribute('aria-valuemin')) {
            $handle.attr({
                'aria-valuemin': settings.start,
                'aria-valuemax': settings.end
            });
        }
        $handle.attr('aria-valuenow', value);

        if (settings.display_selector != '') {
            $(settings.display_selector).each(function () {
                if (this.hasOwnProperty('value')) {
                    $(this).val(value);
                } else {
                    $(this).text(value);
                }
            });
        }

    },

    normalized_percentage: function (val, start, end) {
        return Math.min(1, (val - start) / (end - start));
    },

    normalized_value: function (val, start, end, step, precision) {
        var range = end - start,
            point = val * range,
            mod = (point - (point % step)) / step,
            rem = point % step,
            round = ( rem >= step * 0.5 ? step : 0);
        return ((mod * step + round) + start).toFixed(precision);
    },

    set_translate: function (ele, offset, vertical) {
        if (vertical) {
            $(ele)
                .css('-webkit-transform', 'translateY(' + offset + 'px)')
                .css('-moz-transform', 'translateY(' + offset + 'px)')
                .css('-ms-transform', 'translateY(' + offset + 'px)')
                .css('-o-transform', 'translateY(' + offset + 'px)')
                .css('transform', 'translateY(' + offset + 'px)');
        } else {
            $(ele)
                .css('-webkit-transform', 'translateX(' + offset + 'px)')
                .css('-moz-transform', 'translateX(' + offset + 'px)')
                .css('-ms-transform', 'translateX(' + offset + 'px)')
                .css('-o-transform', 'translateX(' + offset + 'px)')
                .css('transform', 'translateX(' + offset + 'px)');
        }
    },

    limit_to: function (val, min, max) {
        return Math.min(Math.max(val, min), max);
    },

    initialize_settings: function (handle) {
        var settings = $.extend({}, this.settings, this.data_options($(handle).parent())),
            decimal_places_match_result;

        if (settings.precision === null) {
            decimal_places_match_result = ('' + settings.step).match(/\.([\d]*)/);
            settings.precision = decimal_places_match_result && decimal_places_match_result[1] ? decimal_places_match_result[1].length : 0;
        }

        if (settings.vertical) {
            $.data(handle, 'bar_o', $(handle).parent().offset().top);
            $.data(handle, 'bar_l', $(handle).parent().outerHeight());
            $.data(handle, 'handle_o', $(handle).offset().top);
            $.data(handle, 'handle_l', $(handle).outerHeight());
        } else {
            $.data(handle, 'bar_o', $(handle).parent().offset().left);
            $.data(handle, 'bar_l', $(handle).parent().outerWidth());
            $.data(handle, 'handle_o', $(handle).offset().left);
            $.data(handle, 'handle_l', $(handle).outerWidth());
        }

        $.data(handle, 'bar', $(handle).parent());
        $.data(handle, 'settings', settings);
    },

    set_initial_position: function ($ele) {
        var settings = $.data($ele.children('.range-slider-handle')[0], 'settings'),
            initial = ((typeof settings.initial == 'number' && !isNaN(settings.initial)) ? settings.initial : Math.floor((settings.end - settings.start) * 0.5 / settings.step) * settings.step + settings.start),
            $handle = $ele.children('.range-slider-handle');
        this.set_ui($handle, initial);
    },

    set_value: function (value) {
        var self = this;
        $('[' + self.attr_name() + ']', this.scope).each(function () {
            $(this).attr(self.attr_name(), value);
        });
        if (!!$(this.scope).attr(self.attr_name())) {
            $(this.scope).attr(self.attr_name(), value);
        }
        self.reflow();
    },

    reflow: function () {
        var self = this;
        self.S('[' + this.attr_name() + ']').each(function () {
            var handle = $(this).children('.range-slider-handle')[0],
                val = $(this).attr(self.attr_name());
            self.initialize_settings(handle);

            if (val) {
                self.set_ui($(handle), parseFloat(val));
            } else {
                self.set_initial_position($(this));
            }
        });
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

var Modernizr = Modernizr || false;

Foundation.libs.joyride = {
    name: 'joyride',

    version: '5.5.0',

    defaults: {
        expose: false,     // turn on or off the expose feature
        modal: true,      // Whether to cover page with modal during the tour
        keyboard: true,      // enable left, right and esc keystrokes
        tip_location: 'bottom',  // 'top' or 'bottom' in relation to parent
        nub_position: 'auto',    // override on a per tooltip bases
        scroll_speed: 1500,      // Page scrolling speed in milliseconds, 0 = no scroll animation
        scroll_animation: 'linear',  // supports 'swing' and 'linear', extend with jQuery UI.
        timer: 0,         // 0 = no timer , all other numbers = timer in milliseconds
        start_timer_on_click: true,      // true or false - true requires clicking the first button start the timer
        start_offset: 0,         // the index of the tooltip you want to start on (index of the li)
        next_button: true,      // true or false to control whether a next button is used
        prev_button: true,      // true or false to control whether a prev button is used
        tip_animation: 'fade',    // 'pop' or 'fade' in each tip
        pause_after: [],        // array of indexes where to pause the tour after
        exposed: [],        // array of expose elements
        tip_animation_fade_speed: 300,       // when tipAnimation = 'fade' this is speed in milliseconds for the transition
        cookie_monster: false,     // true or false to control whether cookies are used
        cookie_name: 'joyride', // Name the cookie you'll use
        cookie_domain: false,     // Will this cookie be attached to a domain, ie. '.notableapp.com'
        cookie_expires: 365,       // set when you would like the cookie to expire.
        tip_container: 'body',    // Where will the tip be attached
        abort_on_close: true,      // When true, the close event will not fire any callback
        tip_location_patterns: {
            top: ['bottom'],
            bottom: [], // bottom should not need to be repositioned
            left: ['right', 'top', 'bottom'],
            right: ['left', 'top', 'bottom']
        },
        post_ride_callback: function () {
        },    // A method to call once the tour closes (canceled or complete)
        post_step_callback: function () {
        },    // A method to call after each step
        pre_step_callback: function () {
        },    // A method to call before each step
        pre_ride_callback: function () {
        },    // A method to call before the tour starts (passed index, tip, and cloned exposed element)
        post_expose_callback: function () {
        },    // A method to call after an element has been exposed
        template: { // HTML segments for tip layout
            link: '<a href="#close" class="joyride-close-tip">&times;</a>',
            timer: '<div class="joyride-timer-indicator-wrap"><span class="joyride-timer-indicator"></span></div>',
            tip: '<div class="joyride-tip-guide"><span class="joyride-nub"></span></div>',
            wrapper: '<div class="joyride-content-wrapper"></div>',
            button: '<a href="#" class="small button joyride-next-tip"></a>',
            prev_button: '<a href="#" class="small button joyride-prev-tip"></a>',
            modal: '<div class="joyride-modal-bg"></div>',
            expose: '<div class="joyride-expose-wrapper"></div>',
            expose_cover: '<div class="joyride-expose-cover"></div>'
        },
        expose_add_class: '' // One or more space-separated class names to be added to exposed element
    },

    init: function (scope, method, options) {
        Foundation.inherit(this, 'throttle random_str');

        this.settings = this.settings || $.extend({}, this.defaults, (options || method));

        this.bindings(method, options)
    },

    go_next: function () {
        if (this.settings.$li.next().length < 1) {
            this.end();
        } else if (this.settings.timer > 0) {
            clearTimeout(this.settings.automate);
            this.hide();
            this.show();
            this.startTimer();
        } else {
            this.hide();
            this.show();
        }
    },

    go_prev: function () {
        if (this.settings.$li.prev().length < 1) {
            // Do nothing if there are no prev element
        } else if (this.settings.timer > 0) {
            clearTimeout(this.settings.automate);
            this.hide();
            this.show(null, true);
            this.startTimer();
        } else {
            this.hide();
            this.show(null, true);
        }
    },

    events: function () {
        var self = this;

        $(this.scope)
            .off('.joyride')
            .on('click.fndtn.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) {
                e.preventDefault();
                this.go_next()
            }.bind(this))
            .on('click.fndtn.joyride', '.joyride-prev-tip', function (e) {
                e.preventDefault();
                this.go_prev();
            }.bind(this))

            .on('click.fndtn.joyride', '.joyride-close-tip', function (e) {
                e.preventDefault();
                this.end(this.settings.abort_on_close);
            }.bind(this))

            .on('keyup.fndtn.joyride', function (e) {
                // Don't do anything if keystrokes are disabled
                // or if the joyride is not being shown
                if (!this.settings.keyboard || !this.settings.riding) return;

                switch (e.which) {
                    case 39: // right arrow
                        e.preventDefault();
                        this.go_next();
                        break;
                    case 37: // left arrow
                        e.preventDefault();
                        this.go_prev();
                        break;
                    case 27: // escape
                        e.preventDefault();
                        this.end(this.settings.abort_on_close);
                }
            }.bind(this));

        $(window)
            .off('.joyride')
            .on('resize.fndtn.joyride', self.throttle(function () {
                if ($('[' + self.attr_name() + ']').length > 0 && self.settings.$next_tip && self.settings.riding) {
                    if (self.settings.exposed.length > 0) {
                        var $els = $(self.settings.exposed);

                        $els.each(function () {
                            var $this = $(this);
                            self.un_expose($this);
                            self.expose($this);
                        });
                    }

                    if (self.is_phone()) {
                        self.pos_phone();
                    } else {
                        self.pos_default(false);
                    }
                }
            }, 100));
    },

    start: function () {
        var self = this,
            $this = $('[' + this.attr_name() + ']', this.scope),
            integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'],
            int_settings_count = integer_settings.length;

        if (!$this.length > 0) return;

        if (!this.settings.init) this.events();

        this.settings = $this.data(this.attr_name(true) + '-init');

        // non configureable settings
        this.settings.$content_el = $this;
        this.settings.$body = $(this.settings.tip_container);
        this.settings.body_offset = $(this.settings.tip_container).position();
        this.settings.$tip_content = this.settings.$content_el.find('> li');
        this.settings.paused = false;
        this.settings.attempts = 0;
        this.settings.riding = true;

        // can we create cookies?
        if (typeof $.cookie !== 'function') {
            this.settings.cookie_monster = false;
        }

        // generate the tips and insert into dom.
        if (!this.settings.cookie_monster || this.settings.cookie_monster && !$.cookie(this.settings.cookie_name)) {
            this.settings.$tip_content.each(function (index) {
                var $this = $(this);
                this.settings = $.extend({}, self.defaults, self.data_options($this));

                // Make sure that settings parsed from data_options are integers where necessary
                var i = int_settings_count;
                while (i--) {
                    self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10);
                }
                self.create({$li: $this, index: index});
            });

            // show first tip
            if (!this.settings.start_timer_on_click && this.settings.timer > 0) {
                this.show('init');
                this.startTimer();
            } else {
                this.show('init');
            }

        }
    },

    resume: function () {
        this.set_li();
        this.show();
    },

    tip_template: function (opts) {
        var $blank, content;

        opts.tip_class = opts.tip_class || '';

        $blank = $(this.settings.template.tip).addClass(opts.tip_class);
        content = $.trim($(opts.li).html()) +
        this.prev_button_text(opts.prev_button_text, opts.index) +
        this.button_text(opts.button_text) +
        this.settings.template.link +
        this.timer_instance(opts.index);

        $blank.append($(this.settings.template.wrapper));
        $blank.first().attr(this.add_namespace('data-index'), opts.index);
        $('.joyride-content-wrapper', $blank).append(content);

        return $blank[0];
    },

    timer_instance: function (index) {
        var txt;

        if ((index === 0 && this.settings.start_timer_on_click && this.settings.timer > 0) || this.settings.timer === 0) {
            txt = '';
        } else {
            txt = $(this.settings.template.timer)[0].outerHTML;
        }
        return txt;
    },

    button_text: function (txt) {
        if (this.settings.tip_settings.next_button) {
            txt = $.trim(txt) || 'Next';
            txt = $(this.settings.template.button).append(txt)[0].outerHTML;
        } else {
            txt = '';
        }
        return txt;
    },

    prev_button_text: function (txt, idx) {
        if (this.settings.tip_settings.prev_button) {
            txt = $.trim(txt) || 'Previous';

            // Add the disabled class to the button if it's the first element
            if (idx == 0)
                txt = $(this.settings.template.prev_button).append(txt).addClass('disabled')[0].outerHTML;
            else
                txt = $(this.settings.template.prev_button).append(txt)[0].outerHTML;
        } else {
            txt = '';
        }
        return txt;
    },

    create: function (opts) {
        this.settings.tip_settings = $.extend({}, this.settings, this.data_options(opts.$li));
        var buttonText = opts.$li.attr(this.add_namespace('data-button'))
                || opts.$li.attr(this.add_namespace('data-text')),
            prevButtonText = opts.$li.attr(this.add_namespace('data-button-prev'))
                || opts.$li.attr(this.add_namespace('data-prev-text')),
            tipClass = opts.$li.attr('class'),
            $tip_content = $(this.tip_template({
                tip_class: tipClass,
                index: opts.index,
                button_text: buttonText,
                prev_button_text: prevButtonText,
                li: opts.$li
            }));

        $(this.settings.tip_container).append($tip_content);
    },

    show: function (init, is_prev) {
        var $timer = null;

        // are we paused?
        if (this.settings.$li === undefined
            || ($.inArray(this.settings.$li.index(), this.settings.pause_after) === -1)) {

            // don't go to the next li if the tour was paused
            if (this.settings.paused) {
                this.settings.paused = false;
            } else {
                this.set_li(init, is_prev);
            }

            this.settings.attempts = 0;

            if (this.settings.$li.length && this.settings.$target.length > 0) {
                if (init) { //run when we first start
                    this.settings.pre_ride_callback(this.settings.$li.index(), this.settings.$next_tip);
                    if (this.settings.modal) {
                        this.show_modal();
                    }
                }

                this.settings.pre_step_callback(this.settings.$li.index(), this.settings.$next_tip);

                if (this.settings.modal && this.settings.expose) {
                    this.expose();
                }

                this.settings.tip_settings = $.extend({}, this.settings, this.data_options(this.settings.$li));

                this.settings.timer = parseInt(this.settings.timer, 10);

                this.settings.tip_settings.tip_location_pattern = this.settings.tip_location_patterns[this.settings.tip_settings.tip_location];

                // scroll and hide bg if not modal
                if (!/body/i.test(this.settings.$target.selector)) {
                    var joyridemodalbg = $('.joyride-modal-bg');
                    if (/pop/i.test(this.settings.tipAnimation)) {
                        joyridemodalbg.hide();
                    } else {
                        joyridemodalbg.fadeOut(this.settings.tipAnimationFadeSpeed);
                    }
                    this.scroll_to();
                }

                if (this.is_phone()) {
                    this.pos_phone(true);
                } else {
                    this.pos_default(true);
                }

                $timer = this.settings.$next_tip.find('.joyride-timer-indicator');

                if (/pop/i.test(this.settings.tip_animation)) {

                    $timer.width(0);

                    if (this.settings.timer > 0) {

                        this.settings.$next_tip.show();

                        setTimeout(function () {
                            $timer.animate({
                                width: $timer.parent().width()
                            }, this.settings.timer, 'linear');
                        }.bind(this), this.settings.tip_animation_fade_speed);

                    } else {
                        this.settings.$next_tip.show();

                    }

                } else if (/fade/i.test(this.settings.tip_animation)) {

                    $timer.width(0);

                    if (this.settings.timer > 0) {

                        this.settings.$next_tip
                            .fadeIn(this.settings.tip_animation_fade_speed)
                            .show();

                        setTimeout(function () {
                            $timer.animate({
                                width: $timer.parent().width()
                            }, this.settings.timer, 'linear');
                        }.bind(this), this.settings.tip_animation_fade_speed);

                    } else {
                        this.settings.$next_tip.fadeIn(this.settings.tip_animation_fade_speed);
                    }
                }

                this.settings.$current_tip = this.settings.$next_tip;

                // skip non-existant targets
            } else if (this.settings.$li && this.settings.$target.length < 1) {

                this.show(init, is_prev);

            } else {

                this.end();

            }
        } else {

            this.settings.paused = true;

        }

    },

    is_phone: function () {
        return matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches;
    },

    hide: function () {
        if (this.settings.modal && this.settings.expose) {
            this.un_expose();
        }

        if (!this.settings.modal) {
            $('.joyride-modal-bg').hide();
        }

        // Prevent scroll bouncing...wait to remove from layout
        this.settings.$current_tip.css('visibility', 'hidden');
        setTimeout($.proxy(function () {
            this.hide();
            this.css('visibility', 'visible');
        }, this.settings.$current_tip), 0);
        this.settings.post_step_callback(this.settings.$li.index(),
            this.settings.$current_tip);
    },

    set_li: function (init, is_prev) {
        if (init) {
            this.settings.$li = this.settings.$tip_content.eq(this.settings.start_offset);
            this.set_next_tip();
            this.settings.$current_tip = this.settings.$next_tip;
        } else {
            if (is_prev)
                this.settings.$li = this.settings.$li.prev();
            else
                this.settings.$li = this.settings.$li.next();
            this.set_next_tip();
        }

        this.set_target();
    },

    set_next_tip: function () {
        this.settings.$next_tip = $('.joyride-tip-guide').eq(this.settings.$li.index());
        this.settings.$next_tip.data('closed', '');
    },

    set_target: function () {
        var cl = this.settings.$li.attr(this.add_namespace('data-class')),
            id = this.settings.$li.attr(this.add_namespace('data-id')),
            $sel = function () {
                if (id) {
                    return $(document.getElementById(id));
                } else if (cl) {
                    return $('.' + cl).first();
                } else {
                    return $('body');
                }
            };

        this.settings.$target = $sel();
    },

    scroll_to: function () {
        var window_half, tipOffset;

        window_half = $(window).height() / 2;
        tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight());

        if (tipOffset != 0) {
            $('html, body').stop().animate({
                scrollTop: tipOffset
            }, this.settings.scroll_speed, 'swing');
        }
    },

    paused: function () {
        return ($.inArray((this.settings.$li.index() + 1), this.settings.pause_after) === -1);
    },

    restart: function () {
        this.hide();
        this.settings.$li = undefined;
        this.show('init');
    },

    pos_default: function (init) {
        var $nub = this.settings.$next_tip.find('.joyride-nub'),
            nub_width = Math.ceil($nub.outerWidth() / 2),
            nub_height = Math.ceil($nub.outerHeight() / 2),
            toggle = init || false;

        // tip must not be "display: none" to calculate position
        if (toggle) {
            this.settings.$next_tip.css('visibility', 'hidden');
            this.settings.$next_tip.show();
        }

        if (!/body/i.test(this.settings.$target.selector)) {
            var topAdjustment = this.settings.tip_settings.tipAdjustmentY ? parseInt(this.settings.tip_settings.tipAdjustmentY) : 0,
                leftAdjustment = this.settings.tip_settings.tipAdjustmentX ? parseInt(this.settings.tip_settings.tipAdjustmentX) : 0;

            if (this.bottom()) {
                if (this.rtl) {
                    this.settings.$next_tip.css({
                        top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment),
                        left: this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth() + leftAdjustment
                    });
                } else {
                    this.settings.$next_tip.css({
                        top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment),
                        left: this.settings.$target.offset().left + leftAdjustment
                    });
                }

                this.nub_position($nub, this.settings.tip_settings.nub_position, 'top');

            } else if (this.top()) {
                if (this.rtl) {
                    this.settings.$next_tip.css({
                        top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment),
                        left: this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth()
                    });
                } else {
                    this.settings.$next_tip.css({
                        top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment),
                        left: this.settings.$target.offset().left + leftAdjustment
                    });
                }

                this.nub_position($nub, this.settings.tip_settings.nub_position, 'bottom');

            } else if (this.right()) {

                this.settings.$next_tip.css({
                    top: this.settings.$target.offset().top + topAdjustment,
                    left: (this.settings.$target.outerWidth() + this.settings.$target.offset().left + nub_width + leftAdjustment)
                });

                this.nub_position($nub, this.settings.tip_settings.nub_position, 'left');

            } else if (this.left()) {

                this.settings.$next_tip.css({
                    top: this.settings.$target.offset().top + topAdjustment,
                    left: (this.settings.$target.offset().left - this.settings.$next_tip.outerWidth() - nub_width + leftAdjustment)
                });

                this.nub_position($nub, this.settings.tip_settings.nub_position, 'right');

            }

            if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tip_settings.tip_location_pattern.length) {

                $nub.removeClass('bottom')
                    .removeClass('top')
                    .removeClass('right')
                    .removeClass('left');

                this.settings.tip_settings.tip_location = this.settings.tip_settings.tip_location_pattern[this.settings.attempts];

                this.settings.attempts++;

                this.pos_default();

            }

        } else if (this.settings.$li.length) {

            this.pos_modal($nub);

        }

        if (toggle) {
            this.settings.$next_tip.hide();
            this.settings.$next_tip.css('visibility', 'visible');
        }

    },

    pos_phone: function (init) {
        var tip_height = this.settings.$next_tip.outerHeight(),
            tip_offset = this.settings.$next_tip.offset(),
            target_height = this.settings.$target.outerHeight(),
            $nub = $('.joyride-nub', this.settings.$next_tip),
            nub_height = Math.ceil($nub.outerHeight() / 2),
            toggle = init || false;

        $nub.removeClass('bottom')
            .removeClass('top')
            .removeClass('right')
            .removeClass('left');

        if (toggle) {
            this.settings.$next_tip.css('visibility', 'hidden');
            this.settings.$next_tip.show();
        }

        if (!/body/i.test(this.settings.$target.selector)) {

            if (this.top()) {

                this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height});
                $nub.addClass('bottom');

            } else {

                this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height});
                $nub.addClass('top');

            }

        } else if (this.settings.$li.length) {
            this.pos_modal($nub);
        }

        if (toggle) {
            this.settings.$next_tip.hide();
            this.settings.$next_tip.css('visibility', 'visible');
        }
    },

    pos_modal: function ($nub) {
        this.center();
        $nub.hide();

        this.show_modal();
    },

    show_modal: function () {
        if (!this.settings.$next_tip.data('closed')) {
            var joyridemodalbg = $('.joyride-modal-bg');
            if (joyridemodalbg.length < 1) {
                var joyridemodalbg = $(this.settings.template.modal);
                joyridemodalbg.appendTo('body');
            }

            if (/pop/i.test(this.settings.tip_animation)) {
                joyridemodalbg.show();
            } else {
                joyridemodalbg.fadeIn(this.settings.tip_animation_fade_speed);
            }
        }
    },

    expose: function () {
        var expose,
            exposeCover,
            el,
            origCSS,
            origClasses,
            randId = 'expose-' + this.random_str(6);

        if (arguments.length > 0 && arguments[0] instanceof $) {
            el = arguments[0];
        } else if (this.settings.$target && !/body/i.test(this.settings.$target.selector)) {
            el = this.settings.$target;
        } else {
            return false;
        }

        if (el.length < 1) {
            if (window.console) {
                console.error('element not valid', el);
            }
            return false;
        }

        expose = $(this.settings.template.expose);
        this.settings.$body.append(expose);
        expose.css({
            top: el.offset().top,
            left: el.offset().left,
            width: el.outerWidth(true),
            height: el.outerHeight(true)
        });

        exposeCover = $(this.settings.template.expose_cover);

        origCSS = {
            zIndex: el.css('z-index'),
            position: el.css('position')
        };

        origClasses = el.attr('class') == null ? '' : el.attr('class');

        el.css('z-index', parseInt(expose.css('z-index')) + 1);

        if (origCSS.position == 'static') {
            el.css('position', 'relative');
        }

        el.data('expose-css', origCSS);
        el.data('orig-class', origClasses);
        el.attr('class', origClasses + ' ' + this.settings.expose_add_class);

        exposeCover.css({
            top: el.offset().top,
            left: el.offset().left,
            width: el.outerWidth(true),
            height: el.outerHeight(true)
        });

        if (this.settings.modal) this.show_modal();

        this.settings.$body.append(exposeCover);
        expose.addClass(randId);
        exposeCover.addClass(randId);
        el.data('expose', randId);
        this.settings.post_expose_callback(this.settings.$li.index(), this.settings.$next_tip, el);
        this.add_exposed(el);
    },

    un_expose: function () {
        var exposeId,
            el,
            expose,
            origCSS,
            origClasses,
            clearAll = false;

        if (arguments.length > 0 && arguments[0] instanceof $) {
            el = arguments[0];
        } else if (this.settings.$target && !/body/i.test(this.settings.$target.selector)) {
            el = this.settings.$target;
        } else {
            return false;
        }

        if (el.length < 1) {
            if (window.console) {
                console.error('element not valid', el);
            }
            return false;
        }

        exposeId = el.data('expose');
        expose = $('.' + exposeId);

        if (arguments.length > 1) {
            clearAll = arguments[1];
        }

        if (clearAll === true) {
            $('.joyride-expose-wrapper,.joyride-expose-cover').remove();
        } else {
            expose.remove();
        }

        origCSS = el.data('expose-css');

        if (origCSS.zIndex == 'auto') {
            el.css('z-index', '');
        } else {
            el.css('z-index', origCSS.zIndex);
        }

        if (origCSS.position != el.css('position')) {
            if (origCSS.position == 'static') {// this is default, no need to set it.
                el.css('position', '');
            } else {
                el.css('position', origCSS.position);
            }
        }

        origClasses = el.data('orig-class');
        el.attr('class', origClasses);
        el.removeData('orig-classes');

        el.removeData('expose');
        el.removeData('expose-z-index');
        this.remove_exposed(el);
    },

    add_exposed: function (el) {
        this.settings.exposed = this.settings.exposed || [];
        if (el instanceof $ || typeof el === 'object') {
            this.settings.exposed.push(el[0]);
        } else if (typeof el == 'string') {
            this.settings.exposed.push(el);
        }
    },

    remove_exposed: function (el) {
        var search, i;
        if (el instanceof $) {
            search = el[0]
        } else if (typeof el == 'string') {
            search = el;
        }

        this.settings.exposed = this.settings.exposed || [];
        i = this.settings.exposed.length;

        while (i--) {
            if (this.settings.exposed[i] == search) {
                this.settings.exposed.splice(i, 1);
                return;
            }
        }
    },

    center: function () {
        var $w = $(window);

        this.settings.$next_tip.css({
            top: ((($w.height() - this.settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()),
            left: ((($w.width() - this.settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft())
        });

        return true;
    },

    bottom: function () {
        return /bottom/i.test(this.settings.tip_settings.tip_location);
    },

    top: function () {
        return /top/i.test(this.settings.tip_settings.tip_location);
    },

    right: function () {
        return /right/i.test(this.settings.tip_settings.tip_location);
    },

    left: function () {
        return /left/i.test(this.settings.tip_settings.tip_location);
    },

    corners: function (el) {
        var w = $(window),
            window_half = w.height() / 2,
        //using this to calculate since scroll may not have finished yet.
            tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()),
            right = w.width() + w.scrollLeft(),
            offsetBottom = w.height() + tipOffset,
            bottom = w.height() + w.scrollTop(),
            top = w.scrollTop();

        if (tipOffset < top) {
            if (tipOffset < 0) {
                top = 0;
            } else {
                top = tipOffset;
            }
        }

        if (offsetBottom > bottom) {
            bottom = offsetBottom;
        }

        return [
            el.offset().top < top,
            right < el.offset().left + el.outerWidth(),
            bottom < el.offset().top + el.outerHeight(),
            w.scrollLeft() > el.offset().left
        ];
    },

    visible: function (hidden_corners) {
        var i = hidden_corners.length;

        while (i--) {
            if (hidden_corners[i]) return false;
        }

        return true;
    },

    nub_position: function (nub, pos, def) {
        if (pos === 'auto') {
            nub.addClass(def);
        } else {
            nub.addClass(pos);
        }
    },

    startTimer: function () {
        if (this.settings.$li.length) {
            this.settings.automate = setTimeout(function () {
                this.hide();
                this.show();
                this.startTimer();
            }.bind(this), this.settings.timer);
        } else {
            clearTimeout(this.settings.automate);
        }
    },

    end: function (abort) {
        if (this.settings.cookie_monster) {
            $.cookie(this.settings.cookie_name, 'ridden', {
                expires: this.settings.cookie_expires,
                domain: this.settings.cookie_domain
            });
        }

        if (this.settings.timer > 0) {
            clearTimeout(this.settings.automate);
        }

        if (this.settings.modal && this.settings.expose) {
            this.un_expose();
        }

        // Unplug keystrokes listener
        $(this.scope).off('keyup.joyride')

        this.settings.$next_tip.data('closed', true);
        this.settings.riding = false;

        $('.joyride-modal-bg').hide();
        this.settings.$current_tip.hide();

        if (typeof abort === 'undefined' || abort === false) {
            this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip);
            this.settings.post_ride_callback(this.settings.$li.index(), this.settings.$current_tip);
        }

        $('.joyride-tip-guide').remove();
    },

    off: function () {
        $(this.scope).off('.joyride');
        $(window).off('.joyride');
        $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride');
        $('.joyride-tip-guide, .joyride-modal-bg').remove();
        clearTimeout(this.settings.automate);
        this.settings = {};
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.equalizer = {
    name: 'equalizer',

    version: '5.5.0',

    settings: {
        use_tallest: true,
        before_height_change: $.noop,
        after_height_change: $.noop,
        equalize_on_stack: false
    },

    init: function (scope, method, options) {
        Foundation.inherit(this, 'image_loaded');
        this.bindings(method, options);
        this.reflow();
    },

    events: function () {
        this.S(window).off('.equalizer').on('resize.fndtn.equalizer', function (e) {
            this.reflow();
        }.bind(this));
    },

    equalize: function (equalizer) {
        var isStacked = false,
            vals = equalizer.find('[' + this.attr_name() + '-watch]:visible'),
            settings = equalizer.data(this.attr_name(true) + '-init');

        if (vals.length === 0) return;
        var firstTopOffset = vals.first().offset().top;
        settings.before_height_change();
        equalizer.trigger('before-height-change').trigger('before-height-change.fndth.equalizer');
        vals.height('inherit');
        vals.each(function () {
            var el = $(this);
            if (el.offset().top !== firstTopOffset) {
                isStacked = true;
            }
        });

        if (settings.equalize_on_stack === false) {
            if (isStacked) return;
        }
        ;

        var heights = vals.map(function () {
            return $(this).outerHeight(false)
        }).get();

        if (settings.use_tallest) {
            var max = Math.max.apply(null, heights);
            vals.css('height', max);
        } else {
            var min = Math.min.apply(null, heights);
            vals.css('height', min);
        }
        settings.after_height_change();
        equalizer.trigger('after-height-change').trigger('after-height-change.fndtn.equalizer');
    },

    reflow: function () {
        var self = this;

        this.S('[' + this.attr_name() + ']', this.scope).each(function () {
            var $eq_target = $(this);
            self.image_loaded(self.S('img', this), function () {
                self.equalize($eq_target)
            });
        });
    }
};

})(jQuery, window, window.document); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.dropdown = {
    name: 'dropdown',

    version: '5.5.0',

    settings: {
        active_class: 'open',
        disabled_class: 'disabled',
        mega_class: 'mega',
        align: 'bottom',
        is_hover: false,
        hover_timeout: 150,
        opened: function () {
        },
        closed: function () {
        }
    },

    init: function (scope, method, options) {
        Foundation.inherit(this, 'throttle');

        $.extend(true, this.settings, method, options);
        this.bindings(method, options);
    },

    events: function (scope) {
        var self = this,
            S = self.S;

        S(this.scope)
            .off('.dropdown')
            .on('click.fndtn.dropdown', '[' + this.attr_name() + ']', function (e) {
                var settings = S(this).data(self.attr_name(true) + '-init') || self.settings;
                if (!settings.is_hover || Modernizr.touch) {
                    e.preventDefault();
                    if (S(this).parent('[data-reveal-id]')) {
                        e.stopPropagation();
                    }
                    self.toggle($(this));
                }
            })
            .on('mouseenter.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) {
                var $this = S(this),
                    dropdown,
                    target;

                clearTimeout(self.timeout);

                if ($this.data(self.data_attr())) {
                    dropdown = S('#' + $this.data(self.data_attr()));
                    target = $this;
                } else {
                    dropdown = $this;
                    target = S('[' + self.attr_name() + '="' + dropdown.attr('id') + '"]');
                }

                var settings = target.data(self.attr_name(true) + '-init') || self.settings;

                if (S(e.currentTarget).data(self.data_attr()) && settings.is_hover) {
                    self.closeall.call(self);
                }

                if (settings.is_hover) self.open.apply(self, [dropdown, target]);
            })
            .on('mouseleave.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) {
                var $this = S(this);
                var settings;

                if ($this.data(self.data_attr())) {
                    settings = $this.data(self.data_attr(true) + '-init') || self.settings;
                }
                else {
                    var target = S('[' + self.attr_name() + '="' + S(this).attr('id') + '"]'),
                        settings = target.data(self.attr_name(true) + '-init') || self.settings;
                }

                self.timeout = setTimeout(function () {
                    if ($this.data(self.data_attr())) {
                        if (settings.is_hover) self.close.call(self, S('#' + $this.data(self.data_attr())));
                    } else {
                        if (settings.is_hover) self.close.call(self, $this);
                    }
                }.bind(this), settings.hover_timeout);
            })
            .on('click.fndtn.dropdown', function (e) {
                var parent = S(e.target).closest('[' + self.attr_name() + '-content]');
                var links = parent.find('a');

                if (links.length > 0 && parent.attr('aria-autoclose') !== "false") {
                    self.close.call(self, S('[' + self.attr_name() + '-content]'));
                }

                if (S(e.target).closest('[' + self.attr_name() + ']').length > 0) {
                    return;
                }

                if (!(S(e.target).data('revealId')) &&
                    (parent.length > 0 && (S(e.target).is('[' + self.attr_name() + '-content]') ||
                    $.contains(parent.first()[0], e.target)))) {
                    e.stopPropagation();
                    return;
                }

                self.close.call(self, S('[' + self.attr_name() + '-content]'));
            })
            .on('opened.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () {
                self.settings.opened.call(this);
            })
            .on('closed.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () {
                self.settings.closed.call(this);
            });

        S(window)
            .off('.dropdown')
            .on('resize.fndtn.dropdown', self.throttle(function () {
                self.resize.call(self);
            }, 50));

        this.resize();
    },

    close: function (dropdown) {
        var self = this;
        dropdown.each(function () {
            var original_target = $('[' + self.attr_name() + '=' + dropdown[0].id + ']') || $('aria-controls=' + dropdown[0].id + ']');
            original_target.attr('aria-expanded', 'false');
            if (self.S(this).hasClass(self.settings.active_class)) {
                self.S(this)
                    .css(Foundation.rtl ? 'right' : 'left', '-99999px')
                    .attr('aria-hidden', 'true')
                    .removeClass(self.settings.active_class)
                    .prev('[' + self.attr_name() + ']')
                    .removeClass(self.settings.active_class)
                    .removeData('target');

                self.S(this).trigger('closed').trigger('closed.fndtn.dropdown', [dropdown]);
            }
        });
        dropdown.removeClass('f-open-' + this.attr_name(true));
    },

    closeall: function () {
        var self = this;
        $.each(self.S('.f-open-' + this.attr_name(true)), function () {
            self.close.call(self, self.S(this));
        });
    },

    open: function (dropdown, target) {
        this
            .css(dropdown
                .addClass(this.settings.active_class), target);
        dropdown.prev('[' + this.attr_name() + ']').addClass(this.settings.active_class);
        dropdown.data('target', target.get(0)).trigger('opened').trigger('opened.fndtn.dropdown', [dropdown, target]);
        dropdown.attr('aria-hidden', 'false');
        target.attr('aria-expanded', 'true');
        dropdown.focus();
        dropdown.addClass('f-open-' + this.attr_name(true));
    },

    data_attr: function () {
        if (this.namespace.length > 0) {
            return this.namespace + '-' + this.name;
        }

        return this.name;
    },

    toggle: function (target) {
        if (target.hasClass(this.settings.disabled_class)) {
            return;
        }
        var dropdown = this.S('#' + target.data(this.data_attr()));
        if (dropdown.length === 0) {
            // No dropdown found, not continuing
            return;
        }

        this.close.call(this, this.S('[' + this.attr_name() + '-content]').not(dropdown));

        if (dropdown.hasClass(this.settings.active_class)) {
            this.close.call(this, dropdown);
            if (dropdown.data('target') !== target.get(0))
                this.open.call(this, dropdown, target);
        } else {
            this.open.call(this, dropdown, target);
        }
    },

    resize: function () {
        var dropdown = this.S('[' + this.attr_name() + '-content].open'),
            target = this.S('[' + this.attr_name() + '="' + dropdown.attr('id') + '"]');

        if (dropdown.length && target.length) {
            this.css(dropdown, target);
        }
    },

    css: function (dropdown, target) {
        var left_offset = Math.max((target.width() - dropdown.width()) / 2, 8),
            settings = target.data(this.attr_name(true) + '-init') || this.settings;

        this.clear_idx();

        if (this.small()) {
            var p = this.dirs.bottom.call(dropdown, target, settings);

            dropdown.attr('style', '').removeClass('drop-left drop-right drop-top').css({
                position: 'absolute',
                width: '95%',
                'max-width': 'none',
                top: p.top
            });

            dropdown.css(Foundation.rtl ? 'right' : 'left', left_offset);
        } else {

            this.style(dropdown, target, settings);
        }

        return dropdown;
    },

    style: function (dropdown, target, settings) {
        var css = $.extend({position: 'absolute'},
            this.dirs[settings.align].call(dropdown, target, settings));

        dropdown.attr('style', '').css(css);
    },

    // return CSS property object
    // `this` is the dropdown
    dirs: {
        // Calculate target offset
        _base: function (t) {
            var o_p = this.offsetParent(),
                o = o_p.offset(),
                p = t.offset();

            p.top -= o.top;
            p.left -= o.left;

            //set some flags on the p object to pass along
            p.missRight = false;
            p.missTop = false;
            p.missLeft = false;
            p.leftRightFlag = false;

            //lets see if the panel will be off the screen
            //get the actual width of the page and store it
            var actualBodyWidth;
            if (document.getElementsByClassName('row')[0]) {
                actualBodyWidth = document.getElementsByClassName('row')[0].clientWidth;
            } else {
                actualBodyWidth = window.outerWidth;
            }

            var actualMarginWidth = (window.outerWidth - actualBodyWidth) / 2;
            var actualBoundary = actualBodyWidth;

            if (!this.hasClass('mega')) {
                //miss top
                if (t.offset().top <= this.outerHeight()) {
                    p.missTop = true;
                    actualBoundary = window.outerWidth - actualMarginWidth;
                    p.leftRightFlag = true;
                }

                //miss right
                if (t.offset().left + this.outerWidth() > t.offset().left + actualMarginWidth && t.offset().left - actualMarginWidth > this.outerWidth()) {
                    p.missRight = true;
                    p.missLeft = false;
                }

                //miss left
                if (t.offset().left - this.outerWidth() <= 0) {
                    p.missLeft = true;
                    p.missRight = false;
                }
            }

            return p;
        },

        top: function (t, s) {
            var self = Foundation.libs.dropdown,
                p = self.dirs._base.call(this, t);

            this.addClass('drop-top');

            if (p.missTop == true) {
                p.top = p.top + t.outerHeight() + this.outerHeight();
                this.removeClass('drop-top');
            }

            if (p.missRight == true) {
                p.left = p.left - this.outerWidth() + t.outerWidth();
            }

            if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) {
                self.adjust_pip(this, t, s, p);
            }

            if (Foundation.rtl) {
                return {
                    left: p.left - this.outerWidth() + t.outerWidth(),
                    top: p.top - this.outerHeight()
                };
            }

            return {left: p.left, top: p.top - this.outerHeight()};
        },

        bottom: function (t, s) {
            var self = Foundation.libs.dropdown,
                p = self.dirs._base.call(this, t);

            if (p.missRight == true) {
                p.left = p.left - this.outerWidth() + t.outerWidth();
            }

            if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) {
                self.adjust_pip(this, t, s, p);
            }

            if (self.rtl) {
                return {left: p.left - this.outerWidth() + t.outerWidth(), top: p.top + t.outerHeight()};
            }

            return {left: p.left, top: p.top + t.outerHeight()};
        },

        left: function (t, s) {
            var p = Foundation.libs.dropdown.dirs._base.call(this, t);

            this.addClass('drop-left');

            if (p.missLeft == true) {
                p.left = p.left + this.outerWidth();
                p.top = p.top + t.outerHeight();
                this.removeClass('drop-left');
            }

            return {left: p.left - this.outerWidth(), top: p.top};
        },

        right: function (t, s) {
            var p = Foundation.libs.dropdown.dirs._base.call(this, t);

            this.addClass('drop-right');

            if (p.missRight == true) {
                p.left = p.left - this.outerWidth();
                p.top = p.top + t.outerHeight();
                this.removeClass('drop-right');
            } else {
                p.triggeredRight = true;
            }

            var self = Foundation.libs.dropdown;

            if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) {
                self.adjust_pip(this, t, s, p);
            }

            return {left: p.left + t.outerWidth(), top: p.top};
        }
    },

    // Insert rule to style psuedo elements
    adjust_pip: function (dropdown, target, settings, position) {
        var sheet = Foundation.stylesheet,
            pip_offset_base = 8;

        if (dropdown.hasClass(settings.mega_class)) {
            pip_offset_base = position.left + (target.outerWidth() / 2) - 8;
        }
        else if (this.small()) {
            pip_offset_base += position.left - 8;
        }

        this.rule_idx = sheet.cssRules.length;

        //default
        var sel_before = '.f-dropdown.open:before',
            sel_after = '.f-dropdown.open:after',
            css_before = 'left: ' + pip_offset_base + 'px;',
            css_after = 'left: ' + (pip_offset_base - 1) + 'px;';

        if (position.missRight == true) {
            pip_offset_base = dropdown.outerWidth() - 23;
            sel_before = '.f-dropdown.open:before',
                sel_after = '.f-dropdown.open:after',
                css_before = 'left: ' + pip_offset_base + 'px;',
                css_after = 'left: ' + (pip_offset_base - 1) + 'px;';
        }

        //just a case where right is fired, but its not missing right
        if (position.triggeredRight == true) {
            sel_before = '.f-dropdown.open:before',
                sel_after = '.f-dropdown.open:after',
                css_before = 'left:-12px;',
                css_after = 'left:-14px;';
        }

        if (sheet.insertRule) {
            sheet.insertRule([sel_before, '{', css_before, '}'].join(' '), this.rule_idx);
            sheet.insertRule([sel_after, '{', css_after, '}'].join(' '), this.rule_idx + 1);
        } else {
            sheet.addRule(sel_before, css_before, this.rule_idx);
            sheet.addRule(sel_after, css_after, this.rule_idx + 1);
        }
    },

    // Remove old dropdown rule index
    clear_idx: function () {
        var sheet = Foundation.stylesheet;

        if (typeof this.rule_idx !== 'undefined') {
            sheet.deleteRule(this.rule_idx);
            sheet.deleteRule(this.rule_idx);
            delete this.rule_idx;
        }
    },

    small: function () {
        return matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches;
    },

    off: function () {
        this.S(this.scope).off('.fndtn.dropdown');
        this.S('html, body').off('.fndtn.dropdown');
        this.S(window).off('.fndtn.dropdown');
        this.S('[data-dropdown-content]').off('.fndtn.dropdown');
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.clearing = {
    name: 'clearing',

    version: '5.5.0',

    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>'
        },

        // comma delimited list of selectors that, on click, will close clearing,
        // add 'div.clearing-blackout, div.visible-img' to close on background click
        close_selectors: '.clearing-close, div.clearing-blackout',

        // Default to the entire li element.
        open_selectors: '',

        // Image will be skipped in carousel.
        skip_selector: '',

        touch_label: '',

        // event initializers and locks
        init: false,
        locked: false
    },

    init: function (scope, method, options) {
        var self = this;
        Foundation.inherit(this, 'throttle image_loaded');

        this.bindings(method, options);

        if (self.S(this.scope).is('[' + this.attr_name() + ']')) {
            this.assemble(self.S('li', this.scope));
        } else {
            self.S('[' + this.attr_name() + ']', this.scope).each(function () {
                self.assemble(self.S('li', this));
            });
        }
    },

    events: function (scope) {
        var self = this,
            S = self.S,
            $scroll_container = $('.scroll-container');

        if ($scroll_container.length > 0) {
            this.scope = $scroll_container;
        }

        S(this.scope)
            .off('.clearing')
            .on('click.fndtn.clearing', 'ul[' + this.attr_name() + '] li ' + this.settings.open_selectors,
            function (e, current, target) {
                var current = current || S(this),
                    target = target || current,
                    next = current.next('li'),
                    settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'),
                    image = S(e.target);

                e.preventDefault();

                if (!settings) {
                    self.init();
                    settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
                }

                // if clearing is open and the current image is
                // clicked, go to the next image in sequence
                if (target.hasClass('visible') &&
                    current[0] === target[0] &&
                    next.length > 0 && self.is_open(current)) {
                    target = next;
                    image = S('img', target);
                }

                // set current and target to the clicked li if not otherwise defined.
                self.open(image, current, target);
                self.update_paddles(target);
            })

            .on('click.fndtn.clearing', '.clearing-main-next',
            function (e) {
                self.nav(e, 'next')
            })
            .on('click.fndtn.clearing', '.clearing-main-prev',
            function (e) {
                self.nav(e, 'prev')
            })
            .on('click.fndtn.clearing', this.settings.close_selectors,
            function (e) {
                Foundation.libs.clearing.close(e, this)
            });

        $(document).on('keydown.fndtn.clearing',
            function (e) {
                self.keydown(e)
            });

        S(window).off('.clearing').on('resize.fndtn.clearing',
            function () {
                self.resize()
            });

        this.swipe_events(scope);
    },

    swipe_events: function (scope) {
        var self = this,
            S = self.S;

        S(this.scope)
            .on('touchstart.fndtn.clearing', '.visible-img', function (e) {
                if (!e.touches) {
                    e = e.originalEvent;
                }
                var data = {
                    start_page_x: e.touches[0].pageX,
                    start_page_y: e.touches[0].pageY,
                    start_time: (new Date()).getTime(),
                    delta_x: 0,
                    is_scrolling: undefined
                };

                S(this).data('swipe-transition', data);
                e.stopPropagation();
            })
            .on('touchmove.fndtn.clearing', '.visible-img', function (e) {
                if (!e.touches) {
                    e = e.originalEvent;
                }
                // Ignore pinch/zoom events
                if (e.touches.length > 1 || e.scale && e.scale !== 1) return;

                var data = S(this).data('swipe-transition');

                if (typeof data === 'undefined') {
                    data = {};
                }

                data.delta_x = e.touches[0].pageX - data.start_page_x;

                if (Foundation.rtl) {
                    data.delta_x = -data.delta_x;
                }

                if (typeof data.is_scrolling === 'undefined') {
                    data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );
                }

                if (!data.is_scrolling && !data.active) {
                    e.preventDefault();
                    var direction = (data.delta_x < 0) ? 'next' : 'prev';
                    data.active = true;
                    self.nav(e, direction);
                }
            })
            .on('touchend.fndtn.clearing', '.visible-img', function (e) {
                S(this).data('swipe-transition', {});
                e.stopPropagation();
            });
    },

    assemble: function ($li) {
        var $el = $li.parent();

        if ($el.parent().hasClass('carousel')) {
            return;
        }

        $el.after('<div id="foundationClearingHolder"></div>');

        var grid = $el.detach(),
            grid_outerHTML = '';

        if (grid[0] == null) {
            return;
        } else {
            grid_outerHTML = grid[0].outerHTML;
        }

        var holder = this.S('#foundationClearingHolder'),
            settings = $el.data(this.attr_name(true) + '-init'),
            data = {
                grid: '<div class="carousel">' + grid_outerHTML + '</div>',
                viewing: settings.templates.viewing
            },
            wrapper = '<div class="clearing-assembled"><div>' + data.viewing +
                data.grid + '</div></div>',
            touch_label = this.settings.touch_label;

        if (Modernizr.touch) {
            wrapper = $(wrapper).find('.clearing-touch-label').html(touch_label).end();
        }

        holder.after(wrapper).remove();
    },

    open: function ($image, current, target) {
        var self = this,
            body = $(document.body),
            root = target.closest('.clearing-assembled'),
            container = self.S('div', root).first(),
            visible_image = self.S('.visible-img', container),
            image = self.S('img', visible_image).not($image),
            label = self.S('.clearing-touch-label', container),
            error = false;

        // Event to disable scrolling on touch devices when Clearing is activated
        $('body').on('touchmove', function (e) {
            e.preventDefault();
        });

        image.error(function () {
            error = true;
        });

        function startLoad() {
            setTimeout(function () {
                this.image_loaded(image, function () {
                    if (image.outerWidth() === 1 && !error) {
                        startLoad.call(this);
                    } else {
                        cb.call(this, image);
                    }
                }.bind(this));
            }.bind(this), 100);
        }

        function cb(image) {
            var $image = $(image);
            $image.css('visibility', 'visible');
            // toggle the gallery
            body.css('overflow', 'hidden');
            root.addClass('clearing-blackout');
            container.addClass('clearing-container');
            visible_image.show();
            this.fix_height(target)
                .caption(self.S('.clearing-caption', visible_image), self.S('img', target))
                .center_and_label(image, label)
                .shift(current, target, function () {
                    target.closest('li').siblings().removeClass('visible');
                    target.closest('li').addClass('visible');
                });
            visible_image.trigger('opened.fndtn.clearing')
        }

        if (!this.locked()) {
            visible_image.trigger('open.fndtn.clearing');
            // set the image to the selected thumbnail
            image
                .attr('src', this.load($image))
                .css('visibility', 'hidden');

            startLoad.call(this);
        }
    },

    close: function (e, el) {
        e.preventDefault();

        var root = (function (target) {
                if (/blackout/.test(target.selector)) {
                    return target;
                } else {
                    return target.closest('.clearing-blackout');
                }
            }($(el))),
            body = $(document.body), container, visible_image;

        if (el === e.target && root) {
            body.css('overflow', '');
            container = $('div', root).first();
            visible_image = $('.visible-img', container);
            visible_image.trigger('close.fndtn.clearing');
            this.settings.prev_index = 0;
            $('ul[' + this.attr_name() + ']', root)
                .attr('style', '').closest('.clearing-blackout')
                .removeClass('clearing-blackout');
            container.removeClass('clearing-container');
            visible_image.hide();
            visible_image.trigger('closed.fndtn.clearing');
        }

        // Event to re-enable scrolling on touch devices
        $('body').off('touchmove');

        return false;
    },

    is_open: function (current) {
        return current.parent().prop('style').length > 0;
    },

    keydown: function (e) {
        var clearing = $('.clearing-blackout ul[' + this.attr_name() + ']'),
            NEXT_KEY = this.rtl ? 37 : 39,
            PREV_KEY = this.rtl ? 39 : 37,
            ESC_KEY = 27;

        if (e.which === NEXT_KEY) this.go(clearing, 'next');
        if (e.which === PREV_KEY) this.go(clearing, 'prev');
        if (e.which === ESC_KEY) this.S('a.clearing-close').trigger('click').trigger('click.fndtn.clearing');
    },

    nav: function (e, direction) {
        var clearing = $('ul[' + this.attr_name() + ']', '.clearing-blackout');

        e.preventDefault();
        this.go(clearing, direction);
    },

    resize: function () {
        var image = $('img', '.clearing-blackout .visible-img'),
            label = $('.clearing-touch-label', '.clearing-blackout');

        if (image.length) {
            this.center_and_label(image, label);
            image.trigger('resized.fndtn.clearing')
        }
    },

    // visual adjustments
    fix_height: function (target) {
        var lis = target.parent().children(),
            self = this;

        lis.each(function () {
            var li = self.S(this),
                image = li.find('img');

            if (li.height() > image.outerHeight()) {
                li.addClass('fix-height');
            }
        })
            .closest('ul')
            .width(lis.length * 100 + '%');

        return this;
    },

    update_paddles: function (target) {
        target = target.closest('li');
        var visible_image = target
            .closest('.carousel')
            .siblings('.visible-img');

        if (target.next().length > 0) {
            this.S('.clearing-main-next', visible_image).removeClass('disabled');
        } else {
            this.S('.clearing-main-next', visible_image).addClass('disabled');
        }

        if (target.prev().length > 0) {
            this.S('.clearing-main-prev', visible_image).removeClass('disabled');
        } else {
            this.S('.clearing-main-prev', visible_image).addClass('disabled');
        }
    },

    center_and_label: function (target, label) {
        if (!this.rtl) {
            target.css({
                marginLeft: -(target.outerWidth() / 2),
                marginTop: -(target.outerHeight() / 2)
            });

            if (label.length > 0) {
                label.css({
                    marginLeft: -(label.outerWidth() / 2),
                    marginTop: -(target.outerHeight() / 2) - label.outerHeight() - 10
                });
            }
        } else {
            target.css({
                marginRight: -(target.outerWidth() / 2),
                marginTop: -(target.outerHeight() / 2),
                left: 'auto',
                right: '50%'
            });

            if (label.length > 0) {
                label.css({
                    marginRight: -(label.outerWidth() / 2),
                    marginTop: -(target.outerHeight() / 2) - label.outerHeight() - 10,
                    left: 'auto',
                    right: '50%'
                });
            }
        }
        return this;
    },

    // image loading and preloading

    load: function ($image) {
        var href;

        if ($image[0].nodeName === 'A') {
            href = $image.attr('href');
        } else {
            href = $image.closest('a').attr('href');
        }

        this.preload($image);

        if (href) return href;
        return $image.attr('src');
    },

    preload: function ($image) {
        this
            .img($image.closest('li').next())
            .img($image.closest('li').prev());
    },

    img: function (img) {
        if (img.length) {
            var new_img = new Image(),
                new_a = this.S('a', img);

            if (new_a.length) {
                new_img.src = new_a.attr('href');
            } else {
                new_img.src = this.S('img', img).attr('src');
            }
        }
        return this;
    },

    // image caption

    caption: function (container, $image) {
        var caption = $image.attr('data-caption');

        if (caption) {
            container
                .html(caption)
                .show();
        } else {
            container
                .text('')
                .hide();
        }
        return this;
    },

    // directional methods

    go: function ($ul, direction) {
        var current = this.S('.visible', $ul),
            target = current[direction]();

        // Check for skip selector.
        if (this.settings.skip_selector && target.find(this.settings.skip_selector).length != 0) {
            target = target[direction]();
        }

        if (target.length) {
            this.S('img', target)
                .trigger('click', [current, target]).trigger('click.fndtn.clearing', [current, target])
                .trigger('change.fndtn.clearing');
        }
    },

    shift: function (current, target, callback) {
        var clearing = target.parent(),
            old_index = this.settings.prev_index || target.index(),
            direction = this.direction(clearing, current, target),
            dir = this.rtl ? 'right' : 'left',
            left = parseInt(clearing.css('left'), 10),
            width = target.outerWidth(),
            skip_shift;

        var dir_obj = {};

        // we use jQuery animate instead of CSS transitions because we
        // need a callback to unlock the next animation
        // needs support for RTL **
        if (target.index() !== old_index && !/skip/.test(direction)) {
            if (/left/.test(direction)) {
                this.lock();
                dir_obj[dir] = left + width;
                clearing.animate(dir_obj, 300, this.unlock());
            } else if (/right/.test(direction)) {
                this.lock();
                dir_obj[dir] = left - width;
                clearing.animate(dir_obj, 300, this.unlock());
            }
        } else if (/skip/.test(direction)) {
            // the target image is not adjacent to the current image, so
            // do we scroll right or not
            skip_shift = target.index() - this.settings.up_count;
            this.lock();

            if (skip_shift > 0) {
                dir_obj[dir] = -(skip_shift * width);
                clearing.animate(dir_obj, 300, this.unlock());
            } else {
                dir_obj[dir] = 0;
                clearing.animate(dir_obj, 300, this.unlock());
            }
        }

        callback();
    },

    direction: function ($el, current, target) {
        var lis = this.S('li', $el),
            li_width = lis.outerWidth() + (lis.outerWidth() / 4),
            up_count = Math.floor(this.S('.clearing-container').outerWidth() / li_width) - 1,
            target_index = lis.index(target),
            response;

        this.settings.up_count = up_count;

        if (this.adjacent(this.settings.prev_index, target_index)) {
            if ((target_index > up_count) && target_index > this.settings.prev_index) {
                response = 'right';
            } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) {
                response = 'left';
            } else {
                response = false;
            }
        } else {
            response = 'skip';
        }

        this.settings.prev_index = target_index;

        return response;
    },

    adjacent: function (current_index, target_index) {
        for (var i = target_index + 1; i >= target_index - 1; i--) {
            if (i === current_index) return true;
        }
        return false;
    },

    // lock management

    lock: function () {
        this.settings.locked = true;
    },

    unlock: function () {
        this.settings.locked = false;
    },

    locked: function () {
        return this.settings.locked;
    },

    off: function () {
        this.S(this.scope).off('.fndtn.clearing');
        this.S(window).off('.fndtn.clearing');
    },

    reflow: function () {
        this.init();
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

var noop = function () {
};

var Orbit = function (el, settings) {
    // Don't reinitialize plugin
    if (el.hasClass(settings.slides_container_class)) {
        return this;
    }

    var self = this,
        container,
        slides_container = el,
        number_container,
        bullets_container,
        timer_container,
        idx = 0,
        animate,
        timer,
        locked = false,
        adjust_height_after = false;

    self.slides = function () {
        return slides_container.children(settings.slide_selector);
    };

    self.slides().first().addClass(settings.active_slide_class);

    self.update_slide_number = function (index) {
        if (settings.slide_number) {
            number_container.find('span:first').text(parseInt(index) + 1);
            number_container.find('span:last').text(self.slides().length);
        }
        if (settings.bullets) {
            bullets_container.children().removeClass(settings.bullets_active_class);
            $(bullets_container.children().get(index)).addClass(settings.bullets_active_class);
        }
    };

    self.update_active_link = function (index) {
        var link = $('[data-orbit-link="' + self.slides().eq(index).attr('data-orbit-slide') + '"]');
        link.siblings().removeClass(settings.bullets_active_class);
        link.addClass(settings.bullets_active_class);
    };

    self.build_markup = function () {
        slides_container.wrap('<div class="' + settings.container_class + '"></div>');
        container = slides_container.parent();
        slides_container.addClass(settings.slides_container_class);

        if (settings.stack_on_small) {
            container.addClass(settings.stack_on_small_class);
        }

        if (settings.navigation_arrows) {
            container.append($('<a href="#"><span></span></a>').addClass(settings.prev_class));
            container.append($('<a href="#"><span></span></a>').addClass(settings.next_class));
        }

        if (settings.timer) {
            timer_container = $('<div>').addClass(settings.timer_container_class);
            timer_container.append('<span>');
            timer_container.append($('<div>').addClass(settings.timer_progress_class));
            timer_container.addClass(settings.timer_paused_class);
            container.append(timer_container);
        }

        if (settings.slide_number) {
            number_container = $('<div>').addClass(settings.slide_number_class);
            number_container.append('<span></span> ' + settings.slide_number_text + ' <span></span>');
            container.append(number_container);
        }

        if (settings.bullets) {
            bullets_container = $('<ol>').addClass(settings.bullets_container_class);
            container.append(bullets_container);
            bullets_container.wrap('<div class="orbit-bullets-container"></div>');
            self.slides().each(function (idx, el) {
                var bullet = $('<li>').attr('data-orbit-slide', idx).on('click', self.link_bullet);
                ;
                bullets_container.append(bullet);
            });
        }

    };

    self._goto = function (next_idx, start_timer) {
        // if (locked) {return false;}
        if (next_idx === idx) {
            return false;
        }
        if (typeof timer === 'object') {
            timer.restart();
        }
        var slides = self.slides();

        var dir = 'next';
        locked = true;
        if (next_idx < idx) {
            dir = 'prev';
        }
        if (next_idx >= slides.length) {
            if (!settings.circular) return false;
            next_idx = 0;
        } else if (next_idx < 0) {
            if (!settings.circular) return false;
            next_idx = slides.length - 1;
        }

        var current = $(slides.get(idx));
        var next = $(slides.get(next_idx));

        current.css('zIndex', 2);
        current.removeClass(settings.active_slide_class);
        next.css('zIndex', 4).addClass(settings.active_slide_class);

        slides_container.trigger('before-slide-change.fndtn.orbit');
        settings.before_slide_change();
        self.update_active_link(next_idx);

        var callback = function () {
            var unlock = function () {
                idx = next_idx;
                locked = false;
                if (start_timer === true) {
                    timer = self.create_timer();
                    timer.start();
                }
                self.update_slide_number(idx);
                slides_container.trigger('after-slide-change.fndtn.orbit', [{
                    slide_number: idx,
                    total_slides: slides.length
                }]);
                settings.after_slide_change(idx, slides.length);
            };
            if (slides_container.height() != next.height() && settings.variable_height) {
                slides_container.animate({'height': next.height()}, 250, 'linear', unlock);
            } else {
                unlock();
            }
        };

        if (slides.length === 1) {
            callback();
            return false;
        }

        var start_animation = function () {
            if (dir === 'next') {
                animate.next(current, next, callback);
            }
            if (dir === 'prev') {
                animate.prev(current, next, callback);
            }
        };

        if (next.height() > slides_container.height() && settings.variable_height) {
            slides_container.animate({'height': next.height()}, 250, 'linear', start_animation);
        } else {
            start_animation();
        }
    };

    self.next = function (e) {
        e.stopImmediatePropagation();
        e.preventDefault();
        self._goto(idx + 1);
    };

    self.prev = function (e) {
        e.stopImmediatePropagation();
        e.preventDefault();
        self._goto(idx - 1);
    };

    self.link_custom = function (e) {
        e.preventDefault();
        var link = $(this).attr('data-orbit-link');
        if ((typeof link === 'string') && (link = $.trim(link)) != '') {
            var slide = container.find('[data-orbit-slide=' + link + ']');
            if (slide.index() != -1) {
                self._goto(slide.index());
            }
        }
    };

    self.link_bullet = function (e) {
        var index = $(this).attr('data-orbit-slide');
        if ((typeof index === 'string') && (index = $.trim(index)) != '') {
            if (isNaN(parseInt(index))) {
                var slide = container.find('[data-orbit-slide=' + index + ']');
                if (slide.index() != -1) {
                    self._goto(slide.index() + 1);
                }
            }
            else {
                self._goto(parseInt(index));
            }
        }

    }

    self.timer_callback = function () {
        self._goto(idx + 1, true);
    }

    self.compute_dimensions = function () {
        var current = $(self.slides().get(idx));
        var h = current.height();
        if (!settings.variable_height) {
            self.slides().each(function () {
                if ($(this).height() > h) {
                    h = $(this).height();
                }
            });
        }
        slides_container.height(h);
    };

    self.create_timer = function () {
        var t = new Timer(
            container.find('.' + settings.timer_container_class),
            settings,
            self.timer_callback
        );
        return t;
    };

    self.stop_timer = function () {
        if (typeof timer === 'object') timer.stop();
    };

    self.toggle_timer = function () {
        var t = container.find('.' + settings.timer_container_class);
        if (t.hasClass(settings.timer_paused_class)) {
            if (typeof timer === 'undefined') {
                timer = self.create_timer();
            }
            timer.start();
        }
        else {
            if (typeof timer === 'object') {
                timer.stop();
            }
        }
    };

    self.init = function () {
        self.build_markup();
        if (settings.timer) {
            timer = self.create_timer();
            Foundation.utils.image_loaded(this.slides().children('img'), timer.start);
        }
        animate = new FadeAnimation(settings, slides_container);
        if (settings.animation === 'slide')
            animate = new SlideAnimation(settings, slides_container);

        container.on('click', '.' + settings.next_class, self.next);
        container.on('click', '.' + settings.prev_class, self.prev);

        if (settings.next_on_click) {
            container.on('click', '.' + settings.slides_container_class + ' [data-orbit-slide]', self.link_bullet);
        }

        container.on('click', self.toggle_timer);
        if (settings.swipe) {
            container.on('touchstart.fndtn.orbit', 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
                };
                container.data('swipe-transition', data);
                e.stopPropagation();
            })
                .on('touchmove.fndtn.orbit', 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 = container.data('swipe-transition');
                    if (typeof data === 'undefined') {
                        data = {};
                    }

                    data.delta_x = e.touches[0].pageX - data.start_page_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) ? (idx + 1) : (idx - 1);
                        data.active = true;
                        self._goto(direction);
                    }
                })
                .on('touchend.fndtn.orbit', function (e) {
                    container.data('swipe-transition', {});
                    e.stopPropagation();
                })
        }
        container.on('mouseenter.fndtn.orbit', function (e) {
            if (settings.timer && settings.pause_on_hover) {
                self.stop_timer();
            }
        })
            .on('mouseleave.fndtn.orbit', function (e) {
                if (settings.timer && settings.resume_on_mouseout) {
                    timer.start();
                }
            });

        $(document).on('click', '[data-orbit-link]', self.link_custom);
        $(window).on('load resize', self.compute_dimensions);
        Foundation.utils.image_loaded(this.slides().children('img'), self.compute_dimensions);
        Foundation.utils.image_loaded(this.slides().children('img'), function () {
            container.prev('.' + settings.preloader_class).css('display', 'none');
            self.update_slide_number(0);
            self.update_active_link(0);
            slides_container.trigger('ready.fndtn.orbit');
        });
    };

    self.init();
};

var Timer = function (el, settings, callback) {
    var self = this,
        duration = settings.timer_speed,
        progress = el.find('.' + settings.timer_progress_class),
        start,
        timeout,
        left = -1;

    this.update_progress = function (w) {
        var new_progress = progress.clone();
        new_progress.attr('style', '');
        new_progress.css('width', w + '%');
        progress.replaceWith(new_progress);
        progress = new_progress;
    };

    this.restart = function () {
        clearTimeout(timeout);
        el.addClass(settings.timer_paused_class);
        left = -1;
        self.update_progress(0);
    };

    this.start = function () {
        if (!el.hasClass(settings.timer_paused_class)) {
            return true;
        }
        left = (left === -1) ? duration : left;
        el.removeClass(settings.timer_paused_class);
        start = new Date().getTime();
        progress.animate({'width': '100%'}, left, 'linear');
        timeout = setTimeout(function () {
            self.restart();
            callback();
        }, left);
        el.trigger('timer-started.fndtn.orbit')
    };

    this.stop = function () {
        if (el.hasClass(settings.timer_paused_class)) {
            return true;
        }
        clearTimeout(timeout);
        el.addClass(settings.timer_paused_class);
        var end = new Date().getTime();
        left = left - (end - start);
        var w = 100 - ((left / duration) * 100);
        self.update_progress(w);
        el.trigger('timer-stopped.fndtn.orbit');
    };
};

var SlideAnimation = function (settings, container) {
    var duration = settings.animation_speed;
    var is_rtl = ($('html[dir=rtl]').length === 1);
    var margin = is_rtl ? 'marginRight' : 'marginLeft';
    var animMargin = {};
    animMargin[margin] = '0%';

    this.next = function (current, next, callback) {
        current.animate({marginLeft: '-100%'}, duration);
        next.animate(animMargin, duration, function () {
            current.css(margin, '100%');
            callback();
        });
    };

    this.prev = function (current, prev, callback) {
        current.animate({marginLeft: '100%'}, duration);
        prev.css(margin, '-100%');
        prev.animate(animMargin, duration, function () {
            current.css(margin, '100%');
            callback();
        });
    };
};

var FadeAnimation = function (settings, container) {
    var duration = settings.animation_speed;
    var is_rtl = ($('html[dir=rtl]').length === 1);
    var margin = is_rtl ? 'marginRight' : 'marginLeft';

    this.next = function (current, next, callback) {
        next.css({'margin': '0%', 'opacity': '0.01'});
        next.animate({'opacity': '1'}, duration, 'linear', function () {
            current.css('margin', '100%');
            callback();
        });
    };

    this.prev = function (current, prev, callback) {
        prev.css({'margin': '0%', 'opacity': '0.01'});
        prev.animate({'opacity': '1'}, duration, 'linear', function () {
            current.css('margin', '100%');
            callback();
        });
    };
};

Foundation.libs = Foundation.libs || {};

Foundation.libs.orbit = {
    name: 'orbit',

    version: '5.5.0',

    settings: {
        animation: 'slide',
        timer_speed: 10000,
        pause_on_hover: true,
        resume_on_mouseout: false,
        next_on_click: true,
        animation_speed: 500,
        stack_on_small: false,
        navigation_arrows: true,
        slide_number: true,
        slide_number_text: 'of',
        container_class: 'orbit-container',
        stack_on_small_class: 'orbit-stack-on-small',
        next_class: 'orbit-next',
        prev_class: 'orbit-prev',
        timer_container_class: 'orbit-timer',
        timer_paused_class: 'paused',
        timer_progress_class: 'orbit-progress',
        slides_container_class: 'orbit-slides-container',
        preloader_class: 'preloader',
        slide_selector: '*',
        bullets_container_class: 'orbit-bullets',
        bullets_active_class: 'active',
        slide_number_class: 'orbit-slide-number',
        caption_class: 'orbit-caption',
        active_slide_class: 'active',
        orbit_transition_class: 'orbit-transitioning',
        bullets: true,
        circular: true,
        timer: true,
        variable_height: false,
        swipe: true,
        before_slide_change: noop,
        after_slide_change: noop
    },

    init: function (scope, method, options) {
        var self = this;
        this.bindings(method, options);
    },

    events: function (instance) {
        var orbit_instance = new Orbit(this.S(instance), this.S(instance).data('orbit-init'));
        this.S(instance).data(this.name + '-instance', orbit_instance);
    },

    reflow: function () {
        var self = this;

        if (self.S(self.scope).is('[data-orbit]')) {
            var $el = self.S(self.scope);
            var instance = $el.data(self.name + '-instance');
            instance.compute_dimensions();
        } else {
            self.S('[data-orbit]', self.scope).each(function (idx, el) {
                var $el = self.S(el);
                var opts = self.data_options($el);
                var instance = $el.data(self.name + '-instance');
                instance.compute_dimensions();
            });
        }
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.offcanvas = {
    name: 'offcanvas',

    version: '5.5.0',

    settings: {
        open_method: 'move',
        close_on_click: false
    },

    init: function (scope, method, options) {
        this.bindings(method, options);
    },

    events: function () {
        var self = this,
            S = self.S,
            move_class = '',
            right_postfix = '',
            left_postfix = '';

        if (this.settings.open_method === 'move') {
            move_class = 'move-';
            right_postfix = 'right';
            left_postfix = 'left';
        } else if (this.settings.open_method === 'overlap_single') {
            move_class = 'offcanvas-overlap-';
            right_postfix = 'right';
            left_postfix = 'left';
        } else if (this.settings.open_method === 'overlap') {
            move_class = 'offcanvas-overlap';
        }

        S(this.scope).off('.offcanvas')
            .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) {
                self.click_toggle_class(e, move_class + right_postfix);
                if (self.settings.open_method !== 'overlap') {
                    S('.left-submenu').removeClass(move_class + right_postfix);
                }
                $('.left-off-canvas-toggle').attr('aria-expanded', 'true');
            })
            .on('click.fndtn.offcanvas', '.left-off-canvas-menu a', function (e) {
                var settings = self.get_settings(e);
                var parent = S(this).parent();

                if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) {
                    self.hide.call(self, move_class + right_postfix, self.get_wrapper(e));
                    parent.parent().removeClass(move_class + right_postfix);
                } else if (S(this).parent().hasClass('has-submenu')) {
                    e.preventDefault();
                    S(this).siblings('.left-submenu').toggleClass(move_class + right_postfix);
                } else if (parent.hasClass('back')) {
                    e.preventDefault();
                    parent.parent().removeClass(move_class + right_postfix);
                }
                $('.left-off-canvas-toggle').attr('aria-expanded', 'true');
            })
            .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) {
                self.click_toggle_class(e, move_class + left_postfix);
                if (self.settings.open_method !== 'overlap') {
                    S('.right-submenu').removeClass(move_class + left_postfix);
                }
                $('.right-off-canvas-toggle').attr('aria-expanded', 'true');
            })
            .on('click.fndtn.offcanvas', '.right-off-canvas-menu a', function (e) {
                var settings = self.get_settings(e);
                var parent = S(this).parent();

                if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) {
                    self.hide.call(self, move_class + left_postfix, self.get_wrapper(e));
                    parent.parent().removeClass(move_class + left_postfix);
                } else if (S(this).parent().hasClass('has-submenu')) {
                    e.preventDefault();
                    S(this).siblings('.right-submenu').toggleClass(move_class + left_postfix);
                } else if (parent.hasClass('back')) {
                    e.preventDefault();
                    parent.parent().removeClass(move_class + left_postfix);
                }
                $('.right-off-canvas-toggle').attr('aria-expanded', 'true');
            })
            .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) {
                self.click_remove_class(e, move_class + left_postfix);
                S('.right-submenu').removeClass(move_class + left_postfix);
                if (right_postfix) {
                    self.click_remove_class(e, move_class + right_postfix);
                    S('.left-submenu').removeClass(move_class + left_postfix);
                }
                $('.right-off-canvas-toggle').attr('aria-expanded', 'true');
            })
            .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) {
                self.click_remove_class(e, move_class + left_postfix);
                $('.left-off-canvas-toggle').attr('aria-expanded', 'false');
                if (right_postfix) {
                    self.click_remove_class(e, move_class + right_postfix);
                    $('.right-off-canvas-toggle').attr('aria-expanded', 'false');
                }
            });
    },

    toggle: function (class_name, $off_canvas) {
        $off_canvas = $off_canvas || this.get_wrapper();
        if ($off_canvas.is('.' + class_name)) {
            this.hide(class_name, $off_canvas);
        } else {
            this.show(class_name, $off_canvas);
        }
    },

    show: function (class_name, $off_canvas) {
        $off_canvas = $off_canvas || this.get_wrapper();
        $off_canvas.trigger('open').trigger('open.fndtn.offcanvas');
        $off_canvas.addClass(class_name);
    },

    hide: function (class_name, $off_canvas) {
        $off_canvas = $off_canvas || this.get_wrapper();
        $off_canvas.trigger('close').trigger('close.fndtn.offcanvas');
        $off_canvas.removeClass(class_name);
    },

    click_toggle_class: function (e, class_name) {
        e.preventDefault();
        var $off_canvas = this.get_wrapper(e);
        this.toggle(class_name, $off_canvas);
    },

    click_remove_class: function (e, class_name) {
        e.preventDefault();
        var $off_canvas = this.get_wrapper(e);
        this.hide(class_name, $off_canvas);
    },

    get_settings: function (e) {
        var offcanvas = this.S(e.target).closest('[' + this.attr_name() + ']');
        return offcanvas.data(this.attr_name(true) + '-init') || this.settings;
    },

    get_wrapper: function (e) {
        var $off_canvas = this.S(e ? e.target : this.scope).closest('.off-canvas-wrap');

        if ($off_canvas.length === 0) {
            $off_canvas = this.S('.off-canvas-wrap');
        }
        return $off_canvas;
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.alert = {
    name: 'alert',

    version: '5.5.0',

    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').trigger('close.fndtn.alert').remove();
                    settings.callback();
                });
            } else {
                alertBox.fadeOut(300, function () {
                    S(this).trigger('close').trigger('close.fndtn.alert').remove();
                    settings.callback();
                });
            }
        });
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.reveal = {
    name: 'reveal',

    version: '5.5.0',

    locked: false,

    settings: {
        animation: 'fadeAndPop',
        animation_speed: 250,
        close_on_background_click: true,
        close_on_esc: true,
        dismiss_modal_class: 'close-reveal-modal',
        bg_class: 'reveal-modal-bg',
        bg_root_element: 'body',
        root_element: 'body',
        open: function () {
        },
        opened: function () {
        },
        close: function () {
        },
        closed: function () {
        },
        bg: $('.reveal-modal-bg'),
        css: {
            open: {
                'opacity': 0,
                'visibility': 'visible',
                'display': 'block'
            },
            close: {
                'opacity': 1,
                'visibility': 'hidden',
                'display': 'none'
            }
        }
    },

    init: function (scope, method, options) {
        $.extend(true, this.settings, method, options);
        this.bindings(method, options);
    },

    events: function (scope) {
        var self = this,
            S = self.S;

        S(this.scope)
            .off('.reveal')
            .on('click.fndtn.reveal', '[' + this.add_namespace('data-reveal-id') + ']:not([disabled])', function (e) {
                e.preventDefault();

                if (!self.locked) {
                    var element = S(this),
                        ajax = element.data(self.data_attr('reveal-ajax'));

                    self.locked = true;

                    if (typeof ajax === 'undefined') {
                        self.open.call(self, element);
                    } else {
                        var url = ajax === true ? element.attr('href') : ajax;

                        self.open.call(self, element, {url: url});
                    }
                }
            });

        S(document)
            .on('click.fndtn.reveal', this.close_targets(), function (e) {

                e.preventDefault();

                if (!self.locked) {
                    var settings = S('[' + self.attr_name() + '].open').data(self.attr_name(true) + '-init') || self.settings,
                        bg_clicked = S(e.target)[0] === S('.' + settings.bg_class)[0];

                    if (bg_clicked) {
                        if (settings.close_on_background_click) {
                            e.stopPropagation();
                        } else {
                            return;
                        }
                    }

                    self.locked = true;
                    self.close.call(self, bg_clicked ? S('[' + self.attr_name() + '].open') : S(this).closest('[' + self.attr_name() + ']'));
                }
            });

        if (S('[' + self.attr_name() + ']', this.scope).length > 0) {
            S(this.scope)
                // .off('.reveal')
                .on('open.fndtn.reveal', this.settings.open)
                .on('opened.fndtn.reveal', this.settings.opened)
                .on('opened.fndtn.reveal', this.open_video)
                .on('close.fndtn.reveal', this.settings.close)
                .on('closed.fndtn.reveal', this.settings.closed)
                .on('closed.fndtn.reveal', this.close_video);
        } else {
            S(this.scope)
                // .off('.reveal')
                .on('open.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.open)
                .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.opened)
                .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.open_video)
                .on('close.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.close)
                .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.closed)
                .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.close_video);
        }

        return true;
    },

    // PATCH #3: turning on key up capture only when a reveal window is open
    key_up_on: function (scope) {
        var self = this;

        // PATCH #1: fixing multiple keyup event trigger from single key press
        self.S('body').off('keyup.fndtn.reveal').on('keyup.fndtn.reveal', function (event) {
            var open_modal = self.S('[' + self.attr_name() + '].open'),
                settings = open_modal.data(self.attr_name(true) + '-init') || self.settings;
            // PATCH #2: making sure that the close event can be called only while unlocked,
            //           so that multiple keyup.fndtn.reveal events don't prevent clean closing of the reveal window.
            if (settings && event.which === 27 && settings.close_on_esc && !self.locked) { // 27 is the keycode for the Escape key
                self.close.call(self, open_modal);
            }
        });

        return true;
    },

    // PATCH #3: turning on key up capture only when a reveal window is open
    key_up_off: function (scope) {
        this.S('body').off('keyup.fndtn.reveal');
        return true;
    },

    open: function (target, ajax_settings) {
        var self = this,
            modal;

        if (target) {
            if (typeof target.selector !== 'undefined') {
                // Find the named node; only use the first one found, since the rest of the code assumes there's only one node
                modal = self.S('#' + target.data(self.data_attr('reveal-id'))).first();
            } else {
                modal = self.S(this.scope);

                ajax_settings = target;
            }
        } else {
            modal = self.S(this.scope);
        }

        var settings = modal.data(self.attr_name(true) + '-init');
        settings = settings || this.settings;

        if (modal.hasClass('open') && target.attr('data-reveal-id') == modal.attr('id')) {
            return self.close(modal);
        }

        if (!modal.hasClass('open')) {
            var open_modal = self.S('[' + self.attr_name() + '].open');

            if (typeof modal.data('css-top') === 'undefined') {
                modal.data('css-top', parseInt(modal.css('top'), 10))
                    .data('offset', this.cache_offset(modal));
            }

            this.key_up_on(modal);    // PATCH #3: turning on key up capture only when a reveal window is open
            modal.trigger('open').trigger('open.fndtn.reveal');

            if (open_modal.length < 1) {
                this.toggle_bg(modal, true);
            }

            if (typeof ajax_settings === 'string') {
                ajax_settings = {
                    url: ajax_settings
                };
            }

            if (typeof ajax_settings === 'undefined' || !ajax_settings.url) {
                if (open_modal.length > 0) {
                    this.hide(open_modal, settings.css.close);
                }

                this.show(modal, settings.css.open);
            } else {
                var old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null;

                $.extend(ajax_settings, {
                    success: function (data, textStatus, jqXHR) {
                        if ($.isFunction(old_success)) {
                            var result = old_success(data, textStatus, jqXHR);
                            if (typeof result == 'string') data = result;
                        }

                        modal.html(data);
                        self.S(modal).foundation('section', 'reflow');
                        self.S(modal).children().foundation();

                        if (open_modal.length > 0) {
                            self.hide(open_modal, settings.css.close);
                        }
                        self.show(modal, settings.css.open);
                    }
                });

                $.ajax(ajax_settings);
            }
        }
        self.S(window).trigger('resize');
    },

    close: function (modal) {
        var modal = modal && modal.length ? modal : this.S(this.scope),
            open_modals = this.S('[' + this.attr_name() + '].open'),
            settings = modal.data(this.attr_name(true) + '-init') || this.settings;

        if (open_modals.length > 0) {
            this.locked = true;
            this.key_up_off(modal);   // PATCH #3: turning on key up capture only when a reveal window is open
            modal.trigger('close').trigger('close.fndtn.reveal');
            this.toggle_bg(modal, false);
            this.hide(open_modals, settings.css.close, settings);
        }
    },

    close_targets: function () {
        var base = '.' + this.settings.dismiss_modal_class;

        if (this.settings.close_on_background_click) {
            return base + ', .' + this.settings.bg_class;
        }

        return base;
    },

    toggle_bg: function (el, modal, state) {
        var settings = el.data(this.attr_name(true) + '-init') || this.settings,
            bg_root_element = settings.bg_root_element; // Adding option to specify the background root element fixes scrolling issue

        if (this.S('.' + this.settings.bg_class).length === 0) {
            this.settings.bg = $('<div />', {'class': this.settings.bg_class})
                .appendTo(bg_root_element).hide();
        }

        var visible = this.settings.bg.filter(':visible').length > 0;
        if (state != visible) {
            if (state == undefined ? visible : !state) {
                this.hide(this.settings.bg);
            } else {
                this.show(this.settings.bg);
            }
        }
    },

    show: function (el, css) {
        // is modal
        if (css) {
            var settings = el.data(this.attr_name(true) + '-init') || this.settings,
                root_element = settings.root_element;

            if (el.parent(root_element).length === 0) {
                var placeholder = el.wrap('<div style="display: none;" />').parent();

                el.on('closed.fndtn.reveal.wrapped', function () {
                    el.detach().appendTo(placeholder);
                    el.unwrap().unbind('closed.fndtn.reveal.wrapped');
                });

                el.detach().appendTo(root_element);
            }

            var animData = getAnimationData(settings.animation);
            if (!animData.animate) {
                this.locked = false;
            }
            if (animData.pop) {
                css.top = $(root_element).scrollTop() - el.data('offset') + 'px'; //adding root_element instead of window for scrolling offset if modal trigger is below the fold
                var end_css = {
                    top: $(root_element).scrollTop() + el.data('css-top') + 'px', //adding root_element instead of window for scrolling offset if modal trigger is below the fold
                    opacity: 1
                };

                return setTimeout(function () {
                    return el
                        .css(css)
                        .animate(end_css, settings.animation_speed, 'linear', function () {
                            this.locked = false;
                            el.trigger('opened').trigger('opened.fndtn.reveal');
                        }.bind(this))
                        .addClass('open');
                }.bind(this), settings.animation_speed / 2);
            }

            if (animData.fade) {
                css.top = $(root_element).scrollTop() + el.data('css-top') + 'px'; //adding root_element instead of window for scrolling offset if modal trigger is below the fold
                var end_css = {opacity: 1};

                return setTimeout(function () {
                    return el
                        .css(css)
                        .animate(end_css, settings.animation_speed, 'linear', function () {
                            this.locked = false;
                            el.trigger('opened').trigger('opened.fndtn.reveal');
                        }.bind(this))
                        .addClass('open');
                }.bind(this), settings.animation_speed / 2);
            }

            return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened').trigger('opened.fndtn.reveal');
        }

        var settings = this.settings;

        // should we animate the background?
        if (getAnimationData(settings.animation).fade) {
            return el.fadeIn(settings.animation_speed / 2);
        }

        this.locked = false;

        return el.show();
    },

    hide: function (el, css) {
        // is modal
        if (css) {
            var settings = el.data(this.attr_name(true) + '-init') || this.settings,
                root_element = settings.root_element;

            var animData = getAnimationData(settings.animation);
            if (!animData.animate) {
                this.locked = false;
            }
            if (animData.pop) {
                var end_css = {
                    top: -$(root_element).scrollTop() - el.data('offset') + 'px', //adding root_element instead of window for scrolling offset if modal trigger is below the fold
                    opacity: 0
                };

                return setTimeout(function () {
                    return el
                        .animate(end_css, settings.animation_speed, 'linear', function () {
                            this.locked = false;
                            el.css(css).trigger('closed').trigger('closed.fndtn.reveal');
                        }.bind(this))
                        .removeClass('open');
                }.bind(this), settings.animation_speed / 2);
            }

            if (animData.fade) {
                var end_css = {opacity: 0};

                return setTimeout(function () {
                    return el
                        .animate(end_css, settings.animation_speed, 'linear', function () {
                            this.locked = false;
                            el.css(css).trigger('closed').trigger('closed.fndtn.reveal');
                        }.bind(this))
                        .removeClass('open');
                }.bind(this), settings.animation_speed / 2);
            }

            return el.hide().css(css).removeClass('open').trigger('closed').trigger('closed.fndtn.reveal');
        }

        var settings = this.settings;

        // should we animate the background?
        if (getAnimationData(settings.animation).fade) {
            return el.fadeOut(settings.animation_speed / 2);
        }

        return el.hide();
    },

    close_video: function (e) {
        var video = $('.flex-video', e.target),
            iframe = $('iframe', video);

        if (iframe.length > 0) {
            iframe.attr('data-src', iframe[0].src);
            iframe.attr('src', iframe.attr('src'));
            video.hide();
        }
    },

    open_video: function (e) {
        var video = $('.flex-video', e.target),
            iframe = video.find('iframe');

        if (iframe.length > 0) {
            var data_src = iframe.attr('data-src');
            if (typeof data_src === 'string') {
                iframe[0].src = iframe.attr('data-src');
            } else {
                var src = iframe[0].src;
                iframe[0].src = undefined;
                iframe[0].src = src;
            }
            video.show();
        }
    },

    data_attr: function (str) {
        if (this.namespace.length > 0) {
            return this.namespace + '-' + str;
        }

        return str;
    },

    cache_offset: function (modal) {
        var offset = modal.show().height() + parseInt(modal.css('top'), 10);

        modal.hide();

        return offset;
    },

    off: function () {
        $(this.scope).off('.fndtn.reveal');
    },

    reflow: function () {
    }
};

/*
 * getAnimationData('popAndFade') // {animate: true,  pop: true,  fade: true}
 * getAnimationData('fade')       // {animate: true,  pop: false, fade: true}
 * getAnimationData('pop')        // {animate: true,  pop: true,  fade: false}
 * getAnimationData('foo')        // {animate: false, pop: false, fade: false}
 * getAnimationData(null)         // {animate: false, pop: false, fade: false}
 */
function getAnimationData(str) {
    var fade = /fade/i.test(str);
    var pop = /pop/i.test(str);
    return {
        animate: fade || pop,
        pop: pop,
        fade: fade
    };
}

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.interchange = {
    name: 'interchange',

    version: '5.5.0',

    cache: {},

    images_loaded: false,
    nodes_loaded: false,

    settings: {
        load_attr: 'interchange',

        named_queries: {
            'default': 'only screen',
            'small': Foundation.media_queries['small'],
            'small-only': Foundation.media_queries['small-only'],
            'medium': Foundation.media_queries['medium'],
            'medium-only': Foundation.media_queries['medium-only'],
            'large': Foundation.media_queries['large'],
            'large-only': Foundation.media_queries['large-only'],
            'xlarge': Foundation.media_queries['xlarge'],
            'xlarge-only': Foundation.media_queries['xlarge-only'],
            'xxlarge': Foundation.media_queries['xxlarge'],
            '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)'
        },

        directives: {
            replace: function (el, path, trigger) {
                // The trigger argument, if called within the directive, fires
                // an event named after the directive on the element, passing
                // any parameters along to the event that you pass to trigger.
                //
                // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c)
                //
                // This allows you to bind a callback like so:
                // $('#interchangeContainer').on('replace', function (e, a, b, c) {
                //   console.log($(this).html(), a, b, c);
                // });

                if (/IMG/.test(el[0].nodeName)) {
                    var orig_path = el[0].src;

                    if (new RegExp(path, 'i').test(orig_path)) return;

                    el[0].src = path;

                    return trigger(el[0].src);
                }
                var last_path = el.data(this.data_attr + '-last-path'),
                    self = this;

                if (last_path == path) return;

                if (/\.(gif|jpg|jpeg|tiff|png)([?#].*)?/i.test(path)) {
                    $(el).css('background-image', 'url(' + path + ')');
                    el.data('interchange-last-path', path);
                    return trigger(path);
                }

                return $.get(path, function (response) {
                    el.html(response);
                    el.data(self.data_attr + '-last-path', path);
                    trigger();
                });

            }
        }
    },

    init: function (scope, method, options) {
        Foundation.inherit(this, 'throttle random_str');

        this.data_attr = this.set_data_attr();
        $.extend(true, this.settings, method, options);
        this.bindings(method, options);
        this.load('images');
        this.load('nodes');
    },

    get_media_hash: function () {
        var mediaHash = '';
        for (var queryName in this.settings.named_queries) {
            mediaHash += matchMedia(this.settings.named_queries[queryName]).matches.toString();
        }
        return mediaHash;
    },

    events: function () {
        var self = this, prevMediaHash;

        $(window)
            .off('.interchange')
            .on('resize.fndtn.interchange', self.throttle(function () {
                var currMediaHash = self.get_media_hash();
                if (currMediaHash !== prevMediaHash) {
                    self.resize();
                }
                prevMediaHash = currMediaHash;
            }, 50));

        return this;
    },

    resize: function () {
        var cache = this.cache;

        if (!this.images_loaded || !this.nodes_loaded) {
            setTimeout($.proxy(this.resize, this), 50);
            return;
        }

        for (var uuid in cache) {
            if (cache.hasOwnProperty(uuid)) {
                var passed = this.results(uuid, cache[uuid]);

                if (passed) {
                    this.settings.directives[passed
                        .scenario[1]].call(this, passed.el, passed.scenario[0], function () {
                            if (arguments[0] instanceof Array) {
                                var args = arguments[0];
                            } else {
                                var args = Array.prototype.slice.call(arguments, 0);
                            }

                            passed.el.trigger(passed.scenario[1], args);
                        });
                }
            }
        }

    },

    results: function (uuid, scenarios) {
        var count = scenarios.length;

        if (count > 0) {
            var el = this.S('[' + this.add_namespace('data-uuid') + '="' + uuid + '"]');

            while (count--) {
                var mq, rule = scenarios[count][2];
                if (this.settings.named_queries.hasOwnProperty(rule)) {
                    mq = matchMedia(this.settings.named_queries[rule]);
                } else {
                    mq = matchMedia(rule);
                }
                if (mq.matches) {
                    return {el: el, scenario: scenarios[count]};
                }
            }
        }

        return false;
    },

    load: function (type, force_update) {
        if (typeof this['cached_' + type] === 'undefined' || force_update) {
            this['update_' + type]();
        }

        return this['cached_' + type];
    },

    update_images: function () {
        var images = this.S('img[' + this.data_attr + ']'),
            count = images.length,
            i = count,
            loaded_count = 0,
            data_attr = this.data_attr;

        this.cache = {};
        this.cached_images = [];
        this.images_loaded = (count === 0);

        while (i--) {
            loaded_count++;
            if (images[i]) {
                var str = images[i].getAttribute(data_attr) || '';

                if (str.length > 0) {
                    this.cached_images.push(images[i]);
                }
            }

            if (loaded_count === count) {
                this.images_loaded = true;
                this.enhance('images');
            }
        }

        return this;
    },

    update_nodes: function () {
        var nodes = this.S('[' + this.data_attr + ']').not('img'),
            count = nodes.length,
            i = count,
            loaded_count = 0,
            data_attr = this.data_attr;

        this.cached_nodes = [];
        this.nodes_loaded = (count === 0);

        while (i--) {
            loaded_count++;
            var str = nodes[i].getAttribute(data_attr) || '';

            if (str.length > 0) {
                this.cached_nodes.push(nodes[i]);
            }

            if (loaded_count === count) {
                this.nodes_loaded = true;
                this.enhance('nodes');
            }
        }

        return this;
    },

    enhance: function (type) {
        var i = this['cached_' + type].length;

        while (i--) {
            this.object($(this['cached_' + type][i]));
        }

        return $(window).trigger('resize').trigger('resize.fndtn.interchange');
    },

    convert_directive: function (directive) {

        var trimmed = this.trim(directive);

        if (trimmed.length > 0) {
            return trimmed;
        }

        return 'replace';
    },

    parse_scenario: function (scenario) {
        // This logic had to be made more complex since some users were using commas in the url path
        // So we cannot simply just split on a comma
        var directive_match = scenario[0].match(/(.+),\s*(\w+)\s*$/),
            media_query = scenario[1];

        if (directive_match) {
            var path = directive_match[1],
                directive = directive_match[2];
        }
        else {
            var cached_split = scenario[0].split(/,\s*$/),
                path = cached_split[0],
                directive = '';
        }

        return [this.trim(path), this.convert_directive(directive), this.trim(media_query)];
    },

    object: function (el) {
        var raw_arr = this.parse_data_attr(el),
            scenarios = [],
            i = raw_arr.length;

        if (i > 0) {
            while (i--) {
                var split = raw_arr[i].split(/\((.*?)(\))$/);

                if (split.length > 1) {
                    var params = this.parse_scenario(split);
                    scenarios.push(params);
                }
            }
        }

        return this.store(el, scenarios);
    },

    store: function (el, scenarios) {
        var uuid = this.random_str(),
            current_uuid = el.data(this.add_namespace('uuid', true));

        if (this.cache[current_uuid]) return this.cache[current_uuid];

        el.attr(this.add_namespace('data-uuid'), uuid);

        return this.cache[uuid] = scenarios;
    },

    trim: function (str) {

        if (typeof str === 'string') {
            return $.trim(str);
        }

        return str;
    },

    set_data_attr: function (init) {
        if (init) {
            if (this.namespace.length > 0) {
                return this.namespace + '-' + this.settings.load_attr;
            }

            return this.settings.load_attr;
        }

        if (this.namespace.length > 0) {
            return 'data-' + this.namespace + '-' + this.settings.load_attr;
        }

        return 'data-' + this.settings.load_attr;
    },

    parse_data_attr: function (el) {
        var raw = el.attr(this.attr_name()).split(/\[(.*?)\]/),
            i = raw.length,
            output = [];

        while (i--) {
            if (raw[i].replace(/[\W\d]+/, '').length > 4) {
                output.push(raw[i]);
            }
        }

        return output;
    },

    reflow: function () {
        this.load('images', true);
        this.load('nodes', true);
    }

};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs['magellan-expedition'] = {
    name: 'magellan-expedition',

    version: '5.5.0',

    settings: {
        active_class: 'active',
        threshold: 0, // pixels from the top of the expedition for it to become fixes
        destination_threshold: 20, // pixels from the top of destination for it to be considered active
        throttle_delay: 30, // calculation throttling to increase framerate
        fixed_top: 0, // top distance in pixels assigend to the fixed element on scroll
        offset_by_height: true,  // whether to offset the destination by the expedition height. Usually you want this to be true, unless your expedition is on the side.
        duration: 700, // animation duration time 
        easing: 'swing' // animation easing
    },

    init: function (scope, method, options) {
        Foundation.inherit(this, 'throttle');
        this.bindings(method, options);
    },

    events: function () {
        var self = this,
            S = self.S,
            settings = self.settings;

        // initialize expedition offset
        self.set_expedition_position();

        S(self.scope)
            .off('.magellan')
            .on('click.fndtn.magellan', '[' + self.add_namespace('data-magellan-arrival') + '] a[href^="#"]', function (e) {
                e.preventDefault();
                var expedition = $(this).closest('[' + self.attr_name() + ']'),
                    settings = expedition.data('magellan-expedition-init'),
                    hash = this.hash.split('#').join(''),
                    target = $('a[name="' + hash + '"]');

                if (target.length === 0) {
                    target = $('#' + hash);

                }

                // Account for expedition height if fixed position
                var scroll_top = target.offset().top - settings.destination_threshold + 1;
                if (settings.offset_by_height) {
                    scroll_top = scroll_top - expedition.outerHeight();
                }

                $('html, body').stop().animate({
                    'scrollTop': scroll_top
                }, settings.duration, settings.easing, function () {
                    if (history.pushState) {
                        history.pushState(null, null, '#' + hash);
                    }
                    else {
                        location.hash = '#' + hash;
                    }
                });
            })
            .on('scroll.fndtn.magellan', self.throttle(this.check_for_arrivals.bind(this), settings.throttle_delay));

        $(window)
            .on('resize.fndtn.magellan', self.throttle(this.set_expedition_position.bind(this), settings.throttle_delay));
    },

    check_for_arrivals: function () {
        var self = this;
        self.update_arrivals();
        self.update_expedition_positions();
    },

    set_expedition_position: function () {
        var self = this;
        $('[' + this.attr_name() + '=fixed]', self.scope).each(function (idx, el) {
            var expedition = $(this),
                settings = expedition.data('magellan-expedition-init'),
                styles = expedition.attr('styles'), // save styles
                top_offset, fixed_top;

            expedition.attr('style', '');
            top_offset = expedition.offset().top + settings.threshold;

            //set fixed-top by attribute
            fixed_top = parseInt(expedition.data('magellan-fixed-top'));
            if (!isNaN(fixed_top))
                self.settings.fixed_top = fixed_top;

            expedition.data(self.data_attr('magellan-top-offset'), top_offset);
            expedition.attr('style', styles);
        });
    },

    update_expedition_positions: function () {
        var self = this,
            window_top_offset = $(window).scrollTop();

        $('[' + this.attr_name() + '=fixed]', self.scope).each(function () {
            var expedition = $(this),
                settings = expedition.data('magellan-expedition-init'),
                styles = expedition.attr('style'), // save styles
                top_offset = expedition.data('magellan-top-offset');

            //scroll to the top distance
            if (window_top_offset + self.settings.fixed_top >= top_offset) {
                // Placeholder allows height calculations to be consistent even when
                // appearing to switch between fixed/non-fixed placement
                var placeholder = expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']');
                if (placeholder.length === 0) {
                    placeholder = expedition.clone();
                    placeholder.removeAttr(self.attr_name());
                    placeholder.attr(self.add_namespace('data-magellan-expedition-clone'), '');
                    expedition.before(placeholder);
                }
                expedition.css({position: 'fixed', top: settings.fixed_top}).addClass('fixed');
            } else {
                expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']').remove();
                expedition.attr('style', styles).css('position', '').css('top', '').removeClass('fixed');
            }
        });
    },

    update_arrivals: function () {
        var self = this,
            window_top_offset = $(window).scrollTop();

        $('[' + this.attr_name() + ']', self.scope).each(function () {
            var expedition = $(this),
                settings = expedition.data(self.attr_name(true) + '-init'),
                offsets = self.offsets(expedition, window_top_offset),
                arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']'),
                active_item = false;
            offsets.each(function (idx, item) {
                if (item.viewport_offset >= item.top_offset) {
                    var arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']');
                    arrivals.not(item.arrival).removeClass(settings.active_class);
                    item.arrival.addClass(settings.active_class);
                    active_item = true;
                    return true;
                }
            });

            if (!active_item) arrivals.removeClass(settings.active_class);
        });
    },

    offsets: function (expedition, window_offset) {
        var self = this,
            settings = expedition.data(self.attr_name(true) + '-init'),
            viewport_offset = window_offset;

        return expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']').map(function (idx, el) {
            var name = $(this).data(self.data_attr('magellan-arrival')),
                dest = $('[' + self.add_namespace('data-magellan-destination') + '=' + name + ']');
            if (dest.length > 0) {
                var top_offset = dest.offset().top - settings.destination_threshold;
                if (settings.offset_by_height) {
                    top_offset = top_offset - expedition.outerHeight();
                }
                top_offset = Math.floor(top_offset);
                return {
                    destination: dest,
                    arrival: $(this),
                    top_offset: top_offset,
                    viewport_offset: viewport_offset
                }
            }
        }).sort(function (a, b) {
            if (a.top_offset < b.top_offset) return -1;
            if (a.top_offset > b.top_offset) return 1;
            return 0;
        });
    },

    data_attr: function (str) {
        if (this.namespace.length > 0) {
            return this.namespace + '-' + str;
        }

        return str;
    },

    off: function () {
        this.S(this.scope).off('.magellan');
        this.S(window).off('.magellan');
    },

    reflow: function () {
        var self = this;
        // remove placeholder expeditions used for height calculation purposes
        $('[' + self.add_namespace('data-magellan-expedition-clone') + ']', self.scope).remove();
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.accordion = {
    name: 'accordion',

    version: '5.5.0',

    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 () {
        var self = this;
        var S = this.S;
        S(this.scope)
            .off('.fndtn.accordion')
            .on('click.fndtn.accordion', '[' + this.attr_name() + '] > .accordion-navigation > 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 = $('> .accordion-navigation', 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);
                    aunts = aunts.add('[' + groupSelector + '] .accordion-navigation');
                }

                if (settings.toggleable && target.is(active_content)) {
                    target.parent('.accordion-navigation').toggleClass(settings.active_class, false);
                    target.toggleClass(settings.active_class, false);
                    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);
                }

                target.addClass(settings.active_class).parent().addClass(settings.active_class);
                settings.callback(target);
                target.triggerHandler('toggled', [accordion]);
                accordion.triggerHandler('toggled', [target]);
            });
    },

    off: function () {
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.topbar = {
    name: 'topbar',

    version: '5.5.0',

    settings: {
        index: 0,
        sticky_class: 'sticky',
        custom_back_text: true,
        back_text: 'Back',
        mobile_show_parent_link: true,
        is_hover: true,
        scrolltop: true, // jump to top when sticky nav menu toggle is clicked
        sticky_on: 'all'
    },

    init: function (section, method, options) {
        Foundation.inherit(this, 'add_custom_rule register_media throttle');
        var self = this;

        self.register_media('topbar', 'foundation-mq-topbar');

        this.bindings(method, options);

        self.S('[' + this.attr_name() + ']', this.scope).each(function () {
            var topbar = $(this),
                settings = topbar.data(self.attr_name(true) + '-init'),
                section = self.S('section, .top-bar-section', this);
            topbar.data('index', 0);
            var topbarContainer = topbar.parent();
            if (topbarContainer.hasClass('fixed') || self.is_sticky(topbar, topbarContainer, settings)) {
                self.settings.sticky_class = settings.sticky_class;
                self.settings.sticky_topbar = topbar;
                topbar.data('height', topbarContainer.outerHeight());
                topbar.data('stickyoffset', topbarContainer.offset().top);
            } else {
                topbar.data('height', topbar.outerHeight());
            }

            if (!settings.assembled) {
                self.assemble(topbar);
            }

            if (settings.is_hover) {
                self.S('.has-dropdown', topbar).addClass('not-click');
            } else {
                self.S('.has-dropdown', topbar).removeClass('not-click');
            }

            // Pad body when sticky (scrolled) or fixed.
            self.add_custom_rule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }');

            if (topbarContainer.hasClass('fixed')) {
                self.S('body').addClass('f-topbar-fixed');
            }
        });

    },

    is_sticky: function (topbar, topbarContainer, settings) {
        var sticky = topbarContainer.hasClass(settings.sticky_class);

        if (sticky && settings.sticky_on === 'all') {
            return true;
        } else if (sticky && this.small() && settings.sticky_on === 'small') {
            return (matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches && !matchMedia(Foundation.media_queries.large).matches);
            //return true;
        } else if (sticky && this.medium() && settings.sticky_on === 'medium') {
            return (matchMedia(Foundation.media_queries.small).matches && matchMedia(Foundation.media_queries.medium).matches && !matchMedia(Foundation.media_queries.large).matches);
            //return true;
        } else if (sticky && this.large() && settings.sticky_on === 'large') {
            return (matchMedia(Foundation.media_queries.small).matches && matchMedia(Foundation.media_queries.medium).matches &&
            matchMedia(Foundation.media_queries.large).matches);
            //return true;
        }

        return false;
    },

    toggle: function (toggleEl) {
        var self = this,
            topbar;

        if (toggleEl) {
            topbar = self.S(toggleEl).closest('[' + this.attr_name() + ']');
        } else {
            topbar = self.S('[' + this.attr_name() + ']');
        }

        var settings = topbar.data(this.attr_name(true) + '-init');

        var section = self.S('section, .top-bar-section', topbar);

        if (self.breakpoint()) {
            if (!self.rtl) {
                section.css({left: '0%'});
                $('>.name', section).css({left: '100%'});
            } else {
                section.css({right: '0%'});
                $('>.name', section).css({right: '100%'});
            }

            self.S('li.moved', section).removeClass('moved');
            topbar.data('index', 0);

            topbar
                .toggleClass('expanded')
                .css('height', '');
        }

        if (settings.scrolltop) {
            if (!topbar.hasClass('expanded')) {
                if (topbar.hasClass('fixed')) {
                    topbar.parent().addClass('fixed');
                    topbar.removeClass('fixed');
                    self.S('body').addClass('f-topbar-fixed');
                }
            } else if (topbar.parent().hasClass('fixed')) {
                if (settings.scrolltop) {
                    topbar.parent().removeClass('fixed');
                    topbar.addClass('fixed');
                    self.S('body').removeClass('f-topbar-fixed');

                    window.scrollTo(0, 0);
                } else {
                    topbar.parent().removeClass('expanded');
                }
            }
        } else {
            if (self.is_sticky(topbar, topbar.parent(), settings)) {
                topbar.parent().addClass('fixed');
            }

            if (topbar.parent().hasClass('fixed')) {
                if (!topbar.hasClass('expanded')) {
                    topbar.removeClass('fixed');
                    topbar.parent().removeClass('expanded');
                    self.update_sticky_positioning();
                } else {
                    topbar.addClass('fixed');
                    topbar.parent().addClass('expanded');
                    self.S('body').addClass('f-topbar-fixed');
                }
            }
        }
    },

    timer: null,

    events: function (bar) {
        var self = this,
            S = this.S;

        S(this.scope)
            .off('.topbar')
            .on('click.fndtn.topbar', '[' + this.attr_name() + '] .toggle-topbar', function (e) {
                e.preventDefault();
                self.toggle(this);
            })
            .on('click.fndtn.topbar', '.top-bar .top-bar-section li a[href^="#"],[' + this.attr_name() + '] .top-bar-section li a[href^="#"]', function (e) {
                var li = $(this).closest('li');
                if (self.breakpoint() && !li.hasClass('back') && !li.hasClass('has-dropdown')) {
                    self.toggle();
                }
            })
            .on('click.fndtn.topbar', '[' + this.attr_name() + '] li.has-dropdown', function (e) {
                var li = S(this),
                    target = S(e.target),
                    topbar = li.closest('[' + self.attr_name() + ']'),
                    settings = topbar.data(self.attr_name(true) + '-init');

                if (target.data('revealId')) {
                    self.toggle();
                    return;
                }

                if (self.breakpoint()) return;
                if (settings.is_hover && !Modernizr.touch) return;

                e.stopImmediatePropagation();

                if (li.hasClass('hover')) {
                    li
                        .removeClass('hover')
                        .find('li')
                        .removeClass('hover');

                    li.parents('li.hover')
                        .removeClass('hover');
                } else {
                    li.addClass('hover');

                    $(li).siblings().removeClass('hover');

                    if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) {
                        e.preventDefault();
                    }
                }
            })
            .on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown>a', function (e) {
                if (self.breakpoint()) {

                    e.preventDefault();

                    var $this = S(this),
                        topbar = $this.closest('[' + self.attr_name() + ']'),
                        section = topbar.find('section, .top-bar-section'),
                        dropdownHeight = $this.next('.dropdown').outerHeight(),
                        $selectedLi = $this.closest('li');

                    topbar.data('index', topbar.data('index') + 1);
                    $selectedLi.addClass('moved');

                    if (!self.rtl) {
                        section.css({left: -(100 * topbar.data('index')) + '%'});
                        section.find('>.name').css({left: 100 * topbar.data('index') + '%'});
                    } else {
                        section.css({right: -(100 * topbar.data('index')) + '%'});
                        section.find('>.name').css({right: 100 * topbar.data('index') + '%'});
                    }

                    topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height'));
                }
            });

        S(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function () {
            self.resize.call(self);
        }, 50)).trigger('resize').trigger('resize.fndtn.topbar').load(function () {
            // Ensure that the offset is calculated after all of the pages resources have loaded
            S(this).trigger('resize.fndtn.topbar');
        });

        S('body').off('.topbar').on('click.fndtn.topbar', function (e) {
            var parent = S(e.target).closest('li').closest('li.hover');

            if (parent.length > 0) {
                return;
            }

            S('[' + self.attr_name() + '] li.hover').removeClass('hover');
        });

        // Go up a level on Click
        S(this.scope).on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown .back', function (e) {
            e.preventDefault();

            var $this = S(this),
                topbar = $this.closest('[' + self.attr_name() + ']'),
                section = topbar.find('section, .top-bar-section'),
                settings = topbar.data(self.attr_name(true) + '-init'),
                $movedLi = $this.closest('li.moved'),
                $previousLevelUl = $movedLi.parent();

            topbar.data('index', topbar.data('index') - 1);

            if (!self.rtl) {
                section.css({left: -(100 * topbar.data('index')) + '%'});
                section.find('>.name').css({left: 100 * topbar.data('index') + '%'});
            } else {
                section.css({right: -(100 * topbar.data('index')) + '%'});
                section.find('>.name').css({right: 100 * topbar.data('index') + '%'});
            }

            if (topbar.data('index') === 0) {
                topbar.css('height', '');
            } else {
                topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height'));
            }

            setTimeout(function () {
                $movedLi.removeClass('moved');
            }, 300);
        });

        // Show dropdown menus when their items are focused
        S(this.scope).find('.dropdown a')
            .focus(function () {
                $(this).parents('.has-dropdown').addClass('hover');
            })
            .blur(function () {
                $(this).parents('.has-dropdown').removeClass('hover');
            });
    },

    resize: function () {
        var self = this;
        self.S('[' + this.attr_name() + ']').each(function () {
            var topbar = self.S(this),
                settings = topbar.data(self.attr_name(true) + '-init');

            var stickyContainer = topbar.parent('.' + self.settings.sticky_class);
            var stickyOffset;

            if (!self.breakpoint()) {
                var doToggle = topbar.hasClass('expanded');
                topbar
                    .css('height', '')
                    .removeClass('expanded')
                    .find('li')
                    .removeClass('hover');

                if (doToggle) {
                    self.toggle(topbar);
                }
            }

            if (self.is_sticky(topbar, stickyContainer, settings)) {
                if (stickyContainer.hasClass('fixed')) {
                    // Remove the fixed to allow for correct calculation of the offset.
                    stickyContainer.removeClass('fixed');

                    stickyOffset = stickyContainer.offset().top;
                    if (self.S(document.body).hasClass('f-topbar-fixed')) {
                        stickyOffset -= topbar.data('height');
                    }

                    topbar.data('stickyoffset', stickyOffset);
                    stickyContainer.addClass('fixed');
                } else {
                    stickyOffset = stickyContainer.offset().top;
                    topbar.data('stickyoffset', stickyOffset);
                }
            }

        });
    },

    breakpoint: function () {
        return !matchMedia(Foundation.media_queries['topbar']).matches;
    },

    small: function () {
        return matchMedia(Foundation.media_queries['small']).matches;
    },

    medium: function () {
        return matchMedia(Foundation.media_queries['medium']).matches;
    },

    large: function () {
        return matchMedia(Foundation.media_queries['large']).matches;
    },

    assemble: function (topbar) {
        var self = this,
            settings = topbar.data(this.attr_name(true) + '-init'),
            section = self.S('section, .top-bar-section', topbar);

        // Pull element out of the DOM for manipulation
        section.detach();

        self.S('.has-dropdown>a', section).each(function () {
            var $link = self.S(this),
                $dropdown = $link.siblings('.dropdown'),
                url = $link.attr('href'),
                $titleLi;

            if (!$dropdown.find('.title.back').length) {

                if (settings.mobile_show_parent_link == true && url) {
                    $titleLi = $('<li class="title back js-generated"><h5><a href="javascript:void(0)"></a></h5></li><li class="parent-link show-for-small-only"><a class="parent-link js-generated" href="' + url + '">' + $link.html() + '</a></li>');
                } else {
                    $titleLi = $('<li class="title back js-generated"><h5><a href="javascript:void(0)"></a></h5>');
                }

                // Copy link to subnav
                if (settings.custom_back_text == true) {
                    $('h5>a', $titleLi).html(settings.back_text);
                } else {
                    $('h5>a', $titleLi).html('&laquo; ' + $link.html());
                }
                $dropdown.prepend($titleLi);
            }
        });

        // Put element back in the DOM
        section.appendTo(topbar);

        // check for sticky
        this.sticky();

        this.assembled(topbar);
    },

    assembled: function (topbar) {
        topbar.data(this.attr_name(true), $.extend({}, topbar.data(this.attr_name(true)), {assembled: true}));
    },

    height: function (ul) {
        var total = 0,
            self = this;

        $('> li', ul).each(function () {
            total += self.S(this).outerHeight(true);
        });

        return total;
    },

    sticky: function () {
        var self = this;

        this.S(window).on('scroll', function () {
            self.update_sticky_positioning();
        });
    },

    update_sticky_positioning: function () {
        var klass = '.' + this.settings.sticky_class,
            $window = this.S(window),
            self = this;

        if (self.settings.sticky_topbar && self.is_sticky(this.settings.sticky_topbar, this.settings.sticky_topbar.parent(), this.settings)) {
            var distance = this.settings.sticky_topbar.data('stickyoffset');
            if (!self.S(klass).hasClass('expanded')) {
                if ($window.scrollTop() > (distance)) {
                    if (!self.S(klass).hasClass('fixed')) {
                        self.S(klass).addClass('fixed');
                        self.S('body').addClass('f-topbar-fixed');
                    }
                } else if ($window.scrollTop() <= distance) {
                    if (self.S(klass).hasClass('fixed')) {
                        self.S(klass).removeClass('fixed');
                        self.S('body').removeClass('f-topbar-fixed');
                    }
                }
            }
        }
    },

    off: function () {
        this.S(this.scope).off('.fndtn.topbar');
        this.S(window).off('.fndtn.topbar');
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.tab = {
    name: 'tab',

    version: '5.5.0',

    settings: {
        active_class: 'active',
        callback: function () {
        },
        deep_linking: false,
        scroll_to_content: true,
        is_hover: false
    },

    default_tab_hashes: [],

    init: function (scope, method, options) {
        var self = this,
            S = this.S;

        this.bindings(method, options);
        this.handle_location_hash_change();

        // Store the default active tabs which will be referenced when the
        // location hash is absent, as in the case of navigating the tabs and
        // returning to the first viewing via the browser Back button.
        S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () {
            self.default_tab_hashes.push(this.hash);
        });
    },

    events: function () {
        var self = this,
            S = this.S;

        var usual_tab_behavior = function (e) {
            var settings = S(this).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
            if (!settings.is_hover || Modernizr.touch) {
                e.preventDefault();
                e.stopPropagation();
                self.toggle_active_tab(S(this).parent());
            }
        };

        S(this.scope)
            .off('.tab')
            // Click event: tab title
            .on('focus.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior)
            .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior)
            // Hover event: tab title
            .on('mouseenter.fndtn.tab', '[' + this.attr_name() + '] > * > a', function (e) {
                var settings = S(this).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
                if (settings.is_hover) self.toggle_active_tab(S(this).parent());
            });

        // Location hash change event
        S(window).on('hashchange.fndtn.tab', function (e) {
            e.preventDefault();
            self.handle_location_hash_change();
        });
    },

    handle_location_hash_change: function () {

        var self = this,
            S = this.S;

        S('[' + this.attr_name() + ']', this.scope).each(function () {
            var settings = S(this).data(self.attr_name(true) + '-init');
            if (settings.deep_linking) {
                // Match the location hash to a label
                var hash;
                if (settings.scroll_to_content) {
                    hash = self.scope.location.hash;
                } else {
                    // prefix the hash to prevent anchor scrolling
                    hash = self.scope.location.hash.replace('fndtn-', '');
                }
                if (hash != '') {
                    // Check whether the location hash references a tab content div or
                    // another element on the page (inside or outside the tab content div)
                    var hash_element = S(hash);
                    if (hash_element.hasClass('content') && hash_element.parent().hasClass('tabs-content')) {
                        // Tab content div
                        self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + hash + ']').parent());
                    } else {
                        // Not the tab content div. If inside the tab content, find the
                        // containing tab and toggle it as active.
                        var hash_tab_container_id = hash_element.closest('.content').attr('id');
                        if (hash_tab_container_id != undefined) {
                            self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=#' + hash_tab_container_id + ']').parent(), hash);
                        }
                    }
                } else {
                    // Reference the default tab hashes which were initialized in the init function
                    for (var ind = 0; ind < self.default_tab_hashes.length; ind++) {
                        self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + self.default_tab_hashes[ind] + ']').parent());
                    }
                }
            }
        });
    },

    toggle_active_tab: function (tab, location_hash) {
        var S = this.S,
            tabs = tab.closest('[' + this.attr_name() + ']'),
            tab_link = tab.find('a'),
            anchor = tab.children('a').first(),
            target_hash = '#' + anchor.attr('href').split('#')[1],
            target = S(target_hash),
            siblings = tab.siblings(),
            settings = tabs.data(this.attr_name(true) + '-init'),
            interpret_keyup_action = function (e) {
                // Light modification of Heydon Pickering's Practical ARIA Examples: http://heydonworks.com/practical_aria_examples/js/a11y.js

                // define current, previous and next (possible) tabs

                var $original = $(this);
                var $prev = $(this).parents('li').prev().children('[role="tab"]');
                var $next = $(this).parents('li').next().children('[role="tab"]');
                var $target;

                // find the direction (prev or next)

                switch (e.keyCode) {
                    case 37:
                        $target = $prev;
                        break;
                    case 39:
                        $target = $next;
                        break;
                    default:
                        $target = false
                        break;
                }

                if ($target.length) {
                    $original.attr({
                        'tabindex': '-1',
                        'aria-selected': null
                    });
                    $target.attr({
                        'tabindex': '0',
                        'aria-selected': true
                    }).focus();
                }

                // Hide panels

                $('[role="tabpanel"]')
                    .attr('aria-hidden', 'true');

                // Show panel which corresponds to target

                $('#' + $(document.activeElement).attr('href').substring(1))
                    .attr('aria-hidden', null);

            };

        // allow usage of data-tab-content attribute instead of href
        if (S(this).data(this.data_attr('tab-content'))) {
            target_hash = '#' + S(this).data(this.data_attr('tab-content')).split('#')[1];
            target = S(target_hash);
        }

        if (settings.deep_linking) {

            if (settings.scroll_to_content) {
                // retain current hash to scroll to content
                window.location.hash = location_hash || target_hash;
                if (location_hash == undefined || location_hash == target_hash) {
                    tab.parent()[0].scrollIntoView();
                } else {
                    S(target_hash)[0].scrollIntoView();
                }
            } else {
                // prefix the hashes so that the browser doesn't scroll down
                if (location_hash != undefined) {
                    window.location.hash = 'fndtn-' + location_hash.replace('#', '');
                } else {
                    window.location.hash = 'fndtn-' + target_hash.replace('#', '');
                }
            }
        }

        // WARNING: The activation and deactivation of the tab content must
        // occur after the deep linking in order to properly refresh the browser
        // window (notably in Chrome).
        // Clean up multiple attr instances to done once
        tab.addClass(settings.active_class).triggerHandler('opened');
        tab_link.attr({'aria-selected': 'true', tabindex: 0});
        siblings.removeClass(settings.active_class)
        siblings.find('a').attr({'aria-selected': 'false', tabindex: -1});
        target.siblings().removeClass(settings.active_class).attr({'aria-hidden': 'true', tabindex: -1});
        target.addClass(settings.active_class).attr('aria-hidden', 'false').removeAttr('tabindex');
        settings.callback(tab);
        target.triggerHandler('toggled', [tab]);
        tabs.triggerHandler('toggled', [target]);

        tab_link.off('keydown').on('keydown', interpret_keyup_action);
    },

    data_attr: function (str) {
        if (this.namespace.length > 0) {
            return this.namespace + '-' + str;
        }

        return str;
    },

    off: function () {
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.abide = {
    name: 'abide',

    version: '5.5.0',

    settings: {
        live_validate: true,
        validate_on_blur: true,
        focus_on_invalid: true,
        error_labels: true, // labels with a for="inputId" will recieve an `error` class
        error_class: 'error',
        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])?)+$/,

            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) {
                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');

        form
            .off('.abide')
            .on('submit.fndtn.abide validate.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').get(), e, is_ajax);
            })
            .on('reset', function () {
                return self.reset($(this));
            })
            .find('input, textarea, select')
            .off('.abide')
            .on('blur.fndtn.abide change.fndtn.abide', function (e) {
                if (settings.validate_on_blur === true) {
                    self.validate([this], e);
                }
            })
            .on('keydown.fndtn.abide', function (e) {
                if (settings.live_validate === true && e.which != 9) {
                    clearTimeout(self.timer);
                    self.timer = setTimeout(function () {
                        self.validate([this], e);
                    }.bind(this), settings.timeout);
                }
            });
    },

    reset: function (form) {
        form.removeAttr(this.invalid_attr);
        $(this.invalid_attr, form).removeAttr(this.invalid_attr);
        $('.' + this.settings.error_class, form).not('small').removeClass(this.settings.error_class);
    },

    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').trigger('invalid.fndtn.abide');
                this.S(els[i]).closest('form').attr(this.invalid_attr, '');
                return false;
            }
        }

        if (submit_event || is_ajax) {
            form.trigger('valid').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 = [],
            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 (validator) {
                valid = this.settings.validators[validator].apply(this, [el, required, parent]);
                el_validations.push(valid);
            }

            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 (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.push(el_validations[0]);
        }
        validations = [validations.every(function (valid) {
            return valid;
        })];
        return validations;
    },

    valid_checkbox: function (el, required) {
        var el = this.S(el),
            valid = (el.is(':checked') || !required);

        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);
        }

        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;

        // 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].checked) valid = true;
        }

        // 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);
            } else {
                this.S(group[i]).attr(this.invalid_attr, '').parent().addClass(this.settings.error_class);
            }
        }

        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;
    }
};

}(jQuery, window, window.document)); ; (function ($, window, document, undefined) {

'use strict';

Foundation.libs.tooltip = {
    name: 'tooltip',

    version: '5.5.0',

    settings: {
        additional_inheritable_classes: [],
        tooltip_class: '.tooltip',
        append_to: 'body',
        touch_close_text: 'Tap To Close',
        disable_for_touch: false,
        hover_delay: 200,
        show_on: 'all',
        tip_template: function (selector, content) {
            return '<span data-selector="' + selector + '" id="' + selector + '" class="'
                + Foundation.libs.tooltip.settings.tooltip_class.substring(1)
                + '" role="tooltip">' + content + '<span class="nub"></span></span>';
        }
    },

    cache: {},

    init: function (scope, method, options) {
        Foundation.inherit(this, 'random_str');
        this.bindings(method, options);
    },

    should_show: function (target, tip) {
        var settings = $.extend({}, this.settings, this.data_options(target));

        if (settings.show_on === 'all') {
            return true;
        } else if (this.small() && settings.show_on === 'small') {
            return true;
        } else if (this.medium() && settings.show_on === 'medium') {
            return true;
        } else if (this.large() && settings.show_on === 'large') {
            return true;
        }
        return false;
    },

    medium: function () {
        return matchMedia(Foundation.media_queries['medium']).matches;
    },

    large: function () {
        return matchMedia(Foundation.media_queries['large']).matches;
    },

    events: function (instance) {
        var self = this,
            S = self.S;

        self.create(this.S(instance));

        $(this.scope)
            .off('.tooltip')
            .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip',
            '[' + this.attr_name() + ']', function (e) {
                var $this = S(this),
                    settings = $.extend({}, self.settings, self.data_options($this)),
                    is_touch = false;

                if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type) && S(e.target).is('a')) {
                    return false;
                }

                if (/mouse/i.test(e.type) && self.ie_touch(e)) return false;

                if ($this.hasClass('open')) {
                    if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) e.preventDefault();
                    self.hide($this);
                } else {
                    if (settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) {
                        return;
                    } else if (!settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) {
                        e.preventDefault();
                        S(settings.tooltip_class + '.open').hide();
                        is_touch = true;
                    }

                    if (/enter|over/i.test(e.type)) {
                        this.timer = setTimeout(function () {
                            var tip = self.showTip($this);
                        }.bind(this), self.settings.hover_delay);
                    } else if (e.type === 'mouseout' || e.type === 'mouseleave') {
                        clearTimeout(this.timer);
                        self.hide($this);
                    } else {
                        self.showTip($this);
                    }
                }
            })
            .on('mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', '[' + this.attr_name() + '].open', function (e) {
                if (/mouse/i.test(e.type) && self.ie_touch(e)) return false;

                if ($(this).data('tooltip-open-event-type') == 'touch' && e.type == 'mouseleave') {
                    return;
                }
                else if ($(this).data('tooltip-open-event-type') == 'mouse' && /MSPointerDown|touchstart/i.test(e.type)) {
                    self.convert_to_touch($(this));
                } else {
                    self.hide($(this));
                }
            })
            .on('DOMNodeRemoved DOMAttrModified', '[' + this.attr_name() + ']:not(a)', function (e) {
                self.hide(S(this));
            });
    },

    ie_touch: function (e) {
        // How do I distinguish between IE11 and Windows Phone 8?????
        return false;
    },

    showTip: function ($target) {
        var $tip = this.getTip($target);
        if (this.should_show($target, $tip)) {
            return this.show($target);
        }
        return;
    },

    getTip: function ($target) {
        var selector = this.selector($target),
            settings = $.extend({}, this.settings, this.data_options($target)),
            tip = null;

        if (selector) {
            tip = this.S('span[data-selector="' + selector + '"]' + settings.tooltip_class);
        }

        return (typeof tip === 'object') ? tip : false;
    },

    selector: function ($target) {
        var id = $target.attr('id'),
            dataSelector = $target.attr(this.attr_name()) || $target.attr('data-selector');

        if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') {
            dataSelector = this.random_str(6);
            $target
                .attr('data-selector', dataSelector)
                .attr('aria-describedby', dataSelector);
        }

        return (id && id.length > 0) ? id : dataSelector;
    },

    create: function ($target) {
        var self = this,
            settings = $.extend({}, this.settings, this.data_options($target)),
            tip_template = this.settings.tip_template;

        if (typeof settings.tip_template === 'string' && window.hasOwnProperty(settings.tip_template)) {
            tip_template = window[settings.tip_template];
        }

        var $tip = $(tip_template(this.selector($target), $('<div></div>').html($target.attr('title')).html())),
            classes = this.inheritable_classes($target);

        $tip.addClass(classes).appendTo(settings.append_to);

        if (Modernizr.touch) {
            $tip.append('<span class="tap-to-close">' + settings.touch_close_text + '</span>');
            $tip.on('touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', function (e) {
                self.hide($target);
            });
        }

        $target.removeAttr('title').attr('title', '');
    },

    reposition: function (target, tip, classes) {
        var width, nub, nubHeight, nubWidth, column, objPos;

        tip.css('visibility', 'hidden').show();

        width = target.data('width');
        nub = tip.children('.nub');
        nubHeight = nub.outerHeight();
        nubWidth = nub.outerHeight();

        if (this.small()) {
            tip.css({'width': '100%'});
        } else {
            tip.css({'width': (width) ? width : 'auto'});
        }

        objPos = function (obj, top, right, bottom, left, width) {
            return obj.css({
                'top': (top) ? top : 'auto',
                'bottom': (bottom) ? bottom : 'auto',
                'left': (left) ? left : 'auto',
                'right': (right) ? right : 'auto'
            }).end();
        };

        objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', target.offset().left);

        if (this.small()) {
            objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', 12.5, $(this.scope).width());
            tip.addClass('tip-override');
            objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left);
        } else {
            var left = target.offset().left;
            if (Foundation.rtl) {
                nub.addClass('rtl');
                left = target.offset().left + target.outerWidth() - tip.outerWidth();
            }
            objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', left);
            tip.removeClass('tip-override');
            if (classes && classes.indexOf('tip-top') > -1) {
                if (Foundation.rtl) nub.addClass('rtl');
                objPos(tip, (target.offset().top - tip.outerHeight()), 'auto', 'auto', left)
                    .removeClass('tip-override');
            } else if (classes && classes.indexOf('tip-left') > -1) {
                objPos(tip, (target.offset().top + (target.outerHeight() / 2) - (tip.outerHeight() / 2)), 'auto', 'auto', (target.offset().left - tip.outerWidth() - nubHeight))
                    .removeClass('tip-override');
                nub.removeClass('rtl');
            } else if (classes && classes.indexOf('tip-right') > -1) {
                objPos(tip, (target.offset().top + (target.outerHeight() / 2) - (tip.outerHeight() / 2)), 'auto', 'auto', (target.offset().left + target.outerWidth() + nubHeight))
                    .removeClass('tip-override');
                nub.removeClass('rtl');
            }
        }

        tip.css('visibility', 'visible').hide();
    },

    small: function () {
        return matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches;
    },

    inheritable_classes: function ($target) {
        var settings = $.extend({}, this.settings, this.data_options($target)),
            inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'radius', 'round'].concat(settings.additional_inheritable_classes),
            classes = $target.attr('class'),
            filtered = classes ? $.map(classes.split(' '), function (el, i) {
                if ($.inArray(el, inheritables) !== -1) {
                    return el;
                }
            }).join(' ') : '';

        return $.trim(filtered);
    },

    convert_to_touch: function ($target) {
        var self = this,
            $tip = self.getTip($target),
            settings = $.extend({}, self.settings, self.data_options($target));

        if ($tip.find('.tap-to-close').length === 0) {
            $tip.append('<span class="tap-to-close">' + settings.touch_close_text + '</span>');
            $tip.on('click.fndtn.tooltip.tapclose touchstart.fndtn.tooltip.tapclose MSPointerDown.fndtn.tooltip.tapclose', function (e) {
                self.hide($target);
            });
        }

        $target.data('tooltip-open-event-type', 'touch');
    },

    show: function ($target) {
        var $tip = this.getTip($target);

        if ($target.data('tooltip-open-event-type') == 'touch') {
            this.convert_to_touch($target);
        }

        this.reposition($target, $tip, $target.attr('class'));
        $target.addClass('open');
        $tip.fadeIn(150);
    },

    hide: function ($target) {
        var $tip = this.getTip($target);

        $tip.fadeOut(150, function () {
            $tip.find('.tap-to-close').remove();
            $tip.off('click.fndtn.tooltip.tapclose MSPointerDown.fndtn.tapclose');
            $target.removeClass('open');
        });
    },

    off: function () {
        var self = this;
        this.S(this.scope).off('.fndtn.tooltip');
        this.S(this.settings.tooltip_class).each(function (i) {
            $('[' + self.attr_name() + ']').eq(i).attr('title', $(this).text());
        }).remove();
    },

    reflow: function () {
    }
};

}(jQuery, window, window.document));