(function($) {// v5 namespace
var MK = {
api : {},
ui : {},
component : {},
};
// Global
window.MK = MK;
// http://alistapart.com/article/container-queries-once-more-unto-the-breach
window.elementQuery = (function() {
// implementations for testing actual element query properties
var queryMatchers = {
"min-width": function(element, value, units) {
var el = element;
var px = convertToPx(el, value, units);
return value && el && el.offsetWidth >= px;
},
"max-width": function(element, value, units) {
var el = element;
var px = convertToPx(el, value, units);
return value && el && el.offsetWidth < px;
}
};
// convert an element query into a css class name we can replace it with
var classNameForRules = function(rules) {
var name = "query";
for (var i = 0, len = rules.length; i < len; i++) {
name += "_" + rules[i].property + "_" + rules[i].value + rules[i].units;
}
return name;
};
// determine the px value for a measurement (e.g. "5em") on a given element
var convertToPx = function(element, value, units) {
switch (units) {
case "px": return value;
case "em": return value * getEmSize(element);
case "rem": return value * getEmSize();
// Viewport units!
// According to http://quirksmode.org/mobile/tableViewport.html
// documentElement.clientWidth/Height gets us the most reliable info
case "vw": return value * document.documentElement.clientWidth / 100;
case "vh": return value * document.documentElement.clientHeight / 100;
case "vmin":
case "vmax":
var vw = document.documentElement.clientWidth / 100;
var vh = document.documentElement.clientHeight / 100;
var chooser = Math[units === "vmin" ? "min" : "max"];
return value * chooser(vw, vh);
default: return value;
// for now, not supporting physical units (since they are just a set number of px)
// or ex/ch (getting accurate measurements is hard)
}
};
// determine the size of an em in a given element
var getEmSize = function(element) {
if (!element) {
element = document.documentElement;
}
if (window.getComputedStyle) {
return parseFloat(getComputedStyle(element).fontSize) || 16;
}
// TODO: support IE?
return 16;
};
// test whether an element matches a set of query rules
var elementMatchesRules = function(element, rules) {
for (var i = rules.length - 1; i > -1; i--) {
var rule = rules[i];
var matcher = queryMatchers[rule.property];
if (matcher && !matcher(element, rule.value, rule.units)) {
return false;
}
}
return true;
};
var loader = {
// parse an array of CSSStyleSheet objects for element queries
loadStyleSheets: function(sheets, callback) {
var completed = 0;
for (var i = 0, len = sheets.length; i < len; i++) {
// if( (sheets[i].href && sheets[i].href.indexOf('media.min.css') != -1) || (sheets[i].href && sheets[i].href.indexOf('media.css') != -1) ) {
this.loadStyleSheet(sheets[i], function() {
completed += 1;
if (completed === len) {
callback && callback();
}
});
// }
}
},
// parse a single CSSStyleSheet object for element queries
loadStyleSheet: function(sheet, callback) {
// if (sheet.ownerNode.nodeName === "STYLE") {
// if(sheet.ownerNode.id !== 'js-media-query') return;
// var result = elementQuery.parser.parseStyleText(sheet.ownerNode.innerHTML);
// sheet.ownerNode.innerHTML += result.newCss;
// elementQuery.queries = elementQuery.queries.concat(result.queries);
// callback && callback();
// }
// else if (sheet.href) {
if (sheet.href && sheet.ownerNode.id === 'js-media-query-css') {
var xhr = new XMLHttpRequest();
xhr.open("GET", sheet.href, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var result = elementQuery.parser.parseStyleText(xhr.responseText);
elementQuery.queries = elementQuery.queries.concat(result.queries);
var style = document.createElement("style");
style.innerHTML = result.newCss;
document.body.appendChild(style);
}
else if (window.console) {
console.log("Could not load stylesheet at " + sheet.href);
}
callback && callback();
}
}
xhr.send(null);
}
},
};
// public API
var elementQuery = {
autoInit: true,
init: function() {
var evaluated = false;
this.loader.loadStyleSheets(document.styleSheets, function() {
evaluated = true;
elementQuery.evaluateQueries();
});
// if we are still waiting for some asynchronous ones, go ahead and evaluate
// any found queries now for minimum latency
if (!evaluated) {
elementQuery.evaluateQueries();
}
},
// update the styling for all the elements that have queries
evaluateQueries: function(context) {
context = context || document;
var queries = this.queries;
for (var i = 0, len = queries.length; i < len; i++) {
var elements = context.querySelectorAll(queries[i].selector);
for (var j = 0; j < elements.length; j++) {
var element = elements[j];
if (elementMatchesRules(element, queries[i].rules)) {
element.classList.add(queries[i].className);
}
else {
element.classList.remove(queries[i].className);
}
}
}
},
queryMatchers: queryMatchers,
queries: [],
classNameForRules: classNameForRules,
loader: loader
};
// re-run all queries on resize
window.addEventListener("resize", function() {
elementQuery.evaluateQueries();
}, false);
// automatically look for things on window load
window.addEventListener("load", function() {
if (elementQuery.autoInit) {
elementQuery.init();
setTimeout(function() {
elementQuery.evaluateQueries();
}, 1000);
}
});
// TODO: re-run all queries... on an interval?
// override setTimeout, addEventListener, etc to hit every possible JS entry
// point? Not really an ideal solution to this.
// Repaint events in Mozilla?
return elementQuery;
}());
(function(elementQuery) {
// Identifies comments in CSS
var COMMENT_PATTERN = /(\/\*)[\s\S]*?(\*\/)/g;
// $1 is the end of a block ("}")
// $2 is all of a simple @rule ("@something ...;")
// $3 is the start of a rule with a block, excluding the opening {
// this could be an @media rule or a simple style rule.
var STATEMENT_END_OR_START_PATTERN = /\s*(?:(\})|(@\S+\s+[^;{]+;)|(?:([^{}]+)\{))/g;
// element queries look like:
// `:media(property: value)` or `:media((property: value) and (property: value))`
var QUERY_PATTERN = /:media\s*\(([^)]*)\)/g;
var QUERY_RULES_PATTERN = /\(?([^\s:]+):\s*(\d+(?:\.\d+)?)(px|em|rem|vw|vh|vmin|vmax)\)?/g;
var WHITESPACE_PATTERN = /^\s*$/;
// Parse CSS content for element queries
elementQuery.parser = {
/**
* This the main entry point for parsing some CSS. Pass it a string of
* CSS content and you'll get back an object like:
* {
* queries: [array of query objects]
* newCss: [string of new CSS]
* }
* The `newCss` property contains new CSS rules to use in place of the
* rules that have element queries -- they replace the queries in selectors
* with classes you can turn on and off on the relevant elements. You'll
* want to insert the new CSS content into a ';
return parent.insertBefore(p.lastChild, parent.firstChild);
}
/**
* Returns the value of `html5.elements` as an array.
* @private
* @returns {Array} An array of shived element node names.
*/
function getElements() {
var elements = html5.elements;
return typeof elements == 'string' ? elements.split(' ') : elements;
}
/**
* Extends the built-in list of html5 elements
* @memberOf html5
* @param {String|Array} newElements whitespace separated list or array of new element names to shiv
* @param {Document} ownerDocument The context document.
*/
function addElements(newElements, ownerDocument) {
var elements = html5.elements;
if(typeof elements != 'string'){
elements = elements.join(' ');
}
if(typeof newElements != 'string'){
newElements = newElements.join(' ');
}
html5.elements = elements +' '+ newElements;
shivDocument(ownerDocument);
}
/**
* Returns the data associated to the given document
* @private
* @param {Document} ownerDocument The document.
* @returns {Object} An object of data.
*/
function getExpandoData(ownerDocument) {
var data = expandoData[ownerDocument[expando]];
if (!data) {
data = {};
expanID++;
ownerDocument[expando] = expanID;
expandoData[expanID] = data;
}
return data;
}
/**
* returns a shived element for the given nodeName and document
* @memberOf html5
* @param {String} nodeName name of the element
* @param {Document|DocumentFragment} ownerDocument The context document.
* @returns {Object} The shived element.
*/
function createElement(nodeName, ownerDocument, data){
if (!ownerDocument) {
ownerDocument = document;
}
if(supportsUnknownElements){
return ownerDocument.createElement(nodeName);
}
if (!data) {
data = getExpandoData(ownerDocument);
}
var node;
if (data.cache[nodeName]) {
node = data.cache[nodeName].cloneNode();
} else if (saveClones.test(nodeName)) {
node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
} else {
node = data.createElem(nodeName);
}
// Avoid adding some elements to fragments in IE < 9 because
// * Attributes like `name` or `type` cannot be set/changed once an element
// is inserted into a document/fragment
// * Link elements with `src` attributes that are inaccessible, as with
// a 403 response, will cause the tab/window to crash
// * Script elements appended to fragments will execute when their `src`
// or `text` property is set
return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
}
/**
* returns a shived DocumentFragment for the given document
* @memberOf html5
* @param {Document} ownerDocument The context document.
* @returns {Object} The shived DocumentFragment.
*/
function createDocumentFragment(ownerDocument, data){
if (!ownerDocument) {
ownerDocument = document;
}
if(supportsUnknownElements){
return ownerDocument.createDocumentFragment();
}
data = data || getExpandoData(ownerDocument);
var clone = data.frag.cloneNode(),
i = 0,
elems = getElements(),
l = elems.length;
for(;i= 0 ) {
elem.setAttribute('maxLength', maxLength);
elem.removeAttribute(ATTR_MAXLENGTH);
}
// If the polyfill has changed the type of the element we need to change
// it back.
var type = elem.getAttribute(ATTR_INPUT_TYPE);
if ( type ) {
elem.type = type;
}
return true;
}
return false;
}
// Show the placeholder value on a single element. Returns true if the
// placeholder was shown and false if it was not (because it was already
// visible).
function showPlaceholder( elem ) {
var val = elem.getAttribute(ATTR_CURRENT_VAL);
if ( elem.value === '' && val ) {
elem.setAttribute(ATTR_ACTIVE, 'true');
elem.value = val;
elem.className += ' ' + placeholderClassName;
// Store and remove the maxlength value.
var maxLength = elem.getAttribute(ATTR_MAXLENGTH);
if ( !maxLength ) {
elem.setAttribute(ATTR_MAXLENGTH, elem.maxLength);
elem.removeAttribute('maxLength');
}
// If the type of element needs to change, change it (e.g. password
// inputs).
var type = elem.getAttribute(ATTR_INPUT_TYPE);
if ( type ) {
elem.type = 'text';
} else if ( elem.type === 'password' && changeType(elem, 'text') ) {
elem.setAttribute(ATTR_INPUT_TYPE, 'password');
}
return true;
}
return false;
}
// Returns a function that is used as a focus event handler.
function makeFocusHandler( elem ) {
return function () {
// Only hide the placeholder value if the (default) hide-on-focus
// behaviour is enabled.
if (
hideOnInput &&
elem.value === elem.getAttribute(ATTR_CURRENT_VAL) &&
elem.getAttribute(ATTR_ACTIVE) === 'true'
) {
// Move the caret to the start of the input (this mimics the behaviour
// of all browsers that do not hide the placeholder on focus).
moveCaret(elem, 0);
} else {
// Remove the placeholder.
hidePlaceholder(elem);
}
};
}
// Returns a function that is used as a blur event handler.
function makeBlurHandler( elem ) {
return function () {
showPlaceholder(elem);
};
}
// Returns a function that is used as a submit event handler on form elements
// that have children affected by this polyfill.
function makeSubmitHandler( form ) {
return function () {
// Turn off placeholders on all appropriate descendant elements.
disablePlaceholders(form);
};
}
// Functions that are used as a event handlers when the hide-on-input
// behaviour has been activated - very basic implementation of the 'input'
// event.
function makeKeydownHandler( elem ) {
return function ( e ) {
keydownVal = elem.value;
// Prevent the use of the arrow keys (try to keep the cursor before the
// placeholder).
if (
elem.getAttribute(ATTR_ACTIVE) === 'true' &&
keydownVal === elem.getAttribute(ATTR_CURRENT_VAL) &&
inArray(badKeys, e.keyCode)
) {
if ( e.preventDefault ) {
e.preventDefault();
}
return false;
}
};
}
function makeKeyupHandler(elem) {
return function () {
hidePlaceholder(elem, keydownVal);
// If the element is now empty we need to show the placeholder
if ( elem.value === '' ) {
elem.blur();
moveCaret(elem, 0);
}
};
}
function makeClickHandler(elem) {
return function () {
if (
elem === safeActiveElement() &&
elem.value === elem.getAttribute(ATTR_CURRENT_VAL) &&
elem.getAttribute(ATTR_ACTIVE) === 'true'
) {
moveCaret(elem, 0);
}
};
}
// Bind event handlers to an element that we need to affect with the
// polyfill.
function newElement( elem ) {
// If the element is part of a form, make sure the placeholder string is
// not submitted as a value.
var form = elem.form;
if ( form && typeof form === 'string' ) {
// Get the real form.
form = document.getElementById(form);
// Set a flag on the form so we know it's been handled (forms can contain
// multiple inputs).
if ( !form.getAttribute(ATTR_FORM_HANDLED) ) {
addEventListener(form, 'submit', makeSubmitHandler(form));
form.setAttribute(ATTR_FORM_HANDLED, 'true');
}
}
// Bind event handlers to the element so we can hide/show the placeholder
// as appropriate.
addEventListener(elem, 'focus', makeFocusHandler(elem));
addEventListener(elem, 'blur', makeBlurHandler(elem));
// If the placeholder should hide on input rather than on focus we need
// additional event handlers
if (hideOnInput) {
addEventListener(elem, 'keydown', makeKeydownHandler(elem));
addEventListener(elem, 'keyup', makeKeyupHandler(elem));
addEventListener(elem, 'click', makeClickHandler(elem));
}
// Remember that we've bound event handlers to this element.
elem.setAttribute(ATTR_EVENTS_BOUND, 'true');
elem.setAttribute(ATTR_CURRENT_VAL, placeholder);
// If the element doesn't have a value and is not focussed, set it to the
// placeholder string.
if ( hideOnInput || elem !== safeActiveElement() ) {
showPlaceholder(elem);
}
}
}(this) );
// IE spupport comes in IE10
(function rAFPolyfill() {
var lastTime, vendors, x;
lastTime = 0;
vendors = ["webkit", "moz"];
x = 0;
while (x < vendors.length && !window.requestAnimationFrame) {
window.requestAnimationFrame = window[vendors[x] + "RequestAnimationFrame"];
window.cancelAnimationFrame = window[vendors[x] + "CancelAnimationFrame"] || window[vendors[x] + "CancelRequestAnimationFrame"];
++x;
}
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function(callback, element) {
var currTime, id, timeToCall;
currTime = new Date().getTime();
timeToCall = Math.max(0, 16 - (currTime - lastTime));
id = window.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
}
if (!window.cancelAnimationFrame) {
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}
})();
(function($) {
'use strict';
var MK = window.MK || {};
/**
* MK.core holds most important methods that bootstraps whole application
*
* @type {Object}
*/
MK.core = {};
/**
* State for referance of already loaded script files
* @type {Array}
*/
var _loadedDependencies = [];
/**
* State of queue represented as pairs of script ref => callback
* @type {Object}
*/
var _inQueue = {};
/**
* Initializes all components in given scope (object or DOM reference) based on data attribute and 'pointer' css class '.js-el'.
* DOM work is reduced by single traversing for pointer class and later filtering through cached object. It expects init() method
* on every component. Component itself should be defined in MK.component namespace and assign to DOM element via data-mk-component.
* Use it once on DOM ready with document as a scope. For partial initialization after ajax operations pass as a scope element
* where new DOM was inserted.
*
* @param {string|object}
*/
MK.core.initAll = function( scope ) {
var $el = $( scope ).find( '.js-el' ), // single traversing
$components = $el.filter( '[data-mk-component]' ),
component = null;
// initialize component
var init = function init(name, el) {
var $el = $(el);
if ( $el.data('init-' + name) ) return; // do not initialize the same module twice
if ( typeof MK.component[ name ] !== 'function' ) console.log('Component init error: ', name);
else {
component = new MK.component[ name ]( el );
component.init();
$el.data('init-' + name, true); // mark as initialised
// TODO add name
MK.utils.eventManager.publish('component-inited');
}
};
$components.each( function() {
var self = this,
$this = $( this ),
names = $this.data( 'mk-component' );
if( typeof names === 'string' ) {
var name = names; // containes only single name. Keep it transparent.
init(name, self);
} else {
names.forEach( function( name ) {
init(name, self);
});
}
});
};
/**
* Async loader for 3rd party plugins available from within theme or external CDNs / APIs.
* Take one argument as callback which is run when loading is finished. Also keeps track of already loaded scripts
* and prevent duplication. Holds in queue multiple callbacks that where defined in different places but depend on the
* same plugin.
*
* TODO: heavy test for multiple dependencies and crosssharing one dependency and different one dependency in queue,
* bulletproof with single dependency
*
* @example MK.core.loadDependencies([MK.core.path.plugins + 'plugin.js'], function() {
* // do something when plugin is loaded
* })
*
* @param {array}
* @param {function}
*/
MK.core.loadDependencies = function( dependencies, callback ) {
var _callback = callback || function() {};
if( !dependencies ) {
// If no dependencies defined then run _callback imidietelly
_callback();
return;
}
// Check for new dependencies
var newDeps = dependencies.map( function( dep ) {
if( _loadedDependencies.indexOf( dep ) === -1 ) {
if( typeof _inQueue[ dep ] === 'undefined' ) {
// console.log( dep );
return dep;
} else {
_inQueue[ dep ].push( _callback );
return true;
}
} else {
return false;
}
});
// The dependency is not new but it's not resolved yet
// Callback is added to queue that will be run after the script is loaded
// Don't run callback just yet.
if( newDeps[0] === true ) {
// console.log('Waiting for ' + dependencies[0]);
return;
}
// Dependency was loaded previously. We can run callback safely
if( newDeps[0] === false ) {
_callback();
return;
}
// Create queue and relationship script -> callback array to track
// all callbacks that waits for ths script
var queue = newDeps.map( function( script ) {
// console.log( script );
_inQueue[ script ] = [ _callback ];
return $.getCachedScript( script );
});
// Callbacks invoking
var onLoad = function onLoad() {
var index;
newDeps.map( function( loaded ) {
_inQueue[ loaded ].forEach( function( callback ) {
callback();
});
delete _inQueue[ loaded ];
_loadedDependencies.push( loaded );
});
};
// Run callbacks when promise is resolved
$.when.apply( null, queue ).done( onLoad );
};
/**
* Single namespace for all paths recuired in application.
* @type {Object}
*/
MK.core.path = {
theme : mk_theme_dir,
plugins : mk_theme_js_path + '/plugins/async/min/',
ajaxUrl : window.PHP.ajax
};
})(jQuery);
(function($) {
'use strict';
var MK = window.MK || {};
MK.utils = window.MK.utils || {};
/**
* Enables to evaluate common methods through DOM JSON references by invoking from object with bracket notation MK.utils[var][var]
* @type {Object}
*/
MK.utils.actions = {};
MK.utils.actions.activate = function (el) {
$(el).addClass('is-active');
};
MK.utils.actions.deactivate = function (el) {
$(el).removeClass('is-active');
};
}(jQuery));
(function($) {
'use strict';
var MK = window.MK || {};
MK.utils = window.MK.utils || {};
/**
* Gets user browser and its version
* @return {Object} => {name, version}
*/
MK.utils.browser = (function() {
var dataBrowser = [
{string: navigator.userAgent, subString: "Edge", identity: "Edge"},
{string: navigator.userAgent, subString: "Chrome", identity: "Chrome"},
{string: navigator.userAgent, subString: "MSIE", identity: "IE"},
{string: navigator.userAgent, subString: "Trident", identity: "IE"},
{string: navigator.userAgent, subString: "Firefox", identity: "Firefox"},
{string: navigator.userAgent, subString: "Safari", identity: "Safari"},
{string: navigator.userAgent, subString: "Opera", identity: "Opera"}
];
var versionSearchString = null;
var searchString = function (data) {
for (var i = 0; i < data.length; i++) {
var dataString = data[i].string;
versionSearchString = data[i].subString;
if (dataString.indexOf(data[i].subString) !== -1) {
return data[i].identity;
}
}
};
var searchVersion = function (dataString) {
var index = dataString.indexOf(versionSearchString);
if (index === -1) {
return;
}
var rv = dataString.indexOf("rv:");
if (versionSearchString === "Trident" && rv !== -1) {
return parseFloat(dataString.substring(rv + 3));
} else {
return parseFloat(dataString.substring(index + versionSearchString.length + 1));
}
};
var name = searchString(dataBrowser) || "Other";
var version = searchVersion(navigator.userAgent) || searchVersion(navigator.appVersion) || "Unknown";
// Expose for css
$('html').addClass(name).addClass(name + version);
return {
name : name,
version : version
};
})();
/**
* Gets user operating system
* @return {String}
*/
MK.utils.OS = (function() {
if (navigator.appVersion.indexOf("Win")!=-1) return "Windows";
if (navigator.appVersion.indexOf("Mac")!=-1) return "OSX";
if (navigator.appVersion.indexOf("X11")!=-1) return "UNIX";
if (navigator.appVersion.indexOf("Linux")!=-1) return "Linux";
})();
/**
* Check if mobile device.
* @return {Boolean}
*/
MK.utils.isMobile = function() {
// Problems with bigger tablets as users raport differences with behaviour. Switch to navigator sniffing
// return ('ontouchstart' in document.documentElement) && matchMedia( '(max-width: 1024px)' ).matches;
// http://www.abeautifulsite.net/detecting-mobile-devices-with-javascript/
// if it still brings problem try to move to more sophisticated solution like
// apachemobilefilter.org
// detectright.com
// web.wurfl.io
//
// Seems as best solution here:
// hgoebl.github.io/mobile-detect.js
function android() {
return navigator.userAgent.match(/Android/i);
}
function blackBerry() {
return navigator.userAgent.match(/BlackBerry/i);
}
function iOS() {
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
}
function opera() {
return navigator.userAgent.match(/Opera Mini/i);
}
function windows() {
return navigator.userAgent.match(/IEMobile/i);
}
return (android() || blackBerry() || iOS() || opera() || windows() || matchMedia( '(max-width: 1024px)' ).matches);
};
/**
* Check if menu is switched to responsive state based on user width settings
* @return {Boolean}
*/
MK.utils.isResponsiveMenuState = function() {
return window.matchMedia( '(max-width: '+ mk_responsive_nav_width +'px)').matches;
};
MK.utils.getUrlParameter = function getUrlParameter(sParam) {
var sPageURL = decodeURIComponent(window.location.search.substring(1)),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : sParameterName[1];
}
}
};
MK.utils.isSmoothScroll = (function() {
var isSafari = (MK.utils.browser.name === "Safari");
var isUserChoice = (mk_smooth_scroll === 'true');
// We notify our app about smooth scroll option when user choose it from admin panel and current browser is not safari.
// Safari has waterfall of events that will block our event loop and make page unresponsive.
// It's better to strip it from effects rather than keep it not usable
return isUserChoice && !isSafari;
}());
}(jQuery));
(function($) {
'use strict';
var MK = window.MK || {};
MK.utils = window.MK.utils || {};
/**
* Basic implementation of pub / sub pattern to avoid tight coupling with direct module communication
* @type {Object}
*/
MK.utils.eventManager = {};
/**
* Subscribe to custom event and run callbacks
* @param {String}
* @param {Function}
*
* @usage MK.utils.eventManager.subscribe('event', function(e, params) {} )
*/
MK.utils.eventManager.subscribe = function(evt, func) {
$(this).on(evt, func);
};
/**
* Unsubscribe from custom event
* @param {String}
* @param {Function}
*/
MK.utils.eventManager.unsubscribe = function(evt, func) {
$(this).off(evt, func);
};
/**
* Publish custom event to notify appliaction about state change
* @param {String}
*
* @usage MK.utils.eventManager.publish('event', {
* param: val
* })
*/
MK.utils.eventManager.publish = function(evt, params) {
$(this).trigger(evt, [params]);
};
}(jQuery));
(function($) {
'use strict';
var MK = window.MK || {};
MK.utils = window.MK.utils || {};
/**
* Control browser fullscreen mode
* @type {Object}
*/
MK.utils.fullscreen = {};
// TODO: move to namespace
MK.utils.launchIntoFullscreen = function ( element ) {
if(element.requestFullscreen) {
element.requestFullscreen();
} else if(element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if(element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
} else if(element.msRequestFullscreen) {
element.msRequestFullscreen();
}
};
MK.utils.exitFullscreen = function () {
if(document.exitFullscreen) {
document.exitFullscreen();
} else if(document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if(document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
};
}(jQuery));
(function($) {
'use strict';
var MK = window.MK || {};
MK.utils = window.MK.utils || {};
MK.utils.misc = {};
// TODO: move to namespace
/**
* Get all top offsets from jQuery collection
*
* @param {$Objects}
* @return {Aray}
*/
MK.utils.offsets = function( $els ) {
return $.map( $els, function( el ) {
return $( el ).offset().top;
});
};
/**
* Retrive from array of numbers first number that is higher than given parameter
*
* @param {Number}
* @param {Array}
* @return {Number}
*/
MK.utils.nextHigherVal = function( val, arr ) {
var i = 0,
higher = null;
var check = function() {
if( val > arr[ i ]) {
i += 1;
check();
} else {
higher = arr[ i ];
}
};
check();
return higher;
};
MK.utils.throttle = function( delay, fn ) {
var last;
var deferTimer;
return function() {
var context = this;
var args = arguments;
var now = +new Date;
if( last && now < last + delay ) {
clearTimeout( deferTimer );
deferTimer = setTimeout( function() {
last = now; fn.apply( context, args );
}, delay );
} else {
last = now;
fn.apply( context, args );
}
};
};
})(jQuery);
(function($) {
'use strict';
var MK = window.MK || {};
MK.utils = window.MK.utils || {};
/**
* Scrolls page to static pixel offset
* @param {Number}
*/
MK.utils.scrollTo = function( offset ) {
$('html, body').stop().animate({
scrollTop: offset
}, {
duration: 1200,
easing: "easeInOutExpo"
});
};
/**
* Scrolls to element passed in as object or DOM reference
* @param {String|Object}
*/
MK.utils.scrollToAnchor = function( hash ) {
var $target = $( hash );
// console.log( hash );
if( ! $target.length ) return;
var offset = $target.offset().top;
offset = offset - MK.val.offsetHeaderHeight( offset );
if( hash === '#top-of-page' ) window.history.replaceState( undefined, undefined, ' ' );
else window.history.replaceState( undefined, undefined, hash );
MK.utils.scrollTo( offset );
};
/**
* Controls native scroll behaviour
* @return {Object} => {disable, enable}
*/
MK.utils.scroll = (function() {
// 37 - left arror, 38 - up arrow, 39 right arrow, 40 down arrow
var keys = [38, 40];
function preventDefault(e) {
e = e || window.event;
e.preventDefault();
e.returnValue = false;
}
function wheel(e) {
preventDefault(e);
}
function keydown(e) {
for (var i = keys.length; i--;) {
if (e.keyCode === keys[i]) {
preventDefault(e);
return;
}
}
}
function disableScroll() {
if (window.addEventListener) {
window.addEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = wheel;
document.onkeydown = keydown;
}
function enableScroll() {
if (window.removeEventListener) {
window.removeEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = document.onkeydown = null;
}
return {
disable : disableScroll,
enable : enableScroll
};
})();
/**
* Checks if passed link element has anchor inside current page. Returns string like '#anchor' if so or false
* @param {String|Object}
* @return {String|Boolean}
*/
MK.utils.detectAnchor = function( el ) {
var $this = $( el ),
loc = window.location,
currentPage = loc.origin + loc.pathname,
href = $this.attr( 'href' ),
linkSplit = (href) ? href.split( '#' ) : '',
hrefPage = linkSplit[0] ? linkSplit[0] : '',
hrefHash = linkSplit[1] ? linkSplit[1] : '';
if( (hrefPage === currentPage || hrefPage === '') && typeof hrefHash !== 'undefined' && hrefHash !== '' ) {
return '#' + hrefHash;
} else {
return false;
}
};
/**
* This should be invoked only on page load.
* Scrolls to anchor from address bar
*/
MK.utils.scrollToURLHash = function() {
var loc = window.location,
hash = loc.hash;
if ( hash.length && hash.substring(1).length ) {
// !loading is added early after DOM is ready to prevent native jump to anchor
hash = hash.replace( '!loading', '' );
// Wait for one second before animating
// Most of UI animations should be done by then and async operations complited
setTimeout( function() {
MK.utils.scrollToAnchor( hash );
}, 1000 );
// Right after reset back address bar
setTimeout( function() {
window.history.replaceState(undefined, undefined, hash);
}, 1001);
}
};
/**
* Scroll Spy implementation. Spy dynamic offsets of elements or static pixel offset
* @param {Number|Element}
* @param {Object} => callback object {before, active, after}
*/
MK.utils.scrollSpy = function( toSpy, config ) {
var $window = $( window ),
container = document.getElementById( 'mk-theme-container' ),
isObj = ( typeof toSpy === 'object' ),
offset = (isObj) ? MK.val.dynamicOffset( toSpy, config.position, config.threshold ) : function() { return toSpy; },
height = (isObj) ? MK.val.dynamicHeight( toSpy ) : function() { return 0; },
cacheVals = {},
_p = 'before'; // current position
var checkPosition = function() {
var s = MK.val.scroll(),
o = offset(),
h = height();
if( s < o && _p !== 'before' ) {
// console.log( toSpy, 'before' );
if( config.before ) config.before();
_p = 'before';
}
else if( s >= o && s <= o + h && _p !== 'active' ) {
// console.log( toSpy, 'active' );
if( config.active ) config.active( o );
_p = 'active';
}
else if( s > o + h && _p !== 'after' ) {
// console.log( toSpy, 'after' );
if( config.after) config.after( o + h );
_p = 'after';
}
};
var rAF = function() {
window.requestAnimationFrame( checkPosition );
};
var exportVals = function() {
return cacheVals;
};
var updateCache = function() {
var o = offset(),
h = height();
cacheVals = {
before : o - $window.height(),
active : o,
after : o + h
};
};
if( config.cache ) {
config.cache( exportVals );
}
checkPosition();
$window.on( 'load', checkPosition );
$window.on( 'resize', checkPosition );
$window.on( 'mouseup', checkPosition );
window.addResizeListener( container, checkPosition );
$window.on( 'scroll', rAF );
updateCache();
$window.on( 'load', updateCache );
$window.on( 'resize', updateCache );
window.addResizeListener( container, updateCache );
};
}(jQuery));
(function($) {
'use strict';
// Create delagation event handler to behave as "live" listener. We may provide new elements with ajax etc later
// Just add js-taphover class whatever element you'd like to immidietely bring hover on touch devices
$("body").on("touchstart", '.js-taphover', function (e) {
var $link = $(e.currentTarget); // grab target
// Rather than ":hover" state we operate on ".hover" class which gives us more control and chance to emulate it on touchstart
// yet it is easy to reason about in our CSS
if ($link.hasClass('hover')) {
return true;
} else {
$link.addClass('hover');
$('.js-taphover').not(e.currentTarget).removeClass('hover'); // remove it from previous element
e.stopPropagation(); // do not leak to document root if expected element was touched
return false; //extra, and to make sure the function has consistent return points
}
});
// Whenever touchstart leaks to the root romve all hover classes
$(document).on("touchstart", function(e) {
$('.js-taphover').removeClass('hover');
});
}(jQuery));
// (function() {
// 'use strict';
// // Make sure the video behaves like background-size: cover
// window.videoCover = function( holderSelector, videoSelector ) {
// var videos = document.querySelectorAll( videoSelector ),
// holder = document.querySelectorAll( holderSelector )[0];
// [].forEach.call(videos, function(video) {
// var videoAspectRatio;
// resizeBackground();
// video.onloadedmetadata = function() {
// // get images aspect ratio
// videoAspectRatio = this.height / this.width;
// // attach resize event and fire it once
// window.onresize = resizeBackground;
// resizeBackground();
// };
// function resizeBackground() {
// // get window size and aspect ratio
// var holderWidth = holder.innerWidth,
// holderHeight = holder.innerHeight,
// holderAspectRatio = holderHeight / holderWidth;
// //compare holder ratio to image ratio so you know which way the image should fill
// if ( holderAspectRatio < videoAspectRatio ) {
// // we are fill width
// video.style.width = holderWidth + "px";
// // and applying the correct aspect to the height now
// video.style.height = (holderWidth * videoAspectRatio) + "px"; // this can be margin if your element is not positioned relatively, absolutely or fixed
// // make sure image is always centered
// video.style.left = "0px";
// video.style.top = (holderHeight - (holderWidth * videoAspectRatio)) / 2 + "px";
// } else { // same thing as above but filling height instead
// video.style.height = holderHeight + "px";
// video.style.width = (holderHeight / videoAspectRatio) + "px";
// video.style.left = (holderWidth - (holderHeight / videoAspectRatio)) / 2 + "px";
// video.style.top = "0px";
// }
// }
// });
// };
// }());
//
//
//
// TODO it is temp only. make it as a plugin
(function($) {
'use strict';
var $videoHolder = $('.mk-center-video'),
$wrapper = $videoHolder.parent(),
baseAspectRatio = 56.25;
var wrapperHeight,
wrapperWidth,
wrapperAspectRatio;
function calc() {
wrapperHeight = $wrapper.height();
wrapperWidth = $wrapper.width();
wrapperAspectRatio = (wrapperHeight / wrapperWidth) * 100;
}
function apply() {
var width = (wrapperAspectRatio / baseAspectRatio) * 100,
widthOverflow = (width - 100);
$videoHolder.css({
'padding-top': wrapperAspectRatio + '%',
'width': width + '%',
'left': -(widthOverflow / 2) + '%'
});
}
function reset() {
$videoHolder.css({
'padding-top': baseAspectRatio + '%',
'width': 100 + '%',
'left': 0
});
}
function setCover() {
reset();
calc();
if(wrapperAspectRatio > baseAspectRatio) apply();
}
$(window).on('load', setCover);
$(window).on('resize', setCover);
}(jQuery));
(function($) {
'use strict';
var MK = window.MK || {};
/**
* MK.val is collection of Lambdas responsible for returning up to date values of method type like scrollY or el offset.
* The Lambda is responsible for keeping track of value of a particular property, usually takes as argument an object
* (or DOM reference) and internally creates and updates data that is returned as primitive value - through variable reference.
*
* Benefits of this approach:
* - reduced DOM reads
* - auto-updating values without need for additional logic where methods are called
* - updating values when needed to be updated not read
*
* Downsides:
* - Memory overhead with closures and keeping state in memory ( still beter than read state from DOM, but use wisely -
* do not use it when you really need static value on runtime )
*/
MK.val = {};
/**
* Current window offsetY position
*
* @uses MK.val.scroll()
* @return {number}
*/
MK.val.scroll = (function() {
var offset = 0,
$window = $( window ),
hasPageYOffset = ( window.pageYOffset !== undefined ),
body = ( document.documentElement || document.body.parentNode || document.body ); // cross browser handling
var update = function() {
offset = hasPageYOffset ? window.pageYOffset : body.scrollTop;
};
var rAF = function() {
window.requestAnimationFrame( update );
};
update();
$window.on( 'load', update );
$window.on( 'resize', update );
$window.on( 'scroll', rAF );
return function() {
return offset;
};
})();
/**
* Changes number of percent to pixels based on viewport height
*
* @uses MK.val.viewportPercentHeight({percent val})
* @param {number}
* @return {number}
*/
MK.val.viewportPercentHeight = function( percent ) {
return $( window ).height() * ( percent / 100 );
};
/**
* Wordpress adminbar height based on wp media queries
* @return {Number}
*/
MK.val.adminbarHeight = function() {
if( php.hasAdminbar ) {
// apply WP native media-query and sizes
return ( window.matchMedia( '( max-width: 782px )' ).matches ) ? 46 : 32;
} else {
return 0;
}
};
/**
* Offset when header becomes sticky. Evaluates viewport % and header height to pixels for according options
* @return {Number}
*/
MK.val.stickyOffset = (function() {
var $header = $('.mk-header').not('.js-header-shortcode').first();
// We need to have returning function even when header is disabled
if(!$header.length) {
return function() {
return 0;
};
}
var $toolbar = $header.find( '.mk-header-toolbar' ),
config = $header.data(),
hasToolbar = $toolbar.length,
toolbarHeight = (hasToolbar) ? $toolbar.height() : 0,
isVertical = (config.headerStyle === 4),
headerHeight = (isVertical) ? 0 : config.height;
var type = ((typeof config.stickyOffset === 'number') ? 'number' : false) ||
((config.stickyOffset === 'header') ? 'header' : false) ||
'percent';
var stickyOffset = 0;
var setOffset = function() {
if( type === 'number' ) {
stickyOffset = config.stickyOffset;
}
else if( type === 'header' ) {
stickyOffset = headerHeight + toolbarHeight + MK.val.adminbarHeight(); // add all header components here, make them 0 if needed
}
else if( type === 'percent' ) {
stickyOffset = MK.val.viewportPercentHeight( parseInt(config.stickyOffset) );
}
};
setOffset();
$(window).on('resize', setOffset);
return function() {
return stickyOffset;
};
}());
/**
* Gets header height on particular offsetY position. Use to determine logic for fullHeight, smooth scroll etc.
* Takes one parameter which is offset position we're interested in.
*
* @uses MK.val.offsetHeaderHeight({offset val})
* @param {number}
* @return {number}
*/
MK.val.offsetHeaderHeight = (function() { // Closure avoids multiple DOM reads. We need to fetch header config only once.
var $header = $('.mk-header').not('.js-header-shortcode').first();
// We need to have returning function even when header is disabled
if(!$header.length) {
return function() {
return 0;
};
}
var $toolbar = $header.find( '.mk-header-toolbar' ),
config = $header.data(),
stickyHeight = config.stickyHeight,
desktopHeight = config.height,
mobileHeight = config.responsiveHeight,
isTransparent = $header.hasClass( 'transparent-header' ),
isSticky = config.stickyStyle.length,
isStickyLazy = config.stickyStyle === 'lazy',
isVertical = config.headerStyle === 4,
hasToolbar = $toolbar.length,
toolbarHeight = hasToolbar ? $toolbar.height() : 0,
bufor = 5;
var headerHeight = function( offset ) {
var stickyOffset = MK.val.stickyOffset();
if( MK.utils.isResponsiveMenuState() ) { // Header avaible only on top for mobile
var totalHeight = mobileHeight + MK.val.adminbarHeight();
if( offset <= totalHeight ) return totalHeight;
else return MK.val.adminbarHeight();
} else {
if( offset <= stickyOffset ) {
if( isVertical ) {
if( hasToolbar ) { return toolbarHeight + MK.val.adminbarHeight(); }
else { return MK.val.adminbarHeight(); }
}
else if( isTransparent ) { return MK.val.adminbarHeight(); }
else { return desktopHeight + toolbarHeight + MK.val.adminbarHeight(); } // For any other return regular desktop height
}
else if( offset > stickyOffset) {
if( isVertical ) { return MK.val.adminbarHeight(); }
else if( ! isSticky ) { return MK.val.adminbarHeight(); }
else if( isStickyLazy ) { return MK.val.adminbarHeight(); }
else if( isSticky ) { return stickyHeight + MK.val.adminbarHeight(); }
}
}
// default to 0 to prevent errors ( need to return number )
// Anyway make sure all scenarios are covered in IFs
return 0;
};
return function( offset ) {
return headerHeight( offset - MK.val.adminbarHeight());
};
})();
/**
* Gets current offset of given element (passed as object or DOM reference) from top or bottom (default to top)
* of screen with possible threshold (default to 0)
*
* @uses MK.val.dynamicOffset({obj reference}, {'top'|'bottom'}, {threshold val})
* @param {string|object}
* @param {string}
* @param {number}
* @return {number}
*/
MK.val.dynamicOffset = function( el, position, threshold ) {
var $window = $( window ),
$el = $( el ),
pos = position || 'top',
thr = threshold || 0,
container = document.getElementById( 'mk-theme-container' ),
currentPos = 0;
var offset = 0,
winH = 0,
rect = 0,
x = 0;
var update = function() {
winH = $window.height();
rect = $el[ 0 ].getBoundingClientRect();
offset = (rect.top + MK.val.scroll());
x = (pos === 'top') ? MK.val.offsetHeaderHeight( offset ) : winH + ( rect.height - thr );
currentPos = offset - x - 1;
};
update();
$window.on( 'load', update );
$window.on( 'resize', update );
window.addResizeListener( container, update );
return function() {
return currentPos;
};
};
/**
* Gets current height of given element (passed as object or DOM reference)
*
* @uses MK.val.dynamicHeight({obj reference})
* @param {string|object}
* @return {number}
*/
MK.val.dynamicHeight = function( el ) {
var $window = $( window ),
$el = $( el ),
container = document.getElementById( 'mk-theme-container' ),
currentHeight = 0;
var update = function() {
currentHeight = $el.outerHeight();
};
update();
$window.on( 'load', update );
$window.on( 'resize', update );
window.addResizeListener( container, update );
return function() {
return currentHeight;
};
};
})(jQuery);
/*
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
*
*/
jQuery.easing["jswing"] = jQuery.easing["swing"];
jQuery.extend(jQuery.easing, {
def: "easeOutQuad",
swing: function (a, b, c, d, e) {
return jQuery.easing[jQuery.easing.def](a, b, c, d, e)
},
easeInQuad: function (a, b, c, d, e) {
return d * (b /= e) * b + c
},
easeOutQuad: function (a, b, c, d, e) {
return -d * (b /= e) * (b - 2) + c
},
easeInOutQuad: function (a, b, c, d, e) {
if ((b /= e / 2) < 1) return d / 2 * b * b + c;
return -d / 2 * (--b * (b - 2) - 1) + c
},
easeInCubic: function (a, b, c, d, e) {
return d * (b /= e) * b * b + c
},
easeOutCubic: function (a, b, c, d, e) {
return d * ((b = b / e - 1) * b * b + 1) + c
},
easeInOutCubic: function (a, b, c, d, e) {
if ((b /= e / 2) < 1) return d / 2 * b * b * b + c;
return d / 2 * ((b -= 2) * b * b + 2) + c
},
easeInQuart: function (a, b, c, d, e) {
return d * (b /= e) * b * b * b + c
},
easeOutQuart: function (a, b, c, d, e) {
return -d * ((b = b / e - 1) * b * b * b - 1) + c
},
easeInOutQuart: function (a, b, c, d, e) {
if ((b /= e / 2) < 1) return d / 2 * b * b * b * b + c;
return -d / 2 * ((b -= 2) * b * b * b - 2) + c
},
easeInQuint: function (a, b, c, d, e) {
return d * (b /= e) * b * b * b * b + c
},
easeOutQuint: function (a, b, c, d, e) {
return d * ((b = b / e - 1) * b * b * b * b + 1) + c
},
easeInOutQuint: function (a, b, c, d, e) {
if ((b /= e / 2) < 1) return d / 2 * b * b * b * b * b + c;
return d / 2 * ((b -= 2) * b * b * b * b + 2) + c
},
easeInSine: function (a, b, c, d, e) {
return -d * Math.cos(b / e * (Math.PI / 2)) + d + c
},
easeOutSine: function (a, b, c, d, e) {
return d * Math.sin(b / e * (Math.PI / 2)) + c
},
easeInOutSine: function (a, b, c, d, e) {
return -d / 2 * (Math.cos(Math.PI * b / e) - 1) + c
},
easeInExpo: function (a, b, c, d, e) {
return b == 0 ? c : d * Math.pow(2, 10 * (b / e - 1)) + c
},
easeOutExpo: function (a, b, c, d, e) {
return b == e ? c + d : d * (-Math.pow(2, -10 * b / e) + 1) + c
},
easeInOutExpo: function (a, b, c, d, e) {
if (b == 0) return c;
if (b == e) return c + d;
if ((b /= e / 2) < 1) return d / 2 * Math.pow(2, 10 * (b - 1)) + c;
return d / 2 * (-Math.pow(2, -10 * --b) + 2) + c
},
easeInCirc: function (a, b, c, d, e) {
return -d * (Math.sqrt(1 - (b /= e) * b) - 1) + c
},
easeOutCirc: function (a, b, c, d, e) {
return d * Math.sqrt(1 - (b = b / e - 1) * b) + c
},
easeInOutCirc: function (a, b, c, d, e) {
if ((b /= e / 2) < 1) return -d / 2 * (Math.sqrt(1 - b * b) - 1) + c;
return d / 2 * (Math.sqrt(1 - (b -= 2) * b) + 1) + c
},
easeInElastic: function (a, b, c, d, e) {
var f = 1.70158;
var g = 0;
var h = d;
if (b == 0) return c;
if ((b /= e) == 1) return c + d;
if (!g) g = e * .3;
if (h < Math.abs(d)) {
h = d;
var f = g / 4
} else var f = g / (2 * Math.PI) * Math.asin(d / h);
return -(h * Math.pow(2, 10 * (b -= 1)) * Math.sin((b * e - f) * 2 * Math.PI / g)) + c
},
easeOutElastic: function (a, b, c, d, e) {
var f = 1.70158;
var g = 0;
var h = d;
if (b == 0) return c;
if ((b /= e) == 1) return c + d;
if (!g) g = e * .3;
if (h < Math.abs(d)) {
h = d;
var f = g / 4
} else var f = g / (2 * Math.PI) * Math.asin(d / h);
return h * Math.pow(2, -10 * b) * Math.sin((b * e - f) * 2 * Math.PI / g) + d + c
},
easeInOutElastic: function (a, b, c, d, e) {
var f = 1.70158;
var g = 0;
var h = d;
if (b == 0) return c;
if ((b /= e / 2) == 2) return c + d;
if (!g) g = e * .3 * 1.5;
if (h < Math.abs(d)) {
h = d;
var f = g / 4
} else var f = g / (2 * Math.PI) * Math.asin(d / h);
if (b < 1) return -.5 * h * Math.pow(2, 10 * (b -= 1)) * Math.sin((b * e - f) * 2 * Math.PI / g) + c;
return h * Math.pow(2, -10 * (b -= 1)) * Math.sin((b * e - f) * 2 * Math.PI / g) * .5 + d + c
},
easeInBack: function (a, b, c, d, e, f) {
if (f == undefined) f = 1.70158;
return d * (b /= e) * b * ((f + 1) * b - f) + c
},
easeOutBack: function (a, b, c, d, e, f) {
if (f == undefined) f = 1.70158;
return d * ((b = b / e - 1) * b * ((f + 1) * b + f) + 1) + c
},
easeInOutBack: function (a, b, c, d, e, f) {
if (f == undefined) f = 1.70158;
if ((b /= e / 2) < 1) return d / 2 * b * b * (((f *= 1.525) + 1) * b - f) + c;
return d / 2 * ((b -= 2) * b * (((f *= 1.525) + 1) * b + f) + 2) + c
},
easeInBounce: function (a, b, c, d, e) {
return d - jQuery.easing.easeOutBounce(a, e - b, 0, d, e) + c
},
easeOutBounce: function (a, b, c, d, e) {
if ((b /= e) < 1 / 2.75) {
return d * 7.5625 * b * b + c
} else if (b < 2 / 2.75) {
return d * (7.5625 * (b -= 1.5 / 2.75) * b + .75) + c
} else if (b < 2.5 / 2.75) {
return d * (7.5625 * (b -= 2.25 / 2.75) * b + .9375) + c
} else {
return d * (7.5625 * (b -= 2.625 / 2.75) * b + .984375) + c
}
},
easeInOutBounce: function (a, b, c, d, e) {
if (b < e / 2) return jQuery.easing.easeInBounce(a, b * 2, 0, d, e) * .5 + c;
return jQuery.easing.easeOutBounce(a, b * 2 - e, 0, d, e) * .5 + d * .5 + c
}
});
/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
(function(s, H, f, w) {
var K = f("html"),
q = f(s),
p = f(H),
b = f.fancybox = function() {
b.open.apply(this, arguments)
},
J = navigator.userAgent.match(/msie/i),
C = null,
t = H.createTouch !== w,
u = function(a) {
return a && a.hasOwnProperty && a instanceof f
},
r = function(a) {
return a && "string" === f.type(a)
},
F = function(a) {
return r(a) && 0 < a.indexOf("%")
},
m = function(a, d) {
var e = parseInt(a, 10) || 0;
d && F(a) && (e *= b.getViewport()[d] / 100);
return Math.ceil(e)
},
x = function(a, b) {
return m(a, b) + "px"
};
f.extend(b, {
version: "2.1.5",
defaults: {
padding: 15,
margin: 20,
width: 800,
height: 600,
minWidth: 100,
minHeight: 100,
maxWidth: 9999,
maxHeight: 9999,
pixelRatio: 1,
autoSize: !0,
autoHeight: !1,
autoWidth: !1,
autoResize: !0,
autoCenter: !t,
fitToView: !0,
aspectRatio: !1,
topRatio: 0.5,
leftRatio: 0.5,
scrolling: "auto",
wrapCSS: "",
arrows: !0,
closeBtn: !0,
closeClick: !1,
nextClick: !1,
mouseWheel: !0,
autoPlay: !1,
playSpeed: 3E3,
preload: 3,
modal: !1,
loop: !0,
ajax: {
dataType: "html",
headers: {
"X-fancyBox": !0
}
},
iframe: {
scrolling: "auto",
preload: !0
},
swf: {
wmode: "transparent",
allowfullscreen: "true",
allowscriptaccess: "always"
},
keys: {
next: {
13: "left",
34: "up",
39: "left",
40: "up"
},
prev: {
8: "right",
33: "down",
37: "right",
38: "down"
},
close: [27],
play: [32],
toggle: [70]
},
direction: {
next: "left",
prev: "right"
},
scrollOutside: !0,
index: 0,
type: null,
href: null,
content: null,
title: null,
tpl: {
wrap: '
',
image: '',
iframe: '",
error: '
The requested content cannot be loaded. Please try again later.
',
closeBtn: '',
next: '',
prev: ''
},
openEffect: "fade",
openSpeed: 250,
openEasing: "swing",
openOpacity: !0,
openMethod: "zoomIn",
closeEffect: "fade",
closeSpeed: 250,
closeEasing: "swing",
closeOpacity: !0,
closeMethod: "zoomOut",
nextEffect: "elastic",
nextSpeed: 250,
nextEasing: "swing",
nextMethod: "changeIn",
prevEffect: "elastic",
prevSpeed: 250,
prevEasing: "swing",
prevMethod: "changeOut",
helpers: {
overlay: !0,
title: !0
},
onCancel: f.noop,
beforeLoad: f.noop,
afterLoad: f.noop,
beforeShow: f.noop,
afterShow: f.noop,
beforeChange: f.noop,
beforeClose: f.noop,
afterClose: f.noop
},
group: {},
opts: {},
previous: null,
coming: null,
current: null,
isActive: !1,
isOpen: !1,
isOpened: !1,
wrap: null,
skin: null,
outer: null,
inner: null,
player: {
timer: null,
isActive: !1
},
ajaxLoad: null,
imgPreload: null,
transitions: {},
helpers: {},
open: function(a, d) {
if (a && (f.isPlainObject(d) || (d = {}), !1 !== b.close(!0))) return f.isArray(a) || (a = u(a) ? f(a).get() : [a]), f.each(a, function(e, c) {
var l = {},
g, h, k, n, m;
"object" === f.type(c) && (c.nodeType && (c = f(c)), u(c) ? (l = {
href: c.data("fancybox-href") || c.attr("href"),
title: f("").text(c.data("fancybox-title") || c.attr("title")).html(),
isDom: !0,
element: c
},
f.metadata && f.extend(!0, l, c.metadata())) : l = c);
g = d.href || l.href || (r(c) ? c : null);
h = d.title !== w ? d.title : l.title || "";
n = (k = d.content || l.content) ? "html" : d.type || l.type;
!n && l.isDom && (n = c.data("fancybox-type"), n || (n = (n = c.prop("class").match(/fancybox\.(\w+)/)) ? n[1] : null));
r(g) && (n || (b.isImage(g) ? n = "image" : b.isSWF(g) ? n = "swf" : "#" === g.charAt(0) ? n = "inline" : r(c) && (n = "html", k = c)), "ajax" === n && (m = g.split(/\s+/, 2), g = m.shift(), m = m.shift()));
k || ("inline" === n ? g ? k = f(r(g) ? g.replace(/.*(?=#[^\s]+$)/, "") : g) : l.isDom && (k = c) :
"html" === n ? k = g : n || g || !l.isDom || (n = "inline", k = c));
f.extend(l, {
href: g,
type: n,
content: k,
title: h,
selector: m
});
a[e] = l
}), b.opts = f.extend(!0, {}, b.defaults, d), d.keys !== w && (b.opts.keys = d.keys ? f.extend({}, b.defaults.keys, d.keys) : !1), b.group = a, b._start(b.opts.index)
},
cancel: function() {
var a = b.coming;
a && !1 === b.trigger("onCancel") || (b.hideLoading(), a && (b.ajaxLoad && b.ajaxLoad.abort(), b.ajaxLoad = null, b.imgPreload && (b.imgPreload.onload = b.imgPreload.onerror = null), a.wrap && a.wrap.stop(!0, !0).trigger("onReset").remove(),
b.coming = null, b.current || b._afterZoomOut(a)))
},
close: function(a) {
b.cancel();
!1 !== b.trigger("beforeClose") && (b.unbindEvents(), b.isActive && (b.isOpen && !0 !== a ? (b.isOpen = b.isOpened = !1, b.isClosing = !0, f(".fancybox-item, .fancybox-nav").remove(), b.wrap.stop(!0, !0).removeClass("fancybox-opened"), b.transitions[b.current.closeMethod]()) : (f(".fancybox-wrap").stop(!0).trigger("onReset").remove(), b._afterZoomOut())))
},
play: function(a) {
var d = function() {
clearTimeout(b.player.timer)
},
e = function() {
d();
b.current && b.player.isActive &&
(b.player.timer = setTimeout(b.next, b.current.playSpeed))
},
c = function() {
d();
p.unbind(".player");
b.player.isActive = !1;
b.trigger("onPlayEnd")
};
!0 === a || !b.player.isActive && !1 !== a ? b.current && (b.current.loop || b.current.index < b.group.length - 1) && (b.player.isActive = !0, p.bind({
"onCancel.player beforeClose.player": c,
"onUpdate.player": e,
"beforeLoad.player": d
}), e(), b.trigger("onPlayStart")) : c()
},
next: function(a) {
var d = b.current;
d && (r(a) || (a = d.direction.next), b.jumpto(d.index + 1, a, "next"))
},
prev: function(a) {
var d =
b.current;
d && (r(a) || (a = d.direction.prev), b.jumpto(d.index - 1, a, "prev"))
},
jumpto: function(a, d, e) {
var c = b.current;
c && (a = m(a), b.direction = d || c.direction[a >= c.index ? "next" : "prev"], b.router = e || "jumpto", c.loop && (0 > a && (a = c.group.length + a % c.group.length), a %= c.group.length), c.group[a] !== w && (b.cancel(), b._start(a)))
},
reposition: function(a, d) {
var e = b.current,
c = e ? e.wrap : null,
l;
c && (l = b._getPosition(d), a && "scroll" === a.type ? (delete l.position, c.stop(!0, !0).animate(l, 200)) : (c.css(l), e.pos = f.extend({}, e.dim, l)))
},
update: function(a) {
var d = a && a.originalEvent && a.originalEvent.type,
e = !d || "orientationchange" === d;
e && (clearTimeout(C), C = null);
b.isOpen && !C && (C = setTimeout(function() {
var c = b.current;
c && !b.isClosing && (b.wrap.removeClass("fancybox-tmp"), (e || "load" === d || "resize" === d && c.autoResize) && b._setDimension(), "scroll" === d && c.canShrink || b.reposition(a), b.trigger("onUpdate"), C = null)
}, e && !t ? 0 : 300))
},
toggle: function(a) {
b.isOpen && (b.current.fitToView = "boolean" === f.type(a) ? a : !b.current.fitToView, t && (b.wrap.removeAttr("style").addClass("fancybox-tmp"),
b.trigger("onUpdate")), b.update())
},
hideLoading: function() {
p.unbind(".loading");
f("#fancybox-loading").remove()
},
showLoading: function() {
var a, d;
b.hideLoading();
a = f('
').click(b.cancel).appendTo("body");
p.bind("keydown.loading", function(a) {
27 === (a.which || a.keyCode) && (a.preventDefault(), b.cancel())
});
b.defaults.fixed || (d = b.getViewport(), a.css({
position: "absolute",
top: 0.5 * d.h + d.y,
left: 0.5 * d.w + d.x
}));
b.trigger("onLoading")
},
getViewport: function() {
var a = b.current &&
b.current.locked || !1,
d = {
x: q.scrollLeft(),
y: q.scrollTop()
};
a && a.length ? (d.w = a[0].clientWidth, d.h = a[0].clientHeight) : (d.w = t && s.innerWidth ? s.innerWidth : q.width(), d.h = t && s.innerHeight ? s.innerHeight : q.height());
return d
},
unbindEvents: function() {
b.wrap && u(b.wrap) && b.wrap.unbind(".fb");
p.unbind(".fb");
q.unbind(".fb")
},
bindEvents: function() {
var a = b.current,
d;
a && (q.bind("orientationchange.fb" + (t ? "" : " resize.fb") + (a.autoCenter && !a.locked ? " scroll.fb" : ""), b.update), (d = a.keys) && p.bind("keydown.fb", function(e) {
var c =
e.which || e.keyCode,
l = e.target || e.srcElement;
if (27 === c && b.coming) return !1;
e.ctrlKey || e.altKey || e.shiftKey || e.metaKey || l && (l.type || f(l).is("[contenteditable]")) || f.each(d, function(d, l) {
if (1 < a.group.length && l[c] !== w) return b[d](l[c]), e.preventDefault(), !1;
if (-1 < f.inArray(c, l)) return b[d](), e.preventDefault(), !1
})
}), f.fn.mousewheel && a.mouseWheel && b.wrap.bind("mousewheel.fb", function(d, c, l, g) {
for (var h = f(d.target || null), k = !1; h.length && !(k || h.is(".fancybox-skin") || h.is(".fancybox-wrap"));) k = h[0] && !(h[0].style.overflow &&
"hidden" === h[0].style.overflow) && (h[0].clientWidth && h[0].scrollWidth > h[0].clientWidth || h[0].clientHeight && h[0].scrollHeight > h[0].clientHeight), h = f(h).parent();
0 !== c && !k && 1 < b.group.length && !a.canShrink && (0 < g || 0 < l ? b.prev(0 < g ? "down" : "left") : (0 > g || 0 > l) && b.next(0 > g ? "up" : "right"), d.preventDefault())
}))
},
trigger: function(a, d) {
var e, c = d || b.coming || b.current;
if (c) {
f.isFunction(c[a]) && (e = c[a].apply(c, Array.prototype.slice.call(arguments, 1)));
if (!1 === e) return !1;
c.helpers && f.each(c.helpers, function(d, e) {
if (e &&
b.helpers[d] && f.isFunction(b.helpers[d][a])) b.helpers[d][a](f.extend(!0, {}, b.helpers[d].defaults, e), c)
})
}
p.trigger(a)
},
isImage: function(a) {
return r(a) && a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)
},
isSWF: function(a) {
return r(a) && a.match(/\.(swf)((\?|#).*)?$/i)
},
_start: function(a) {
var d = {},
e, c;
a = m(a);
e = b.group[a] || null;
if (!e) return !1;
d = f.extend(!0, {}, b.opts, e);
e = d.margin;
c = d.padding;
"number" === f.type(e) && (d.margin = [e, e, e, e]);
"number" === f.type(c) && (d.padding = [c, c,
c, c
]);
d.modal && f.extend(!0, d, {
closeBtn: !1,
closeClick: !1,
nextClick: !1,
arrows: !1,
mouseWheel: !1,
keys: null,
helpers: {
overlay: {
closeClick: !1
}
}
});
d.autoSize && (d.autoWidth = d.autoHeight = !0);
"auto" === d.width && (d.autoWidth = !0);
"auto" === d.height && (d.autoHeight = !0);
d.group = b.group;
d.index = a;
b.coming = d;
if (!1 === b.trigger("beforeLoad")) b.coming = null;
else {
c = d.type;
e = d.href;
if (!c) return b.coming = null, b.current && b.router && "jumpto" !== b.router ? (b.current.index = a, b[b.router](b.direction)) : !1;
b.isActive = !0;
if ("image" ===
c || "swf" === c) d.autoHeight = d.autoWidth = !1, d.scrolling = "visible";
"image" === c && (d.aspectRatio = !0);
"iframe" === c && t && (d.scrolling = "scroll");
d.wrap = f(d.tpl.wrap).addClass("fancybox-" + (t ? "mobile" : "desktop") + " fancybox-type-" + c + " fancybox-tmp " + d.wrapCSS).appendTo(d.parent || "body");
f.extend(d, {
skin: f(".fancybox-skin", d.wrap),
outer: f(".fancybox-outer", d.wrap),
inner: f(".fancybox-inner", d.wrap)
});
f.each(["Top", "Right", "Bottom", "Left"], function(a, b) {
d.skin.css("padding" + b, x(d.padding[a]))
});
b.trigger("onReady");
if ("inline" === c || "html" === c) {
if (!d.content || !d.content.length) return b._error("content")
} else if (!e) return b._error("href");
"image" === c ? b._loadImage() : "ajax" === c ? b._loadAjax() : "iframe" === c ? b._loadIframe() : b._afterLoad()
}
},
_error: function(a) {
f.extend(b.coming, {
type: "html",
autoWidth: !0,
autoHeight: !0,
minWidth: 0,
minHeight: 0,
scrolling: "no",
hasError: a,
content: b.coming.tpl.error
});
b._afterLoad()
},
_loadImage: function() {
var a = b.imgPreload = new Image;
a.onload = function() {
this.onload = this.onerror = null;
b.coming.width =
this.width / b.opts.pixelRatio;
b.coming.height = this.height / b.opts.pixelRatio;
b._afterLoad()
};
a.onerror = function() {
this.onload = this.onerror = null;
b._error("image")
};
a.src = b.coming.href;
!0 !== a.complete && b.showLoading()
},
_loadAjax: function() {
var a = b.coming;
b.showLoading();
b.ajaxLoad = f.ajax(f.extend({}, a.ajax, {
url: a.href,
error: function(a, e) {
b.coming && "abort" !== e ? b._error("ajax", a) : b.hideLoading()
},
success: function(d, e) {
"success" === e && (a.content = d, b._afterLoad())
}
}))
},
_loadIframe: function() {
var a = b.coming,
d = f(a.tpl.iframe.replace(/\{rnd\}/g, (new Date).getTime())).attr("scrolling", t ? "auto" : a.iframe.scrolling).attr("src", a.href);
f(a.wrap).bind("onReset", function() {
try {
f(this).find("iframe").hide().attr("src", "//about:blank").end().empty()
} catch (a) {}
});
a.iframe.preload && (b.showLoading(), d.one("load", function() {
f(this).data("ready", 1);
t || f(this).bind("load.fb", b.update);
f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();
b._afterLoad()
}));
a.content = d.appendTo(a.inner);
a.iframe.preload ||
b._afterLoad()
},
_preloadImages: function() {
var a = b.group,
d = b.current,
e = a.length,
c = d.preload ? Math.min(d.preload, e - 1) : 0,
f, g;
for (g = 1; g <= c; g += 1) f = a[(d.index + g) % e], "image" === f.type && f.href && ((new Image).src = f.href)
},
_afterLoad: function() {
var a = b.coming,
d = b.current,
e, c, l, g, h;
b.hideLoading();
if (a && !1 !== b.isActive)
if (!1 === b.trigger("afterLoad", a, d)) a.wrap.stop(!0).trigger("onReset").remove(), b.coming = null;
else {
d && (b.trigger("beforeChange", d), d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());
b.unbindEvents();
e = a.content;
c = a.type;
l = a.scrolling;
f.extend(b, {
wrap: a.wrap,
skin: a.skin,
outer: a.outer,
inner: a.inner,
current: a,
previous: d
});
g = a.href;
switch (c) {
case "inline":
case "ajax":
case "html":
a.selector ? e = f("
").html(e).find(a.selector) : u(e) && (e.data("fancybox-placeholder") || e.data("fancybox-placeholder", f('').insertAfter(e).hide()), e = e.show().detach(), a.wrap.bind("onReset", function() {
f(this).find(e).length && e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder", !1)
}));
break;
case "image":
e = a.tpl.image.replace(/\{href\}/g, g);
break;
case "swf":
e = '"
}
u(e) && e.parent().is(a.inner) || a.inner.append(e);
b.trigger("beforeShow");
a.inner.css("overflow", "yes" === l ? "scroll" : "no" === l ? "hidden" : l);
b._setDimension();
b.reposition();
b.isOpen = !1;
b.coming = null;
b.bindEvents();
if (!b.isOpened) f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();
else if (d.prevMethod) b.transitions[d.prevMethod]();
b.transitions[b.isOpened ? a.nextMethod : a.openMethod]();
b._preloadImages()
}
},
_setDimension: function() {
var a = b.getViewport(),
d = 0,
e = !1,
c = !1,
e = b.wrap,
l = b.skin,
g = b.inner,
h = b.current,
c = h.width,
k = h.height,
n = h.minWidth,
v = h.minHeight,
p = h.maxWidth,
q = h.maxHeight,
t = h.scrolling,
r = h.scrollOutside ? h.scrollbarWidth : 0,
y = h.margin,
z = m(y[1] + y[3]),
s = m(y[0] + y[2]),
w, A, u, D, B, G, C, E, I;
e.add(l).add(g).width("auto").height("auto").removeClass("fancybox-tmp");
y = m(l.outerWidth(!0) - l.width());
w = m(l.outerHeight(!0) - l.height());
A = z + y;
u = s + w;
D = F(c) ? (a.w - A) * m(c) / 100 : c;
B = F(k) ? (a.h - u) * m(k) / 100 : k;
if ("iframe" === h.type) {
if (I = h.content, h.autoHeight && 1 === I.data("ready")) try {
I[0].contentWindow.document.location && (g.width(D).height(9999), G = I.contents().find("body"), r && G.css("overflow-x",
"hidden"), B = G.outerHeight(!0))
} catch (H) {}
} else if (h.autoWidth || h.autoHeight) g.addClass("fancybox-tmp"), h.autoWidth || g.width(D), h.autoHeight || g.height(B), h.autoWidth && (D = g.width()), h.autoHeight && (B = g.height()), g.removeClass("fancybox-tmp");
c = m(D);
k = m(B);
E = D / B;
n = m(F(n) ? m(n, "w") - A : n);
p = m(F(p) ? m(p, "w") - A : p);
v = m(F(v) ? m(v, "h") - u : v);
q = m(F(q) ? m(q, "h") - u : q);
G = p;
C = q;
h.fitToView && (p = Math.min(a.w - A, p), q = Math.min(a.h - u, q));
A = a.w - z;
s = a.h - s;
h.aspectRatio ? (c > p && (c = p, k = m(c / E)), k > q && (k = q, c = m(k * E)), c < n && (c = n, k = m(c /
E)), k < v && (k = v, c = m(k * E))) : (c = Math.max(n, Math.min(c, p)), h.autoHeight && "iframe" !== h.type && (g.width(c), k = g.height()), k = Math.max(v, Math.min(k, q)));
if (h.fitToView)
if (g.width(c).height(k), e.width(c + y), a = e.width(), z = e.height(), h.aspectRatio)
for (;
(a > A || z > s) && c > n && k > v && !(19 < d++);) k = Math.max(v, Math.min(q, k - 10)), c = m(k * E), c < n && (c = n, k = m(c / E)), c > p && (c = p, k = m(c / E)), g.width(c).height(k), e.width(c + y), a = e.width(), z = e.height();
else c = Math.max(n, Math.min(c, c - (a - A))), k = Math.max(v, Math.min(k, k - (z - s)));
r && "auto" === t && k < B &&
c + y + r < A && (c += r);
g.width(c).height(k);
e.width(c + y);
a = e.width();
z = e.height();
e = (a > A || z > s) && c > n && k > v;
c = h.aspectRatio ? c < G && k < C && c < D && k < B : (c < G || k < C) && (c < D || k < B);
f.extend(h, {
dim: {
width: x(a),
height: x(z)
},
origWidth: D,
origHeight: B,
canShrink: e,
canExpand: c,
wPadding: y,
hPadding: w,
wrapSpace: z - l.outerHeight(!0),
skinSpace: l.height() - k
});
!I && h.autoHeight && k > v && k < q && !c && g.height("auto")
},
_getPosition: function(a) {
var d = b.current,
e = b.getViewport(),
c = d.margin,
f = b.wrap.width() + c[1] + c[3],
g = b.wrap.height() + c[0] + c[2],
c = {
position: "absolute",
top: c[0],
left: c[3]
};
d.autoCenter && d.fixed && !a && g <= e.h && f <= e.w ? c.position = "fixed" : d.locked || (c.top += e.y, c.left += e.x);
c.top = x(Math.max(c.top, c.top + (e.h - g) * d.topRatio));
c.left = x(Math.max(c.left, c.left + (e.w - f) * d.leftRatio));
return c
},
_afterZoomIn: function() {
var a = b.current;
a && ((b.isOpen = b.isOpened = !0, b.wrap.css("overflow", "visible").addClass("fancybox-opened"), b.update(), (a.closeClick || a.nextClick && 1 < b.group.length) && b.inner.css("cursor", "pointer").bind("click.fb", function(d) {
f(d.target).is("a") || f(d.target).parent().is("a") ||
(d.preventDefault(), b[a.closeClick ? "close" : "next"]())
}), a.closeBtn && f(a.tpl.closeBtn).appendTo(b.skin).bind("click.fb", function(a) {
a.preventDefault();
b.close()
}), a.arrows && 1 < b.group.length && ((a.loop || 0 < a.index) && f(a.tpl.prev).appendTo(b.outer).bind("click.fb", b.prev), (a.loop || a.index < b.group.length - 1) && f(a.tpl.next).appendTo(b.outer).bind("click.fb", b.next)), b.trigger("afterShow"), a.loop || a.index !== a.group.length - 1) ? b.opts.autoPlay && !b.player.isActive && (b.opts.autoPlay = !1, b.play(!0)) : b.play(!1))
},
_afterZoomOut: function(a) {
a = a || b.current;
f(".fancybox-wrap").trigger("onReset").remove();
f.extend(b, {
group: {},
opts: {},
router: !1,
current: null,
isActive: !1,
isOpened: !1,
isOpen: !1,
isClosing: !1,
wrap: null,
skin: null,
outer: null,
inner: null
});
b.trigger("afterClose", a)
}
});
b.transitions = {
getOrigPosition: function() {
var a = b.current,
d = a.element,
e = a.orig,
c = {},
f = 50,
g = 50,
h = a.hPadding,
k = a.wPadding,
n = b.getViewport();
!e && a.isDom && d.is(":visible") && (e = d.find("img:first"), e.length || (e = d));
u(e) ? (c = e.offset(), e.is("img") &&
(f = e.outerWidth(), g = e.outerHeight())) : (c.top = n.y + (n.h - g) * a.topRatio, c.left = n.x + (n.w - f) * a.leftRatio);
if ("fixed" === b.wrap.css("position") || a.locked) c.top -= n.y, c.left -= n.x;
return c = {
top: x(c.top - h * a.topRatio),
left: x(c.left - k * a.leftRatio),
width: x(f + k),
height: x(g + h)
}
},
step: function(a, d) {
var e, c, f = d.prop;
c = b.current;
var g = c.wrapSpace,
h = c.skinSpace;
if ("width" === f || "height" === f) e = d.end === d.start ? 1 : (a - d.start) / (d.end - d.start), b.isClosing && (e = 1 - e), c = "width" === f ? c.wPadding : c.hPadding, c = a - c, b.skin[f](m("width" ===
f ? c : c - g * e)), b.inner[f](m("width" === f ? c : c - g * e - h * e))
},
zoomIn: function() {
var a = b.current,
d = a.pos,
e = a.openEffect,
c = "elastic" === e,
l = f.extend({
opacity: 1
}, d);
delete l.position;
c ? (d = this.getOrigPosition(), a.openOpacity && (d.opacity = 0.1)) : "fade" === e && (d.opacity = 0.1);
b.wrap.css(d).animate(l, {
duration: "none" === e ? 0 : a.openSpeed,
easing: a.openEasing,
step: c ? this.step : null,
complete: b._afterZoomIn
})
},
zoomOut: function() {
var a = b.current,
d = a.closeEffect,
e = "elastic" === d,
c = {
opacity: 0.1
};
e && (c = this.getOrigPosition(), a.closeOpacity &&
(c.opacity = 0.1));
b.wrap.animate(c, {
duration: "none" === d ? 0 : a.closeSpeed,
easing: a.closeEasing,
step: e ? this.step : null,
complete: b._afterZoomOut
})
},
changeIn: function() {
var a = b.current,
d = a.nextEffect,
e = a.pos,
c = {
opacity: 1
},
f = b.direction,
g;
e.opacity = 0.1;
"elastic" === d && (g = "down" === f || "up" === f ? "top" : "left", "down" === f || "right" === f ? (e[g] = x(m(e[g]) - 200), c[g] = "+=200px") : (e[g] = x(m(e[g]) + 200), c[g] = "-=200px"));
"none" === d ? b._afterZoomIn() : b.wrap.css(e).animate(c, {
duration: a.nextSpeed,
easing: a.nextEasing,
complete: b._afterZoomIn
})
},
changeOut: function() {
var a = b.previous,
d = a.prevEffect,
e = {
opacity: 0.1
},
c = b.direction;
"elastic" === d && (e["down" === c || "up" === c ? "top" : "left"] = ("up" === c || "left" === c ? "-" : "+") + "=200px");
a.wrap.animate(e, {
duration: "none" === d ? 0 : a.prevSpeed,
easing: a.prevEasing,
complete: function() {
f(this).trigger("onReset").remove()
}
})
}
};
b.helpers.overlay = {
defaults: {
closeClick: !0,
speedOut: 200,
showEarly: !0,
css: {},
locked: !t,
fixed: !0
},
overlay: null,
fixed: !1,
el: f("html"),
create: function(a) {
var d;
a = f.extend({}, this.defaults, a);
this.overlay &&
this.close();
d = b.coming ? b.coming.parent : a.parent;
this.overlay = f('').appendTo(d && d.lenth ? d : "body");
this.fixed = !1;
a.fixed && b.defaults.fixed && (this.overlay.addClass("fancybox-overlay-fixed"), this.fixed = !0)
},
open: function(a) {
var d = this;
a = f.extend({}, this.defaults, a);
this.overlay ? this.overlay.unbind(".overlay").width("auto").height("auto") : this.create(a);
this.fixed || (q.bind("resize.overlay", f.proxy(this.update, this)), this.update());
a.closeClick && this.overlay.bind("click.overlay",
function(a) {
if (f(a.target).hasClass("fancybox-overlay")) return b.isActive ? b.close() : d.close(), !1
});
this.overlay.css(a.css).show()
},
close: function() {
q.unbind("resize.overlay");
this.el.hasClass("fancybox-lock") && (f(".fancybox-margin").removeClass("fancybox-margin"), this.el.removeClass("fancybox-lock"), q.scrollTop(this.scrollV).scrollLeft(this.scrollH));
f(".fancybox-overlay").remove().hide();
f.extend(this, {
overlay: null,
fixed: !1
})
},
update: function() {
var a = "100%",
b;
this.overlay.width(a).height("100%");
J ? (b = Math.max(H.documentElement.offsetWidth, H.body.offsetWidth), p.width() > b && (a = p.width())) : p.width() > q.width() && (a = p.width());
this.overlay.width(a).height(p.height())
},
onReady: function(a, b) {
var e = this.overlay;
f(".fancybox-overlay").stop(!0, !0);
e || this.create(a);
a.locked && this.fixed && b.fixed && (b.locked = this.overlay.append(b.wrap), b.fixed = !1);
!0 === a.showEarly && this.beforeShow.apply(this, arguments)
},
beforeShow: function(a, b) {
b.locked && !this.el.hasClass("fancybox-lock") && (!1 !== this.fixPosition && f("*").filter(function() {
return "fixed" ===
f(this).css("position") && !f(this).hasClass("fancybox-overlay") && !f(this).hasClass("fancybox-wrap")
}).addClass("fancybox-margin"), this.el.addClass("fancybox-margin"), this.scrollV = q.scrollTop(), this.scrollH = q.scrollLeft(), this.el.addClass("fancybox-lock"), q.scrollTop(this.scrollV).scrollLeft(this.scrollH));
this.open(a)
},
onUpdate: function() {
this.fixed || this.update()
},
afterClose: function(a) {
this.overlay && !b.coming && this.overlay.fadeOut(a.speedOut, f.proxy(this.close, this))
}
};
b.helpers.title = {
defaults: {
type: "float",
position: "bottom"
},
beforeShow: function(a) {
var d = b.current,
e = d.title,
c = a.type;
f.isFunction(e) && (e = e.call(d.element, d));
if (r(e) && "" !== f.trim(e)) {
d = f('
' + e + "
");
switch (c) {
case "inside":
c = b.skin;
break;
case "outside":
c = b.wrap;
break;
case "over":
c = b.inner;
break;
default:
c = b.skin, d.appendTo("body"), J && d.width(d.width()), d.wrapInner(''), b.current.margin[2] += Math.abs(m(d.css("margin-bottom")))
}
d["top" === a.position ? "prependTo" :
"appendTo"](c)
}
}
};
f.fn.fancybox = function(a) {
var d, e = f(this),
c = this.selector || "",
l = function(g) {
var h = f(this).blur(),
k = d,
l, m;
g.ctrlKey || g.altKey || g.shiftKey || g.metaKey || h.is(".fancybox-wrap") || (l = a.groupAttr || "data-fancybox-group", m = h.attr(l), m || (l = "rel", m = h.get(0)[l]), m && "" !== m && "nofollow" !== m && (h = c.length ? f(c) : e, h = h.filter("[" + l + '="' + m + '"]'), k = h.index(this)), a.index = k, !1 !== b.open(h, a) && g.preventDefault())
};
a = a || {};
d = a.index || 0;
c && !1 !== a.live ? p.undelegate(c, "click.fb-start").delegate(c + ":not('.fancybox-item, .fancybox-nav')",
"click.fb-start", l) : e.unbind("click.fb-start").bind("click.fb-start", l);
this.filter("[data-fancybox-start=1]").trigger("click");
return this
};
p.ready(function() {
var a, d;
f.scrollbarWidth === w && (f.scrollbarWidth = function() {
var a = f('
').appendTo("body"),
b = a.children(),
b = b.innerWidth() - b.height(99).innerWidth();
a.remove();
return b
});
f.support.fixedPosition === w && (f.support.fixedPosition = function() {
var a = f('').appendTo("body"),
b = 20 === a[0].offsetTop || 15 === a[0].offsetTop;
a.remove();
return b
}());
f.extend(b.defaults, {
scrollbarWidth: f.scrollbarWidth(),
fixed: f.support.fixedPosition,
parent: f("body")
});
a = f(s).width();
K.addClass("fancybox-lock-test");
d = f(s).width();
K.removeClass("fancybox-lock-test");
f("").appendTo("head")
})
})(window, document, jQuery);
/*!
* Media helper for fancyBox
* version: 1.0.6 (Fri, 14 Jun 2013)
* @requires fancyBox v2.0 or later
*
* Usage:
* $(".fancybox").fancybox({
* helpers : {
* media: true
* }
* });
*
* Set custom URL parameters:
* $(".fancybox").fancybox({
* helpers : {
* media: {
* youtube : {
* params : {
* autoplay : 0
* }
* }
* }
* }
* });
*
* Or:
* $(".fancybox").fancybox({,
* helpers : {
* media: true
* },
* youtube : {
* autoplay: 0
* }
* });
*
* Supports:
*
* Youtube
* http://www.youtube.com/watch?v=opj24KnzrWo
* http://www.youtube.com/embed/opj24KnzrWo
* http://youtu.be/opj24KnzrWo
* http://www.youtube-nocookie.com/embed/opj24KnzrWo
* Vimeo
* http://vimeo.com/40648169
* http://vimeo.com/channels/staffpicks/38843628
* http://vimeo.com/groups/surrealism/videos/36516384
* http://player.vimeo.com/video/45074303
* Metacafe
* http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/
* http://www.metacafe.com/watch/7635964/
* Dailymotion
* http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people
* Twitvid
* http://twitvid.com/QY7MD
* Twitpic
* http://twitpic.com/7p93st
* Instagram
* http://instagr.am/p/IejkuUGxQn/
* http://instagram.com/p/IejkuUGxQn/
* Google maps
* http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17
* http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
* http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56
*/
(function ($) {
"use strict";
//Shortcut for fancyBox object
var F = $.fancybox,
format = function( url, rez, params ) {
params = params || '';
if ( $.type( params ) === "object" ) {
params = $.param(params, true);
}
$.each(rez, function(key, value) {
url = url.replace( '$' + key, value || '' );
});
if (params.length) {
url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params;
}
return url;
};
//Add helper object
F.helpers.media = {
defaults : {
youtube : {
matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i,
params : {
autoplay : 1,
autohide : 1,
fs : 1,
rel : 0,
hd : 1,
wmode : 'opaque',
enablejsapi : 1
},
type : 'iframe',
url : '//www.youtube.com/embed/$3'
},
vimeo : {
matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/,
params : {
autoplay : 1,
hd : 1,
show_title : 1,
show_byline : 1,
show_portrait : 0,
fullscreen : 1
},
type : 'iframe',
url : '//player.vimeo.com/video/$1'
},
metacafe : {
matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/,
params : {
autoPlay : 'yes'
},
type : 'swf',
url : function( rez, params, obj ) {
obj.swf.flashVars = 'playerVars=' + $.param( params, true );
return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf';
}
},
dailymotion : {
matcher : /dailymotion.com\/video\/(.*)\/?(.*)/,
params : {
additionalInfos : 0,
autoStart : 1
},
type : 'swf',
url : '//www.dailymotion.com/swf/video/$1'
},
twitvid : {
matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i,
params : {
autoplay : 0
},
type : 'iframe',
url : '//www.twitvid.com/embed.php?guid=$1'
},
twitpic : {
matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i,
type : 'image',
url : '//twitpic.com/show/full/$1/'
},
instagram : {
matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
type : 'image',
url : '//$1/p/$2/media/?size=l'
},
google_maps : {
matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i,
type : 'iframe',
url : function( rez ) {
return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed');
}
}
},
beforeLoad : function(opts, obj) {
var url = obj.href || '',
type = false,
what,
item,
rez,
params;
for (what in opts) {
if (opts.hasOwnProperty(what)) {
item = opts[ what ];
rez = url.match( item.matcher );
if (rez) {
type = item.type;
params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null));
url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params );
break;
}
}
}
if (type) {
obj.href = url;
obj.type = type;
obj.autoHeight = false;
}
}
};
}(jQuery));
;
(function ($, window, document, undefined) {
var pluginName = "MegaMenu",
defaults = {
propertyName: "value"
};
var DELAY = 250;
// the list of menus
var menus = [];
function CustomMenu(element, options) {
this.element = element;
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.init();
}
CustomMenu.prototype = {
isOpen: false,
timeout: null,
init: function () {
var that = this;
$(this).each(function(index, menu) {
that.node = menu.element;
that.addListeners(menu.element);
var $menu = $(menu.element);
$menu.addClass("dropdownJavascript");
menus.push(menu.element);
$menu.find('ul > li').each(function(index, submenu) {
if ($(submenu).find('ul').length > 0 ) {
$(submenu).addClass('with-menu');
}
});
});
},
addListeners: function(menu) {
var that = this;
$(menu).mouseover(function(e) {
that.handleMouseOver.call(that, e);
}).mouseout(function(e) {
that.handleMouseOut.call(that, e);
});
},
handleMouseOver: function (e) {
var that = this;
// clear the timeout
this.clearTimeout();
// find the parent list item
//var item = ('target' in e ? e.target : e.srcElement);
var item = e.target || e.srcElement;
while (item.nodeName != 'LI' && item != this.node) {
item = item.parentNode;
}
// if the target is within a list item, set the timeout
if (item.nodeName == 'LI') {
this.toOpen = item;
this.timeout = setTimeout(function() {
that.open.call(that);
}, this.options.delay);
}
},
handleMouseOut: function () {
var that = this;
// clear the timeout
this.clearTimeout();
this.timeout = setTimeout(function() {
that.close.call(that);
}, this.options.delay);
},
clearTimeout: function () {
// clear the timeout
if (this.timeout) {
clearTimeout(this.timeout);
this.timeout = null;
}
},
open: function () {
var that = this;
// store that the menu is open
this.isOpen = true;
// loop over the list items with the same parent
var items = $(this.toOpen).parent().children('li');
$(items).each(function(index, item) {
$(item).find("ul").each(function(index, submenu) {
if (item != that.toOpen) {
// close the submenu
$(item).removeClass("dropdownOpen");
that.close(item);
} else if (!$(item).hasClass('dropdownOpen')) {
// open the submenu
//if ( !$(item).parents('li').hasClass('has-mega-menu') ) {
$(item).addClass("dropdownOpen");
//}
// determine the location of the edges of the submenu
var left = 0;
var node = submenu;
while (node) {
//abs is because when you make menus right to left
//the offsetLeft would be negative
left += Math.abs(node.offsetLeft);
node = node.offsetParent;
}
var right = left + submenu.offsetWidth;
//We should refactor this code to execute only when menu is vertical
var menuHeight = $(submenu).outerHeight();
var parentTop = $(submenu).offset().top - $(window).scrollTop();
var totalHeight = menuHeight + parentTop;
var windowHeight = window.innerHeight;
/* if (totalHeight > windowHeight) {
var bestTop = (windowHeight - totalHeight) - 20;
$(submenu).css('margin-top', bestTop + "px");
}*/
//remove any previous classes
$(item).removeClass('dropdownRightToLeft');
// move the submenu to the right of the item if appropriate
if (left < 0) $(item).addClass('dropdownLeftToRight');
// move the submenu to the left of the item if appropriate
if (right > document.body.clientWidth) {
$(item).addClass('dropdownRightToLeft');
}
}
});
});
},
close: function (node) {
// if no node was specified, close all menus
if (!node) {
this.isOpen = false;
node = this.node;
}
// loop over the items, closing their submenus
$(node).find('li').each(function(index, item) {
$(item).removeClass('dropdownOpen');
});
}
};
$.fn[pluginName] = function (options) {
return this.each(function () {
if (!$.data(this, "plugin_" + pluginName)) {
$.data(this, "plugin_" + pluginName,
new CustomMenu(this, options));
}
});
};
})(jQuery, window, document);
/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
* Build: http://modernizr.com/download/#-cssanimations-csstransitions-touch-shiv-cssclasses-prefixed-teststyles-testprop-testallprops-prefixes-domprefixes-load
*/
;
window.Modernizr = function(a, b, c) {
function z(a) {
j.cssText = a
}
function A(a, b) {
return z(m.join(a + ";") + (b || ""))
}
function B(a, b) {
return typeof a === b
}
function C(a, b) {
return !!~("" + a).indexOf(b)
}
function D(a, b) {
for (var d in a) {
var e = a[d];
if (!C(e, "-") && j[e] !== c) return b == "pfx" ? e : !0
}
return !1
}
function E(a, b, d) {
for (var e in a) {
var f = b[a[e]];
if (f !== c) return d === !1 ? a[e] : B(f, "function") ? f.bind(d || b) : f
}
return !1
}
function F(a, b, c) {
var d = a.charAt(0).toUpperCase() + a.slice(1),
e = (a + " " + o.join(d + " ") + d).split(" ");
return B(b, "string") || B(b, "undefined") ? D(e, b) : (e = (a + " " + p.join(d + " ") + d).split(" "), E(e, b, c))
}
var d = "2.6.2",
e = {},
f = !0,
g = b.documentElement,
h = "modernizr",
i = b.createElement(h),
j = i.style,
k, l = {}.toString,
m = " -webkit- -moz- -o- -ms- ".split(" "),
n = "Webkit Moz O ms",
o = n.split(" "),
p = n.toLowerCase().split(" "),
q = {},
r = {},
s = {},
t = [],
u = t.slice,
v, w = function(a, c, d, e) {
var f, i, j, k, l = b.createElement("div"),
m = b.body,
n = m || b.createElement("body");
if (parseInt(d, 10))
while (d--) j = b.createElement("div"), j.id = e ? e[d] : h + (d + 1), l.appendChild(j);
return f = ["", '"].join(""), l.id = h, (m ? l : n).innerHTML += f, n.appendChild(l), m || (n.style.background = "", n.style.overflow = "hidden", k = g.style.overflow, g.style.overflow = "hidden", g.appendChild(n)), i = c(l, a), m ? l.parentNode.removeChild(l) : (n.parentNode.removeChild(n), g.style.overflow = k), !!i
},
x = {}.hasOwnProperty,
y;
!B(x, "undefined") && !B(x.call, "undefined") ? y = function(a, b) {
return x.call(a, b)
} : y = function(a, b) {
return b in a && B(a.constructor.prototype[b], "undefined")
}, Function.prototype.bind || (Function.prototype.bind = function(b) {
var c = this;
if (typeof c != "function") throw new TypeError;
var d = u.call(arguments, 1),
e = function() {
if (this instanceof e) {
var a = function() {};
a.prototype = c.prototype;
var f = new a,
g = c.apply(f, d.concat(u.call(arguments)));
return Object(g) === g ? g : f
}
return c.apply(b, d.concat(u.call(arguments)))
};
return e
}), q.touch = function() {
var c;
return "ontouchstart" in a || a.DocumentTouch && b instanceof DocumentTouch ? c = !0 : w(["@media (", m.join("touch-enabled),("), h, ")", "{#modernizr{top:9px;position:absolute}}"].join(""), function(a) {
c = a.offsetTop === 9
}), c
}, q.cssanimations = function() {
return F("animationName")
}, q.csstransitions = function() {
return F("transition")
};
for (var G in q) y(q, G) && (v = G.toLowerCase(), e[v] = q[G](), t.push((e[v] ? "" : "no-") + v));
return e.addTest = function(a, b) {
if (typeof a == "object")
for (var d in a) y(a, d) && e.addTest(d, a[d]);
else {
a = a.toLowerCase();
if (e[a] !== c) return e;
b = typeof b == "function" ? b() : b, typeof f != "undefined" && f && (g.className += " " + (b ? "" : "no-") + a), e[a] = b
}
return e
}, z(""), i = k = null,
function(a, b) {
function k(a, b) {
var c = a.createElement("p"),
d = a.getElementsByTagName("head")[0] || a.documentElement;
return c.innerHTML = "x", d.insertBefore(c.lastChild, d.firstChild)
}
function l() {
var a = r.elements;
return typeof a == "string" ? a.split(" ") : a
}
function m(a) {
var b = i[a[g]];
return b || (b = {}, h++, a[g] = h, i[h] = b), b
}
function n(a, c, f) {
c || (c = b);
if (j) return c.createElement(a);
f || (f = m(c));
var g;
return f.cache[a] ? g = f.cache[a].cloneNode() : e.test(a) ? g = (f.cache[a] = f.createElem(a)).cloneNode() : g = f.createElem(a), g.canHaveChildren && !d.test(a) ? f.frag.appendChild(g) : g
}
function o(a, c) {
a || (a = b);
if (j) return a.createDocumentFragment();
c = c || m(a);
var d = c.frag.cloneNode(),
e = 0,
f = l(),
g = f.length;
for (; e < g; e++) d.createElement(f[e]);
return d
}
function p(a, b) {
b.cache || (b.cache = {}, b.createElem = a.createElement, b.createFrag = a.createDocumentFragment, b.frag = b.createFrag()), a.createElement = function(c) {
return r.shivMethods ? n(c, a, b) : b.createElem(c)
}, a.createDocumentFragment = Function("h,f", "return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" + l().join().replace(/\w+/g, function(a) {
return b.createElem(a), b.frag.createElement(a), 'c("' + a + '")'
}) + ");return n}")(r, b.frag)
}
function q(a) {
a || (a = b);
var c = m(a);
return r.shivCSS && !f && !c.hasCSS && (c.hasCSS = !!k(a, "article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")), j || p(a, c), a
}
var c = a.html5 || {},
d = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,
e = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,
f, g = "_html5shiv",
h = 0,
i = {},
j;
(function() {
try {
var a = b.createElement("a");
a.innerHTML = "", f = "hidden" in a, j = a.childNodes.length == 1 || function() {
b.createElement("a");
var a = b.createDocumentFragment();
return typeof a.cloneNode == "undefined" || typeof a.createDocumentFragment == "undefined" || typeof a.createElement == "undefined"
}()
} catch (c) {
f = !0, j = !0
}
})();
var r = {
elements: c.elements || "abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",
shivCSS: c.shivCSS !== !1,
supportsUnknownElements: j,
shivMethods: c.shivMethods !== !1,
type: "default",
shivDocument: q,
createElement: n,
createDocumentFragment: o
};
a.html5 = r, q(b)
}(this, b), e._version = d, e._prefixes = m, e._domPrefixes = p, e._cssomPrefixes = o, e.testProp = function(a) {
return D([a])
}, e.testAllProps = F, e.testStyles = w, e.prefixed = function(a, b, c) {
return b ? F(a, b, c) : F(a, "pfx")
}, g.className = g.className.replace(/(^|\s)no-js(\s|$)/, "$1$2") + (f ? " js " + t.join(" ") : ""), e
}(this, this.document),
function(a, b, c) {
function d(a) {
return "[object Function]" == o.call(a)
}
function e(a) {
return "string" == typeof a
}
function f() {}
function g(a) {
return !a || "loaded" == a || "complete" == a || "uninitialized" == a
}
function h() {
var a = p.shift();
q = 1, a ? a.t ? m(function() {
("c" == a.t ? B.injectCss : B.injectJs)(a.s, 0, a.a, a.x, a.e, 1)
}, 0) : (a(), h()) : q = 0
}
function i(a, c, d, e, f, i, j) {
function k(b) {
if (!o && g(l.readyState) && (u.r = o = 1, !q && h(), l.onload = l.onreadystatechange = null, b)) {
"img" != a && m(function() {
t.removeChild(l)
}, 50);
for (var d in y[c]) y[c].hasOwnProperty(d) && y[c][d].onload()
}
}
var j = j || B.errorTimeout,
l = b.createElement(a),
o = 0,
r = 0,
u = {
t: d,
s: c,
e: f,
a: i,
x: j
};
1 === y[c] && (r = 1, y[c] = []), "object" == a ? l.data = c : (l.src = c, l.type = a), l.width = l.height = "0", l.onerror = l.onload = l.onreadystatechange = function() {
k.call(this, r)
}, p.splice(e, 0, u), "img" != a && (r || 2 === y[c] ? (t.insertBefore(l, s ? null : n), m(k, j)) : y[c].push(l))
}
function j(a, b, c, d, f) {
return q = 0, b = b || "j", e(a) ? i("c" == b ? v : u, a, b, this.i++, c, d, f) : (p.splice(this.i++, 0, a), 1 == p.length && h()), this
}
function k() {
var a = B;
return a.loader = {
load: j,
i: 0
}, a
}
var l = b.documentElement,
m = a.setTimeout,
n = b.getElementsByTagName("script")[0],
o = {}.toString,
p = [],
q = 0,
r = "MozAppearance" in l.style,
s = r && !!b.createRange().compareNode,
t = s ? l : n.parentNode,
l = a.opera && "[object Opera]" == o.call(a.opera),
l = !!b.attachEvent && !l,
u = r ? "object" : l ? "script" : "img",
v = l ? "script" : u,
w = Array.isArray || function(a) {
return "[object Array]" == o.call(a)
},
x = [],
y = {},
z = {
timeout: function(a, b) {
return b.length && (a.timeout = b[0]), a
}
},
A, B;
B = function(a) {
function b(a) {
var a = a.split("!"),
b = x.length,
c = a.pop(),
d = a.length,
c = {
url: c,
origUrl: c,
prefixes: a
},
e, f, g;
for (f = 0; f < d; f++) g = a[f].split("="), (e = z[g.shift()]) && (c = e(c, g));
for (f = 0; f < b; f++) c = x[f](c);
return c
}
function g(a, e, f, g, h) {
var i = b(a),
j = i.autoCallback;
i.url.split(".").pop().split("?").shift(), i.bypass || (e && (e = d(e) ? e : e[a] || e[g] || e[a.split("/").pop().split("?")[0]]), i.instead ? i.instead(a, e, f, g, h) : (y[i.url] ? i.noexec = !0 : y[i.url] = 1, f.load(i.url, i.forceCSS || !i.forceJS && "css" == i.url.split(".").pop().split("?").shift() ? "c" : c, i.noexec, i.attrs, i.timeout), (d(e) || d(j)) && f.load(function() {
k(), e && e(i.origUrl, h, g), j && j(i.origUrl, h, g), y[i.url] = 2
})))
}
function h(a, b) {
function c(a, c) {
if (a) {
if (e(a)) c || (j = function() {
var a = [].slice.call(arguments);
k.apply(this, a), l()
}), g(a, j, b, 0, h);
else if (Object(a) === a)
for (n in m = function() {
var b = 0,
c;
for (c in a) a.hasOwnProperty(c) && b++;
return b
}(), a) a.hasOwnProperty(n) && (!c && !--m && (d(j) ? j = function() {
var a = [].slice.call(arguments);
k.apply(this, a), l()
} : j[n] = function(a) {
return function() {
var b = [].slice.call(arguments);
a && a.apply(this, b), l()
}
}(k[n])), g(a[n], j, b, n, h))
} else !c && l()
}
var h = !!a.test,
i = a.load || a.both,
j = a.callback || f,
k = j,
l = a.complete || f,
m, n;
c(h ? a.yep : a.nope, !!i), i && c(i)
}
var i, j, l = this.yepnope.loader;
if (e(a)) g(a, 0, l, 0);
else if (w(a))
for (i = 0; i < a.length; i++) j = a[i], e(j) ? g(j, 0, l, 0) : w(j) ? B(j) : Object(j) === j && h(j, l);
else Object(a) === a && h(a, l)
}, B.addPrefix = function(a, b) {
z[a] = b
}, B.addFilter = function(a) {
x.push(a)
}, B.errorTimeout = 1e4, null == b.readyState && b.addEventListener && (b.readyState = "loading", b.addEventListener("DOMContentLoaded", A = function() {
b.removeEventListener("DOMContentLoaded", A, 0), b.readyState = "complete"
}, 0)), a.yepnope = k(), a.yepnope.executeStack = h, a.yepnope.injectJs = function(a, c, d, e, i, j) {
var k = b.createElement("script"),
l, o, e = e || B.errorTimeout;
k.src = a;
for (o in d) k.setAttribute(o, d[o]);
c = j ? h : c || f, k.onreadystatechange = k.onload = function() {
!l && g(k.readyState) && (l = 1, c(), k.onload = k.onreadystatechange = null)
}, m(function() {
l || (l = 1, c(1))
}, e), i ? k.onload() : n.parentNode.insertBefore(k, n)
}, a.yepnope.injectCss = function(a, c, d, e, g, i) {
var e = b.createElement("link"),
j, c = i ? h : c || f;
e.href = a, e.rel = "stylesheet", e.type = "text/css";
for (j in d) e.setAttribute(j, d[j]);
g || (n.parentNode.insertBefore(e, n), m(c, 0))
}
}(this, document), Modernizr.load = function() {
yepnope.apply(window, [].slice.call(arguments, 0))
};
;
(function($, window, undefined) {
'use strict';
// global
var Modernizr = window.Modernizr,
$body = $('body');
$.DLMenu = function(options, element) {
this.$el = $(element);
this._init(options);
};
$.DLMenu.defaults = {
animationClasses: {
classin: 'mk-vm-animate-in-' + mk_vertical_header_anim,
classout: 'mk-vm-animate-out-' + mk_vertical_header_anim
},
onLevelClick: function(el, name) {
return false;
},
onLinkClick: function(el, ev) {
return false;
}
};
$.DLMenu.prototype = {
_init: function(options) {
this.options = $.extend(true, {}, $.DLMenu.defaults, options);
this._config();
var animEndEventNames = {
'WebkitAnimation': 'webkitAnimationEnd',
'OAnimation': 'oAnimationEnd',
'msAnimation': 'MSAnimationEnd',
'animation': 'animationend'
},
transEndEventNames = {
'WebkitTransition': 'webkitTransitionEnd',
'MozTransition': 'transitionend',
'OTransition': 'oTransitionEnd',
'msTransition': 'MSTransitionEnd',
'transition': 'transitionend'
};
this.animEndEventName = animEndEventNames[Modernizr.prefixed('animation')] + '.dlmenu';
this.transEndEventName = transEndEventNames[Modernizr.prefixed('transition')] + '.dlmenu';
this.animEndEventNameUnsufixed = animEndEventNames[Modernizr.prefixed('animation')];
this.transEndEventNameUnsufixed = transEndEventNames[Modernizr.prefixed('transition')];
this.supportAnimations = Modernizr.cssanimations;
this.supportTransitions = Modernizr.csstransitions;
this._initEvents();
},
_config: function() {
this.open = false;
this.$trigger = this.$el.children('.mk-vm-trigger');
this.$menu = this.$el.children('ul.mk-vm-menu');
this.$menuitems = this.$menu.find('li:not(.mk-vm-back)');
this.$back = this.$menu.find('li.mk-vm-back');
},
_initEvents: function() {
var self = this;
$('.mk-vm-menuwrapper a').on('transitionend', function(event) {
event.stopPropagation();
});
this.$menuitems.on('click.dlmenu', 'a', function(event) {
// Breaks smooth scroll in vertical menu
// event.stopPropagation();
var $item = $(event.delegateTarget),
$submenu = $(event.currentTarget).siblings('ul.sub-menu');
if ($submenu.length > 0) {
var $flyin = $submenu.clone().css('opacity', 0).insertAfter(self.$menu),
onAnimationEndFn = function() {
self.$menu.off(self.animEndEventName).removeClass(self.options.animationClasses.classout).addClass('mk-vm-subview');
$item.addClass('mk-vm-subviewopen').parents('.mk-vm-subviewopen:first').removeClass('mk-vm-subviewopen').addClass('mk-vm-subview');
$flyin.remove();
};
setTimeout(function() {
$flyin.addClass(self.options.animationClasses.classin);
self.$menu.addClass(self.options.animationClasses.classout);
if (self.supportAnimations) {
self.$menu.on(self.animEndEventName, onAnimationEndFn);
} else {
onAnimationEndFn.call();
}
self.options.onLevelClick($item, $item.children('a:first').text());
});
if (self.open) {
self._closeMenu();
} else {
self._openMenu();
}
return false;
} else {
self.options.onLinkClick($item, event);
}
});
// this.$trigger.on('click.dlmenu', function() {
// if (self.open) {
// self._closeMenu();
// } else {
// // if( ! $(this).hasClass('menu-item-has-children') ) return false;
// self._openMenu();
// }
// return false;
// });
this.$back.on('click.dlmenu', function(event) {
var $this = $(this),
$submenu = $this.parents('ul.sub-menu:first'),
$item = $submenu.parent(),
$flyin = $submenu.clone().insertAfter(self.$menu);
var onAnimationEndFn = function() {
self.$menu.off(self.animEndEventName).removeClass(self.options.animationClasses.classin);
$flyin.remove();
};
setTimeout(function() {
$flyin.addClass(self.options.animationClasses.classout);
self.$menu.addClass(self.options.animationClasses.classin);
if (self.supportAnimations) {
self.$menu.on(self.animEndEventName, onAnimationEndFn);
} else {
onAnimationEndFn.call();
}
$item.removeClass('mk-vm-subviewopen');
var $subview = $this.parents('.mk-vm-subview:first');
if ($subview.is('li')) {
$subview.addClass('mk-vm-subviewopen');
}
$subview.removeClass('mk-vm-subview');
});
return false;
});
},
closeMenu: function() {
if (this.open) {
this._closeMenu();
}
},
_closeMenu: function() {
var self = this,
onTransitionEndFn = function() {
self.$menu.off(self.transEndEventName);
self._resetMenu();
};
this.$menu.removeClass('mk-vm-menuopen');
this.$menu.addClass('mk-vm-menu-toggle');
this.$trigger.removeClass('mk-vm-active');
if (this.supportTransitions) {
this.$menu.on(this.transEndEventName, onTransitionEndFn);
} else {
onTransitionEndFn.call();
}
this.open = false;
},
openMenu: function() {
if (!this.open) {
this._openMenu();
}
},
_openMenu: function() {
var self = this;
$body.off('click').on('click.dlmenu', function() {
self._closeMenu();
});
this.$menu.addClass('mk-vm-menuopen mk-vm-menu-toggle').on(this.transEndEventName, function() {
$(this).removeClass('mk-vm-menu-toggle');
});
this.$trigger.addClass('mk-vm-active');
this.open = true;
},
_resetMenu: function() {
this.$menu.removeClass('mk-vm-subview');
this.$menuitems.removeClass('mk-vm-subview mk-vm-subviewopen');
}
};
var logError = function(message) {
if (window.console) {
window.console.error(message);
}
};
$.fn.dlmenu = function(options) {
if (typeof options === 'string') {
var args = Array.prototype.slice.call(arguments, 1);
this.each(function() {
var instance = $.data(this, 'dlmenu');
if (!instance) {
logError("cannot call methods on dlmenu prior to initialization; " +
"attempted to call method '" + options + "'");
return;
}
if (!$.isFunction(instance[options]) || options.charAt(0) === "_") {
logError("no such method '" + options + "' for dlmenu instance");
return;
}
instance[options].apply(instance, args);
});
} else {
this.each(function() {
var instance = $.data(this, 'dlmenu');
if (instance) {
instance._init();
} else {
instance = $.data(this, 'dlmenu', new $.DLMenu(options, this));
}
});
}
return this;
};
})(jQuery, window);
( function($) {
'use strict';
/*
* Define popup / hover states manually to prevent click for IE on touchdevices
*/
$('.mk-main-navigation .menu-item-has-children').children('a').attr('aria-haspopup', 'true');
$('.animated-column-item').attr('aria-haspopup', 'true');
})( jQuery );
(function($) {
'use strict';
var Accordion = function(el) {
// Private
var that = this,
$el = $(el),
initial = $el.data('initialindex'),
timeout;
// Public
this.$el = $el;
this.$single = $('.' + this.dom.single, $el);
this.isExpendable = ($el.data('style') === 'toggle-action');
// Init
this.bindClicks();
// Reveal initial tab on load event (wait for possible images inside)
$(window).on('load', function() {
if( initial !== -1 ) that.show(that.$single.eq(initial))
});
$(window).on('resize', function() {
clearTimeout(timeout);
timeout = setTimeout(that.bindClicks.bind(that), 500);
});
}
Accordion.prototype.dom = {
// only class names please!
single : 'mk-accordion-single',
tab : 'mk-accordion-tab',
pane : 'mk-accordion-pane',
current : 'current',
mobileToggle : 'mobile-false',
mobileBreakPoint : 767
}
Accordion.prototype.bindClicks = function() {
// Prevent multiple events binding
this.$single.off('click', '.' + this.dom.tab);
if( !(window.matchMedia('(max-width: ' + this.dom.mobileBreakPoint +'px)').matches
&& this.$el.hasClass(this.dom.mobileToggle)) ) {
this.$single.on('click', '.' + this.dom.tab, this.handleEvent.bind(this));
// When website is loaded in mobile view and resized to desktop 'current' will
// inherit display: none from css. Repair it by calling show() on this element
var $current = $('.' + this.dom.current, this.$el);
if($('.' + this.dom.pane, $current).css('display') === 'none') this.show($current);
}
}
Accordion.prototype.handleEvent = function(e) {
e.preventDefault();
e.stopPropagation();
var $single = $(e.delegateTarget);
if(!$single.hasClass(this.dom.current)) {
this.show($single);
}
else {
if(this.isExpendable) this.hide($single);
}
}
Accordion.prototype.hide = function($single) {
$single.removeClass(this.dom.current);
$('.' + this.dom.pane, $single).slideUp();
}
Accordion.prototype.show = function($single) {
// hide currently opened tab
if(!this.isExpendable) {
var that = this;
this.hide($('.' + this.dom.current, that.$el));
}
$single.addClass(this.dom.current);
$('.' + this.dom.pane, $single).slideDown();
}
// ///////////////////////////////////////
//
// Apply to:
//
// ///////////////////////////////////////
$('.mk-accordion').each(function() {
new Accordion(this);
});
})(jQuery);
(function($) {
'use strict';
if( typeof Raphael === 'undefined' ) return;
var SkillDiagram = function( el ) {
this.el = el;
}
SkillDiagram.prototype = {
init : function() {
this.cacheElements();
this.createDiagram();
this.$skills.each( this.createSkill.bind( this ) );
},
cacheElements : function() {
this.$el = $( this.el );
this.$skills = this.$el.find( '.mk-meter-arch');
this.config = this.$el.data();
this.config.radius = this.config.dimension / 2;
},
random : function( l, u ) {
return Math.floor( ( Math.random() * ( u - l + 1 ) ) + l );
},
createDiagram : function() {
var self = this;
this.diagram = Raphael( this.el, this.config.dimension, this.config.dimension );
this.diagram.circle( this.config.radius, this.config.radius, 80 ).attr({
stroke: 'none',
fill: this.config.circleColor
});
// Export title
this.title = this.diagram.text( this.config.radius, this.config.radius, this.config.defaultText ).attr({
font: "22px helvetica",
fill: this.config.defaultTextColor
}).toFront();
this.diagram.customAttributes.arc = function(value, color, rad){
var v = 3.6 * value,
alpha = v == 360 ? 359.99 : v,
r = self.random( 91, 240 ),
a = (r - alpha) * Math.PI/180,
b = r * Math.PI/180,
sx = self.config.radius + rad * Math.cos(b),
sy = self.config.radius - rad * Math.sin(b),
x = self.config.radius + rad * Math.cos(a),
y = self.config.radius - rad * Math.sin(a),
path = [['M', sx, sy], ['A', rad, rad, 0, +(alpha > 180), 1, x, y]];
return {
path: path,
stroke: color
}
}
},
createSkill : function( id, el ) {
var self = this,
$this = $( el ),
config = $this.data(),
radMin = 72,
radVal = 27,
newRad = radMin + ( radVal * (id + 1) );
var $path = this.diagram.path().attr({
'stroke-width': 28,
arc: [config.percent, config.color, newRad]
});
$path.mouseover( function() {
self.showSkill( this, config.name, config.percent );
}).mouseout( function() {
self.hideSkill( this )
});
},
showSkill : function( self, name, percent ) {
var $this = self,
time = 250;
//solves IE problem
if(Raphael.type != 'VML') $this.toFront();
$this.animate({
'stroke-width': 50,
'opacity': 0.9,
}, 800, 'elastic' );
this.title.stop()
.animate({ opacity: 0 }, time, '>', function(){
this.attr({ text: name + '\n' + percent + '%' }).animate({ opacity: 1 }, time, '<');
}).toFront();
},
hideSkill : function( self ) {
var $this = self,
self = this,
time = 250;
$this.stop().animate({
'stroke-width': 28,
opacity: 1
}, time * 4, 'elastic' );
self.title.stop()
.animate({ opacity: 0 }, time, '>', function(){
self.title.attr({ text: self.config.defaultText })
.animate({ opacity: 1 }, time, '<');
});
}
}
$( '.mk-skill-diagram' ).each( function() {
var diagram = new SkillDiagram( this );
diagram.init();
});
})(jQuery);
/*
* Tab delegation
* Action for modules when we don't have access to chidren DOM on processing templates
* yet we want ass option of opening link in new tab.
* Helpful for use with external widgets like flickr
*/
(function($) {
'use strict';
$( '[data-js="tab-delegation"]' ).each( tabDelegation );
function tabDelegation() {
var $this = $( this ),
data = $this.data();
// Create delegation on parent element to affect async loaded children
if( data.tab ) $this.on( 'click', 'a', openInTab );
}
function openInTab( e ) {
e.preventDefault();
var $this = $( this ),
url = $this.attr( 'href' );
window.open( url, '_blank' );
}
})(jQuery);
(function($) {
'use strict';
var Toggle = function(el) {
var that = this,
$el = $(el);
this.$el = $el;
$(window).on('load', function() {
$el.toggle(that.open.bind(that), that.close.bind(that));
});
};
Toggle.prototype.dom = {
pane : 'mk-toggle-pane',
active : 'active-toggle'
};
Toggle.prototype.open = function() {
var $this = this.$el;
$this.addClass(this.dom.active);
$this.siblings('.' + this.dom.pane).slideDown(200);
};
Toggle.prototype.close = function() {
var $this = this.$el;
$this.removeClass(this.dom.active);
$this.siblings('.' + this.dom.pane).slideUp(200);
};
// ///////////////////////////////////////
//
// Apply to:
//
// ///////////////////////////////////////
var $toggle = $('.mk-toggle-title');
if(!$toggle.length) return;
$toggle.each(function() {
new Toggle(this);
});
})(jQuery);
//////////////////////////////////////////////////////////////////////////
//
// Init all scripts
//
//////////////////////////////////////////////////////////////////////////
// This is bad but we don't have other access to this scope.
// Ajax Portfolio is defined as plugin and on success needs these to be reinited
// We'll refactor all of this.
window.ajaxInit = function() {
mk_lightbox_init();
mk_click_events();
mk_social_share_global();
mk_social_share();
mk_gallery();
loop_audio_init();
};
window.ajaxDelayedInit = function() {
mk_flexslider_init();
// mk_portfolio_ajax();
};
$(document).ready(function() {
mk_lightbox_init();
mk_login_form();
mk_backgrounds_parallax();
mk_flexslider_init();
mk_event_countdown();
mk_skill_meter();
mk_milestone();
mk_ajax_search();
mk_hover_events();
mk_portfolio_ajax();
mk_love_post();
product_loop_add_cart();
mk_social_share();
mk_portfolio_widget();
mk_contact_form();
mk_blog_carousel();
mk_header_searchform();
mk_click_events();
mk_text_typer();
mk_tab_slider_func();
$(window).load(function() {
mk_unfold_footer();
mk_tabs();
mk_accordion_toggles_tooltip();
mk_gallery();
mk_theatre_responsive_calculator();
mk_tabs_responsive();
mk_start_tour_resize();
mk_header_social_resize();
mk_page_section_social_video_bg();
loop_audio_init();
mk_one_page_scroller();
setTimeout(function() {
/*
Somehow the values are not correctly updated for the screens
and we need to put setTimeout to fix the issue
*/
mk_mobile_tablet_responsive_calculator();
}, 300);
console.log("ready for rock");
});
var onDebouncedResize = function() {
mk_theatre_responsive_calculator();
mk_mobile_tablet_responsive_calculator();
mk_tabs_responsive();
mk_accordion_toggles_tooltip();
mk_start_tour_resize();
mk_header_social_resize();
setTimeout(function() {
mk_unfold_footer();
}, 300);
};
var debounceResize = null;
$(window).on("resize", function() {
if( debounceResize !== null ) { clearTimeout( debounceResize ); }
debounceResize = setTimeout( onDebouncedResize, 300 );
});
var onDebouncedScroll = function() {
mk_skill_meter();
//TODO: Ask to Bart how we can call javascript component
//mk_charts();
mk_milestone();
};
var debounceScroll = null;
$(window).on("scroll", function() {
if( debounceScroll !== null ) { clearTimeout( debounceScroll ); }
debounceScroll = setTimeout( onDebouncedScroll, 100 );
});
if (MK.utils.isMobile()) {
$('body').addClass('no-transform');
}
});
/* Typer */
/* -------------------------------------------------------------------- */
function mk_text_typer() {
"use strict";
$('[data-typer-targets]').each(function() {
var that = this;
MK.core.loadDependencies([ MK.core.path.plugins + 'jquery.typed.js' ], function() {
var $this = $(that),
$first_string = [$this.text()],
$rest_strings = $this.attr('data-typer-targets').split(','),
$strings = $first_string.concat($rest_strings);
$this.text('');
$this.typed({
strings: $strings,
typeSpeed: 30, // typing speed
backDelay: 1200, // pause before backspacing
loop: true, // loop on or off (true or false)
loopCount: false, // number of loops, false = infinite
});
});
});
}
/* Tab Slider */
/* -------------------------------------------------------------------- */
function mk_tab_slider_func() {
"use strict";
$('.mk-tab-slider').each(function() {
var that = this;
MK.core.loadDependencies([ MK.core.path.plugins + 'jquery.swiper.js' ], function() {
var $this = $(that),
id = $this.data('id'),
$autoplayTime = $this.data('autoplay'),
$content = $('.mk-slider-content');
var mk_tab_slider = $this.swiper({
wrapperClass: 'mk-tab-slider-wrapper',
slideClass: 'mk-tab-slider-item',
calculateHeight: true,
speed: 500,
autoplay: $autoplayTime,
onSlideChangeStart: function() {
$('.mk-tab-slider-nav[data-id="' + id + '"]').find(".active").removeClass('active')
$('.mk-tab-slider-nav[data-id="' + id + '"]').find("a").eq(mk_tab_slider.activeIndex).addClass('active')
}
});
// Simple repaint for firefox issue (can't handle 100% height after plugin init)
function repaintFirefox() {
$content.css('display','block');
setTimeout(function() {
mk_tab_slider.reInit();
$content.css('display','table');
},100);
}
$('.mk-tab-slider-nav[data-id="' + id + '"]').find("a").first().addClass('active');
$('.mk-tab-slider-nav[data-id="' + id + '"]').find("a").on('touchstart mousedown', function(e) {
e.preventDefault()
$('.mk-tab-slider-nav[data-id="' + id + '"]').find(".active").removeClass('active')
$(this).addClass('active')
mk_tab_slider.swipeTo($(this).index())
});
$('.mk-tab-slider-nav[data-id="' + id + '"]').find("a").click(function(e) {
e.preventDefault();
});
repaintFirefox();
$(window).on('resize', repaintFirefox);
});
});
}
/* Edge One Pager */
/* -------------------------------------------------------------------- */
function mk_one_page_scroller() {
"use strict";
$('.mk-edge-one-pager').each(function() {
var self = this;
MK.core.loadDependencies([ MK.core.path.plugins + 'jquery.fullpage.js' ], function() {
var $this = $(self),
$tooltip_txt = [];
$this.find('.section').each(function() {
$tooltip_txt.push($(this).attr('data-title'));
});
var scrollable = true;
$this.find('.section').each(function() {
var $section = $(this),
$content = $section.find('.edge-slide-content'),
sectionHeight = $section.height(),
contentHeight = $content.innerHeight();
if((contentHeight + 30) > $(window).height()) {
scrollable = false;
}
});
if(!scrollable){
$this.find('.section').each(function() {
var $section = $(this);
$section.addClass('active').css({
'padding-bottom': '50px'
});
});
}
if(scrollable) {
$this.fullpage({
verticalCentered: false,
resize: true,
slidesColor: ['#ccc', '#fff'],
anchors: $tooltip_txt,
scrollingSpeed: 600,
easing: 'easeInQuart',
menu: false,
navigation: true,
navigationPosition: 'right',
navigationTooltips: false,
slidesNavigation: true,
slidesNavPosition: 'bottom',
loopBottom: false,
loopTop: false,
loopHorizontal: true,
autoScrolling: true,
scrollOverflow: false,
css3: true,
paddingTop: 0,
paddingBottom: 0,
normalScrollElements: '.mk-header, .mk-responsive-wrap',
normalScrollElementTouchThreshold: 5,
keyboardScrolling: true,
touchSensitivity: 15,
continuousVertical: false,
animateAnchor: true,
onLeave: function(index, nextIndex, direction) {
var currentSkin = $this.find('.one-pager-slide').eq(nextIndex - 1).attr('data-header-skin');
MK.utils.eventManager.publish( 'firstElSkinChange', currentSkin );
$('#fullPage-nav').removeClass('light-skin dark-skin').addClass(currentSkin + '-skin');
},
afterRender: function() {
var $nav = $('#fullPage-nav');
setTimeout(function() {
var currentSkin = $this.find('.one-pager-slide').eq(0).attr('data-header-skin');
MK.utils.eventManager.publish( 'firstElSkinChange', currentSkin );
if($nav.length) $nav.removeClass('light-skin dark-skin').addClass(currentSkin + '-skin');
}, 300);
var $slide = $this.find('.section'),
headerHeight = MK.val.offsetHeaderHeight(0),
windowHeight = $(window).height();
$slide.height(windowHeight - headerHeight);
if($nav.length) {
$nav.css({
'top': 'calc(50% + ' + (headerHeight/2) + 'px)',
'marginTop': 0
});
var style = $this.attr('data-pagination');
$nav.addClass('pagination-' + style);
}
setTimeout(mk_one_pager_resposnive, 1000);
},
afterResize: function() {
var $slide = $this.find('.section'),
headerHeight = MK.val.offsetHeaderHeight(0),
windowHeight = $(window).height();
$slide.height(windowHeight - headerHeight);
$('#fullPage-nav').css({
'top': 'calc(50% + ' + (headerHeight/2) + 'px)',
'marginTop': 0
});
setTimeout(mk_one_pager_resposnive, 1000);
console.log('Reposition pager content.');
},
});
}
});
});
}
function mk_one_pager_resposnive() {
"use strict";
$('.mk-edge-one-pager').each(function() {
var $pager = $(this),
headerHeight = MK.val.offsetHeaderHeight(0),
windowHeight = $(window).height() - headerHeight;
$pager.find('.one-pager-slide').each(function() {
var $slide = $(this),
$content = $slide.find('.edge-slide-content');
if ($slide.hasClass('left_center') || $slide.hasClass('center_center') || $slide.hasClass('right_center')) {
var contentHeight = $content.height(),
distanceFromTop = (windowHeight - contentHeight) / 2;
distanceFromTop = (distanceFromTop < 50) ? 50 + headerHeight : distanceFromTop;
$content.css('marginTop', distanceFromTop);
}
if ($slide.hasClass('left_bottom') || $slide.hasClass('center_bottom') || $slide.hasClass('right_bottom')) {
var distanceFromTop = windowHeight - $content.height() - 90;
$content.css('marginTop', (distanceFromTop));
}
});
});
}
/* Image Gallery */
/* -------------------------------------------------------------------- */
function mk_gallery() {
"use strict";
$('.mk-gallery .mk-gallery-item.hover-overlay_layer .item-holder').each(function() {
var itemHolder = $(this),
galleryDesc = itemHolder.find('.gallery-desc');
function updatePosition() {
var parentHeight = itemHolder.outerHeight(),
contentHeight = galleryDesc.innerHeight();
var paddingVal = (parentHeight - contentHeight) / 2;
galleryDesc.css({
'top': paddingVal,
// 'padding-bottom': paddingVal
});
// console.log(parentHeight);
// console.log(contentHeight);
}
updatePosition();
$(window).on('resize', function() {
setTimeout(function() {
updatePosition();
}, 1000);
});
});
}
/* Theatre Slider Responsive Calculator */
/* -------------------------------------------------------------------- */
function mk_theatre_responsive_calculator() {
var $laptopContainer = $(".laptop-theatre-slider");
var $computerContainer = $(".desktop-theatre-slider");
$laptopContainer.each(function() {
var $this = $(this),
$window = $(window),
$windowWidth = $window.outerWidth(),
$windowHeight = $window.outerHeight(),
$width = $this.outerWidth(),
$height = $this.outerHeight(),
$paddingTop = 38,
$paddingRight = 143,
$paddingBottom = 78,
$paddingLeft = 143;
var $player = $this.find('.player-container');
if ($windowWidth > $width) {
$player.css({
'padding-left': parseInt(($width * $paddingLeft) / 1200),
'padding-right': parseInt(($width * $paddingRight) / 1200),
'padding-top': parseInt(($height * $paddingTop) / 690),
'padding-bottom': parseInt(($height * $paddingBottom) / 690),
});
}
});
$computerContainer.each(function() {
var $this = $(this),
$window = $(window),
$windowWidth = $window.outerWidth(),
$windowHeight = $window.outerHeight(),
$width = $this.outerWidth(),
$height = $this.outerHeight(),
$paddingTop = 60,
$paddingRight = 52,
$paddingBottom = 290,
$paddingLeft = 49;
var $player = $this.find('.player-container');
if ($windowWidth > $width) {
$player.css({
'padding-left': parseInt(($width * $paddingLeft) / 1200),
'padding-right': parseInt(($width * $paddingRight) / 1200),
'padding-top': parseInt(($height * $paddingTop) / 969),
'padding-bottom': parseInt(($height * $paddingBottom) / 969),
});
}
});
}
/* Mobile and Tablet Slideshow Responsive Calculator */
/* -------------------------------------------------------------------- */
function mk_mobile_tablet_responsive_calculator() {
var $laptopSlideshow = $(".mk-laptop-slideshow-shortcode");
var $lcdSlideshow = $(".mk-lcd-slideshow");
if ($.exists(".mk-laptop-slideshow-shortcode")) {
$laptopSlideshow.each(function() {
var $this = $(this),
$window = $(window),
$windowWidth = $window.outerWidth(),
$windowHeight = $window.outerHeight(),
$width = $this.outerWidth(),
$height = $this.outerHeight(),
$paddingTop = 28,
$paddingRight = 102,
$paddingBottom = 52,
$paddingLeft = 102;
var $player = $this.find(".slideshow-container");
$player.css({
"padding-left": parseInt(($width * $paddingLeft) / 836),
"padding-right": parseInt(($width * $paddingRight) / 836),
"padding-top": parseInt(($height * $paddingTop) / 481),
"padding-bottom": parseInt(($height * $paddingBottom) / 481),
});
});
}
if ($.exists(".mk-lcd-slideshow")) {
$lcdSlideshow.each(function() {
var $this = $(this),
$window = $(window),
$windowWidth = $window.outerWidth(),
$windowHeight = $window.outerHeight(),
$width = $this.outerWidth(),
$height = $this.outerHeight(),
$paddingTop = 35,
$paddingRight = 39,
$paddingBottom = 213,
$paddingLeft = 36;
var $player = $this.find(".slideshow-container");
$player.css({
"padding-left": parseInt(($width * $paddingLeft) / 886),
"padding-right": parseInt(($width * $paddingRight) / 886),
"padding-top": parseInt(($height * $paddingTop) / 713),
"padding-bottom": parseInt(($height * $paddingBottom) / 713),
});
});
}
}
/* Start a tour resize function */
/* -------------------------------------------------------------------- */
function mk_start_tour_resize() {
$('.mk-header-start-tour').each(function() {
var $windowWidth = $(document).width(),
$this = $(this),
$linkWidth = $this.width() + 15,
$padding = ($windowWidth - mk_responsive_nav_width) / 2;
function updateStartTour(){
if($windowWidth < mk_responsive_nav_width){
$this.removeClass('hidden');
$this.addClass('show');
}else{
if($padding < $linkWidth){
$this.removeClass('show');
$this.addClass('hidden');
}else{
$this.removeClass('hidden');
$this.addClass('show');
}
}
}
setTimeout(function() {
updateStartTour();
}, 300);
});
}
/* Header social resize function */
/* -------------------------------------------------------------------- */
function mk_header_social_resize() {
$('.mk-header-social.header-section').each(function() {
var $windowWidth = $(document).width(),
$this = $(this),
$linkWidth = $this.width() + 15,
$padding = ($windowWidth - mk_responsive_nav_width) / 2;
function updateStartTour(){
if($windowWidth < mk_responsive_nav_width){
$this.removeClass('hidden');
$this.addClass('show');
}else{
if($padding < $linkWidth){
$this.removeClass('show');
$this.addClass('hidden');
}else{
$this.removeClass('hidden');
$this.addClass('show');
}
}
}
setTimeout(function() {
updateStartTour();
}, 300);
});
}
/* Page Section Socail Video Player Controls */
/* -------------------------------------------------------------------- */
function mk_page_section_social_video_bg() {
$(".mk-page-section.social-hosted").each(function() {
var $container = $(this),
$sound = $container.data('sound'),
$source = $container.data('source'),
player;
if ($source == 'youtube') {
var youtube = $container.find('iframe')[0];
player = new YT.Player(youtube);
setTimeout(function() {
player.playVideo();
if($sound == false) {
player.mute();
}
}, 1000);
}
if ($source == 'vimeo') {
var vimeo = $container.find('iframe')[0];
player = $f(vimeo);
setTimeout(function() {
player.api('play');
if($sound === false) {
player.api('setVolume', 0);
}
}, 1000);
}
});
}
// Pre RequireJS hot bug fixing
function videoLoadState() {
$('.mk-section-video video').each(function() {
var mkVideo = this;
this.onload = fire();
function fire() {
setTimeout(function() {
$(mkVideo).animate({
'opacity': 1
}, 300);
}, 1000);
}
});
}
videoLoadState();
// Gmap Widget
(function($) {
$(window).on('load', initialize);
function initialize() {
var $gmap = $('.gmap_widget');
if($gmap.length && typeof google !== 'undefined') $gmap.each(run);
}
function run() {
var $mapHolder = $(this);
var myLatlng = new google.maps.LatLng($mapHolder.data('latitude'), $mapHolder.data('longitude'));
var mapOptions = $mapHolder.data('options');
mapOptions.mapTypeId = google.maps.MapTypeId.ROADMAP;
mapOptions.center = myLatlng;
var map = new google.maps.Map(this, mapOptions);
new google.maps.Marker({
position: myLatlng,
map: map
});
}
}(jQuery));
// Instagram Widget
(function($) {
$(window).on('load', function() {
var $feeds = $('.mk-instagram-feeds');
if($feeds.length) $feeds.each(run);
});
function run() {
var options = $(this).data('options');
options.template = '
';
var feed = new Instafeed(options);
feed.run();
}
}(jQuery));
function mk_accordion_toggles_tooltip() {
"use strict";
/* Message Boxes */
/* -------------------------------------------------------------------- */
$('.box-close-btn').on('click', function() {
$(this).parent().fadeOut(300);
return false;
});
}
function mk_portfolio_ajax() {
"use strict";
var headerHeight = 0;
if ($.exists("#wpadminbar")) {
headerHeight += $("#wpadminbar").height();
}
if (!$.exists('.mk-vm-menuwrapper')) {
headerHeight += parseInt($('.mk-header').attr('data-sticky-height'));
}
function init() {
// wait for ajax response propagation and insertion
setTimeout(function() {
$('.portfolio-grid.portfolio-ajax-enabled').each( function() {
$( this ).ajaxPortfolio({
extraOffset: headerHeight
});
});
}, 100);
}
MK.core.loadDependencies([ MK.core.path.plugins + 'jquery.ajax.portfolio.js' ], init);
// Reinit when ajax loaded stuff
MK.utils.eventManager.subscribe('ajaxLoaded', init);
}
/* Ajax Search */
/* -------------------------------------------------------------------- */
function mk_ajax_search() {
"use strict";
if ($.exists('.main-nav-side-search') && mk_ajax_search_option == "beside_nav") {
var security = $('#mk-ajax-search-input').siblings('input[name="security"]').val(),
_wp_http_referer = $('#mk-ajax-search-input').siblings('input[name="_wp_http_referer"]').val();
$("#mk-ajax-search-input").autocomplete({
delay: 40,
minLength: 2,
appendTo: $("#mk-nav-search-wrapper"),
search: function (event, ui) {
$(this).parent('form').addClass('ajax-searching');
},
source: function (req, response) {
var query_spliter = (ajaxurl.indexOf('?') > -1) ? '&' : '?';
$.getJSON(ajaxurl + query_spliter + 'callback=?&action=mk_ajax_search&security='+security+'&_wp_http_referer='+_wp_http_referer, req, response);
},
select: function (event, ui) {
window.location.href = ui.item.link;
},
response: function (event, ui) {
$(this).parent('form').removeClass('ajax-searching').addClass('ajax-search-complete');
}
}).data("ui-autocomplete")._renderItem = function (ul, item) {
return $("