diff options
author | Kenton Hamaluik <kenton@hamaluik.com> | 2014-01-22 13:20:50 -0700 |
---|---|---|
committer | Kenton Hamaluik <kenton@hamaluik.com> | 2014-01-22 13:20:50 -0700 |
commit | abf580866624bfeec53d948894ba02fe4ee307fd (patch) | |
tree | 293847ec012f51ffb01cce3de0fd2a198f5943a5 /foundation-default-colours/static/js/foundation | |
parent | 6b057e4f9bb931e2db52c49a84bbe457f9f3910e (diff) | |
download | pelican-themes-abf580866624bfeec53d948894ba02fe4ee307fd.tar.gz |
Added Zurb Foundation 5.0.1 theme.
Diffstat (limited to 'foundation-default-colours/static/js/foundation')
15 files changed, 4024 insertions, 0 deletions
diff --git a/foundation-default-colours/static/js/foundation/foundation.abide.js b/foundation-default-colours/static/js/foundation/foundation.abide.js new file mode 100644 index 0000000..1478b18 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.abide.js @@ -0,0 +1,201 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.abide = { + name : 'abide', + + version : '5.0.0', + + settings : { + 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) { + this.bindings(method, options); + }, + + events : function (scope) { + var self = this, + form = $(scope).attr('novalidate', 'novalidate'), + settings = form.data('abide-init'); + + form + .off('.abide') + .on('submit.fndtn.abide validate.fndtn.abide', function (e) { + var is_ajax = /ajax/i.test($(this).attr('data-abide')); + return self.validate($(this).find('input, textarea, select').get(), e, is_ajax); + }) + .find('input, textarea, select') + .off('.abide') + .on('blur.fndtn.abide change.fndtn.abide', function (e) { + self.validate([this], e); + }) + .on('keydown.fndtn.abide', function (e) { + var settings = $(this).closest('form').data('abide-init'); + clearTimeout(self.timer); + self.timer = setTimeout(function () { + self.validate([this], e); + }.bind(this), settings.timeout); + }); + }, + + validate : function (els, e, is_ajax) { + var validations = this.parse_patterns(els), + validation_count = validations.length, + form = $(els[0]).closest('form'), + submit_event = /submit/.test(e.type); + + for (var i=0; i < validation_count; i++) { + if (!validations[i] && (submit_event || is_ajax)) { + if (this.settings.focus_on_invalid) els[i].focus(); + form.trigger('invalid'); + $(els[i]).closest('form').attr('data-invalid', ''); + return false; + } + } + + if (submit_event || is_ajax) { + form.trigger('valid'); + } + + form.removeAttr('data-invalid'); + + if (is_ajax) return false; + + 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_equal = el.getAttribute('data-equalto'), + 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 (is_equal && required) { + validations.push(this.valid_equal(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; + }, + + valid_equal: function(el, required) { + var from = document.getElementById(el.getAttribute('data-equalto')).value, + to = el.value, + valid = (from === to); + + if (valid) { + $(el).removeAttr('data-invalid').parent().removeClass('error'); + } else { + $(el).attr('data-invalid', '').parent().addClass('error'); + } + + return valid; + } + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.accordion.js b/foundation-default-colours/static/js/foundation/foundation.accordion.js new file mode 100644 index 0000000..c36d0b1 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.accordion.js @@ -0,0 +1,41 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.accordion = { + name : 'accordion', + + version : '5.0.1', + + settings : { + active_class: 'active', + toggleable: true + }, + + init : function (scope, method, options) { + this.bindings(method, options); + }, + + events : function () { + $(this.scope).off('.accordion').on('click.fndtn.accordion', '[data-accordion] > dd > a', function (e) { + var accordion = $(this).parent(), + target = $('#' + this.href.split('#')[1]), + siblings = $('> dd > .content', target.closest('[data-accordion]')), + settings = accordion.parent().data('accordion-init'), + active = $('> dd > .content.' + settings.active_class, accordion.parent()); + + e.preventDefault(); + + if (active[0] == target[0] && settings.toggleable) { + return target.toggleClass(settings.active_class); + } + + siblings.removeClass(settings.active_class); + target.addClass(settings.active_class); + }); + }, + + off : function () {}, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.alert.js b/foundation-default-colours/static/js/foundation/foundation.alert.js new file mode 100644 index 0000000..1bb404a --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.alert.js @@ -0,0 +1,34 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.alert = { + name : 'alert', + + version : '5.0.0', + + settings : { + animation: 'fadeOut', + speed: 300, // fade out speed + callback: function (){} + }, + + init : function (scope, method, options) { + this.bindings(method, options); + }, + + events : function () { + $(this.scope).off('.alert').on('click.fndtn.alert', '[data-alert] a.close', function (e) { + var alertBox = $(this).closest("[data-alert]"), + settings = alertBox.data('alert-init'); + + e.preventDefault(); + alertBox[settings.animation](settings.speed, function () { + $(this).trigger('closed').remove(); + settings.callback(); + }); + }); + }, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.clearing.js b/foundation-default-colours/static/js/foundation/foundation.clearing.js new file mode 100644 index 0000000..75daf44 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.clearing.js @@ -0,0 +1,450 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.clearing = { + name : 'clearing', + + version: '5.0.0', + + 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, 'throttle loaded'); + + this.bindings(method, options); + + if ($(this.scope).is('[data-clearing]')) { + this.assemble($('li', this.scope)); + } else { + $('[data-clearing]', this.scope).each(function () { + self.assemble($('li', this)); + }); + } + }, + + events : function (scope) { + var self = this; + + $(this.scope) + .off('.clearing') + .on('click.fndtn.clearing', 'ul[data-clearing] li', + function (e, current, target) { + var current = current || $(this), + target = target || current, + next = current.next('li'), + settings = current.closest('[data-clearing]').data('clearing-init'), + image = $(e.target); + + e.preventDefault(); + + if (!settings) { + self.init(); + settings = current.closest('[data-clearing]').data('clearing-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 = $('img', target); + } + + // set current and target to the clicked li if not otherwise defined. + self.open(image, current, target); + self.update_paddles(target); + }) + + .on('click.fndtn.clearing', '.clearing-main-next', + function (e) { self.nav(e, 'next') }) + .on('click.fndtn.clearing', '.clearing-main-prev', + function (e) { self.nav(e, 'prev') }) + .on('click.fndtn.clearing', this.settings.close_selectors, + function (e) { Foundation.libs.clearing.close(e, this) }) + .on('keydown.fndtn.clearing', + function (e) { self.keydown(e) }); + + $(window).off('.clearing').on('resize.fndtn.clearing', + function () { self.resize() }); + + this.swipe_events(scope); + }, + + swipe_events : function (scope) { + 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(); + + if ($el.parent().hasClass('carousel')) return; + $el.after('<div id="foundationClearingHolder"></div>'); + + var holder = $('#foundationClearingHolder'), + settings = $el.data('clearing-init'), + grid = $el.detach(), + data = { + grid: '<div class="carousel">' + grid[0].outerHTML + '</div>', + viewing: settings.templates.viewing + }, + wrapper = '<div class="clearing-assembled"><div>' + data.viewing + + data.grid + '</div></div>'; + + return holder.after(wrapper).remove(); + }, + + open : function ($image, current, target) { + var root = target.closest('.clearing-assembled'), + container = $('div', root).first(), + visible_image = $('.visible-img', container), + image = $('img', visible_image).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($('.clearing-caption', visible_image), $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 = $('div', root).first(); + visible_image = $('.visible-img', container); + this.settings.prev_index = 0; + $('ul[data-clearing]', root) + .attr('style', '').closest('.clearing-blackout') + .removeClass('clearing-blackout'); + container.removeClass('clearing-container'); + visible_image.hide(); + } + + return false; + }, + + is_open : function (current) { + return current.parent().prop('style').length > 0; + }, + + keydown : function (e) { + var clearing = $('ul[data-clearing]', '.clearing-blackout'); + + 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 = $('ul[data-clearing]', '.clearing-blackout'); + + e.preventDefault(); + this.go(clearing, direction); + }, + + resize : function () { + var image = $('img', '.clearing-blackout .visible-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() > image.outerHeight()) { + 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) { + $('.clearing-main-next', visible_image) + .removeClass('disabled'); + } else { + $('.clearing-main-next', visible_image) + .addClass('disabled'); + } + + if (target.prev().length > 0) { + $('.clearing-main-prev', visible_image) + .removeClass('disabled'); + } else { + $('.clearing-main-prev', visible_image) + .addClass('disabled'); + } + }, + + center : function (target) { + if (!this.rtl) { + target.css({ + marginLeft : -(target.outerWidth() / 2), + marginTop : -(target.outerHeight() / 2) + }); + } else { + target.css({ + marginRight : -(target.outerWidth() / 2), + marginTop : -(target.outerHeight() / 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()); + }, + + img : function (img) { + if (img.length) { + var new_img = new Image(), + new_a = $('a', img); + + if (new_a.length) { + new_img.src = new_a.attr('href'); + } else { + new_img.src = $('img', 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 = $('.visible', $ul), + target = current[direction](); + + if (target.length) { + $('img', target) + .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 = target.outerWidth(), + 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 = $('li', $el), + li_width = lis.outerWidth() + (lis.outerWidth() / 4), + up_count = Math.floor($('.clearing-container').outerWidth() / li_width) - 1, + target_index = lis.index(target), + response; + + this.settings.up_count = up_count; + + if (this.adjacent(this.settings.prev_index, target_index)) { + if ((target_index > up_count) + && target_index > this.settings.prev_index) { + response = 'right'; + } else if ((target_index > up_count - 1) + && target_index <= this.settings.prev_index) { + response = 'left'; + } else { + response = false; + } + } else { + response = 'skip'; + } + + this.settings.prev_index = target_index; + + return response; + }, + + adjacent : function (current_index, target_index) { + for (var i = target_index + 1; i >= target_index - 1; i--) { + if (i === current_index) return true; + } + return false; + }, + + // lock management + + lock : function () { + this.settings.locked = true; + }, + + unlock : function () { + this.settings.locked = false; + }, + + locked : function () { + return this.settings.locked; + }, + + off : function () { + $(this.scope).off('.fndtn.clearing'); + $(window).off('.fndtn.clearing'); + }, + + reflow : function () { + this.init(); + } + }; + +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.dropdown.js b/foundation-default-colours/static/js/foundation/foundation.dropdown.js new file mode 100644 index 0000000..622db93 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.dropdown.js @@ -0,0 +1,184 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.dropdown = { + name : 'dropdown', + + version : '5.0.0', + + settings : { + active_class: 'open', + is_hover: false, + opened: function(){}, + closed: function(){} + }, + + init : function (scope, method, options) { + Foundation.inherit(this, 'throttle'); + + this.bindings(method, options); + }, + + events : function (scope) { + var self = this; + + $(this.scope) + .off('.dropdown') + .on('click.fndtn.dropdown', '[data-dropdown]', function (e) { + var settings = $(this).data('dropdown-init'); + e.preventDefault(); + + if (!settings.is_hover || Modernizr.touch) self.toggle($(this)); + }) + .on('mouseenter.fndtn.dropdown', '[data-dropdown], [data-dropdown-content]', function (e) { + var $this = $(this); + clearTimeout(self.timeout); + + if ($this.data('dropdown')) { + var dropdown = $('#' + $this.data('dropdown')), + target = $this; + } else { + var dropdown = $this; + target = $("[data-dropdown='" + dropdown.attr('id') + "']"); + } + + var settings = target.data('dropdown-init'); + if (settings.is_hover) self.open.apply(self, [dropdown, target]); + }) + .on('mouseleave.fndtn.dropdown', '[data-dropdown], [data-dropdown-content]', function (e) { + var $this = $(this); + self.timeout = setTimeout(function () { + if ($this.data('dropdown')) { + var settings = $this.data('dropdown-init'); + if (settings.is_hover) self.close.call(self, $('#' + $this.data('dropdown'))); + } else { + var target = $('[data-dropdown="' + $(this).attr('id') + '"]'), + settings = target.data('dropdown-init'); + if (settings.is_hover) self.close.call(self, $this); + } + }.bind(this), 150); + }) + .on('click.fndtn.dropdown', function (e) { + var parent = $(e.target).closest('[data-dropdown-content]'); + + if ($(e.target).data('dropdown') || $(e.target).parent().data('dropdown')) { + return; + } + if (!($(e.target).data('revealId')) && + (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]')); + }) + .on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened) + .on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed); + + $(window) + .off('.dropdown') + .on('resize.fndtn.dropdown', self.throttle(function () { + self.resize.call(self); + }, 50)).trigger('resize'); + }, + + close: function (dropdown) { + var self = this; + dropdown.each(function () { + if ($(this).hasClass(self.settings.active_class)) { + $(this) + .css(Foundation.rtl ? 'right':'left', '-99999px') + .removeClass(self.settings.active_class); + $(this).trigger('closed'); + } + }); + }, + + open: function (dropdown, target) { + this + .css(dropdown + .addClass(this.settings.active_class), target); + dropdown.trigger('opened'); + }, + + toggle : function (target) { + var dropdown = $('#' + target.data('dropdown')); + if (dropdown.length === 0) { + // No dropdown found, not continuing + return; + } + + this.close.call(this, $('[data-dropdown-content]').not(dropdown)); + + if (dropdown.hasClass(this.settings.active_class)) { + 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(), + position = target.offset(); + + position.top -= offset_parent.offset().top; + position.left -= offset_parent.offset().left; + + if (this.small()) { + dropdown.css({ + position : 'absolute', + width: '95%', + 'max-width': 'none', + top: position.top + target.outerHeight() + }); + dropdown.css(Foundation.rtl ? 'right':'left', '2.5%'); + } else { + if (!Foundation.rtl && $(window).width() > dropdown.outerWidth() + 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 - (dropdown.outerWidth() - target.outerWidth()); + } + + dropdown.attr('style', '').css({ + position : 'absolute', + top: position.top + target.outerHeight(), + left: left + }); + } + + return dropdown; + }, + + small : function () { + return matchMedia(Foundation.media_queries.small).matches && + !matchMedia(Foundation.media_queries.medium).matches; + }, + + 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 () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.interchange.js b/foundation-default-colours/static/js/foundation/foundation.interchange.js new file mode 100644 index 0000000..73b46a2 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.interchange.js @@ -0,0 +1,304 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.interchange = { + name : 'interchange', + + version : '5.0.0', + + cache : {}, + + images_loaded : false, + nodes_loaded : false, + + settings : { + load_attr : 'interchange', + + named_queries : { + 'default' : Foundation.media_queries.small, + small : Foundation.media_queries.small, + medium : Foundation.media_queries.medium, + large : Foundation.media_queries.large, + xlarge : Foundation.media_queries.xlarge, + xxlarge: Foundation.media_queries.xxlarge, + landscape : 'only screen and (orientation: landscape)', + portrait : 'only screen and (orientation: portrait)', + retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + + 'only screen and (min--moz-device-pixel-ratio: 2),' + + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + + 'only screen and (min-device-pixel-ratio: 2),' + + 'only screen and (min-resolution: 192dpi),' + + 'only screen and (min-resolution: 2dppx)' + }, + + directives : { + replace: function (el, path, trigger) { + // The trigger argument, if called within the directive, fires + // an event named after the directive on the element, passing + // any parameters along to the event that you pass to trigger. + // + // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c) + // + // This allows you to bind a callback like so: + // $('#interchangeContainer').on('replace', function (e, a, b, c) { + // console.log($(this).html(), a, b, c); + // }); + + if (/IMG/.test(el[0].nodeName)) { + var orig_path = el[0].src; + + if (new RegExp(path, 'i').test(orig_path)) return; + + el[0].src = path; + + return trigger(el[0].src); + } + var last_path = el.data('interchange-last-path'); + + if (last_path == path) return; + + return $.get(path, function (response) { + el.html(response); + el.data('interchange-last-path', path); + trigger(); + }); + + } + } + }, + + init : function (scope, method, options) { + Foundation.inherit(this, 'throttle'); + + this.data_attr = 'data-' + this.settings.load_attr; + + this.bindings(method, options); + this.load('images'); + this.load('nodes'); + }, + + events : function () { + var self = this; + + $(window) + .off('.interchange') + .on('resize.fndtn.interchange', self.throttle(function () { + self.resize.call(self); + }, 50)); + + return this; + }, + + resize : function () { + var cache = this.cache; + + if(!this.images_loaded || !this.nodes_loaded) { + setTimeout($.proxy(this.resize, this), 50); + return; + } + + for (var uuid in cache) { + if (cache.hasOwnProperty(uuid)) { + var passed = this.results(uuid, cache[uuid]); + + if (passed) { + this.settings.directives[passed + .scenario[1]](passed.el, passed.scenario[0], function () { + if (arguments[0] instanceof Array) { + var args = arguments[0]; + } else { + var args = Array.prototype.slice.call(arguments, 0); + } + + passed.el.trigger(passed.scenario[1], args); + }); + } + } + } + + }, + + results : function (uuid, scenarios) { + var count = scenarios.length; + + if (count > 0) { + var el = this.S('[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; + }, + + load : function (type, force_update) { + if (typeof this['cached_' + type] === 'undefined' || force_update) { + this['update_' + type](); + } + + return this['cached_' + type]; + }, + + update_images : function () { + var images = this.S('img[' + this.data_attr + ']'), + count = images.length, + loaded_count = 0, + data_attr = this.data_attr; + + this.cache = {}; + this.cached_images = []; + this.images_loaded = (count === 0); + + for (var i = count - 1; i >= 0; i--) { + loaded_count++; + if (images[i]) { + var str = images[i].getAttribute(data_attr) || ''; + + if (str.length > 0) { + this.cached_images.push(images[i]); + } + } + + if(loaded_count === count) { + this.images_loaded = true; + this.enhance('images'); + } + } + + return this; + }, + + update_nodes : function () { + var nodes = this.S('[' + this.data_attr + ']:not(img)'), + count = nodes.length, + loaded_count = 0, + data_attr = this.data_attr; + + this.cached_nodes = []; + // Set nodes_loaded to true if there are no nodes + // this.nodes_loaded = false; + this.nodes_loaded = (count === 0); + + + for (var i = count - 1; i >= 0; i--) { + loaded_count++; + var str = nodes[i].getAttribute(data_attr) || ''; + + if (str.length > 0) { + this.cached_nodes.push(nodes[i]); + } + + if(loaded_count === count) { + this.nodes_loaded = true; + this.enhance('nodes'); + } + } + + return this; + }, + + enhance : function (type) { + var count = this['cached_' + type].length; + + for (var i = count - 1; i >= 0; i--) { + this.object($(this['cached_' + type][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.load('images', true); + this.load('nodes', true); + } + + }; + +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.joyride.js b/foundation-default-colours/static/js/foundation/foundation.joyride.js new file mode 100644 index 0000000..f7140aa --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.joyride.js @@ -0,0 +1,839 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + var Modernizr = Modernizr || false; + + Foundation.libs.joyride = { + name : 'joyride', + + version : '5.0.0', + + defaults : { + expose : false, // turn on or off the expose feature + modal : true, // Whether to cover page with modal during the tour + tip_location : 'bottom', // 'top' or 'bottom' in relation to parent + nub_position : 'auto', // override on a per tooltip bases + scroll_speed : 1500, // Page scrolling speed in milliseconds, 0 = no scroll animation + scroll_animation : 'linear', // supports 'swing' and 'linear', extend with jQuery UI. + timer : 0, // 0 = no timer , all other numbers = timer in milliseconds + start_timer_on_click : true, // true or false - true requires clicking the first button start the timer + start_offset : 0, // the index of the tooltip you want to start on (index of the li) + next_button : true, // true or false to control whether a next button is used + tip_animation : 'fade', // 'pop' or 'fade' in each tip + pause_after : [], // array of indexes where to pause the tour after + exposed : [], // array of expose elements + tip_animation_fade_speed: 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition + cookie_monster : false, // true or false to control whether cookies are used + cookie_name : 'joyride', // Name the cookie you'll use + cookie_domain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com' + cookie_expires : 365, // set when you would like the cookie to expire. + tip_container : 'body', // Where will the tip be attached + tip_location_patterns : { + top: ['bottom'], + bottom: [], // bottom should not need to be repositioned + left: ['right', 'top', 'bottom'], + right: ['left', 'top', 'bottom'] + }, + post_ride_callback : function (){}, // A method to call once the tour closes (canceled or complete) + post_step_callback : function (){}, // A method to call after each step + pre_step_callback : function (){}, // A method to call before each step + pre_ride_callback : function (){}, // A method to call before the tour starts (passed index, tip, and cloned exposed element) + post_expose_callback : function (){}, // A method to call after an element has been exposed + template : { // HTML segments for tip layout + link : '<a href="#close" class="joyride-close-tip">×</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>', + expose_cover: '<div class="joyride-expose-cover"></div>' + }, + expose_add_class : '' // One or more space-separated class names to be added to exposed element + }, + + init : function (scope, method, options) { + Foundation.inherit(this, 'throttle delay'); + + this.settings = this.defaults; + + this.bindings(method, options) + }, + + events : function () { + var self = this; + + $(this.scope) + .off('.joyride') + .on('click.fndtn.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.fndtn.joyride', '.joyride-close-tip', function (e) { + e.preventDefault(); + this.end(); + }.bind(this)); + + $(window) + .off('.joyride') + .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)); + }, + + start : function () { + var self = this, + $this = $('[data-joyride]', this.scope), + integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'], + int_settings_count = integer_settings.length; + + if (!$this.length > 0) return; + + if (!this.settings.init) this.events(); + + this.settings = $this.data('joyride-init'); + + // non configureable settings + this.settings.$content_el = $this; + this.settings.$body = $(this.settings.tip_container); + this.settings.body_offset = $(this.settings.tip_container).position(); + this.settings.$tip_content = this.settings.$content_el.find('> li'); + this.settings.paused = false; + this.settings.attempts = 0; + + // can we create cookies? + if (typeof $.cookie !== 'function') { + this.settings.cookie_monster = false; + } + + // generate the tips and insert into dom. + if (!this.settings.cookie_monster || this.settings.cookie_monster && $.cookie(this.settings.cookie_name) === null) { + this.settings.$tip_content.each(function (index) { + var $this = $(this); + this.settings = $.extend({}, self.defaults, self.data_options($this)) + + // Make sure that settings parsed from data_options are integers where necessary + 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.start_timer_on_click && this.settings.timer > 0) { + this.show('init'); + this.startTimer(); + } else { + this.show('init'); + } + + } + }, + + resume : function () { + this.set_li(); + this.show(); + }, + + tip_template : function (opts) { + var $blank, content; + + opts.tip_class = opts.tip_class || ''; + + $blank = $(this.settings.template.tip).addClass(opts.tip_class); + content = $.trim($(opts.li).html()) + + this.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.start_timer_on_click && this.settings.timer > 0) || this.settings.timer === 0) { + txt = ''; + } else { + txt = $(this.settings.template.timer)[0].outerHTML; + } + return txt; + }, + + button_text : function (txt) { + if (this.settings.next_button) { + txt = $.trim(txt) || 'Next'; + txt = $(this.settings.template.button).append(txt)[0].outerHTML; + } 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.tip_container).append($tip_content); + }, + + show : function (init) { + var $timer = null; + + // are we paused? + if (this.settings.$li === undefined + || ($.inArray(this.settings.$li.index(), this.settings.pause_after) === -1)) { + + // don't go to the next li if the tour was paused + if (this.settings.paused) { + this.settings.paused = false; + } else { + this.set_li(init); + } + + this.settings.attempts = 0; + + if (this.settings.$li.length && this.settings.$target.length > 0) { + if (init) { //run when we first start + this.settings.pre_ride_callback(this.settings.$li.index(), this.settings.$next_tip); + if (this.settings.modal) { + this.show_modal(); + } + } + + this.settings.pre_step_callback(this.settings.$li.index(), this.settings.$next_tip); + + if (this.settings.modal && this.settings.expose) { + this.expose(); + } + + this.settings.tip_settings = $.extend({}, this.settings, this.data_options(this.settings.$li)); + + this.settings.timer = parseInt(this.settings.timer, 10); + + this.settings.tip_settings.tip_location_pattern = this.settings.tip_location_patterns[this.settings.tip_settings.tip_location]; + + // scroll 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.tip_animation)) { + + $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.tip_animation_fade_speed); + + } else { + this.settings.$next_tip.show(); + + } + + + } else if (/fade/i.test(this.settings.tip_animation)) { + + $timer.width(0); + + if (this.settings.timer > 0) { + + this.settings.$next_tip + .fadeIn(this.settings.tip_animation_fade_speed) + .show(); + + this.delay(function () { + $timer.animate({ + width: $timer.parent().width() + }, this.settings.timer, 'linear'); + }.bind(this), this.settings.tip_animation_fadeSpeed); + + } else { + this.settings.$next_tip.fadeIn(this.settings.tip_animation_fade_speed); + } + } + + this.settings.$current_tip = this.settings.$next_tip; + + // skip non-existant targets + } else if (this.settings.$li && this.settings.$target.length < 1) { + + this.show(); + + } else { + + this.end(); + + } + } else { + + this.settings.paused = true; + + } + + }, + + is_phone : function () { + return matchMedia(Foundation.media_queries.small).matches && + !matchMedia(Foundation.media_queries.medium).matches; + }, + + hide : function () { + if (this.settings.modal && this.settings.expose) { + this.un_expose(); + } + + if (!this.settings.modal) { + $('.joyride-modal-bg').hide(); + } + + // Prevent scroll bouncing...wait to remove from layout + this.settings.$current_tip.css('visibility', 'hidden'); + setTimeout($.proxy(function() { + this.hide(); + this.css('visibility', 'visible'); + }, this.settings.$current_tip), 0); + this.settings.post_step_callback(this.settings.$li.index(), + this.settings.$current_tip); + }, + + set_li : function (init) { + if (init) { + this.settings.$li = this.settings.$tip_content.eq(this.settings.start_offset); + this.set_next_tip(); + this.settings.$current_tip = this.settings.$next_tip; + } else { + this.settings.$li = this.settings.$li.next(); + this.set_next_tip(); + } + + this.set_target(); + }, + + set_next_tip : function () { + this.settings.$next_tip = $(".joyride-tip-guide").eq(this.settings.$li.index()); + this.settings.$next_tip.data('closed', ''); + }, + + set_target : function () { + var cl = this.settings.$li.attr('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.settings.$next_tip.outerHeight()); + + if (tipOffset > 0) { + $('html, body').animate({ + scrollTop: tipOffset + }, this.settings.scroll_speed, 'swing'); + } + }, + + paused : function () { + return ($.inArray((this.settings.$li.index() + 1), this.settings.pause_after) === -1); + }, + + restart : function () { + this.hide(); + this.settings.$li = undefined; + this.show('init'); + }, + + pos_default : function (init, 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($nub.outerWidth() / 2), + nub_height = Math.ceil($nub.outerHeight() / 2), + toggle = init || false; + + // tip must not be "display: none" to calculate position + if (toggle) { + this.settings.$next_tip.css('visibility', 'hidden'); + this.settings.$next_tip.show(); + } + + if (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.settings.$target.outerHeight()), + left: leftOffset}); + + this.nub_position($nub, this.settings.tip_settings.nub_position, '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.settings.$next_tip.outerHeight() - nub_height), + left: leftOffset}); + + this.nub_position($nub, this.settings.tip_settings.nub_position, 'bottom'); + + } else if (this.right()) { + + this.settings.$next_tip.css({ + top: this.settings.$target.offset().top, + left: (this.outerWidth(this.settings.$target) + this.settings.$target.offset().left + nub_width)}); + + this.nub_position($nub, this.settings.tip_settings.nub_position, 'left'); + + } else if (this.left()) { + + this.settings.$next_tip.css({ + top: this.settings.$target.offset().top, + left: (this.settings.$target.offset().left - this.outerWidth(this.settings.$next_tip) - nub_width)}); + + this.nub_position($nub, this.settings.tip_settings.nub_position, 'right'); + + } + + if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tip_settings.tip_location_pattern.length) { + + $nub.removeClass('bottom') + .removeClass('top') + .removeClass('right') + .removeClass('left'); + + this.settings.tip_settings.tip_location = this.settings.tip_settings.tip_location_pattern[this.settings.attempts]; + + this.settings.attempts++; + + this.pos_default(); + + } + + } else if (this.settings.$li.length) { + + this.pos_modal($nub); + + } + + if (toggle) { + this.settings.$next_tip.hide(); + this.settings.$next_tip.css('visibility', 'visible'); + } + + }, + + pos_phone : function (init) { + var tip_height = this.settings.$next_tip.outerHeight(), + tip_offset = this.settings.$next_tip.offset(), + target_height = this.settings.$target.outerHeight(), + $nub = $('.joyride-nub', this.settings.$next_tip), + nub_height = Math.ceil($nub.outerHeight() / 2), + toggle = init || false; + + $nub.removeClass('bottom') + .removeClass('top') + .removeClass('right') + .removeClass('left'); + + if (toggle) { + this.settings.$next_tip.css('visibility', 'hidden'); + this.settings.$next_tip.show(); + } + + if (!/body/i.test(this.settings.$target.selector)) { + + if (this.top()) { + + this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height}); + $nub.addClass('bottom'); + + } else { + + this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height}); + $nub.addClass('top'); + + } + + } else if (this.settings.$li.length) { + this.pos_modal($nub); + } + + if (toggle) { + this.settings.$next_tip.hide(); + this.settings.$next_tip.css('visibility', 'visible'); + } + }, + + pos_modal : function ($nub) { + this.center(); + $nub.hide(); + + this.show_modal(); + }, + + show_modal : function () { + if (!this.settings.$next_tip.data('closed')) { + var joyridemodalbg = $('.joyride-modal-bg'); + if (joyridemodalbg.length < 1) { + $('body').append(this.settings.template.modal).show(); + } + + if (/pop/i.test(this.settings.tip_animation)) { + joyridemodalbg.show(); + } else { + joyridemodalbg.fadeIn(this.settings.tip_animation_fade_speed); + } + } + }, + + expose : function () { + var expose, + exposeCover, + el, + origCSS, + origClasses, + randId = 'expose-'+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: el.outerWidth(true), + height: el.outerHeight(true) + }); + + exposeCover = $(this.settings.template.expose_cover); + + origCSS = { + zIndex: el.css('z-index'), + position: el.css('position') + }; + + origClasses = el.attr('class') == null ? '' : el.attr('class'); + + el.css('z-index',parseInt(expose.css('z-index'))+1); + + if (origCSS.position == 'static') { + el.css('position','relative'); + } + + el.data('expose-css',origCSS); + el.data('orig-class', origClasses); + el.attr('class', origClasses + ' ' + this.settings.expose_add_class); + + exposeCover.css({ + top: el.offset().top, + left: el.offset().left, + width: el.outerWidth(true), + height: el.outerHeight(true) + }); + + if (this.settings.modal) this.show_modal(); + + this.settings.$body.append(exposeCover); + expose.addClass(randId); + exposeCover.addClass(randId); + el.data('expose', randId); + this.settings.post_expose_callback(this.settings.$li.index(), this.settings.$next_tip, el); + this.add_exposed(el); + }, + + un_expose : function () { + var exposeId, + el, + expose , + origCSS, + origClasses, + clearAll = false; + + if (arguments.length > 0 && arguments[0] instanceof $) { + el = arguments[0]; + } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ + el = this.settings.$target; + } else { + return false; + } + + if(el.length < 1){ + if (window.console) { + console.error('element not valid', el); + } + return false; + } + + exposeId = el.data('expose'); + expose = $('.' + exposeId); + + if (arguments.length > 1) { + clearAll = arguments[1]; + } + + if (clearAll === true) { + $('.joyride-expose-wrapper,.joyride-expose-cover').remove(); + } else { + expose.remove(); + } + + origCSS = el.data('expose-css'); + + if (origCSS.zIndex == 'auto') { + el.css('z-index', ''); + } else { + el.css('z-index', origCSS.zIndex); + } + + if (origCSS.position != el.css('position')) { + if(origCSS.position == 'static') {// this is default, no need to set it. + el.css('position', ''); + } else { + el.css('position', origCSS.position); + } + } + + origClasses = el.data('orig-class'); + el.attr('class', origClasses); + el.removeData('orig-classes'); + + el.removeData('expose'); + el.removeData('expose-z-index'); + this.remove_exposed(el); + }, + + add_exposed: function(el){ + this.settings.exposed = this.settings.exposed || []; + if (el instanceof $ || typeof el === 'object') { + this.settings.exposed.push(el[0]); + } else if (typeof el == 'string') { + this.settings.exposed.push(el); + } + }, + + remove_exposed: function(el){ + var search, 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.settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()), + left : ((($w.width() - this.settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft()) + }); + + return true; + }, + + bottom : function () { + return /bottom/i.test(this.settings.tip_settings.tip_location); + }, + + top : function () { + return /top/i.test(this.settings.tip_settings.tip_location); + }, + + right : function () { + return /right/i.test(this.settings.tip_settings.tip_location); + }, + + left : function () { + return /left/i.test(this.settings.tip_settings.tip_location); + }, + + corners : function (el) { + var w = $(window), + window_half = w.height() / 2, + //using this to calculate since scroll may not have finished yet. + tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()), + right = w.width() + w.scrollLeft(), + offsetBottom = w.height() + tipOffset, + bottom = w.height() + w.scrollTop(), + top = w.scrollTop(); + + if (tipOffset < top) { + if (tipOffset < 0) { + top = 0; + } else { + top = tipOffset; + } + } + + if (offsetBottom > bottom) { + bottom = offsetBottom; + } + + return [ + el.offset().top < top, + right < el.offset().left + el.outerWidth(), + bottom < el.offset().top + el.outerHeight(), + w.scrollLeft() > el.offset().left + ]; + }, + + visible : function (hidden_corners) { + var i = hidden_corners.length; + + while (i--) { + if (hidden_corners[i]) return false; + } + + return true; + }, + + nub_position : function (nub, pos, def) { + if (pos === 'auto') { + nub.addClass(def); + } else { + nub.addClass(pos); + } + }, + + startTimer : function () { + if (this.settings.$li.length) { + this.settings.automate = setTimeout(function () { + this.hide(); + this.show(); + this.startTimer(); + }.bind(this), this.settings.timer); + } else { + clearTimeout(this.settings.automate); + } + }, + + end : function () { + if (this.settings.cookie_monster) { + $.cookie(this.settings.cookie_name, 'ridden', { expires: this.settings.cookie_expires, domain: this.settings.cookie_domain }); + } + + if (this.settings.timer > 0) { + clearTimeout(this.settings.automate); + } + + if (this.settings.modal && this.settings.expose) { + this.un_expose(); + } + + this.settings.$next_tip.data('closed', true); + + $('.joyride-modal-bg').hide(); + this.settings.$current_tip.hide(); + this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip); + this.settings.post_ride_callback(this.settings.$li.index(), this.settings.$current_tip); + $('.joyride-tip-guide').remove(); + }, + + off : function () { + $(this.scope).off('.joyride'); + $(window).off('.joyride'); + $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride'); + $('.joyride-tip-guide, .joyride-modal-bg').remove(); + clearTimeout(this.settings.automate); + this.settings = {}; + }, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.js b/foundation-default-colours/static/js/foundation/foundation.js new file mode 100644 index 0000000..c2d031f --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.js @@ -0,0 +1,416 @@ +/* + * 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 +*/ + +(function ($, window, document, undefined) { + 'use strict'; + + // Used to retrieve Foundation media queries from CSS. + if($('head').has('.foundation-mq-small').length === 0) { + $('head').append('<meta class="foundation-mq-small">'); + } + + if($('head').has('.foundation-mq-medium').length === 0) { + $('head').append('<meta class="foundation-mq-medium">'); + } + + if($('head').has('.foundation-mq-large').length === 0) { + $('head').append('<meta class="foundation-mq-large">'); + } + + if($('head').has('.foundation-mq-xlarge').length === 0) { + $('head').append('<meta class="foundation-mq-xlarge">'); + } + + if($('head').has('.foundation-mq-xxlarge').length === 0) { + $('head').append('<meta class="foundation-mq-xxlarge">'); + } + + // Embed FastClick (this should be removed later) + function FastClick(layer){'use strict';var oldOnClick,self=this;this.trackingClick=false;this.trackingClickStart=0;this.targetElement=null;this.touchStartX=0;this.touchStartY=0;this.lastTouchIdentifier=0;this.touchBoundary=10;this.layer=layer;if(!layer||!layer.nodeType){throw new TypeError('Layer must be a document node');}this.onClick=function(){return FastClick.prototype.onClick.apply(self,arguments)};this.onMouse=function(){return FastClick.prototype.onMouse.apply(self,arguments)};this.onTouchStart=function(){return FastClick.prototype.onTouchStart.apply(self,arguments)};this.onTouchMove=function(){return FastClick.prototype.onTouchMove.apply(self,arguments)};this.onTouchEnd=function(){return FastClick.prototype.onTouchEnd.apply(self,arguments)};this.onTouchCancel=function(){return FastClick.prototype.onTouchCancel.apply(self,arguments)};if(FastClick.notNeeded(layer)){return}if(this.deviceIsAndroid){layer.addEventListener('mouseover',this.onMouse,true);layer.addEventListener('mousedown',this.onMouse,true);layer.addEventListener('mouseup',this.onMouse,true)}layer.addEventListener('click',this.onClick,true);layer.addEventListener('touchstart',this.onTouchStart,false);layer.addEventListener('touchmove',this.onTouchMove,false);layer.addEventListener('touchend',this.onTouchEnd,false);layer.addEventListener('touchcancel',this.onTouchCancel,false);if(!Event.prototype.stopImmediatePropagation){layer.removeEventListener=function(type,callback,capture){var rmv=Node.prototype.removeEventListener;if(type==='click'){rmv.call(layer,type,callback.hijacked||callback,capture)}else{rmv.call(layer,type,callback,capture)}};layer.addEventListener=function(type,callback,capture){var adv=Node.prototype.addEventListener;if(type==='click'){adv.call(layer,type,callback.hijacked||(callback.hijacked=function(event){if(!event.propagationStopped){callback(event)}}),capture)}else{adv.call(layer,type,callback,capture)}}}if(typeof layer.onclick==='function'){oldOnClick=layer.onclick;layer.addEventListener('click',function(event){oldOnClick(event)},false);layer.onclick=null}}FastClick.prototype.deviceIsAndroid=navigator.userAgent.indexOf('Android')>0;FastClick.prototype.deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent);FastClick.prototype.deviceIsIOS4=FastClick.prototype.deviceIsIOS&&(/OS 4_\d(_\d)?/).test(navigator.userAgent);FastClick.prototype.deviceIsIOSWithBadTarget=FastClick.prototype.deviceIsIOS&&(/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent);FastClick.prototype.needsClick=function(target){'use strict';switch(target.nodeName.toLowerCase()){case'button':case'select':case'textarea':if(target.disabled){return true}break;case'input':if((this.deviceIsIOS&&target.type==='file')||target.disabled){return true}break;case'label':case'video':return true}return(/\bneedsclick\b/).test(target.className)};FastClick.prototype.needsFocus=function(target){'use strict';switch(target.nodeName.toLowerCase()){case'textarea':case'select':return true;case'input':switch(target.type){case'button':case'checkbox':case'file':case'image':case'radio':case'submit':return false}return!target.disabled&&!target.readOnly;default:return(/\bneedsfocus\b/).test(target.className)}};FastClick.prototype.sendClick=function(targetElement,event){'use strict';var clickEvent,touch;if(document.activeElement&&document.activeElement!==targetElement){document.activeElement.blur()}touch=event.changedTouches[0];clickEvent=document.createEvent('MouseEvents');clickEvent.initMouseEvent('click',true,true,window,1,touch.screenX,touch.screenY,touch.clientX,touch.clientY,false,false,false,false,0,null);clickEvent.forwardedTouchEvent=true;targetElement.dispatchEvent(clickEvent)};FastClick.prototype.focus=function(targetElement){'use strict';var length;if(this.deviceIsIOS&&targetElement.setSelectionRange){length=targetElement.value.length;targetElement.setSelectionRange(length,length)}else{targetElement.focus()}};FastClick.prototype.updateScrollParent=function(targetElement){'use strict';var scrollParent,parentElement;scrollParent=targetElement.fastClickScrollParent;if(!scrollParent||!scrollParent.contains(targetElement)){parentElement=targetElement;do{if(parentElement.scrollHeight>parentElement.offsetHeight){scrollParent=parentElement;targetElement.fastClickScrollParent=parentElement;break}parentElement=parentElement.parentElement}while(parentElement)}if(scrollParent){scrollParent.fastClickLastScrollTop=scrollParent.scrollTop}};FastClick.prototype.getTargetElementFromEventTarget=function(eventTarget){'use strict';if(eventTarget.nodeType===Node.TEXT_NODE){return eventTarget.parentNode}return eventTarget};FastClick.prototype.onTouchStart=function(event){'use strict';var targetElement,touch,selection;if(event.targetTouches.length>1){return true}targetElement=this.getTargetElementFromEventTarget(event.target);touch=event.targetTouches[0];if(this.deviceIsIOS){selection=window.getSelection();if(selection.rangeCount&&!selection.isCollapsed){return true}if(!this.deviceIsIOS4){if(touch.identifier===this.lastTouchIdentifier){event.preventDefault();return false}this.lastTouchIdentifier=touch.identifier;this.updateScrollParent(targetElement)}}this.trackingClick=true;this.trackingClickStart=event.timeStamp;this.targetElement=targetElement;this.touchStartX=touch.pageX;this.touchStartY=touch.pageY;if((event.timeStamp-this.lastClickTime)<200){event.preventDefault()}return true};FastClick.prototype.touchHasMoved=function(event){'use strict';var touch=event.changedTouches[0],boundary=this.touchBoundary;if(Math.abs(touch.pageX-this.touchStartX)>boundary||Math.abs(touch.pageY-this.touchStartY)>boundary){return true}return false};FastClick.prototype.onTouchMove=function(event){'use strict';if(!this.trackingClick){return true}if(this.targetElement!==this.getTargetElementFromEventTarget(event.target)||this.touchHasMoved(event)){this.trackingClick=false;this.targetElement=null}return true};FastClick.prototype.findControl=function(labelElement){'use strict';if(labelElement.control!==undefined){return labelElement.control}if(labelElement.htmlFor){return document.getElementById(labelElement.htmlFor)}return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea')};FastClick.prototype.onTouchEnd=function(event){'use strict';var forElement,trackingClickStart,targetTagName,scrollParent,touch,targetElement=this.targetElement;if(!this.trackingClick){return true}if((event.timeStamp-this.lastClickTime)<200){this.cancelNextClick=true;return true}this.lastClickTime=event.timeStamp;trackingClickStart=this.trackingClickStart;this.trackingClick=false;this.trackingClickStart=0;if(this.deviceIsIOSWithBadTarget){touch=event.changedTouches[0];targetElement=document.elementFromPoint(touch.pageX-window.pageXOffset,touch.pageY-window.pageYOffset)||targetElement;targetElement.fastClickScrollParent=this.targetElement.fastClickScrollParent}targetTagName=targetElement.tagName.toLowerCase();if(targetTagName==='label'){forElement=this.findControl(targetElement);if(forElement){this.focus(targetElement);if(this.deviceIsAndroid){return false}targetElement=forElement}}else if(this.needsFocus(targetElement)){if((event.timeStamp-trackingClickStart)>100||(this.deviceIsIOS&&window.top!==window&&targetTagName==='input')){this.targetElement=null;return false}this.focus(targetElement);if(!this.deviceIsIOS4||targetTagName!=='select'){this.targetElement=null;event.preventDefault()}return false}if(this.deviceIsIOS&&!this.deviceIsIOS4){scrollParent=targetElement.fastClickScrollParent;if(scrollParent&&scrollParent.fastClickLastScrollTop!==scrollParent.scrollTop){return true}}if(!this.needsClick(targetElement)){event.preventDefault();this.sendClick(targetElement,event)}return false};FastClick.prototype.onTouchCancel=function(){'use strict';this.trackingClick=false;this.targetElement=null};FastClick.prototype.onMouse=function(event){'use strict';if(!this.targetElement){return true}if(event.forwardedTouchEvent){return true}if(!event.cancelable){return true}if(!this.needsClick(this.targetElement)||this.cancelNextClick){if(event.stopImmediatePropagation){event.stopImmediatePropagation()}else{event.propagationStopped=true}event.stopPropagation();event.preventDefault();return false}return true};FastClick.prototype.onClick=function(event){'use strict';var permitted;if(this.trackingClick){this.targetElement=null;this.trackingClick=false;return true}if(event.target.type==='submit'&&event.detail===0){return true}permitted=this.onMouse(event);if(!permitted){this.targetElement=null}return permitted};FastClick.prototype.destroy=function(){'use strict';var layer=this.layer;if(this.deviceIsAndroid){layer.removeEventListener('mouseover',this.onMouse,true);layer.removeEventListener('mousedown',this.onMouse,true);layer.removeEventListener('mouseup',this.onMouse,true)}layer.removeEventListener('click',this.onClick,true);layer.removeEventListener('touchstart',this.onTouchStart,false);layer.removeEventListener('touchmove',this.onTouchMove,false);layer.removeEventListener('touchend',this.onTouchEnd,false);layer.removeEventListener('touchcancel',this.onTouchCancel,false)};FastClick.notNeeded=function(layer){'use strict';var metaViewport;if(typeof window.ontouchstart==='undefined'){return true}if((/Chrome\/[0-9]+/).test(navigator.userAgent)){if(FastClick.prototype.deviceIsAndroid){metaViewport=document.querySelector('meta[name=viewport]');if(metaViewport&&metaViewport.content.indexOf('user-scalable=no')!==-1){return true}}else{return true}}if(layer.style.msTouchAction==='none'){return true}return false};FastClick.attach=function(layer){'use strict';return new FastClick(layer)};if(typeof define!=='undefined'&&define.amd){define(function(){'use strict';return FastClick})}else if(typeof module!=='undefined'&&module.exports){module.exports=FastClick.attach;module.exports.FastClick=FastClick}else{window.FastClick=FastClick} + + + // Enable FastClick + if(typeof FastClick !== 'undefined') { + FastClick.attach(document.body); + } + + // private Fast Selector wrapper, + // returns jQuery object. Only use where + // getElementById is not available. + var S = function (selector, context) { + if (typeof selector === 'string') { + if (context) { + return $(context.querySelectorAll(selector)); + } + + return $(document.querySelectorAll(selector)); + } + + return $(selector, context); + }; + + /* + 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 )); + + /* + * jquery.requestAnimationFrame + * https://github.com/gnarf37/jquery-requestAnimationFrame + * Requires jQuery 1.8+ + * + * Copyright (c) 2012 Corey Frang + * Licensed under the MIT license. + */ + + (function( $ ) { + + // requestAnimationFrame polyfill adapted from Erik Möller + // fixes from Paul Irish and Tino Zijdel + // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating + + + var animating, + lastTime = 0, + vendors = ['webkit', 'moz'], + requestAnimationFrame = window.requestAnimationFrame, + cancelAnimationFrame = window.cancelAnimationFrame; + + for(; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { + requestAnimationFrame = window[ vendors[lastTime] + "RequestAnimationFrame" ]; + cancelAnimationFrame = cancelAnimationFrame || + window[ vendors[lastTime] + "CancelAnimationFrame" ] || + window[ vendors[lastTime] + "CancelRequestAnimationFrame" ]; + } + + function raf() { + if ( animating ) { + requestAnimationFrame( raf ); + jQuery.fx.tick(); + } + } + + if ( requestAnimationFrame ) { + // use rAF + window.requestAnimationFrame = requestAnimationFrame; + window.cancelAnimationFrame = cancelAnimationFrame; + jQuery.fx.timer = function( timer ) { + if ( timer() && jQuery.timers.push( timer ) && !animating ) { + animating = true; + raf(); + } + }; + + jQuery.fx.stop = function() { + animating = false; + }; + } else { + // polyfill + window.requestAnimationFrame = function( callback, element ) { + var currTime = new Date().getTime(), + timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ), + id = window.setTimeout( function() { + callback( currTime + timeToCall ); + }, timeToCall ); + lastTime = currTime + timeToCall; + return id; + }; + + window.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + + } + + }( jQuery )); + + + function removeQuotes (string) { + if (typeof string === 'string' || string instanceof String) { + string = string.replace(/^[\\/'"]+|(;\s?})+|[\\/'"]+$/g, ''); + } + + return string; + } + + window.Foundation = { + name : 'Foundation', + + version : '5.0.0', + + media_queries : { + small : S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), + medium : S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), + large : S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), + xlarge: S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), + xxlarge: S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '') + }, + + stylesheet : $('<style></style>').appendTo('head')[0].sheet, + + init : function (scope, libraries, method, options, response) { + var library_arr, + args = [scope, method, options, response], + responses = []; + + // check RTL + this.rtl = /rtl/i.test(S('html').attr('dir')); + + // set foundation global scope + this.scope = scope || this.scope; + + if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { + if (this.libs.hasOwnProperty(libraries)) { + responses.push(this.init_lib(libraries, args)); + } + } else { + for (var lib in this.libs) { + responses.push(this.init_lib(lib, libraries)); + } + } + + return scope; + }, + + init_lib : function (lib, args) { + if (this.libs.hasOwnProperty(lib)) { + this.patch(this.libs[lib]); + + if (args && args.hasOwnProperty(lib)) { + return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); + } + + return this.libs[lib].init.apply(this.libs[lib], args); + } + + return function () {}; + }, + + patch : function (lib) { + lib.scope = this.scope; + lib['data_options'] = this.lib_methods.data_options; + lib['bindings'] = this.lib_methods.bindings; + lib['S'] = S; + 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 : { + 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 + data_options : function (el) { + var opts = {}, ii, p, opts_arr, opts_len, + data_options = el.data('options'); + + if (typeof data_options === 'object') { + return data_options; + } + + opts_arr = (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); + }, + + // 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; + }, + + register_media : function(media, media_class) { + if(Foundation.media_queries[media] === undefined) { + $('head').append('<meta class="' + media_class + '">'); + Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); + } + }, + + addCustomRule : function(rule, media) { + if(media === undefined) { + Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); + } else { + var query = Foundation.media_queries[media]; + if(query !== undefined) { + Foundation.stylesheet.insertRule('@media ' + + Foundation.media_queries[media] + '{ ' + rule + ' }'); + } + } + }, + + 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); + } + }, + + bindings : function (method, options) { + var self = this, + should_bind_events = !S(this).data(this.name + '-init'); + + if (typeof method === 'string') { + return this[method].call(this); + } + + if (S(this.scope).is('[data-' + this.name +']')) { + S(this.scope).data(this.name + '-init', $.extend({}, this.settings, (options || method), this.data_options(S(this.scope)))); + + if (should_bind_events) { + this.events(this.scope); + } + + } else { + S('[data-' + this.name + ']', this.scope).each(function () { + var should_bind_events = !S(this).data(self.name + '-init'); + + S(this).data(self.name + '-init', $.extend({}, self.settings, (options || method), self.data_options(S(this)))); + + if (should_bind_events) { + self.events(this); + } + }); + } + } + } + }; + + $.fn.foundation = function () { + var args = Array.prototype.slice.call(arguments, 0); + + return this.each(function () { + Foundation.init.apply(Foundation, [this].concat(args)); + return this; + }); + }; + +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.magellan.js b/foundation-default-colours/static/js/foundation/foundation.magellan.js new file mode 100644 index 0000000..586741b --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.magellan.js @@ -0,0 +1,118 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.magellan = { + name : 'magellan', + + version : '5.0.0', + + settings : { + active_class: 'active', + threshold: 0 + }, + + init : function (scope, method, options) { + this.fixed_magellan = $("[data-magellan-expedition]"); + this.set_threshold(); + this.last_destination = $('[data-magellan-destination]').last(); + this.events(); + }, + + events : function () { + var self = this; + + $(this.scope) + .off('.magellan') + .on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) { + var $destination = $(this), + $expedition = $destination.closest('[data-magellan-expedition]'), + active_class = $expedition.attr('data-magellan-active-class') + || self.settings.active_class; + + $destination + .closest('[data-magellan-expedition]') + .find('[data-magellan-arrival]') + .not($destination) + .removeClass(active_class); + $destination.addClass(active_class); + }); + + this.fixed_magellan + .off('.magellan') + .on('update-position.fndtn.magellan', function() { + var $el = $(this); + }) + .trigger('update-position'); + + $(window) + .off('.magellan') + .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 - $destination.outerHeight(true) - 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'); + } + }); + }); + } + }, + + set_threshold : function () { + if (typeof this.settings.threshold !== 'number') { + this.settings.threshold = (this.fixed_magellan.length > 0) ? + this.fixed_magellan.outerHeight(true) : 0; + } + }, + + off : function () { + $(this.scope).off('.fndtn.magellan'); + $(window).off('.fndtn.magellan'); + }, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.offcanvas.js b/foundation-default-colours/static/js/foundation/foundation.offcanvas.js new file mode 100644 index 0000000..0ce07c0 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.offcanvas.js @@ -0,0 +1,37 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.offcanvas = { + name : 'offcanvas', + + version : '5.0.0', + + settings : {}, + + init : function (scope, method, options) { + this.events(); + }, + + events : function () { + $(this.scope).off('.offcanvas') + .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) { + e.preventDefault(); + $(this).closest('.off-canvas-wrap').toggleClass('move-right'); + }) + .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { + e.preventDefault(); + $(".off-canvas-wrap").removeClass("move-right"); + }) + .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) { + e.preventDefault(); + $(this).closest(".off-canvas-wrap").toggleClass("move-left"); + }) + .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { + e.preventDefault(); + $(".off-canvas-wrap").removeClass("move-left"); + }); + }, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.orbit.js b/foundation-default-colours/static/js/foundation/foundation.orbit.js new file mode 100644 index 0000000..c9dc14c --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.orbit.js @@ -0,0 +1,434 @@ +;(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.update_active_link = function(index) { + var link = $('a[data-orbit-link="'+slides_container.children().eq(index).attr('data-orbit-slide')+'"]'); + link.parents('ul').find('[data-orbit-link]').removeClass(settings.bullets_active_class); + link.addClass(settings.bullets_active_class); + }; + + self.build_markup = function() { + slides_container.wrap('<div class="'+settings.container_class+'"></div>'); + container = slides_container.parent(); + slides_container.addClass(settings.slides_container_class); + + if (settings.navigation_arrows) { + container.append($('<a href="#"><span></span></a>').addClass(settings.prev_class)); + container.append($('<a href="#"><span></span></a>').addClass(settings.next_class)); + } + + if (settings.timer) { + timer_container = $('<div>').addClass(settings.timer_container_class); + timer_container.append('<span>'); + timer_container.append($('<div>').addClass(settings.timer_progress_class)); + timer_container.addClass(settings.timer_paused_class); + container.append(timer_container); + } + + if (settings.slide_number) { + number_container = $('<div>').addClass(settings.slide_number_class); + number_container.append('<span></span> ' + settings.slide_number_text + ' <span></span>'); + container.append(number_container); + } + + if (settings.bullets) { + bullets_container = $('<ol>').addClass(settings.bullets_container_class); + container.append(bullets_container); + bullets_container.wrap('<div class="orbit-bullets-container"></div>'); + 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.update_active_link(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); + current.removeClass(settings.active_slide_class); + next.css('zIndex', 4).addClass(settings.active_slide_class); + + slides_container.trigger('before-slide-change.fndtn.orbit'); + settings.before_slide_change(); + self.update_active_link(next_idx); + + var callback = function() { + var unlock = function() { + idx = next_idx; + locked = false; + if (start_timer === true) {timer = self.create_timer(); timer.start();} + self.update_slide_number(idx); + slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]); + settings.after_slide_change(idx, slides.length); + }; + if (slides_container.height() != next.height() && settings.variable_height) { + slides_container.animate({'height': next.height()}, 250, 'linear', unlock); + } else { + unlock(); + } + }; + + if (slides.length === 1) {callback(); return false;} + + var start_animation = function() { + if (dir === 'next') {animate.next(current, next, callback);} + if (dir === 'prev') {animate.prev(current, next, callback);} + }; + + if (next.height() > slides_container.height() && settings.variable_height) { + slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); + } else { + start_animation(); + } + }; + + self.next = function(e) { + e.stopImmediatePropagation(); + e.preventDefault(); + self._goto(idx + 1); + }; + + self.prev = function(e) { + e.stopImmediatePropagation(); + e.preventDefault(); + self._goto(idx - 1); + }; + + self.link_custom = function(e) { + e.preventDefault(); + var link = $(this).attr('data-orbit-link'); + if ((typeof link === 'string') && (link = $.trim(link)) != "") { + var slide = container.find('[data-orbit-slide='+link+']'); + if (slide.index() != -1) {self._goto(slide.index());} + } + }; + + self.link_bullet = function(e) { + var index = $(this).attr('data-orbit-slide'); + if ((typeof index === 'string') && (index = $.trim(index)) != "") { + self._goto(parseInt(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(settings, slides_container); + if (settings.animation === 'slide') + animate = new SlideAnimation(settings, slides_container); + container.on('click', '.'+settings.next_class, self.next); + container.on('click', '.'+settings.prev_class, self.prev); + container.on('click', '[data-orbit-slide]', self.link_bullet); + container.on('click', self.toggle_timer); + if (settings.swipe) { + container.on('touchstart.fndtn.orbit', function(e) { + if (!e.touches) {e = e.originalEvent;} + var data = { + start_page_x: e.touches[0].pageX, + start_page_y: e.touches[0].pageY, + start_time: (new Date()).getTime(), + delta_x: 0, + is_scrolling: undefined + }; + container.data('swipe-transition', data); + e.stopPropagation(); + }) + .on('touchmove.fndtn.orbit', function(e) { + if (!e.touches) { e = e.originalEvent; } + // Ignore pinch/zoom events + if(e.touches.length > 1 || e.scale && e.scale !== 1) return; + + var data = container.data('swipe-transition'); + if (typeof data === 'undefined') {data = {};} + + data.delta_x = e.touches[0].pageX - data.start_page_x; + + if ( typeof data.is_scrolling === 'undefined') { + data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); + } + + if (!data.is_scrolling && !data.active) { + e.preventDefault(); + var direction = (data.delta_x < 0) ? (idx+1) : (idx-1); + data.active = true; + self._goto(direction); + } + }) + .on('touchend.fndtn.orbit', function(e) { + container.data('swipe-transition', {}); + e.stopPropagation(); + }) + } + container.on('mouseenter.fndtn.orbit', function(e) { + if (settings.timer && settings.pause_on_hover) { + self.stop_timer(); + } + }) + .on('mouseleave.fndtn.orbit', function(e) { + if (settings.timer && settings.resume_on_mouseout) { + timer.start(); + } + }); + + $(document).on('click', '[data-orbit-link]', self.link_custom); + $(window).on('resize', self.compute_dimensions); + $(window).on('load', self.compute_dimensions); + $(window).on('load', function(){ + container.prev('.preloader').css('display', 'none'); + }); + slides_container.trigger('ready.fndtn.orbit'); + }; + + self.init(); + }; + + var Timer = function(el, settings, callback) { + var self = this, + duration = settings.timer_speed, + progress = el.find('.'+settings.timer_progress_class), + start, + timeout, + left = -1; + + this.update_progress = function(w) { + var new_progress = progress.clone(); + new_progress.attr('style', ''); + new_progress.css('width', w+'%'); + progress.replaceWith(new_progress); + progress = new_progress; + }; + + this.restart = function() { + clearTimeout(timeout); + el.addClass(settings.timer_paused_class); + left = -1; + self.update_progress(0); + }; + + this.start = function() { + if (!el.hasClass(settings.timer_paused_class)) {return true;} + left = (left === -1) ? duration : left; + el.removeClass(settings.timer_paused_class); + start = new Date().getTime(); + progress.animate({'width': '100%'}, left, 'linear'); + timeout = setTimeout(function() { + self.restart(); + callback(); + }, left); + el.trigger('timer-started.fndtn.orbit') + }; + + this.stop = function() { + if (el.hasClass(settings.timer_paused_class)) {return true;} + clearTimeout(timeout); + el.addClass(settings.timer_paused_class); + var end = new Date().getTime(); + left = left - (end - start); + var w = 100 - ((left / duration) * 100); + self.update_progress(w); + el.trigger('timer-stopped.fndtn.orbit'); + }; + }; + + var SlideAnimation = function(settings, container) { + var duration = settings.animation_speed; + var is_rtl = ($('html[dir=rtl]').length === 1); + var margin = is_rtl ? 'marginRight' : 'marginLeft'; + var animMargin = {}; + animMargin[margin] = '0%'; + + this.next = function(current, next, callback) { + current.animate({marginLeft:'-100%'}, duration); + next.animate(animMargin, duration, function() { + current.css(margin, '100%'); + callback(); + }); + }; + + this.prev = function(current, prev, callback) { + current.animate({marginLeft:'100%'}, duration); + prev.css(margin, '-100%'); + prev.animate(animMargin, duration, function() { + current.css(margin, '100%'); + callback(); + }); + }; + }; + + var FadeAnimation = function(settings, container) { + var duration = settings.animation_speed; + var is_rtl = ($('html[dir=rtl]').length === 1); + var margin = is_rtl ? 'marginRight' : 'marginLeft'; + + this.next = function(current, next, callback) { + next.css({'margin':'0%', 'opacity':'0.01'}); + next.animate({'opacity':'1'}, duration, 'linear', function() { + current.css('margin', '100%'); + callback(); + }); + }; + + this.prev = function(current, prev, callback) { + prev.css({'margin':'0%', 'opacity':'0.01'}); + prev.animate({'opacity':'1'}, duration, 'linear', function() { + current.css('margin', '100%'); + callback(); + }); + }; + }; + + + Foundation.libs = Foundation.libs || {}; + + Foundation.libs.orbit = { + name: 'orbit', + + version: '5.0.0', + + 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, + slide_number_text: 'of', + container_class: 'orbit-container', + stack_on_small_class: 'orbit-stack-on-small', + next_class: 'orbit-next', + prev_class: 'orbit-prev', + timer_container_class: 'orbit-timer', + timer_paused_class: 'paused', + timer_progress_class: 'orbit-progress', + slides_container_class: 'orbit-slides-container', + 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, + swipe: true, + before_slide_change: noop, + after_slide_change: noop + }, + + init: function (scope, method, options) { + var self = this; + + 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)); + }); + } + }; + + +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.reveal.js b/foundation-default-colours/static/js/foundation/foundation.reveal.js new file mode 100644 index 0000000..a7521ec --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.reveal.js @@ -0,0 +1,347 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.reveal = { + name : 'reveal', + + version : '5.0.0', + + locked : false, + + settings : { + animation: 'fadeAndPop', + animation_speed: 250, + close_on_background_click: true, + close_on_esc: true, + dismiss_modal_class: 'close-reveal-modal', + bg_class: 'reveal-modal-bg', + 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, 'delay'); + + this.bindings(method, options); + }, + + events : function (scope) { + var self = this; + + $('[data-reveal-id]', this.scope) + .off('.reveal') + .on('click.fndtn.reveal', 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}); + } + } + }); + + $(this.scope) + .off('.reveal') + .on('click.fndtn.reveal', this.close_targets(), function (e) { + + e.preventDefault(); + + if (!self.locked) { + var settings = $('[data-reveal].open').data('reveal-init'), + bg_clicked = $(e.target)[0] === $('.' + settings.bg_class)[0]; + + if (bg_clicked && !settings.close_on_background_click) { + return; + } + + self.locked = true; + self.close.call(self, bg_clicked ? $('[data-reveal].open') : $(this).closest('[data-reveal]')); + } + }); + + if($('[data-reveal]', this.scope).length > 0) { + $(this.scope) + // .off('.reveal') + .on('open.fndtn.reveal', this.settings.open) + .on('opened.fndtn.reveal', this.settings.opened) + .on('opened.fndtn.reveal', this.open_video) + .on('close.fndtn.reveal', this.settings.close) + .on('closed.fndtn.reveal', this.settings.closed) + .on('closed.fndtn.reveal', this.close_video); + } else { + $(this.scope) + // .off('.reveal') + .on('open.fndtn.reveal', '[data-reveal]', this.settings.open) + .on('opened.fndtn.reveal', '[data-reveal]', this.settings.opened) + .on('opened.fndtn.reveal', '[data-reveal]', this.open_video) + .on('close.fndtn.reveal', '[data-reveal]', this.settings.close) + .on('closed.fndtn.reveal', '[data-reveal]', this.settings.closed) + .on('closed.fndtn.reveal', '[data-reveal]', this.close_video); + } + + $('body').on('keyup.fndtn.reveal', function ( event ) { + var open_modal = $('[data-reveal].open'), + settings = open_modal.data('reveal-init'); + if ( event.which === 27 && settings.close_on_esc) { // 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 = $('[data-reveal].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(); + } + + 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 = $('[data-reveal].open'); + + if (open_modals.length > 0) { + this.locked = true; + modal.trigger('close'); + this.toggle_bg(); + this.hide(open_modals, this.settings.css.close); + } + }, + + close_targets : function () { + var base = '.' + this.settings.dismiss_modal_class; + + if (this.settings.close_on_background_click) { + return base + ', .' + this.settings.bg_class; + } + + return base; + }, + + toggle_bg : function () { + if ($('.' + this.settings.bg_class).length === 0) { + this.settings.bg = $('<div />', {'class': this.settings.bg_class}) + .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 (el.parent('body').length === 0) { + var placeholder = el.wrap('<div style="display: none;" />').parent(); + el.on('closed.fndtn.reveal.wrapped', function() { + el.detach().appendTo(placeholder); + el.unwrap().unbind('closed.fndtn.reveal.wrapped'); + }); + + el.detach().appendTo('body'); + } + + 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.animation_speed, 'linear', function () { + this.locked = false; + el.trigger('opened'); + }.bind(this)) + .addClass('open'); + }.bind(this), this.settings.animation_speed / 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.animation_speed, 'linear', function () { + this.locked = false; + el.trigger('opened'); + }.bind(this)) + .addClass('open'); + }.bind(this), this.settings.animation_speed / 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.animation_speed / 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.animation_speed, 'linear', function () { + this.locked = false; + el.css(css).trigger('closed'); + }.bind(this)) + .removeClass('open'); + }.bind(this), this.settings.animation_speed / 2); + } + + if (/fade/i.test(this.settings.animation)) { + var end_css = {opacity: 0}; + + return this.delay(function () { + return el + .animate(end_css, this.settings.animation_speed, 'linear', function () { + this.locked = false; + el.css(css).trigger('closed'); + }.bind(this)) + .removeClass('open'); + }.bind(this), this.settings.animation_speed / 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.animation_speed / 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 () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.tab.js b/foundation-default-colours/static/js/foundation/foundation.tab.js new file mode 100644 index 0000000..f3dff80 --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.tab.js @@ -0,0 +1,37 @@ +/*jslint unparam: true, browser: true, indent: 2 */ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.tab = { + name : 'tab', + + version : '5.0.1', + + settings : { + active_class: 'active' + }, + + init : function (scope, method, options) { + this.bindings(method, options); + }, + + events : function () { + $(this.scope).off('.tab').on('click.fndtn.tab', '[data-tab] > dd > a', function (e) { + e.preventDefault(); + + var tab = $(this).parent(), + target = $('#' + this.href.split('#')[1]), + siblings = tab.siblings(), + settings = tab.closest('[data-tab]').data('tab-init'); + + tab.addClass(settings.active_class); + siblings.removeClass(settings.active_class); + target.siblings().removeClass(settings.active_class).end().addClass(settings.active_class); + }); + }, + + off : function () {}, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.tooltip.js b/foundation-default-colours/static/js/foundation/foundation.tooltip.js new file mode 100644 index 0000000..27429ee --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.tooltip.js @@ -0,0 +1,202 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.tooltip = { + name : 'tooltip', + + version : '5.0.0', + + settings : { + additional_inheritable_classes : [], + tooltip_class : '.tooltip', + append_to: 'body', + touch_close_text: 'Tap To Close', + disable_for_touch: false, + tip_template : function (selector, content) { + return '<span data-selector="' + selector + '" class="' + + Foundation.libs.tooltip.settings.tooltip_class.substring(1) + + '">' + content + '<span class="nub"></span></span>'; + } + }, + + cache : {}, + + init : function (scope, method, options) { + this.bindings(method, options); + }, + + events : function () { + var self = this; + + if (Modernizr.touch) { + $(this.scope) + .off('.tooltip') + .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.tooltip_class).hide(); + self.showOrCreateTip($(this)); + } + }) + .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', + this.settings.tooltip_class, function (e) { + e.preventDefault(); + $(this).fadeOut(150); + }); + } else { + $(this.scope) + .off('.tooltip') + .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); + } + }); + } + }, + + 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.tooltip_class); + } + + 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.tip_template(this.selector($target), $('<div></div>').html($target.attr('title')).html())), + classes = this.inheritable_classes($target); + + $tip.addClass(classes).appendTo(this.settings.append_to); + if (Modernizr.touch) { + $tip.append('<span class="tap-to-close">'+this.settings.touch_close_text+'</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 = nub.outerHeight(); + nubWidth = nub.outerHeight(); + + 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 + target.outerHeight() + 10), 'auto', 'auto', target.offset().left, width); + + if (this.small()) { + objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', 12.5, $(this.scope).width()); + tip.addClass('tip-override'); + objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); + } else { + var left = target.offset().left; + if (Foundation.rtl) { + left = target.offset().left + target.offset().width - tip.outerWidth(); + } + objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', left, width); + tip.removeClass('tip-override'); + if (classes && classes.indexOf('tip-top') > -1) { + objPos(tip, (target.offset().top - tip.outerHeight()), 'auto', 'auto', left, width) + .removeClass('tip-override'); + } else if (classes && classes.indexOf('tip-left') > -1) { + objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left - tip.outerWidth() - nubHeight), width) + .removeClass('tip-override'); + } else if (classes && classes.indexOf('tip-right') > -1) { + objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left + target.outerWidth() + nubHeight), width) + .removeClass('tip-override'); + } + } + + tip.css('visibility', 'visible').hide(); + }, + + small : function () { + return matchMedia(Foundation.media_queries.small).matches; + }, + + inheritable_classes : function (target) { + var inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'noradius'].concat(this.settings.additional_inheritable_classes), + classes = target.attr('class'), + filtered = classes ? $.map(classes.split(' '), function (el, i) { + if ($.inArray(el, inheritables) !== -1) { + return el; + } + }).join(' ') : ''; + + return $.trim(filtered); + }, + + 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.tooltip_class).each(function (i) { + $('[data-tooltip]').get(i).attr('title', $(this).text()); + }).remove(); + }, + + reflow : function () {} + }; +}(jQuery, this, this.document)); diff --git a/foundation-default-colours/static/js/foundation/foundation.topbar.js b/foundation-default-colours/static/js/foundation/foundation.topbar.js new file mode 100644 index 0000000..019471c --- /dev/null +++ b/foundation-default-colours/static/js/foundation/foundation.topbar.js @@ -0,0 +1,380 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.topbar = { + name : 'topbar', + + version: '5.0.1', + + settings : { + index : 0, + sticky_class : 'sticky', + custom_back_text: true, + back_text: 'Back', + is_hover: true, + mobile_show_parent_link: false, + scrolltop : true // jump to top when sticky nav menu toggle is clicked + }, + + init : function (section, method, options) { + Foundation.inherit(this, 'addCustomRule register_media throttle'); + var self = this; + + self.register_media('topbar', 'foundation-mq-topbar'); + + this.bindings(method, options); + + $('[data-topbar]', this.scope).each(function () { + var topbar = $(this), + settings = topbar.data('topbar-init'), + section = $('section', this), + titlebar = $('> ul', this).first(); + + topbar.data('index', 0); + + var topbarContainer = topbar.parent(); + if(topbarContainer.hasClass('fixed') || topbarContainer.hasClass(settings.sticky_class)) { + self.settings.sticky_class = settings.sticky_class; + self.settings.stick_topbar = topbar; + topbar.data('height', topbarContainer.outerHeight()); + topbar.data('stickyoffset', topbarContainer.offset().top); + } else { + topbar.data('height', topbar.outerHeight()); + } + + if (!settings.assembled) self.assemble(topbar); + + if (settings.is_hover) { + $('.has-dropdown', topbar).addClass('not-click'); + } else { + $('.has-dropdown', topbar).removeClass('not-click'); + } + + // Pad body when sticky (scrolled) or fixed. + self.addCustomRule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }'); + + if (topbarContainer.hasClass('fixed')) { + $('body').addClass('f-topbar-fixed'); + } + }); + + }, + + toggle: function (toggleEl) { + var self = this; + + if (toggleEl) { + var topbar = $(toggleEl).closest('[data-topbar]'); + } else { + var topbar = $('[data-topbar]'); + } + + var settings = topbar.data('topbar-init'); + + var section = $('section, .section', topbar); + + if (self.breakpoint()) { + if (!self.rtl) { + section.css({left: '0%'}); + $('>.name', section).css({left: '100%'}); + } else { + section.css({right: '0%'}); + $('>.name', section).css({right: '100%'}); + } + + $('li.moved', section).removeClass('moved'); + topbar.data('index', 0); + + topbar + .toggleClass('expanded') + .css('height', ''); + } + + if (settings.scrolltop) { + if (!topbar.hasClass('expanded')) { + if (topbar.hasClass('fixed')) { + topbar.parent().addClass('fixed'); + topbar.removeClass('fixed'); + $('body').addClass('f-topbar-fixed'); + } + } else if (topbar.parent().hasClass('fixed')) { + if (settings.scrolltop) { + topbar.parent().removeClass('fixed'); + topbar.addClass('fixed'); + $('body').removeClass('f-topbar-fixed'); + + window.scrollTo(0,0); + } else { + topbar.parent().removeClass('expanded'); + } + } + } else { + if(topbar.parent().hasClass(self.settings.sticky_class)) { + topbar.parent().addClass('fixed'); + } + + if(topbar.parent().hasClass('fixed')) { + if (!topbar.hasClass('expanded')) { + topbar.removeClass('fixed'); + topbar.parent().removeClass('expanded'); + self.update_sticky_positioning(); + } else { + topbar.addClass('fixed'); + topbar.parent().addClass('expanded'); + } + } + } + }, + + timer : null, + + events : function (bar) { + var self = this; + $(this.scope) + .off('.topbar') + .on('click.fndtn.topbar', '[data-topbar] .toggle-topbar', function (e) { + e.preventDefault(); + self.toggle(this); + }) + .on('click.fndtn.topbar', '[data-topbar] li.has-dropdown', function (e) { + var li = $(this), + target = $(e.target), + topbar = li.closest('[data-topbar]'), + settings = topbar.data('topbar-init'); + + if(target.data('revealId')) { + self.toggle(); + return; + } + + if (self.breakpoint()) return; + if (settings.is_hover && !Modernizr.touch) return; + + e.stopImmediatePropagation(); + + if (li.hasClass('hover')) { + li + .removeClass('hover') + .find('li') + .removeClass('hover'); + + li.parents('li.hover') + .removeClass('hover'); + } else { + li.addClass('hover'); + + if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { + e.preventDefault(); + } + } + }) + .on('click.fndtn.topbar', '[data-topbar] .has-dropdown>a', function (e) { + if (self.breakpoint()) { + + e.preventDefault(); + + var $this = $(this), + topbar = $this.closest('[data-topbar]'), + section = topbar.find('section, .section'), + dropdownHeight = $this.next('.dropdown').outerHeight(), + $selectedLi = $this.closest('li'); + + topbar.data('index', topbar.data('index') + 1); + $selectedLi.addClass('moved'); + + if (!self.rtl) { + section.css({left: -(100 * topbar.data('index')) + '%'}); + section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); + } else { + section.css({right: -(100 * topbar.data('index')) + '%'}); + section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); + } + + topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height')); + } + }); + + $(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function () { + self.resize.call(self); + }, 50)).trigger('resize'); + + $('body').off('.topbar').on('click.fndtn.topbar touchstart.fndtn.topbar', function (e) { + var parent = $(e.target).closest('li').closest('li.hover'); + + if (parent.length > 0) { + return; + } + + $('[data-topbar] li').removeClass('hover'); + }); + + // Go up a level on Click + $(this.scope).on('click.fndtn.topbar', '[data-topbar] .has-dropdown .back', function (e) { + e.preventDefault(); + + var $this = $(this), + topbar = $this.closest('[data-topbar]'), + section = topbar.find('section, .section'), + settings = topbar.data('topbar-init'), + $movedLi = $this.closest('li.moved'), + $previousLevelUl = $movedLi.parent(); + + topbar.data('index', topbar.data('index') - 1); + + if (!self.rtl) { + section.css({left: -(100 * topbar.data('index')) + '%'}); + section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); + } else { + section.css({right: -(100 * topbar.data('index')) + '%'}); + section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); + } + + if (topbar.data('index') === 0) { + topbar.css('height', ''); + } else { + topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height')); + } + + setTimeout(function () { + $movedLi.removeClass('moved'); + }, 300); + }); + }, + + resize : function () { + var self = this; + $('[data-topbar]').each(function () { + var topbar = $(this), + settings = topbar.data('topbar-init'); + + var stickyContainer = topbar.parent('.' + self.settings.sticky_class); + var stickyOffset; + + if (!self.breakpoint()) { + var doToggle = topbar.hasClass('expanded'); + topbar + .css('height', '') + .removeClass('expanded') + .find('li') + .removeClass('hover'); + + if(doToggle) { + self.toggle(topbar); + } + } + + if(stickyContainer.length > 0) { + if(stickyContainer.hasClass('fixed')) { + // Remove the fixed to allow for correct calculation of the offset. + stickyContainer.removeClass('fixed'); + + stickyOffset = stickyContainer.offset().top; + if($(document.body).hasClass('f-topbar-fixed')) { + stickyOffset -= topbar.data('height'); + } + + topbar.data('stickyoffset', stickyOffset); + stickyContainer.addClass('fixed'); + } else { + stickyOffset = stickyContainer.offset().top; + topbar.data('stickyoffset', stickyOffset); + } + } + + }); + }, + + breakpoint : function () { + return !matchMedia(Foundation.media_queries['topbar']).matches; + }, + + assemble : function (topbar) { + var self = this, + settings = topbar.data('topbar-init'), + section = $('section', topbar), + titlebar = $('> ul', topbar).first(); + + // Pull element out of the DOM for manipulation + section.detach(); + + $('.has-dropdown>a', section).each(function () { + var $link = $(this), + $dropdown = $link.siblings('.dropdown'), + url = $link.attr('href'); + + if (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 (settings.custom_back_text == true) { + $('h5>a', $titleLi).html(settings.back_text); + } else { + $('h5>a', $titleLi).html('« ' + $link.html()); + } + $dropdown.prepend($titleLi); + }); + + // Put element back in the DOM + section.appendTo(topbar); + + // check for sticky + this.sticky(); + + this.assembled(topbar); + }, + + assembled : function (topbar) { + topbar.data('topbar-init', $.extend({}, topbar.data('topbar-init'), {assembled: true})); + }, + + height : function (ul) { + var total = 0, + self = this; + + $('> li', ul).each(function () { total += $(this).outerHeight(true); }); + + return total; + }, + + sticky : function () { + var $window = $(window), + self = this; + + $(window).on('scroll', function() { + self.update_sticky_positioning(); + }); + }, + + update_sticky_positioning: function() { + var klass = '.' + this.settings.sticky_class; + var $window = $(window); + + if ($(klass).length > 0) { + var distance = this.settings.sticky_topbar.data('stickyoffset'); + if (!$(klass).hasClass('expanded')) { + if ($window.scrollTop() > (distance)) { + if (!$(klass).hasClass('fixed')) { + $(klass).addClass('fixed'); + $('body').addClass('f-topbar-fixed'); + } + } else if ($window.scrollTop() <= distance) { + if ($(klass).hasClass('fixed')) { + $(klass).removeClass('fixed'); + $('body').removeClass('f-topbar-fixed'); + } + } + } + } + }, + + off : function () { + $(this.scope).off('.fndtn.topbar'); + $(window).off('.fndtn.topbar'); + }, + + reflow : function () {} + }; +}(jQuery, this, this.document)); |