/home/arranoyd/gazehome/wp-content/themes/uncode/library/js/init.js
/**
* Load utils - BEGIN
*/
/*
CSS Browser Selector 1.0
Originally written by Rafael Lima (http://rafael.adm.br)
http://rafael.adm.br/css_browser_selector
License: http://creativecommons.org/licenses/by/2.5/
Co-maintained by:
https://github.com/ridjohansen/css_browser_selector
https://github.com/wbruno/css_browser_selector
*/
"use strict";
window.requestAnimFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback, /* DOMElement */ element){
window.setTimeout(callback, 1000 / 60);
};
})();
window.requestTimeout = function(fn, delay) {
if( !window.requestAnimationFrame &&
!window.webkitRequestAnimationFrame &&
!(window.mozRequestAnimationFrame && window.mozCancelRequestAnimationFrame) && // Firefox 5 ships without cancel support
!window.oRequestAnimationFrame &&
!window.msRequestAnimationFrame)
return window.setTimeout(fn, delay);
var start = new Date().getTime(),
handle = new Object();
function loop(){
var current = new Date().getTime(),
delta = current - start;
delta >= delay ? fn.call() : handle.value = requestAnimFrame(loop);
};
handle.value = requestAnimFrame(loop);
return handle;
};
window.clearRequestTimeout = function(handle) {
if ( typeof handle !== 'undefined' ) {
window.cancelAnimationFrame ? window.cancelAnimationFrame(handle.value) :
window.webkitCancelAnimationFrame ? window.webkitCancelAnimationFrame(handle.value) :
window.webkitCancelRequestAnimationFrame ? window.webkitCancelRequestAnimationFrame(handle.value) : /* Support for legacy API */
window.mozCancelRequestAnimationFrame ? window.mozCancelRequestAnimationFrame(handle.value) :
window.oCancelRequestAnimationFrame ? window.oCancelRequestAnimationFrame(handle.value) :
window.msCancelRequestAnimationFrame ? window.msCancelRequestAnimationFrame(handle.value) :
clearTimeout(handle);
}
};
var uaInfo = {
ua: '',
is: function(t) {
return RegExp(t, "i").test(uaInfo.ua);
},
version: function(p, n) {
n = n.replace(".", "_");
var i = n.indexOf('_'),
ver = "";
while (i > 0) {
ver += " " + p + n.substring(0, i);
i = n.indexOf('_', i + 1);
}
ver += " " + p + n;
return ver;
},
getBrowser: function() {
var g = 'gecko',
w = 'webkit',
c = 'chrome',
f = 'firefox',
s = 'safari',
o = 'opera',
a = 'android',
bb = 'blackberry',
dv = 'device_',
ua = uaInfo.ua,
is = uaInfo.is;
return [
(!(/opera|webtv/i.test(ua)) && /msie\s(\d+)/.test(ua)) ? ('ie ie' + (/trident\/4\.0/.test(ua) ? '8' : RegExp.$1))
: is('edge\/') ? 'edge ie' + (/edge\/(\d+)\.(\d+)/.test(ua) ? RegExp.$1 + ' ie' + RegExp.$1 + '_' + RegExp.$2 : '') // IE Edge
: is('trident\/') ? 'ie ie'+ (/trident\/.+rv:(\d+)/i.test(ua) ? RegExp.$1 : '') //ie11+
: is('firefox/') ? g + " " + f + (/firefox\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua) ? ' ' + f + RegExp.$2 + ' ' + f + RegExp.$2 + "_" + RegExp.$4 : '')
: is('gecko/') ? g
: is('opera') ? o + (/version\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua) ? ' ' + o + RegExp.$2 + ' ' + o + RegExp.$2 + "_" + RegExp.$4 : (/opera(\s|\/)(\d+)\.(\d+)/.test(ua) ? ' ' + o + RegExp.$2 + " " + o + RegExp.$2 + "_" + RegExp.$3 : ''))
: is('konqueror') ? 'konqueror'
: is('blackberry') ? (bb + (/Version\/(\d+)(\.(\d+)+)/i.test(ua) ? " " + bb + RegExp.$1 + " " + bb + RegExp.$1 + RegExp.$2.replace('.', '_') : (/Blackberry ?(([0-9]+)([a-z]?))[\/|;]/gi.test(ua) ? ' ' + bb + RegExp.$2 + (RegExp.$3 ? ' ' + bb + RegExp.$2 + RegExp.$3 : '') : ''))) // blackberry
: is('android') ? (a + (/Version\/(\d+)(\.(\d+))+/i.test(ua) ? " " + a + RegExp.$1 + " " + a + RegExp.$1 + RegExp.$2.replace('.', '_') : '') + (/Android (.+); (.+) Build/i.test(ua) ? ' ' + dv + ((RegExp.$2).replace(/ /g, "_")).replace(/-/g, "_") : '')) //android
: is('chrome') ? w + ' ' + c + (/chrome\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua) ? ' ' + c + RegExp.$2 + ((RegExp.$4 > 0) ? ' ' + c + RegExp.$2 + "_" + RegExp.$4 : '') : '')
: is('iron') ? w + ' iron'
: is('applewebkit/') ? (w + ' ' + s + (/version\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua) ? ' ' + s + RegExp.$2 + " " + s + RegExp.$2 + RegExp.$3.replace('.', '_') : (/ Safari\/(\d+)/i.test(ua) ? ((RegExp.$1 == "419" || RegExp.$1 == "417" || RegExp.$1 == "416" || RegExp.$1 == "412") ? ' ' + s + '2_0' : RegExp.$1 == "312" ? ' ' + s + '1_3' : RegExp.$1 == "125" ? ' ' + s + '1_2' : RegExp.$1 == "85" ? ' ' + s + '1_0' : '') : ''))) //applewebkit
: is('mozilla/') ? g : ''
];
},
getPlatform : function() {
var wp = 'winphone',
a = 'android',
bb = 'blackberry',
dv = 'device_',
ua = uaInfo.ua,
version = uaInfo.version,
is = uaInfo.is;
return [
is('j2me') ? 'j2me'
:is('windows phone') ? (wp + (/Windows Phone (\d+)(\.(\d+))+/i.test(ua) ? " " + wp + RegExp.$1 + " " + wp + RegExp.$1 + RegExp.$2.replace('.', '_') : (/Windows Phone OS (\d+)(\.(\d+))+/i.test(ua) ? " " + wp + RegExp.$1 + " " + wp + RegExp.$1 + RegExp.$2.replace('.', '_') : ''))) // Windows Phone
:is('blackberry') ? (bb + (/Version\/(\d+)(\.(\d+)+)/i.test(ua) ? " " + bb + RegExp.$1 + " " + bb + RegExp.$1 + RegExp.$2.replace('.', '_') : (/Blackberry ?(([0-9]+)([a-z]?))[\/|;]/gi.test(ua) ? ' ' + bb + RegExp.$2 + (RegExp.$3 ? ' ' + bb + RegExp.$2 + RegExp.$3 : '') : ''))) // blackberry
:is('android') ? (a + (/Version\/(\d+)(\.(\d+))+/i.test(ua) ? " " + a + RegExp.$1 + " " + a + RegExp.$1 + RegExp.$2.replace('.', '_') : '') + (/Android (.+); (.+) Build/i.test(ua) ? ' ' + dv + ((RegExp.$2).replace(/ /g, "_")).replace(/-/g, "_") : '')) //android
:is('ipad|ipod|iphone') ? (
(/CPU( iPhone)? OS (\d+[_|\.]\d+([_|\.]\d+)*)/i.test(ua) ? 'ios' + version('ios', RegExp.$2) : '') + ' ' + (/(ip(ad|od|hone))/gi.test(ua) ? RegExp.$1 : "")) //'iphone'
//:is('ipod')?'ipod'
//:is('ipad')?'ipad'
:is('playbook') ? 'playbook'
:is('kindle|silk') ? 'kindle'
:is('playbook') ? 'playbook'
:is('mac') ? 'mac' + (/mac os x ((\d+)[.|_](\d+))/.test(ua) ? (' mac' + (RegExp.$2) + ' mac' + (RegExp.$1).replace('.', "_")) : '')
:is('win') ? 'win' + (is('windows nt 10.0') ? ' win10'
:is('windows nt 6.3') ? ' win8_1'
:is('windows nt 6.2') ? ' win8'
:is('windows nt 6.1') ? ' win7'
:is('windows nt 6.0') ? ' vista'
:is('windows nt 5.2') || is('windows nt 5.1') ? ' win_xp'
:is('windows nt 5.0') ? ' win_2k'
:is('windows nt 4.0') || is('WinNT4.0') ? ' win_nt' : '')
:is('freebsd') ? 'freebsd'
:is('x11|linux') ? 'linux' : ''
];
},
getMobile: function() {
var is = uaInfo.is;
return [
is("android|mobi|mobile|j2me|iphone|ipod|ipad|blackberry|playbook|kindle|silk") ? 'mobile' : ''
];
},
getIpadApp: function() {
var is = uaInfo.is;
return [
(is('ipad|iphone|ipod') && !is('safari')) ? 'ipad_app' : ''
];
},
getLang: function() {
var ua = uaInfo.ua;
return [/[; |\[](([a-z]{2})(\-[a-z]{2})?)[)|;|\]]/i.test(ua) ? ('lang_' + RegExp.$2).replace("-", "_") + (RegExp.$3 != '' ? (' ' + 'lang_' + RegExp.$1).replace("-", "_") : '') : ''];
}
}
var screenInfo = {
width: (window.outerWidth || document.documentElement.clientWidth) - 15,
height: window.outerHeight || document.documentElement.clientHeight,
screens: [0, 768, 980, 1200],
screenSize: function() {
screenInfo.width = (window.outerWidth || document.documentElement.clientWidth) - 15;
screenInfo.height = window.outerHeight || document.documentElement.clientHeight;
var screens = screenInfo.screens,
i = screens.length,
arr = [],
maxw,
minw;
while (i--) {
if (screenInfo.width >= screens[i]) {
if (i) {
arr.push("minw_" + screens[(i)]);
}
if (i <= 2) {
arr.push("maxw_" + (screens[(i) + 1] - 1));
}
break;
}
}
return arr;
},
getOrientation: function() {
return screenInfo.width < screenInfo.height ? ["orientation_portrait"] : ["orientation_landscape"];
},
getInfo: function() {
var arr = [];
arr = arr.concat(screenInfo.screenSize());
arr = arr.concat(screenInfo.getOrientation());
return arr;
},
getPixelRatio: function() {
var arr = [],
pixelRatio = window.devicePixelRatio ? window.devicePixelRatio : 1;
if (pixelRatio > 1) {
arr.push('retina_' + parseInt(pixelRatio) + 'x');
arr.push('hidpi');
} else {
arr.push('no-hidpi');
}
return arr;
}
}
var dataUriInfo = {
data: new Image(),
div: document.createElement("div"),
isIeLessThan9: false,
getImg: function() {
dataUriInfo.data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
dataUriInfo.div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
dataUriInfo.isIeLessThan9 = dataUriInfo.div.getElementsByTagName("i").length == 1;
return dataUriInfo.data;
},
checkSupport: function() {
if (dataUriInfo.data.width != 1 || dataUriInfo.data.height != 1 || dataUriInfo.isIeLessThan9) {
return ["no-datauri"];
} else {
return ["datauri"];
}
}
}
function css_browser_selector(u, ns) {
var html = document.documentElement,
b = []
ns = ns ? ns : "";
/* ua */
uaInfo.ua = u.toLowerCase();
var browser = uaInfo.getBrowser();
if (browser == 'gecko') browser = (!(window.ActiveXObject) && "ActiveXObject" in window) ? 'ie ie11' : browser;
var pattTouch = /no-touch/g;
if (pattTouch.test(html.className)) b = b.concat('no-touch');
else b = b.concat('touch');
var pattAdmin = /admin-mode/g;
if (pattAdmin.test(html.className)) b = b.concat('admin-mode');
b = b.concat(browser);
b = b.concat(uaInfo.getPlatform());
b = b.concat(uaInfo.getMobile());
b = b.concat(uaInfo.getIpadApp());
b = b.concat(uaInfo.getLang());
/* js */
b = b.concat(['js']);
/* pixel ratio */
b = b.concat(screenInfo.getPixelRatio());
/* screen */
b = b.concat(screenInfo.getInfo());
var updateScreen = function() {
html.className = html.className.replace(/ ?orientation_\w+/g, "").replace(/ [min|max|cl]+[w|h]_\d+/g, "");
html.className = html.className + ' ' + screenInfo.getInfo().join(' ');
}
window.addEventListener('resize', updateScreen);
window.addEventListener('orientationchange', updateScreen);
/* dataURI */
var data = dataUriInfo.getImg();
data.onload = data.onerror = function() {
html.className += ' ' + dataUriInfo.checkSupport().join(' ');
}
/* removendo itens invalidos do array */
b = b.filter(function(e) {
return e;
});
/* prefixo do namespace */
b[0] = ns ? ns + b[0] : b[0];
html.className = b.join(' ' + ns);
return html.className;
}
// define css_browser_selector_ns before loading this script to assign a namespace
var css_browser_selector_ns = css_browser_selector_ns || "";
// init
css_browser_selector(navigator.userAgent, css_browser_selector_ns);
/**
* skip-link-focus-fix.js
*
* Helps with accessibility for keyboard only users.
*
* Learn more: https://github.com/Automattic/_s/pull/136
*/
(function() {
var is_webkit = navigator.userAgent.toLowerCase().indexOf('webkit') > -1,
is_opera = navigator.userAgent.toLowerCase().indexOf('opera') > -1,
is_ie = navigator.userAgent.toLowerCase().indexOf('msie') > -1;
if ((is_webkit || is_opera || is_ie) && document.getElementById && window.addEventListener) {
window.addEventListener('hashchange', function() {
var id = location.hash.substring(1),
element;
if (!(/^[A-z0-9_-]+$/.test(id))) {
return;
}
element = document.getElementById(id);
if (element) {
if (!(/^(?:a|select|input|button|textarea)$/i.test(element.tagName))) {
element.tabIndex = -1;
}
element.focus();
}
}, false);
}
})();
// Polyfill for creating CustomEvents on IE9/10/11
// code pulled from:
// https://github.com/d4tocchini/customevent-polyfill
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill
try {
new CustomEvent("test");
} catch (e) {
var CustomEvent = function(event, params) {
var evt;
params = params || {
bubbles: false,
cancelable: false,
detail: undefined
};
evt = document.createEvent("CustomEvent");
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
};
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent; // expose definition to window
}
// Evento - v1.0.0
// by Erik Royall <erikroyalL@hotmail.com> (http://erikroyall.github.io)
// Dual licensed under MIT and GPL
// Array.prototype.indexOf shim
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
Array.prototype.indexOf || (Array.prototype.indexOf = function(n) {
"use strict";
if (null == this) throw new TypeError;
var t, e, o = Object(this),
r = o.length >>> 0;
if (0 === r) return -1;
if (t = 0, arguments.length > 1 && (t = Number(arguments[1]), t != t ? t = 0 : 0 != t && 1 / 0 != t && t != -1 / 0 && (t = (t > 0 || -1) * Math.floor(Math.abs(t)))), t >= r) return -1;
for (e = t >= 0 ? t : Math.max(r - Math.abs(t), 0); r > e; e++)
if (e in o && o[e] === n) return e;
return -1
});
var evento = function(n) {
var t, e, o, r = n,
i = r.document,
f = {};
return t = function() {
return "function" == typeof i.addEventListener ? function(n, t, e) {
n.addEventListener(t, e, !1), f[n] = f[n] || {}, f[n][t] = f[n][t] || [], f[n][t].push(e)
} : "function" == typeof i.attachEvent ? function(n, t, e) {
n.attachEvent(t, e), f[n] = f[n] || {}, f[n][t] = f[n][t] || [], f[n][t].push(e)
} : function(n, t, e) {
n["on" + t] = e, f[n] = f[n] || {}, f[n][t] = f[n][t] || [], f[n][t].push(e)
}
}(), e = function() {
return "function" == typeof i.removeEventListener ? function(n, t, e) {
n.removeEventListener(t, e, !1), Helio.each(f[n][t], function(o) {
o === e && (f[n] = f[n] || {}, f[n][t] = f[n][t] || [], f[n][t][f[n][t].indexOf(o)] = void 0)
})
} : "function" == typeof i.detachEvent ? function(n, t, e) {
n.detachEvent(t, e), Helio.each(f[n][t], function(o) {
o === e && (f[n] = f[n] || {}, f[n][t] = f[n][t] || [], f[n][t][f[n][t].indexOf(o)] = void 0)
})
} : function(n, t, e) {
n["on" + t] = void 0, Helio.each(f[n][t], function(o) {
o === e && (f[n] = f[n] || {}, f[n][t] = f[n][t] || [], f[n][t][f[n][t].indexOf(o)] = void 0)
})
}
}(), o = function(n, t) {
f[n] = f[n] || {}, f[n][t] = f[n][t] || [];
for (var e = 0, o = f[n][t].length; o > e; e += 1) f[n][t][e]()
}, {
add: t,
remove: e,
trigger: o,
_handlers: f
}
}(this);
/*
* OKVideo by OKFocus v2.3.2
* http://okfoc.us
*
* Copyright 2014, OKFocus
* Licensed under the MIT license.
*
*/
var player, OKEvents, options, videoWidth, videoHeight, YTplayers, youtubePlayers = new Array();
// youtube player ready
function onYouTubeIframeAPIReady() {
YTplayers = new Array();
jQuery('.no-touch .uncode-video-container.video').each(function() {
var playerY;
if (jQuery(this).attr('data-provider') == 'youtube') {
var id = jQuery(this).attr('data-id');
options = jQuery(window).data('okoptions-' + id);
options.time = jQuery(this).attr('data-t');
playerY = new YT.Player('okplayer-' + id, {
videoId: options.video ? options.video.id : null,
playerVars: {
'autohide': 1,
'autoplay': 0, //options.autoplay,
'disablekb': options.keyControls,
'cc_load_policy': options.captions,
'controls': options.controls,
'enablejsapi': 1,
'fs': 0,
'modestbranding': 1,
'origin': window.location.origin || (window.location.protocol + '//' + window.location.hostname),
'iv_load_policy': options.annotations,
'loop': options.loop,
'showinfo': 0,
'rel': 0,
'wmode': 'opaque',
'hd': options.hd,
'mute': 1
},
events: {
'onReady': OKEvents.yt.ready,
'onStateChange': OKEvents.yt.onStateChange,
'onError': OKEvents.yt.error
}
});
YTplayers[id] = playerY;
playerY.videoId = id;
}
});
}
// vimeo player ready
function vimeoPlayerReady(id) {
options = jQuery(window).data('okoptions-' + id);
var jIframe = options.jobject,
iframe = jIframe[0];
jIframe.attr('src', jIframe.data('src'));
var playerV = $f(iframe);
// hide player until Vimeo hides controls...
playerV.addEvent('ready', function(e) {
OKEvents.v.onReady(iframe);
var carouselContainer = jQuery(iframe).closest('.owl-carousel');
if (carouselContainer.length) {
UNCODE.owlPlayVideo(carouselContainer);
}
// "Do not try to add listeners or call functions before receiving this event."
if (OKEvents.utils.isMobile()) {
// mobile devices cannot listen for play event
OKEvents.v.onPlay(playerV);
} else {
playerV.addEvent('play', OKEvents.v.onPlay(playerV));
playerV.addEvent('pause', OKEvents.v.onPause);
playerV.addEvent('finish', OKEvents.v.onFinish);
}
if (options.time != null) {
playerV.api('seekTo', (options.time).replace('t=', ''));
}
playerV.api('play');
jQuery(iframe).css({
visibility: 'visible',
opacity: 1
});
jQuery(iframe).closest('.uncode-video-container').css('opacity', '1');
jQuery(iframe).closest('#page-header').addClass('video-started');
jQuery(iframe).closest('.background-wrapper').find('.block-bg-blend-mode.not-ie').css('opacity', '1');
});
}
OKEvents = {
yt: {
ready: function(event) {
var id = event.target.videoId;
youtubePlayers[id] = event.target;
event.target.setVolume(options.volume);
if (options.autoplay === 1) {
if (options.playlist.list) {
player.loadPlaylist(options.playlist.list, options.playlist.index, options.playlist.startSeconds, options.playlist.suggestedQuality);
} else {
var inCarousel = jQuery('#okplayer-' + id).closest('.owl-item');
if (!inCarousel.length || (inCarousel.length && inCarousel.hasClass('active'))) {
if (options.time != null) {
event.target.seekTo(parseInt(options.time));
}
event.target.playVideo();
} else {
event.target.pauseVideo();
}
}
}
OKEvents.utils.isFunction(options.onReady) && options.onReady(event.target);
},
onStateChange: function(event) {
var id = event.target.videoId;
switch (event.data) {
case -1:
OKEvents.utils.isFunction(options.unstarted) && options.unstarted();
break;
case 0:
OKEvents.utils.isFunction(options.onFinished) && options.onFinished();
options.loop && event.target.playVideo();
break;
case 1:
OKEvents.utils.isFunction(options.onPlay) && options.onPlay();
setTimeout(function() {
UNCODE.initVideoComponent(document.body, '.uncode-video-container.video, .uncode-video-container.self-video');
jQuery('#okplayer-' + id).closest('.uncode-video-container').css('opacity', '1');
jQuery('#okplayer-' + id).closest('#page-header').addClass('video-started');
jQuery('#okplayer-' + id).closest('.background-wrapper').find('.block-bg-blend-mode.not-ie').css('opacity', '1');
}, 300);
break;
case 2:
OKEvents.utils.isFunction(options.onPause) && options.onPause();
break;
case 3:
OKEvents.utils.isFunction(options.buffering) && options.buffering();
break;
case 5:
OKEvents.utils.isFunction(options.cued) && options.cued();
break;
default:
throw "OKVideo: received invalid data from YT player.";
}
},
error: function(event) {
throw event;
}
},
v: {
onReady: function(target) {
OKEvents.utils.isFunction(options.onReady) && options.onReady(target);
},
onPlay: function(player) {
if (!OKEvents.utils.isMobile()) player.api('setVolume', options.volume);
OKEvents.utils.isFunction(options.onPlay) && options.onPlay();
jQuery(player.element).closest('.uncode-video-container').css('opacity', '1');
jQuery(player.element).closest('#page-header').addClass('video-started');
jQuery(player.element).closest('.background-wrapper').find('.block-bg-blend-mode.not-ie').css('opacity', '1');
},
onPause: function() {
OKEvents.utils.isFunction(options.onPause) && options.onPause();
},
onFinish: function() {
OKEvents.utils.isFunction(options.onFinish) && options.onFinish();
}
},
utils: {
isFunction: function(func) {
if (typeof func === 'function') {
return true;
} else {
return false;
}
},
isMobile: function() {
if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/)) {
return true;
} else {
return false;
}
}
}
};
// DOM class helper
(function(window) {
'use strict';
// class helper functions from bonzo https://github.com/ded/bonzo
function classReg(className) {
return new RegExp("(^|\\s+)" + className + "(\\s+|$)");
}
// classList support for class management
// altho to be fair, the api sucks because it won't accept multiple classes at once
var hasClass, addClass, removeClass;
if ('classList' in document.documentElement) {
hasClass = function(elem, c) {
if ( elem !== null && typeof elem.classList !== 'undefined' ) return elem.classList.contains(c);
};
addClass = function(elem, c) {
if ( elem !== null && typeof elem.classList !== 'undefined' ) elem.classList.add(c);
};
removeClass = function(elem, c) {
if ( elem !== null && typeof elem.classList !== 'undefined' ) elem.classList.remove(c);
};
} else {
hasClass = function(elem, c) {
if (elem !== null) return classReg(c).test(elem.className);
};
addClass = function(elem, c) {
if (!hasClass(elem, c)) {
if (elem !== null) elem.className = elem.className + ' ' + c;
}
};
removeClass = function(elem, c) {
if (elem !== null) elem.className = elem.className.replace(classReg(c), ' ');
};
}
function toggleClass(elem, c) {
var fn = hasClass(elem, c) ? removeClass : addClass;
fn(elem, c);
}
var classie = {
// full names
hasClass: hasClass,
addClass: addClass,
removeClass: removeClass,
toggleClass: toggleClass,
// short names
has: hasClass,
add: addClass,
remove: removeClass,
toggle: toggleClass
};
// transport
if (typeof define === 'function' && define.amd) {
// AMD
define(classie);
} else {
// browser global
window.classie = classie;
}
window.wrap = function(wrapper, elms) {
if (!elms.length) {
elms = [elms];
}
for (var i = elms.length - 1; i >= 0; i--) {
var child = (i > 0) ? wrapper.cloneNode(true) : wrapper;
var el = elms[i];
var parent = el.parentNode;
var sibling = el.nextSibling;
child.appendChild(el);
if (sibling) {
parent.insertBefore(child, sibling);
} else {
parent.appendChild(child);
}
}
};
window.wrapAll = function(wrapper, nodes) {
var parent = nodes[0].parentNode;
var previousSibling = nodes[0].previousSibling;
for (var i = 0; nodes.length - i; wrapper.firstChild === nodes[0] && i++) {
wrapper.appendChild(nodes[i]);
}
var nextSibling = previousSibling ? previousSibling.nextSibling : parent.firstChild;
parent.insertBefore(wrapper, nextSibling);
return wrapper;
};
})(window);
/* From Modernizr */
function whichTransitionEvent() {
var t;
var el = document.createElement('fakeelement');
var transitions = {
'transition': 'transitionend',
'OTransition': 'oTransitionEnd',
'MozTransition': 'transitionend',
'WebkitTransition': 'webkitTransitionEnd'
}
for (t in transitions) {
if (el.style[t] !== undefined) {
return transitions[t];
}
}
}
function whichAnimationEvent() {
var t;
var el = document.createElement('fakeelement');
var animations = {
'animation': 'animationend',
'OAnimation': 'oAnimationEnd',
'MozAnimation': 'animationend',
'WebkitAnimation': 'webkitAnimationEnd'
}
for (t in animations) {
if (el.style[t] !== undefined) {
return animations[t];
}
}
}
/**
* Load utils - END
*/
/**
* Start main js
*/
(function(window, undefined) {
'use strict';
// Init variables
var bodyTop,
scrollbarWidth = false,
noScroll = false,
boxEvent = new CustomEvent('boxResized'),
menuClose = new CustomEvent('menuClose'),
menuOpen = new CustomEvent('menuOpen'),
bodyBorder = 0,
adminBarHeight = 0,
boxWidth = 0,
boxLeft = 0,
parallaxRows,
parallaxCols,
parallaxHeaders,
kenburnsHeaders,
kenburnsRows,
kenburnsCols,
backwashHeaders,
backwashRows,
backwashCols,
visibleRows,
headerWithOpacity,
speedDivider = SiteParameters.parallax_factor,
adminBar,
pageHeader,
headerVideo,
masthead,
mastheadMobile,
mastheadMobilePaddingTop = 0,
maincontainer,
menuwrapper,
menuhide,
menusticky,
menuHeight = 0,
menuMobileHeight = 0,
mainmenu = new Array(),
secmenu = new Array(),
secmenuHeight = 0,
transmenuHeight = 0,
header,
transmenuel,
logo,
logoel,
logolink,
logoMinScale,
lastScrollValue = 0,
wwidth = window.innerWidth || document.documentElement.clientWidth,
wheight = window.innerHeight || document.documentElement.clientHeight,
boxWrapper,
docheight = 0,
isMobile = classie.hasClass(document.documentElement, 'touch') ? true : false,
isIE = classie.hasClass(document.documentElement, 'ie') || classie.hasClass(document.documentElement, 'opera12') ? true : false,
isFF = classie.hasClass(document.documentElement, 'firefox') ? true : false,
isFullPage,
isFullPageSnap,
isFrontEndEditor,
transitionEvent = whichTransitionEvent(),
animationEvent = whichAnimationEvent(),
footerScroller = false,
mediaQuery = 959,
mediaQueryMobile = 569,
menuOpened = false,
overlayOpened = false,
menuMobileTriggerEvent = new CustomEvent('menuMobileTrigged'),
resizeTimer_,
resizeTimer,
hidingTimer,
isSplitMenu = false,
mainNavMenu,
mainNavWrapper,
isMobileTransparent = false,
isMobileParallaxAllowed = SiteParameters.mobile_parallax_allowed,
loadedFonts = new Array(),
already_font = false,
scrollRowHeight_fix = window.pageYOffset,
checkVisible = function( elm ) {
var rect = elm.getBoundingClientRect();
var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);
return !(rect.bottom < 0 || rect.top - viewHeight >= 0);
},
initBox = function() {
var bodyBorderDiv = document.querySelectorAll('.body-borders .top-border');
if (bodyBorderDiv.length) {
bodyBorder = outerHeight(bodyBorderDiv[0]);
} else bodyBorder = 0;
UNCODE.isRTL = classie.hasClass(document.body, 'rtl') ? true : false,
UNCODE.bodyBorder = bodyBorder;
UNCODE.isFrontEndEditor = classie.hasClass(document.body, 'compose-mode') && classie.hasClass(document.body, 'vc_editor');
UNCODE.isFullPage = !UNCODE.isFrontEndEditor && classie.hasClass(document.body, 'uncode-fullpage-slide') && !( UNCODE.isMobile && classie.hasClass(document.body, 'uncode-fp-mobile-disable') && window.innerWidth < 570 );
UNCODE.isFullPageSnap = !UNCODE.isFrontEndEditor && classie.hasClass(document.body, 'uncode-scroll-snap');
if (bodyBorder != 0) {
if ( !UNCODE.isFullPage ) {
document.documentElement.style.paddingTop = bodyBorder + 'px';
}
wheight = (window.innerHeight || document.documentElement.clientHeight) - (bodyBorder * 2);
}
if (!isMobile && !scrollbarWidth) {
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
var dombody = document.body;
if (dombody != null) {
dombody.appendChild(scrollDiv);
// Get the scrollbar width
scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
// Delete the DIV
dombody.removeChild(scrollDiv);
}
}
if (!isMobile) {
forEachElement('.box-container', function(el, i) {
if (!classie.hasClass(el, 'limit-width')) {
var elWidth = outerWidth(el),
newWidth = 12 * Math.ceil((wwidth - scrollbarWidth) / 12);
boxWidth = newWidth - (bodyBorder * 2);
boxLeft = (wwidth - boxWidth - scrollbarWidth) / 2;
el.style.width = boxWidth + 'px';
if ( UNCODE.isRTL )
el.style.marginRight = boxLeft + 'px';
else
el.style.marginLeft = boxLeft + 'px';
if (mainmenu != undefined && mainmenu[0] != undefined) {
mainmenu[0].style.width = boxWidth + 'px';
}
}
});
}
if (classie.hasClass(document.body, 'menu-mobile-transparent')) isMobileTransparent = true;
if (!isMobileTransparent) {
if (wwidth > mediaQuery && classie.hasClass(document.body, 'menu-force-opacity')) classie.removeClass(document.body, 'menu-force-opacity');
if (wwidth < mediaQuery && !classie.hasClass(document.body, 'menu-force-opacity')) classie.addClass(document.body, 'menu-force-opacity');
}
},
fixMenuHeight = function() {
if (!classie.hasClass(document.body, 'vmenu')) noScroll = true;
menuwrapper = document.querySelectorAll(".menu-wrapper");
masthead = document.getElementById("masthead");
if (classie.hasClass(document.body, 'hmenu-center-split')) {
mastheadMobile = new Array(document.getElementById("logo-container-mobile"), document.getElementById("main-logo").parentNode);
} else mastheadMobile = document.getElementById("logo-container-mobile");
menuhide = document.querySelector('#masthead .menu-hide, .main-header .menu-hide, #masthead .menu-hide-vertical');
menusticky = document.querySelectorAll('.menu-sticky, .menu-sticky-vertical');
transmenuel = document.querySelectorAll('.menu-transparent:not(.vmenu-container)');
var menuItemsButton = document.querySelectorAll('.menu-item-button .menu-btn-table');
logo = document.querySelector('#main-logo');
if (logo != undefined) logolink = (logo.firstElementChild || logo.firstChild);
if (logolink != undefined) logoMinScale = logolink.getAttribute("data-minheight");
logoel = document.querySelectorAll('.menu-shrink .logo-container');
mainmenu = document.querySelectorAll('.vmenu .vmenu-container, .menu-primary .menu-container');
if (classie.hasClass(document.body, 'hmenu-center')) {
var mainmenucenter = document.querySelectorAll('.hmenu-center .menu-container-mobile');
var first_array = Array.prototype.slice.call(mainmenu);
var second_array = Array.prototype.slice.call(mainmenucenter);
mainmenu = first_array.concat(second_array);
}
secmenu = document.querySelectorAll('.menu-secondary');
calculateMenuHeight(true);
for (var k = 0; k < menuItemsButton.length; k++) {
var a_item = menuItemsButton[k].parentNode,
buttonHeight = outerHeight(menuItemsButton[k]);
a_item.style.height = buttonHeight + 'px';
}
if (classie.hasClass(document.body, 'hmenu-center-split')) {
mainNavMenu = document.querySelector('#masthead .navbar-main .menu-primary-inner');
mainNavWrapper = document.querySelector('#masthead > .menu-container');
isSplitMenu = true;
}
fixMenu();
},
calculateMenuHeight = function(first) {
menuHeight = transmenuHeight = secmenuHeight = 0;
if (mastheadMobile != null) {
if (mastheadMobile.length === 2) {
if (wwidth > mediaQuery) {
UNCODE.menuMobileHeight = outerHeight(mastheadMobile[1]);
mastheadMobilePaddingTop = parseFloat(getComputedStyle(mastheadMobile[1]).paddingTop);
} else {
UNCODE.menuMobileHeight = outerHeight(mastheadMobile[0]);
mastheadMobilePaddingTop = parseFloat(getComputedStyle(mastheadMobile[0]).paddingTop);
}
} else {
UNCODE.menuMobileHeight = outerHeight(mastheadMobile);
mastheadMobilePaddingTop = parseFloat(getComputedStyle(mastheadMobile).paddingTop);
}
}
if (wwidth > mediaQuery) {
for (var i = 0; i < mainmenu.length; i++) {
if (classie.hasClass(document.body, 'hmenu-center') && i === 1) continue;
if (!classie.hasClass(masthead, 'masthead-vertical')) {
menuHeight = menuHeight + outerHeight(mainmenu[i]);
} else menuHeight = 0;
if (isIE && first) {
getDivChildren(mainmenu[i], '.menu-horizontal-inner', function(innerMenu, i) {
innerMenu.style.height = menuHeight + 'px';
});
}
if (classie.hasClass(mainmenu[i].parentNode, 'menu-transparent')) {
transmenuHeight += menuHeight;
}
}
for (var j = 0; j < secmenu.length; j++) {
secmenuHeight += outerHeight(secmenu[j]);
}
menuHeight += secmenuHeight;
} else {
menuHeight = UNCODE.menuMobileHeight;
if (isMobileTransparent) {
for (var i = 0; i < mainmenu.length; i++) {
if (classie.hasClass(mainmenu[i].parentNode, 'menu-transparent')) {
transmenuHeight += menuHeight;
}
}
}
var search_box = document.querySelectorAll('.search-icon .drop-menu');
for (var i = 0; i < search_box.length; i++) {
search_box[i].removeAttribute('style');
}
}
if (classie.hasClass(document.documentElement, 'admin-mode')) {
adminBar = document.getElementById("wpadminbar");
if (wwidth > 600) {
if (adminBar != null) adminBarHeight = outerHeight(adminBar);
else {
if (wwidth > 782) adminBarHeight = 32;
else adminBarHeight = 46;
}
} else adminBarHeight = 0;
}
UNCODE.adminBarHeight = adminBarHeight;
UNCODE.menuHeight = menuHeight;
if ( UNCODE.isFullPage && ! UNCODE.isFrontEndEditor ) {
if ( UNCODE.adminBarHeight > 0 )
document.body.style.marginTop = ( ( UNCODE.adminBarHeight + UNCODE.bodyBorder ) * -1 ) + 'px';
document.body.style.paddingTop = ( UNCODE.adminBarHeight + UNCODE.bodyBorder ) + 'px';
} else {
document.body.style.marginTop = 0;
document.body.style.paddingTop = 0;
}
if (masthead != undefined) {
//masthead.parentNode.style.height = menuHeight + 'px';
if (classie.hasClass(masthead, 'menu-transparent')) {
if (wwidth > mediaQuery) masthead.parentNode.style.height = '0px';
}
}
if (typeof menuhide == 'object' && menuhide != null && mainmenu[0] != undefined) {
var sticky_element = (typeof mainmenu.item === 'undefined' ? ((wwidth > mediaQuery) ? mainmenu[0] : mainmenu[1]) : mainmenu[0]);
if (sticky_element.style.top != '') {
sticky_element.style.top = UNCODE.bodyBorder + 'px'
}
}
},
centerSplitMenu = function() {
if (wwidth > mediaQuery && mainNavMenu) {
if (mainNavMenu.style.left == '') {
mainNavMenu.style.left = '0px';
var logoPos = logo.parentNode.getBoundingClientRect();
mainNavMenu.style.left = (wwidth / 2) - (logoPos.left + (logoPos.width / 2) ) + 'px';
mainNavWrapper.style.opacity = '1';
}
mainNavWrapper.style.opacity = '1';
}
},
initHeader = function() {
UNCODE.adaptive();
headerHeight('.header-wrapper');
parallaxHeaders = document.querySelectorAll('.header-parallax > .header-bg-wrapper');
header = document.querySelectorAll('.header-wrapper.header-uncode-block, .header-wrapper.header-revslider, .header-wrapper.header-layerslider, .header-basic .header-wrapper, .header-uncode-block > .row-container:first-child > .row > .row-inner > .col-lg-12 > .uncol, .header-uncode-block .uncode-slider .owl-carousel > .row-container:first-child .column_child .uncoltable');
headerWithOpacity = document.querySelectorAll('.header-scroll-opacity');
pageHeader = document.getElementById("page-header");
if ( typeof pageHeader === 'object' && pageHeader !== null ) {
headerVideo = pageHeader.querySelectorAll('.uncode-video-container');
kenburnsHeaders = pageHeader.querySelectorAll('.with-kburns > .header-bg-wrapper');
backwashHeaders = pageHeader.querySelectorAll('.with-zoomout > .header-bg-wrapper');
if ( headerVideo.length ) {
classie.addClass(pageHeader, 'has-video');
}
}
if (pageHeader != undefined) {
var backs = pageHeader.querySelectorAll('.header-bg'),
backsCarousel = pageHeader.querySelectorAll('.header-uncode-block .background-inner'),
uri_pattern = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig;
if (backs.length == 0 && backsCarousel.length == 0) {
pageHeader.setAttribute('data-imgready', 'true');
} else {
if (backsCarousel.length) {
for (var j = 0; j < backsCarousel.length; j++) {
if (j == 0) {
if (!!backsCarousel[j].style.backgroundImage && backsCarousel[j].style.backgroundImage !== void 0) {
var url = (backsCarousel[j].style.backgroundImage).match(uri_pattern),
image = new Image();
image.onload = function() {
pageHeader.setAttribute('data-imgready', 'true');
};
image.src = url[0];
} else {
pageHeader.setAttribute('data-imgready', 'true');
}
}
}
} else {
for (var i = 0; i < backs.length; i++) {
if (i == 0) {
if (!!backs[i].style.backgroundImage && backs[i].style.backgroundImage !== void 0) {
var url = (backs[i].style.backgroundImage).match(uri_pattern),
image = new Image();
image.onload = function() {
pageHeader.setAttribute('data-imgready', 'true');
};
image.src = url[0];
} else {
pageHeader.setAttribute('data-imgready', 'true');
}
}
}
}
}
}
if (masthead != undefined && !classie.hasClass(masthead, 'masthead-vertical')) {
if (header.length) {
masthead.parentNode.style.height = menuHeight + 'px';
if (menuwrapper[0] != undefined) classie.addClass(menuwrapper[0], 'with-header');
for (var j = 0; j < header.length; j++) {
var headerel = header[j],
closestStyle = getClosest(headerel, 'style-light');
if (closestStyle != null && classie.hasClass(closestStyle, 'style-light')) {
switchColorsMenu(0, 'light');
} else if (getClosest(headerel, 'style-dark') != null) {
switchColorsMenu(0, 'dark');
}
else {
if (masthead.style.opacity !== 1) masthead.style.opacity = 1;
}
if (classie.hasClass(masthead, 'menu-transparent')) {
if (isMobileTransparent || wwidth > mediaQuery) {
masthead.parentNode.style.height = '0px';
if (classie.hasClass(masthead, 'menu-add-padding')) {
var headerBlock = getClosest(headerel, 'header-uncode-block');
if (headerBlock != null) {
var innerRows = headerel.querySelectorAll('.column_parent > .uncol > .uncoltable > .uncell > .uncont, .uncode-slider .column_child > .uncol > .uncoltable > .uncell > .uncont');
for (var k = 0; k < innerRows.length; k++) {
if (innerRows[k] != undefined) {
if (wwidth > mediaQuery) innerRows[k].style.paddingTop = transmenuHeight + 'px';
else innerRows[k].style.paddingTop = (transmenuHeight - mastheadMobilePaddingTop) + 'px';
}
}
} else {
getDivChildren(headerel, '.header-content', function(headerContent, i) {
if (wwidth > mediaQuery) headerContent.style.paddingTop = transmenuHeight + 'px';
else headerContent.style.paddingTop = (transmenuHeight - mastheadMobilePaddingTop) + 'px';
});
}
}
}
}
if (classie.hasClass(headerel, 'uncoltable')) {
break;
}
}
} else {
if (menuwrapper[0] != undefined) classie.addClass(menuwrapper[0], 'no-header');
classie.removeClass(masthead, 'menu-transparent');
transmenuHeight = 0;
isMobileTransparent = false;
}
} else {
isMobileTransparent = false;
}
if (typeof transmenuel === 'undefined' || !transmenuel.length) isMobileTransparent = false;
bodyTop = document.documentElement['scrollTop'] || document.body['scrollTop'];
UNCODE.bodyTop = bodyTop;
if (!classie.hasClass(document.body, 'vmenu'))
initBox();
scrollFunction();
showHideScrollup(bodyTop);
if ( UNCODE.isMobile ) {
var eventName = 'loadedmetadata';
eventName = eventName.replace(/^on/, '');
var elt = document.createElement('video'[eventName]);
var eventIsSupported = ('on'+eventName in elt);
elt = null;
if ( ! eventIsSupported) {
classie.addClass(document.body, 'video-not-supported');
}
}
},
initRow = function(currentRow) {
UNCODE.adaptive();
var el = typeof currentRow.parentNode !== 'undefined' && currentRow.parentNode.parentNode.getAttribute("data-parent") == 'true' ? currentRow.parentNode : ( currentRow.getAttribute("data-parent") == 'true' ? currentRow.querySelector('.row-parent') : currentRow.parentNode.parentNode ),
rowParent = el.parentNode,
rowInner = currentRow.parentNode,
percentHeight = el.getAttribute("data-height-ratio"),
minHeight = el.getAttribute("data-minheight"),
calculateHeight,
calculatePadding = 0,
isHeader = false,
isFirst = false,
uri_pattern = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig;
/** Add class to the row when contains responsive column size */
getDivChildren(el.parentNode, '.column_parent, .column_child', function(obj, i, total) {
if ((obj.className).indexOf("col-md-") > - 1) {
classie.addClass(obj.parentNode, 'cols-md-responsive');
}
obj.className = obj.className.replace(/vc_col-sm-(\d{1,2})/g, "");
if ((obj.className).indexOf("col-sm-") > - 1 && (obj.className).indexOf("col-sm-clear") == - 1) {
classie.addClass(obj.parentNode, 'cols-sm-responsive');
}
});
setRowHeight(el);
var elements = 0;
getDivChildren(el, '.row-internal .background-inner', function(obj, i, total) {
elements++;
if (i == 0) {
if (!!obj.style.backgroundImage && obj.style.backgroundImage !== void 0) {
var url = (obj.style.backgroundImage).match(uri_pattern),
image = new Image();
image.onload = function() {
el.setAttribute('data-imgready', 'true');
el.dispatchEvent(new CustomEvent('imgLoaded'));
};
image.src = url[0];
} else {
el.setAttribute('data-imgready', 'true');
el.dispatchEvent(new CustomEvent('imgLoaded'));
}
}
});
if (elements == 0) {
el.setAttribute('data-imgready', 'true');
}
/** init parallax is not mobile */
if ( ! UNCODE.isFullPage ) {
bodyTop = document.documentElement['scrollTop'] || document.body['scrollTop'];
kenburnsRows = el.parentNode.parentNode.querySelectorAll('.with-kburns > .row-background > .background-wrapper, .with-kburns > .fp-tableCell > .row-background > .background-wrapper, .with-kburns > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
kenburnsCols = el.querySelectorAll('.with-kburns > .column-background > .background-wrapper');
backwashRows = el.parentNode.parentNode.querySelectorAll('.with-zoomout > .row-background > .background-wrapper, .with-zoomout > .fp-tableCell > .row-background > .background-wrapper, .with-zoomout > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
backwashCols = el.querySelectorAll('.with-zoomout > .column-background > .background-wrapper');
if (isMobileParallaxAllowed || !UNCODE.isMobile) {
parallaxRows = el.parentNode.parentNode.querySelectorAll('.with-parallax > .row-background > .background-wrapper, .with-parallax > .fp-tableCell > .row-background > .background-wrapper, .with-parallax > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
parallaxCols = el.querySelectorAll('.with-parallax > .column-background > .background-wrapper');
visibleRows = el.parentNode.parentNode;
parallaxRowCol(bodyTop);
visibleRowCol(bodyTop);
} else {
if (UNCODE.isMobile) {
kenburnsHeader(bodyTop);
kenburnsRowCol(bodyTop);
backwashHeader(bodyTop);
backwashRowCol(bodyTop);
}
}
}
shapeDivider();
var wrapLinesWw = wwidth;
//Text animation, automatic lines and highlights
var setWrap;
function word_for_lines(event, $parent_el){
if ( typeof $parent_el === 'undefined' || $parent_el === null ) {
$parent_el = document.body;
}
var $headings = $parent_el.querySelectorAll('.heading-text');
for (var head_k = 0; head_k < $headings.length; head_k++) {
var $heading = $headings[head_k],
heading_cont = $heading.innerHTML,
$row = $heading.closest('.row-parent'),
$owl_carousel = $heading.closest('.owl-carousel-wrapper'),
$owl_item = $heading.closest('.owl-item'),
$words = $heading.querySelectorAll('.split-word'),
setWrap;
if ( ! $words.length ) {
if ( $owl_item !== null )
continue;
}
if ( $owl_carousel === null && typeof event !== 'undefined' && event !== 'resize' && event !== false ) {
continue;
}
if ( $owl_carousel !== null ) {
if (
( $owl_item === null )
||
( $owl_item !== null && classie.hasClass($owl_item, 'active') && $owl_item.getAttribute('data-index') !== '1' )
||
( $owl_item !== null && classie.hasClass($owl_item, 'active') && $owl_item.getAttribute('data-index') === '1' && $owl_item.getAttribute('data-already-reached') === 'true' )
) {
continue;
}
}
$heading.innerHTML = heading_cont;
$words = $heading.querySelectorAll('.split-word');
var lineArray = [],
lineIndex = 0,
lineStart = true,
lineEnd = false,
$text_highlight = $heading.querySelectorAll('.heading-text-highlight'),
$line_wraps = $heading.querySelectorAll('.heading-line-wrap');
if ( $line_wraps.length && typeof event === 'undefined' ) {
continue;
}
var lettering = function(){
var $wraps = $parent_el.querySelectorAll('.animate_inner_when_almost_visible.curtain, .animate_inner_when_almost_visible.curtain-words, .animate_inner_when_almost_visible.typewriter, .animate_inner_when_almost_visible.single-curtain, .animate_inner_when_almost_visible.single-slide, .animate_inner_when_almost_visible.single-slide-opposite');
for (var i = 0; i < $wraps.length; i++) {
var $wrap = $wraps[i],
$lines = $wrap.querySelectorAll('.heading-line-wrap'),
$words = $wrap.querySelectorAll('.split-word'),
containerDelay = $wrap.getAttribute('data-delay'),
containerSpeed = $wrap.getAttribute('data-speed'),
containerSpeed_val = typeof containerSpeed !== 'undefined' && containerSpeed !== null ? parseFloat(containerSpeed) : 400,
containerInterval = typeof $wrap.getAttribute('data-interval') !== 'undefined' && $wrap.getAttribute('data-interval') !== null ? $wrap.getAttribute('data-interval') : 0,
delayAttr = (containerDelay != undefined) ? containerDelay : 0;
if ( classie.hasClass($wrap, 'already-animated') ) {
continue;
}
if ( classie.hasClass($wrap, 'curtain') ) {
for (var il = 0; il < $lines.length; il++) {
var $line = $lines[il],
$spans = $line.querySelectorAll('.split-word-inner');
for (var is = 0; is < $spans.length; is++) {
var $span = $spans[is];
$span.setAttribute('data-delay', ( parseFloat(delayAttr) + ( ( parseFloat(containerInterval) + 100 ) * il ) ) );
if (typeof containerSpeed_val !== 'undefined' ) {
$span.setAttribute('data-speed', containerSpeed_val);
}
classie.addClass($span, 'animate_when_parent_almost_visible');
classie.addClass($span, 'text-bottom-t-top');
if ( is+1 === $spans.length && il+1 === $lines.length ) {
classie.addClass($span, 'anim-tot-checker');
}
}
}
} else if ( classie.hasClass($wrap, 'single-curtain') ) {
var $spans = $wrap.querySelectorAll('.split-char');
for (var is = 0; is < $spans.length; is++) {
var $span = $spans[is];
$span.setAttribute('data-delay', ( parseFloat(delayAttr) + ( ( parseFloat(containerInterval) + 20 ) * is ) ) );
if (typeof containerSpeed_val !== 'undefined' ) {
$span.setAttribute('data-speed', containerSpeed_val);
}
classie.addClass($span, 'animate_when_parent_almost_visible');
classie.addClass($span, 'text-bottom-t-top');
if ( is+1 == $spans.length ) {
classie.addClass($span, 'anim-tot-checker');
}
};
} else if ( classie.hasClass($wrap, 'typewriter') ) {
var $spans = $wrap.querySelectorAll('.split-char');
for (var is = 0; is < $spans.length; is++) {
var $span = $spans[is];
$span.setAttribute('data-delay', ( parseFloat(delayAttr) + ( ( parseFloat(containerInterval) + 20 ) * is ) ) );
if (typeof containerSpeed_val !== 'undefined' ) {
$span.setAttribute('data-speed', containerSpeed_val);
}
classie.addClass($span, 'animate_when_parent_almost_visible');
classie.addClass($span, 'typewriter');
if ( is+1 == $spans.length ) {
classie.addClass($span, 'anim-tot-checker');
}
}
} else if ( classie.hasClass($wrap, 'single-slide') ) {
var $spans = $wrap.querySelectorAll('.split-word-inner');
for (var is = 0; is < $spans.length; is++) {
var $span = $spans[is];
$span.setAttribute('data-delay', ( parseFloat(delayAttr) + ( ( parseFloat(containerInterval) + 50 ) * is ) ) );
if (typeof containerSpeed_val !== 'undefined' ) {
$span.setAttribute('data-speed', containerSpeed_val);
}
classie.addClass($span, 'animate_when_parent_almost_visible');
if ( classie.hasClass(document.body, 'rtl') ) {
classie.addClass($span, 'text-left-t-right');
} else {
classie.addClass($span, 'text-right-t-left');
}
if ( is+1 == $spans.length ) {
classie.addClass($span, 'anim-tot-checker');
}
}
} else if ( classie.hasClass($wrap, 'single-slide-opposite') ) {
var $spans = $wrap.querySelectorAll('.split-word-inner');
for (var is = 0; is < $spans.length; is++) {
var $span = $spans[is];
$span.setAttribute('data-delay', ( parseFloat(delayAttr) + ( ( parseFloat(containerInterval) + 50 ) * is ) ) );
if (typeof containerSpeed_val !== 'undefined' ) {
$span.setAttribute('data-speed', containerSpeed_val);
}
classie.addClass($span, 'animate_when_parent_almost_visible');
if ( classie.hasClass(document.body, 'rtl') ) {
classie.addClass($span, 'text-left-t-right');
} else {
classie.addClass($span, 'text-right-t-left');
}
if ( is+1 == $spans.length ) {
classie.addClass($span, 'anim-tot-checker');
}
}
} else if ( classie.hasClass($wrap, 'curtain-words') ) {
var $spans = $wrap.querySelectorAll('.split-word-inner');
for (var is = 0; is < $spans.length; is++) {
var $span = $spans[is];
$span.setAttribute('data-delay', ( parseFloat(delayAttr) + ( ( parseFloat(containerInterval) + 50 ) * is ) ) );
if (typeof containerSpeed_val !== 'undefined' ) {
$span.setAttribute('data-speed', containerSpeed_val);
}
classie.addClass($span, 'animate_when_parent_almost_visible');
classie.addClass($span, 'text-bottom-t-top');
if ( is+1 == $spans.length ) {
classie.addClass($span, 'anim-tot-checker');
}
}
}
}
}
var removeOldLines = function(){
for (var wrap_k = 0; wrap_k < $line_wraps.length; wrap_k++) {
var $line_wrap = $line_wraps[wrap_k];
var $parent_wrap = $line_wrap.parentNode;
while ( $line_wrap.firstChild ) {
$parent_wrap.insertBefore($line_wrap.firstChild, $line_wrap);
}
$parent_wrap.removeChild($line_wrap);
}
}
var createHighlightSpans = function(){
for (var high_k = 0; high_k < $text_highlight.length; high_k++) {
var $highlight = $text_highlight[high_k],
atts = $highlight.getAttribute('data-atts'),
objAtts,
styleEl = '',
classEl = '',
animation = false,
hexRe = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i,
$h_words = $highlight.querySelectorAll('.split-word');
if ( typeof atts !== 'undefined' && atts != '' ) {
objAtts = JSON.parse(atts);
if ( typeof objAtts.bg != 'undefined' ) {
if ( hexRe.test(objAtts.bg)) {
styleEl += 'background-color:' + objAtts.bg + ';';
} else {
classEl += ' ' + objAtts.bg;
}
}
if ( typeof objAtts.color != 'undefined' ) {
if ( hexRe.test(objAtts.color)) {
styleEl += 'color:' + objAtts.color + ';';
} else {
var classChild = objAtts.color;
}
}
if ( typeof objAtts.height != 'undefined' ) {
styleEl += 'height:' + objAtts.height + ';';
}
if ( typeof objAtts.offset != 'undefined' ) {
styleEl += 'bottom:' + objAtts.offset + ';';
}
if ( typeof objAtts.opacity != 'undefined' ) {
styleEl += 'opacity:' + objAtts.opacity + ';';
}
if ( objAtts.animated == 'yes' ) {
animation = true;
}
}
for (var h_words_k = 0; h_words_k < $h_words.length; h_words_k++) {
var $word = $h_words[h_words_k],
$new_el = document.createElement('span');
if ( typeof classChild !== 'undefined' ) {
classie.addClass($word, objAtts.color);
}
if ( h_words_k === 0 ) {
classie.addClass($word, 'first-highlight');
} else if ( (h_words_k+1) === $h_words.length ) {
classie.addClass($word, 'last-highlight');
}
$new_el.className = 'heading-text-highlight-inner' + classEl;
if ( styleEl !== '' ) {
$new_el.setAttribute('style', styleEl);
}
if ( animation ) {
$new_el.setAttribute('data-animated', 'yes');
}
$word.appendChild($new_el);
};
var $parent_highlight = $highlight.parentNode;
while ( $highlight.firstChild ) {
$parent_highlight.insertBefore($highlight.firstChild, $highlight);
}
$parent_highlight.removeChild($highlight);
}
}
var createNewLines = function(){
for (var word_k = 0; word_k < $words.length; word_k++) {
var $word = $words[word_k],
top = $word.offsetTop,
elH = $word.offsetHeight,
$next = typeof $words[(word_k+1)] !== 'undefined' ? $words[(word_k+1)] : null,
nextTop = $next !== null ? $next.offsetTop : null;
if (lineStart) {
lineArray[lineIndex] = [word_k];
if (nextTop !== null && nextTop > (top + elH/2)) {
lineArray[lineIndex].push(word_k);
lineIndex++;
lineStart = true;
} else {
lineStart = false;
}
} else {
if (nextTop !== null && nextTop > (top + elH/2)) {//tollerance
lineArray[lineIndex].push(word_k);
lineIndex++;
lineStart = true;
} else if ( nextTop === null ) {
lineArray[lineIndex].push(word_k);
}
}
}
for (var i = 0; i < lineArray.length; i++) {
var start = lineArray[i][0],
end = lineArray[i][1] + 1;
var spanWrap = document.createElement('span');
spanWrap.className = 'heading-line-wrap';
if (!end) {
window.wrap(spanWrap, $words[start]);
} else {
for (var _i = start; _i < end; _i++) {
if ( typeof $words[_i] !== 'undefined' && $words[_i] !== null ) {
classie.addClass($words[_i], 'heading-temp');
$words[_i].style.zIndex = end - _i;
}
}
var $towrap = $heading.querySelectorAll('.heading-temp');
if ( typeof $towrap[0] !== 'undefined' && $towrap[0] !== null ) {
window.wrapAll(spanWrap, $towrap);
for (var _i = 0; _i < $towrap.length; _i++) {
classie.removeClass($towrap[_i], 'heading-temp');
}
}
}
if ( (i+1) == lineArray.length ) {
classie.addClass($row, 'loaded-split-word');
}
classie.addClass($heading, 'heading-lined');
}
lettering();
}
removeOldLines();
createHighlightSpans();
createNewLines();
$parent_el.addEventListener("owl-carousel-changed", function() {
removeOldLines();
createHighlightSpans();
createNewLines();
});
if ( event !== 'resize' ) {
document.body.dispatchEvent(new CustomEvent('uncode_waypoints'));
}
}
}
var $h_markup = document.body.querySelectorAll('.font-obs'),
fontArr = new Array();
for (var i = 0; i < $h_markup.length; i++) {
var font_to_check = $h_markup[i].getAttribute("data-font");
if ( font_to_check === null ) {
word_for_lines(false, el);
} else {
var font_weight = $h_markup[i].getAttribute("data-weight");
var font_style = $h_markup[i].getAttribute("data-style");
if ( font_weight === null ) {
font_weight = 'normal';
}
if ( font_style === null ) {
font_style = 'normal';
}
font_to_check = font_to_check.split(',');
var font_val = font_to_check[0].replace(/['"]+/g, ''),
font_key = '\''+font_val+'_'+font_weight+'_'+font_style+'\'';
if ( fontArr.indexOf( font_val+'_'+font_weight ) === -1 ) {
fontArr[font_key] = {'family':font_val,'weight':font_weight,'style':font_style };
}
}
}
var counter = 0;
for (var key in fontArr) {
if (fontArr.hasOwnProperty(key)) {
var font = new FontFaceObserver(fontArr[key].family, { weight: fontArr[key].weight, style: fontArr[key].style } );
font.load(null, 10000).then(function (font) {
counter++;
if ( counter == Object.keys(fontArr).length ) {
already_font = true;
requestTimeout(function(){
word_for_lines(false, el);
}, 10);
}
}, function (error) {
word_for_lines(false, el);
});
}
}
el.addEventListener("owl-carousel-initialized", function() {
word_for_lines("owl-carousel-initialized", el);
});
el.addEventListener("vc-shortcodeView-updated", function() {
word_for_lines(false, el);
});
window.addEventListener("resize", function() {
if ( wwidth != wrapLinesWw ) {
clearRequestTimeout(setWrap);
setWrap = requestTimeout( function(){
wrapLinesWw = wwidth;
word_for_lines('resize');
}, 100 );
}
});
scrollFunction();
if ( uaInfo.is('chrome') ) {
var videos = document.querySelectorAll('.wp-video-shortcode');
for (var i = 0; i < videos.length; i++) {
var video = videos[i];
if ( typeof video.getAttribute('autoplay') !== 'undefined' && video.getAttribute('autoplay') !== null && ( typeof video.getAttribute('muted') === 'undefined' || video.getAttribute('muted') === null ) ) {
video.oncanplay = function(e) {
video.muted = true;
video.play();
};
break;
}
}
}
},
setRowHeight = function(container, forced, resized) {
var currentTallest = 0,
percentHeight = 0,
minHeight = 0,
el,
child,
hasSubCols = false;
if (container.length == undefined) {
container = [container];
}
// Loop for each container element to match their heights
for (var i = 0; i < container.length; i++) {
var el = container[i],
$row = el,
totalHeight = 0,
colsArray = new Array(),
calculatePadding = 0,
$rowParent = $row.parentNode,
isHeader = false,
isFirst = false;
$row.oversized = false;
percentHeight = el.getAttribute("data-height-ratio");
minHeight = el.getAttribute("data-minheight");
child = (el.firstElementChild || el.firstChild);
var childHeight = outerHeight(child);
/** window height without header **/
if (!!percentHeight || !!minHeight || forced || (isIE && classie.hasClass(el, 'unequal')) ) {
child.style.height = '';
if (!!percentHeight) {
if (percentHeight == 'full') {
currentTallest = parseInt(wheight);
} else {
currentTallest = parseInt((wheight * percentHeight) / 100);
}
} else {
currentTallest = el.clientHeight;
}
if (!!minHeight) {
if (currentTallest < minHeight || currentTallest == undefined) currentTallest = parseInt(minHeight);
}
if (getClosest(el, 'header-uncode-block') != null) {
el.setAttribute('data-row-header', 'true');
isHeader = true;
} else {
if (pageHeader == null) {
var prevRow = $rowParent.previousSibling;
if (prevRow != null && prevRow.innerText == 'UNCODE.initHeader();') {
isFirst = true;
}
}
}
if (classie.hasClass(el, 'row-slider')) {
percentHeight = el.getAttribute("data-height-ratio");
minHeight = el.getAttribute("data-minheight");
if (percentHeight == 'full') {
currentTallest = parseInt(wheight);
} else {
currentTallest = parseInt((wheight * percentHeight) / 100);
}
var computedStyleRow = getComputedStyle(el),
computedStyleRowParent = getComputedStyle($rowParent);
calculatePadding -= (parseFloat(computedStyleRow.paddingTop) + parseFloat(computedStyleRowParent.paddingTop));
calculatePadding -= (parseFloat(computedStyleRow.paddingBottom) + parseFloat(computedStyleRowParent.paddingBottom));
if (isHeader || isFirst) {
if (isMobileTransparent || wwidth > mediaQuery) currentTallest -= menuHeight - transmenuHeight;
else currentTallest -= menuHeight - secmenuHeight;
currentTallest += calculatePadding;
} else {
if (isMobileTransparent || wwidth > mediaQuery) currentTallest += calculatePadding;
else currentTallest = 'auto';
}
getDivChildren(el, '.owl-carousel', function(owl, i) {
owl.style.height = (currentTallest == 'auto' ? 'auto' : currentTallest + 'px');
if (isIE) {
getDivChildren(owl, '.owl-stage', function(owlIn, i) {
owlIn.style.height = (currentTallest == 'auto' ? '100%' : currentTallest + 'px');
});
}
});
if ( UNCODE.isFullPageSnap || classie.hasClass(masthead, 'menu-transparent') )
continue;
else {
if ( classie.hasClass(document.body, 'uncode-fp-menu-hide') ) {
$rowParent.parentNode.style.paddingTop = menuHeight + 'px';
}
}
} else {
if (isHeader || isFirst || UNCODE.isFullPage ) {
if ( !( UNCODE.isFullPage && !classie.hasClass(masthead, 'menu-transparent') && classie.hasClass(document.body, 'uncode-fp-menu-hide') && !isHeader && !isFirst ) ) {
if (isMobileTransparent || wwidth > mediaQuery) currentTallest -= menuHeight - transmenuHeight;
else currentTallest -= menuHeight - secmenuHeight;
}
if ( UNCODE.isFullPage && classie.hasClass(document.body, 'uncode-scroll-safe-padding') && classie.hasClass(masthead, 'menu-transparent') && !classie.hasClass(document.body, 'uncode-fp-menu-hide') ) {
var safeMenuHeight = parseFloat(document.body.getAttribute("data-additional-padding")) + parseFloat(menuHeight);
if ( (" " + child.parentNode.className + " ").replace(/[\n\t]/g, " ").indexOf("-top-padding ") < 0 || classie.hasClass(child.parentNode, 'single-top-padding') ) {
classie.addClass(child.parentNode, 'fp-safe-padding-top');
child.parentNode.style.paddingTop = safeMenuHeight + 'px';
}
if ( (" " + child.parentNode.className + " ").replace(/[\n\t]/g, " ").indexOf("-bottom-padding ") < 0 || classie.hasClass(child.parentNode, 'single-bottom-padding') ) {
classie.addClass(child.parentNode, 'fp-safe-padding-bottom');
child.parentNode.style.paddingBottom = safeMenuHeight + 'px';
}
}
if ( !classie.hasClass(masthead, 'menu-transparent') && classie.hasClass(document.body, 'uncode-fp-menu-hide') && ( isFirst || isHeader ) )
$rowParent.parentNode.style.paddingTop = menuHeight + 'px';
var computedStyleRow = getComputedStyle(el),
computedStyleRowParent = getComputedStyle($rowParent);
calculatePadding -= (parseFloat(computedStyleRow.paddingTop) + parseFloat(computedStyleRowParent.paddingTop));
calculatePadding -= (parseFloat(computedStyleRow.paddingBottom) + parseFloat(computedStyleRowParent.paddingBottom));
currentTallest += calculatePadding;
} else {
var computedStyleRow = getComputedStyle(el),
computedStyleRowParent = getComputedStyle($rowParent);
calculatePadding -= (parseFloat(computedStyleRow.paddingTop) + parseFloat(computedStyleRowParent.paddingTop));
calculatePadding -= (parseFloat(computedStyleRow.paddingBottom) + parseFloat(computedStyleRowParent.paddingBottom));
if (wwidth > mediaQuery) currentTallest += calculatePadding;
else currentTallest = 'auto';
}
}
if ( UNCODE.isFullPage ) {
currentTallest -= UNCODE.adminBarHeight;
}
if (!!minHeight) {
if (currentTallest < minHeight || currentTallest == 'auto') currentTallest = parseInt(minHeight);
}
child.style.height = (currentTallest == 'auto' ? 'auto' : currentTallest + 'px');
} else {
currentTallest = 0;
if ( UNCODE.isFrontEndEditor && child !== null ) {
child.style.height = '';
getDivChildren(el, '.owl-carousel', function(owl, i) {
owl.style.height = '';
if (isIE) {
getDivChildren(owl, '.owl-stage', function(owlIn, i) {
owlIn.style.height = '';
});
}
});
}
}
if (wwidth > mediaQuery) {
getDivChildren(el, '.column_parent', function(col, i, total) {
var $col = col,
$colHeight = 0,
$colDiff = 0,
$colPercDiff = 100;
$col.oversized = false;
$col.forceHeight = currentTallest;
currentTallest = child.clientHeight;
if ((isHeader || isFirst) && currentTallest != 'auto') currentTallest -= transmenuHeight;
var getFirstCol = null,
getMargin = 0,
getSubMargin = 0;
getDivChildren(col, '.row-child', function(obj, i, total) {
var $colChild = obj,
$colParent = $colChild.parentNode,
computedStyleCol = getComputedStyle($colParent);
parseFloat(computedStyleCol.marginTop);
getSubMargin += parseFloat(computedStyleCol.marginTop);
});
currentTallest += getSubMargin;
getDivChildren(col, '.row-child', function(obj, i, total) {
var $colChild = obj,
$colInner,
$colParent = $colChild.parentNode,
$uncont = $colParent.parentNode;
for (var it = 0; it < $colChild.childNodes.length; it++) {
if ( ! classie.hasClass($colChild.childNodes[it], 'uncode-divider-wrap') ) {
$colInner = $colChild.childNodes[it];
break;
}
}
if (i == 0 && total > 1) getFirstCol = $colInner;
$colChild.oversized = false;
percentHeight = $colChild.getAttribute("data-height");
minHeight = $colChild.getAttribute("data-minheight");
if (percentHeight != null || minHeight != null) {
if ( ! classie.hasClass($colInner, 'uncode-divider-wrap') )
$colInner.style.height = '';
$colParent.style.height = 'auto';
$uncont.style.height = '100%';
$colChild.removeAttribute("style");
var newHeight = (percentHeight != null) ? Math.ceil((currentTallest) * (percentHeight / 100)) : parseInt(minHeight);
var computedStyleCol = getComputedStyle($colParent);
getMargin = parseFloat(computedStyleCol.marginTop);
newHeight -= (getMargin);
$colPercDiff -= (percentHeight != null) ? percentHeight : 0;
if (currentTallest > newHeight) {
var getColHeight = outerHeight($colChild);
if (getColHeight > newHeight) {
$colHeight += getColHeight;
$colDiff += getColHeight;
$colChild.oversized = true;
$col.oversized = true;
$row.oversized = true;
} else {
$colHeight += newHeight;
if ( ! classie.hasClass($colInner, 'uncode-divider-wrap') )
$colInner.style.height = newHeight + 'px';
}
}
} else {
$colHeight += outerHeight($colChild);
}
});
if (getFirstCol != null) {
getFirstCol.style.height = (parseFloat(getFirstCol.style.height) - getMargin) + 'px';
}
colsArray.push({
colHeight: $colHeight,
colDiv: $col
});
$col.colDiff = $colDiff;
$col.colPercDiff = $colPercDiff;
});
if ($row.oversized) {
child.style.height = '';
colsArray.sort(function(a, b) {
if (a.colHeight < b.colHeight) return 1;
if (a.colHeight > b.colHeight) return -1;
return 0;
});
var $totalHeight = 0;
colsArray.forEach(function(col) {
var $col = col.colDiv,
$colHeight = col.colHeight;
getDivChildren($col, '.row-child', function(obj, i, total) {
var $colChild = obj,
$colInner = $colChild.children[0],
percentHeight = $colChild.getAttribute("data-height"),
$colParent = $colChild.parentNode,
$uncont = $colParent.parentNode,
newHeight;
$colHeight = $col.forceHeight - $col.colDiff;
if (percentHeight != null) {
if ($colHeight > 0) {
if ($col.oversized) {
if (!$colChild.oversized) {
newHeight = Math.ceil(($colHeight) * (percentHeight / $col.colPercDiff));
if (i == total - 1 && total > 1) {
$uncont.style.height = 'auto';
$colChild.style.display = 'none';
newHeight = outerHeight($col.parentNode) - outerHeight($uncont);
$uncont.style.height = '100%';
$colChild.style.display = 'table';
}
if (newHeight == 0) newHeight = Math.ceil(($col.forceHeight) * (percentHeight / 100));
$colInner.style.height = newHeight + 'px';
}
} else {
if ($totalHeight == 0) newHeight = Math.ceil(($colHeight) * (percentHeight / $col.colPercDiff));
else {
newHeight = Math.ceil(($totalHeight) * (percentHeight / $col.colPercDiff));
}
if (i == total - 1 && total > 1) {
$uncont.style.height = 'auto';
$colChild.style.display = 'none';
newHeight = outerHeight($col.parentNode) - outerHeight($uncont);
$uncont.style.height = '100%';
$colChild.style.display = 'table';
}
$colInner.style.height = newHeight + 'px';
}
} else {
if ($colChild.oversized) {
if ($totalHeight == 0) newHeight = Math.ceil(($colHeight) * (percentHeight / $col.colPercDiff));
else {
if ($col.colPercDiff == 0) $col.colPercDiff = 100;
newHeight = Math.ceil(($totalHeight) * (percentHeight / $col.colPercDiff));
}
if (i == total - 1 && total > 1) {
$uncont.style.height = 'auto';
$colChild.style.display = 'none';
newHeight = outerHeight($col.parentNode) - outerHeight($uncont);
$uncont.style.height = '100%';
$colChild.style.display = 'table';
}
$colInner.style.height = newHeight + 'px';
}
}
}
});
var uncell = $col.getElementsByClassName('uncell');
if (uncell[0] != undefined && $totalHeight == 0) $totalHeight = outerHeight(uncell[0]);
});
}
if (isFF) {
getDivChildren(el, '.uncoltable', function(col, i, total) {
if (col.style.minHeight != '') {
col.style.height = '';
}
});
}
if (resized) {
getDivChildren(el, '.row-child > .row-inner', function(obj, k, total) {
if (obj.style.height == '') {
if (wwidth > mediaQueryMobile) {
var getStyle = (window.getComputedStyle((obj.parentNode), null)),
getInnerHeight = (parseInt(obj.parentNode.clientHeight) - parseInt(getStyle.paddingTop) - parseInt(getStyle.paddingBottom));
obj.style.height = getInnerHeight + 'px';
//obj.style.marginBottom = '-1px';
}
}
});
getDivChildren(el, '.row-parent > .row-inner', function(obj, k, total) {
if (obj.style.height != '') {
var getStyle = (window.getComputedStyle((obj.parentNode), null)),
getInnerHeight = (parseInt(obj.parentNode.clientHeight) - parseInt(getStyle.paddingTop) - parseInt(getStyle.paddingBottom)),
getTempHeight = parseInt(obj.style.height);
if (getInnerHeight > getTempHeight) {
obj.style.height = getInnerHeight + 'px';
//obj.style.marginBottom = '-1px';
}
}
});
}
} else {
if (isFF) {
getDivChildren(el, '.uncoltable', function(col, i, total) {
if (col.style.minHeight != '') {
col.style.height = '';
col.style.height = outerHeight(col.parentNode) + 'px';
}
});
}
if (isIE && (wwidth > mediaQueryMobile)) {
if (child.style.height == 'auto') {
child.style.height = outerHeight(child) + 'px';
}
}
}
if (isFF) {
var sliderColumnFix = document.querySelector('.uncode-slider .row-inner > .column_child:only-child');
if (sliderColumnFix != null) {
if (wwidth > mediaQuery) {
sliderColumnFix.style.setProperty("height", "");
} else {
sliderColumnFix.style.setProperty("height", "");
sliderColumnFix.style.setProperty("height", outerHeight(sliderColumnFix.parentNode) + "px", "important");
}
}
}
};
window.scroll(0, scrollRowHeight_fix);
},
headerHeight = function(container) {
forEachElement(container, function(el, i) {
var getHeight = el.getAttribute("data-height"),
newHeight = ((wheight * getHeight) / 100);
if (getHeight != 'fixed' && newHeight != 0) {
if (isMobileTransparent || wwidth > mediaQuery) newHeight -= menuHeight - transmenuHeight;
else newHeight -= menuHeight - secmenuHeight;
el.style.height = newHeight + 'px';
}
});
if (masthead != undefined) {
masthead.parentNode.style.height = menuHeight + 'px';
if (header != undefined && header.length) {
if (classie.hasClass(masthead, 'menu-transparent')) {
if (isMobileTransparent || wwidth > mediaQuery) {
masthead.parentNode.style.height = '0px';
if (classie.hasClass(masthead, 'menu-add-padding')) {
for (var j = 0; j < header.length; j++) {
var headerel = header[j];
var headerBlock = getClosest(headerel, 'header-uncode-block');
if (headerBlock != null) {
var innerRows = headerel.querySelectorAll('.column_parent > .uncol > .uncoltable > .uncell > .uncont, .uncode-slider .column_child > .uncol > .uncoltable > .uncell > .uncont');
for (var k = 0; k < innerRows.length; k++) {
if (innerRows[k] != undefined) {
if (wwidth > mediaQuery) innerRows[k].style.paddingTop = transmenuHeight + 'px';
else innerRows[k].style.paddingTop = (transmenuHeight - mastheadMobilePaddingTop) + 'px';
}
}
} else {
getDivChildren(headerel, '.header-content', function(headerContent, i) {
if (wwidth > mediaQuery) headerContent.style.paddingTop = transmenuHeight + 'px';
else headerContent.style.paddingTop = (transmenuHeight - mastheadMobilePaddingTop) + 'px';
});
}
}
}
}
}
}
}
},
initVideoComponent = function(container, classTarget) {
if ( UNCODE.isFrontEndEditor )
return;
getDivChildren(container, classTarget, function(el, i) {
var width = outerWidth(el),
pWidth, // player width, to be defined
height = outerHeight(el),
pHeight, // player height, tbd
$tubularPlayer = (el.getElementsByTagName('iframe').length == 1) ? el.getElementsByTagName('iframe') : el.getElementsByTagName('video'),
ratio = (el.getAttribute("data-ratio") != null) ? Number(el.getAttribute("data-ratio")) : typeof $tubularPlayer[0] !== 'undefined' ? $tubularPlayer[0].getAttribute("data-ratio") : '1.8',
heightOffset = 80,
widthOffset = heightOffset * ratio;
// when screen aspect ratio differs from video, video must center and underlay one dimension
if ($tubularPlayer[0] != undefined) {
if (width / ratio < height) { // if new video height < window height (gap underneath)
pWidth = Math.ceil((height + heightOffset) * ratio); // get new player width
$tubularPlayer[0].style.width = pWidth + widthOffset + 'px';
$tubularPlayer[0].style.height = height + heightOffset + 'px';
$tubularPlayer[0].style.left = ((width - pWidth) / 2) - (widthOffset / 2) + 'px';
$tubularPlayer[0].style.top = '-' + (heightOffset / 2) + 'px';
$tubularPlayer[0].style.position = 'absolute';
} else { // new video width < window width (gap to right)
pHeight = Math.ceil(width / ratio); // get new player height
$tubularPlayer[0].style.width = width + widthOffset + 'px';
$tubularPlayer[0].style.height = pHeight + heightOffset + 'px';
$tubularPlayer[0].style.left = '-' + (widthOffset / 2) + 'px';
$tubularPlayer[0].style.top = ((height - pHeight) / 2) - (heightOffset / 2) + 'px';
$tubularPlayer[0].style.position = 'absolute';
}
}
});
},
init_overlay = function() {
if ( UNCODE.isFrontEndEditor )
return;
var triggerButton,
closeButtons = new Array();
function toggleOverlay(btn) {
Array.prototype.forEach.call(document.querySelectorAll('div.overlay'), function(overlay) {
if (btn.getAttribute('data-area') == overlay.getAttribute('data-area')) {
var container = document.querySelector('div.' + btn.getAttribute('data-container')),
inputField = overlay.querySelector('.search-field');
if (classie.has(overlay, 'open')) {
window.dispatchEvent(menuClose);
overlayOpened = false;
classie.remove(overlay, 'open');
classie.remove(container, 'overlay-open');
classie.add(overlay, 'close');
classie.remove(overlay, 'open-items');
var onEndTransitionFn = function(ev) {
if (transitionEvent) {
if (ev.propertyName !== 'visibility') return;
this.removeEventListener(transitionEvent, onEndTransitionFn);
}
classie.remove(overlay, 'close');
};
if (transitionEvent) {
overlay.addEventListener(transitionEvent, onEndTransitionFn);
} else {
onEndTransitionFn();
}
} else if (!classie.has(overlay, 'close')) {
window.dispatchEvent(menuOpen);
overlayOpened = true;
classie.add(overlay, 'open');
classie.add(container, 'overlay-open');
if (jQuery('body.menu-overlay').length == 0) {
setTimeout(function() {
inputField.focus();
}, 1000);
}
setTimeout(function() {
if (classie.has(overlay, 'overlay-sequential')) classie.add(overlay, 'open-items');
}, 800);
}
}
});
if (classie.hasClass(btn, 'search-icon') || classie.hasClass(btn, 'menu-close-search')) return;
if (classie.hasClass(triggerButton, 'close')) {
UNCODE.menuOpened = false;
classie.removeClass(triggerButton, 'close');
classie.addClass(triggerButton, 'closing');
Array.prototype.forEach.call(closeButtons, function(closeButton) {
if (!classie.hasClass(closeButton, 'menu-close-search')) {
classie.removeClass(closeButton, 'close');
classie.addClass(closeButton, 'closing');
}
});
setTimeout(function() {
classie.removeClass(triggerButton, 'closing');
triggerButton.style.opacity = 1;
Array.prototype.forEach.call(closeButtons, function(closeButton) {
if (!classie.hasClass(closeButton, 'menu-close-search')) {
classie.removeClass(closeButton, 'closing');
closeButton.style.opacity = 0;
}
});
}, 800);
} else {
UNCODE.menuOpened = true;
triggerButton.style.opacity = 0;
var getBtnRect = !classie.hasClass(triggerButton, 'search-icon') ? triggerButton.getBoundingClientRect() : null;
Array.prototype.forEach.call(closeButtons, function(closeButton) {
if (!classie.hasClass(closeButton, 'menu-close-search')) {
classie.addClass(triggerButton, 'close');
if (getBtnRect != null) closeButton.setAttribute('style', 'top:' + getBtnRect.top + 'px; left:'+ getBtnRect.left + 'px !important');
classie.addClass(closeButton, 'close');
closeButton.style.opacity = 1;
}
});
window.addEventListener("resize", function() {
positionCloseBtn(triggerButton, closeButtons);
});
}
}
function positionCloseBtn(triggerButton, closeButtons){
var getBtnRect = !classie.hasClass(triggerButton, 'search-icon') ? triggerButton.getBoundingClientRect() : null;
Array.prototype.forEach.call(closeButtons, function(closeButton) {
if (!classie.hasClass(closeButton, 'menu-close-search')) {
if (getBtnRect != null) closeButton.setAttribute('style', 'top:' + getBtnRect.top + 'px; left:'+ getBtnRect.left + 'px !important');
closeButton.style.opacity = 1;
}
});
}
(function bindEscape() {
document.onkeydown = function(evt) {
evt = evt || window.event;
var isEscape = false;
if ("key" in evt) {
isEscape = (evt.key == "Escape" || evt.key == "Esc");
} else {
isEscape = (evt.keyCode == 27);
}
if (isEscape && overlayOpened) {
Array.prototype.forEach.call(closeButtons, function(closeButton) {
if (classie.hasClass(closeButton, 'overlay-close') && classie.hasClass(closeButton, 'menu-button-overlay')) {
closeButton.click();
}
});
}
};
})();
Array.prototype.forEach.call(document.querySelectorAll('.trigger-overlay'), function(triggerBttn) {
if (UNCODE.menuOpened) return;
triggerBttn.addEventListener('click', function(e) {
triggerButton = e.currentTarget;
if (wwidth < mediaQuery && classie.hasClass(triggerButton, 'search-icon')) {
return true;
} else {
e.stopPropagation();
if (wwidth > mediaQuery) toggleOverlay(triggerButton);
else {
if (classie.addClass(triggerButton, 'search-icon')) return true;
}
e.preventDefault();
return false;
}
}, false);
});
Array.prototype.forEach.call(document.querySelectorAll('.overlay-close'), function(closeBttn) {
closeButtons.push(closeBttn);
closeBttn.addEventListener('click', function(e) {
if (wwidth > mediaQuery) toggleOverlay(closeBttn);
e.preventDefault();
return false;
}, false);
});
},
/** All scrolling functions - Begin */
/** Shrink menu **/
shrinkMenu = function(bodyTop) {
if ( UNCODE.isFrontEndEditor )
return;
var logoShrink,
offset = 100;
for (var i = 0; i < logoel.length; i++) {
if (((secmenuHeight == 0) ? bodyTop > menuHeight : bodyTop > secmenuHeight + offset) && !classie.hasClass(logoel[i], 'shrinked') && (wwidth > mediaQuery)) {
classie.addClass(logoel[i], 'shrinked');
if (logoMinScale != undefined) {
logoShrink = logolink.children;
Array.prototype.forEach.call(logoShrink, function(singleLogo) {
singleLogo.style.height = logoMinScale + 'px';
singleLogo.style.lineHeight = logoMinScale + 'px';
if (classie.hasClass(singleLogo, 'text-logo')) singleLogo.style.fontSize = logoMinScale + 'px';
});
}
setTimeout(function() {
calculateMenuHeight(false);
//window.dispatchEvent(new Event('resize'));
}, 300);
} else if ((((secmenuHeight == 0) ? bodyTop == 0 : bodyTop <= secmenuHeight + offset) || (wwidth < mediaQuery)) && classie.hasClass(logoel[i], 'shrinked')) {
classie.removeClass(logoel[i], 'shrinked');
if (logoMinScale != undefined) {
logoShrink = logolink.children;
Array.prototype.forEach.call(logoShrink, function(singleLogo) {
singleLogo.style.height = singleLogo.getAttribute('data-maxheight') + 'px';
singleLogo.style.lineHeight = singleLogo.getAttribute('data-maxheight') + 'px';
if (classie.hasClass(singleLogo, 'text-logo')) singleLogo.style.fontSize = singleLogo.getAttribute('data-maxheight') + 'px';
});
}
setTimeout(function() {
calculateMenuHeight(false);
//window.dispatchEvent(new Event('resize'));
}, 300);
}
}
},
/** Switch colors menu **/
switchColorsMenu = function(bodyTop, style) {
for (var i = 0; i < transmenuel.length; i++) {
if (masthead.style.opacity !== 1) masthead.style.opacity = 1;
if ((secmenuHeight == 0) ? bodyTop > menuHeight / 2 : bodyTop > secmenuHeight) {
if (classie.hasClass(masthead, 'style-dark-original')) {
logo.className = logo.className.replace("style-light", "style-dark");
}
if (classie.hasClass(masthead, 'style-light-original')) {
logo.className = logo.className.replace("style-dark", "style-light");
}
if (style != undefined) {
if (style == 'dark') {
classie.removeClass(transmenuel[i], 'style-light-override');
}
if (style == 'light') {
classie.removeClass(transmenuel[i], 'style-dark-override');
}
classie.addClass(transmenuel[i], 'style-' + style + '-override');
}
} else {
if (style != undefined) {
if (style == 'dark') {
classie.removeClass(transmenuel[i], 'style-light-override');
}
if (style == 'light') {
classie.removeClass(transmenuel[i], 'style-dark-override');
}
classie.addClass(transmenuel[i], 'style-' + style + '-override');
}
}
}
if (pageHeader != undefined) {
if (style != undefined) {
if (classie.hasClass(pageHeader, 'header-style-dark')) {
classie.removeClass(pageHeader, 'header-style-dark');
}
if (classie.hasClass(pageHeader, 'header-style-light')) {
classie.removeClass(pageHeader, 'header-style-light');
}
classie.addClass(pageHeader, 'header-style-' + style);
}
}
},
/** VisibleRows **/
visibleRowCol = function(bodyTop) {
if ( typeof visibleRows == 'object') {
for (var i = 0; i < visibleRows.length; i++) {
var section = visibleRows[i],
sectionHeight = outerHeight(section),
offSetTop = bodyTop + ( section != null ? section.getBoundingClientRect().top : 0 ),
offSetPosition = wheight + bodyTop - offSetTop;
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
classie.addClass($kenburnsInner[0], 'uncode-scroll-visible');
visibleRows[i].dispatchEvent(new CustomEvent('enter-row'));
} else {
classie.removeClass($kenburnsInner[0], 'uncode-scroll-visible');
visibleRows[i].dispatchEvent(new CustomEvent('exit-row'));
}
}
}
},
/** KenBurns **/
kenburnsHeader = function(bodyTop) {
var value;
if ( typeof kenburnsHeaders == 'object' && kenburnsHeaders.length ) {
for (var i = 0; i < kenburnsHeaders.length; i++) {
var section = kenburnsHeaders[i].parentNode,
sectionHeight = outerHeight(section),
offSetTop = bodyTop + (section != null ? (classie.hasClass(section.parentNode.parentNode, 'owl-carousel') ? section.parentNode.parentNode.getBoundingClientRect().top : section.getBoundingClientRect().top) : 0),
offSetPosition = wheight + bodyTop - offSetTop,
$kenburnsInner = kenburnsHeaders[i].querySelectorAll('.header-bg');
if (classie.hasClass(kenburnsHeaders[i], 'header-carousel-wrapper')) {
$kenburnsInner = kenburnsHeaders[i].querySelectorAll('.t-background-cover');
}
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
for (var i = 0; i < $kenburnsInner.length; i++) {
classie.addClass($kenburnsInner[i], 'uncode-kburns');
$kenburnsInner[i].dispatchEvent(new CustomEvent('enter-kburns'));
}
} else {
for (var i = 0; i < $kenburnsInner.length; i++) {
classie.removeClass($kenburnsInner[i], 'uncode-kburns');
$kenburnsInner[i].dispatchEvent(new CustomEvent('exit-kburns'));
}
}
}
}
},
kenburnsRowCol = function(bodyTop) {
var value;
if ( UNCODE.isFrontEndEditor ) {
kenburnsRows = document.querySelectorAll('.with-kburns > .row-background > .background-wrapper, .with-kburns > .fp-tableCell > .row-background > .background-wrapper, .with-kburns > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
}
if ( typeof kenburnsRows == 'object' && kenburnsRows.length ) {
for (var i = 0; i < kenburnsRows.length; i++) {
var section = kenburnsRows[i].parentNode,
sectionHeight = outerHeight(section),
offSetTop = bodyTop + (section != null ? (classie.hasClass(section.parentNode.parentNode, 'owl-carousel') ? section.parentNode.parentNode.getBoundingClientRect().top : section.getBoundingClientRect().top) : 0),
offSetPosition = wheight + bodyTop - offSetTop,
$kenburnsInner = kenburnsRows[i].querySelectorAll('.background-inner, .header-bg');
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
classie.addClass($kenburnsInner[0], 'uncode-kburns');
$kenburnsInner[0].dispatchEvent(new CustomEvent('enter-kburns'));
} else {
classie.removeClass($kenburnsInner[0], 'uncode-kburns');
$kenburnsInner[0].dispatchEvent(new CustomEvent('exit-kburns'));
}
}
}
if ( UNCODE.isFrontEndEditor ) {
kenburnsCols = document.querySelectorAll('.with-kburns > .column-background > .background-wrapper');
}
if ( typeof kenburnsCols == 'object' && kenburnsCols.length ) {
for (var j = 0; j < kenburnsCols.length; j++) {
var elm = kenburnsCols[j],
$kenburnsInner = elm.querySelectorAll('.background-inner');
if (checkVisible(elm)) {
classie.addClass($kenburnsInner[0], 'uncode-kburns');
$kenburnsInner[0].dispatchEvent(new CustomEvent('enter-kburns'));
} else {
classie.removeClass($kenburnsInner[0], 'uncode-kburns');
$kenburnsInner[0].dispatchEvent(new CustomEvent('exit-kburns'));
}
}
}
},
/** Zoom Out BackWash **/
backwashHeader = function(bodyTop) {
var value;
var onEndAnimationFn = function(ev){
if (animationEvent) {
if (ev.animationName !== 'backwash') {
return;
}
this.removeEventListener(animationEvent, onEndAnimationFn);
}
classie.addClass(ev.target, 'uncode-zoomout-already');
}
if ( typeof backwashHeaders == 'object' && backwashHeaders.length ) {
for (var i = 0; i < backwashHeaders.length; i++) {
var section = backwashHeaders[i].parentNode,
sectionHeight = outerHeight(section),
offSetTop = bodyTop + (section != null ? (classie.hasClass(section.parentNode.parentNode, 'owl-carousel') ? section.parentNode.parentNode.getBoundingClientRect().top : section.getBoundingClientRect().top) : 0),
offSetPosition = wheight + bodyTop - offSetTop,
$backwashInner = backwashHeaders[i].querySelectorAll('.header-bg');
if ( classie.hasClass($backwashInner[0], 'uncode-video-container') ) {
continue;
}
if (classie.hasClass(backwashHeaders[i], 'header-carousel-wrapper')) {
$backwashInner = backwashHeaders[i].querySelectorAll('.t-background-cover');
}
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
for (var i = 0; i < $backwashInner.length; i++) {
classie.addClass($backwashInner[i], 'uncode-zoomout');
$backwashInner[i].dispatchEvent(new CustomEvent('enter-zoomout'));
}
} else {
for (var i = 0; i < $backwashInner.length; i++) {
classie.removeClass($backwashInner[i], 'uncode-zoomout');
$backwashInner[i].dispatchEvent(new CustomEvent('exit-zoomout'));
}
}
for (var i = 0; i < $backwashInner.length; i++) {
$backwashInner[i].addEventListener(animationEvent, onEndAnimationFn);
}
}
}
},
backwashRowCol = function(bodyTop) {
var value;
var onEndAnimationFn = function(ev){
if (animationEvent) {
if (ev.animationName !== 'backwash') {
return;
}
this.removeEventListener(animationEvent, onEndAnimationFn);
}
classie.addClass(ev.target, 'uncode-zoomout-already');
}
if ( UNCODE.isFrontEndEditor ) {
backwashRows = document.querySelectorAll('.with-zoomout > .row-background > .background-wrapper, .with-zoomout > .fp-tableCell > .row-background > .background-wrapper, .with-zoomout > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
}
if ( typeof backwashRows == 'object' && backwashRows.length ) {
for (var i = 0; i < backwashRows.length; i++) {
var section = backwashRows[i].parentNode,
sectionHeight = outerHeight(section),
offSetTop = bodyTop + (section != null ? (classie.hasClass(section.parentNode.parentNode, 'owl-carousel') ? section.parentNode.parentNode.getBoundingClientRect().top : section.getBoundingClientRect().top) : 0),
offSetPosition = wheight + bodyTop - offSetTop,
$backwashInner = backwashRows[i].querySelectorAll('.background-inner');
if ( classie.hasClass($backwashInner[0], 'uncode-video-container') ) {
continue;
}
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight) ) {
classie.addClass($backwashInner[0], 'uncode-zoomout');
$backwashInner[0].dispatchEvent(new CustomEvent('enter-zoomout'));
} else {
classie.removeClass($backwashInner[0], 'uncode-zoomout');
$backwashInner[0].dispatchEvent(new CustomEvent('exit-zoomout'));
}
$backwashInner[0].addEventListener(animationEvent, onEndAnimationFn);
}
}
if ( UNCODE.isFrontEndEditor ) {
backwashCols = document.querySelectorAll('.with-zoomout > .column-background > .background-wrapper');
}
if ( typeof backwashCols == 'object' && backwashCols.length ) {
for (var j = 0; j < backwashCols.length; j++) {
var elm = backwashCols[j],
$backwashInner = elm.querySelectorAll('.background-inner');
if (checkVisible(elm)) {
classie.addClass($backwashInner[0], 'uncode-zoomout');
$backwashInner[0].dispatchEvent(new CustomEvent('enter-zoomout'));
} else {
classie.removeClass($backwashInner[0], 'uncode-zoomout');
$backwashInner[0].dispatchEvent(new CustomEvent('exit-zoomout'));
}
$backwashInner[0].addEventListener(animationEvent, onEndAnimationFn);
}
}
},
/** Parallax Rows **/
parallaxRowCol = function(bodyTop) {
var value;
if ( UNCODE.isFrontEndEditor ) {
parallaxRows = document.querySelectorAll('.with-parallax > .row-background > .background-wrapper, .with-parallax > .fp-tableCell > .row-background > .background-wrapper, .with-parallax > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
}
if (typeof parallaxRows == 'object') {
for (var i = 0; i < parallaxRows.length; i++) {
var section = parallaxRows[i].parentNode,
thisHeight = outerHeight(parallaxRows[i]),
sectionHeight = outerHeight(section),
offSetTop = bodyTop + (section != null ? (classie.hasClass(section.parentNode.parentNode, 'owl-carousel') ? section.parentNode.parentNode.getBoundingClientRect().top : section.getBoundingClientRect().top) : 0),
offSetPosition = wheight + bodyTop - offSetTop;
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
value = ((offSetPosition - wheight) * speedDivider);
if (Math.abs(value) < (thisHeight - sectionHeight)) {
translateElement(parallaxRows[i], Math.floor(value));
} else {
translateElement(parallaxRows[i], Math.floor(thisHeight - sectionHeight));
}
}
}
}
if ( UNCODE.isFrontEndEditor ) {
parallaxCols = document.querySelectorAll('.with-parallax > .column-background > .background-wrapper');
}
if (typeof parallaxCols == 'object') {
for (var j = 0; j < parallaxCols.length; j++) {
var section = parallaxCols[j].parentNode,
thisHeight = outerHeight(parallaxCols[j]),
sectionHeight = outerHeight(section),
offSetTop = bodyTop + (section != null ? section.getBoundingClientRect().top : 0),
offSetPosition = wheight + bodyTop - offSetTop;
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
value = ((offSetPosition - wheight) * speedDivider);
value *= .8;
if (Math.abs(value) < (thisHeight - sectionHeight)) {
translateElement(parallaxCols[j], Math.floor(value));
} else {
translateElement(parallaxCols[j], Math.floor(thisHeight - sectionHeight));
}
}
}
}
},
/** Parallax Headers **/
parallaxHeader = function(bodyTop) {
var value;
if (typeof parallaxHeaders == 'object') {
for (var i = 0; i < parallaxHeaders.length; i++) {
var section = parallaxHeaders[i].parentNode,
thisSibling = section.nextSibling,
thisHeight,
sectionHeight,
offSetTop,
offSetPosition;
if (classie.hasClass(parallaxHeaders[i], 'header-carousel-wrapper')) {
getDivChildren(parallaxHeaders[i], '.t-entry-visual-cont', function(item, l, total) {
thisHeight = outerHeight(item);
sectionHeight = outerHeight(section);
offSetTop = bodyTop + section.getBoundingClientRect().top;
offSetPosition = wheight + bodyTop - offSetTop;
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
value = ((offSetPosition - wheight) * speedDivider);
if (Math.abs(value) < (thisHeight - sectionHeight)) {
translateElement(item, Math.floor(value));
}
}
});
} else {
thisHeight = outerHeight(parallaxHeaders[i]);
sectionHeight = outerHeight(section);
offSetTop = bodyTop + section.getBoundingClientRect().top;
offSetPosition = wheight + bodyTop - offSetTop;
if (offSetPosition > 0 && offSetPosition < (sectionHeight + wheight)) {
value = ((offSetPosition - wheight) * speedDivider);
if (Math.abs(value) < (thisHeight - sectionHeight)) {
translateElement(parallaxHeaders[i], Math.floor(value));
}
}
}
}
}
},
/** Header opacity **/
headerOpacity = function(bodyTop) {
if ( UNCODE.isFrontEndEditor ) {
return;
}
if (headerWithOpacity && headerWithOpacity.length) {
var thisHeight = outerHeight(headerWithOpacity[0]);
if (bodyTop > thisHeight / 8) {
if (pageHeader != undefined) classie.addClass(pageHeader, 'header-scrolled');
} else {
if (pageHeader != undefined) classie.removeClass(pageHeader, 'header-scrolled');
}
}
},
/** Show hide scroll top arrow **/
showHideScrollup = function(bodyTop) {
if ( bodyTop != 0 ) {
if (bodyTop > wheight || ((bodyTop + wheight) >= docheight) && docheight > 0) {
classie.addClass(document.body, 'window-scrolled');
classie.removeClass(document.body, 'hide-scrollup');
if (footerScroller && footerScroller[0] != undefined) {
footerScroller[0].style.display = '';
}
} else {
if (classie.hasClass(document.body, 'window-scrolled')) classie.addClass(document.body, 'hide-scrollup');
classie.removeClass(document.body, 'window-scrolled');
}
}
},
/** Fix menu **/
fixMenu = function(){
if ( UNCODE.isFrontEndEditor )
return;
menuwrapper = document.querySelectorAll(".menu-wrapper");
if ( ! classie.hasClass(document.body, 'vmenu') && UNCODE.isFullPage && !UNCODE.isFullPageSnap && classie.hasClass(document.body, 'uncode-fp-menu-hide') ) {
menuwrapper = document.querySelector(".menu-wrapper");
pageHeader = document.getElementById("page-header");
menuwrapper.style.position = 'fixed';
menuwrapper.style.zIndex = '5';
}
},
/** Hide Menu **/
hideMenu = function(bodyTop) {
if ( UNCODE.isFrontEndEditor )
return;
if (UNCODE.menuOpened || bodyTop < 0) return;
if (classie.hasClass(document.body, 'vmenu')) {
if (wwidth < mediaQuery) menuhide = document.querySelector('#masthead .menu-hide-vertical');
else menuhide = null;
}
if (classie.hasClass(document.body, 'hmenu-center')) {
if (wwidth > mediaQuery) menuhide = document.querySelector('#masthead .menu-hide');
else menuhide = document.querySelector('.menu-container-mobile.menu-hide');
}
if (typeof menuhide == 'object' && menuhide != null && mainmenu[0] != undefined) {
var translate,
scrollingDown = true;
/** fix for hmenu-center **/
var sticky_element = (typeof mainmenu.item === 'undefined' ? ((wwidth > mediaQuery) ? mainmenu[0] : mainmenu[1]) : mainmenu[0]);
if (lastScrollValue == bodyTop) return;
if (lastScrollValue > bodyTop) scrollingDown = false;
else scrollingDown = true;
lastScrollValue = bodyTop;
if (!scrollingDown) {
if (!UNCODE.scrolling) {
if ((secmenuHeight == 0) ? bodyTop == 0 : bodyTop < secmenuHeight) {
classie.removeClass(sticky_element.parentNode, 'is_stuck');
if (classie.hasClass(masthead, 'menu-transparent')) {
if ((isMobileTransparent || wwidth > mediaQuery) && !classie.hasClass(masthead.parentNode, 'no-header')) masthead.parentNode.style.height = '0px';
}
if (wwidth < mediaQuery) sticky_element.style.position = 'fixed';
else sticky_element.style.position = '';
hideMenuReset(sticky_element);
clearTimeout(hidingTimer);
}
if (classie.hasClass(menuhide, 'menu-hided')) {
classie.removeClass(menuhide, 'menu-hided');
hidingTimer = setTimeout(function() {
classie.addClass(sticky_element.parentNode, 'is_stuck');
hideMenuReset(sticky_element);
}, 400);
}
}
} else {
if (menusticky.length == 0 && bodyTop < wheight / 3) {
if (sticky_element.style.position == 'fixed') sticky_element.style.position = '';
}
if (bodyTop > wheight / 2) {
clearTimeout(hidingTimer);
if (!classie.hasClass(menuhide, 'menu-hided')) {
classie.addClass(menuhide, 'menu-hided');
classie.addClass(sticky_element.parentNode, 'is_stuck');
if (sticky_element.style.position != 'fixed') {
sticky_element.style.visibility = 'hidden';
sticky_element.style.position = 'fixed';
sticky_element.style.top = '0px';
}
translateElement(menuhide, -UNCODE.menuMobileHeight - 1);
}
}
}
}
},
hideMenuReset = function(sticky_element) {
var topOffset = 0;
if (sticky_element.style.visibility == 'hidden') sticky_element.style.visibility = '';
if (bodyBorder > 0) topOffset += bodyBorder;
if (adminBar != null && window.getComputedStyle(adminBar,null).getPropertyValue("position") != 'fixed') adminBarHeight = 0;
if (adminBarHeight > 0) topOffset += adminBarHeight;
//sticky_element.style.top = topOffset + 'px';
if (!classie.hasClass(document.body, 'boxed-width') && boxWidth > 0) sticky_element.style.width = boxWidth + 'px';
translateElement(menuhide, 0);
},
/** Stick Menu **/
stickMenu = function(bodyTop) {
if (header && mainmenu[0] != undefined) {
if (classie.hasClass(mainmenu[0], 'vmenu-container') && wwidth > mediaQuery) return;
/** fix for hmenu-center **/
var sticky_element = (typeof mainmenu.item === 'undefined' ? ((isMobileTransparent || wwidth > mediaQuery) ? mainmenu[0] : mainmenu[1]) : mainmenu[0]);
if ((secmenuHeight == 0 && (isMobileTransparent || wwidth > mediaQuery)) ? bodyTop > (0 + adminBarHeight) : bodyTop > (secmenuHeight + adminBarHeight)) {
if (!classie.hasClass(sticky_element.parentNode, 'is_stuck')) {
classie.addClass(sticky_element.parentNode, 'is_stuck');
sticky_element.style.position = 'fixed';
var getAnchorTop = bodyBorder;
if (adminBar != null && window.getComputedStyle(adminBar,null).getPropertyValue("position") != 'fixed') adminBarHeight = 0;
if (adminBarHeight > 0) getAnchorTop += adminBarHeight;
sticky_element.style.top = getAnchorTop + 'px';
if (!classie.hasClass(document.body, 'boxed-width') && boxWidth > 0) sticky_element.style.width = boxWidth + 'px';
}
} else {
clearTimeout(hidingTimer);
classie.removeClass(sticky_element.parentNode, 'is_stuck');
sticky_element.style.position = 'fixed';
if (isMobileTransparent || wwidth > mediaQuery) sticky_element.style.position = '';
if (classie.hasClass(document.body, 'hmenu-center')) sticky_element.style.position = 'absolute';
sticky_element.style.top = '';
}
}
},
translateElement = function(element, valueY) {
var translate = 'translate3d(0, ' + valueY + 'px' + ', 0)';
element.style['-webkit-transform'] = translate;
element.style['-moz-transform'] = translate;
element.style['-ms-transform'] = translate;
element.style['-o-transform'] = translate;
element.style['transform'] = translate;
},
setScrollPosition,
scrollFunction = function() {
if ( ! UNCODE.isFullPage ) {
kenburnsHeader(bodyTop);
kenburnsRowCol(bodyTop);
backwashHeader(bodyTop);
backwashRowCol(bodyTop);
if (logoel != undefined && logoel.length && !isMobile) shrinkMenu(bodyTop);
if (menusticky != undefined && menusticky.length) stickMenu(bodyTop);
hideMenu(bodyTop);
if (isMobileParallaxAllowed || !isMobile) {
if (header && menusticky != undefined && menusticky.length)
switchColorsMenu(bodyTop);
parallaxRowCol(bodyTop);
parallaxHeader(bodyTop);
headerOpacity(bodyTop);
visibleRowCol(bodyTop);
}
clearRequestTimeout(setScrollPosition);
setScrollPosition = requestTimeout( function(){
scrollRowHeight_fix = window.pageYOffset;
}, 100 );
}
},
/** Shape Dividers **/
shapeDivider = function() {
var $shape = '.uncode-divider-wrap';
forEachElement($shape, function($el, i) {
var elH = parseInt( $el.getAttribute('data-height') ),
elHunit = $el.getAttribute('data-unit'),
newEl,
$parent = $el.parentNode,
parentH,
$svg = $el.getElementsByTagName('svg')[0];
if ( elHunit == 'px' ) {
switch (true) {
case (wwidth < 1500 && wwidth >= 1180):
newEl = elH*0.8;
break;
case (wwidth < 1180 && wwidth >= 960):
newEl = elH*0.65;
break;
case (wwidth < 960 && wwidth >= 570):
newEl = elH*0.5;
break;
case (wwidth < 570):
newEl = elH*0.25;
break;
default:
newEl = elH;
}
$el.style.height = newEl + elHunit;
}
if ( classie.hasClass($el, 'uncode-divider-preserve-ratio') && ( window.navigator.userAgent.indexOf('MSIE ') !== -1 || window.navigator.userAgent.indexOf('Trident/') !== -1 ) ) {
$svg.setAttribute('preserveAspectRatio','none');
var sizes = $svg.getAttribute('viewBox').split(' '),
svgW = sizes[2],
svgH = sizes[3],
newSvgW;
newSvgW = newEl * ( svgW / svgH );
$svg.style.width = newSvgW + 'px';
}
});
};
if (!noScroll && document.body == null) {
window.addEventListener('scroll', function(e) {
if ( ! UNCODE.isFullPage ) {
bodyTop = document.documentElement.scrollTop || document.body.scrollTop;
scrollFunction();
showHideScrollup(bodyTop);
}
}, false);
}
/** All scrolling functions - End */
/** help functions */
function getClosest(el, tag) {
do {
if (el.className != undefined && el.className.indexOf(tag) > -1) return el;
} while (el = el.parentNode);
// not found :(
return null;
}
function outerHeight(el, includeMargin) {
if (el != null) {
var height = el.offsetHeight;
if (includeMargin) {
var style = el.currentStyle || getComputedStyle(el);
height += parseInt(style.marginTop) + parseInt(style.marginBottom);
}
return height;
}
}
function outerWidth(el, includeMargin) {
var width = el.offsetWidth;
if (includeMargin) {
var style = el.currentStyle || getComputedStyle(el);
width += parseInt(style.marginLeft) + parseInt(style.marginRight);
}
return width;
}
// Replicate jQuery .each method
function forEachElement(selector, fn) {
var elements = document.querySelectorAll(selector);
for (var i = 0; i < elements.length; i++) fn(elements[i], i);
}
function getDivChildren(containerId, selector, fn) {
if (containerId !== null) {
var elements = containerId.querySelectorAll(selector);
for (var i = 0; i < elements.length; i++) fn(elements[i], i, elements.length);
}
}
function hideFooterScroll() {
if (classie.hasClass(document.body, 'hide-scrollup')) footerScroller[0].style.display = "none";
}
document.addEventListener("DOMContentLoaded", function(event) {
UNCODE.adaptive();
boxWrapper = document.querySelectorAll('.box-wrapper');
docheight = boxWrapper[0] != undefined ? boxWrapper[0].offsetHeight : 0;
if (!classie.hasClass(document.body, 'vmenu') && !classie.hasClass(document.body, 'menu-offcanvas')) init_overlay();
kenburnsRows = document.querySelectorAll('.with-kburns > .row-background > .background-wrapper, .with-kburns > .fp-tableCell > .row-background > .background-wrapper, .with-kburns > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
kenburnsCols = document.querySelectorAll('.with-kburns > .column-background > .background-wrapper');
backwashRows = document.querySelectorAll('.with-zoomout > .row-background > .background-wrapper, .with-zoomout > .fp-tableCell > .row-background > .background-wrapper, .with-zoomout > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
backwashCols = document.querySelectorAll('.with-zoomout > .column-background > .background-wrapper');
if (!UNCODE.isMobile || isMobileParallaxAllowed) {
parallaxRows = document.querySelectorAll('.with-parallax > .row-background > .background-wrapper, .with-parallax > .fp-tableCell > .row-background > .background-wrapper, .with-parallax > .fp-tableCell > .fp-scrollable > .fp-scroller > .row-background > .background-wrapper');
parallaxCols = document.querySelectorAll('.with-parallax > .column-background > .background-wrapper');
}
footerScroller = document.querySelectorAll('.footer-scroll-top');
if (footerScroller && footerScroller[0] != undefined) {
if (transitionEvent) {
footerScroller[0].addEventListener(transitionEvent, hideFooterScroll);
}
}
Array.prototype.forEach.call(document.querySelectorAll('.row-inner'), function(el) {
el.style.height = '';
el.style.marginBottom = '';
});
setRowHeight(document.querySelectorAll('.page-wrapper .row-parent, footer .row-parent'));
});
/** On resize events **/
window.addEventListener("vc-resize", function() {
scrollRowHeight_fix = window.pageYOffset;
Array.prototype.forEach.call(document.querySelectorAll('.row-inner'), function(el) {
el.style.height = '';
el.style.marginBottom = '';
});
setRowHeight(document.querySelectorAll('.page-wrapper .row-parent, footer .row-parent'), false, true);
});
window.addEventListener("resize", function() {
scrollRowHeight_fix = window.pageYOffset;
docheight = (boxWrapper != undefined && boxWrapper[0] != undefined) ? boxWrapper[0].offsetHeight : 0;
var oldWidth = wwidth;
UNCODE.wwidth = wwidth = window.innerWidth || document.documentElement.clientWidth;
UNCODE.wheight = wheight = (window.innerHeight || document.documentElement.clientHeight) - (bodyBorder * 2);
if ( isSplitMenu && typeof resizeTimer_ === 'undefined' ) centerSplitMenu();
if (isMobile && (oldWidth == wwidth)) return false;
calculateMenuHeight(false);
initBox();
headerHeight('.header-wrapper');
window.dispatchEvent(boxEvent);
scrollFunction();
shapeDivider();
showHideScrollup(bodyTop);
clearTimeout(resizeTimer_);
resizeTimer_ = setTimeout(function() {
if (isSplitMenu) centerSplitMenu();
}, 10);
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
UNCODE.wheight = wheight = (window.innerHeight || document.documentElement.clientHeight) - (bodyBorder * 2);
Array.prototype.forEach.call(document.querySelectorAll('.row-inner'), function(el) {
el.style.height = '';
el.style.marginBottom = '';
});
setRowHeight(document.querySelectorAll('.page-wrapper .row-parent, footer .row-parent'), false, true);
if (!isMobile) {
initVideoComponent(document.body, '.uncode-video-container.video, .uncode-video-container.self-video');
}
}, 500);
});
/**
* On DOM ready
*/
window.addEventListener("load", function(){
if (!UNCODE.isMobile) {
setTimeout(function() {
window.dispatchEvent(UNCODE.boxEvent);
Waypoint.refreshAll();
}, 2000);
}
//repeat it for mobile since it changes layout on carousel after DOM loading
if (UNCODE.isMobile && !isMobileParallaxAllowed) {
kenburnsHeader(bodyTop);
kenburnsRowCol(bodyTop);
}
backwashHeader(bodyTop);
backwashRowCol(bodyTop);
showHideScrollup(bodyTop);
if (document.createEvent) { // W3C
var ev = document.createEvent('Event');
ev.initEvent('resize', true, true);
window.dispatchEvent(ev);
} else { // IE
document.fireEvent('onresize');
}
}, false);
var UNCODE = {
bodyTop: bodyTop,
boxEvent: boxEvent,
bodyBorder: bodyBorder,
initBox: initBox,
adminBarHeight: 0,
menuHeight: 0,
menuMobileHeight: 0,
fixMenuHeight: fixMenuHeight,
initHeader: initHeader,
initRow: initRow,
setRowHeight: setRowHeight,
switchColorsMenu: switchColorsMenu,
isMobile: isMobile,
scrolling: false,
menuHiding: false,
menuOpened: false,
menuMobileTriggerEvent: menuMobileTriggerEvent,
mediaQuery: mediaQuery,
initVideoComponent: initVideoComponent,
hideMenu: hideMenu,
wwidth: wwidth,
wheight: wheight,
};
// transport
if (typeof define === 'function' && define.amd) {
// AMD
define(UNCODE);
} else {
// browser global
window.UNCODE = UNCODE;
}
UNCODE.adaptive = function() {
var images = new Array(),
getImages = document.querySelectorAll('.adaptive-async:not(.adaptive-fetching)');
for (var i = 0; i < getImages.length; i++) {
var imageObj = {},
el = getImages[i];
classie.addClass(el, 'adaptive-fetching');
imageObj.unique = el.getAttribute('data-uniqueid');
imageObj.url = el.getAttribute('data-guid');
imageObj.path = el.getAttribute('data-path');
imageObj.singlew = el.getAttribute('data-singlew');
imageObj.singleh = el.getAttribute('data-singleh');
imageObj.origwidth = el.getAttribute('data-width');
imageObj.origheight = el.getAttribute('data-height');
imageObj.crop = el.getAttribute('data-crop');
imageObj.fixed = el.getAttribute('data-fixed') == undefined ? null : el.getAttribute('data-fixed');
imageObj.screen = window.uncodeScreen;
imageObj.images = window.uncodeImages;
images.push(imageObj);
}
var post_data = {
images: JSON.stringify(images),
action: 'get_adaptive_async',
nonce_adaptive_images: SiteParameters.nonce_adaptive_images
};
if (images.length > 0) {
var xhr = new XMLHttpRequest();
xhr.open('POST', SiteParameters.ajax_url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status == 200 && xhr.responseText) {
var jsonResponse = JSON.parse(xhr.responseText);
if (jsonResponse.success && jsonResponse.data.images) {
var images = jsonResponse.data.images;
for (var i = 0; i < images.length; i++) {
var val = images[i],
getImage = document.querySelectorAll('[data-uniqueid="'+val.unique+'"]');
for (var j = 0; j < getImage.length; j++) {
var attrScr = getImage[j].getAttribute('src'),
replaceImg = new Image();
replaceImg.source = attrScr;
replaceImg.el = getImage[j];
classie.removeClass(getImage[j], 'adaptive-async');
classie.removeClass(getImage[j], 'adaptive-fetching');
replaceImg.onload = function () {
var _this = this,
parentNode = (_this.el).parentNode,
placeH;
//Workaround for lazy-load flickering on Firefox
if ( typeof parentNode.prepend == 'undefined') {
if (_this.source !== null) {
(_this.el).src = _this.src;
} else {
(_this.el).style.backgroundImage = 'url("'+_this.src+'")';
}
classie.addClass(_this.el, 'async-done');
} else {
if (_this.source !== null) {
placeH = document.createElement("IMG");
placeH.setAttribute('class', 'placeH');
placeH.src = _this.src;
placeH.style.position = 'absolute';
placeH.style.opacity = '0';
} else {
placeH = document.createElement("DIV");
placeH.setAttribute('style', _this.el.getAttribute('style'));
placeH.setAttribute('class', 'placeH ' + _this.el.getAttribute('class'));
placeH.style.backgroundImage = 'url("'+_this.src+'")';
placeH.style.backgroundSize = 'cover';
placeH.style.backgroundPosition = 'center';
placeH.style.position = 'absolute';
placeH.style.top = '0';
placeH.style.width = '100%';
placeH.style.height = '100%';
}
if ( !classie.hasClass( _this.el, 'box-wrapper') ) {
parentNode.prepend(placeH);
}
requestTimeout(function(){
if (_this.source !== null) {
(_this.el).src = _this.src;
} else {
(_this.el).style.backgroundImage = 'url("'+_this.src+'")';
}
if ( !classie.hasClass( _this.el, 'box-wrapper') ) {
parentNode.removeChild(placeH);
}
classie.addClass(_this.el, 'async-done');
}, 250);
}
}
replaceImg.src = val.url;
}
}
} else {
if (SiteParameters.enable_debug == true) {
// This console log is disabled by default
// So nothing is printed in a typical installation
//
// It can be enabled for debugging purposes setting
// the 'uncode_enable_debug_on_js_scripts' filter to true
console.log('There was an error: bad response');
}
}
} else if (xhr.status == 400) {
if (SiteParameters.enable_debug == true) {
// This console log is disabled by default
// So nothing is printed in a typical installation
//
// It can be enabled for debugging purposes setting
// the 'uncode_enable_debug_on_js_scripts' filter to true
console.log('There was an error 400');
}
} else {
if (SiteParameters.enable_debug == true) {
// This console log is disabled by default
// So nothing is printed in a typical installation
//
// It can be enabled for debugging purposes setting
// the 'uncode_enable_debug_on_js_scripts' filter to true
console.log('Something else other than 200 was returned');
}
}
}
}
// Serialize our data
var queryString = "",
arrayLength = Object.keys(post_data).length,
arrayCounter = 0;
for (var key in post_data) {
queryString += key + "=" + post_data[key];
if (arrayCounter < arrayLength - 1) {
queryString += "&";
}
arrayCounter++;
}
xhr.send(queryString);
}
};
})(window);
/**
* vivus - JavaScript library to make drawing animation on SVG
* @version v0.4.4
* @link https://github.com/maxwellito/vivus
* @license MIT
*/
'use strict';
(function () {
'use strict';
/**
* Pathformer
* Beta version
*
* Take any SVG version 1.1 and transform
* child elements to 'path' elements
*
* This code is purely forked from
* https://github.com/Waest/SVGPathConverter
*/
/**
* Class constructor
*
* @param {DOM|String} element Dom element of the SVG or id of it
*/
function Pathformer(element) {
// Test params
if (typeof element === 'undefined') {
throw new Error('Pathformer [constructor]: "element" parameter is required');
}
// Set the element
if (element.constructor === String) {
element = document.getElementById(element);
if (!element) {
throw new Error('Pathformer [constructor]: "element" parameter is not related to an existing ID');
}
}
if (element instanceof window.SVGElement ||
element instanceof window.SVGGElement ||
/^svg$/i.test(element.nodeName)) {
this.el = element;
} else {
throw new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement');
}
// Start
this.scan(element);
}
/**
* List of tags which can be transformed
* to path elements
*
* @type {Array}
*/
Pathformer.prototype.TYPES = ['line', 'ellipse', 'circle', 'polygon', 'polyline', 'rect'];
/**
* List of attribute names which contain
* data. This array list them to check if
* they contain bad values, like percentage.
*
* @type {Array}
*/
Pathformer.prototype.ATTR_WATCH = ['cx', 'cy', 'points', 'r', 'rx', 'ry', 'x', 'x1', 'x2', 'y', 'y1', 'y2'];
/**
* Finds the elements compatible for transform
* and apply the liked method
*
* @param {object} options Object from the constructor
*/
Pathformer.prototype.scan = function (svg) {
var fn, element, pathData, pathDom,
elements = svg.querySelectorAll(this.TYPES.join(','));
for (var i = 0; i < elements.length; i++) {
element = elements[i];
fn = this[element.tagName.toLowerCase() + 'ToPath'];
pathData = fn(this.parseAttr(element.attributes));
pathDom = this.pathMaker(element, pathData);
element.parentNode.replaceChild(pathDom, element);
}
};
/**
* Read `line` element to extract and transform
* data, to make it ready for a `path` object.
*
* @param {DOMelement} element Line element to transform
* @return {object} Data for a `path` element
*/
Pathformer.prototype.lineToPath = function (element) {
var newElement = {},
x1 = element.x1 || 0,
y1 = element.y1 || 0,
x2 = element.x2 || 0,
y2 = element.y2 || 0;
newElement.d = 'M' + x1 + ',' + y1 + 'L' + x2 + ',' + y2;
return newElement;
};
/**
* Read `rect` element to extract and transform
* data, to make it ready for a `path` object.
* The radius-border is not taken in charge yet.
* (your help is more than welcomed)
*
* @param {DOMelement} element Rect element to transform
* @return {object} Data for a `path` element
*/
Pathformer.prototype.rectToPath = function (element) {
var newElement = {},
x = parseFloat(element.x) || 0,
y = parseFloat(element.y) || 0,
width = parseFloat(element.width) || 0,
height = parseFloat(element.height) || 0;
if (element.rx || element.ry) {
var rx = parseInt(element.rx, 10) || -1,
ry = parseInt(element.ry, 10) || -1;
rx = Math.min(Math.max(rx < 0 ? ry : rx, 0), width/2);
ry = Math.min(Math.max(ry < 0 ? rx : ry, 0), height/2);
newElement.d = 'M ' + (x + rx) + ',' + y + ' ' +
'L ' + (x + width - rx) + ',' + y + ' ' +
'A ' + rx + ',' + ry + ',0,0,1,' + (x + width) + ',' + (y + ry) + ' ' +
'L ' + (x + width) + ',' + (y + height - ry) + ' ' +
'A ' + rx + ',' + ry + ',0,0,1,' + (x + width - rx) + ',' + (y + height) + ' ' +
'L ' + (x + rx) + ',' + (y + height) + ' ' +
'A ' + rx + ',' + ry + ',0,0,1,' + x + ',' + (y + height - ry) + ' ' +
'L ' + x + ',' + (y + ry) + ' ' +
'A ' + rx + ',' + ry + ',0,0,1,' + (x + rx) + ',' + y;
}
else {
newElement.d = 'M' + x + ' ' + y + ' ' +
'L' + (x + width) + ' ' + y + ' ' +
'L' + (x + width) + ' ' + (y + height) + ' ' +
'L' + x + ' ' + (y + height) + ' Z';
}
return newElement;
};
/**
* Read `polyline` element to extract and transform
* data, to make it ready for a `path` object.
*
* @param {DOMelement} element Polyline element to transform
* @return {object} Data for a `path` element
*/
Pathformer.prototype.polylineToPath = function (element) {
var newElement = {},
points = element.points.trim().split(' '),
i, path;
// Reformatting if points are defined without commas
if (element.points.indexOf(',') === -1) {
var formattedPoints = [];
for (i = 0; i < points.length; i+=2) {
formattedPoints.push(points[i] + ',' + points[i+1]);
}
points = formattedPoints;
}
// Generate the path.d value
path = 'M' + points[0];
for(i = 1; i < points.length; i++) {
if (points[i].indexOf(',') !== -1) {
path += 'L' + points[i];
}
}
newElement.d = path;
return newElement;
};
/**
* Read `polygon` element to extract and transform
* data, to make it ready for a `path` object.
* This method rely on polylineToPath, because the
* logic is similar. The path created is just closed,
* so it needs an 'Z' at the end.
*
* @param {DOMelement} element Polygon element to transform
* @return {object} Data for a `path` element
*/
Pathformer.prototype.polygonToPath = function (element) {
var newElement = Pathformer.prototype.polylineToPath(element);
newElement.d += 'Z';
return newElement;
};
/**
* Read `ellipse` element to extract and transform
* data, to make it ready for a `path` object.
*
* @param {DOMelement} element ellipse element to transform
* @return {object} Data for a `path` element
*/
Pathformer.prototype.ellipseToPath = function (element) {
var newElement = {},
rx = parseFloat(element.rx) || 0,
ry = parseFloat(element.ry) || 0,
cx = parseFloat(element.cx) || 0,
cy = parseFloat(element.cy) || 0,
startX = cx - rx,
startY = cy,
endX = parseFloat(cx) + parseFloat(rx),
endY = cy;
newElement.d = 'M' + startX + ',' + startY +
'A' + rx + ',' + ry + ' 0,1,1 ' + endX + ',' + endY +
'A' + rx + ',' + ry + ' 0,1,1 ' + startX + ',' + endY;
return newElement;
};
/**
* Read `circle` element to extract and transform
* data, to make it ready for a `path` object.
*
* @param {DOMelement} element Circle element to transform
* @return {object} Data for a `path` element
*/
Pathformer.prototype.circleToPath = function (element) {
var newElement = {},
r = parseFloat(element.r) || 0,
cx = parseFloat(element.cx) || 0,
cy = parseFloat(element.cy) || 0,
startX = cx - r,
startY = cy,
endX = parseFloat(cx) + parseFloat(r),
endY = cy;
newElement.d = 'M' + startX + ',' + startY +
'A' + r + ',' + r + ' 0,1,1 ' + endX + ',' + endY +
'A' + r + ',' + r + ' 0,1,1 ' + startX + ',' + endY;
return newElement;
};
/**
* Create `path` elements form original element
* and prepared objects
*
* @param {DOMelement} element Original element to transform
* @param {object} pathData Path data (from `toPath` methods)
* @return {DOMelement} Path element
*/
Pathformer.prototype.pathMaker = function (element, pathData) {
var i, attr, pathTag = document.createElementNS('http://www.w3.org/2000/svg','path');
for(i = 0; i < element.attributes.length; i++) {
attr = element.attributes[i];
if (this.ATTR_WATCH.indexOf(attr.name) === -1) {
pathTag.setAttribute(attr.name, attr.value);
}
}
for(i in pathData) {
pathTag.setAttribute(i, pathData[i]);
}
return pathTag;
};
/**
* Parse attributes of a DOM element to
* get an object of attribute => value
*
* @param {NamedNodeMap} attributes Attributes object from DOM element to parse
* @return {object} Object of attributes
*/
Pathformer.prototype.parseAttr = function (element) {
var attr, output = {};
for (var i = 0; i < element.length; i++) {
attr = element[i];
// Check if no data attribute contains '%', or the transformation is impossible
if (this.ATTR_WATCH.indexOf(attr.name) !== -1 && attr.value.indexOf('%') !== -1) {
throw new Error('Pathformer [parseAttr]: a SVG shape got values in percentage. This cannot be transformed into \'path\' tags. Please use \'viewBox\'.');
}
output[attr.name] = attr.value;
}
return output;
};
'use strict';
var setupEnv, requestAnimFrame, cancelAnimFrame, parsePositiveInt;
/**
* Vivus
* Beta version
*
* Take any SVG and make the animation
* to give give the impression of live drawing
*
* This in more than just inspired from codrops
* At that point, it's a pure fork.
*/
/**
* Class constructor
* option structure
* type: 'delayed'|'sync'|'oneByOne'|'script' (to know if the items must be drawn synchronously or not, default: delayed)
* duration: <int> (in frames)
* start: 'inViewport'|'manual'|'autostart' (start automatically the animation, default: inViewport)
* delay: <int> (delay between the drawing of first and last path)
* dashGap <integer> whitespace extra margin between dashes
* pathTimingFunction <function> timing animation function for each path element of the SVG
* animTimingFunction <function> timing animation function for the complete SVG
* forceRender <boolean> force the browser to re-render all updated path items
* selfDestroy <boolean> removes all extra styling on the SVG, and leaves it as original
*
* The attribute 'type' is by default on 'delayed'.
* - 'delayed'
* all paths are draw at the same time but with a
* little delay between them before start
* - 'sync'
* all path are start and finish at the same time
* - 'oneByOne'
* only one path is draw at the time
* the end of the first one will trigger the draw
* of the next one
*
* All these values can be overwritten individually
* for each path item in the SVG
* The value of frames will always take the advantage of
* the duration value.
* If you fail somewhere, an error will be thrown.
* Good luck.
*
* @constructor
* @this {Vivus}
* @param {DOM|String} element Dom element of the SVG or id of it
* @param {Object} options Options about the animation
* @param {Function} callback Callback for the end of the animation
*/
function Vivus (element, options, callback) {
setupEnv();
// Setup
this.isReady = false;
this.setElement(element, options);
this.setOptions(options);
this.setCallback(callback);
if (this.isReady) {
this.init();
}
}
/**
* Timing functions
**************************************
*
* Default functions to help developers.
* It always take a number as parameter (between 0 to 1) then
* return a number (between 0 and 1)
*/
Vivus.LINEAR = function (x) {return x;};
Vivus.EASE = function (x) {return -Math.cos(x * Math.PI) / 2 + 0.5;};
Vivus.EASE_OUT = function (x) {return 1 - Math.pow(1-x, 3);};
Vivus.EASE_IN = function (x) {return Math.pow(x, 3);};
Vivus.EASE_OUT_BOUNCE = function (x) {
var base = -Math.cos(x * (0.5 * Math.PI)) + 1,
rate = Math.pow(base,1.5),
rateR = Math.pow(1 - x, 2),
progress = -Math.abs(Math.cos(rate * (2.5 * Math.PI) )) + 1;
return (1- rateR) + (progress * rateR);
};
/**
* Setters
**************************************
*/
/**
* Check and set the element in the instance
* The method will not return anything, but will throw an
* error if the parameter is invalid
*
* @param {DOM|String} element SVG Dom element or id of it
*/
Vivus.prototype.setElement = function (element, options) {
var onLoad, self;
// Basic check
if (typeof element === 'undefined') {
throw new Error('Vivus [constructor]: "element" parameter is required');
}
// Set the element
if (element.constructor === String) {
element = document.getElementById(element);
if (!element) {
throw new Error('Vivus [constructor]: "element" parameter is not related to an existing ID');
}
}
this.parentEl = element;
// Load the SVG with XMLHttpRequest and extract the SVG
if (options && options.file) {
var self = this;
onLoad = function (e) {
var domSandbox = document.createElement('div');
domSandbox.innerHTML = this.responseText;
var svgTag = domSandbox.querySelector('svg');
if (!svgTag) {
throw new Error('Vivus [load]: Cannot find the SVG in the loaded file : ' + options.file);
}
self.el = svgTag
self.el.setAttribute('width', '100%');
self.el.setAttribute('height', '100%');
self.parentEl.appendChild(self.el)
self.isReady = true;
self.init();
self = null;
}
var oReq = new window.XMLHttpRequest();
oReq.addEventListener('load', onLoad);
oReq.open('GET', options.file);
oReq.send();
return;
}
switch (element.constructor) {
case window.SVGSVGElement:
case window.SVGElement:
case window.SVGGElement:
this.el = element;
this.isReady = true;
break;
case window.HTMLObjectElement:
self = this;
onLoad = function (e) {
if (self.isReady) {
return;
}
self.el = element.contentDocument && element.contentDocument.querySelector('svg');
if (!self.el && e) {
throw new Error('Vivus [constructor]: object loaded does not contain any SVG');
}
else if (self.el) {
if (element.getAttribute('built-by-vivus')) {
self.parentEl.insertBefore(self.el, element);
self.parentEl.removeChild(element);
self.el.setAttribute('width', '100%');
self.el.setAttribute('height', '100%');
}
self.isReady = true;
self.init();
self = null;
}
};
if (!onLoad()) {
element.addEventListener('load', onLoad);
}
break;
default:
throw new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)');
}
};
/**
* Set up user option to the instance
* The method will not return anything, but will throw an
* error if the parameter is invalid
*
* @param {object} options Object from the constructor
*/
Vivus.prototype.setOptions = function (options) {
var allowedTypes = ['delayed', 'sync', 'async', 'nsync', 'oneByOne', 'scenario', 'scenario-sync'];
var allowedStarts = ['inViewport', 'manual', 'autostart'];
// Basic check
if (options !== undefined && options.constructor !== Object) {
throw new Error('Vivus [constructor]: "options" parameter must be an object');
}
else {
options = options || {};
}
// Set the animation type
if (options.type && allowedTypes.indexOf(options.type) === -1) {
throw new Error('Vivus [constructor]: ' + options.type + ' is not an existing animation `type`');
}
else {
this.type = options.type || allowedTypes[0];
}
// Set the start type
if (options.start && allowedStarts.indexOf(options.start) === -1) {
throw new Error('Vivus [constructor]: ' + options.start + ' is not an existing `start` option');
}
else {
this.start = options.start || allowedStarts[0];
}
this.isIE = (window.navigator.userAgent.indexOf('MSIE') !== -1 || window.navigator.userAgent.indexOf('Trident/') !== -1 || window.navigator.userAgent.indexOf('Edge/') !== -1 );
this.duration = parsePositiveInt(options.duration, 120);
this.delay = parsePositiveInt(options.delay, null);
//Uncode addition
this.delayStart = parsePositiveInt(options.delayStart, null);
//#END
this.dashGap = parsePositiveInt(options.dashGap, 1);
this.forceRender = options.hasOwnProperty('forceRender') ? !!options.forceRender : this.isIE;
this.reverseStack = !!options.reverseStack;
this.selfDestroy = !!options.selfDestroy;
this.onReady = options.onReady;
this.map = [];
this.frameLength = this.currentFrame = this.delayUnit = this.speed = this.handle = null;
this.ignoreInvisible = options.hasOwnProperty('ignoreInvisible') ? !!options.ignoreInvisible : false;
this.animTimingFunction = options.animTimingFunction || Vivus.LINEAR;
this.pathTimingFunction = options.pathTimingFunction || Vivus.LINEAR;
if (this.delay >= this.duration) {
throw new Error('Vivus [constructor]: delay must be shorter than duration');
}
};
/**
* Set up callback to the instance
* The method will not return enything, but will throw an
* error if the parameter is invalid
*
* @param {Function} callback Callback for the animation end
*/
Vivus.prototype.setCallback = function (callback) {
// Basic check
if (!!callback && callback.constructor !== Function) {
throw new Error('Vivus [constructor]: "callback" parameter must be a function');
}
this.callback = callback || function () {};
};
/**
* Core
**************************************
*/
/**
* Map the svg, path by path.
* The method return nothing, it just fill the
* `map` array. Each item in this array represent
* a path element from the SVG, with informations for
* the animation.
*
* ```
* [
* {
* el: <DOMobj> the path element
* length: <number> length of the path line
* startAt: <number> time start of the path animation (in frames)
* duration: <number> path animation duration (in frames)
* },
* ...
* ]
* ```
*
*/
Vivus.prototype.mapping = function () {
var i, paths, path, pAttrs, pathObj, totalLength, lengthMeter, timePoint;
timePoint = totalLength = lengthMeter = 0;
paths = this.el.querySelectorAll('path');
for (i = 0; i < paths.length; i++) {
path = paths[i];
if (this.isInvisible(path)) {
continue;
}
pathObj = {
el: path,
length: Math.ceil(path.getTotalLength())
};
// Test if the path length is correct
if (isNaN(pathObj.length)) {
if (window.console && console.warn) {
console.warn('Vivus [mapping]: cannot retrieve a path element length', path);
}
continue;
}
this.map.push(pathObj);
path.style.strokeDasharray = pathObj.length + ' ' + (pathObj.length + this.dashGap * 2);
path.style.strokeDashoffset = pathObj.length + this.dashGap;
pathObj.length += this.dashGap;
totalLength += pathObj.length;
this.renderPath(i);
}
totalLength = totalLength === 0 ? 1 : totalLength;
this.delay = this.delay === null ? this.duration / 3 : this.delay;
this.delayUnit = this.delay / (paths.length > 1 ? paths.length - 1 : 1);
// Reverse stack if asked
if (this.reverseStack) {
this.map.reverse();
}
for (i = 0; i < this.map.length; i++) {
pathObj = this.map[i];
switch (this.type) {
case 'delayed':
pathObj.startAt = this.delayUnit * i;
pathObj.duration = this.duration - this.delay;
break;
case 'oneByOne':
pathObj.startAt = lengthMeter / totalLength * this.duration;
pathObj.duration = pathObj.length / totalLength * this.duration;
break;
case 'sync':
case 'async':
case 'nsync':
pathObj.startAt = 0;
pathObj.duration = this.duration;
break;
case 'scenario-sync':
path = pathObj.el;
pAttrs = this.parseAttr(path);
pathObj.startAt = timePoint + (parsePositiveInt(pAttrs['data-delay'], this.delayUnit) || 0);
pathObj.duration = parsePositiveInt(pAttrs['data-duration'], this.duration);
timePoint = pAttrs['data-async'] !== undefined ? pathObj.startAt : pathObj.startAt + pathObj.duration;
this.frameLength = Math.max(this.frameLength, (pathObj.startAt + pathObj.duration));
break;
case 'scenario':
path = pathObj.el;
pAttrs = this.parseAttr(path);
pathObj.startAt = parsePositiveInt(pAttrs['data-start'], this.delayUnit) || 0;
pathObj.duration = parsePositiveInt(pAttrs['data-duration'], this.duration);
this.frameLength = Math.max(this.frameLength, (pathObj.startAt + pathObj.duration));
break;
}
lengthMeter += pathObj.length;
this.frameLength = this.frameLength || this.duration;
}
};
/**
* Interval method to draw the SVG from current
* position of the animation. It update the value of
* `currentFrame` and re-trace the SVG.
*
* It use this.handle to store the requestAnimationFrame
* and clear it one the animation is stopped. So this
* attribute can be used to know if the animation is
* playing.
*
* Once the animation at the end, this method will
* trigger the Vivus callback.
*
*/
Vivus.prototype.drawer = function () {
var self = this;
this.currentFrame += this.speed;
if (this.currentFrame <= 0) {
this.stop();
this.reset();
} else if (this.currentFrame >= this.frameLength) {
this.stop();
this.currentFrame = this.frameLength;
this.trace();
if (this.selfDestroy) {
this.destroy();
}
} else {
this.trace();
this.handle = requestAnimFrame(function () {
self.drawer();
});
return;
}
this.callback(this);
if (this.instanceCallback) {
this.instanceCallback(this);
this.instanceCallback = null;
}
};
/**
* Draw the SVG at the current instant from the
* `currentFrame` value. Here is where most of the magic is.
* The trick is to use the `strokeDashoffset` style property.
*
* For optimisation reasons, a new property called `progress`
* is added in each item of `map`. This one contain the current
* progress of the path element. Only if the new value is different
* the new value will be applied to the DOM element. This
* method save a lot of resources to re-render the SVG. And could
* be improved if the animation couldn't be played forward.
*
*/
Vivus.prototype.trace = function () {
var i, progress, path, currentFrame;
currentFrame = this.animTimingFunction(this.currentFrame / this.frameLength) * this.frameLength;
for (i = 0; i < this.map.length; i++) {
path = this.map[i];
progress = (currentFrame - path.startAt) / path.duration;
progress = this.pathTimingFunction(Math.max(0, Math.min(1, progress)));
if (path.progress !== progress) {
path.progress = progress;
path.el.style.strokeDashoffset = Math.floor(path.length * (1 - progress));
this.renderPath(i);
}
}
};
/**
* Method forcing the browser to re-render a path element
* from it's index in the map. Depending on the `forceRender`
* value.
* The trick is to replace the path element by it's clone.
* This practice is not recommended because it's asking more
* ressources, too much DOM manupulation..
* but it's the only way to let the magic happen on IE.
* By default, this fallback is only applied on IE.
*
* @param {Number} index Path index
*/
Vivus.prototype.renderPath = function (index) {
if (this.forceRender && this.map && this.map[index]) {
var pathObj = this.map[index],
newPath = pathObj.el.cloneNode(true);
pathObj.el.parentNode.replaceChild(newPath, pathObj.el);
pathObj.el = newPath;
}
};
/**
* When the SVG object is loaded and ready,
* this method will continue the initialisation.
*
* This this mainly due to the case of passing an
* object tag in the constructor. It will wait
* the end of the loading to initialise.
*
*/
Vivus.prototype.init = function () {
// Set object variables
this.frameLength = 0;
this.currentFrame = 0;
this.map = [];
// Start
new Pathformer(this.el);
this.mapping();
this.starter();
if (this.onReady) {
this.onReady(this);
}
};
/**
* Trigger to start of the animation.
* Depending on the `start` value, a different script
* will be applied.
*
* If the `start` value is not valid, an error will be thrown.
* Even if technically, this is impossible.
*
*/
Vivus.prototype.starter = function () {
switch (this.start) {
case 'manual':
return;
case 'autostart':
this.play();
break;
case 'inViewport':
var self = this,
listener = function () {
if (self.isInViewport(self.parentEl, 1)) {
self.play();
window.removeEventListener('scroll', listener);
//Uncode addition
window.removeEventListener('fp-slide-changed', listener);
window.removeEventListener('fp-slide-scroll', listener);
//#END
}
};
window.addEventListener('scroll', listener);
//Uncode addition
window.addEventListener('fp-slide-changed', listener);
window.addEventListener('fp-slide-scroll', listener);
//#END
listener();
break;
}
};
/**
* Controls
**************************************
*/
/**
* Get the current status of the animation between
* three different states: 'start', 'progress', 'end'.
* @return {string} Instance status
*/
Vivus.prototype.getStatus = function () {
return this.currentFrame === 0 ? 'start' : this.currentFrame === this.frameLength ? 'end' : 'progress';
};
/**
* Reset the instance to the initial state : undraw
* Be careful, it just reset the animation, if you're
* playing the animation, this won't stop it. But just
* make it start from start.
*
*/
Vivus.prototype.reset = function () {
return this.setFrameProgress(0);
};
/**
* Set the instance to the final state : drawn
* Be careful, it just set the animation, if you're
* playing the animation on rewind, this won't stop it.
* But just make it start from the end.
*
*/
Vivus.prototype.finish = function () {
return this.setFrameProgress(1);
};
/**
* Set the level of progress of the drawing.
*
* @param {number} progress Level of progress to set
*/
Vivus.prototype.setFrameProgress = function (progress) {
progress = Math.min(1, Math.max(0, progress));
this.currentFrame = Math.round(this.frameLength * progress);
this.trace();
return this;
};
/**
* Play the animation at the desired speed.
* Speed must be a valid number (no zero).
* By default, the speed value is 1.
* But a negative value is accepted to go forward.
*
* And works with float too.
* But don't forget we are in JavaScript, se be nice
* with him and give him a 1/2^x value.
*
* @param {number} speed Animation speed [optional]
*/
Vivus.prototype.play = function (speed, callback) {
this.instanceCallback = null;
if (speed && typeof speed === 'function') {
this.instanceCallback = speed; // first parameter is actually the callback function
speed = null;
}
else if (speed && typeof speed !== 'number') {
throw new Error('Vivus [play]: invalid speed');
}
// if the first parameter wasn't the callback, check if the seconds was
if (callback && typeof(callback) === 'function' && !this.instanceCallback) {
this.instanceCallback = callback;
}
this.speed = speed || 1;
//Uncode addition
if (!this.handle) {
var $this = this,
delay = (this.delayStart != null) ? this.delayStart : 0;
setTimeout(function() {
$this.drawer();
}, delay);
}
//#END
return this;
};
/**
* Stop the current animation, if on progress.
* Should not trigger any error.
*
*/
Vivus.prototype.stop = function () {
if (this.handle) {
cancelAnimFrame(this.handle);
this.handle = null;
}
return this;
};
/**
* Destroy the instance.
* Remove all bad styling attributes on all
* path tags
*
*/
Vivus.prototype.destroy = function () {
this.stop();
var i, path;
for (i = 0; i < this.map.length; i++) {
path = this.map[i];
path.el.style.strokeDashoffset = null;
path.el.style.strokeDasharray = null;
this.renderPath(i);
}
};
/**
* Utils methods
* include methods from Codrops
**************************************
*/
/**
* Method to best guess if a path should added into
* the animation or not.
*
* 1. Use the `data-vivus-ignore` attribute if set
* 2. Check if the instance must ignore invisible paths
* 3. Check if the path is visible
*
* For now the visibility checking is unstable.
* It will be used for a beta phase.
*
* Other improvments are planned. Like detecting
* is the path got a stroke or a valid opacity.
*/
Vivus.prototype.isInvisible = function (el) {
var rect,
ignoreAttr = el.getAttribute('data-ignore');
if (ignoreAttr !== null) {
return ignoreAttr !== 'false';
}
if (this.ignoreInvisible) {
rect = el.getBoundingClientRect();
return !rect.width && !rect.height;
}
else {
return false;
}
};
/**
* Parse attributes of a DOM element to
* get an object of {attributeName => attributeValue}
*
* @param {object} element DOM element to parse
* @return {object} Object of attributes
*/
Vivus.prototype.parseAttr = function (element) {
var attr, output = {};
if (element && element.attributes) {
for (var i = 0; i < element.attributes.length; i++) {
attr = element.attributes[i];
output[attr.name] = attr.value;
}
}
return output;
};
/**
* Reply if an element is in the page viewport
*
* @param {object} el Element to observe
* @param {number} h Percentage of height
* @return {boolean}
*/
Vivus.prototype.isInViewport = function (el, h) {
var scrolled = this.scrollY(),
viewed = scrolled + this.getViewportH(),
elBCR = el.getBoundingClientRect(),
elHeight = elBCR.height,
elTop = scrolled + elBCR.top,
elBottom = elTop + elHeight;
// if 0, the element is considered in the viewport as soon as it enters.
// if 1, the element is considered in the viewport only when it's fully inside
// value in percentage (1 >= h >= 0)
h = h || 0;
return (elTop + elHeight * h) <= viewed && (elBottom) >= scrolled;
};
/**
* Get the viewport height in pixels
*
* @return {integer} Viewport height
*/
Vivus.prototype.getViewportH = function () {
var client = this.docElem.clientHeight,
inner = window.innerHeight;
if (client < inner) {
return inner;
}
else {
return client;
}
};
/**
* Get the page Y offset
*
* @return {integer} Page Y offset
*/
Vivus.prototype.scrollY = function () {
return window.pageYOffset || this.docElem.scrollTop;
};
setupEnv = function () {
if (Vivus.prototype.docElem) {
return;
}
/**
* Alias for document element
*
* @type {DOMelement}
*/
Vivus.prototype.docElem = window.document.documentElement;
/**
* Alias for `requestAnimationFrame` or
* `setTimeout` function for deprecated browsers.
*
*/
requestAnimFrame = (function () {
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
return window.setTimeout(callback, 1000 / 60);
}
);
})();
/**
* Alias for `cancelAnimationFrame` or
* `cancelTimeout` function for deprecated browsers.
*
*/
cancelAnimFrame = (function () {
return (
window.cancelAnimationFrame ||
window.webkitCancelAnimationFrame ||
window.mozCancelAnimationFrame ||
window.oCancelAnimationFrame ||
window.msCancelAnimationFrame ||
function(id){
return window.clearTimeout(id);
}
);
})();
};
/**
* Parse string to integer.
* If the number is not positive or null
* the method will return the default value
* or 0 if undefined
*
* @param {string} value String to parse
* @param {*} defaultValue Value to return if the result parsed is invalid
* @return {number}
*
*/
parsePositiveInt = function (value, defaultValue) {
var output = parseInt(value, 10);
return (output >= 0) ? output : defaultValue;
};
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], function() {
return Vivus;
});
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = Vivus;
} else {
// Browser globals
window.Vivus = Vivus;
}
}());
(function(global){var startY=0;var enabled=false;var supportsPassiveOption=false;try{var opts=Object.defineProperty({},"passive",{get:function(){supportsPassiveOption=true}});window.addEventListener("test",null,opts)}catch(e){}var handleTouchmove=function(evt){var el=evt.target;while(el!==document.body&&el!==document){var style=window.getComputedStyle(el);if(!style){break}if(el.nodeName==="INPUT"&&el.getAttribute("type")==="range"){return}var scrolling=style.getPropertyValue("-webkit-overflow-scrolling");var overflowY=style.getPropertyValue("overflow-y");var height=parseInt(style.getPropertyValue("height"),10);var isScrollable=scrolling==="touch"&&(overflowY==="auto"||overflowY==="scroll");var canScroll=el.scrollHeight>el.offsetHeight;if(isScrollable&&canScroll){var curY=evt.touches?evt.touches[0].screenY:evt.screenY;var isAtTop=startY<=curY&&el.scrollTop===0;var isAtBottom=startY>=curY&&el.scrollHeight-el.scrollTop===height;if(isAtTop||isAtBottom){evt.preventDefault()}return}el=el.parentNode}evt.preventDefault()};var handleTouchstart=function(evt){startY=evt.touches?evt.touches[0].screenY:evt.screenY};var enable=function(){window.addEventListener("touchstart",handleTouchstart,supportsPassiveOption?{passive:false}:false);window.addEventListener("touchmove",handleTouchmove,supportsPassiveOption?{passive:false}:false);enabled=true};var disable=function(){window.removeEventListener("touchstart",handleTouchstart,false);window.removeEventListener("touchmove",handleTouchmove,false);enabled=false};var isEnabled=function(){return enabled};var testDiv=document.createElement("div");document.documentElement.appendChild(testDiv);testDiv.style.WebkitOverflowScrolling="touch";var scrollSupport="getComputedStyle"in window&&window.getComputedStyle(testDiv)["-webkit-overflow-scrolling"]==="touch";document.documentElement.removeChild(testDiv);if(scrollSupport){enable()}var iNoBounce={enable:enable,disable:disable,isEnabled:isEnabled};if(typeof module!=="undefined"&&module.exports){module.exports=iNoBounce}if(typeof global.define==="function"){(function(define){define("iNoBounce",[],function(){return iNoBounce})})(global.define)}else{global.iNoBounce=iNoBounce}})(this);
iNoBounce.disable();
/* Font Face Observer v2.1.0 - © Bram Stein. License: BSD-3-Clause */(function(){function l(a,b){document.addEventListener?a.addEventListener("scroll",b,!1):a.attachEvent("scroll",b)}function m(a){document.body?a():document.addEventListener?document.addEventListener("DOMContentLoaded",function c(){document.removeEventListener("DOMContentLoaded",c);a()}):document.attachEvent("onreadystatechange",function k(){if("interactive"==document.readyState||"complete"==document.readyState)document.detachEvent("onreadystatechange",k),a()})};function t(a){this.a=document.createElement("div");this.a.setAttribute("aria-hidden","true");this.a.appendChild(document.createTextNode(a));this.b=document.createElement("span");this.c=document.createElement("span");this.h=document.createElement("span");this.f=document.createElement("span");this.g=-1;this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";
this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)}
function u(a,b){a.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;white-space:nowrap;font-synthesis:none;font:"+b+";"}function z(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+"px";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function A(a,b){function c(){var a=k;z(a)&&a.a.parentNode&&b(a.g)}var k=a;l(a.b,c);l(a.c,c);z(a)};function B(a,b){var c=b||{};this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal"}var C=null,D=null,E=null,F=null;function G(){if(null===D)if(J()&&/Apple/.test(window.navigator.vendor)){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))(?:\.([0-9]+))/.exec(window.navigator.userAgent);D=!!a&&603>parseInt(a[1],10)}else D=!1;return D}function J(){null===F&&(F=!!document.fonts);return F}
function K(){if(null===E){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}E=""!==a.style.font}return E}function L(a,b){return[a.style,a.weight,K()?a.stretch:"","100px",b].join(" ")}
B.prototype.load=function(a,b){var c=this,k=a||"BESbswy",r=0,n=b||3E3,H=(new Date).getTime();return new Promise(function(a,b){if(J()&&!G()){var M=new Promise(function(a,b){function e(){(new Date).getTime()-H>=n?b(Error(""+n+"ms timeout exceeded")):document.fonts.load(L(c,'"'+c.family+'"'),k).then(function(c){1<=c.length?a():setTimeout(e,25)},b)}e()}),N=new Promise(function(a,c){r=setTimeout(function(){c(Error(""+n+"ms timeout exceeded"))},n)});Promise.race([N,M]).then(function(){clearTimeout(r);a(c)},
b)}else m(function(){function v(){var b;if(b=-1!=f&&-1!=g||-1!=f&&-1!=h||-1!=g&&-1!=h)(b=f!=g&&f!=h&&g!=h)||(null===C&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),C=!!b&&(536>parseInt(b[1],10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=C&&(f==w&&g==w&&h==w||f==x&&g==x&&h==x||f==y&&g==y&&h==y)),b=!b;b&&(d.parentNode&&d.parentNode.removeChild(d),clearTimeout(r),a(c))}function I(){if((new Date).getTime()-H>=n)d.parentNode&&d.parentNode.removeChild(d),b(Error(""+
n+"ms timeout exceeded"));else{var a=document.hidden;if(!0===a||void 0===a)f=e.a.offsetWidth,g=p.a.offsetWidth,h=q.a.offsetWidth,v();r=setTimeout(I,50)}}var e=new t(k),p=new t(k),q=new t(k),f=-1,g=-1,h=-1,w=-1,x=-1,y=-1,d=document.createElement("div");d.dir="ltr";u(e,L(c,"sans-serif"));u(p,L(c,"serif"));u(q,L(c,"monospace"));d.appendChild(e.a);d.appendChild(p.a);d.appendChild(q.a);document.body.appendChild(d);w=e.a.offsetWidth;x=p.a.offsetWidth;y=q.a.offsetWidth;I();A(e,function(a){f=a;v()});u(e,
L(c,'"'+c.family+'",sans-serif'));A(p,function(a){g=a;v()});u(p,L(c,'"'+c.family+'",serif'));A(q,function(a){h=a;v()});u(q,L(c,'"'+c.family+'",monospace'))})})};"object"===typeof module?module.exports=B:(window.FontFaceObserver=B,window.FontFaceObserver.prototype.load=B.prototype.load);}());