$(document).ready(function () {
var _base = this;
var _htmlPath = "html/";
var _htmlExtension = ".html";
var _cssPath = "css/";
var _cssExtension = ".css";
var _jsPath = "js/";
var _jsExtension = ".js";
var _mainIndexPath = "./_framework/index" + _htmlExtension;
var _defaultConfig = {
defaultHash: "overview",
};
var _openModals = [];
var _ajaxContentRequest;
var _ajaxContentRequestTimeoutId;
var _dataAttrNavigation = "data-navigation";
var _dataAttrTabKey = "data-tab-key";
var _dataAttrTabValue = "data-tab-value";
var _dataAttrExpanderKey = "data-expander-key";
var _dataAttrExpanderValue = "data-expander-value";
var _dataAttrRadio = "data-radio";
var _dataAttrModal = "data-modal";
var _dataAttrInputNumeric = "data-input-numeric";
var _expanderExpandDuration = 230;
var _tabsFadeDuration = 230;
var _strActive = "active";
var _finalConfig;
var _defaultHash;
var _hasherPrepareHash = "!";
var _hasherSeparator = "/";
var _navigationContentNavigation;
var _navButton;
var _navBackdrop;
var _nav;
var _body;
var _window;
var _header;
var _content;
var _footer;
var _loading;
var _loadingTimeoutId;
var _contentNavigationScrollTimeout;
var _mainNavigationItems;
var _debug = {};
var _debugModal;
var _debugModalContent;
var _fourZeroFourPath = "./_framework/html/404" + _htmlExtension;
var _fourZeroFourFaces = [
" ಠ_ಠ ",
"(#`д´)ノ",
"ლ(ಠ_ಠლ)",
"(; ̄Д ̄)",
"¯\\_(ツ)_/¯",
"ᕕ( ͡° ͜ʖ ͡° )ᕗ",
"(☞゚ヮ゚)☞ ☜(゚ヮ゚☜)",
"͡° ͜ʖ ͡°",
"ヽ( ಠ益ಠ )ノ",
" (╯°□°)╯︵ ┻━┻",
"(ಠ_ಠ)",
"(`・Д・)ノ=☆",
"★≡≡\(`△´\)",
"(◞‸◟)",
"(/‵Д′)/~ ╧╧",
"┻━┻ ︵ ¯\\_༼ᴼل͜ᴼ༽_/¯ ︵ ┻━┻",
"¯\\_(⊙_ʖ⊙)_/¯",
"┐(´~`)┌",
"乁( ⁰͡ Ĺ̯ ⁰͡ ) ㄏ",
"(;・∀・)",
"(^◇^;)",
];
var _mainScrollElement = $("body")
.overlayScrollbars({
nativeScrollbarsOverlaid: {
initialize: false,
},
})
.overlayScrollbars();
function showLoading() {
if (_mainScrollElement) _mainScrollElement.sleep(); //put to sleep
_loading.addClass(_strActive);
_content.css("opacity", 0);
}
function hideLoading() {
if (_mainScrollElement) _mainScrollElement.update(); //wakeup from sleeping
if (_nav.overlayScrollbars()) {
_nav.overlayScrollbars().options("overflowBehavior.x", "scroll");
_nav.overlayScrollbars().update(true); //FF fix for fixed elements.
}
if (!_header.hasClass("shrinked") && _nav.overlayScrollbars()) {
_nav.overlayScrollbars().options("overflowBehavior.x", "hidden");
}
_loading.removeClass(_strActive);
_content.css("opacity", 1);
}
function setBodyScrollbars() {
if (_mainScrollElement) {
_mainScrollElement.options({
callbacks: {
onScroll: function () {
updateContentNavigation();
},
onHostSizeChanged: function () {
updateContentNavigation();
},
onContentSizeChanged: function () {
updateContentNavigation();
},
},
});
} else {
_window
.off("scroll", updateContentNavigation)
.on("scroll", updateContentNavigation);
_window
.off("resize", updateContentNavigation)
.on("resize", updateContentNavigation);
}
}
function onHashChange(newHash, oldHash) {
if (_ajaxContentRequest) _ajaxContentRequest.abort();
if (_ajaxContentRequestTimeoutId)
clearTimeout(_ajaxContentRequestTimeoutId);
newHash = newHash.toLowerCase();
oldHash = oldHash !== undefined ? oldHash.toLowerCase() : oldHash;
var oldMainHash =
oldHash === undefined ? "" : oldHash.split(_hasherSeparator)[0];
var newMainHash = newHash.split(_hasherSeparator)[0];
if (oldMainHash !== newMainHash) {
_content.off();
try {
window._framework.onPagePathChange = undefined;
window._framework.defaultPagePath = undefined;
delete window._framework.onPagePathChange;
delete window._framework.defaultPagePath;
} catch (ex) {}
showLoading();
_ajaxContentRequest = $.get(
_htmlPath + newMainHash + _htmlExtension,
function (response) {
_body.trigger("contentDestruct");
$.each(
$("#content *").overlayScrollbars("!"),
function (index, instance) {
instance.destroy();
}
); //destroy all OS instances
_content[0].innerHTML = ""; //empty content
_ajaxContentRequestTimeoutId = setTimeout(function () {
_ajaxContentRequestTimeoutId = undefined;
//load correct content:
(function (HTML, callback) {
var temp = document.createElement("div"),
frag = document.createDocumentFragment();
temp.innerHTML = HTML;
var action = function () {
if (temp.firstChild) {
frag.appendChild(temp.firstChild);
setTimeout(action, 0);
} else callback(frag);
};
action();
})(response, function (fragment) {
_content[0].appendChild(fragment); // myTarget should be an element node.
contentLoad(newMainHash);
$.getScript(_jsPath + newMainHash + _jsExtension)
.always(function () {
pagePathChange(newHash, oldHash);
hideLoading();
})
.fail(function () {
if (arguments[0].readyState == 0) {
//script failed to load
} else {
//script loaded but failed to parse
console.error(arguments);
}
});
});
/*
_content[0].innerHTML = response;
contentLoad(newMainHash);
$.getScript(_jsPath + newMainHash + _jsExtension).always(function() {
pagePathChange(newHash, oldHash);
hideLoading();
});
*/
}, 400);
},
"html"
)
.fail(function () {
//404
$.get(
_fourZeroFourPath,
function (response) {
_content.html(response);
$("#four-zero-four-face").html(
_fourZeroFourFaces[
Math.floor(
Math.random() * (_fourZeroFourFaces.length - 1) + 0
)
]
);
},
"html"
);
pagePathChange(newHash, oldHash);
hideLoading();
})
.always(function () {
_ajaxContentRequest = undefined;
//refresh navigation:
_mainNavigationItems.removeClass(_strActive);
$.each(_mainNavigationItems, function () {
var item = $(this);
if (item.attr(_dataAttrNavigation) === newMainHash) {
item.addClass(_strActive);
}
});
if (newMainHash === _defaultHash) {
_header.removeClass("shrinked");
} else {
_header.addClass("shrinked");
if (_nav.overlayScrollbars()) _nav.overlayScrollbars().update();
}
//scroll To top:
if (_mainScrollElement) _mainScrollElement.scroll({ y: 0 });
else _window.scrollTop(0);
});
} else pagePathChange(newHash, oldHash);
}
function pagePathChange(newHash, oldHash) {
var openLinkInSameTab = function (e) {
var ee = e.originalEvent || e;
//on normal mouse click or triggered event
if (
((ee.which === 1 || ee.buttons === 1 || ee.button === 1) &&
ee.ctrlKey !== true) ||
e.originalEvent === undefined
) {
var navigationValue = $(e.currentTarget)
.closest("[" + _dataAttrNavigation + "]")
.attr(_dataAttrNavigation);
if (navigationValue) {
var newHashArray = generateHashArray(navigationValue);
var newHashArrayParamString = "";
for (var i = 0; i < newHashArray.length; i++)
newHashArrayParamString += '"' + newHashArray[i] + '", ';
newHashArrayParamString = newHashArrayParamString.substring(
0,
newHashArrayParamString.length - 2
);
window.eval("hasher.setHash(" + newHashArrayParamString + ");");
}
}
};
var openLinkInNewTab = function (e) {
var ee = e.originalEvent || e;
//on strg + left mouse button OR middle mouse button
if (
ee.ctrlKey !== undefined &&
ee.ctrlKey === true &&
(ee.which === 1 ||
ee.buttons === 1 ||
ee.buttons === 4 ||
ee.which === 2)
) {
var navigationValue = $(e.currentTarget)
.closest("[" + _dataAttrNavigation + "]")
.attr(_dataAttrNavigation);
if (navigationValue) {
var newHashArray = generateHashArray(navigationValue);
var newHashArrayParamString = "#" + _hasherPrepareHash;
for (var i = 0; i < newHashArray.length; i++)
newHashArrayParamString +=
(i == 0 ? "" : _hasherSeparator) + newHashArray[i] + "";
window.open(hasher.getBaseURL() + newHashArrayParamString, "_blank");
e.stopPropagation();
e.stopImmediatePropagation();
return false;
}
}
if (e.originalEvent === undefined) {
openLinkInSameTab(e);
e.stopPropagation();
e.stopImmediatePropagation();
return false;
}
};
//Generate correct hash after data-navigation element was klicked
$("[" + _dataAttrNavigation + "]:not(option)").on(
"click",
openLinkInNewTab
);
$("[" + _dataAttrNavigation + "]:not(option)").on(
"mousedown",
openLinkInSameTab
);
/*
$('[' + _dataAttrNavigation + ']:not(option)').on('mousedown', function(e) {
var ee = e.originalEvent || e;
//on middle mouse button
if((ee.buttons === 4 || ee.which === 2)) {
var navigationValue = $(this).closest('[' + _dataAttrNavigation + ']').attr(_dataAttrNavigation);
var newHashArray = generateHashArray(navigationValue);
var newHashArrayParamString = '#' + _hasherPrepareHash;
for(var i = 0; i < newHashArray.length; i++)
newHashArrayParamString += (i == 0 ? "" : _hasherSeparator) + newHashArray[i] + "";
window.open(hasher.getBaseURL() + newHashArrayParamString, '_blank');
e.stopPropagation();
e.stopImmediatePropagation();
return false;
}
});
*/
var oldMainHash =
oldHash === undefined ? "" : oldHash.split(_hasherSeparator)[0];
var newMainHash = newHash.split(_hasherSeparator)[0];
var newHashArray = newHash.split(_hasherSeparator);
var oldHashArray =
oldHash === undefined ? [] : oldHash.split(_hasherSeparator);
var offsetChange = -1;
var path = [];
if (newHashArray.length > oldHashArray.length) {
$.each(newHashArray, function (i) {
if (newHashArray[i] !== oldHashArray[i]) {
offsetChange = i;
return false;
}
});
} else {
$.each(oldHashArray, function (i) {
if (oldHashArray[i] !== newHashArray[i]) {
offsetChange = i;
return false;
}
});
}
if (oldMainHash === newMainHash) offsetChange -= 1;
for (var i = 0; i < newHashArray.length; i++) {
if (i === 0) continue;
var curr = newHashArray[i];
var name = curr;
path.push(name);
}
if ($.type(window._framework.onPagePathChange) === "function") {
window._framework.onPagePathChange({
isEmpty: newHashArray.length <= 1,
changedAt: offsetChange,
path: path,
});
}
//if a default tab shall be selected
if (
newHashArray.length === 1 &&
offsetChange === 0 &&
window._framework.defaultPagePath
)
hasher.replaceHash(newHashArray[0], window._framework.defaultPagePath);
//Main tabcontrol hashchange functionality
if (newHashArray.length > 1 && offsetChange === 0) {
var possibleTabItems = $("#content-navigation").find(
".content-navigation-item-clickable[data-navigation]"
);
var osInstance = $("#content-navigation").overlayScrollbars();
clearTimeout(_contentNavigationScrollTimeout);
$.each(possibleTabItems, function () {
var item = $(this);
var itemNavAttr = item.attr("data-navigation").toLowerCase();
if (itemNavAttr !== undefined)
itemNavAttr = itemNavAttr.replace(/[0-9]/, "").replace(/[[]]/g, "");
if (itemNavAttr === path[offsetChange]) {
item.trigger("click");
_contentNavigationScrollTimeout = setTimeout(function () {
if (osInstance) {
try {
updateContentNavigation();
osInstance.scrollStop();
osInstance.scroll(
{
el: item,
margin: { top: 5, bottom: 40 },
block: "nearest",
scroll: { y: "ifneeded" },
},
300
);
} catch (ex) {}
}
}, 400);
var tabKeyAttr = item.attr(_dataAttrTabKey);
if (tabKeyAttr !== undefined && tabKeyAttr !== null) {
var tabContent = $(
"[" + _dataAttrTabValue + '="' + tabKeyAttr + '"]'
);
tabContent.find("code:not(.hljs)").each(function (i, element) {
hljs(element);
});
//custom scrollbar on code
$.each(tabContent.find("pre > code.hljs"), function () {
var elem = $(this);
var hideY = !elem.hasClass("expandable");
if (
!elem.hasClass("code-noscroll") &&
elem.overlayScrollbars() === undefined
) {
elem.overlayScrollbars({
paddingAbsolute: true,
overflowBehavior: {
y: hideY ? "hidden" : "scroll",
},
});
}
});
//manage code mirrors
setTimeout(function () {
$(".CodeMirror").each(function (i, el) {
if (el.offsetHeight > 0) el.CodeMirror.refresh();
});
}, 300);
}
}
});
}
var contentNavigation = $("#content-navigation");
if (contentNavigation.length > 0) {
var activeTab = contentNavigation
.children()
.find(".active")
.first()
.attr(_dataAttrTabKey);
_navigationContentNavigation.val(
_navigationContentNavigation
.find("[" + _dataAttrTabKey + '="' + activeTab + '"]')
.text()
);
}
}
function contentLoad(currentMainHash) {
updateContentNavigation();
_navigationContentNavigation.empty();
var contentNavigation = $("#content-navigation");
if (contentNavigation.length > 0) {
//build also a select with optgroups:
var items = contentNavigation.children();
var group;
for (var i = 0; i < items.length; i++) {
var text = items.eq(i).find("span").first().text();
if (items.eq(i).hasClass("content-navigation-item-clickable")) {
var appendTo = group ? group : _navigationContentNavigation;
var option = $('");
option.attr(_dataAttrTabKey, items.eq(i).attr(_dataAttrTabKey));
option.attr(
_dataAttrNavigation,
items.eq(i).attr(_dataAttrNavigation)
);
appendTo.append(option);
} else {
group = $('');
_navigationContentNavigation.append(group);
}
}
//custom scrollbar on content menu (sidebar menu)
contentNavigation.overlayScrollbars({
scrollbars: {
autoHide: "leave",
},
overflowBehavior: {
x: "hidden",
},
});
}
//modal
$(".modal .modal-window-header-close").on("click", function (e) {
var clickedElement = $(e.target);
var modal = clickedElement.closest(".modal").first();
hideModal(modal);
});
$(".modal").on("mousedown", function (e) {
var clickedElement = $(e.target);
var modal = clickedElement.closest(".modal").first();
var condition =
modal.length > 0
? modal.overlayScrollbars() instanceof OverlayScrollbars
? clickedElement[0] === modal[0] ||
clickedElement[0] ===
modal.overlayScrollbars().getElements().content ||
clickedElement[0] ===
modal.overlayScrollbars().getElements().viewport
: clickedElement[0] === modal[0]
: false;
if (
condition &&
modal.hasClass("modal-backdrop-closeable") &&
e.which === 1
) {
modal.one("mouseup", function (e) {
var clickedElement = $(e.target);
var modal = clickedElement.closest(".modal").first();
var condition =
modal.length > 0
? modal.overlayScrollbars() instanceof OverlayScrollbars
? clickedElement[0] === modal[0] ||
clickedElement[0] ===
modal.overlayScrollbars().getElements().content ||
clickedElement[0] ===
modal.overlayScrollbars().getElements().viewport
: clickedElement[0] === modal[0]
: false;
if (condition) hideModal(modal);
});
}
});
$("[" + _dataAttrModal + "]").on("click", function (e) {
var target = $(e.target);
var attr = target.attr(_dataAttrModal);
var closestAttrTarget = target
.closest("[" + _dataAttrModal + "]")
.first();
if (!closestAttrTarget.hasClass("modal"))
showModal($(".modal[" + _dataAttrModal + '="' + attr + '"]').first());
});
if (_mainScrollElement) {
var modalInstances = $(".modal")
.overlayScrollbars({ sizeAutoCapable: false })
.overlayScrollbars();
for (var i = 0; i < modalInstances.length; i++) modalInstances[i].sleep();
}
//input-numeric
(function () {
$(".input-numeric").each(function () {
var mainElem = $(this);
var parseFunc = window.parseFloat;
var toFixedNum = 8;
var min = parseFunc(mainElem.attr(_dataAttrInputNumeric + "-min"));
var max = parseFunc(mainElem.attr(_dataAttrInputNumeric + "-max"));
var step = parseFunc(mainElem.attr(_dataAttrInputNumeric + "-step"));
var value = parseFunc(
mainElem.find(".input-numeric-input > input").val()
);
var decreaseBtn = mainElem
.find(".input-numeric-button-decrease")
.first();
var increaseBtn = mainElem
.find(".input-numeric-button-increase")
.first();
var input = mainElem.find(".input-numeric-input > input");
var updateValue = function () {
var adjusted = false;
if (value < min) {
value = min;
adjusted = true;
}
if (value > max) {
value = max;
adjusted = true;
}
input.val(value);
mainElem.trigger("valuechanged", [value]);
return adjusted;
};
var buttonPressedTimeout;
var buttonPressed = function (action) {
action();
buttonPressedTimeout = setTimeout(function () {
buttonPressed(action);
}, 125);
};
min = isNaN(min) ? 0 : min;
max = isNaN(max) ? 0 : max;
step = isNaN(step) ? 0 : step;
if (min > max) min = max;
if (max < min) max = min;
if (value < min) value = min;
if (value > max) value = max;
decreaseBtn.on("mousedown", function (e) {
clearTimeout(buttonPressedTimeout);
buttonPressed(function () {
value -= step;
value = parseFunc(value.toFixed(toFixedNum));
updateValue();
});
$(document).one("mouseup", function (e) {
clearTimeout(buttonPressedTimeout);
});
});
increaseBtn.on("mousedown", function (e) {
clearTimeout(buttonPressedTimeout);
buttonPressed(function () {
value += step;
value = parseFunc(value.toFixed(toFixedNum));
updateValue();
});
$(document).one("mouseup", function (e) {
clearTimeout(buttonPressedTimeout);
});
});
input.on("keydown", function (e) {
// Allow: backspace, delete, tab, escape, enter and .
if (
$.inArray(
e.keyCode,
[46, 8, 9, 27, 13, 110].concat(floaty ? [190] : [])
) !== -1 ||
(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: Ctrl/cmd+A
(e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: Ctrl/cmd+C
(e.keyCode == 86 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: Ctrl/cmd+V
(e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: Ctrl/cmd+X
(e.keyCode >= 35 && e.keyCode <= 39)
) {
// Allow: home, end, left, right
return;
}
// Ensure that it is a number and stop the keypress
if (
(e.shiftKey || e.keyCode < 48 || e.keyCode > 57) &&
(e.keyCode < 96 || e.keyCode > 105)
) {
e.preventDefault();
}
});
input.on("input", function (e) {
var inputVal = input.val();
if (inputVal === "") value = min;
else {
value = parseFunc(inputVal);
value = isNaN(value) ? min : value;
}
updateValue();
});
/*
input.on('focus', function(e) {
input.select();
});
*/
updateValue();
mainElem.find(".input-numeric-input > input").val(value);
});
})();
//dropdown
$(".dropdown").on("click", function (e) {
var dropdown = $(this).closest(".dropdown");
var isActive = false;
if (dropdown.hasClass(_strActive)) isActive = true;
$(".dropdown.active").removeClass(_strActive);
if (isActive) dropdown.removeClass(_strActive);
else dropdown.addClass(_strActive);
if (dropdown.hasClass(_strActive)) {
_body.one("click", function () {
dropdown.removeClass(_strActive);
});
}
e.stopPropagation();
e.stopImmediatePropagation();
return false;
});
$(".dropdown-list > div").on("click", function (e) {
var dropdown = $(this).closest(".dropdown");
var dropdownValue = dropdown.find(".dropdown-value");
dropdownValue.text($(this).text());
dropdown.removeClass(_strActive);
dropdown.trigger("dropdownvaluechanged", [dropdownValue.text()]);
e.stopPropagation();
e.stopImmediatePropagation();
return false;
});
//radio buttons
$("[" + _dataAttrRadio + "]").on("click", function (e) {
var target = $(e.target);
var attr = target.attr(_dataAttrRadio);
if (target.hasClass(_strActive)) return;
$("[" + _dataAttrRadio + '="' + attr + '"]')
.removeClass(_strActive)
.trigger("radiooff");
target.addClass(_strActive).trigger("radioon");
});
//expander
$("[" + _dataAttrExpanderKey + "]").on("click", function (e) {
//var closestOS = $(this).closest('.os-host');
var currElem = $(this).closest("[" + _dataAttrExpanderKey + "]");
var target = $(
"[" +
_dataAttrExpanderValue +
'="' +
currElem.attr(_dataAttrExpanderKey) +
'"]'
);
if (target.hasClass(_strActive)) {
target.stop().slideUp(_expanderExpandDuration);
currElem.removeClass(_strActive);
target.removeClass(_strActive);
} else {
target.stop().slideDown(_expanderExpandDuration);
currElem.addClass(_strActive);
target.addClass(_strActive);
}
});
//tabs
$("[" + _dataAttrTabValue + "]:not(." + _strActive + ")").hide();
$("[" + _dataAttrTabKey + "]:not(option)").on("click", function (e) {
var currElem = $(this).closest("[" + _dataAttrTabKey + "]");
if (currElem.hasClass(_strActive)) {
e.stopPropagation();
e.stopImmediatePropagation();
return false;
}
var ee = e.originalEvent || e;
if (
ee.ctrlKey !== undefined &&
ee.ctrlKey === true &&
(ee.which === 1 || ee.buttons === 1)
) {
return false;
}
var target = $(
"[" + _dataAttrTabValue + '="' + currElem.attr(_dataAttrTabKey) + '"]'
);
var parent = target.parent();
var currActive = parent
.children("." + _strActive)
.first()
.removeClass(_strActive);
var doScroll =
currElem.attr(_dataAttrNavigation) !== undefined &&
currElem.attr(_dataAttrNavigation) !== null;
var action = function () {
target.stop().fadeIn(_tabsFadeDuration).addClass(_strActive);
if (doScroll) {
if (_mainScrollElement) _mainScrollElement.scroll({ y: 0 });
else _window.scrollTop(0);
}
};
if (currActive.length === 0) action();
else currActive.stop().fadeOut(_tabsFadeDuration, action);
$("[" + _dataAttrTabKey + '="' + currElem.attr(_dataAttrTabKey) + '"]')
.each(function () {
$(this)
.parent()
.find("[" + _dataAttrTabKey + "]")
.removeClass(_strActive);
})
.addClass(_strActive);
});
//options table expand on click
$(".options-table > tbody > tr:nth-child(2n+1)").on("click", function (e) {
var current = $(e.target).closest("tr");
var target = current.next().find("div").first();
target.stop().slideToggle(300, "easeOutCirc");
if (current.hasClass(_strActive)) current.removeClass(_strActive);
else current.addClass(_strActive);
});
$(".options-table > tbody > tr:nth-child(2n+1) code").on(
"click",
function (e) {
e.stopPropagation();
e.stopImmediatePropagation();
return false;
}
);
$("#content-navigation-button").on("click", function () {
$("#content-navigation-button").toggleClass(_strActive);
});
if ($("#content-navigation-main").length > 0) {
//code highlight js on default visible tab element
$("#content-navigation-main > div:visible")
.find("code")
.each(function (i, element) {
hljs(element);
});
//custom scrollbar on code on default visible tab element
$.each(
$("#content-navigation-main > div:visible").find("pre > code.hljs"),
function () {
var elem = $(this);
var hideY = !elem.hasClass("expandable");
if (
!elem.hasClass("code-noscroll") &&
elem.overlayScrollbars() === undefined
) {
elem.overlayScrollbars({
paddingAbsolute: true,
overflowBehavior: {
y: hideY ? "hidden" : "scroll",
},
});
}
}
);
} else {
//code highlight js on default visible tab element
$("code").each(function (i, element) {
hljs(element);
});
//custom scrollbar on code on default visible tab element
$.each($("pre > code.hljs"), function () {
var elem = $(this);
if (
!elem.hasClass("code-noscroll") &&
elem.overlayScrollbars() === undefined
) {
elem.overlayScrollbars({
paddingAbsolute: true,
overflowBehavior: {
y: "hidden",
},
});
}
});
}
//code in modals
$(".modal")
.find("code")
.each(function (i, element) {
hljs(element);
});
//code expand and shrink
$("code.expandable").each(function (i, element) {
var strExpanded = "expanded";
var strExpandContent = 'Expand';
var strShrinkContent = 'Shrink';
var appendElement = $(
'' + strExpandContent + ""
);
appendElement.on("click", function () {
var codeElement = $(this).parent();
if ($(codeElement).hasClass(strExpanded)) {
$(this).html(strExpandContent);
codeElement.removeClass(strExpanded);
} else {
$(this).html(strShrinkContent);
codeElement.addClass(strExpanded);
}
});
$(element).append(appendElement);
});
//tippy
$("[data-tooltip]").each(function () {
try {
var el = this;
var tt = $(this).find(".tooltip").first();
tippy(this, { html: tt[0], arrow: true });
$(this).append(tt.clone());
} catch (ex) {}
});
}
function updateContentNavigation() {
var contentNav = $("#content-navigation");
var viewportHeight = $(window).height();
var contentNavHeight = contentNav.height();
var contentNavWrapperHeight = _content.height();
var scrollTop = _mainScrollElement
? _mainScrollElement.scroll().position.y
: _window.scrollTop();
var scrollLeft = _mainScrollElement
? _mainScrollElement.scroll().position.x
: _window.scrollLeft();
var navHeight = _nav.height();
var maxHeight = Math.min(
viewportHeight - navHeight,
contentNavWrapperHeight - scrollTop
);
if (OverlayScrollbars.globals().supportTransform) {
translateElement(contentNav, -scrollLeft, 0);
} else {
contentNav.css("left", -scrollLeft);
}
contentNav.css("max-height", maxHeight);
if (_nav.overlayScrollbars())
_nav.overlayScrollbars().scroll([scrollLeft, 0]);
else _nav.scrollLeft(scrollLeft);
}
function generateHashArray(navigationValue) {
navigationValue = navigationValue.replace(/\s/g, "");
var currHashArray = hasher.getHashAsArray();
var newHashArray = [];
var indexOfOffsetBracketOpen = navigationValue.indexOf("[");
var indexOfOffsetBracketClose = navigationValue.indexOf("]");
var offset = 0;
if (
indexOfOffsetBracketOpen === 0 &&
(indexOfOffsetBracketClose === 2 ||
indexOfOffsetBracketClose === 3 ||
indexOfOffsetBracketClose === 4)
) {
offset = parseInt(
navigationValue.split("]")[0].substring(1, indexOfOffsetBracketClose)
);
if (isNaN(offset)) throw "Invalid navigation offset value!";
}
var navigationValueSplit = navigationValue.split("]");
if (navigationValueSplit.length === 1) navigationValue = navigationValue;
else navigationValue = navigationValueSplit[1];
for (var i = 0; i < offset + 1; i++) newHashArray[i] = currHashArray[i];
newHashArray[offset] = navigationValue;
if (navigationValue === "") newHashArray.splice(offset, 1);
for (var i = 0; i < newHashArray.length; i++)
newHashArray[i] = newHashArray[i].toLowerCase();
return newHashArray;
}
function hljs(element) {
if (window.hljs !== undefined) {
window.hljs.highlightBlock(element);
}
}
function translateElement(element, x, y) {
var vendors = ["", "-webkit-", "-moz-", "-o-", "-ms-"];
for (var i = 0; i < vendors.length; i++)
element.css(
"transform",
vendors[i] + "translate(" + x + "px, " + y + "px)"
);
}
function showModal(modal) {
if (!modal.hasClass("modal-open") && !modal.hasClass("modal-animating")) {
var osInstance = modal.overlayScrollbars();
var hasOS = osInstance instanceof OverlayScrollbars;
modal
.addClass("modal-animating")
.stop()
.fadeIn(300, function () {
if (hasOS && osInstance.getState().sleeping)
modal.overlayScrollbars().update();
modal.removeClass("modal-animating");
})
.addClass("modal-open")
.css("z-index", parseInt(modal.css("z-index")) + _openModals.length + 1)
.focus();
if (hasOS) modal.overlayScrollbars().scroll(0, 1);
else modal.scrollTop(0).scrollLeft(0);
if (_openModals.length === 0) {
_body.on("keydown", modalEsc);
if (_mainScrollElement)
_mainScrollElement.options({
overflowBehavior: { x: "hidden", y: "hidden" },
});
else _body.css("overflow", "hidden");
}
_openModals.push(modal[0]);
}
}
function hideModal(modal) {
if (modal.hasClass("modal-open") && !modal.hasClass("modal-animating")) {
if (modal.overlayScrollbars() instanceof OverlayScrollbars)
modal.overlayScrollbars().sleep();
modal
.addClass("modal-animating")
.stop()
.removeClass("modal-open")
.fadeOut(300, function () {
modal.removeClass("modal-animating");
modal.css("z-index", "");
});
var index = $.inArray(modal[0], _openModals);
if (index > -1) {
_openModals.splice(index, 1);
if (_openModals.length === 0) {
_body.off("keydown", modalEsc);
if (_mainScrollElement)
_mainScrollElement.options({
overflowBehavior: { x: "scroll", y: "scroll" },
});
else _body.css("overflow", "");
}
}
}
}
function modalEsc(event) {
var keyCode = event.keyCode || event.originalEvent.keyCode;
if (keyCode === 27) hideModal($(_openModals[_openModals.length - 1]));
}
function css3FilterFeatureDetect(enableWebkit) {
enableWebkit = enableWebkit === undefined ? false : enableWebkit;
el = document.createElement("div");
el.style.cssText = (enableWebkit ? "-webkit-" : "") + "filter: blur(2px)";
return (
el.style.length != 0 &&
(document.documentMode === undefined || document.documentMode > 9)
);
}
_base.buildPage = function (config, callback) {
_finalConfig = $.extend(true, {}, _defaultConfig, config);
_defaultHash = _finalConfig.defaultHash;
_mainNavigationItems = $("[" + _dataAttrNavigation + "]");
_window = $(window);
_body = $("body");
_header = $("#header");
_nav = $("#navigation");
_navButton = $("#navigation-button");
_navBackdrop = $("#navigation-backdrop");
_content = $("#content");
_footer = $("#footer");
_loading = $("#loading");
_debugModal = $("#modal-debug");
_debugModalContent = $("#modal-debug-content");
_navigationContentNavigation = $("#navigation-content-navigation");
//setup hasher
hasher.prependHash = _hasherPrepareHash;
hasher.separator = _hasherSeparator;
if (
hasher.getURL() === hasher.getBaseURL() ||
hasher.getURL() === hasher.getBaseURL() + "#" ||
hasher.getURL() === hasher.getBaseURL() + "#" + _hasherPrepareHash
)
hasher.replaceHash(_defaultHash);
hasher.initialized.add(onHashChange); //parse initial hash
hasher.changed.add(onHashChange); //parse hash changes
hasher.init(); //start listening for hash changes
setTimeout(function () {
_body.addClass("ready");
if (_debug.cssFilterSupport) _body.addClass("filter-support");
}, 100);
$("#navigation-logo").on("click", function () {
hasher.setHash(_defaultHash);
});
//navigation scrollbar
$("#navigation-menu").overlayScrollbars({
className: "os-theme-light",
paddingAbsolute: true,
overflowBehavior: { y: "s", x: "h" },
});
//navigation toggle
_navButton.on("click", function (e) {
_nav.toggleClass(_strActive);
});
_navBackdrop.on("click", function (e) {
_nav.removeClass(_strActive);
});
//set scrollbars
setBodyScrollbars();
//navigation select:
_navigationContentNavigation.on("change", function () {
var selectedValue = _navigationContentNavigation.val();
var selectedElm = _navigationContentNavigation
.find("option")
.filter(function () {
return $(this).text() === selectedValue;
});
$("#content-navigation")
.find(
"[" +
_dataAttrTabKey +
'="' +
selectedElm.attr(_dataAttrTabKey) +
'"]'
)
.trigger("click");
});
//debug
_debugModalContent.html(JSON.stringify(_debug, null, 2));
try {
var triggerDebugTimeoutId;
var keydownSequence = [68, 69, 66, 85, 71, 13]; //debug[enter]
var keydownKeyCodes = [];
var touches = 0;
function arraysEqual(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
for (var i = arr1.length; i--; ) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
}
_body.on("keydown", function (e) {
clearTimeout(triggerDebugTimeoutId);
triggerDebugTimeoutId = setTimeout(function () {
keydownKeyCodes = [];
}, 250);
var keyCode = e.keyCode || e.originalEvent.keyCode;
keydownKeyCodes.push(keyCode);
if (arraysEqual(keydownKeyCodes, keydownSequence))
showModal(_debugModal);
});
_body[0].addEventListener(
"touchstart",
function () {
clearTimeout(triggerDebugTimeoutId);
triggerDebugTimeoutId = setTimeout(function () {
touches = 0;
}, 250);
touches++;
if (touches > 20) showModal(_debugModal);
},
{ passive: true }
);
} catch (ex) {}
};
_debug.viewportIntervention =
typeof window.innerHeight === "number"
? $("html")[0].clientHeight !== window.innerHeight
: false;
_debug.cssFilterSupport = false; //css3FilterFeatureDetect(true);
if (_debug.viewportIntervention) viewportUnitsBuggyfill.init({ force: true });
window._framework = _base;
});