Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: berkes/tubemp
base: 8158243af1
...
head fork: berkes/tubemp
compare: 2e40545b81
Checking mergeability… Don't worry, you can still create the pull request.
  • 15 commits
  • 21 files changed
  • 0 commit comments
  • 1 contributor
Commits on Mar 26, 2013
Bèr Kessels Merge branch 'release/0.1.4' into develop
* release/0.1.4:
  Enable inline templates for rackup.
7157009
Bèr Kessels Documentation improvements. 8ac9506
Commits on Mar 28, 2013
Bèr Kessels New logo. 3ce195d
Bèr Kessels add zeroclipboard code c49dfcc
Bèr Kessels Implement zeroclipboard with buttons d7a4a6c
Bèr Kessels Merge branch 'feature/zeroclipboard' into develop
* feature/zeroclipboard:
  Implement zeroclipboard with buttons
  add zeroclipboard code
729daf9
Bèr Kessels Releasing under MIT b0c70b3
Bèr Kessels removing unused js. 21c3f96
Bèr Kessels remove unused css 207d692
Bèr Kessels Merge branch 'feature/cleanup' into develop
* feature/cleanup:
  remove unused css
  removing unused js.
  Releasing under MIT
01d8766
Bèr Kessels added footer wit extra documentation. 99f6349
Bèr Kessels new tagline c1cf0f6
Bèr Kessels Add example to create-form. 777da0a
Bèr Kessels Merge branch 'feature/footer' into develop
* feature/footer:
  Add example to create-form.
  new tagline
  added footer wit extra documentation.
6ca7cff
Bèr Kessels Merge branch 'release/0.2.0'
* release/0.2.0:
  Add example to create-form.
  new tagline
  added footer wit extra documentation.
  remove unused css
  removing unused js.
  Releasing under MIT
  Implement zeroclipboard with buttons
  add zeroclipboard code
  New logo.
  Documentation improvements.
2e40545
View
8 LICENSE
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2012 Jon Rohan, James M. Greene,
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
View
63 README.md
@@ -1,11 +1,58 @@
-# About
+# tubemp
-# Author
+> YouTube embeds without third party trackers.
-# Requirements
+tubemp is a tiny web-application which creates and serves thumbnail-images from YouTube embed-codes. These images link to the video and look like embedded videos.
-# TODOs
-* Write this READMe
-* improve the Copy/pasting; auto-select, copy-to-clipboard button.
-* introduce a JSON-API
-* make a wordpress and Drupal module
+It offers a replacement for embedding YouTube videos on your site. A
+replacement without third-party cookies and tracking "bugs" following your
+visitors.
+
+Many countries (most notably the E.U-countries) don't allow third party
+trackers on many of their sites. Many site-owners don't want to place
+content on their websites that allows companies like Google to track
+their visitors.
+
+Placing an image that *looks* like a YouTube embed, but served from your
+own domain, is a good solution for all this.
+
+This tiny application aids in that.
+
+## Installation
+
+### The quick way
+
+1. `git clone https://github.com/berkes/tubemp.git`
+1. `cd tubemp`
+1. `bundle install`
+1. `ruby tubemp.rb`
+1. Open a browser and visit localhost:4567
+
+In some near future, this project will be made into a gem, which
+simplifies the installation and running greatly.
+
+### The long way (nginx and passenger)
+
+todo.
+
+## Author and Contributors
+
+[Bèr `berkes` Kessels](http://berk.es)
+
+## Requirements
+
+Bundler installs everything, but for reference:
+
+* Sinatra
+* RMagick
+* [video_info](https://rubygems.org/gems/video_info) by Thibaud Guillaume-Gentil
+* rspec for testing and development
+
+## TODOS
+* Write this README.
+* Write installation instructions.
+* Make a gem into this, allowing a simple `gem install tubemp && tubemp`
+ to run your own server.
+* Improve the Copy/pasting; auto-select, copy-to-clipboard button.
+* Introduce a JSON-API.
+* Make a wordpress and Drupal module, using that API.
View
3,818 public/css/foundation.css
0 additions, 3,818 deletions not shown
View
396 public/css/normalize.css
@@ -1,396 +0,0 @@
-/*! normalize.css v2.1.0 | 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. Set default font family to sans-serif.
- * 2. Prevent iOS text size adjust after orientation change, without disabling
- * user zoom.
- */
-
-html {
- font-family: sans-serif; /* 1 */
- -webkit-text-size-adjust: 100%; /* 2 */
- -ms-text-size-adjust: 100%; /* 2 */
-}
-
-/**
- * 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;
-}
View
BIN  public/img/logo.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
50 public/js/foundation/foundation.alerts.js
@@ -1,50 +0,0 @@
-/*jslint unparam: true, browser: true, indent: 2 */
-
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs.alerts = {
- name : 'alerts',
-
- version : '4.0.0',
-
- settings : {
- speed: 300, // fade out speed
- callback: function (){}
- },
-
- init : function (scope, method, options) {
- this.scope = scope || this.scope;
-
- if (typeof method === 'object') {
- $.extend(true, this.settings, method);
- }
-
- if (typeof method != 'string') {
- if (!this.settings.init) this.events();
-
- return this.settings.init;
- } else {
- return this[method].call(this, options);
- }
- },
-
- events : function () {
- var self = this;
-
- $(this.scope).on('click.fndtn.alerts', '[data-alert] a.close', function (e) {
- e.preventDefault();
- $(this).closest("[data-alert]").fadeOut(self.speed, function () {
- $(this).remove();
- self.settings.callback();
- });
- });
-
- this.settings.init = true;
- },
-
- off : function () {
- $(this.scope).off('.fndtn.alerts');
- }
- };
-}(Foundation.zj, this, this.document));
View
480 public/js/foundation/foundation.clearing.js
@@ -1,480 +0,0 @@
-/*jslint unparam: true, browser: true, indent: 2 */
-
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs.clearing = {
- name : 'clearing',
-
- version : '4.0.0',
-
- settings : {
- templates : {
- viewing : '<a href="#" class="clearing-close">&times;</a>' +
- '<div class="visible-img" style="display: none"><img src="//:0">' +
- '<p class="clearing-caption"></p><a href="#" class="clearing-main-left"><span></span></a>' +
- '<a href="#" class="clearing-main-right"><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) {
- this.scope = this.scope || scope;
- Foundation.inherit(this, 'set_data get_data remove_data throttle');
-
- if (typeof method === 'object') {
- options = $.extend(true, this.settings, method);
- }
-
- if (typeof method != 'string') {
- $(this.scope).find('ul[data-clearing]').each(function () {
- var self = Foundation.libs.clearing,
- $el = $(this),
- options = options || {},
- settings = self.get_data($el);
-
- if (!settings) {
- options.$parent = $el.parent();
-
- self.set_data($el, $.extend(true, self.settings, options));
-
- 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,
- settings = self.get_data(current.parent());
-
- e.preventDefault();
- if (!settings) self.init();
-
- // set current and target to the clicked li if not otherwise defined.
- self.open($(e.target), current, target);
- self.update_paddles(target);
- })
-
- .on('click.fndtn.clearing', '.clearing-main-right',
- function (e) { this.nav(e, 'next') }.bind(this))
- .on('click.fndtn.clearing', '.clearing-main-left',
- 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 (e) { 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(),
- 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 settings.$parent.append(wrapper);
- },
-
- // 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));
-
- this.loaded(image, function () {
- // 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;
- },
-
- 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) {
- visible_image
- .find('.clearing-main-right')
- .removeClass('disabled');
- } else {
- visible_image
- .find('.clearing-main-right')
- .addClass('disabled');
- }
-
- if (target.prev().length) {
- visible_image
- .find('.clearing-main-left')
- .removeClass('disabled');
- } else {
- visible_image
- .find('.clearing-main-left')
- .addClass('disabled');
- }
- },
-
- center : function (target) {
- target.css({
- marginLeft : -(this.outerWidth(target) / 2),
- marginTop : -(this.outerHeight(target) / 2)
- });
- return this;
- },
-
- // image loading and preloading
-
- load : function ($image) {
- 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 (this.complete || this.readyState === 4) {
- loaded();
- } else {
- bindLoad.call(image);
- }
- },
-
- img : function (img) {
- if (img.length) {
- var new_img = new Image(),
- new_a = img.find('a');
-
- if (new_a.length) {
- new_img.src = new_a.attr('href');
- } else {
- new_img.src = img.find('img').attr('src');
- }
- }
- return this;
- },
-
- // image caption
-
- caption : function (container, $image) {
- var caption = $image.data('caption');
-
- if (caption) {
- container
- .text(caption)
- .show();
- } else {
- container
- .text('')
- .hide();
- }
- return this;
- },
-
- // directional methods
-
- go : function ($ul, direction) {
- var current = $ul.find('.visible'),
- target = current[direction]();
-
- if (target.length) {
- target
- .find('img')
- .trigger('click', [current, target]);
- }
- },
-
- shift : function (current, target, callback) {
- var clearing = target.parent(),
- old_index = this.settings.prev_index || target.index(),
- direction = this.direction(clearing, current, target),
- left = parseInt(clearing.css('left'), 10),
- width = this.outerWidth(target),
- skip_shift;
-
- // we use jQuery animate instead of CSS transitions because we
- // need a callback to unlock the next animation
- if (target.index() !== old_index && !/skip/.test(direction)){
- if (/left/.test(direction)) {
- this.lock();
- clearing.animate({left : left + width}, 300, this.unlock());
- } else if (/right/.test(direction)) {
- this.lock();
- clearing.animate({left : left - width}, 300, this.unlock());
- }
- } else if (/skip/.test(direction)) {
- // the target image is not adjacent to the current image, so
- // do we scroll right or not
- skip_shift = target.index() - this.settings.up_count;
- this.lock();
-
- if (skip_shift > 0) {
- clearing.animate({left : -(skip_shift * width)}, 300, this.unlock());
- } else {
- clearing.animate({left : 0}, 300, this.unlock());
- }
- }
-
- callback();
- },
-
- direction : function ($el, current, target) {
- var lis = $el.find('li'),
- li_width = this.outerWidth(lis) + (this.outerWidth(lis) / 4),
- up_count = Math.floor(this.outerWidth($('.clearing-container')) / li_width) - 1,
- target_index = lis.index(target),
- response;
-
- this.settings.up_count = up_count;
-
- if (this.adjacent(this.settings.prev_index, target_index)) {
- if ((target_index > up_count)
- && target_index > this.settings.prev_index) {
- response = 'right';
- } else if ((target_index > up_count - 1)
- && target_index <= this.settings.prev_index) {
- response = 'left';
- } else {
- response = false;
- }
- } else {
- response = 'skip';
- }
-
- this.settings.prev_index = target_index;
-
- return response;
- },
-
- adjacent : function (current_index, target_index) {
- for (var i = target_index + 1; i >= target_index - 1; i--) {
- if (i === current_index) return true;
- }
- return false;
- },
-
- // lock management
-
- lock : function () {
- this.settings.locked = true;
- },
-
- unlock : function () {
- this.settings.locked = false;
- },
-
- locked : function () {
- return this.settings.locked;
- },
-
- // plugin management/browser quirks
-
- outerHTML : function (el) {
- // support FireFox < 11
- return el.outerHTML || new XMLSerializer().serializeToString(el);
- },
-
- off : function () {
- $(this.scope).off('.fndtn.clearing');
- $(window).off('.fndtn.clearing');
- this.remove_data(); // empty settings cache
- this.settings.init = false;
- }
- };
-
-}(Foundation.zj, this, this.document));
View
74 public/js/foundation/foundation.cookie.js
@@ -1,74 +0,0 @@
-/*!
- * 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);
View
130 public/js/foundation/foundation.dropdown.js
@@ -1,130 +0,0 @@
-/*jslint unparam: true, browser: true, indent: 2 */
-
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs.dropdown = {
- name : 'dropdown',
-
- version : '4.0.9',
-
- settings : {
- activeClass: 'open'
- },
-
- init : function (scope, method, options) {
- this.scope = scope || this.scope;
- Foundation.inherit(this, 'throttle');
-
- if (typeof method === 'object') {
- $.extend(true, this.settings, method);
- }
-
- if (typeof method != 'string') {
-
- if (!this.settings.init) {
- this.events();
- }
-
- return this.settings.init;
- } else {
- return this[method].call(this, options);
- }
- },
-
- events : function () {
- var self = this;
-
- $(this.scope).on('click.fndtn.dropdown', '[data-dropdown]', function (e) {
- e.preventDefault();
- e.stopPropagation();
- self.toggle($(this));
- });
-
- $('*, html, body').on('click.fndtn.dropdown', function (e) {
- if (!$(e.target).data('dropdown')) {
- $('[data-dropdown-content]')
- .css('left', '-99999px')
- .removeClass(self.settings.activeClass);
- }
- });
-
- $(window).on('resize.fndtn.dropdown', self.throttle(function () {
- self.resize.call(self);
- }, 50)).trigger('resize');
-
- this.settings.init = true;
- },
-
- toggle : function (target, resize) {
- var dropdown = $('#' + target.data('dropdown'));
-
- $('[data-dropdown-content]').not(dropdown).css('left', '-99999px').removeClass(this.settings.activeClass);
-
- if (dropdown.hasClass(this.settings.activeClass)) {
- dropdown
- .css('left', '-99999px')
- .removeClass(this.settings.activeClass);
- } else {
- this
- .css(dropdown
- .addClass(this.settings.activeClass), 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) {
- if (dropdown.parent()[0] === $('body')[0]) {
- var position = target.offset();
- } 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 ($(window).width() > this.outerWidth(dropdown) + target.offset().left) {
- var left = position.left;
- } else {
- if (!dropdown.hasClass('right')) {
- dropdown.addClass('right');
- }
- var left = position.left - (this.outerWidth(dropdown) - this.outerWidth(target));
- }
- dropdown.attr('style', '').css({
- position : 'absolute',
- top: position.top + this.outerHeight(target),
- left: left
- });
- }
-
- return dropdown;
- },
-
- small : function () {
- return $(window).width() < 768 || $('html').hasClass('lt-ie9');
- },
-
- off: function () {
- $(this.scope).off('.fndtn.dropdown');
- $('html, body').off('.fndtn.dropdown');
- $(window).off('.fndtn.dropdown');
- $('[data-dropdown-content]').off('.fndtn.dropdown');
- this.settings.init = false;
- }
- };
-}(Foundation.zj, this, this.document));
View
612 public/js/foundation/foundation.joyride.js
@@ -1,612 +0,0 @@
-/*jslint unparam: true, browser: true, indent: 2 */
-
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs.joyride = {
- name: 'joyride',
-
- version : '4.0.0',
-
- defaults : {
- tipLocation : 'bottom', // 'top' or 'bottom' in relation to parent
- nubPosition : 'auto', // override on a per tooltip bases
- scrollSpeed : 300, // Page scrolling speed in milliseconds
- 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
- 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
- template : { // HTML segments for tip layout
- link : '<a href="#close" class="joyride-close-tip">&times;</a>',
- timer : '<div class="joyride-timer-indicator-wrap"><span class="joyride-timer-indicator"></span></div>',
- tip : '<div class="joyride-tip-guide"><span class="joyride-nub"></span></div>',
- wrapper : '<div class="joyride-content-wrapper"></div>',
- button : '<a href="#" class="small button joyride-next-tip"></a>'
- }
- },
-
- 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.is_phone()) {
- self.pos_phone();
- } else {
- self.pos_default();
- }
- }
- }, 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_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) {
-
- 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 (thsi.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) ? true : false;
- },
-
- hide : function () {
- this.settings.postStepCallback(this.settings.$li.index(),
- this.settings.$current_tip);
- $('.joyride-modal-bg').hide();
- this.settings.$current_tip.hide();
- },
-
- 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 () {
- if (($.inArray((this.settings.$li.index() + 1), this.settings.pauseAfter) === -1)) {
- return true;
- }
-
- return false;
- },
-
- restart : function () {
- this.hide();
- this.settings.$li = undefined;
- this.show('init');
- },
-
- pos_default : function (init) {
- var half_fold = Math.ceil($(window).height() / 2),
- tip_position = this.settings.$next_tip.offset(),
- $nub = this.settings.$next_tip.find('.joyride-nub'),
- 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 (!/body/i.test(this.settings.$target.selector)) {
-
- if (this.bottom()) {
- this.settings.$next_tip.css({
- top: (this.settings.$target.offset().top + nub_height + this.outerHeight(this.settings.$target)),
- left: this.settings.$target.offset().left});
-
- this.nub_position($nub, this.settings.tipSettings.nubPosition, 'top');
-
- } else if (this.top()) {
-
- this.settings.$next_tip.css({
- top: (this.settings.$target.offset().top - this.outerHeight(this.settings.$next_tip) - nub_height),
- left: this.settings.$target.offset().left});
-
- 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)});
-
- 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_height)});
-
- 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(true);
-
- }
-
- } 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();
- if (!this.settings.$next_tip.data('closed')) {
- if ($('.joyride-modal-bg').length < 1) {
- $('body').append('<div class="joyride-modal-bg">').show();
- }
-
- if (/pop/i.test(this.settings.tipAnimation)) {
- $('.joyride-modal-bg').show();
- } else {
- $('.joyride-modal-bg').fadeIn(this.settings.tipAnimationFadeSpeed);
- }
- }
- },
-
- 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),
- right = w.width() + this.scrollLeft(w),
- bottom = w.width() + w.scrollTop();
-
- return [
- el.offset().top <= w.scrollTop(),
- right <= el.offset().left + this.outerWidth(el),
- bottom <= el.offset().top + this.outerHeight(el),
- 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);
- }
-
- 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);
- },
-
- outerHTML : function (el) {
- // support FireFox < 11
- return el.outerHTML || new XMLSerializer().serializeToString(el);
- },
-
- off : function () {
- $(this.scope).off('.joyride');
- $(window).off('.joyride');
- $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride');
- $('.joyride-tip-guide, .joyride-modal-bg').remove();
- clearTimeout(this.settings.automate);
- this.settings = {};
- }
- };
-}(Foundation.zj, this, this.document));
View
130 public/js/foundation/foundation.magellan.js
@@ -1,130 +0,0 @@
-/*jslint unparam: true, browser: true, indent: 2 */
-
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs.magellan = {
- name : 'magellan',
-
- version : '4.0.0',
-
- settings : {
- activeClass: 'active'
- },
-
- init : function (scope, method, options) {
- this.scope = scope || this.scope;
- Foundation.inherit(this, 'data_options');
-
- if (typeof method === 'object') {
- $.extend(true, this.settings, method);
- }
-
- if (typeof method != 'string') {
- if (!this.settings.init) {
- this.fixed_magellan = $("[data-magellan-expedition]");
- this.set_threshold();
- this.last_destination = $('[data-magellan-destination]').last();
- this.events();
- }
-
- return this.settings.init;
- } else {
- return this[method].call(this, options);
- }
- },
-
- events : function () {
- var self = this;
- $(this.scope).on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) {
- var $destination = $(this),
- $expedition = $destination.closest('[data-magellan-expedition]'),
- activeClass = $expedition.attr('data-magellan-active-class')
- || self.settings.activeClass;
-
- $destination
- .closest('[data-magellan-expedition]')
- .find('[data-magellan-arrival]')
- .not($destination)
- .removeClass(activeClass);
- $destination.addClass(activeClass);
- });
-
- this.fixed_magellan
- .on('update-position.fndtn.magellan', function(){
- var $el = $(this);
- // $el.data("magellan-fixed-position","");
- //$el.data("magellan-top-offset", "");
- })
- .trigger('update-position');
-
- $(window)
- .on('resize.fndtn.magellan', function() {
- this.fixed_magellan.trigger('update-position');
- }.bind(this))
-
- .on('scroll.fndtn.magellan', function() {
- var windowScrollTop = $(window).scrollTop();
- self.fixed_magellan.each(function() {
- var $expedition = $(this);
- if (typeof $expedition.data('magellan-top-offset') === 'undefined') {
- $expedition.data('magellan-top-offset', $expedition.offset().top);
- }
- if (typeof $expedition.data('magellan-fixed-position') === 'undefined') {
- $expedition.data('magellan-fixed-position', false)
- }
- var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset");
- var attr = $expedition.attr('data-magellan-top-offset');
-
- if ($expedition.data("magellan-fixed-position") != fixed_position) {
- $expedition.data("magellan-fixed-position", fixed_position);
- if (fixed_position) {
- $expedition.css({position:"fixed", top:0});
- } else {
- $expedition.css({position:"", top:""});
- }
- if (fixed_position && typeof attr != 'undefined' && attr != false) {
- $expedition.css({position:"fixed", top:attr + "px"});
- }
- }
- });
- });
-
-
- if (this.last_destination.length > 0) {
- $(window).on('scroll.fndtn.magellan', function (e) {
- var windowScrollTop = $(window).scrollTop(),
- scrolltopPlusHeight = windowScrollTop + $(window).height(),
- lastDestinationTop = Math.ceil(self.last_destination.offset().top);
-
- $('[data-magellan-destination]').each(function () {
- var $destination = $(this),
- destination_name = $destination.attr('data-magellan-destination'),
- topOffset = $destination.offset().top - windowScrollTop;
-
- if (topOffset <= self.settings.threshold) {
- $("[data-magellan-arrival='" + destination_name + "']").trigger('arrival');
- }
- // In large screens we may hit the bottom of the page and dont reach the top of the last magellan-destination, so lets force it
- if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) {
- $('[data-magellan-arrival]').last().trigger('arrival');
- }
- });
- });
- }
-
- this.settings.init = true;
- },
-
- set_threshold : function () {
- if (!this.settings.threshold) {
- this.settings.threshold = (this.fixed_magellan.length > 0) ?
- this.outerHeight(this.fixed_magellan, true) : 0;
- }
- },
-
- off : function () {
- $(this.scope).off('.fndtn.magellan');
- }
- };
-}(Foundation.zj, this, this.document));
View
365 public/js/foundation/foundation.orbit.js
@@ -1,365 +0,0 @@
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs = Foundation.libs || {};
-
- Foundation.libs.orbit = {
- name: 'orbit',
-
- version: '4.0.0',
-
- settings: {
- timer_speed: 10000,
- animation_speed: 500,
- bullets: true,
- stack_on_small: true,
- container_class: 'orbit-container',
- stack_on_small_class: 'orbit-stack-on-small',
- next_class: 'orbit-next',
- prev_class: 'orbit-prev',
- timer_container_class: 'orbit-timer',
- timer_paused_class: 'paused',
- timer_progress_class: 'orbit-progress',
- slides_container_class: 'orbit-slides-container',
- bullets_container_class: 'orbit-bullets',
- bullets_active_class: 'active',
- slide_number_class: 'orbit-slide-number',
- caption_class: 'orbit-caption',
- active_slide_class: 'active',
- orbit_transition_class: 'orbit-transitioning'
- },
-
- init: function (scope, method, options) {
- var self = this;
- Foundation.inherit(self, 'data_options');
-
- if (typeof method === 'object') {
- $.extend(true, self.settings, method);
- }
-
- $('[data-orbit]', scope).each(function(idx, el) {
- var scoped_self = $.extend(true, {}, self);
- scoped_self._init(idx, el);
- });
- },
-
- _container_html: function() {
- var self = this;
- return '<div class="' + self.settings.container_class + '"></div>';
- },
-
- _bullets_container_html: function($slides) {
- var self = this,
- $list = $('<ol class="' + self.settings.bullets_container_class + '"></ol>');
- $slides.each(function(idx, slide) {
- var $item = $('<li data-orbit-slide-number="' + (idx+1) + '" class=""></li>');
- if (idx === 0) {
- $item.addClass(self.settings.bullets_active_class);
- }
- $list.append($item);
- });
- return $list;
- },
-
- _slide_number_html: function(slide_number, total_slides) {
- var self = this,
- $container = $('<div class="' + self.settings.slide_number_class + '"></div>');
- $container.append('<span>' + slide_number + '</span> of <span>' + total_slides + '</span>');
- return $container;
- },
-
- _timer_html: function() {
- var self = this;
- if (typeof self.settings.timer_speed === 'number' && self.settings.timer_speed > 0) {
- return '<div class="' + self.settings.timer_container_class
- + '"><span></span><div class="' + self.settings.timer_progress_class
- + '"></div></div>';
- } else {
- return '';
- }
- },
-
- _next_html: function() {
- var self = this;
- return '<a href="#" class="' + self.settings.next_class + '">Next <span></span></a>';
- },
-
- _prev_html: function() {
- var self = this;
- return '<a href="#" class="' + self.settings.prev_class + '">Prev <span></span></a>';
- },
-
- _init: function (idx, slider) {
- var self = this,
- $slides_container = $(slider),
- $container = $slides_container.wrap(self._container_html()).parent(),
- $slides = $slides_container.children();
-
- $.extend(true, self.settings, self.data_options($slides_container));
-
- $container.append(self._prev_html());
- $container.append(self._next_html());
- $slides_container.addClass(self.settings.slides_container_class);
- if (self.settings.stack_on_small) {
- $container.addClass(self.settings.stack_on_small_class);
- }
- $container.append(self._slide_number_html(1, $slides.length));
- $container.append(self._timer_html());
- if (self.settings.bullets) {
- $container.after(self._bullets_container_html($slides));
- }
- // To better support the "sliding" effect it's easier
- // if we just clone the first and last slides
- $slides_container.append($slides.first().clone().attr('data-orbit-slide',''));
- $slides_container.prepend($slides.last().clone().attr('data-orbit-slide',''));
- // Make the first "real" slide active
- $slides_container.css('marginLeft', '-100%');
- $slides.first().addClass(self.settings.active_slide_class);
-
- self._init_events($slides_container);
- self._init_dimensions($slides_container);
- self._start_timer($slides_container);
- },
-
- _init_events: function ($slides_container) {
- var self = this,
- $container = $slides_container.parent();
-
- $(window)
- .on('load.fndtn.orbit', function() {
- $slides_container.height('');
- $slides_container.height($slides_container.height($container.height()));
- $slides_container.trigger('orbit:ready');
- })
- .on('resize.fndtn.orbit', function() {
- $slides_container.height('');
- $slides_container.height($slides_container.height($container.height()));
- });
-
- $(document).on('click.fndtn.orbit', '[data-orbit-link]', function(e) {
- e.preventDefault();
- var id = $(e.currentTarget).attr('data-orbit-link'),
- $slide = $slides_container.find('[data-orbit-slide=' + id + ']').first();
-
- if ($slide.length === 1) {
- self._reset_timer($slides_container, true);
- self._goto($slides_container, $slide.index(), function() {});
- }
- });
-
- $container.siblings('.' + self.settings.bullets_container_class)
- .on('click.fndtn.orbit', '[data-orbit-slide-number]', function(e) {
- e.preventDefault();
- self._reset_timer($slides_container, true);
- self._goto($slides_container, $(e.currentTarget).data('orbit-slide-number'),function() {});
- });
-
- $container
- .on('orbit:after-slide-change.fndtn.orbit', function(e, orbit) {
- var $slide_number = $container.find('.' + self.settings.slide_number_class);
-
- if ($slide_number.length === 1) {
- $slide_number.replaceWith(self._slide_number_html(orbit.slide_number, orbit.total_slides));
- }
- })
- .on('orbit:next-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.next_class, function(e) {
- e.preventDefault();
- self._reset_timer($slides_container, true);
- self._goto($slides_container, 'next', function() {});
- })
- .on('orbit:prev-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.prev_class, function(e) {
- e.preventDefault();
- self._reset_timer($slides_container, true);
- self._goto($slides_container, 'prev', function() {});
- })
- .on('orbit:toggle-play-pause.fndtn.orbit click.fndtn.orbit touchstart.fndtn.orbit', '.' + self.settings.timer_container_class, function(e) {
- e.preventDefault();
- var $timer = $(e.currentTarget).toggleClass(self.settings.timer_paused_class),
- $slides_container = $timer.closest('.' + self.settings.container_class)
- .find('.' + self.settings.slides_container_class);
-
- if ($timer.hasClass(self.settings.timer_paused_class)) {
- self._stop_timer($slides_container);
- } else {
- self._start_timer($slides_container);
- }
- })
- .on('touchstart.fndtn.orbit', function(e) {
- if (!e.touches) { e = e.originalEvent; }
- var data = {
- start_page_x: e.touches[0].pageX,
- start_page_y: e.touches[0].pageY,
- start_time: (new Date()).getTime(),
- delta_x: 0,
- is_scrolling: undefined
- };
- $container.data('swipe-transition', data);
- e.stopPropagation();
- })
- .on('touchmove.fndtn.orbit', function(e) {
- if (!e.touches) { e = e.originalEvent; }
- // Ignore pinch/zoom events
- if(e.touches.length > 1 || e.scale && e.scale !== 1) return;
-
- var data = $container.data('swipe-transition');
- if (typeof data === 'undefined') {
- data = {};
- }
-
- data.delta_x = e.touches[0].pageX - data.start_page_x;
-
- if ( typeof data.is_scrolling === 'undefined') {
- data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );
- }
-
- if (!data.is_scrolling && !data.active) {
- e.preventDefault();
- self._stop_timer($slides_container);
- var direction = (data.delta_x < 0) ? 'next' : 'prev';
- data.active = true;
- self._goto($slides_container, direction, function() {});
- }
- })
- .on('touchend.fndtn.orbit', function(e) {
- $container.data('swipe-transition', {});
- e.stopPropagation();
- });
- },
-
- _init_dimensions: function ($slides_container) {
- var $container = $slides_container.parent(),
- $slides = $slides_container.children();
-
- $slides_container.css('width', $slides.length * 100 + '%');
- $slides.css('width', 100 / $slides.length + '%');
- $slides_container.height($container.height());
- $slides_container.css('width', $slides.length * 100 + '%');
- },
-
- _start_timer: function ($slides_container) {
- var self = this,
- $container = $slides_container.parent();
-
- var callback = function() {
- self._reset_timer($slides_container, false);
- self._goto($slides_container, 'next', function() {
- self._start_timer($slides_container);
- });
- };
-
- var $timer = $container.find('.' + self.settings.timer_container_class),
- $progress = $timer.find('.' + self.settings.timer_progress_class),
- progress_pct = ($progress.width() / $timer.width()),
- delay = self.settings.timer_speed - (progress_pct * self.settings.timer_speed);
-
- $progress.animate({'width': '100%'}, delay, 'linear', callback);
- $slides_container.trigger('orbit:timer-started');
- },
-
- _stop_timer: function ($slides_container) {
- var self = this,
- $container = $slides_container.parent(),
- $timer = $container.find('.' + self.settings.timer_container_class),
- $progress = $timer.find('.' + self.settings.timer_progress_class),
- progress_pct = $progress.width() / $timer.width()
- self._rebuild_timer($container, progress_pct * 100 + '%');
- // $progress.stop();
- $slides_container.trigger('orbit:timer-stopped');
- $timer = $container.find('.' + self.settings.timer_container_class);
- $timer.addClass(self.settings.timer_paused_class);
- },
-
- _reset_timer: function($slides_container, is_paused) {
- var self = this,
- $container = $slides_container.parent();
- self._rebuild_timer($container, '0%');
- if (typeof is_paused === 'boolean' && is_paused) {
- var $timer = $container.find('.' + self.settings.timer_container_class);
- $timer.addClass(self.settings.timer_paused_class);
- }
- },
-
- _rebuild_timer: function ($container, width_pct) {
- // Zepto is unable to stop animations since they
- // are css-based. This is a workaround for that
- // limitation, which rebuilds the dom element
- // thus stopping the animation
- var self = this,
- $timer = $container.find('.' + self.settings.timer_container_class),
- $new_timer = $(self._timer_html()),
- $new_timer_progress = $new_timer.find('.' + self.settings.timer_progress_class);
-
- if (typeof Zepto === 'function') {
- $timer.remove();
- $container.append($new_timer);
- $new_timer_progress.css('width', width_pct);
- } else if (typeof jQuery === 'function') {
- var $progress = $timer.find('.' + self.settings.timer_progress_class);
- $progress.css('width', width_pct);
- $progress.stop();
- }
- },
-
- _goto: function($slides_container, index_or_direction, callback) {
- var self = this,
- $container = $slides_container.parent(),
- $slides = $slides_container.children(),
- $active_slide = $slides_container.find('.' + self.settings.active_slide_class),
- active_index = $active_slide.index();
-
- if ($container.hasClass(self.settings.orbit_transition_class)) {
- return false;
- }
-
- if (index_or_direction === 'prev') {
- if (active_index === 0) {
- active_index = $slides.length - 1;
- }
- else {
- active_index--;
- }
- }
- else if (index_or_direction === 'next') {
- active_index = (active_index+1) % $slides.length;
- }
- else if (typeof index_or_direction === 'number') {
- active_index = (index_or_direction % $slides.length);
- }
- if (active_index === ($slides.length - 1) && index_or_direction === 'next') {
- $slides_container.css('marginLeft', '0%');
- active_index = 1;
- }
- else if (active_index === 0 && index_or_direction === 'prev') {
- $slides_container.css('marginLeft', '-' + ($slides.length - 1) * 100 + '%');
- active_index = $slides.length - 2;
- }
- // Start transition, make next slide active
- $container.addClass(self.settings.orbit_transition_class);
- $active_slide.removeClass(self.settings.active_slide_class);
- $($slides[active_index]).addClass(self.settings.active_slide_class);
- // Make next bullet active
- var $bullets = $container.siblings('.' + self.settings.bullets_container_class);
- if ($bullets.length === 1) {
- $bullets.children().removeClass(self.settings.bullets_active_class);
- $($bullets.children()[active_index-1]).addClass(self.settings.bullets_active_class);
- }
- var new_margin_left = '-' + (active_index * 100) + '%';
- // Check to see if animation will occur, otherwise perform
- // callbacks manually
- $slides_container.trigger('orbit:before-slide-change');
- if ($slides_container.css('marginLeft') === new_margin_left) {
- $container.removeClass(self.settings.orbit_transition_class);
- $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
- callback();
- } else {
- $slides_container.animate({
- 'marginLeft' : new_margin_left
- }, self.settings.animation_speed, 'linear', function() {
- $container.removeClass(self.settings.orbit_transition_class);
- $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
- callback();
- });
- }
- }
- };
-}(Foundation.zj, this, this.document));
View
159 public/js/foundation/foundation.placeholder.js
@@ -1,159 +0,0 @@
-/*! 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));
View
270 public/js/foundation/foundation.reveal.js
@@ -1,270 +0,0 @@
-/*jslint unparam: true, browser: true, indent: 2 */
-
-;(function ($, window, document, undefined) {
- 'use strict';
-
- Foundation.libs.reveal = {
- name: 'reveal',
-
- version : '4.0.9',
-
- locked : false,
-
- settings : {
- animation: 'fadeAndPop',
- animationSpeed: 250,