Julio Biason
11 years ago
30 changed files with 22195 additions and 0 deletions
@ -0,0 +1,29 @@
|
||||
var express = require('./node_modules/express'); |
||||
var cons = require('./node_modules/consolidate'); |
||||
var swig = require('./node_modules/swig'); |
||||
|
||||
var app = express(); |
||||
|
||||
// swig integration
|
||||
var template_dir = __dirname + "/templates"; |
||||
console.log('Templates = ' + template_dir); |
||||
|
||||
app.engine('.html', cons.swig); |
||||
app.set('view engine', 'html'); |
||||
|
||||
swig.init({ |
||||
root: template_dir, |
||||
allowErrors: true |
||||
}); |
||||
app.set('views', template_dir); |
||||
|
||||
// static
|
||||
app.use('/static', express.static(__dirname + '/static')); |
||||
|
||||
// routes
|
||||
app.get('/', function(req, res) { |
||||
res.render('index.html', { variable: 'value'} ); |
||||
}); |
||||
|
||||
app.listen(5500); |
||||
console.log('Running on port 5500...'); |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -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; |
||||
} |
@ -0,0 +1,8 @@
|
||||
/* Foundation was made by ZURB, an interaction design and design strategy firm in Campbell, CA */ |
||||
/* zurb.com */ |
||||
/* humanstxt.org */ |
||||
|
||||
/* SITE */ |
||||
Standards: HTML5, CSS3 |
||||
Components: jQuery, Orbit, Reveal |
||||
Software: Coda, Textmate, Git |
@ -0,0 +1,146 @@
|
||||
<!DOCTYPE html> |
||||
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en" > <![endif]--> |
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> |
||||
|
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta name="viewport" content="width=device-width"> |
||||
<title>Foundation 4</title> |
||||
|
||||
|
||||
<link rel="stylesheet" href="css/foundation.css"> |
||||
|
||||
|
||||
<script src="js/vendor/custom.modernizr.js"></script> |
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="row"> |
||||
<div class="large-12 columns"> |
||||
<h2>Welcome to Foundation</h2> |
||||
<p>This is version 4.3.1.</p> |
||||
<hr /> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="row"> |
||||
<div class="large-8 columns"> |
||||
<h3>The Grid</h3> |
||||
|
||||
<!-- Grid Example --> |
||||
<div class="row"> |
||||
<div class="large-12 columns"> |
||||
<div class="panel"> |
||||
<p>This is a twelve column section in a row. Each of these includes a div.panel element so you can see where the columns are - it's not required at all for the grid.</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="row"> |
||||
<div class="large-6 columns"> |
||||
<div class="panel"> |
||||
<p>Six columns</p> |
||||
</div> |
||||
</div> |
||||
<div class="large-6 columns"> |
||||
<div class="panel"> |
||||
<p>Six columns</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="row"> |
||||
<div class="large-4 columns"> |
||||
<div class="panel"> |
||||
<p>Four columns</p> |
||||
</div> |
||||
</div> |
||||
<div class="large-4 columns"> |
||||
<div class="panel"> |
||||
<p>Four columns</p> |
||||
</div> |
||||
</div> |
||||
<div class="large-4 columns"> |
||||
<div class="panel"> |
||||
<p>Four columns</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<h3>Buttons</h3> |
||||
|
||||
<div class="row"> |
||||
<div class="large-6 columns"> |
||||
<p><a href="#" class="small button">Small Button</a></p> |
||||
<p><a href="#" class="button">Medium Button</a></p> |
||||
<p><a href="#" class="large button">Large Button</a></p> |
||||
</div> |
||||
<div class="large-6 columns"> |
||||
<p><a href="#" class="small alert button">Small Alert Button</a></p> |
||||
<p><a href="#" class="success button">Medium Success Button</a></p> |
||||
<p><a href="#" class="large secondary button">Large Secondary Button</a></p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="large-4 columns"> |
||||
<h4>Getting Started</h4> |
||||
<p>We're stoked you want to try Foundation! To get going, this file (index.html) includes some basic styles you can modify, play around with, or totally destroy to get going.</p> |
||||
|
||||
<h4>Other Resources</h4> |
||||
<p>Once you've exhausted the fun in this document, you should check out:</p> |
||||
<ul class="disc"> |
||||
<li><a href="http://foundation.zurb.com/docs">Foundation Documentation</a><br />Everything you need to know about using the framework.</li> |
||||
<li><a href="http://github.com/zurb/foundation">Foundation on Github</a><br />Latest code, issue reports, feature requests and more.</li> |
||||
<li><a href="http://twitter.com/foundationzurb">@foundationzurb</a><br />Ping us on Twitter if you have questions. If you build something with this we'd love to see it (and send you a totally boss sticker).</li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
<script> |
||||
document.write('<script src=' + |
||||
('__proto__' in {} ? 'js/vendor/zepto' : 'js/vendor/jquery') + |
||||
'.js><\/script>') |
||||
</script> |
||||
|
||||
<script src="js/foundation.min.js"></script> |
||||
<!-- |
||||
|
||||
<script src="js/foundation/foundation.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.alerts.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.clearing.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.cookie.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.dropdown.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.forms.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.joyride.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.magellan.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.orbit.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.reveal.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.section.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.tooltips.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.topbar.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.interchange.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.placeholder.js"></script> |
||||
|
||||
<script src="js/foundation/foundation.abide.js"></script> |
||||
|
||||
--> |
||||
|
||||
<script> |
||||
$(document).foundation(); |
||||
</script> |
||||
</body> |
||||
</html> |
File diff suppressed because one or more lines are too long
@ -0,0 +1,194 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.abide = { |
||||
name : 'abide', |
||||
|
||||
version : '4.3.0', |
||||
|
||||
settings : { |
||||
live_validate : true, |
||||
focus_on_invalid : true, |
||||
timeout : 1000, |
||||
patterns : { |
||||
alpha: /[a-zA-Z]+/, |
||||
alpha_numeric : /[a-zA-Z0-9]+/, |
||||
integer: /-?\d+/, |
||||
number: /-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?/, |
||||
|
||||
// generic password: upper-case, lower-case, number/special character, and min 8 characters
|
||||
password : /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, |
||||
|
||||
// amex, visa, diners
|
||||
card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, |
||||
cvv : /^([0-9]){3,4}$/, |
||||
|
||||
// http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
|
||||
email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, |
||||
|
||||
url: /(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?/, |
||||
// abc.de
|
||||
domain: /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/, |
||||
|
||||
datetime: /([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))/, |
||||
// YYYY-MM-DD
|
||||
date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))/, |
||||
// HH:MM:SS
|
||||
time : /(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}/, |
||||
dateISO: /\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/, |
||||
// MM/DD/YYYY
|
||||
month_day_year : /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/, |
||||
|
||||
// #FFF or #FFFFFF
|
||||
color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ |
||||
} |
||||
}, |
||||
|
||||
timer : 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(); } |
||||
|
||||
} else { |
||||
return this[method].call(this, options); |
||||
} |
||||
}, |
||||
|
||||
events : function () { |
||||
var self = this, |
||||
forms = $('form[data-abide]', this.scope).attr('novalidate', 'novalidate'); |
||||
|
||||
forms |
||||
.on('submit validate', function (e) { |
||||
return self.validate($(this).find('input, textarea, select').get(), e); |
||||
}); |
||||
|
||||
this.settings.init = true; |
||||
|
||||
if (!this.settings.live_validate) return; |
||||
|
||||
forms |
||||
.find('input, textarea, select') |
||||
.on('blur change', function (e) { |
||||
self.validate([this], e); |
||||
}) |
||||
.on('keydown', function (e) { |
||||
clearTimeout(self.timer); |
||||
self.timer = setTimeout(function () { |
||||
self.validate([this], e); |
||||
}.bind(this), self.settings.timeout); |
||||
}); |
||||
}, |
||||
|
||||
validate : function (els, e) { |
||||
var validations = this.parse_patterns(els), |
||||
validation_count = validations.length, |
||||
form = $(els[0]).closest('form'); |
||||
|
||||
while (validation_count--) { |
||||
if (!validations[validation_count] && /submit/.test(e.type)) { |
||||
if (this.settings.focus_on_invalid) els[validation_count].focus(); |
||||
form.trigger('invalid'); |
||||
$(els[validation_count]).closest('form').attr('data-invalid', ''); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
if (/submit/.test(e.type)) { |
||||
form.trigger('valid'); |
||||
} |
||||
|
||||
form.removeAttr('data-invalid'); |
||||
|
||||
return true; |
||||
}, |
||||
|
||||
parse_patterns : function (els) { |
||||
var count = els.length, |
||||
el_patterns = []; |
||||
|
||||
for (var i = count - 1; i >= 0; i--) { |
||||
el_patterns.push(this.pattern(els[i])); |
||||
} |
||||
|
||||
return this.check_validation_and_apply_styles(el_patterns); |
||||
}, |
||||
|
||||
pattern : function (el) { |
||||
var type = el.getAttribute('type'), |
||||
required = typeof el.getAttribute('required') === 'string'; |
||||
|
||||
if (this.settings.patterns.hasOwnProperty(type)) { |
||||
return [el, this.settings.patterns[type], required]; |
||||
} |
||||
|
||||
var pattern = el.getAttribute('pattern') || ''; |
||||
|
||||
if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) { |
||||
return [el, this.settings.patterns[pattern], required]; |
||||
} else if (pattern.length > 0) { |
||||
return [el, new RegExp(pattern), required]; |
||||
} |
||||
|
||||
pattern = /.*/; |
||||
|
||||
return [el, pattern, required]; |
||||
}, |
||||
|
||||
check_validation_and_apply_styles : function (el_patterns) { |
||||
var count = el_patterns.length, |
||||
validations = []; |
||||
|
||||
for (var i = count - 1; i >= 0; i--) { |
||||
var el = el_patterns[i][0], |
||||
required = el_patterns[i][2], |
||||
value = el.value, |
||||
is_radio = el.type === "radio", |
||||
valid_length = (required) ? (el.value.length > 0) : true; |
||||
|
||||
if (is_radio && required) { |
||||
validations.push(this.valid_radio(el, required)); |
||||
} else { |
||||
if (el_patterns[i][1].test(value) && valid_length || |
||||
!required && el.value.length < 1) { |
||||
$(el).removeAttr('data-invalid').parent().removeClass('error'); |
||||
validations.push(true); |
||||
} else { |
||||
$(el).attr('data-invalid', '').parent().addClass('error'); |
||||
validations.push(false); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return validations; |
||||
}, |
||||
|
||||
valid_radio : function (el, required) { |
||||
var name = el.getAttribute('name'), |
||||
group = document.getElementsByName(name), |
||||
count = group.length, |
||||
valid = false; |
||||
|
||||
for (var i=0; i < count; i++) { |
||||
if (group[i].checked) valid = true; |
||||
} |
||||
|
||||
for (var i=0; i < count; i++) { |
||||
if (valid) { |
||||
$(group[i]).removeAttr('data-invalid').parent().removeClass('error'); |
||||
} else { |
||||
$(group[i]).attr('data-invalid', '').parent().addClass('error'); |
||||
} |
||||
} |
||||
|
||||
return valid; |
||||
} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,52 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.alerts = { |
||||
name : 'alerts', |
||||
|
||||
version : '4.2.2', |
||||
|
||||
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'); |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(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.3.1', |
||||
|
||||
settings : { |
||||
templates : { |
||||
viewing : '<a href="#" class="clearing-close">×</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 |
||||
.html(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,177 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.dropdown = { |
||||
name : 'dropdown', |
||||
|
||||
version : '4.3.0', |
||||
|
||||
settings : { |
||||
activeClass: 'open', |
||||
is_hover: false, |
||||
opened: function(){}, |
||||
closed: function(){} |
||||
}, |
||||
|
||||
init : function (scope, method, options) { |
||||
this.scope = scope || this.scope; |
||||
Foundation.inherit(this, 'throttle scrollLeft data_options'); |
||||
|
||||
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) { |
||||
var settings = $.extend({}, self.settings, self.data_options($(this))); |
||||
e.preventDefault(); |
||||
|
||||
if (!settings.is_hover) self.toggle($(this)); |
||||
}) |
||||
.on('mouseenter', '[data-dropdown]', function (e) { |
||||
var settings = $.extend({}, self.settings, self.data_options($(this))); |
||||
if (settings.is_hover) self.toggle($(this)); |
||||
}) |
||||
.on('mouseleave', '[data-dropdown-content]', function (e) { |
||||
var target = $('[data-dropdown="' + $(this).attr('id') + '"]'), |
||||
settings = $.extend({}, self.settings, self.data_options(target)); |
||||
if (settings.is_hover) self.close.call(self, $(this)); |
||||
}) |
||||
.on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened) |
||||
.on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed); |
||||
|
||||
$(document).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.close.call(this, $('[data-dropdown-content]')) |
||||
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) { |
||||
var offset_parent = dropdown.offsetParent(); |
||||
// if (offset_parent.length > 0 && /body/i.test(dropdown.offsetParent()[0].nodeName)) {
|
||||
var position = target.offset(); |
||||
position.top -= offset_parent.offset().top; |
||||
position.left -= offset_parent.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; |
||||
if (dropdown.hasClass('right')) { |
||||
dropdown.removeClass('right'); |
||||
} |
||||
} 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; |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,533 @@
|
||||
(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.forms = { |
||||
name : 'forms', |
||||
|
||||
version: '4.3.1', |
||||
|
||||
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"]') |
||||
.not('.' + this.settings.disable_class) |
||||
.each(this.append_custom_markup); |
||||
$('form.custom input[type="checkbox"]', $(this.scope)) |
||||
.not('[data-customforms="disabled"]') |
||||
.not('.' + this.settings.disable_class) |
||||
.each(this.append_custom_markup); |
||||
$('form.custom select', $(this.scope)) |
||||
.not('[data-customforms="disabled"]') |
||||
.not('.' + this.settings.disable_class) |
||||
.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', function (e, force_refresh) { |
||||
if ($(this).is('[data-customforms="disabled"]')) return; |
||||
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('mousedown.fndtn.forms', 'form.custom div.custom.dropdown', function () { |
||||
return false; |
||||
}) |
||||
.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()); |
||||
|
||||
// Kick off full DOM change event
|
||||
if (typeof (document.createEvent) != 'undefined') { |
||||
var event = document.createEvent('HTMLEvents'); |
||||
event.initEvent('change', true, true); |
||||
$select[0].dispatchEvent(event); |
||||
} else { |
||||
$select[0].fireEvent('onchange'); // for IE
|
||||
} |
||||
} |
||||
}); |
||||
|
||||
$(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, character) { |
||||
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(character).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 ($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 () { |
||||
var copyClasses = $(this).attr('class') ? $(this).attr('class') : ''; |
||||
return "<li class='" + copyClasses + "'>" + $(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) { |
||||
if (!text) return ''; |
||||
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(); |
||||
_self.hidden = _self.hidden.add($child).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'); |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
|
||||
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,280 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.interchange = { |
||||
name : 'interchange', |
||||
|
||||
version : '4.2.4', |
||||
|
||||
cache : {}, |
||||
|
||||
images_loaded : false, |
||||
|
||||
settings : { |
||||
load_attr : 'interchange', |
||||
|
||||
named_queries : { |
||||
'default' : 'only screen and (min-width: 1px)', |
||||
small : 'only screen and (min-width: 768px)', |
||||
medium : 'only screen and (min-width: 1280px)', |
||||
large : 'only screen and (min-width: 1440px)', |
||||
landscape : 'only screen and (orientation: landscape)', |
||||
portrait : 'only screen and (orientation: portrait)', |
||||
retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' +
|
||||
'only screen and (min--moz-device-pixel-ratio: 2),' +
|
||||
'only screen and (-o-min-device-pixel-ratio: 2/1),' +
|
||||
'only screen and (min-device-pixel-ratio: 2),' +
|
||||
'only screen and (min-resolution: 192dpi),' +
|
||||
'only screen and (min-resolution: 2dppx)' |
||||
}, |
||||
|
||||
directives : { |
||||
replace: function (el, path) { |
||||
if (/IMG/.test(el[0].nodeName)) { |
||||
var orig_path = el[0].src; |
||||
|
||||
if (new RegExp(path, 'i').test(orig_path)) return; |
||||
|
||||
el[0].src = path; |
||||
|
||||
return el.trigger('replace', [el[0].src, orig_path]); |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
|
||||
init : function (scope, method, options) { |
||||
Foundation.inherit(this, 'throttle'); |
||||
|
||||
if (typeof method === 'object') { |
||||
$.extend(true, this.settings, method); |
||||
} |
||||
|
||||
this.events(); |
||||
this.images(); |
||||
|
||||
if (typeof method !== 'string') { |
||||
return this.settings.init; |
||||
} else { |
||||
return this[method].call(this, options); |
||||
} |
||||
}, |
||||
|
||||
events : function () { |
||||
var self = this; |
||||
|
||||
$(window).on('resize.fndtn.interchange', self.throttle(function () { |
||||
self.resize.call(self); |
||||
}, 50)); |
||||
}, |
||||
|
||||
resize : function () { |
||||
var cache = this.cache; |
||||
|
||||
if(!this.images_loaded) { |
||||
setTimeout($.proxy(this.resize, this), 50); |
||||
return; |
||||
} |
||||
|
||||
for (var uuid in cache) { |
||||
if (cache.hasOwnProperty(uuid)) { |
||||
var passed = this.results(uuid, cache[uuid]); |
||||
|
||||
if (passed) { |
||||
this.settings.directives[passed |
||||
.scenario[1]](passed.el, passed.scenario[0]); |
||||
} |
||||
} |
||||
} |
||||
|
||||
}, |
||||
|
||||
results : function (uuid, scenarios) { |
||||
var count = scenarios.length; |
||||
|
||||
if (count > 0) { |
||||
var el = $('[data-uuid="' + uuid + '"]'); |
||||
|
||||
for (var i = count - 1; i >= 0; i--) { |
||||
var mq, rule = scenarios[i][2]; |
||||
if (this.settings.named_queries.hasOwnProperty(rule)) { |
||||
mq = matchMedia(this.settings.named_queries[rule]); |
||||
} else { |
||||
mq = matchMedia(rule); |
||||
} |
||||
if (mq.matches) { |
||||
return {el: el, scenario: scenarios[i]}; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
}, |
||||
|
||||
images : function (force_update) { |
||||
if (typeof this.cached_images === 'undefined' || force_update) { |
||||
return this.update_images(); |
||||
} |
||||
|
||||
return this.cached_images; |
||||
}, |
||||
|
||||
update_images : function () { |
||||
var images = document.getElementsByTagName('img'), |
||||
count = images.length, |
||||
loaded_count = 0, |
||||
data_attr = 'data-' + this.settings.load_attr; |
||||
|
||||
this.cached_images = []; |
||||
this.images_loaded = false; |
||||
|
||||
for (var i = count - 1; i >= 0; i--) { |
||||
this.loaded($(images[i]), function (image) { |
||||
loaded_count++; |
||||
if (image) { |
||||
var str = image.getAttribute(data_attr) || ''; |
||||
|
||||
if (str.length > 0) { |
||||
this.cached_images.push(image); |
||||
} |
||||
} |
||||
|
||||
if(loaded_count === count) { |
||||
this.images_loaded = true; |
||||
this.enhance(); |
||||
} |
||||
}.bind(this)); |
||||
} |
||||
|
||||
return 'deferred'; |
||||
}, |
||||
|
||||
// based on jquery.imageready.js
|
||||
// @weblinc, @jsantell, (c) 2012
|
||||
|
||||
loaded : function (image, callback) { |
||||
function loaded () { |
||||
callback(image[0]); |
||||
} |
||||
|
||||
function bindLoad () { |
||||
this.one('load', loaded); |
||||
|
||||
if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { |
||||
var src = this.attr( 'src' ), |
||||
param = src.match( /\?/ ) ? '&' : '?'; |
||||
|
||||
param += 'random=' + (new Date()).getTime(); |
||||
this.attr('src', src + param); |
||||
} |
||||
} |
||||
|
||||
if (!image.attr('src')) { |
||||
loaded(); |
||||
return; |
||||
} |
||||
|
||||
if (image[0].complete || image[0].readyState === 4) { |
||||
loaded(); |
||||
} else { |
||||
bindLoad.call(image); |
||||
} |
||||
}, |
||||
|
||||
enhance : function () { |
||||
var count = this.images().length; |
||||
|
||||
for (var i = count - 1; i >= 0; i--) { |
||||
this._object($(this.images()[i])); |
||||
} |
||||
|
||||
return $(window).trigger('resize'); |
||||
}, |
||||
|
||||
parse_params : function (path, directive, mq) { |
||||
return [this.trim(path), this.convert_directive(directive), this.trim(mq)]; |
||||
}, |
||||
|
||||
convert_directive : function (directive) { |
||||
var trimmed = this.trim(directive); |
||||
|
||||
if (trimmed.length > 0) { |
||||
return trimmed; |
||||
} |
||||
|
||||
return 'replace'; |
||||
}, |
||||
|
||||
_object : function(el) { |
||||
var raw_arr = this.parse_data_attr(el), |
||||
scenarios = [], count = raw_arr.length; |
||||
|
||||
if (count > 0) { |
||||
for (var i = count - 1; i >= 0; i--) { |
||||
var split = raw_arr[i].split(/\((.*?)(\))$/); |
||||
|
||||
if (split.length > 1) { |
||||
var cached_split = split[0].split(','), |
||||
params = this.parse_params(cached_split[0], |
||||
cached_split[1], split[1]); |
||||
|
||||
scenarios.push(params); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return this.store(el, scenarios); |
||||
}, |
||||
|
||||
uuid : function (separator) { |
||||
var delim = separator || "-"; |
||||
|
||||
function S4() { |
||||
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); |
||||
} |
||||
|
||||
return (S4() + S4() + delim + S4() + delim + S4() |
||||
+ delim + S4() + delim + S4() + S4() + S4()); |
||||
}, |
||||
|
||||
store : function (el, scenarios) { |
||||
var uuid = this.uuid(), |
||||
current_uuid = el.data('uuid'); |
||||
|
||||
if (current_uuid) return this.cache[current_uuid]; |
||||
|
||||
el.attr('data-uuid', uuid); |
||||
|
||||
return this.cache[uuid] = scenarios; |
||||
}, |
||||
|
||||
trim : function(str) { |
||||
if (typeof str === 'string') { |
||||
return $.trim(str); |
||||
} |
||||
|
||||
return str; |
||||
}, |
||||
|
||||
parse_data_attr : function (el) { |
||||
var raw = el.data(this.settings.load_attr).split(/\[(.*?)\]/), |
||||
count = raw.length, output = []; |
||||
|
||||
for (var i = count - 1; i >= 0; i--) { |
||||
if (raw[i].replace(/[\W\d]+/, '').length > 4) { |
||||
output.push(raw[i]); |
||||
} |
||||
} |
||||
|
||||
return output; |
||||
}, |
||||
|
||||
reflow : function () { |
||||
this.images(true); |
||||
} |
||||
|
||||
}; |
||||
|
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,850 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.joyride = { |
||||
name : 'joyride', |
||||
|
||||
version : '4.2.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">×</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>' |
||||
}, |
||||
exposeAddClass : '' // One or more space-separated class names to be added to exposed element
|
||||
}, |
||||
|
||||
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(); |
||||
} |
||||
|
||||
// Prevent scroll bouncing...wait to remove from layout
|
||||
this.settings.$current_tip.css('visibility', 'hidden'); |
||||
setTimeout($.proxy(function() { |
||||
this.hide(); |
||||
this.css('visibility', 'visible'); |
||||
}, this.settings.$current_tip), 0); |
||||
this.settings.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, |
||||
origClasses, |
||||
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') |
||||
}; |
||||
|
||||
origClasses = el.attr('class') == null ? '' : el.attr('class'); |
||||
|
||||
el.css('z-index',parseInt(expose.css('z-index'))+1); |
||||
|
||||
if (origCSS.position == 'static') { |
||||
el.css('position','relative'); |
||||
} |
||||
|
||||
el.data('expose-css',origCSS); |
||||
el.data('orig-class', origClasses); |
||||
el.attr('class', origClasses + ' ' + this.settings.exposeAddClass); |
||||
|
||||
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, |
||||
origClasses, |
||||
clearAll = false; |
||||
|
||||
if (arguments.length > 0 && arguments[0] instanceof $) { |
||||
el = arguments[0]; |
||||
} else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ |
||||
el = this.settings.$target; |
||||
} else { |
||||
return false; |
||||
} |
||||
|
||||
if(el.length < 1){ |
||||
if (window.console) { |
||||
console.error('element not valid', el); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
exposeId = el.data('expose'); |
||||
expose = $('.' + exposeId); |
||||
|
||||
if (arguments.length > 1) { |
||||
clearAll = arguments[1]; |
||||
} |
||||
|
||||
if (clearAll === true) { |
||||
$('.joyride-expose-wrapper,.joyride-expose-cover').remove(); |
||||
} else { |
||||
expose.remove(); |
||||
} |
||||
|
||||
origCSS = el.data('expose-css'); |
||||
|
||||
if (origCSS.zIndex == 'auto') { |
||||
el.css('z-index', ''); |
||||
} else { |
||||
el.css('z-index', origCSS.zIndex); |
||||
} |
||||
|
||||
if (origCSS.position != el.css('position')) { |
||||
if(origCSS.position == 'static') {// this is default, no need to set it.
|
||||
el.css('position', ''); |
||||
} else { |
||||
el.css('position', origCSS.position); |
||||
} |
||||
} |
||||
|
||||
origClasses = el.data('orig-class'); |
||||
el.attr('class', origClasses); |
||||
el.removeData('orig-classes'); |
||||
|
||||
el.removeData('expose'); |
||||
el.removeData('expose-z-index'); |
||||
this.remove_exposed(el); |
||||
}, |
||||
|
||||
add_exposed: function(el){ |
||||
this.settings.exposed = this.settings.exposed || []; |
||||
if (el instanceof $ || typeof el === 'object') { |
||||
this.settings.exposed.push(el[0]); |
||||
} else if (typeof el == 'string') { |
||||
this.settings.exposed.push(el); |
||||
} |
||||
}, |
||||
|
||||
remove_exposed: function(el){ |
||||
var search, 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 = {}; |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,440 @@
|
||||
/* |
||||
* 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'; |
||||
|
||||
/* |
||||
matchMedia() polyfill - Test a CSS media
|
||||
type/query in JS. Authors & copyright (c) 2012:
|
||||
Scott Jehl, Paul Irish, Nicholas Zakas.
|
||||
Dual MIT/BSD license |
||||
|
||||
https://github.com/paulirish/matchMedia.js
|
||||
*/ |
||||
|
||||
window.matchMedia = window.matchMedia || (function( doc, undefined ) { |
||||
|
||||
"use strict"; |
||||
|
||||
var bool, |
||||
docElem = doc.documentElement, |
||||
refNode = docElem.firstElementChild || docElem.firstChild, |
||||
// fakeBody required for <FF4 when executed in <head>
|
||||
fakeBody = doc.createElement( "body" ), |
||||
div = doc.createElement( "div" ); |
||||
|
||||
div.id = "mq-test-1"; |
||||
div.style.cssText = "position:absolute;top:-100em"; |
||||
fakeBody.style.background = "none"; |
||||
fakeBody.appendChild(div); |
||||
|
||||
return function(q){ |
||||
|
||||
div.innerHTML = "­<style media=\"" + q + "\"> #mq-test-1 { width: 42px; }</style>"; |
||||
|
||||
docElem.insertBefore( fakeBody, refNode ); |
||||
bool = div.offsetWidth === 42; |
||||
docElem.removeChild( fakeBody ); |
||||
|
||||
return { |
||||
matches: bool, |
||||
media: q |
||||
}; |
||||
|
||||
}; |
||||
|
||||
}( document )); |
||||
|
||||
// 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.3.1', |
||||
|
||||
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' && !/reflow/i.test(libraries)) { |
||||
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 { |
||||
if (/reflow/i.test(libraries)) args[1] = 'reflow'; |
||||
|
||||
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); |
||||
} else { |
||||
return function () {}; |
||||
} |
||||
}.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 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.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, bool) { |
||||
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 : $ |
||||
}; |
||||
|
||||
$.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,135 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.magellan = { |
||||
name : 'magellan', |
||||
|
||||
version : '4.2.2', |
||||
|
||||
settings : { |
||||
activeClass: 'active', |
||||
threshold: 0 |
||||
}, |
||||
|
||||
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.addClass('fixed'); |
||||
$expedition.css({position:"fixed", top:0}); |
||||
} else { |
||||
$expedition.removeClass('fixed'); |
||||
$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'); |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,412 @@
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
var noop = function() {}; |
||||
|
||||
var Orbit = function(el, settings) { |
||||
// Don't reinitialize plugin
|
||||
if (el.hasClass(settings.slides_container_class)) { |
||||
return this; |
||||
} |
||||
|
||||
var self = this, |
||||
container, |
||||
slides_container = el, |
||||
number_container, |
||||
bullets_container, |
||||
timer_container, |
||||
idx = 0, |
||||
animate, |
||||
timer, |
||||
locked = false, |
||||
adjust_height_after = false; |
||||
|
||||
slides_container.children().first().addClass(settings.active_slide_class); |
||||
|
||||
self.update_slide_number = function(index) { |
||||
if (settings.slide_number) { |
||||
number_container.find('span:first').text(parseInt(index)+1); |
||||
number_container.find('span:last').text(slides_container.children().length); |
||||
} |
||||
if (settings.bullets) { |
||||
bullets_container.children().removeClass(settings.bullets_active_class); |
||||
$(bullets_container.children().get(index)).addClass(settings.bullets_active_class); |
||||
} |
||||
}; |
||||
|
||||
self.build_markup = function() { |
||||
slides_container.wrap('<div class="'+settings.container_class+'"></div>'); |
||||
container = slides_container.parent(); |
||||
slides_container.addClass(settings.slides_container_class); |
||||
|
||||
if (settings.navigation_arrows) { |
||||
container.append($('<a>').addClass(settings.prev_class).append('<span>')); |
||||
container.append($('<a>').addClass(settings.next_class).append('<span>')); |
||||
} |
||||
|
||||
if (settings.timer) { |
||||
timer_container = $('<div>').addClass(settings.timer_container_class); |
||||
timer_container.append('<span>'); |
||||
timer_container.append($('<div>').addClass(settings.timer_progress_class)); |
||||
timer_container.addClass(settings.timer_paused_class); |
||||
container.append(timer_container); |
||||
} |
||||
|
||||
if (settings.slide_number) { |
||||
number_container = $('<div>').addClass(settings.slide_number_class); |
||||
number_container.append('<span></span> of <span></span>'); |
||||
container.append(number_container); |
||||
} |
||||
|
||||
if (settings.bullets) { |
||||
bullets_container = $('<ol>').addClass(settings.bullets_container_class); |
||||
container.append(bullets_container); |
||||
slides_container.children().each(function(idx, el) { |
||||
var bullet = $('<li>').attr('data-orbit-slide', idx); |
||||
bullets_container.append(bullet); |
||||
}); |
||||
} |
||||
|
||||
if (settings.stack_on_small) { |
||||
container.addClass(settings.stack_on_small_class); |
||||
} |
||||
|
||||
self.update_slide_number(0); |
||||
}; |
||||
|
||||
self._goto = function(next_idx, start_timer) { |
||||
// if (locked) {return false;}
|
||||
if (next_idx === idx) {return false;} |
||||
if (typeof timer === 'object') {timer.restart();} |
||||
var slides = slides_container.children(); |
||||
|
||||
var dir = 'next'; |
||||
locked = true; |
||||
if (next_idx < idx) {dir = 'prev';} |
||||
if (next_idx >= slides.length) {next_idx = 0;} |
||||
else if (next_idx < 0) {next_idx = slides.length - 1;} |
||||
|
||||
var current = $(slides.get(idx)); |
||||
var next = $(slides.get(next_idx)); |
||||
|
||||
current.css('zIndex', 2); |
||||
next.css('zIndex', 4).addClass('active'); |
||||
|
||||
slides_container.trigger('orbit:before-slide-change'); |
||||
settings.before_slide_change(); |
||||
|
||||
var callback = function() { |
||||
var unlock = function() { |
||||
idx = next_idx; |
||||
locked = false; |
||||
if (start_timer === true) {timer = self.create_timer(); timer.start();} |
||||
self.update_slide_number(idx); |
||||
slides_container.trigger('orbit:after-slide-change',[{slide_number: idx, total_slides: slides.length}]); |
||||
settings.after_slide_change(idx, slides.length); |
||||
}; |
||||
if (slides_container.height() != next.height()) { |
||||
slides_container.animate({'height': next.height()}, 250, 'linear', unlock); |
||||
} else { |
||||
unlock(); |
||||
} |
||||
}; |
||||
|
||||
if (slides.length === 1) {callback(); return false;} |
||||
|
||||
var start_animation = function() { |
||||
if (dir === 'next') {animate.next(current, next, callback);} |
||||
if (dir === 'prev') {animate.prev(current, next, callback);}
|
||||
}; |
||||
|
||||
if (next.height() > slides_container.height()) { |
||||
slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); |
||||
} else { |
||||
start_animation(); |
||||
} |
||||
}; |
||||
|
||||
self.next = function(e) { |
||||
e.stopImmediatePropagation(); |
||||
e.preventDefault(); |
||||
self._goto(idx + 1); |
||||
}; |
||||
|
||||
self.prev = function(e) { |
||||
e.stopImmediatePropagation(); |
||||
e.preventDefault(); |
||||
self._goto(idx - 1); |
||||
}; |
||||
|
||||
self.link_custom = function(e) { |
||||
e.preventDefault(); |
||||
var link = $(this).attr('data-orbit-link'); |
||||
if ((typeof link === 'string') && (link = $.trim(link)) != "") { |
||||
var slide = container.find('[data-orbit-slide='+link+']'); |
||||
if (slide.index() != -1) {self._goto(slide.index());} |
||||
} |
||||
}; |
||||
|
||||
self.link_bullet = function(e) { |
||||
var index = $(this).attr('data-orbit-slide'); |
||||
if ((typeof index === 'string') && (index = $.trim(index)) != "") { |
||||
self._goto(index); |
||||
} |
||||
} |
||||
|
||||
self.timer_callback = function() { |
||||
self._goto(idx + 1, true); |
||||
} |
||||
|
||||
self.compute_dimensions = function() { |
||||
var current = $(slides_container.children().get(idx)); |
||||
var h = current.height(); |
||||
if (!settings.variable_height) { |
||||
slides_container.children().each(function(){ |
||||
if ($(this).height() > h) { h = $(this).height(); } |
||||
}); |
||||
} |
||||
slides_container.height(h); |
||||
}; |
||||
|
||||
self.create_timer = function() { |
||||
var t = new Timer( |
||||
container.find('.'+settings.timer_container_class),
|
||||
settings,
|
||||
self.timer_callback |
||||
); |
||||
return t; |
||||
}; |
||||
|
||||
self.stop_timer = function() { |
||||
if (typeof timer === 'object') timer.stop(); |
||||
}; |
||||
|
||||
self.toggle_timer = function() { |
||||
var t = container.find('.'+settings.timer_container_class); |
||||
if (t.hasClass(settings.timer_paused_class)) { |
||||
if (typeof timer === 'undefined') {timer = self.create_timer();} |
||||
timer.start();
|
||||
} |
||||
else { |
||||
if (typeof timer === 'object') {timer.stop();} |
||||
} |
||||
}; |
||||
|
||||
self.init = function() { |
||||
self.build_markup(); |
||||
if (settings.timer) {timer = self.create_timer(); timer.start();} |
||||
animate = new FadeAnimation(slides_container); |
||||
if (settings.animation === 'slide')
|
||||
animate = new SlideAnimation(slides_container);
|
||||
container.on('click', '.'+settings.next_class, self.next); |
||||
container.on('click', '.'+settings.prev_class, self.prev); |
||||
container.on('click', '[data-orbit-slide]', self.link_bullet); |
||||
container.on('click', self.toggle_timer); |
||||
container.on('touchstart.fndtn.orbit', function(e) { |
||||
if (!e.touches) {e = e.originalEvent;} |
||||
var data = { |
||||
start_page_x: e.touches[0].pageX, |
||||
start_page_y: e.touches[0].pageY, |
||||
start_time: (new Date()).getTime(), |
||||
delta_x: 0, |
||||
is_scrolling: undefined |
||||
}; |
||||
container.data('swipe-transition', data); |
||||
e.stopPropagation(); |
||||
}) |
||||
.on('touchmove.fndtn.orbit', function(e) { |
||||
if (!e.touches) { e = e.originalEvent; } |
||||
// Ignore pinch/zoom events
|
||||
if(e.touches.length > 1 || e.scale && e.scale !== 1) return; |
||||
|
||||
var data = container.data('swipe-transition'); |
||||
if (typeof data === 'undefined') {data = {};} |
||||
|
||||
data.delta_x = e.touches[0].pageX - data.start_page_x; |
||||
|
||||
if ( typeof data.is_scrolling === 'undefined') { |
||||
data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); |
||||
} |
||||
|
||||
if (!data.is_scrolling && !data.active) { |
||||
e.preventDefault(); |
||||
var direction = (data.delta_x < 0) ? (idx+1) : (idx-1); |
||||
data.active = true; |
||||
self._goto(direction); |
||||
} |
||||
}) |
||||
.on('touchend.fndtn.orbit', function(e) { |
||||
container.data('swipe-transition', {}); |
||||
e.stopPropagation(); |
||||
}) |
||||
.on('mouseenter.fndtn.orbit', function(e) { |
||||
if (settings.timer && settings.pause_on_hover) { |
||||
self.stop_timer(); |
||||
} |
||||
}) |
||||
.on('mouseleave.fndtn.orbit', function(e) { |
||||
if (settings.timer && settings.resume_on_mouseout) { |
||||
timer.start(); |
||||
} |
||||
}); |
||||
|
||||
$(document).on('click', '[data-orbit-link]', self.link_custom); |
||||
$(window).on('resize', self.compute_dimensions); |
||||
$(window).on('load', self.compute_dimensions); |
||||
slides_container.trigger('orbit:ready'); |
||||
}; |
||||
|
||||
self.init(); |
||||
}; |
||||
|
||||
var Timer = function(el, settings, callback) { |
||||
var self = this, |
||||
duration = settings.timer_speed, |
||||
progress = el.find('.'+settings.timer_progress_class), |
||||
start,
|
||||
timeout, |
||||
left = -1; |
||||
|
||||
this.update_progress = function(w) { |
||||
var new_progress = progress.clone(); |
||||
new_progress.attr('style', ''); |
||||
new_progress.css('width', w+'%'); |
||||
progress.replaceWith(new_progress); |
||||
progress = new_progress; |
||||
}; |
||||
|
||||
this.restart = function() { |
||||
clearTimeout(timeout); |
||||
el.addClass(settings.timer_paused_class); |
||||
left = -1; |
||||
self.update_progress(0); |
||||
}; |
||||
|
||||
this.start = function() { |
||||
if (!el.hasClass(settings.timer_paused_class)) {return true;} |
||||
left = (left === -1) ? duration : left; |
||||
el.removeClass(settings.timer_paused_class); |
||||
start = new Date().getTime(); |
||||
progress.animate({'width': '100%'}, left, 'linear'); |
||||
timeout = setTimeout(function() { |
||||
self.restart(); |
||||
callback(); |
||||
}, left); |
||||
el.trigger('orbit:timer-started') |
||||
}; |
||||
|
||||
this.stop = function() { |
||||
if (el.hasClass(settings.timer_paused_class)) {return true;} |
||||
clearTimeout(timeout); |
||||
el.addClass(settings.timer_paused_class); |
||||
var end = new Date().getTime(); |
||||
left = left - (end - start); |
||||
var w = 100 - ((left / duration) * 100); |
||||
self.update_progress(w); |
||||
el.trigger('orbit:timer-stopped'); |
||||
}; |
||||
}; |
||||
|
||||
var SlideAnimation = function(container) { |
||||
var duration = 400; |
||||
var is_rtl = ($('html[dir=rtl]').length === 1); |
||||
var margin = is_rtl ? 'marginRight' : 'marginLeft'; |
||||
|
||||
this.next = function(current, next, callback) { |
||||
next.animate({margin: '0%'}, duration, 'linear', function() { |
||||
current.css(margin, '100%'); |
||||
callback(); |
||||
}); |
||||
}; |
||||
|
||||
this.prev = function(current, prev, callback) { |
||||
prev.css(margin, '-100%'); |
||||
prev.animate({margin:'0%'}, duration, 'linear', function() { |
||||
current.css(margin, '100%'); |
||||
callback(); |
||||
}); |
||||
}; |
||||
}; |
||||
|
||||
var FadeAnimation = function(container) { |
||||
var duration = 250; |
||||
|
||||
this.next = function(current, next, callback) { |
||||
next.css({'marginLeft':'0%', 'opacity':'0.01'}); |
||||
next.animate({'opacity':'1'}, duration, 'linear', function() { |
||||
current.css('marginLeft', '100%'); |
||||
callback(); |
||||
}); |
||||
}; |
||||
|
||||
this.prev = function(current, prev, callback) { |
||||
prev.css({'marginLeft':'0%', 'opacity':'0.01'}); |
||||
prev.animate({'opacity':'1'}, duration, 'linear', function() { |
||||
current.css('marginLeft', '100%'); |
||||
callback(); |
||||
}); |
||||
}; |
||||
}; |
||||
|
||||
|
||||
Foundation.libs = Foundation.libs || {}; |
||||
|
||||
Foundation.libs.orbit = { |
||||
name: 'orbit', |
||||
|
||||
version: '4.3.1', |
||||
|
||||
settings: { |
||||
animation: 'slide', |
||||
timer_speed: 10000, |
||||
pause_on_hover: true, |
||||
resume_on_mouseout: false, |
||||
animation_speed: 500, |
||||
stack_on_small: false, |
||||
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', |
||||
bullets: true, |
||||
timer: true, |
||||
variable_height: false, |
||||
before_slide_change: noop, |
||||
after_slide_change: noop |
||||
}, |
||||
|
||||
init: function (scope, method, options) { |
||||
var self = this; |
||||
Foundation.inherit(self, 'data_options'); |
||||
|
||||
if (typeof method === 'object') { |
||||
$.extend(true, self.settings, method); |
||||
} |
||||
|
||||
if ($(scope).is('[data-orbit]')) { |
||||
var $el = $(scope); |
||||
var opts = self.data_options($el); |
||||
new Orbit($el, $.extend({},self.settings, opts)); |
||||
} |
||||
|
||||
$('[data-orbit]', scope).each(function(idx, el) { |
||||
var $el = $(el); |
||||
var opts = self.data_options($el); |
||||
new Orbit($el, $.extend({},self.settings, opts)); |
||||
}); |
||||
} |
||||
}; |
||||
|
||||
|
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,179 @@
|
||||
/*! 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)); |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.placeholder = { |
||||
name : 'placeholder', |
||||
|
||||
version : '4.2.2', |
||||
|
||||
init : function (scope, method, options) { |
||||
this.scope = scope || this.scope; |
||||
|
||||
if (typeof method !== 'string') { |
||||
window.onload = function () { |
||||
$('input, textarea').placeholder(); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,330 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.reveal = { |
||||
name : 'reveal', |
||||
|
||||
version : '4.2.2', |
||||
|
||||
locked : false, |
||||
|
||||
settings : { |
||||
animation: 'fadeAndPop', |
||||
animationSpeed: 250, |
||||
closeOnBackgroundClick: true, |
||||
closeOnEsc: 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) { |
||||
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) { |
||||
var element = $(this), |
||||
ajax = element.data('reveal-ajax'); |
||||
|
||||
self.locked = true; |
||||
|
||||
if (typeof ajax === 'undefined') { |
||||
self.open.call(self, element); |
||||
} else { |
||||
var url = ajax === true ? element.attr('href') : ajax; |
||||
|
||||
self.open.call(self, element, {url: url}); |
||||
} |
||||
} |
||||
}) |
||||
.on('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); |
||||
|
||||
$( 'body' ).bind( 'keyup.reveal', function ( event ) { |
||||
var open_modal = $('.reveal-modal.open'), |
||||
settings = $.extend({}, self.settings, self.data_options(open_modal)); |
||||
if ( event.which === 27 && settings.closeOnEsc) { // 27 is the keycode for the Escape key
|
||||
open_modal.foundation('reveal', 'close'); |
||||
} |
||||
}); |
||||
|
||||
return true; |
||||
}, |
||||
|
||||
open : function (target, ajax_settings) { |
||||
if (target) { |
||||
if (typeof target.selector !== 'undefined') { |
||||
var modal = $('#' + target.data('reveal-id')); |
||||
} else { |
||||
var modal = $(this.scope); |
||||
|
||||
ajax_settings = target; |
||||
} |
||||
} 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); |
||||
} |
||||
|
||||
if (typeof ajax_settings === 'undefined' || !ajax_settings.url) { |
||||
this.hide(open_modal, this.settings.css.close); |
||||
this.show(modal, this.settings.css.open); |
||||
} else { |
||||
var self = this, |
||||
old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null; |
||||
|
||||
$.extend(ajax_settings, { |
||||
success: function (data, textStatus, jqXHR) { |
||||
if ( $.isFunction(old_success) ) { |
||||
old_success(data, textStatus, jqXHR); |
||||
} |
||||
|
||||
modal.html(data); |
||||
$(modal).foundation('section', 'reflow'); |
||||
|
||||
self.hide(open_modal, self.settings.css.close); |
||||
self.show(modal, self.settings.css.open); |
||||
} |
||||
}); |
||||
|
||||
$.ajax(ajax_settings); |
||||
} |
||||
} |
||||
}, |
||||
|
||||
close : function (modal) { |
||||
|
||||
var modal = modal && modal.length ? 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.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'); |
||||
} else { |
||||
var src = iframe[0].src; |
||||
iframe[0].src = undefined; |
||||
iframe[0].src = src; |
||||
} |
||||
video.show(); |
||||
} |
||||
}, |
||||
|
||||
cache_offset : function (modal) { |
||||
var offset = modal.show().height() + parseInt(modal.css('top'), 10); |
||||
|
||||
modal.hide(); |
||||
|
||||
return offset; |
||||
}, |
||||
|
||||
off : function () { |
||||
$(this.scope).off('.fndtn.reveal'); |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,400 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
; |
||||
(function($, window, document) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.section = { |
||||
name : 'section', |
||||
|
||||
version : '4.3.1', |
||||
|
||||
settings: { |
||||
deep_linking: false, |
||||
small_breakpoint: 768, |
||||
one_up: true, |
||||
section_selector: '[data-section]', |
||||
region_selector: 'section, .section, [data-section-region]', |
||||
title_selector: '.title, [data-section-title]', |
||||
//marker: container is resized
|
||||
resized_data_attr: 'data-section-resized', |
||||
//marker: container should apply accordion style
|
||||
small_style_data_attr: 'data-section-small-style', |
||||
content_selector: '.content, [data-section-content]', |
||||
nav_selector: '[data-section="vertical-nav"], [data-section="horizontal-nav"]', |
||||
active_class: 'active', |
||||
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.events(); |
||||
return true; |
||||
} else { |
||||
return this[method].call(this, options); |
||||
} |
||||
}, |
||||
|
||||
events: function() { |
||||
var self = this; |
||||
|
||||
//combine titles selector from settings for click event binding
|
||||
var click_title_selectors = [], |
||||
section_selector = self.settings.section_selector, |
||||
region_selectors = self.settings.region_selector.split(","), |
||||
title_selectors = self.settings.title_selector.split(","); |
||||
|
||||
for (var i = 0, len = region_selectors.length; i < len; i++) { |
||||
var region_selector = region_selectors[i]; |
||||
|
||||
for (var j = 0, len1 = title_selectors.length; j < len1; j++) { |
||||
var title_selector = section_selector + ">" + region_selector + ">" + title_selectors[j]; |
||||
|
||||
click_title_selectors.push(title_selector + " a"); //or we can not do preventDefault for click event of <a>
|
||||
click_title_selectors.push(title_selector); |
||||
} |
||||
} |
||||
|
||||
$(self.scope) |
||||
.on('click.fndtn.section', click_title_selectors.join(","), function(e) { |
||||
var title = $(this).closest(self.settings.title_selector); |
||||
|
||||
self.close_navs(title); |
||||
if (title.siblings(self.settings.content_selector).length > 0) { |
||||
self.toggle_active.call(title[0], e); |
||||
} |
||||
}); |
||||
|
||||
$(window) |
||||
.on('resize.fndtn.section', self.throttle(function() { self.resize(); }, 30)) |
||||
.on('hashchange.fndtn.section', self.set_active_from_hash); |
||||
|
||||
$(document).on('click.fndtn.section', function (e) { |
||||
if (e.isPropagationStopped && e.isPropagationStopped()) return; |
||||
if (e.target === document) return; |
||||
self.close_navs($(e.target).closest(self.settings.title_selector)); |
||||
}); |
||||
|
||||
$(window).triggerHandler('resize.fndtn.section'); |
||||
$(window).triggerHandler('hashchange.fndtn.section'); |
||||
}, |
||||
|
||||
//close nav !one_up on click elsewhere
|
||||
close_navs: function(except_nav_with_title) { |
||||
var self = Foundation.libs.section, |
||||
navsToClose = $(self.settings.nav_selector) |
||||
.filter(function() { return !$.extend({},
|
||||
self.settings, self.data_options($(this))).one_up; }); |
||||
|
||||
if (except_nav_with_title.length > 0) { |
||||
var section = except_nav_with_title.parent().parent(); |
||||
|
||||
if (self.is_horizontal_nav(section) || self.is_vertical_nav(section)) { |
||||
//exclude current nav from list
|
||||
navsToClose = navsToClose.filter(function() { return this !== section[0]; }); |
||||
} |
||||
} |
||||
//close navs on click on title
|
||||
navsToClose.children(self.settings.region_selector).removeClass(self.settings.active_class); |
||||
}, |
||||
|
||||
toggle_active: function(e) { |
||||
var $this = $(this), |
||||
self = Foundation.libs.section, |
||||
region = $this.parent(), |
||||
content = $this.siblings(self.settings.content_selector), |
||||
section = region.parent(), |
||||
settings = $.extend({}, self.settings, self.data_options(section)), |
||||
prev_active_region = section.children(self.settings.region_selector).filter("." + self.settings.active_class); |
||||
|
||||
//for anchors inside [data-section-title]
|
||||
if (!settings.deep_linking && content.length > 0) { |
||||
e.preventDefault(); |
||||
} |
||||
|
||||
e.stopPropagation(); //do not catch same click again on parent
|
||||
|
||||
if (!region.hasClass(self.settings.active_class)) { |
||||
prev_active_region.removeClass(self.settings.active_class); |
||||
region.addClass(self.settings.active_class); |
||||
//force resize for better performance (do not wait timer)
|
||||
self.resize(region.find(self.settings.section_selector).not("[" + self.settings.resized_data_attr + "]"), true); |
||||
} else if (!settings.one_up && (self.small(section) || self.is_vertical_nav(section) || self.is_horizontal_nav(section) || self.is_accordion(section))) { |
||||
region.removeClass(self.settings.active_class); |
||||
} |
||||
settings.callback(section); |
||||
}, |
||||
|
||||
check_resize_timer: null, |
||||
|
||||
//main function that sets title and content positions; runs for :not(.resized) and :visible once when window width is medium up
|
||||
//sections:
|
||||
// selected sections to resize, are defined on resize forced by visibility changes
|
||||
//ensure_has_active_region:
|
||||
// is true when we force resize for no resized sections that were hidden and became visible,
|
||||
// these sections can have no selected region, because all regions were hidden along with section on executing set_active_from_hash
|
||||
resize: function(sections, ensure_has_active_region) { |
||||
|
||||
var self = Foundation.libs.section, |
||||
is_small_window = self.small($(document)), |
||||
//filter for section resize
|
||||
should_be_resized = function (section, now_is_hidden) { |
||||
return !self.is_accordion(section) &&
|
||||
!section.is("[" + self.settings.resized_data_attr + "]") &&
|
||||
(!is_small_window || self.is_horizontal_tabs(section)) &&
|
||||
now_is_hidden === (section.css('display') === 'none' ||
|
||||
!section.parent().is(':visible')); |
||||
}; |
||||
|
||||
sections = sections || $(self.settings.section_selector); |
||||
|
||||
clearTimeout(self.check_resize_timer); |
||||
|
||||
if (!is_small_window) { |
||||
sections.removeAttr(self.settings.small_style_data_attr); |
||||
} |
||||
|
||||
//resize
|
||||
sections.filter(function() { return should_be_resized($(this), false); }) |
||||
.each(function() { |
||||
var section = $(this), |
||||
regions = section.children(self.settings.region_selector), |
||||
titles = regions.children(self.settings.title_selector), |
||||
content = regions.children(self.settings.content_selector), |
||||
titles_max_height = 0; |
||||
|
||||
if (ensure_has_active_region &&
|
||||
section.children(self.settings.region_selector).filter("." + self.settings.active_class).length == 0) { |
||||
var settings = $.extend({}, self.settings, self.data_options(section)); |
||||
|
||||
if (!settings.deep_linking && (settings.one_up || !self.is_horizontal_nav(section) && |
||||
!self.is_vertical_nav(section) && !self.is_accordion(section))) { |
||||
regions.filter(":visible").first().addClass(self.settings.active_class); |
||||
} |
||||
} |
||||
|
||||
if (self.is_horizontal_tabs(section) || self.is_auto(section)) { |
||||
// region: position relative
|
||||
// title: position absolute
|
||||
// content: position static
|
||||
var titles_sum_width = 0; |
||||
|
||||
titles.each(function() { |
||||
var title = $(this); |
||||
|
||||
if (title.is(":visible")) { |
||||
title.css(!self.rtl ? 'left' : 'right', titles_sum_width); |
||||
var title_h_border_width = parseInt(title.css("border-" + (self.rtl ? 'left' : 'right') + "-width"), 10); |
||||
|
||||
if (title_h_border_width.toString() === 'Nan') { |
||||
title_h_border_width = 0; |
||||
} |
||||
|
||||
titles_sum_width += self.outerWidth(title) - title_h_border_width; |
||||
titles_max_height = Math.max(titles_max_height, self.outerHeight(title)); |
||||
} |
||||
}); |
||||
titles.css('height', titles_max_height); |
||||
regions.each(function() { |
||||
var region = $(this), |
||||
region_content = region.children(self.settings.content_selector), |
||||
content_top_border_width = parseInt(region_content.css("border-top-width"), 10); |
||||
|
||||
if (content_top_border_width.toString() === 'Nan') { |
||||
content_top_border_width = 0; |
||||
} |
||||
|
||||
region.css('padding-top', titles_max_height - content_top_border_width); |
||||
}); |
||||
|
||||
section.css("min-height", titles_max_height); |
||||
} else if (self.is_horizontal_nav(section)) { |
||||
var first = true; |
||||
// region: positon relative, float left
|
||||
// title: position static
|
||||
// content: position absolute
|
||||
titles.each(function() { |
||||
titles_max_height = Math.max(titles_max_height, self.outerHeight($(this))); |
||||
}); |
||||
|
||||
regions.each(function() { |
||||
var region = $(this); |
||||
|
||||
region.css("margin-left", "-" + (first ? section : region.children(self.settings.title_selector)).css("border-left-width")); |
||||
first = false; |
||||
}); |
||||
|
||||
regions.css("margin-top", "-" + section.css("border-top-width")); |
||||
titles.css('height', titles_max_height); |
||||
content.css('top', titles_max_height); |
||||
section.css("min-height", titles_max_height); |
||||
} else if (self.is_vertical_tabs(section)) { |
||||
var titles_sum_height = 0; |
||||
// region: position relative, for .active: fixed padding==title.width
|
||||
// title: fixed width, position absolute
|
||||
// content: position static
|
||||
titles.each(function() { |
||||
var title = $(this); |
||||
|
||||
if (title.is(":visible")) { |
||||
title.css('top', titles_sum_height); |
||||
var title_top_border_width = parseInt(title.css("border-top-width"), 10); |
||||
|
||||
if (title_top_border_width.toString() === 'Nan') { |
||||
title_top_border_width = 0; |
||||
} |
||||
|
||||
titles_sum_height += self.outerHeight(title) - title_top_border_width; |
||||
} |
||||
}); |
||||
|
||||
content.css('min-height', titles_sum_height + 1); |
||||
} else if (self.is_vertical_nav(section)) { |
||||
var titles_max_width = 0, |
||||
first1 = true; |
||||
// region: positon relative
|
||||
// title: position static
|
||||
// content: position absolute
|
||||
titles.each(function() { |
||||
titles_max_width = Math.max(titles_max_width, self.outerWidth($(this))); |
||||
}); |
||||
|
||||
regions.each(function () { |
||||
var region = $(this); |
||||
|
||||
region.css("margin-top", "-" + (first1 ? section : region.children(self.settings.title_selector)).css("border-top-width")); |
||||
first1 = false; |
||||
}); |
||||
|
||||
titles.css('width', titles_max_width); |
||||
content.css(!self.rtl ? 'left' : 'right', titles_max_width); |
||||
section.css('width', titles_max_width); |
||||
} |
||||
|
||||
section.attr(self.settings.resized_data_attr, true); |
||||
}); |
||||
|
||||
//wait elements to become visible then resize
|
||||
if ($(self.settings.section_selector).filter(function() { return should_be_resized($(this), true); }).length > 0) |
||||
self.check_resize_timer = setTimeout(function() { |
||||
self.resize(sections.filter(function() { return should_be_resized($(this), false); }), true); |
||||
}, 700); |
||||
|
||||
if (is_small_window) { |
||||
sections.attr(self.settings.small_style_data_attr, true); |
||||
} |
||||
}, |
||||
|
||||
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')); |
||||
}, |
||||
|
||||
is_auto: function (el) { |
||||
var data_section = el.data('section'); |
||||
return data_section === '' || /auto/i.test(data_section); |
||||
}, |
||||
|
||||
set_active_from_hash: function() { |
||||
var self = Foundation.libs.section, |
||||
hash = window.location.hash.substring(1), |
||||
sections = $(self.settings.section_selector); |
||||
|
||||
sections.each(function() { |
||||
var section = $(this), |
||||
settings = $.extend({}, self.settings, self.data_options(section)), |
||||
regions = section.children(self.settings.region_selector), |
||||
set_active_from_hash = settings.deep_linking && hash.length > 0, |
||||
selected = false; |
||||
|
||||
regions.each(function() { |
||||
var region = $(this); |
||||
|
||||
if (selected) { |
||||
region.removeClass(self.settings.active_class); |
||||
} else if (set_active_from_hash) { |
||||
var data_slug = region.children(self.settings.content_selector).data('slug'); |
||||
|
||||
if (data_slug && new RegExp(data_slug, 'i').test(hash)) { |
||||
if (!region.hasClass(self.settings.active_class)) |
||||
region.addClass(self.settings.active_class); |
||||
selected = true; |
||||
} else { |
||||
region.removeClass(self.settings.active_class); |
||||
} |
||||
} else if (region.hasClass(self.settings.active_class)) { |
||||
selected = true; |
||||
} |
||||
}); |
||||
|
||||
if (!selected && !settings.deep_linking && (settings.one_up || !self.is_horizontal_nav(section) && |
||||
!self.is_vertical_nav(section) && !self.is_accordion(section))) |
||||
regions.filter(":visible").first().addClass(self.settings.active_class); |
||||
}); |
||||
}, |
||||
|
||||
reflow: function() { |
||||
var self = Foundation.libs.section; |
||||
|
||||
$(self.settings.section_selector).removeAttr(self.settings.resized_data_attr); |
||||
self.throttle(function() { self.resize(); }, 30)(); |
||||
}, |
||||
|
||||
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() < settings.small_breakpoint; |
||||
}, |
||||
|
||||
off: function() { |
||||
$(this.scope).off('.fndtn.section'); |
||||
$(window).off('.fndtn.section'); |
||||
$(document).off('.fndtn.section'); |
||||
} |
||||
}; |
||||
|
||||
//resize selected sections
|
||||
$.fn.reflow_section = function(ensure_has_active_region) { |
||||
var section = this, |
||||
self = Foundation.libs.section; |
||||
|
||||
section.removeAttr(self.settings.resized_data_attr); |
||||
self.throttle(function() { self.resize(section, ensure_has_active_region); }, 30)(); |
||||
return this; |
||||
}; |
||||
|
||||
}(Foundation.zj, window, document)); |
@ -0,0 +1,208 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.tooltips = { |
||||
name : 'tooltips', |
||||
|
||||
version : '4.2.2', |
||||
|
||||
settings : { |
||||
selector : '.has-tip', |
||||
additionalInheritableClasses : [], |
||||
tooltipClass : '.tooltip', |
||||
appendTo: 'body', |
||||
'disable-for-touch': false, |
||||
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) { |
||||
Foundation.inherit(this, 'data_options'); |
||||
var self = this; |
||||
|
||||
if (typeof method === 'object') { |
||||
$.extend(true, this.settings, method); |
||||
} else if (typeof options !== 'undefined') { |
||||
$.extend(true, this.settings, options); |
||||
} |
||||
|
||||
if (typeof method !== 'string') { |
||||
if (Modernizr.touch) { |
||||
$(this.scope) |
||||
.on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip',
|
||||
'[data-tooltip]', function (e) { |
||||
var settings = $.extend({}, self.settings, self.data_options($(this))); |
||||
if (!settings['disable-for-touch']) { |
||||
e.preventDefault(); |
||||
$(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 (/enter|over/i.test(e.type)) { |
||||
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(); |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(Foundation.zj, this, this.document)); |
@ -0,0 +1,300 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */ |
||||
|
||||
;(function ($, window, document, undefined) { |
||||
'use strict'; |
||||
|
||||
Foundation.libs.topbar = { |
||||
name : 'topbar', |
||||
|
||||
version: '4.3.1', |
||||
|
||||
settings : { |
||||
index : 0, |
||||
stickyClass : 'sticky', |
||||
custom_back_text: true, |
||||
back_text: 'Back', |
||||
is_hover: true, |
||||
mobile_show_parent_link: true, |
||||
scrolltop : true, // jump to top when sticky nav menu toggle is clicked
|
||||
init : false |
||||
}, |
||||
|
||||
init : function (section, method, options) { |
||||
Foundation.inherit(this, 'data_options'); |
||||
var self = this; |
||||
|
||||
if (typeof method === 'object') { |
||||
$.extend(true, this.settings, method); |
||||
} else if (typeof options !== 'undefined') { |
||||
$.extend(true, this.settings, options); |
||||
} |
||||
|
||||
if (typeof method !== 'string') { |
||||
|
||||
$('.top-bar, [data-topbar]').each(function () { |
||||
$.extend(true, self.settings, self.data_options($(this))); |
||||
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.is_hover) { |
||||
self.settings.$topbar.find('.has-dropdown').addClass('not-click'); |
||||
} |
||||
|
||||
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); |
||||
} |
||||
}, |
||||
|
||||
timer : null, |
||||
|
||||
events : function () { |
||||
var self = this; |
||||
var offst = this.outerHeight($('.top-bar, [data-topbar]')); |
||||
$(this.scope) |
||||
.off('.fndtn.topbar') |
||||
.on('click.fndtn.topbar', '.top-bar .toggle-topbar, [data-topbar] .toggle-topbar', function (e) { |
||||
var topbar = $(this).closest('.top-bar, [data-topbar]'), |
||||
section = topbar.find('section, .section'), |
||||
titlebar = topbar.children('ul').first(); |
||||
|
||||
e.preventDefault(); |
||||
|
||||
if (self.breakpoint()) { |
||||
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); |
||||
|
||||
topbar |
||||
.toggleClass('expanded') |
||||
.css('height', ''); |
||||
} |
||||
|
||||
if (!topbar.hasClass('expanded')) { |
||||
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'); |
||||
|
||||
if (self.settings.scrolltop) { |
||||
window.scrollTo(0,0); |
||||
} |
||||
} |
||||
}) |
||||
|
||||
.on('click.fndtn.topbar', '.top-bar li.has-dropdown', function (e) { |
||||
if (self.breakpoint()) return; |
||||
|
||||
var li = $(this), |
||||
target = $(e.target), |
||||
topbar = li.closest('[data-topbar], .top-bar'), |
||||
is_hover = topbar.data('topbar'); |
||||
|
||||
if (self.settings.is_hover && !Modernizr.touch) return; |
||||
|
||||
e.stopImmediatePropagation(); |
||||
|
||||
if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { |
||||
e.preventDefault(); |
||||
} |
||||
|
||||
if (li.hasClass('hover')) { |
||||
li |
||||
.removeClass('hover') |
||||
.find('li') |
||||
.removeClass('hover'); |
||||
} else { |
||||
li.addClass('hover'); |
||||
} |
||||
}) |
||||
|
||||
.on('click.fndtn.topbar', '.top-bar .has-dropdown>a, [data-topbar] .has-dropdown>a', function (e) { |
||||
if (self.breakpoint()) { |
||||
e.preventDefault(); |
||||
|
||||
var $this = $(this), |
||||
topbar = $this.closest('.top-bar, [data-topbar]'), |
||||
section = topbar.find('section, .section'), |
||||
titlebar = topbar.children('ul').first(), |
||||
dropdownHeight = $this.next('.dropdown').outerHeight(), |
||||
$selectedLi = $this.closest('li'); |
||||
|
||||
topbar.data('index', topbar.data('index') + 1); |
||||
$selectedLi.addClass('moved'); |
||||
|
||||
if (!self.rtl) { |
||||
section.css({left: -(100 * topbar.data('index')) + '%'}); |
||||
section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); |
||||
} else { |
||||
section.css({right: -(100 * topbar.data('index')) + '%'}); |
||||
section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); |
||||
} |
||||
|
||||
topbar.css('height', self.outerHeight($this.siblings('ul'), true) + self.height(titlebar)); |
||||
} |
||||
}); |
||||
|
||||
$(window).on('resize.fndtn.topbar', function () { |
||||
if (!self.breakpoint()) { |
||||
$('.top-bar, [data-topbar]') |
||||
.css('height', '') |
||||
.removeClass('expanded') |
||||
.find('li') |
||||
.removeClass('hover'); |
||||
} |
||||
}.bind(this)); |
||||
|
||||
$('body').on('click.fndtn.topbar', function (e) { |
||||
var parent = $(e.target).closest('[data-topbar], .top-bar'); |
||||
|
||||
if (parent.length > 0) { |
||||
return; |
||||
} |
||||
|
||||
$('.top-bar li, [data-topbar] li').removeClass('hover'); |
||||
}); |
||||
|
||||
// Go up a level on Click
|
||||
$(this.scope).on('click.fndtn', '.top-bar .has-dropdown .back, [data-topbar] .has-dropdown .back', function (e) { |
||||
e.preventDefault(); |
||||
|
||||
var $this = $(this), |
||||
topbar = $this.closest('.top-bar, [data-topbar]'), |
||||
titlebar = topbar.children('ul').first(), |
||||
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('height', ''); |
||||
} else { |
||||
topbar.css('height', self.outerHeight($previousLevelUl, true) + self.height(titlebar)); |
||||
} |
||||
|
||||
setTimeout(function () { |
||||
$movedLi.removeClass('moved'); |
||||
}, 300); |
||||
}); |
||||
}, |
||||
|
||||
breakpoint : function () { |
||||
return $(document).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'), |
||||
url = $link.attr('href'); |
||||
|
||||
if (self.settings.mobile_show_parent_link && url && url.length > 1) { |
||||
var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li><li><a class="parent-link js-generated" href="' + url + '">' + $link.text() +'</a></li>'); |
||||
} else { |
||||
var $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('« ' + self.settings.back_text); |
||||
} else { |
||||
$titleLi.find('h5>a').html('« ' + $link.html()); |
||||
} |
||||
$dropdown.prepend($titleLi); |
||||
}); |
||||
|
||||
// Put element back in the DOM
|
||||
this.settings.$section.appendTo(this.settings.$topbar); |
||||
|
||||
// check for sticky
|
||||
this.sticky(); |
||||
}, |
||||
|
||||
height : function (ul) { |
||||
var total = 0, |
||||
self = this; |
||||
|
||||
ul.find('> li').each(function () { total += self.outerHeight($(this), true); }); |
||||
|
||||
return total; |
||||
}, |
||||
|
||||
sticky : function () { |
||||
var klass = '.' + this.settings.stickyClass; |
||||
if ($(klass).length > 0) { |
||||
var distance = $(klass).length ? $(klass).offset().top: 0, |
||||
$window = $(window), |
||||
offst = this.outerHeight($('.top-bar')), |
||||
t_top; |
||||
|
||||
//Whe resize elements of the page on windows resize. Must recalculate distance
|
||||
$(window).resize(function() { |
||||
clearTimeout(t_top); |
||||
t_top = setTimeout (function() { |
||||
distance = $(klass).offset().top; |
||||
},105); |
||||
}); |
||||
$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'); |
||||
}, |
||||
|
||||
reflow : function () {} |
||||
}; |
||||
}(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
@ -0,0 +1,4 @@
|
||||
# www.robotstxt.org/ |
||||
# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 |
||||
|
||||
User-agent: * |
@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html> |
||||
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en" > <![endif]--> |
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta name="viewport" content="width=device-width"> |
||||
<title>LyricsNODE</title> |
||||
|
||||
<link rel="stylesheet" href="/static/css/foundation.css"> |
||||
<script src="/static/js/vendor/custom.modernizr.js"></script> |
||||
</head> |
||||
|
||||
<body> |
||||
<nav class='top-bar'> |
||||
<ul class='title-area'> |
||||
<li class='name'> |
||||
<h1><a href='#'>LyricsNODE</a></h1> |
||||
</li> |
||||
</ul> |
||||
|
||||
<section class='top-bar-section'> |
||||
<ul class='left'> |
||||
<li><a href='#'>Round</a></li> |
||||
<li><a href='#'>Database</a></li> |
||||
</ul> |
||||
</section> |
||||
</nav> |
||||
|
||||
{% block content %}{% endblock %} |
||||
|
||||
<script> |
||||
$(document).foundation(); |
||||
</script> |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue