diff options
author | Shuaib Hanief <shuaib@hanief.net> | 2013-12-31 22:54:56 -0500 |
---|---|---|
committer | Shuaib Hanief <shuaib@hanief.net> | 2013-12-31 22:54:56 -0500 |
commit | 49f5657d936e352112fdcfa61473f5f38cda1c14 (patch) | |
tree | 75f480ed27af49c8dd1149344b967b5676d2460e /zurb-F5-basic/static/js/foundation/foundation.reveal.js | |
parent | eada362fff3da25eae0ca9283ac5fcb2f65e2e6a (diff) | |
download | pelican-themes-49f5657d936e352112fdcfa61473f5f38cda1c14.tar.gz |
add a theme based on the new Zurb Foundation 5 framework
Diffstat (limited to 'zurb-F5-basic/static/js/foundation/foundation.reveal.js')
-rw-r--r-- | zurb-F5-basic/static/js/foundation/foundation.reveal.js | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/zurb-F5-basic/static/js/foundation/foundation.reveal.js b/zurb-F5-basic/static/js/foundation/foundation.reveal.js new file mode 100644 index 0000000..a7521ec --- /dev/null +++ b/zurb-F5-basic/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)); |