Update Foundation to 4.1.6

Downloaded from http://foundation.zurb.com/files/foundation-4.1.6.zip
Changelog: https://github.com/zurb/foundation/blob/v4.1.6/docs/CHANGELOG.md

I did not minify
* 4.1.6/css/normalize.css (normalize.css v2.1.1)
* all the 4.1.6/js/foundation/foundation.*.js
* 4.1.6/js/vendor/jquery.js & zepto.js, which are the same as 4.1.2 (using diff)

Hopefully there will be the same auto-minification (by @Lockyc?) as for 4.1.2
This commit is contained in:
paul
2013-05-21 01:34:45 +02:00
parent 1c0927e30e
commit ea0dec9840
22 changed files with 20398 additions and 1 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+402
View File
@@ -0,0 +1,402 @@
/*! normalize.css v2.1.1 | MIT License | git.io/normalize */
/* ==========================================================================
HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined in IE 8/9.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
/**
* Correct `inline-block` display not defined in IE 8/9.
*/
audio,
canvas,
video {
display: inline-block;
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address styling not present in IE 8/9.
*/
[hidden] {
display: none;
}
/* ==========================================================================
Base
========================================================================== */
/**
* 1. Prevent system color scheme's background color being used in Firefox, IE,
* and Opera.
* 2. Prevent system color scheme's text color being used in Firefox, IE, and
* Opera.
* 3. Set default font family to sans-serif.
* 4. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
background: #fff; /* 1 */
color: #000; /* 2 */
font-family: sans-serif; /* 3 */
-ms-text-size-adjust: 100%; /* 4 */
-webkit-text-size-adjust: 100%; /* 4 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* ==========================================================================
Links
========================================================================== */
/**
* Address `outline` inconsistency between Chrome and other browsers.
*/
a:focus {
outline: thin dotted;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* ==========================================================================
Typography
========================================================================== */
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari 5, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9, Safari 5, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
*/
b,
strong {
font-weight: bold;
}
/**
* Address styling not present in Safari 5 and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Correct font family set oddly in Safari 5 and Chrome.
*/
code,
kbd,
pre,
samp {
font-family: monospace, serif;
font-size: 1em;
}
/**
* Improve readability of pre-formatted text in all browsers.
*/
pre {
white-space: pre-wrap;
}
/**
* Set consistent quote types.
*/
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* ==========================================================================
Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9.
*/
img {
border: 0;
}
/**
* Correct overflow displayed oddly in IE 9.
*/
svg:not(:root) {
overflow: hidden;
}
/* ==========================================================================
Figures
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari 5.
*/
figure {
margin: 0;
}
/* ==========================================================================
Forms
========================================================================== */
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* 1. Correct font family not being inherited in all browsers.
* 2. Correct font size not being inherited in all browsers.
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
*/
button,
input,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 2 */
margin: 0; /* 3 */
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
button,
input {
line-height: normal;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
* Correct `select` style inheritance in Firefox 4+ and Opera.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* 1. Address box sizing set to `content-box` in IE 8/9.
* 2. Remove excess padding in IE 8/9.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari 5 and Chrome
* on OS X.
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Remove inner padding and border in Firefox 4+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* 1. Remove default vertical scrollbar in IE 8/9.
* 2. Improve readability and alignment in all browsers.
*/
textarea {
overflow: auto; /* 1 */
vertical-align: top; /* 2 */
}
/* ==========================================================================
Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,50 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.alerts = {
name : 'alerts',
version : '4.0.0',
settings : {
speed: 300, // fade out speed
callback: function (){}
},
init : function (scope, method, options) {
this.scope = scope || this.scope;
if (typeof method === 'object') {
$.extend(true, this.settings, method);
}
if (typeof method != 'string') {
if (!this.settings.init) this.events();
return this.settings.init;
} else {
return this[method].call(this, options);
}
},
events : function () {
var self = this;
$(this.scope).on('click.fndtn.alerts', '[data-alert] a.close', function (e) {
e.preventDefault();
$(this).closest("[data-alert]").fadeOut(self.speed, function () {
$(this).remove();
self.settings.callback();
});
});
this.settings.init = true;
},
off : function () {
$(this.scope).off('.fndtn.alerts');
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,516 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.clearing = {
name : 'clearing',
version : '4.1.3',
settings : {
templates : {
viewing : '<a href="#" class="clearing-close">&times;</a>' +
'<div class="visible-img" style="display: none"><img src="//:0">' +
'<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',
// event initializers and locks
init : false,
locked : false
},
init : function (scope, method, options) {
var self = this;
Foundation.inherit(this, 'set_data get_data remove_data throttle data_options');
if (typeof method === 'object') {
options = $.extend(true, this.settings, method);
}
if (typeof method != 'string') {
$(this.scope).find('ul[data-clearing]').each(function () {
var $el = $(this),
options = options || {},
lis = $el.find('li'),
settings = self.get_data($el);
if (!settings && lis.length > 0) {
options.$parent = $el.parent();
self.set_data($el, $.extend({}, self.settings, options, self.data_options($el)));
self.assemble($el.find('li'));
if (!self.settings.init) {
self.events().swipe_events();
}
}
});
return this.settings.init;
} else {
// fire method
return this[method].call(this, options);
}
},
// event binding and initial setup
events : function () {
var self = this;
$(this.scope)
.on('click.fndtn.clearing', 'ul[data-clearing] li',
function (e, current, target) {
var current = current || $(this),
target = target || current,
next = current.next('li'),
settings = self.get_data(current.parent()),
image = $(e.target);
e.preventDefault();
if (!settings) self.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 = target.find('img');
}
// 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) { this.nav(e, 'next') }.bind(this))
.on('click.fndtn.clearing', '.clearing-main-prev',
function (e) { this.nav(e, 'prev') }.bind(this))
.on('click.fndtn.clearing', this.settings.close_selectors,
function (e) { Foundation.libs.clearing.close(e, this) })
.on('keydown.fndtn.clearing',
function (e) { this.keydown(e) }.bind(this));
$(window).on('resize.fndtn.clearing',
function () { this.resize() }.bind(this));
this.settings.init = true;
return this;
},
swipe_events : function () {
var self = this;
$(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
};
$(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 = $(this).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) ? 'next' : 'prev';
data.active = true;
self.nav(e, direction);
}
})
.on('touchend.fndtn.clearing', '.visible-img', function(e) {
$(this).data('swipe-transition', {});
e.stopPropagation();
});
},
assemble : function ($li) {
var $el = $li.parent();
$el.after('<div id="foundationClearingHolder"></div>');
var holder = $('#foundationClearingHolder'),
settings = this.get_data($el),
grid = $el.detach(),
data = {
grid: '<div class="carousel">' + this.outerHTML(grid[0]) + '</div>',
viewing: settings.templates.viewing
},
wrapper = '<div class="clearing-assembled"><div>' + data.viewing +
data.grid + '</div></div>';
return holder.after(wrapper).remove();
},
// event callbacks
open : function ($image, current, target) {
var root = target.closest('.clearing-assembled'),
container = root.find('div').first(),
visible_image = container.find('.visible-img'),
image = visible_image.find('img').not($image);
if (!this.locked()) {
// set the image to the selected thumbnail
image
.attr('src', this.load($image))
.css('visibility', 'hidden');
this.loaded(image, function () {
image.css('visibility', 'visible');
// toggle the gallery
root.addClass('clearing-blackout');
container.addClass('clearing-container');
visible_image.show();
this.fix_height(target)
.caption(visible_image.find('.clearing-caption'), $image)
.center(image)
.shift(current, target, function () {
target.siblings().removeClass('visible');
target.addClass('visible');
});
}.bind(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))), container, visible_image;
if (el === e.target && root) {
container = root.find('div').first();
visible_image = container.find('.visible-img');
this.settings.prev_index = 0;
root.find('ul[data-clearing]')
.attr('style', '').closest('.clearing-blackout')
.removeClass('clearing-blackout');
container.removeClass('clearing-container');
visible_image.hide();
}
return false;
},
is_open : function (current) {
return current.parent().attr('style').length > 0;
},
keydown : function (e) {
var clearing = $('.clearing-blackout').find('ul[data-clearing]');
if (e.which === 39) this.go(clearing, 'next');
if (e.which === 37) this.go(clearing, 'prev');
if (e.which === 27) $('a.clearing-close').trigger('click');
},
nav : function (e, direction) {
var clearing = $('.clearing-blackout').find('ul[data-clearing]');
e.preventDefault();
this.go(clearing, direction);
},
resize : function () {
var image = $('.clearing-blackout .visible-img').find('img');
if (image.length) {
this.center(image);
}
},
// visual adjustments
fix_height : function (target) {
var lis = target.parent().children(),
self = this;
lis.each(function () {
var li = $(this),
image = li.find('img');
if (li.height() > self.outerHeight(image)) {
li.addClass('fix-height');
}
})
.closest('ul')
.width(lis.length * 100 + '%');
return this;
},
update_paddles : function (target) {
var visible_image = target
.closest('.carousel')
.siblings('.visible-img');
if (target.next().length > 0) {
visible_image
.find('.clearing-main-next')
.removeClass('disabled');
} else {
visible_image
.find('.clearing-main-next')
.addClass('disabled');
}
if (target.prev().length > 0) {
visible_image
.find('.clearing-main-prev')
.removeClass('disabled');
} else {
visible_image
.find('.clearing-main-prev')
.addClass('disabled');
}
},
center : function (target) {
if (!this.rtl) {
target.css({
marginLeft : -(this.outerWidth(target) / 2),
marginTop : -(this.outerHeight(target) / 2)
});
} else {
target.css({
marginRight : -(this.outerWidth(target) / 2),
marginTop : -(this.outerHeight(target) / 2)
});
}
return this;
},
// image loading and preloading
load : function ($image) {
if ($image[0].nodeName === "A") {
var href = $image.attr('href');
} else {
var href = $image.parent().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());
},
loaded : function (image, callback) {
// based on jquery.imageready.js
// @weblinc, @jsantell, (c) 2012
function loaded () {
callback();
}
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);
}
},
img : function (img) {
if (img.length) {
var new_img = new Image(),
new_a = img.find('a');
if (new_a.length) {
new_img.src = new_a.attr('href');
} else {
new_img.src = img.find('img').attr('src');
}
}
return this;
},
// image caption
caption : function (container, $image) {
var caption = $image.data('caption');
if (caption) {
container
.text(caption)
.show();
} else {
container
.text('')
.hide();
}
return this;
},
// directional methods
go : function ($ul, direction) {
var current = $ul.find('.visible'),
target = current[direction]();
if (target.length) {
target
.find('img')
.trigger('click', [current, target]);
}
},
shift : function (current, target, callback) {
var clearing = target.parent(),
old_index = this.settings.prev_index || target.index(),
direction = this.direction(clearing, current, target),
left = parseInt(clearing.css('left'), 10),
width = this.outerWidth(target),
skip_shift;
// we use jQuery animate instead of CSS transitions because we
// need a callback to unlock the next animation
if (target.index() !== old_index && !/skip/.test(direction)){
if (/left/.test(direction)) {
this.lock();
clearing.animate({left : left + width}, 300, this.unlock());
} else if (/right/.test(direction)) {
this.lock();
clearing.animate({left : left - width}, 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) {
clearing.animate({left : -(skip_shift * width)}, 300, this.unlock());
} else {
clearing.animate({left : 0}, 300, this.unlock());
}
}
callback();
},
direction : function ($el, current, target) {
var lis = $el.find('li'),
li_width = this.outerWidth(lis) + (this.outerWidth(lis) / 4),
up_count = Math.floor(this.outerWidth($('.clearing-container')) / 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;
},
// plugin management/browser quirks
outerHTML : function (el) {
// support FireFox < 11
return el.outerHTML || new XMLSerializer().serializeToString(el);
},
off : function () {
$(this.scope).off('.fndtn.clearing');
$(window).off('.fndtn.clearing');
this.remove_data(); // empty settings cache
this.settings.init = false;
},
reflow : function () {
this.init();
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,74 @@
/*!
* jQuery Cookie Plugin v1.3
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2011, Klaus Hartl
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://www.opensource.org/licenses/mit-license.php
* http://www.opensource.org/licenses/GPL-2.0
*
* Modified to work with Zepto.js by ZURB
*/
(function ($, document, undefined) {
var pluses = /\+/g;
function raw(s) {
return s;
}
function decoded(s) {
return decodeURIComponent(s.replace(pluses, ' '));
}
var config = $.cookie = function (key, value, options) {
// write
if (value !== undefined) {
options = $.extend({}, config.defaults, options);
if (value === null) {
options.expires = -1;
}
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setDate(t.getDate() + days);
}
value = config.json ? JSON.stringify(value) : String(value);
return (document.cookie = [
encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// read
var decode = config.raw ? raw : decoded;
var cookies = document.cookie.split('; ');
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
if (decode(parts.shift()) === key) {
var cookie = decode(parts.join('='));
return config.json ? JSON.parse(cookie) : cookie;
}
}
return null;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) !== null) {
$.cookie(key, null, options);
return true;
}
return false;
};
})(Foundation.zj, document);
@@ -0,0 +1,159 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.dropdown = {
name : 'dropdown',
version : '4.1.3',
settings : {
activeClass: 'open',
opened: function(){},
closed: function(){}
},
init : function (scope, method, options) {
this.scope = scope || this.scope;
Foundation.inherit(this, 'throttle scrollLeft');
if (typeof method === 'object') {
$.extend(true, this.settings, method);
}
if (typeof method != 'string') {
if (!this.settings.init) {
this.events();
}
return this.settings.init;
} else {
return this[method].call(this, options);
}
},
events : function () {
var self = this;
$(this.scope)
.on('click.fndtn.dropdown', '[data-dropdown]', function (e) {
e.preventDefault();
self.toggle($(this));
})
.on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened)
.on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed);
$('body').on('click.fndtn.dropdown', function (e) {
var parent = $(e.target).closest('[data-dropdown-content]');
if ($(e.target).data('dropdown')) {
return;
}
if (parent.length > 0 && ($(e.target).is('[data-dropdown-content]') || $.contains(parent.first()[0], e.target))) {
e.stopPropagation();
return;
}
self.close.call(self, $('[data-dropdown-content]'));
});
$(window).on('resize.fndtn.dropdown', self.throttle(function () {
self.resize.call(self);
}, 50)).trigger('resize');
this.settings.init = true;
},
close: function (dropdown) {
var self = this;
dropdown.each(function () {
if ($(this).hasClass(self.settings.activeClass)) {
$(this)
.css(Foundation.rtl ? 'right':'left', '-99999px')
.removeClass(self.settings.activeClass);
$(this).trigger('closed');
}
});
},
open: function (dropdown, target) {
this
.css(dropdown
.addClass(this.settings.activeClass), target);
dropdown.trigger('opened');
},
toggle : function (target) {
var dropdown = $('#' + target.data('dropdown'));
this.close.call(this, $('[data-dropdown-content]').not(dropdown));
if (dropdown.hasClass(this.settings.activeClass)) {
this.close.call(this, dropdown);
} else {
this.open.call(this, dropdown, target);
}
},
resize : function () {
var dropdown = $('[data-dropdown-content].open'),
target = $("[data-dropdown='" + dropdown.attr('id') + "']");
if (dropdown.length && target.length) {
this.css(dropdown, target);
}
},
css : function (dropdown, target) {
// temporary workaround until 4.2
if (/body/i.test(dropdown.offsetParent()[0].nodeName)) {
var position = target.offset();
position.top -= dropdown.offsetParent().offset().top;
position.left -= dropdown.offsetParent().offset().left;
} else {
var position = target.position();
}
if (this.small()) {
dropdown.css({
position : 'absolute',
width: '95%',
left: '2.5%',
'max-width': 'none',
top: position.top + this.outerHeight(target)
});
} else {
if (!Foundation.rtl && $(window).width() > this.outerWidth(dropdown) + target.offset().left) {
var left = position.left;
} else {
if (!dropdown.hasClass('right')) {
dropdown.addClass('right');
}
var left = position.left - (this.outerWidth(dropdown) - this.outerWidth(target));
}
dropdown.attr('style', '').css({
position : 'absolute',
top: position.top + this.outerHeight(target),
left: left
});
}
return dropdown;
},
small : function () {
return $(window).width() < 768 || $('html').hasClass('lt-ie9');
},
off: function () {
$(this.scope).off('.fndtn.dropdown');
$('html, body').off('.fndtn.dropdown');
$(window).off('.fndtn.dropdown');
$('[data-dropdown-content]').off('.fndtn.dropdown');
this.settings.init = false;
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,513 @@
(function ($, window, document, undefined) {
'use strict';
Foundation.libs.forms = {
name: 'forms',
version: '4.1.6',
cache: {},
settings: {
disable_class: 'no-custom',
last_combo : null
},
init: function (scope, method, options) {
if (typeof method === 'object') {
$.extend(true, this.settings, method);
}
if (typeof method != 'string') {
if (!this.settings.init) {
this.events();
}
this.assemble();
return this.settings.init;
} else {
return this[method].call(this, options);
}
},
assemble: function () {
$('form.custom input[type="radio"]', $(this.scope)).not('[data-customforms="disabled"]')
.each(this.append_custom_markup);
$('form.custom input[type="checkbox"]', $(this.scope)).not('[data-customforms="disabled"]')
.each(this.append_custom_markup);
$('form.custom select', $(this.scope))
.not('[data-customforms="disabled"]')
.not('[multiple=multiple]')
.each(this.append_custom_select);
},
events: function () {
var self = this;
$(this.scope)
.on('click.fndtn.forms', 'form.custom span.custom.checkbox', function (e) {
e.preventDefault();
e.stopPropagation();
self.toggle_checkbox($(this));
})
.on('click.fndtn.forms', 'form.custom span.custom.radio', function (e) {
e.preventDefault();
e.stopPropagation();
self.toggle_radio($(this));
})
.on('change.fndtn.forms', 'form.custom select:not([data-customforms="disabled"])', function (e, force_refresh) {
self.refresh_custom_select($(this), force_refresh);
})
.on('click.fndtn.forms', 'form.custom label', function (e) {
if ($(e.target).is('label')) {
var $associatedElement = $('#' + self.escape($(this).attr('for')) + ':not([data-customforms="disabled"])'),
$customCheckbox,
$customRadio;
if ($associatedElement.length !== 0) {
if ($associatedElement.attr('type') === 'checkbox') {
e.preventDefault();
$customCheckbox = $(this).find('span.custom.checkbox');
//the checkbox might be outside after the label or inside of another element
if ($customCheckbox.length == 0) {
$customCheckbox = $associatedElement.add(this).siblings('span.custom.checkbox').first();
}
self.toggle_checkbox($customCheckbox);
} else if ($associatedElement.attr('type') === 'radio') {
e.preventDefault();
$customRadio = $(this).find('span.custom.radio');
//the radio might be outside after the label or inside of another element
if ($customRadio.length == 0) {
$customRadio = $associatedElement.add(this).siblings('span.custom.radio').first();
}
self.toggle_radio($customRadio);
}
}
}
})
.on('click.fndtn.forms', 'form.custom div.custom.dropdown a.current, form.custom div.custom.dropdown a.selector', function (e) {
var $this = $(this),
$dropdown = $this.closest('div.custom.dropdown'),
$select = getFirstPrevSibling($dropdown, 'select');
// make sure other dropdowns close
if (!$dropdown.hasClass('open')) $(self.scope).trigger('click');
e.preventDefault();
if (false === $select.is(':disabled')) {
$dropdown.toggleClass('open');
if ($dropdown.hasClass('open')) {
$(self.scope).on('click.fndtn.forms.customdropdown', function () {
$dropdown.removeClass('open');
$(self.scope).off('.fndtn.forms.customdropdown');
});
} else {
$(self.scope).on('.fndtn.forms.customdropdown');
}
return false;
}
})
.on('click.fndtn.forms touchend.fndtn.forms', 'form.custom div.custom.dropdown li', function (e) {
var $this = $(this),
$customDropdown = $this.closest('div.custom.dropdown'),
$select = getFirstPrevSibling($customDropdown, 'select'),
selectedIndex = 0;
e.preventDefault();
e.stopPropagation();
if (!$(this).hasClass('disabled')) {
$('div.dropdown').not($customDropdown).removeClass('open');
var $oldThis = $this.closest('ul')
.find('li.selected');
$oldThis.removeClass('selected');
$this.addClass('selected');
$customDropdown.removeClass('open')
.find('a.current')
.text($this.text());
$this.closest('ul').find('li').each(function (index) {
if ($this[0] == this) {
selectedIndex = index;
}
});
$select[0].selectedIndex = selectedIndex;
//store the old value in data
$select.data('prevalue', $oldThis.html());
$select.trigger('change');
}
});
$(window).on('keydown', function (e) {
var focus = document.activeElement,
self = Foundation.libs.forms,
dropdown = $('.custom.dropdown.open');
if (dropdown.length > 0) {
e.preventDefault();
if (e.which === 13) {
dropdown.find('li.selected').trigger('click');
}
if (e.which === 27) {
dropdown.removeClass('open');
}
if (e.which >= 65 && e.which <= 90) {
var next = self.go_to(dropdown, e.which),
current = dropdown.find('li.selected');
if (next) {
current.removeClass('selected');
self.scrollTo(next.addClass('selected'), 300);
}
}
if (e.which === 38) {
var current = dropdown.find('li.selected'),
prev = current.prev(':not(.disabled)');
if (prev.length > 0) {
prev.parent()[0].scrollTop = prev.parent().scrollTop() - self.outerHeight(prev);
current.removeClass('selected');
prev.addClass('selected');
}
} else if (e.which === 40) {
var current = dropdown.find('li.selected'),
next = current.next(':not(.disabled)');
if (next.length > 0) {
next.parent()[0].scrollTop = next.parent().scrollTop() + self.outerHeight(next);
current.removeClass('selected');
next.addClass('selected');
}
}
}
});
this.settings.init = true;
},
go_to: function (dropdown, char) {
var lis = dropdown.find('li'),
count = lis.length;
if (count > 0) {
for (var i = 0; i < count; i++) {
var first_letter = lis.eq(i).text().charAt(0).toLowerCase();
if (first_letter === String.fromCharCode(char).toLowerCase()) return lis.eq(i);
}
}
},
scrollTo: function (el, duration) {
if (duration < 0) return;
var parent = el.parent();
var li_height = this.outerHeight(el);
var difference = (li_height * (el.index())) - parent.scrollTop();
var perTick = difference / duration * 10;
this.scrollToTimerCache = setTimeout(function () {
if (!isNaN(parseInt(perTick, 10))) {
parent[0].scrollTop = parent.scrollTop() + perTick;
this.scrollTo(el, duration - 10);
}
}.bind(this), 10);
},
append_custom_markup: function (idx, sel) {
var $this = $(sel),
type = $this.attr('type'),
$span = $this.next('span.custom.' + type);
if (!$this.parent().hasClass('switch')) {
$this.addClass('hidden-field');
}
if ($span.length === 0) {
$span = $('<span class="custom ' + type + '"></span>').insertAfter($this);
}
$span.toggleClass('checked', $this.is(':checked'));
$span.toggleClass('disabled', $this.is(':disabled'));
},
append_custom_select: function (idx, sel) {
var self = Foundation.libs.forms,
$this = $(sel),
$customSelect = $this.next('div.custom.dropdown'),
$customList = $customSelect.find('ul'),
$selectCurrent = $customSelect.find(".current"),
$selector = $customSelect.find(".selector"),
$options = $this.find('option'),
$selectedOption = $options.filter(':selected'),
copyClasses = $this.attr('class') ? $this.attr('class').split(' ') : [],
maxWidth = 0,
liHtml = '',
$listItems,
$currentSelect = false;
if ($this.hasClass(self.settings.disable_class)) return;
if ($customSelect.length === 0) {
var customSelectSize = $this.hasClass('small') ? 'small' : $this.hasClass('medium') ? 'medium' : $this.hasClass('large') ? 'large' : $this.hasClass('expand') ? 'expand' : '';
$customSelect = $('<div class="' + ['custom', 'dropdown', customSelectSize].concat(copyClasses).filter(function (item, idx, arr) {
if (item == '') return false;
return arr.indexOf(item) == idx;
}).join(' ') + '"><a href="#" class="selector"></a><ul /></div>');
$selector = $customSelect.find(".selector");
$customList = $customSelect.find("ul");
liHtml = $options.map(function () {
return "<li>" + $(this).html() + "</li>";
}).get().join('');
$customList.append(liHtml);
$currentSelect = $customSelect
.prepend('<a href="#" class="current">' + $selectedOption.html() + '</a>')
.find(".current");
$this.after($customSelect)
.addClass('hidden-field');
} else {
liHtml = $options.map(function () {
return "<li>" + $(this).html() + "</li>";
})
.get().join('');
$customList.html('')
.append(liHtml);
} // endif $customSelect.length === 0
self.assign_id($this, $customSelect);
$customSelect.toggleClass('disabled', $this.is(':disabled'));
$listItems = $customList.find('li');
// cache list length
self.cache[$customSelect.data('id')] = $listItems.length;
$options.each(function (index) {
if (this.selected) {
$listItems.eq(index).addClass('selected');
if ($currentSelect) {
$currentSelect.html($(this).html());
}
}
if ($(this).is(':disabled')) {
$listItems.eq(index).addClass('disabled');
}
});
//
// If we're not specifying a predetermined form size.
//
if (!$customSelect.is('.small, .medium, .large, .expand')) {
// ------------------------------------------------------------------------------------
// This is a work-around for when elements are contained within hidden parents.
// For example, when custom-form elements are inside of a hidden reveal modal.
//
// We need to display the current custom list element as well as hidden parent elements
// in order to properly calculate the list item element's width property.
// -------------------------------------------------------------------------------------
$customSelect.addClass('open');
//
// Quickly, display all parent elements.
// This should help us calcualate the width of the list item's within the drop down.
//
var self = Foundation.libs.forms;
self.hidden_fix.adjust($customList);
maxWidth = (self.outerWidth($listItems) > maxWidth) ? self.outerWidth($listItems) : maxWidth;
Foundation.libs.forms.hidden_fix.reset();
$customSelect.removeClass('open');
} // endif
},
assign_id: function ($select, $customSelect) {
var id = [+new Date(), Foundation.random_str(5)].join('-');
$select.attr('data-id', id);
$customSelect.attr('data-id', id);
},
refresh_custom_select: function ($select, force_refresh) {
var self = this;
var maxWidth = 0,
$customSelect = $select.next(),
$options = $select.find('option'),
$listItems = $customSelect.find('li');
if ($listItems.length != this.cache[$customSelect.data('id')] || force_refresh) {
$customSelect.find('ul').html('');
$options.each(function () {
var $li = $('<li>' + $(this).html() + '</li>');
$customSelect.find('ul').append($li);
});
// re-populate
$options.each(function (index) {
if (this.selected) {
$customSelect.find('li').eq(index).addClass('selected');
$customSelect.find('.current').html($(this).html());
}
if ($(this).is(':disabled')) {
$customSelect.find('li').eq(index).addClass('disabled');
}
});
// fix width
$customSelect.removeAttr('style')
.find('ul').removeAttr('style');
$customSelect.find('li').each(function () {
$customSelect.addClass('open');
if (self.outerWidth($(this)) > maxWidth) {
maxWidth = self.outerWidth($(this));
}
$customSelect.removeClass('open');
});
$listItems = $customSelect.find('li');
// cache list length
this.cache[$customSelect.data('id')] = $listItems.length;
}
},
toggle_checkbox: function ($element) {
var $input = $element.prev(),
input = $input[0];
if (false === $input.is(':disabled')) {
input.checked = ((input.checked) ? false : true);
$element.toggleClass('checked');
$input.trigger('change');
}
},
toggle_radio: function ($element) {
var $input = $element.prev(),
$form = $input.closest('form.custom'),
input = $input[0];
if (false === $input.is(':disabled')) {
$form.find('input[type="radio"][name="' + this.escape($input.attr('name')) + '"]')
.next().not($element).removeClass('checked');
if (!$element.hasClass('checked')) {
$element.toggleClass('checked');
}
input.checked = $element.hasClass('checked');
$input.trigger('change');
}
},
escape: function (text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
},
hidden_fix: {
/**
* Sets all hidden parent elements and self to visibile.
*
* @method adjust
* @param {jQuery Object} $child
*/
// We'll use this to temporarily store style properties.
tmp: [],
// We'll use this to set hidden parent elements.
hidden: null,
adjust: function ($child) {
// Internal reference.
var _self = this;
// Set all hidden parent elements, including this element.
_self.hidden = $child.parents().andSelf().filter(":hidden");
// Loop through all hidden elements.
_self.hidden.each(function () {
// Cache the element.
var $elem = $(this);
// Store the style attribute.
// Undefined if element doesn't have a style attribute.
_self.tmp.push($elem.attr('style'));
// Set the element's display property to block,
// but ensure it's visibility is hidden.
$elem.css({
'visibility': 'hidden',
'display': 'block'
});
});
}, // end adjust
/**
* Resets the elements previous state.
*
* @method reset
*/
reset: function () {
// Internal reference.
var _self = this;
// Loop through our hidden element collection.
_self.hidden.each(function (i) {
// Cache this element.
var $elem = $(this),
_tmp = _self.tmp[i]; // Get the stored 'style' value for this element.
// If the stored value is undefined.
if (_tmp === undefined)
// Remove the style attribute.
$elem.removeAttr('style');
else
// Otherwise, reset the element style attribute.
$elem.attr('style', _tmp);
});
// Reset the tmp array.
_self.tmp = [];
// Reset the hidden elements variable.
_self.hidden = null;
} // end reset
},
off: function () {
$(this.scope).off('.fndtn.forms');
}
};
var getFirstPrevSibling = function($el, selector) {
var $el = $el.prev();
while ($el.length) {
if ($el.is(selector)) return $el;
$el = $el.prev();
}
return $();
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,831 @@
/*jslint unparam: true, browser: true, indent: 2 */
(function ($, window, document, undefined) {
'use strict';
Foundation.libs.joyride = {
name: 'joyride',
version : '4.1.2',
defaults : {
expose : false, // turn on or off the expose feature
modal : false, // Whether to cover page with modal during the tour
tipLocation : 'bottom', // 'top' or 'bottom' in relation to parent
nubPosition : 'auto', // override on a per tooltip bases
scrollSpeed : 300, // Page scrolling speed in milliseconds, 0 = no scroll animation
timer : 0, // 0 = no timer , all other numbers = timer in milliseconds
startTimerOnClick : true, // true or false - true requires clicking the first button start the timer
startOffset : 0, // the index of the tooltip you want to start on (index of the li)
nextButton : true, // true or false to control whether a next button is used
tipAnimation : 'fade', // 'pop' or 'fade' in each tip
pauseAfter : [], // array of indexes where to pause the tour after
exposed : [], // array of expose elements
tipAnimationFadeSpeed: 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition
cookieMonster : false, // true or false to control whether cookies are used
cookieName : 'joyride', // Name the cookie you'll use
cookieDomain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com'
cookieExpires : 365, // set when you would like the cookie to expire.
tipContainer : 'body', // Where will the tip be attached
postRideCallback : function (){}, // A method to call once the tour closes (canceled or complete)
postStepCallback : function (){}, // A method to call after each step
preStepCallback : function (){}, // A method to call before each step
preRideCallback : function (){}, // A method to call before the tour starts (passed index, tip, and cloned exposed element)
postExposeCallback : 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>',
modal : '<div class="joyride-modal-bg"></div>',
expose : '<div class="joyride-expose-wrapper"></div>',
exposeCover: '<div class="joyride-expose-cover"></div>'
}
},
settings : {},
init : function (scope, method, options) {
this.scope = scope || this.scope;
Foundation.inherit(this, 'throttle data_options scrollTo scrollLeft delay');
if (typeof method === 'object') {
$.extend(true, this.settings, this.defaults, method);
} else {
$.extend(true, this.settings, this.defaults, options);
}
if (typeof method != 'string') {
if (!this.settings.init) this.events();
return this.settings.init;
} else {
return this[method].call(this, options);
}
},
events : function () {
var self = this;
$(this.scope)
.on('click.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) {
e.preventDefault();
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();
}
}.bind(this))
.on('click.joyride', '.joyride-close-tip', function (e) {
e.preventDefault();
this.end();
}.bind(this));
$(window).on('resize.fndtn.joyride', self.throttle(function () {
if ($('[data-joyride]').length > 0 && self.settings.$next_tip) {
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, true);
}
}
}, 100));
this.settings.init = true;
},
start : function () {
var self = this,
$this = $(this.scope).find('[data-joyride]'),
integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'],
int_settings_count = integer_settings.length;
if (!this.settings.init) this.init();
// non configureable settings
this.settings.$content_el = $this;
this.settings.$body = $(this.settings.tipContainer);
this.settings.body_offset = $(this.settings.tipContainer).position();
this.settings.$tip_content = this.settings.$content_el.find('> li');
this.settings.paused = false;
this.settings.attempts = 0;
this.settings.tipLocationPatterns = {
top: ['bottom'],
bottom: [], // bottom should not need to be repositioned
left: ['right', 'top', 'bottom'],
right: ['left', 'top', 'bottom']
};
// can we create cookies?
if (typeof $.cookie !== 'function') {
this.settings.cookieMonster = false;
}
// generate the tips and insert into dom.
if (!this.settings.cookieMonster || this.settings.cookieMonster && $.cookie(this.settings.cookieName) === null) {
this.settings.$tip_content.each(function (index) {
var $this = $(this);
$.extend(true, self.settings, self.data_options($this));
// Make sure that settings parsed from data_options are integers where necessary
for (var i = int_settings_count - 1; i >= 0; 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.startTimerOnClick && 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.button_text(opts.button_text) +
this.settings.template.link +
this.timer_instance(opts.index);
$blank.append($(this.settings.template.wrapper));
$blank.first().attr('data-index', opts.index);
$('.joyride-content-wrapper', $blank).append(content);
return $blank[0];
},
timer_instance : function (index) {
var txt;
if ((index === 0 && this.settings.startTimerOnClick && this.settings.timer > 0) || this.settings.timer === 0) {
txt = '';
} else {
txt = this.outerHTML($(this.settings.template.timer)[0]);
}
return txt;
},
button_text : function (txt) {
if (this.settings.nextButton) {
txt = $.trim(txt) || 'Next';
txt = this.outerHTML($(this.settings.template.button).append(txt)[0]);
} else {
txt = '';
}
return txt;
},
create : function (opts) {
var buttonText = opts.$li.attr('data-button') || opts.$li.attr('data-text'),
tipClass = opts.$li.attr('class'),
$tip_content = $(this.tip_template({
tip_class : tipClass,
index : opts.index,
button_text : buttonText,
li : opts.$li
}));
$(this.settings.tipContainer).append($tip_content);
},
show : function (init) {
var $timer = null;
// are we paused?
if (this.settings.$li === undefined
|| ($.inArray(this.settings.$li.index(), this.settings.pauseAfter) === -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);
}
this.settings.attempts = 0;
if (this.settings.$li.length && this.settings.$target.length > 0) {
if (init) { //run when we first start
this.settings.preRideCallback(this.settings.$li.index(), this.settings.$next_tip);
if (this.settings.modal) {
this.show_modal();
}
}
this.settings.preStepCallback(this.settings.$li.index(), this.settings.$next_tip);
if (this.settings.modal && this.settings.expose) {
this.expose();
}
this.settings.tipSettings = $.extend(this.settings, this.data_options(this.settings.$li));
this.settings.timer = parseInt(this.settings.timer, 10);
this.settings.tipSettings.tipLocationPattern = this.settings.tipLocationPatterns[this.settings.tipSettings.tipLocation];
// scroll if not modal
if (!/body/i.test(this.settings.$target.selector)) {
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.tipAnimation)) {
$timer.width(0);
if (this.settings.timer > 0) {
this.settings.$next_tip.show();
this.delay(function () {
$timer.animate({
width: $timer.parent().width()
}, this.settings.timer, 'linear');
}.bind(this), this.settings.tipAnimationFadeSpeed);
} else {
this.settings.$next_tip.show();
}
} else if (/fade/i.test(this.settings.tipAnimation)) {
$timer.width(0);
if (this.settings.timer > 0) {
this.settings.$next_tip
.fadeIn(this.settings.tipAnimationFadeSpeed)
.show();
this.delay(function () {
$timer.animate({
width: $timer.parent().width()
}, this.settings.timer, 'linear');
}.bind(this), this.settings.tipAnimationFadeSpeed);
} else {
this.settings.$next_tip.fadeIn(this.settings.tipAnimationFadeSpeed);
}
}
this.settings.$current_tip = this.settings.$next_tip;
// skip non-existant targets
} else if (this.settings.$li && this.settings.$target.length < 1) {
this.show();
} else {
this.end();
}
} else {
this.settings.paused = true;
}
},
is_phone : function () {
if (Modernizr) {
return Modernizr.mq('only screen and (max-width: 767px)') || $('.lt-ie9').length > 0;
}
return (this.settings.$window.width() < 767);
},
hide : function () {
if (this.settings.modal && this.settings.expose) {
this.un_expose();
}
if (!this.settings.modal) {
$('.joyride-modal-bg').hide();
}
this.settings.$current_tip.hide();
this.settings.postStepCallback(this.settings.$li.index(),
this.settings.$current_tip);
},
set_li : function (init) {
if (init) {
this.settings.$li = this.settings.$tip_content.eq(this.settings.startOffset);
this.set_next_tip();
this.settings.$current_tip = this.settings.$next_tip;
} 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[data-index='" + this.settings.$li.index() + "']");
this.settings.$next_tip.data('closed', '');
},
set_target : function () {
var cl = this.settings.$li.attr('data-class'),
id = this.settings.$li.attr('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.outerHeight(this.settings.$next_tip));
if (tipOffset > 0) {
this.scrollTo($('html, body'), tipOffset, this.settings.scrollSpeed);
}
},
paused : function () {
return ($.inArray((this.settings.$li.index() + 1), this.settings.pauseAfter) === -1);
},
restart : function () {
this.hide();
this.settings.$li = undefined;
this.show('init');
},
pos_default : function (init, resizing) {
var half_fold = Math.ceil($(window).height() / 2),
tip_position = this.settings.$next_tip.offset(),
$nub = this.settings.$next_tip.find('.joyride-nub'),
nub_width = Math.ceil(this.outerWidth($nub) / 2),
nub_height = Math.ceil(this.outerHeight($nub) / 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 (typeof resizing === 'undefined') {
resizing = false;
}
if (!/body/i.test(this.settings.$target.selector)) {
if (this.bottom()) {
var leftOffset = this.settings.$target.offset().left;
if (Foundation.rtl) {
leftOffset = this.settings.$target.offset().width - this.settings.$next_tip.width() + leftOffset;
}
this.settings.$next_tip.css({
top: (this.settings.$target.offset().top + nub_height + this.outerHeight(this.settings.$target)),
left: leftOffset});
this.nub_position($nub, this.settings.tipSettings.nubPosition, 'top');
} else if (this.top()) {
var leftOffset = this.settings.$target.offset().left;
if (Foundation.rtl) {
leftOffset = this.settings.$target.offset().width - this.settings.$next_tip.width() + leftOffset;
}
this.settings.$next_tip.css({
top: (this.settings.$target.offset().top - this.outerHeight(this.settings.$next_tip) - nub_height),
left: leftOffset});
this.nub_position($nub, this.settings.tipSettings.nubPosition, 'bottom');
} else if (this.right()) {
this.settings.$next_tip.css({
top: this.settings.$target.offset().top,
left: (this.outerWidth(this.settings.$target) + this.settings.$target.offset().left + nub_width)});
this.nub_position($nub, this.settings.tipSettings.nubPosition, 'left');
} else if (this.left()) {
this.settings.$next_tip.css({
top: this.settings.$target.offset().top,
left: (this.settings.$target.offset().left - this.outerWidth(this.settings.$next_tip) - nub_width)});
this.nub_position($nub, this.settings.tipSettings.nubPosition, 'right');
}
if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tipSettings.tipLocationPattern.length) {
$nub.removeClass('bottom')
.removeClass('top')
.removeClass('right')
.removeClass('left');
this.settings.tipSettings.tipLocation = this.settings.tipSettings.tipLocationPattern[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.outerHeight(this.settings.$next_tip),
tip_offset = this.settings.$next_tip.offset(),
target_height = this.outerHeight(this.settings.$target),
$nub = $('.joyride-nub', this.settings.$next_tip),
nub_height = Math.ceil(this.outerHeight($nub) / 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) {
$('body').append(this.settings.template.modal).show();
}
if (/pop/i.test(this.settings.tipAnimation)) {
joyridemodalbg.show();
} else {
joyridemodalbg.fadeIn(this.settings.tipAnimationFadeSpeed);
}
}
},
expose : function () {
var expose,
exposeCover,
el,
origCSS,
randId = 'expose-'+Math.floor(Math.random()*10000);
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: this.outerWidth(el, true),
height: this.outerHeight(el, true)
});
exposeCover = $(this.settings.template.exposeCover);
origCSS = {
zIndex: el.css('z-index'),
position: el.css('position')
};
el.css('z-index',parseInt(expose.css('z-index'))+1);
if (origCSS.position == 'static') {
el.css('position','relative');
}
el.data('expose-css',origCSS);
exposeCover.css({
top: el.offset().top,
left: el.offset().left,
width: this.outerWidth(el, true),
height: this.outerHeight(el, true)
});
this.settings.$body.append(exposeCover);
expose.addClass(randId);
exposeCover.addClass(randId);
el.data('expose', randId);
this.settings.postExposeCallback(this.settings.$li.index(), this.settings.$next_tip, el);
this.add_exposed(el);
},
un_expose : function () {
var exposeId,
el,
expose ,
origCSS,
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);
}
}
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, count;
if (el instanceof $) {
search = el[0]
} else if (typeof el == 'string'){
search = el;
}
this.settings.exposed = this.settings.exposed || [];
count = this.settings.exposed.length;
for (var i=0; i < count; 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.outerHeight(this.settings.$next_tip)) / 2) + $w.scrollTop()),
left : ((($w.width() - this.outerWidth(this.settings.$next_tip)) / 2) + this.scrollLeft($w))
});
return true;
},
bottom : function () {
return /bottom/i.test(this.settings.tipSettings.tipLocation);
},
top : function () {
return /top/i.test(this.settings.tipSettings.tipLocation);
},
right : function () {
return /right/i.test(this.settings.tipSettings.tipLocation);
},
left : function () {
return /left/i.test(this.settings.tipSettings.tipLocation);
},
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() + this.scrollLeft(w),
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(),
this.scrollLeft(w) > 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 () {
if (this.settings.cookieMonster) {
$.cookie(this.settings.cookieName, 'ridden', { expires: this.settings.cookieExpires, domain: this.settings.cookieDomain });
}
if (this.settings.timer > 0) {
clearTimeout(this.settings.automate);
}
if (this.settings.modal && this.settings.expose) {
this.un_expose();
}
this.settings.$next_tip.data('closed', true);
$('.joyride-modal-bg').hide();
this.settings.$current_tip.hide();
this.settings.postStepCallback(this.settings.$li.index(), this.settings.$current_tip);
this.settings.postRideCallback(this.settings.$li.index(), this.settings.$current_tip);
$('.joyride-tip-guide').remove();
},
outerHTML : function (el) {
// support FireFox < 11
return el.outerHTML || new XMLSerializer().serializeToString(el);
},
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 = {};
}
};
}(Foundation.zj, this, this.document));
+401
View File
@@ -0,0 +1,401 @@
/*
* Foundation Responsive Library
* http://foundation.zurb.com
* Copyright 2013, ZURB
* Free to use under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*/
/*jslint unparam: true, browser: true, indent: 2 */
// Accommodate running jQuery or Zepto in noConflict() mode by
// using an anonymous function to redefine the $ shorthand name.
// See http://docs.jquery.com/Using_jQuery_with_Other_Libraries
// and http://zeptojs.com/
var libFuncName = null;
if (typeof jQuery === "undefined" &&
typeof Zepto === "undefined" &&
typeof $ === "function") {
libFuncName = $;
} else if (typeof jQuery === "function") {
libFuncName = jQuery;
} else if (typeof Zepto === "function") {
libFuncName = Zepto;
} else {
throw new TypeError();
}
(function ($, window, document, undefined) {
'use strict';
// add dusty browser stuff
if (!Array.prototype.filter) {
Array.prototype.filter = function(fun /*, thisp */) {
"use strict";
if (this == null) {
throw new TypeError();
}
var t = Object(this),
len = t.length >>> 0;
if (typeof fun != "function") {
return;
}
var res = [],
thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in t) {
var val = t[i]; // in case fun mutates this
if (fun && fun.call(thisp, val, i, t)) {
res.push(val);
}
}
}
return res;
}
}
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
"use strict";
if (this == null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (len === 0) {
return -1;
}
var n = 0;
if (arguments.length > 1) {
n = Number(arguments[1]);
if (n != n) { // shortcut for verifying if it's NaN
n = 0;
} else if (n != 0 && n != Infinity && n != -Infinity) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
}
if (n >= len) {
return -1;
}
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++) {
if (k in t && t[k] === searchElement) {
return k;
}
}
return -1;
}
}
// fake stop() for zepto.
$.fn.stop = $.fn.stop || function() {
return this;
};
window.Foundation = {
name : 'Foundation',
version : '4.1.5',
// global Foundation cache object
cache : {},
init : function (scope, libraries, method, options, response, /* internal */ nc) {
var library_arr,
args = [scope, method, options, response],
responses = [],
nc = nc || false;
// disable library error catching,
// used for development only
if (nc) this.nc = nc;
// check RTL
this.rtl = /rtl/i.test($('html').attr('dir'));
// set foundation global scope
this.scope = scope || this.scope;
if (libraries && typeof libraries === 'string') {
if (/off/i.test(libraries)) return this.off();
library_arr = libraries.split(' ');
if (library_arr.length > 0) {
for (var i = library_arr.length - 1; i >= 0; i--) {
responses.push(this.init_lib(library_arr[i], args));
}
}
} else {
for (var lib in this.libs) {
responses.push(this.init_lib(lib, args));
}
}
// if first argument is callback, add to args
if (typeof libraries === 'function') {
args.unshift(libraries);
}
return this.response_obj(responses, args);
},
response_obj : function (response_arr, args) {
for (var i = 0, len = args.length; i < len; i++) {
if (typeof args[i] === 'function') {
return args[i]({
errors: response_arr.filter(function (s) {
if (typeof s === 'string') return s;
})
});
}
}
return response_arr;
},
init_lib : function (lib, args) {
return this.trap(function () {
if (this.libs.hasOwnProperty(lib)) {
this.patch(this.libs[lib]);
return this.libs[lib].init.apply(this.libs[lib], args);
}
}.bind(this), lib);
},
trap : function (fun, lib) {
if (!this.nc) {
try {
return fun();
} catch (e) {
return this.error({name: lib, message: 'could not be initialized', more: e.name + ' ' + e.message});
}
}
return fun();
},
patch : function (lib) {
this.fix_outer(lib);
lib.scope = this.scope;
lib.rtl = this.rtl;
},
inherit : function (scope, methods) {
var methods_arr = methods.split(' ');
for (var i = methods_arr.length - 1; i >= 0; i--) {
if (this.lib_methods.hasOwnProperty(methods_arr[i])) {
this.libs[scope.name][methods_arr[i]] = this.lib_methods[methods_arr[i]];
}
}
},
random_str : function (length) {
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split('');
if (!length) {
length = Math.floor(Math.random() * chars.length);
}
var str = '';
for (var i = 0; i < length; i++) {
str += chars[Math.floor(Math.random() * chars.length)];
}
return str;
},
libs : {},
// methods that can be inherited in libraries
lib_methods : {
set_data : function (node, data) {
// this.name references the name of the library calling this method
var id = [this.name,+new Date(),Foundation.random_str(5)].join('-');
Foundation.cache[id] = data;
node.attr('data-' + this.name + '-id', id);
return data;
},
get_data : function (node) {
return Foundation.cache[node.attr('data-' + this.name + '-id')];
},
remove_data : function (node) {
if (node) {
delete Foundation.cache[node.attr('data-' + this.name + '-id')];
node.attr('data-' + this.name + '-id', '');
} else {
$('[data-' + this.name + '-id]').each(function () {
delete Foundation.cache[$(this).attr('data-' + this.name + '-id')];
$(this).attr('data-' + this.name + '-id', '');
});
}
},
throttle : function(fun, delay) {
var timer = null;
return function () {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fun.apply(context, args);
}, delay);
};
},
// parses data-options attribute on nodes and turns
// them into an object
data_options : function (el) {
var opts = {}, ii, p,
opts_arr = (el.attr('data-options') || ':').split(';'),
opts_len = 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;
}
// parse options
for (ii = opts_len - 1; ii >= 0; ii--) {
p = opts_arr[ii].split(':');
if (/true/i.test(p[1])) p[1] = true;
if (/false/i.test(p[1])) p[1] = false;
if (isNumber(p[1])) p[1] = parseInt(p[1], 10);
if (p.length === 2 && p[0].length > 0) {
opts[trim(p[0])] = trim(p[1]);
}
}
return opts;
},
delay : function (fun, delay) {
return setTimeout(fun, delay);
},
// animated scrolling
scrollTo : function (el, to, duration) {
if (duration < 0) return;
var difference = to - $(window).scrollTop();
var perTick = difference / duration * 10;
this.scrollToTimerCache = setTimeout(function() {
if (!isNaN(parseInt(perTick, 10))) {
window.scrollTo(0, $(window).scrollTop() + perTick);
this.scrollTo(el, to, duration - 10);
}
}.bind(this), 10);
},
// not supported in core Zepto
scrollLeft : function (el) {
if (!el.length) return;
return ('scrollLeft' in el[0]) ? el[0].scrollLeft : el[0].pageXOffset;
},
// test for empty object or array
empty : function (obj) {
if (obj.length && obj.length > 0) return false;
if (obj.length && obj.length === 0) return true;
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) return false;
}
return true;
}
},
fix_outer : function (lib) {
lib.outerHeight = function (el, bool) {
if (typeof Zepto === 'function') {
return el.height();
}
if (typeof bool !== 'undefined') {
return el.outerHeight(bool);
}
return el.outerHeight();
};
lib.outerWidth = function (el) {
if (typeof Zepto === 'function') {
return el.width();
}
if (typeof bool !== 'undefined') {
return el.outerWidth(bool);
}
return el.outerWidth();
};
},
error : function (error) {
return error.name + ' ' + error.message + '; ' + error.more;
},
// remove all foundation events.
off: function () {
$(this.scope).off('.fndtn');
$(window).off('.fndtn');
return true;
},
zj : function () {
try {
return Zepto;
} catch (e) {
return jQuery;
}
}()
};
$.fn.foundation = function () {
var args = Array.prototype.slice.call(arguments, 0);
return this.each(function () {
Foundation.init.apply(Foundation, [this].concat(args));
return this;
});
};
}(libFuncName, this, this.document));
@@ -0,0 +1,130 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.magellan = {
name : 'magellan',
version : '4.0.0',
settings : {
activeClass: 'active'
},
init : function (scope, method, options) {
this.scope = scope || this.scope;
Foundation.inherit(this, 'data_options');
if (typeof method === 'object') {
$.extend(true, this.settings, method);
}
if (typeof method != 'string') {
if (!this.settings.init) {
this.fixed_magellan = $("[data-magellan-expedition]");
this.set_threshold();
this.last_destination = $('[data-magellan-destination]').last();
this.events();
}
return this.settings.init;
} else {
return this[method].call(this, options);
}
},
events : function () {
var self = this;
$(this.scope).on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) {
var $destination = $(this),
$expedition = $destination.closest('[data-magellan-expedition]'),
activeClass = $expedition.attr('data-magellan-active-class')
|| self.settings.activeClass;
$destination
.closest('[data-magellan-expedition]')
.find('[data-magellan-arrival]')
.not($destination)
.removeClass(activeClass);
$destination.addClass(activeClass);
});
this.fixed_magellan
.on('update-position.fndtn.magellan', function(){
var $el = $(this);
// $el.data("magellan-fixed-position","");
//$el.data("magellan-top-offset", "");
})
.trigger('update-position');
$(window)
.on('resize.fndtn.magellan', function() {
this.fixed_magellan.trigger('update-position');
}.bind(this))
.on('scroll.fndtn.magellan', function() {
var windowScrollTop = $(window).scrollTop();
self.fixed_magellan.each(function() {
var $expedition = $(this);
if (typeof $expedition.data('magellan-top-offset') === 'undefined') {
$expedition.data('magellan-top-offset', $expedition.offset().top);
}
if (typeof $expedition.data('magellan-fixed-position') === 'undefined') {
$expedition.data('magellan-fixed-position', false)
}
var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset");
var attr = $expedition.attr('data-magellan-top-offset');
if ($expedition.data("magellan-fixed-position") != fixed_position) {
$expedition.data("magellan-fixed-position", fixed_position);
if (fixed_position) {
$expedition.css({position:"fixed", top:0});
} else {
$expedition.css({position:"", top:""});
}
if (fixed_position && typeof attr != 'undefined' && attr != false) {
$expedition.css({position:"fixed", top:attr + "px"});
}
}
});
});
if (this.last_destination.length > 0) {
$(window).on('scroll.fndtn.magellan', function (e) {
var windowScrollTop = $(window).scrollTop(),
scrolltopPlusHeight = windowScrollTop + $(window).height(),
lastDestinationTop = Math.ceil(self.last_destination.offset().top);
$('[data-magellan-destination]').each(function () {
var $destination = $(this),
destination_name = $destination.attr('data-magellan-destination'),
topOffset = $destination.offset().top - windowScrollTop;
if (topOffset <= self.settings.threshold) {
$("[data-magellan-arrival='" + destination_name + "']").trigger('arrival');
}
// In large screens we may hit the bottom of the page and dont reach the top of the last magellan-destination, so lets force it
if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) {
$('[data-magellan-arrival]').last().trigger('arrival');
}
});
});
}
this.settings.init = true;
},
set_threshold : function () {
if (!this.settings.threshold) {
this.settings.threshold = (this.fixed_magellan.length > 0) ?
this.outerHeight(this.fixed_magellan, true) : 0;
}
},
off : function () {
$(this.scope).off('.fndtn.magellan');
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,373 @@
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs = Foundation.libs || {};
Foundation.libs.orbit = {
name: 'orbit',
version: '4.1.0',
settings: {
timer_speed: 10000,
animation_speed: 500,
bullets: true,
stack_on_small: true,
navigation_arrows: true,
slide_number: true,
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',
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'
},
init: function (scope, method, options) {
var self = this;
Foundation.inherit(self, 'data_options');
if (typeof method === 'object') {
$.extend(true, self.settings, method);
}
$('[data-orbit]', scope).each(function(idx, el) {
var scoped_self = $.extend(true, {}, self);
scoped_self._init(idx, el);
});
},
_container_html: function() {
var self = this;
return '<div class="' + self.settings.container_class + '"></div>';
},
_bullets_container_html: function($slides) {
var self = this,
$list = $('<ol class="' + self.settings.bullets_container_class + '"></ol>');
$slides.each(function(idx, slide) {
var $item = $('<li data-orbit-slide-number="' + (idx+1) + '" class=""></li>');
if (idx === 0) {
$item.addClass(self.settings.bullets_active_class);
}
$list.append($item);
});
return $list;
},
_slide_number_html: function(slide_number, total_slides) {
var self = this,
$container = $('<div class="' + self.settings.slide_number_class + '"></div>');
$container.append('<span>' + slide_number + '</span> of <span>' + total_slides + '</span>');
return $container;
},
_timer_html: function() {
var self = this;
if (typeof self.settings.timer_speed === 'number' && self.settings.timer_speed > 0) {
return '<div class="' + self.settings.timer_container_class
+ '"><span></span><div class="' + self.settings.timer_progress_class
+ '"></div></div>';
} else {
return '';
}
},
_next_html: function() {
var self = this;
return '<a href="#" class="' + self.settings.next_class + '">Next <span></span></a>';
},
_prev_html: function() {
var self = this;
return '<a href="#" class="' + self.settings.prev_class + '">Prev <span></span></a>';
},
_init: function (idx, slider) {
var self = this,
$slides_container = $(slider),
$container = $slides_container.wrap(self._container_html()).parent(),
$slides = $slides_container.children();
$.extend(true, self.settings, self.data_options($slides_container));
if (self.settings.navigation_arrows) {
$container.append(self._prev_html());
$container.append(self._next_html());
}
$slides_container.addClass(self.settings.slides_container_class);
if (self.settings.stack_on_small) {
$container.addClass(self.settings.stack_on_small_class);
}
if (self.settings.slide_number) {
$container.append(self._slide_number_html(1, $slides.length));
}
$container.append(self._timer_html());
if (self.settings.bullets) {
$container.after(self._bullets_container_html($slides));
}
// To better support the "sliding" effect it's easier
// if we just clone the first and last slides
$slides_container.append($slides.first().clone().attr('data-orbit-slide',''));
$slides_container.prepend($slides.last().clone().attr('data-orbit-slide',''));
// Make the first "real" slide active
$slides_container.css('marginLeft', '-100%');
$slides.first().addClass(self.settings.active_slide_class);
self._init_events($slides_container);
self._init_dimensions($slides_container);
self._start_timer($slides_container);
},
_init_events: function ($slides_container) {
var self = this,
$container = $slides_container.parent();
$(window)
.on('load.fndtn.orbit', function() {
$slides_container.height('');
$slides_container.height($slides_container.height($container.height()));
$slides_container.trigger('orbit:ready');
})
.on('resize.fndtn.orbit', function() {
$slides_container.height('');
$slides_container.height($slides_container.height($container.height()));
});
$(document).on('click.fndtn.orbit', '[data-orbit-link]', function(e) {
e.preventDefault();
var id = $(e.currentTarget).attr('data-orbit-link'),
$slide = $slides_container.find('[data-orbit-slide=' + id + ']').first();
if ($slide.length === 1) {
self._reset_timer($slides_container, true);
self._goto($slides_container, $slide.index(), function() {});
}
});
$container.siblings('.' + self.settings.bullets_container_class)
.on('click.fndtn.orbit', '[data-orbit-slide-number]', function(e) {
e.preventDefault();
self._reset_timer($slides_container, true);
self._goto($slides_container, $(e.currentTarget).data('orbit-slide-number'),function() {});
});
$container
.on('orbit:after-slide-change.fndtn.orbit', function(e, orbit) {
var $slide_number = $container.find('.' + self.settings.slide_number_class);
if ($slide_number.length === 1) {
$slide_number.replaceWith(self._slide_number_html(orbit.slide_number, orbit.total_slides));
}
})
.on('orbit:next-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.next_class, function(e) {
e.preventDefault();
self._reset_timer($slides_container, true);
self._goto($slides_container, 'next', function() {});
})
.on('orbit:prev-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.prev_class, function(e) {
e.preventDefault();
self._reset_timer($slides_container, true);
self._goto($slides_container, 'prev', function() {});
})
.on('orbit:toggle-play-pause.fndtn.orbit click.fndtn.orbit touchstart.fndtn.orbit', '.' + self.settings.timer_container_class, function(e) {
e.preventDefault();
var $timer = $(e.currentTarget).toggleClass(self.settings.timer_paused_class),
$slides_container = $timer.closest('.' + self.settings.container_class)
.find('.' + self.settings.slides_container_class);
if ($timer.hasClass(self.settings.timer_paused_class)) {
self._stop_timer($slides_container);
} else {
self._start_timer($slides_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();
self._stop_timer($slides_container);
var direction = (data.delta_x < 0) ? 'next' : 'prev';
data.active = true;
self._goto($slides_container, direction, function() {});
}
})
.on('touchend.fndtn.orbit', function(e) {
$container.data('swipe-transition', {});
e.stopPropagation();
});
},
_init_dimensions: function ($slides_container) {
var $container = $slides_container.parent(),
$slides = $slides_container.children();
$slides_container.css('width', $slides.length * 100 + '%');
$slides.css('width', 100 / $slides.length + '%');
$slides_container.height($container.height());
$slides_container.css('width', $slides.length * 100 + '%');
},
_start_timer: function ($slides_container) {
var self = this,
$container = $slides_container.parent();
var callback = function() {
self._reset_timer($slides_container, false);
self._goto($slides_container, 'next', function() {
self._start_timer($slides_container);
});
};
var $timer = $container.find('.' + self.settings.timer_container_class),
$progress = $timer.find('.' + self.settings.timer_progress_class),
progress_pct = ($progress.width() / $timer.width()),
delay = self.settings.timer_speed - (progress_pct * self.settings.timer_speed);
$progress.animate({'width': '100%'}, delay, 'linear', callback);
$slides_container.trigger('orbit:timer-started');
},
_stop_timer: function ($slides_container) {
var self = this,
$container = $slides_container.parent(),
$timer = $container.find('.' + self.settings.timer_container_class),
$progress = $timer.find('.' + self.settings.timer_progress_class),
progress_pct = $progress.width() / $timer.width();
self._rebuild_timer($container, progress_pct * 100 + '%');
// $progress.stop();
$slides_container.trigger('orbit:timer-stopped');
$timer = $container.find('.' + self.settings.timer_container_class);
$timer.addClass(self.settings.timer_paused_class);
},
_reset_timer: function($slides_container, is_paused) {
var self = this,
$container = $slides_container.parent();
self._rebuild_timer($container, '0%');
if (typeof is_paused === 'boolean' && is_paused) {
var $timer = $container.find('.' + self.settings.timer_container_class);
$timer.addClass(self.settings.timer_paused_class);
}
},
_rebuild_timer: function ($container, width_pct) {
// Zepto is unable to stop animations since they
// are css-based. This is a workaround for that
// limitation, which rebuilds the dom element
// thus stopping the animation
var self = this,
$timer = $container.find('.' + self.settings.timer_container_class),
$new_timer = $(self._timer_html()),
$new_timer_progress = $new_timer.find('.' + self.settings.timer_progress_class);
if (typeof Zepto === 'function') {
$timer.remove();
$container.append($new_timer);
$new_timer_progress.css('width', width_pct);
} else if (typeof jQuery === 'function') {
var $progress = $timer.find('.' + self.settings.timer_progress_class);
$progress.css('width', width_pct);
$progress.stop();
}
},
_goto: function($slides_container, index_or_direction, callback) {
var self = this,
$container = $slides_container.parent(),
$slides = $slides_container.children(),
$active_slide = $slides_container.find('.' + self.settings.active_slide_class),
active_index = $active_slide.index(),
margin_position = Foundation.rtl ? 'marginRight' : 'marginLeft';
if ($container.hasClass(self.settings.orbit_transition_class)) {
return false;
}
if (index_or_direction === 'prev') {
if (active_index === 0) {
active_index = $slides.length - 1;
}
else {
active_index--;
}
}
else if (index_or_direction === 'next') {
active_index = (active_index+1) % $slides.length;
}
else if (typeof index_or_direction === 'number') {
active_index = (index_or_direction % $slides.length);
}
if (active_index === ($slides.length - 1) && index_or_direction === 'next') {
$slides_container.css(margin_position, '0%');
active_index = 1;
}
else if (active_index === 0 && index_or_direction === 'prev') {
$slides_container.css(margin_position, '-' + ($slides.length - 1) * 100 + '%');
active_index = $slides.length - 2;
}
// Start transition, make next slide active
$container.addClass(self.settings.orbit_transition_class);
$active_slide.removeClass(self.settings.active_slide_class);
$($slides[active_index]).addClass(self.settings.active_slide_class);
// Make next bullet active
var $bullets = $container.siblings('.' + self.settings.bullets_container_class);
if ($bullets.length === 1) {
$bullets.children().removeClass(self.settings.bullets_active_class);
$($bullets.children()[active_index-1]).addClass(self.settings.bullets_active_class);
}
var new_margin_left = '-' + (active_index * 100) + '%';
// Check to see if animation will occur, otherwise perform
// callbacks manually
$slides_container.trigger('orbit:before-slide-change');
if ($slides_container.css(margin_position) === new_margin_left) {
$container.removeClass(self.settings.orbit_transition_class);
$slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
callback();
} else {
var properties = {};
properties[margin_position] = new_margin_left;
$slides_container.animate(properties, self.settings.animation_speed, 'linear', function() {
$container.removeClass(self.settings.orbit_transition_class);
$slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
callback();
});
}
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,159 @@
/*! http://mths.be/placeholder v2.0.7 by @mathias
Modified to work with Zepto.js by ZURB
*/
;(function(window, document, $) {
var isInputSupported = 'placeholder' in document.createElement('input'),
isTextareaSupported = 'placeholder' in document.createElement('textarea'),
prototype = $.fn,
valHooks = $.valHooks,
hooks,
placeholder;
if (isInputSupported && isTextareaSupported) {
placeholder = prototype.placeholder = function() {
return this;
};
placeholder.input = placeholder.textarea = true;
} else {
placeholder = prototype.placeholder = function() {
var $this = this;
$this
.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
.not('.placeholder')
.bind({
'focus.placeholder': clearPlaceholder,
'blur.placeholder': setPlaceholder
})
.data('placeholder-enabled', true)
.trigger('blur.placeholder');
return $this;
};
placeholder.input = isInputSupported;
placeholder.textarea = isTextareaSupported;
hooks = {
'get': function(element) {
var $element = $(element);
return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
},
'set': function(element, value) {
var $element = $(element);
if (!$element.data('placeholder-enabled')) {
return element.value = value;
}
if (value == '') {
element.value = value;
// Issue #56: Setting the placeholder causes problems if the element continues to have focus.
if (element != document.activeElement) {
// We can't use `triggerHandler` here because of dummy text/password inputs :(
setPlaceholder.call(element);
}
} else if ($element.hasClass('placeholder')) {
clearPlaceholder.call(element, true, value) || (element.value = value);
} else {
element.value = value;
}
// `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
return $element;
}
};
isInputSupported || (valHooks.input = hooks);
isTextareaSupported || (valHooks.textarea = hooks);
$(function() {
// Look for forms
$(document).delegate('form', 'submit.placeholder', function() {
// Clear the placeholder values so they don't get submitted
var $inputs = $('.placeholder', this).each(clearPlaceholder);
setTimeout(function() {
$inputs.each(setPlaceholder);
}, 10);
});
});
// Clear placeholder values upon page reload
$(window).bind('beforeunload.placeholder', function() {
$('.placeholder').each(function() {
this.value = '';
});
});
}
function args(elem) {
// Return an object of element attributes
var newAttrs = {},
rinlinejQuery = /^jQuery\d+$/;
$.each(elem.attributes, function(i, attr) {
if (attr.specified && !rinlinejQuery.test(attr.name)) {
newAttrs[attr.name] = attr.value;
}
});
return newAttrs;
}
function clearPlaceholder(event, value) {
var input = this,
$input = $(input);
if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
if ($input.data('placeholder-password')) {
$input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
// If `clearPlaceholder` was called from `$.valHooks.input.set`
if (event === true) {
return $input[0].value = value;
}
$input.focus();
} else {
input.value = '';
$input.removeClass('placeholder');
input == document.activeElement && input.select();
}
}
}
function setPlaceholder() {
var $replacement,
input = this,
$input = $(input),
$origInput = $input,
id = this.id;
if (input.value == '') {
if (input.type == 'password') {
if (!$input.data('placeholder-textinput')) {
try {
$replacement = $input.clone().attr({ 'type': 'text' });
} catch(e) {
$replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
}
$replacement
.removeAttr('name')
.data({
'placeholder-password': true,
'placeholder-id': id
})
.bind('focus.placeholder', clearPlaceholder);
$input
.data({
'placeholder-textinput': $replacement,
'placeholder-id': id
})
.before($replacement);
}
$input = $input.removeAttr('id').hide().prev().attr('id', id).show();
// Note: `$input[0] != input` now!
}
$input.addClass('placeholder');
$input[0].value = $input.attr('placeholder');
} else {
$input.removeClass('placeholder');
}
}
}(this, document, Foundation.zj));
@@ -0,0 +1,277 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.reveal = {
name: 'reveal',
version : '4.1.3',
locked : false,
settings : {
animation: 'fadeAndPop',
animationSpeed: 250,
closeOnBackgroundClick: true,
dismissModalClass: 'close-reveal-modal',
bgClass: 'reveal-modal-bg',
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) {
this.scope = scope || this.scope;
Foundation.inherit(this, 'data_options delay');
if (typeof method === 'object') {
$.extend(true, this.settings, method);
} else if (typeof options !== 'undefined') {
$.extend(true, this.settings, options);
}
if (typeof method != 'string') {
this.events();
return this.settings.init;
} else {
return this[method].call(this, options);
}
},
events : function () {
var self = this;
$(this.scope)
.off('.fndtn.reveal')
.on('click.fndtn.reveal', '[data-reveal-id]', function (e) {
e.preventDefault();
if (!self.locked) {
self.locked = true;
self.open.call(self, $(this));
}
})
.on('click.fndtn.reveal touchend.click.fndtn.reveal', this.close_targets(), function (e) {
e.preventDefault();
if (!self.locked) {
var settings = $.extend({}, self.settings, self.data_options($('.reveal-modal.open')));
if ($(e.target)[0] === $('.' + settings.bgClass)[0] && !settings.closeOnBackgroundClick) {
return;
}
self.locked = true;
self.close.call(self, $(this).closest('.reveal-modal'));
}
})
.on('open.fndtn.reveal', '.reveal-modal', this.settings.open)
.on('opened.fndtn.reveal', '.reveal-modal', this.settings.opened)
.on('opened.fndtn.reveal', '.reveal-modal', this.open_video)
.on('close.fndtn.reveal', '.reveal-modal', this.settings.close)
.on('closed.fndtn.reveal', '.reveal-modal', this.settings.closed)
.on('closed.fndtn.reveal', '.reveal-modal', this.close_video);
return true;
},
open : function (target) {
if (target) {
var modal = $('#' + target.data('reveal-id'));
} else {
var modal = $(this.scope);
}
if (!modal.hasClass('open')) {
var open_modal = $('.reveal-modal.open');
if (typeof modal.data('css-top') === 'undefined') {
modal.data('css-top', parseInt(modal.css('top'), 10))
.data('offset', this.cache_offset(modal));
}
modal.trigger('open');
if (open_modal.length < 1) {
this.toggle_bg(modal);
}
this.hide(open_modal, this.settings.css.close);
this.show(modal, this.settings.css.open);
}
},
close : function (modal) {
var modal = modal || $(this.scope),
open_modals = $('.reveal-modal.open');
if (open_modals.length > 0) {
this.locked = true;
modal.trigger('close');
this.toggle_bg(modal);
this.hide(open_modals, this.settings.css.close);
}
},
close_targets : function () {
var base = '.' + this.settings.dismissModalClass;
if (this.settings.closeOnBackgroundClick) {
return base + ', .' + this.settings.bgClass;
}
return base;
},
toggle_bg : function (modal) {
if ($('.reveal-modal-bg').length === 0) {
this.settings.bg = $('<div />', {'class': this.settings.bgClass})
.appendTo('body');
}
if (this.settings.bg.filter(':visible').length > 0) {
this.hide(this.settings.bg);
} else {
this.show(this.settings.bg);
}
},
show : function (el, css) {
// is modal
if (css) {
if (/pop/i.test(this.settings.animation)) {
css.top = $(window).scrollTop() - el.data('offset') + 'px';
var end_css = {
top: $(window).scrollTop() + el.data('css-top') + 'px',
opacity: 1
};
return this.delay(function () {
return el
.css(css)
.animate(end_css, this.settings.animationSpeed, 'linear', function () {
this.locked = false;
el.trigger('opened');
}.bind(this))
.addClass('open');
}.bind(this), this.settings.animationSpeed / 2);
}
if (/fade/i.test(this.settings.animation)) {
var end_css = {opacity: 1};
return this.delay(function () {
return el
.css(css)
.animate(end_css, this.settings.animationSpeed, 'linear', function () {
this.locked = false;
el.trigger('opened');
}.bind(this))
.addClass('open');
}.bind(this), this.settings.animationSpeed / 2);
}
return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened');
}
// should we animate the background?
if (/fade/i.test(this.settings.animation)) {
return el.fadeIn(this.settings.animationSpeed / 2);
}
return el.show();
},
hide : function (el, css) {
// is modal
if (css) {
if (/pop/i.test(this.settings.animation)) {
var end_css = {
top: - $(window).scrollTop() - el.data('offset') + 'px',
opacity: 0
};
return this.delay(function () {
return el
.animate(end_css, this.settings.animationSpeed, 'linear', function () {
this.locked = false;
el.css(css).trigger('closed');
}.bind(this))
.removeClass('open');
}.bind(this), this.settings.animationSpeed / 2);
}
if (/fade/i.test(this.settings.animation)) {
var end_css = {opacity: 0};
return this.delay(function () {
return el
.animate(end_css, this.settings.animationSpeed, 'linear', function () {
this.locked = false;
el.css(css).trigger('closed');
}.bind(this))
.removeClass('open');
}.bind(this), this.settings.animationSpeed / 2);
}
return el.hide().css(css).removeClass('open').trigger('closed');
}
// should we animate the background?
if (/fade/i.test(this.settings.animation)) {
return el.fadeOut(this.settings.animationSpeed / 2);
}
return el.hide();
},
close_video : function (e) {
var video = $(this).find('.flex-video'),
iframe = video.find('iframe');
if (iframe.length > 0) {
iframe.attr('data-src', iframe[0].src);
iframe.attr('src', 'about:blank');
video.fadeOut(100).hide();
}
},
open_video : function (e) {
var video = $(this).find('.flex-video'),
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');
}
video.show().fadeIn(100);
}
},
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');
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,407 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.section = {
name: 'section',
version : '4.1.3',
settings : {
deep_linking: false,
one_up: true,
section_selector : '[data-section]',
region_selector : 'section, .section, [data-section-region]',
title_selector : '.title, [data-section-title]',
active_region_selector : 'section.active, .section.active, .active[data-section-region]',
content_selector : '.content, [data-section-content]',
nav_selector : '[data-section="vertical-nav"], [data-section="horizontal-nav"]',
callback: function (){}
},
init : function (scope, method, options) {
var self = this;
Foundation.inherit(this, 'throttle data_options position_right offset_right');
if (typeof method === 'object') {
$.extend(true, self.settings, method);
}
if (typeof method != 'string') {
this.set_active_from_hash();
this.events();
return true;
} else {
return this[method].call(this, options);
}
},
events : function () {
var self = this;
$(this.scope)
.on('click.fndtn.section', '[data-section] .title, [data-section] [data-section-title]', function (e) {
var $this = $(this),
section = $this.closest(self.settings.section_selector);
self.toggle_active.call(this, e, self);
self.reflow();
});
$(window)
.on('resize.fndtn.section', self.throttle(function () {
self.resize.call(this);
}, 30))
.on('hashchange', function () {
if (!self.settings.toggled){
self.set_active_from_hash();
$(this).trigger('resize');
}
}).trigger('resize');
$(document)
.on('click.fndtn.section', function (e) {
if ($(e.target).closest(self.settings.title_selector).length < 1) {
$(self.settings.nav_selector)
.children(self.settings.region_selector)
.removeClass('active')
.attr('style', '');
}
});
},
toggle_active : function (e, self) {
var $this = $(this),
self = Foundation.libs.section,
region = $this.closest(self.settings.region_selector),
content = $this.siblings(self.settings.content_selector),
parent = region.parent(),
settings = $.extend({}, self.settings, self.data_options(parent)),
prev_active_section = parent
.children(self.settings.active_region_selector);
self.settings.toggled = true;
if (!settings.deep_linking && content.length > 0) {
e.preventDefault();
}
if (region.hasClass('active')) {
// this is causing the style flash.
if (self.small(parent)
|| self.is_vertical_nav(parent)
|| self.is_horizontal_nav(parent)
|| self.is_accordion(parent)) {
if (prev_active_section[0] !== region[0]
|| (prev_active_section[0] === region[0] && !settings.one_up)) {
region
.removeClass('active')
.attr('style', '');
}
}
} else {
var prev_active_section = parent
.children(self.settings.active_region_selector),
title_height = self.outerHeight(region
.children(self.settings.title_selector));
if (self.small(parent) || settings.one_up) {
if (self.small(parent)) {
prev_active_section.attr('style', '');
} else {
prev_active_section.attr('style',
'visibility: hidden; padding-top: '+title_height+'px;');
}
}
if (self.small(parent)) {
region.attr('style', '');
} else {
region.css('padding-top', title_height);
}
region.addClass('active');
if (prev_active_section.length > 0) {
prev_active_section
.removeClass('active')
.attr('style', '');
}
// Toggle the content display attribute. This is done to
// ensure accurate outerWidth measurements that account for
// the scrollbar.
if (self.is_vertical_tabs(parent)) {
content.css('display', 'block');
if (prev_active_section !== null) {
prev_active_section
.children(self.settings.content_selector)
.css('display', 'none');
}
}
}
setTimeout(function () {
self.settings.toggled = false;
}, 300);
settings.callback();
},
resize : function () {
var self = Foundation.libs.section,
sections = $(self.settings.section_selector);
sections.each(function() {
var $this = $(this),
active_section = $this
.children(self.settings.active_region_selector),
settings = $.extend({}, self.settings, self.data_options($this));
if (active_section.length > 1) {
active_section
.not(':first')
.removeClass('active')
.attr('style', '');
} else if (active_section.length < 1
&& !self.is_vertical_nav($this)
&& !self.is_horizontal_nav($this)
&& !self.is_accordion($this)) {
var first = $this.children(self.settings.region_selector).first();
if (settings.one_up || !self.small($this)) {
first.addClass('active');
}
if (self.small($this)) {
first.attr('style', '');
} else {
first.css('padding-top', self.outerHeight(first
.children(self.settings.title_selector)));
}
}
if (self.small($this)) {
active_section.attr('style', '');
} else {
active_section.css('padding-top', self.outerHeight(active_section
.children(self.settings.title_selector)));
}
self.position_titles($this);
if ( (self.is_horizontal_nav($this) && !self.small($this))
|| self.is_vertical_tabs($this)) {
self.position_content($this);
} else {
self.position_content($this, false);
}
});
},
is_vertical_nav : function (el) {
return /vertical-nav/i.test(el.data('section'));
},
is_horizontal_nav : function (el) {
return /horizontal-nav/i.test(el.data('section'));
},
is_accordion : function (el) {
return /accordion/i.test(el.data('section'));
},
is_horizontal_tabs : function (el) {
return /^tabs$/i.test(el.data('section'));
},
is_vertical_tabs : function (el) {
return /vertical-tabs/i.test(el.data('section'));
},
set_active_from_hash : function () {
var hash = window.location.hash.substring(1),
sections = $('[data-section]'),
self = this;
sections.each(function () {
var section = $(this),
settings = $.extend({}, self.settings, self.data_options(section));
if (hash.length > 0 && settings.deep_linking) {
var regions = section
.children(self.settings.region_selector)
.attr('style', '')
.removeClass('active');
regions
.map(function () {
return $(this).children('.content[data-slug="' + hash + '"], [data-section-content][data-slug="' + hash + '"]');
})
.parent()
.addClass('active');
}
});
},
position_titles : function (section, off) {
var self = this,
titles = section
.children(this.settings.region_selector)
.map(function () {
return $(this).children(self.settings.title_selector);
}),
previous_width = 0,
previous_height = 0,
self = this;
if (typeof off === 'boolean') {
titles.attr('style', '');
} else {
titles.each(function () {
if (self.is_vertical_tabs(section)) {
$(this).css('top', previous_height);
previous_height += self.outerHeight($(this));
} else {
if (!self.rtl) {
$(this).css('left', previous_width);
} else {
$(this).css('right', previous_width);
}
previous_width += self.outerWidth($(this));
}
});
}
},
position_content : function (section, off) {
var self = this,
regions = section.children(self.settings.region_selector),
titles = regions
.map(function () {
return $(this).children(self.settings.title_selector);
}),
content = regions
.map(function () {
return $(this).children(self.settings.content_selector);
});
if (typeof off === 'boolean') {
content.attr('style', '');
section.attr('style', '');
} else {
if (self.is_vertical_tabs(section)
&& !self.small(section)) {
var content_min_height = 0,
content_min_width = Number.MAX_VALUE,
title_width = null;
regions.each(function () {
var region = $(this),
title = region.children(self.settings.title_selector),
content = region.children(self.settings.content_selector),
content_width = 0;
title_width = self.outerWidth(title);
content_width = self.outerWidth(section) - title_width;
if (content_width < content_min_width) {
content_min_width = content_width;
}
// Increment the minimum height of the content region
// to align with the height of the titles.
content_min_height += self.outerHeight(title);
// Set all of the inactive tabs to 'display: none'
// The CSS sets all of the tabs as 'display: block'
// in order to account for scrollbars when measuring the width
// of the content regions.
if (!$(this).hasClass('active')) {
content.css('display', 'none');
}
});
regions.each(function () {
var content = $(this).children(self.settings.content_selector);
content.css('minHeight', content_min_height);
// Remove 2 pixels to account for the right-shift in the CSS
content.css('maxWidth', content_min_width - 2);
});
// Adjust the outer section container width to match
// the width of the title and content
section.css('maxWidth', title_width + content_min_width);
} else {
regions.each(function () {
var region = $(this),
title = region.children(self.settings.title_selector),
content = region.children(self.settings.content_selector);
if (!self.rtl) {
content
.css({left: title.position().left - 1,
top: self.outerHeight(title) - 2});
} else {
content
.css({right: self.position_right(title) + 1,
top: self.outerHeight(title) - 2});
}
});
// temporary work around for Zepto outerheight calculation issues.
if (typeof Zepto === 'function') {
section.height(this.outerHeight(titles.first()));
} else {
section.height(this.outerHeight(titles.first()) - 2);
}
}
}
},
position_right : function (el) {
var self = this,
section = el.closest(this.settings.section_selector),
regions = section.children(this.settings.region_selector),
section_width = el.closest(this.settings.section_selector).width(),
offset = regions
.map(function () {
return $(this).children(self.settings.title_selector);
}).length;
return (section_width - el.position().left - el.width() * (el.index() + 1) - offset);
},
reflow : function (scope) {
var scope = scope || document;
$(this.settings.section_selector, scope).trigger('resize');
},
small : function (el) {
var settings = $.extend({}, this.settings, this.data_options(el));
if (this.is_horizontal_tabs(el)) {
return false;
}
if (el && this.is_accordion(el)) {
return true;
}
if ($('html').hasClass('lt-ie9')) {
return true;
}
if ($('html').hasClass('ie8compat')) {
return true;
}
return $(this.scope).width() < 768;
},
off : function () {
$(this.scope).off('.fndtn.section');
$(window).off('.fndtn.section');
$(document).off('.fndtn.section')
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,200 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.tooltips = {
name: 'tooltips',
version : '4.1.3',
settings : {
selector : '.has-tip',
additionalInheritableClasses : [],
tooltipClass : '.tooltip',
appendTo: 'body',
tipTemplate : function (selector, content) {
return '<span data-selector="' + selector + '" class="'
+ Foundation.libs.tooltips.settings.tooltipClass.substring(1)
+ '">' + content + '<span class="nub"></span></span>';
}
},
cache : {},
init : function (scope, method, options) {
var self = this;
this.scope = scope || this.scope;
if (typeof method === 'object') {
$.extend(true, this.settings, method);
}
if (typeof method != 'string') {
if (Modernizr.touch) {
$(this.scope)
.on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip',
'[data-tooltip]', function (e) {
e.preventDefault();
$(self.settings.tooltipClass).hide();
self.showOrCreateTip($(this));
})
.on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip',
this.settings.tooltipClass, function (e) {
e.preventDefault();
$(this).fadeOut(150);
});
} else {
$(this.scope)
.on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip',
'[data-tooltip]', function (e) {
var $this = $(this);
if (e.type === 'mouseover' || e.type === 'mouseenter') {
self.showOrCreateTip($this);
} else if (e.type === 'mouseout' || e.type === 'mouseleave') {
self.hide($this);
}
});
}
// $(this.scope).data('fndtn-tooltips', true);
} else {
return this[method].call(this, options);
}
},
showOrCreateTip : function ($target) {
var $tip = this.getTip($target);
if ($tip && $tip.length > 0) {
return this.show($target);
}
return this.create($target);
},
getTip : function ($target) {
var selector = this.selector($target),
tip = null;
if (selector) {
tip = $('span[data-selector=' + selector + ']' + this.settings.tooltipClass);
}
return (typeof tip === 'object') ? tip : false;
},
selector : function ($target) {
var id = $target.attr('id'),
dataSelector = $target.attr('data-tooltip') || $target.attr('data-selector');
if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') {
dataSelector = 'tooltip' + Math.random().toString(36).substring(7);
$target.attr('data-selector', dataSelector);
}
return (id && id.length > 0) ? id : dataSelector;
},
create : function ($target) {
var $tip = $(this.settings.tipTemplate(this.selector($target), $('<div></div>').html($target.attr('title')).html())),
classes = this.inheritable_classes($target);
$tip.addClass(classes).appendTo(this.settings.appendTo);
if (Modernizr.touch) {
$tip.append('<span class="tap-to-close">tap to close </span>');
}
$target.removeAttr('title').attr('title','');
this.show($target);
},
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 = this.outerHeight(nub);
nubWidth = this.outerHeight(nub);
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',
'width' : (width) ? width : 'auto'
}).end();
};
objPos(tip, (target.offset().top + this.outerHeight(target) + 10), 'auto', 'auto', target.offset().left, width);
if ($(window).width() < 767) {
objPos(tip, (target.offset().top + this.outerHeight(target) + 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) {
left = target.offset().left + target.offset().width - this.outerWidth(tip);
}
objPos(tip, (target.offset().top + this.outerHeight(target) + 10), 'auto', 'auto', left, width);
tip.removeClass('tip-override');
if (classes && classes.indexOf('tip-top') > -1) {
objPos(tip, (target.offset().top - this.outerHeight(tip)), 'auto', 'auto', left, width)
.removeClass('tip-override');
} else if (classes && classes.indexOf('tip-left') > -1) {
objPos(tip, (target.offset().top + (this.outerHeight(target) / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left - this.outerWidth(tip) - nubHeight), width)
.removeClass('tip-override');
} else if (classes && classes.indexOf('tip-right') > -1) {
objPos(tip, (target.offset().top + (this.outerHeight(target) / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left + this.outerWidth(target) + nubHeight), width)
.removeClass('tip-override');
}
}
tip.css('visibility', 'visible').hide();
},
inheritable_classes : function (target) {
var inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'noradius'].concat(this.settings.additionalInheritableClasses),
classes = target.attr('class'),
filtered = classes ? $.map(classes.split(' '), function (el, i) {
if ($.inArray(el, inheritables) !== -1) {
return el;
}
}).join(' ') : '';
return $.trim(filtered);
},
show : function ($target) {
var $tip = this.getTip($target);
this.reposition($target, $tip, $target.attr('class'));
$tip.fadeIn(150);
},
hide : function ($target) {
var $tip = this.getTip($target);
$tip.fadeOut(150);
},
// deprecate reload
reload : function () {
var $self = $(this);
return ($self.data('fndtn-tooltips')) ? $self.foundationTooltips('destroy').foundationTooltips('init') : $self.foundationTooltips('init');
},
off : function () {
$(this.scope).off('.fndtn.tooltip');
$(this.settings.tooltipClass).each(function (i) {
$('[data-tooltip]').get(i).attr('title', $(this).text());
}).remove();
}
};
}(Foundation.zj, this, this.document));
@@ -0,0 +1,245 @@
/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.topbar = {
name : 'topbar',
version : '4.1.2',
settings : {
index : 0,
stickyClass : 'sticky',
custom_back_text: true,
back_text: 'Back',
init : false
},
init : function (section, method, options) {
var self = this;
if (typeof method === 'object') {
$.extend(true, this.settings, method);
}
if (typeof method != 'string') {
$('.top-bar').each(function () {
self.settings.$w = $(window);
self.settings.$topbar = $(this);
self.settings.$section = self.settings.$topbar.find('section');
self.settings.$titlebar = self.settings.$topbar.children('ul').first();
self.settings.$topbar.data('index', 0);
var breakpoint = $("<div class='top-bar-js-breakpoint'/>").insertAfter(self.settings.$topbar);
self.settings.breakPoint = breakpoint.width();
breakpoint.remove();
self.assemble();
if (self.settings.$topbar.parent().hasClass('fixed')) {
$('body').css('padding-top', self.outerHeight(self.settings.$topbar));
}
});
if (!self.settings.init) {
this.events();
}
return this.settings.init;
} else {
// fire method
return this[method].call(this, options);
}
},
events : function () {
var self = this;
var offst = this.outerHeight($('.top-bar'));
$(this.scope)
.on('click.fndtn.topbar', '.top-bar .toggle-topbar', function (e) {
var topbar = $(this).closest('.top-bar'),
section = topbar.find('section, .section'),
titlebar = topbar.children('ul').first();
if (!topbar.data('height')) self.largestUL();
e.preventDefault();
if (self.breakpoint()) {
topbar
.toggleClass('expanded')
.css('min-height', '');
}
if (!topbar.hasClass('expanded')) {
if (!self.rtl) {
section.css({left: '0%'});
section.find('>.name').css({left: '100%'});
} else {
section.css({right: '0%'});
section.find('>.name').css({right: '100%'});
}
section.find('li.moved').removeClass('moved');
topbar.data('index', 0);
if (topbar.hasClass('fixed')) {
topbar.parent().addClass('fixed');
topbar.removeClass('fixed');
$('body').css('padding-top',offst);
}
} else if (topbar.parent().hasClass('fixed')) {
topbar.parent().removeClass('fixed');
topbar.addClass('fixed');
$('body').css('padding-top','0');
window.scrollTo(0,0);
}
})
.on('click.fndtn.topbar', '.top-bar .has-dropdown>a', function (e) {
var topbar = $(this).closest('.top-bar'),
section = topbar.find('section, .section'),
titlebar = topbar.children('ul').first(),
dropdownHeight = $(this).next('.dropdown').outerHeight();
if (Modernizr.touch || self.breakpoint()) {
e.preventDefault();
}
if (self.breakpoint()) {
var $this = $(this),
$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') + '%'});
}
$('.top-bar').css('min-height', dropdownHeight);
$this.siblings('ul')
.height(topbar.data('height') + self.outerHeight(titlebar, true));
topbar
.css('min-height', topbar.data('height') + self.outerHeight(titlebar, true) * 2)
}
});
$(window).on('resize.fndtn.topbar', function () {
if (!self.breakpoint()) {
$('.top-bar')
.css('min-height', '')
.removeClass('expanded');
}
}.bind(this));
// Go up a level on Click
$(this.scope).on('click.fndtn', '.top-bar .has-dropdown .back', function (e) {
e.preventDefault();
var $this = $(this),
topbar = $this.closest('.top-bar'),
section = topbar.find('section, .section'),
$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('min-height', 0);
}
setTimeout(function () {
$movedLi.removeClass('moved');
}, 300);
});
},
breakpoint : function () {
return $(window).width() <= this.settings.breakPoint || $('html').hasClass('lt-ie9');
},
assemble : function () {
var self = this;
// Pull element out of the DOM for manipulation
this.settings.$section.detach();
this.settings.$section.find('.has-dropdown>a').each(function () {
var $link = $(this),
$dropdown = $link.siblings('.dropdown'),
$titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>');
// Copy link to subnav
if (self.settings.custom_back_text == true) {
$titleLi.find('h5>a').html('&laquo; ' + self.settings.back_text);
} else {
$titleLi.find('h5>a').html('&laquo; ' + $link.html());
}
$dropdown.prepend($titleLi);
});
// Put element back in the DOM
this.settings.$section.appendTo(this.settings.$topbar);
// check for sticky
this.sticky();
},
largestUL : function () {
var uls = this.settings.$topbar.find('section ul ul'),
largest = uls.first(),
total = 0,
self = this;
uls.each(function () {
if ($(this).children('li').length > largest.children('li').length) {
largest = $(this);
}
});
largest.children('li').each(function () { total += self.outerHeight($(this), true); });
this.settings.$topbar.data('height', total);
},
sticky : function () {
var klass = '.' + this.settings.stickyClass;
if ($(klass).length > 0) {
var distance = $(klass).length ? $(klass).offset().top: 0,
$window = $(window);
var offst = this.outerHeight($('.top-bar'));
$window.scroll(function() {
if ($window.scrollTop() >= (distance)) {
$(klass).addClass("fixed");
$('body').css('padding-top',offst);
}
else if ($window.scrollTop() < distance) {
$(klass).removeClass("fixed");
$('body').css('padding-top','0');
}
});
}
},
off : function () {
$(this.scope).off('.fndtn.topbar');
$(window).off('.fndtn.topbar');
}
};
}(Foundation.zj, this, this.document));
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "foundation",
"filename": "js/foundation.min.js",
"version": "4.1.2",
"version": "4.1.6",
"description": "The most advanced responsive front-end framework in the world. Quickly create prototypes and production code for sites and apps that work on any kind of device.",
"homepage": "http://foundation.zurb.com",
"keywords": [