/**
* Sticky
* @author Jeffrey van der Veen
*/
var Sticky = function(options) {this.init(options);};
Sticky.prototype =
{
/**
* Constructor
* @param object options
* @return void
*/
init: function(options)
{
this.options = {
selector: '[data-sticky]'
};
$.extend(this.options, options);
this.window = $(window);
this.viewport_node = $('#viewport');
this.scroll_node = $();
this.page_node = $();
this.sticky_nodes = $();
this.sticky_support = false;
this.sticky_heights = [];
this.sticky_tops = [];
this.start();
},
/**
* Start
* @return void
*/
start: function()
{
this.scroll_node = this.viewport_node.css('overflow') == 'visible' ? this.window : this.viewport_node;
this.sticky_nodes = $(this.options.selector);
if (this.sticky_nodes.length) {
this.sticky_support = this.sticky_nodes.first().css('position').match('sticky');
if (this.sticky_support) {
this.initSticky();
} else {
this.page_node = this.sticky_nodes.first().parents('.page:first');
this.setStickyData();
this.setSticky();
this.setStickySize();
}
this.setEvents();
}
},
/**
* Set events
* @return void
*/
setEvents: function()
{
var _this = this;
if (this.sticky_support) {
this.window.resize(function() {
_this.initSticky();
});
} else {
this.scroll_node.scroll(function() {
_this.setSticky();
_this.setStickySize();
});
this.window.resize(function() {
_this.setStickyData();
_this.setSticky();
_this.setStickySize();
});
}
},
/**
* Init sticky
* @return void
*/
initSticky: function()
{
var sticky_heights = 0;
this.sticky_nodes.each(function() {
var sticky_node = $(this);
if (sticky_heights) {
sticky_node.css('top', sticky_heights);
}
sticky_heights += sticky_node.outerHeight();
});
},
/**
* Set sticky data
* @return void
*/
setStickyData: function()
{
var _this = this;
this.sticky_heights = [];
this.sticky_tops = [];
this.sticky_nodes.each(function() {
var sticky_node = $(this);
var is_sticky = sticky_node.hasClass('sticky');
if (is_sticky) {
var ghost_node = sticky_node.next('.ghost');
sticky_node.removeClass('sticky').css('top', '');
ghost_node.css('height', '');
}
if (sticky_node.is(':visible')) {
var sticky_height = sticky_node.outerHeight(true);
var sticky_top = sticky_node.offset().top;
} else {
var sticky_height = 0;
var sticky_top = 0;
}
_this.sticky_heights.push(sticky_height);
_this.sticky_tops.push(sticky_top);
});
},
/**
* Set sticky
* @return void
*/
setSticky: function()
{
var _this = this;
var scroll_top = this.scroll_node.scrollTop();
this.sticky_nodes.each(function(index) {
var sticky_node = $(this);
var sticky_height = _this.sticky_heights[index];
var sticky_top = _this.sticky_tops[index];
var sticky_nodes = sticky_node.prevAll('.sticky');
var sticky_heights = 0;
var ghost_node = sticky_node.next('.ghost');
var is_sticky = sticky_node.hasClass('sticky');
if (sticky_nodes.length) {
sticky_nodes.each(function() {
sticky_heights += $(this).outerHeight();
});
sticky_top -= sticky_heights;
}
if (!is_sticky && sticky_top <= scroll_top) {
sticky_node.addClass('sticky');
if (sticky_heights) {
sticky_node.css('top', sticky_heights);
}
if (!ghost_node.length) {
ghost_node = $('
', {class: 'ghost'});
sticky_node.after(ghost_node);
}
ghost_node.css('height', sticky_height);
} else if (is_sticky && sticky_top > scroll_top) {
sticky_node.removeClass('sticky').css('top', '');
ghost_node.css('height', '');
}
});
},
/**
* Set sticky size
* @return void
*/
setStickySize: function()
{
if (!this.viewport_node.is('body')) {
var scroll_width = this.scroll_node.outerWidth();
var page_width = this.page_node.outerWidth();
this.sticky_nodes.each(function() {
var sticky_node = $(this);
var is_sticky = sticky_node.hasClass('sticky');
sticky_node.css({'margin-left': '', width: ''});
if (is_sticky) {
var sticky_width = sticky_node.outerWidth();
if (sticky_width < page_width) {
sticky_node.css('margin-left', Math.round((page_width - sticky_width) / 2));
} else if (scroll_width > page_width) {
sticky_node.width(page_width);
}
}
});
}
}
};/**
* Anchor
* @author Jeffrey van der Veen
*/
var Anchor = function(options) {this.init(options);};
Anchor.prototype =
{
/**
* Constructor
* @param object options
* @return void
*/
init: function(options)
{
this.options = {
selector: 'a[href^="#"]'
};
$.extend(this.options, options);
this.window = $(window);
this.html_body_nodes = $('html, body');
this.viewport_node = $('#viewport');
this.scroll_node = $();
this.link_nodes = $();
this.scroll_top = 0;
this.start();
},
/**
* Start
* @return void
*/
start: function()
{
this.link_nodes = $(this.options.selector);
if (this.viewport_node.css('overflow') == 'visible') {
this.scroll_node = this.html_body_nodes;
} else {
this.scroll_node = this.viewport_node;
this.scroll_top = this.viewport_node.offset().top;
}
this.setEvents();
},
/**
* Set events
* @return void
*/
setEvents: function()
{
var _this = this;
this.link_nodes.each(function() {
var link_node = $(this);
var link_href = link_node.attr('href');
var anchor_name = link_href.substr(1);
var anchor_node = $('a[name="'+anchor_name+'"]:first');
if (anchor_node.length) {
var li_node = link_node.parents('li:first');
var sticky_nodes = anchor_node.parent().prevAll('[data-sticky]');
link_node.click(function(event) {
event.preventDefault();
var anchor_top = anchor_node.offset().top - _this.scroll_top;
if (_this.scroll_node === _this.viewport_node) {
anchor_top += _this.scroll_node.scrollTop();
} else {
anchor_top += _this.window.scrollTop();
}
if (li_node.length) {
var active_li_nodes = li_node.siblings('li.active');
active_li_nodes.removeClass('active');
li_node.addClass('active');
}
sticky_nodes.each(function() {
var sticky_node = $(this);
var sticky_height = sticky_node.outerHeight(true);
anchor_top -= sticky_height;
});
_this.scroll_node.animate({
scrollTop: anchor_top
},
500);
});
}
});
}
};/**
* Scale
* @author Jeffrey van der Veen
*/
var Scale = function(options) {this.init(options);};
Scale.prototype =
{
/**
* Constructor
* @param object options
* @return void
*/
init: function(options)
{
this.options = {
selector : '[class*="heading-"], [class*="text-"]',
min_font_size : 8
};
$.extend(this.options, options);
this.window = $(window);
this.scale_nodes = $();
this.start();
},
/**
* Start
* @return void
*/
start: function()
{
this.scale_nodes = $(this.options.selector).not(':has([style*="font-size"])');
this.setEvents();
this.scale();
},
/**
* Set events
* @return void
*/
setEvents: function()
{
var _this = this;
this.window.resize(function() {
_this.scale();
});
},
/**
* Scale
* @param object scale_node
* @param integer font_size
* @return void
*/
scale: function(scale_nodes, font_size)
{
var _this = this;
if (!scale_nodes) {
scale_nodes = this.scale_nodes;
}
scale_nodes.each(function() {
var scale_node = $(this);
var parent_node = scale_node.parent(':visible');
var parent_width = parent_node.width();
scale_node.css({display: 'inline-block', 'font-size': ''});
parent_node.css('max-width', '100%');
var _parent_width = parent_node.width();
if (_parent_width < parent_width) {
parent_width = _parent_width;
var scale_width = scale_node.outerWidth();
parent_node.css('max-width', '');
} else {
parent_node.css('max-width', '');
var scale_width = scale_node.outerWidth();
}
scale_node.css('display', '');
if (scale_width > parent_width) {
var _font_size = font_size ? font_size : parseInt(scale_node.css('font-size'));
var reduction = Math.round(_font_size / 10);
if (reduction < 1) {
reduction = 1;
}
_font_size -= reduction;
if (_font_size >= _this.options.min_font_size) {
scale_node.css({display: 'inline-block', 'font-size': _font_size});
scale_width = scale_node.outerWidth();
scale_node.css('display', '');
if (_font_size > _this.options.min_font_size && scale_width > parent_width) {
_this.scale(scale_node, _font_size);
}
}
}
});
}
};/**
* Menu
* @author Jeffrey van der Veen
*/
var Menu = function(options) {this.init(options);};
Menu.prototype =
{
/**
* Constructor
* @param object options
* @return void
*/
init: function(options)
{
this.options = {
selector : '.menu',
mobile : false,
mobile_size : 0,
aside : true,
init : true,
bottom : false
};
$.extend(this.options, options);
this.window = $(window);
this.viewport_node = $('#viewport');
this.scroll_node = $();
this.page_node = $();
this.block_node = $();
this.col_node = $();
this.menu_node = $();
this.handler_node = $();
this.listener_node = $();
this.outer_node = $();
this.inner_node = $();
this.item_nodes = $();
this.viewport_top = 0;
this.set_mobile = false;
this.mobile = false;
this.mobile_size = this.options.mobile_size;
this.position = null;
this.inner_width = 0;
this.transition = typeof document.body.style.transition !== 'undefined';
this.start();
},
/**
* Start
* @return void
*/
start: function()
{
var _this = this;
var selectors = this.options.selector.split(',');
this.scroll_node = this.viewport_node.css('overflow') == 'visible' ? this.window : this.viewport_node;
if (selectors.length > 1) {
for (var x in selectors) {
var options = $.extend({}, this.options);
options.selector = $.trim(selectors[x]);
new Menu(options);
}
} else {
var menu_nodes = $(this.options.selector);
menu_nodes.each(function(index) {
if (index) {
var options = $.extend({}, _this.options);
options.selector += ':eq('+index+')';
options.init = false;
new Menu(options);
} else {
_this.menu_node = $(this);
_this.page_node = _this.menu_node.parents('.page:first');
_this.block_node = _this.menu_node.parents('header, section, footer').first();
_this.col_node = _this.menu_node.parents('.col:first');
_this.handler_node = _this.menu_node.find('.handler:first');
_this.listener_node = _this.menu_node.find('.mobile-menu:first');
_this.outer_node = _this.listener_node.children('.outer:first');
_this.inner_node = _this.outer_node.children('.inner:first');
_this.item_nodes = _this.inner_node.find('li:has(ul)');
if (_this.viewport_node.css('overflow') != 'visible') {
_this.viewport_top = _this.viewport_node.offset().top;
}
if (!_this.options.mobile && !_this.options.mobile_size) {
_this.inner_node.addClass('nowrap');
_this.inner_width = _this.inner_node.outerWidth();
}
/*
if (!_this.options.aside) {
if (_this.block_node.data('sticky') !== undefined) {
_this.listener_node.attr('data-sticky', 'sticky');
}
}
*/
_this.setSubHeight();
if (_this.options.bottom) {
_this.setSubPosition();
}
_this.setMobile();
_this.setEvents();
_this.menu_node.addClass('init');
}
});
}
},
/**
* Set mobile
* @param boolean force
* @return void
*/
setMobile: function(force)
{
var window_width = this.window.width();
if (this.page_node.hasClass('aside-'+this.position) || this.listener_node.hasClass('active')) {
this.set_mobile = true;
this.page_node.removeClass('aside-'+this.position);
this.listener_node.removeClass('active');
} else if (!this.set_mobile) {
force = true;
}
if (!this.transition) {
this.page_node.add(this.listener_node).trigger('classchange');
}
if (!this.transition || force) {
if (!this.options.mobile && !this.options.mobile_size) {
if (window_width > this.mobile_size) {
if (this.mobile) {
this.menu_node.removeClass('mobile');
var outer_width = this.outer_node.width();
this.menu_node.addClass('mobile');
} else {
var outer_width = this.outer_node.width();
}
if (this.inner_width > outer_width) {
this.mobile_size = window_width;
}
}
}
if (this.options.mobile || this.mobile_size) {
if (this.options.mobile || window_width <= this.mobile_size) {
this.menu_node.addClass('mobile');
if (!this.position) {
this.setPosition();
}
this.mobile = true;
} else {
this.menu_node.removeClass('mobile');
this.mobile = false;
}
}
}
},
/**
* Set position
* @return void
*/
setPosition: function()
{
if (this.page_node.length && this.handler_node.length) {
var menu_display = this.menu_node.css('display');
if (this.options.aside) {
if (this.col_node.prev('.col').length) {
this.position = 'right';
} else if (this.col_node.next('.col').length) {
this.position = 'left';
} else {
var handler_width = this.handler_node.width();
var handler_left = this.handler_node.offset().left;
var handler_center = handler_left + (handler_width / 2);
var page_width = this.page_node.width();
var page_left = this.page_node.offset().left;
var page_center = page_left + (page_width / 2);
this.position = handler_center < page_center ? 'left' : 'right';
}
} else {
this.position = 'center';
}
if (menu_display !== 'table-cell') {
this.menu_node.addClass(this.position);
}
this.listener_node.addClass(this.position);
}
},
/**
* Set sub height
* @return void
*/
setSubHeight: function()
{
this.item_nodes.each(function() {
var item_node = $(this);
var list_node = item_node.children('ul:first');
list_node.addClass('measure nosize');
var list_height = list_node.outerHeight();
list_node.removeClass('measure nosize').css('height', list_height);
});
},
/**
* Set sub position
* @return void
*/
setSubPosition: function()
{
if (this.item_nodes.length) {
var col_bottom = this.col_node.offset().top + this.col_node.outerHeight();
var item_top = this.item_nodes.first().offset().top;
var list_top = col_bottom - item_top;
var spacer_height = list_top - this.item_nodes.first().outerHeight();
this.item_nodes.each(function() {
var item_node = $(this);
var spacer_node = item_node.children('.spacer:first');
var list_node = item_node.children('ul:first');
if (!spacer_node.length) {
spacer_node = $('
', {class: 'spacer'});
list_node.before(spacer_node);
}
spacer_node.css('height', spacer_height);
list_node.css('top', list_top);
});
}
},
/**
* Set events
* @return void
*/
setEvents: function()
{
var _this = this;
if (!this.options.mobile && this.options.init) {
this.window.resize(function(event, force) {
_this.setMobile();
});
}
if (this.options.bottom) {
this.window.resize(function(event, force) {
_this.setSubPosition();
});
}
this.page_node.on({
classchange: function() {
if (!_this.page_node.hasClass('aside-'+_this.position)) {
_this.listener_node.trigger('reset');
}
},
click: function() {
if (_this.page_node.hasClass('aside-'+_this.position)) {
_this.page_node.removeClass('aside-'+_this.position);
if (!_this.transition) {
_this.page_node.trigger('classchange');
}
}
}
});
if (this.transition) {
this.page_node.add(this.listener_node).on('transitionend', function() {
if ('target' in event && ($(event.target).is(_this.page_node) || $(event.target).is(_this.listener_node))) {
$(this).trigger('classchange');
if (_this.set_mobile) {
_this.setMobile(true);
}
_this.set_mobile = false;
}
});
}
this.handler_node.click(function(event) {
event.stopPropagation();
event.preventDefault();
if (_this.page_node.hasClass('aside-'+_this.position)) {
_this.page_node.removeClass('aside-'+_this.position);
_this.listener_node.removeClass('active');
if (!_this.options.aside && _this.block_node.css('position') === 'fixed') {
_this.outer_node.css({overflow: '', width: ''});
}
if (!_this.transition) {
_this.page_node.add(_this.listener_node).trigger('classchange');
}
} else {
_this.page_node.before(_this.listener_node);
if (_this.options.aside) {
var outer_width = _this.outer_node.outerWidth();
var inner_width = _this.inner_node.outerWidth();
var scrollbar_width = outer_width - inner_width;
outer_width += scrollbar_width;
_this.outer_node.width(outer_width);
if (_this.position == 'right') {
var viewport_width = _this.viewport_node.outerWidth();
var page_width = _this.page_node.outerWidth();
scrollbar_width = viewport_width - page_width;
_this.listener_node.css('right', scrollbar_width);
}
} else {
var block_height = _this.block_node.outerHeight();
var block_top = _this.block_node.offset().top - _this.viewport_top;
var block_bottom = block_height + block_top;
_this.listener_node.addClass('measure nosize');
var listener_height = _this.listener_node.outerHeight();
_this.listener_node.removeClass('measure nosize');
if (_this.block_node.css('position') === 'fixed') {
var window_height = _this.window.height();
var scroll_width = _this.scroll_node.outerWidth();
var page_width = _this.page_node.outerWidth();
if (scroll_width > page_width) {
_this.listener_node.width(page_width);
}
if (listener_height > (window_height - block_bottom)) {
listener_height = window_height - block_bottom;
}
_this.listener_node.css('position', 'fixed');
}
_this.listener_node.css({height: listener_height, top: block_bottom}).height();
}
_this.handler_node.addClass('active');
_this.page_node.addClass('aside-'+_this.position);
_this.listener_node.addClass('active');
}
});
this.listener_node.on({
classchange: function() {
if (_this.listener_node.hasClass('active')) {
if (!_this.options.aside && _this.block_node.css('position') === 'fixed') {
_this.outer_node.css({height: '100%', overflow: 'auto'});
var outer_width = _this.outer_node.outerWidth();
var inner_width = _this.inner_node.outerWidth();
var scrollbar_width = outer_width - inner_width;
outer_width += scrollbar_width;
_this.outer_node.width(outer_width);
}
} else {
_this.listener_node.trigger('reset');
}
},
reset: function() {
_this.handler_node.removeClass('active').after(_this.listener_node);
if (_this.options.aside) {
_this.outer_node.css('width', '');
} else {
_this.listener_node.css({position: '', top: '', width: ''});
}
}
});
this.item_nodes.on({
mouseenter: function() {
var item_node = $(this);
var list_node = item_node.children('ul:first');
var list_right = list_node.offset().left + list_node.outerWidth();
var window_width = _this.window.width();
if (list_right > window_width) {
var list_left = window_width - list_right;
list_node.css('left', list_left);
}
},
mouseleave: function() {
var item_node = $(this);
var list_node = item_node.children('ul:first');
list_node.css('left', '');
}
});
}
};/**
* Cover
* @author Jeffrey van der Veen
*/
var Cover = function(options) {this.init(options);};
Cover.prototype =
{
/**
* Constructor
* @param object options
* @return void
*/
init: function(options)
{
this.options = {
selector: '.cover'
};
$.extend(this.options, options);
this.window = $(window);
this.cover_node = $();
this.image_node = $();
this.start();
},
/**
* Start
* @return void
*/
start: function()
{
var _this = this;
var selectors = this.options.selector.split(',');
if (selectors.length > 1) {
for (var x in selectors) {
var options = $.extend({}, this.options);
options.selector = $.trim(selectors[x]);
new Cover(options);
}
} else {
var cover_nodes = $(this.options.selector);
cover_nodes.each(function(index) {
if (index) {
var options = $.extend({}, _this.options);
options.selector += ':eq('+index+')';
new Cover(options);
} else {
_this.cover_node = $(this);
_this.image_node = _this.cover_node.children('img:first');
_this.scaleImage();
_this.setEvents();
}
});
}
},
/**
* Scale image
* @return void
*/
scaleImage: function()
{
this.image_node.css({height: '', width: ''});
var _this = this;
var image_height = this.image_node.height();
if (image_height) {
var cover_height = this.cover_node.outerHeight();
if (image_height < cover_height) {
this.image_node.css({height: '101%', width: 'auto'});
}
} else {
this.image_node.on('load', function() {
_this.scaleImage();
});
}
},
/**
* Set events
* @return void
*/
setEvents: function()
{
var _this = this;
this.window.resize(function() {
_this.scaleImage();
});
}
};/**
* Popup
* @author Jeffrey van der Veen
*/
var Popup = function(options) {this.init(options);};
Popup.prototype =
{
/**
* Constructor
* @param object options
* @return void
*/
init: function(options)
{
this.options = {
selector: 'a[href][target="popup"]'
};
$.extend(this.options, options);
this.window = $(window);
this.body_node = $('body');
this.handler_nodes = $();
this.handler_node = $();
this.popup_node = $();
this.viewport_node = $();
this.coltrols_node = $();
this.close_node = $();
this.previous_node = $();
this.next_node = $();
this.counter_node = $();
this.handler_index = 0;
this.handler_count = 0;
this.start();
},
/**
* Start
* @return void
*/
start: function()
{
this.handler_nodes = $(this.options.selector);
this.handler_count = this.handler_nodes.length;
if (this.handler_count) {
this.popup_node = $('
', {class: 'popup', style: 'display: none;'});
this.viewport_node = $('
', {class: 'viewport'});
this.controls_node = $('
', {class: 'controls'});
this.close_node = $('
', {href: '#', class: 'close'});
this.controls_node.append(this.close_node);
if (this.handler_count > 1) {
this.previous_node = $('', {href: '#', class: 'previous'});
this.next_node = $('', {href: '#', class: 'next'});
this.counter_node = $('', {class: 'counter'});
this.controls_node.append(this.previous_node, this.next_node, this.counter_node);
}
this.popup_node.append(this.viewport_node, this.controls_node);
this.body_node.append(this.popup_node);
this.setEvents();
this.handler_nodes.addClass('loaded');
}
},
/**
* Set events
* @return void
*/
setEvents: function()
{
var _this = this;
this.window.keyup(function(event) {
var is_visible = _this.popup_node.is(':visible');
if (is_visible) {
var key_code = event.keyCode;
switch (key_code) {
case 27:
_this.close_node.trigger('click');
break;
case 37:
_this.previous_node.trigger('click');
break;
case 39:
_this.next_node.trigger('click');
}
}
});
this.popup_node.click(function() {
_this.popup_node.hide();
_this.viewport_node.empty();
});
this.close_node.click(function(event) {
event.preventDefault();
});
this.previous_node.click(function(event) {
event.preventDefault();
event.stopPropagation();
var previous_handler_index = _this.handler_index ? _this.handler_index - 1 : _this.handler_count - 1;
var previous_handler_node = _this.handler_nodes.filter(':eq('+previous_handler_index+')');
previous_handler_node.trigger('click');
});
this.next_node.click(function(event) {
event.preventDefault();
event.stopPropagation();
var next_handler_index = _this.handler_index < (_this.handler_count - 1) ? _this.handler_index + 1 : 0;
var next_handler_node = _this.handler_nodes.filter(':eq('+next_handler_index+')');
next_handler_node.trigger('click');
});
this.handler_nodes.click(function(event) {
event.preventDefault();
_this.handler_node = $(this);
_this.handler_index = _this.handler_nodes.index(_this.handler_node);
var href = _this.handler_node.attr('href');
var counter = _this.handler_index + 1;
var is_visible = _this.popup_node.is(':visible');
var matches = null;
_this.counter_node.text(counter+'/'+_this.handler_count);
if (href.match(/\.(bmp|gif|jpeg|jpg|png|svg|tif|tiff)$/i)) {
var content_node = $('
', {src: href});
} else if (href.match(/\.mp4$/i)) {
var content_node = $('