---
regenerate: true
---
{% capture cache %}
{% comment %}
# -----------------------------------------------------------------------------
# ~/assets/themes/j1/core/js/j1.js
# Liquid template to initialize J1 Template Core functions
#
# Product/Info:
# https://jekyll.one
#
# Copyright (C) 2020 Juergen Adams
#
# J1 Template is licensed under the MIT License.
# For details, see https://jekyll.one
# -----------------------------------------------------------------------------
# TODO: jadams, 2019-01-20: Isolate drawer, switch from BME code
# -----------------------------------------------------------------------------
# Test data:
# {{ liquid_var | debug }}
# -----------------------------------------------------------------------------
{% endcomment %}
{% comment %} Liquid procedures
-------------------------------------------------------------------------------- {% endcomment %}
{% comment %} Set global settings
-------------------------------------------------------------------------------- {% endcomment %}
{% assign environment = site.environment %}
{% assign template_version = site.version %}
{% if site.permalink == 'none' %}
{% capture page_url %}{{ site.url }}.html{% endcapture %}
{% else %}
{% capture page_url %}{{ site.url }}{% endcapture %}
{% endif %}
{% comment %} Process YML config data
================================================================================ {% endcomment %}
{% comment %} Set config files
-------------------------------------------------------------------------------- {% endcomment %}
{% assign template_config = site.data.template_settings %}
{% assign blocks = site.data.blocks %}
{% assign modules = site.data.modules %}
{% comment %} Set config data
-------------------------------------------------------------------------------- {% endcomment %}
{% assign banner_config_defaults = blocks.defaults.banner.defaults %}
{% assign banner_config_settings = blocks.banner.settings %}
{% assign panel_config_defaults = blocks.defaults.panel.defaults %}
{% assign panel_config_settings = blocks.panel.settings %}
{% assign footer_config_defaults = blocks.defaults.footer.defaults %}
{% assign toccer_defaults = modules.defaults.toccer.defaults %}
{% assign toccer_settings = modules.toccer.settings %}
{% assign themer_defaults = modules.defaults.themer.defaults %}
{% assign themer_settings = modules.themer.settings %}
{% assign authentication_defaults = modules.defaults.authentication.defaults %}
{% assign authentication_settings = modules.authentication.settings %}
{% comment %} Set config options
-------------------------------------------------------------------------------- {% endcomment %}
{% assign toccer_options = toccer_defaults | merge: toccer_settings %}
{% assign themer_options = themer_defaults | merge: themer_settings %}
{% assign authentication_options = authentication_defaults | merge: authentication_settings %}
{% assign footer_id = footer_config_defaults.container-id %}
{% assign footer_data_path = footer_config_defaults.data_path %}
{% assign banner_data_path = banner_config_defaults.data_path %}
{% assign panel_data_path = panel_config_defaults.data_path %}
{% assign hideOnReload = modules.themer_options.hideOnReload %}
/*
# -----------------------------------------------------------------------------
# ~/assets/themes/j1/adapter/js/j1_template.js
# JS Adapter for J1 Template
#
# Product/Info:
# https://jekyll.one
#
# Copyright (C) 2020 Juergen Adams
#
# J1 Template is licensed under the MIT License.
# For details, see https://jekyll.one
# -----------------------------------------------------------------------------
# TODO:
# MANAGE themeExtensionCss is to be checked
#
# -----------------------------------------------------------------------------
# Adapter generated: {{site.time}}
# -----------------------------------------------------------------------------
*/
'use strict';
var j1 = (function () {
// ---------------------------------------------------------------------------
// globals
// ---------------------------------------------------------------------------
var rePager = new RegExp('navigator|dateview|tagview|archive');
var environment = '{{environment}}';
var moduleOptions = {};
var j1_runtime_data = {};
// Status information
var state = 'not_started';
var mode = 'not_detected';
var current_user_data;
var current_page;
var previous_page;
var last_pager;
var last_pager_url;
var app_detected;
var user_session_detected;
// Connector settings
var translation_enabled = {{template_config.translation.enabled}}
// Theme information
var themeName;
var themeCss;
var themeExtensionCss = environment === 'production' ? '/assets/themes/j1/core/css/theme_extensions.min.css' : '/assets/themes/j1/core/css/theme_extensions.css';
// Pathes of J1 data files
var colors_data_path = '{{template_config.colors_data_path}}';
var font_size_data_path = '{{template_config.font_size_data_path}}';
var runtime_data_path = '{{template_config.runtime_data_path}}';
var message_catalog_data_path = '{{template_config.message_catalog_data_path}}';
// Logger
var logger;
var logText;
var _this;
var settings;
var json_data;
var ep;
var baseUrl;
var referrer;
var default_theme_css = environment === 'production' ? '/assets/themes/j1/core/css/uno.min.css' : '/assets/themes/j1/core/css/uno.css';
var default_theme_name = 'Uno';
var default_theme_author = 'J1 Team';
var default_theme_link = 'https://jekyll.one/';
var default_white_listed_pages = [];
var cookie_names = {
'app_session': '{{template_config.cookies.app_session}}',
'user_session': '{{template_config.cookies.user_session}}',
'user_state': '{{template_config.cookies.user_state}}'
}
// user SESSION cookie (initial values)
var user_session = {
'mode': 'na',
'locale': navigator.language || navigator.userLanguage,
'user_name': '{{template_config.user.user_name}}',
'provider': '{{template_config.user.provider}}',
'provider_membership': '{{template_config.user.provider_membership}}',
'provider_permissions': 'public,{{template_config.user.provider_permissions}}',
'provider_site_url': '{{template_config.user.provider_site_url}}',
'provider_home_url': '{{template_config.user.provider_home_url}}',
'provider_blog_url': '{{template_config.user.provider_blog_url}}',
'provider_member_url': '{{template_config.user.provider_member_url}}',
'provider_privacy_url': '{{template_config.user.provider_privacy_url}}',
'requested_page': 'na',
'previous_page': 'na',
'last_pager': '/pages/public/blog/navigator/'
};
// user STATE cookie (initial values)
var user_state = {
'theme_css': default_theme_css,
'theme_extension_css': themeExtensionCss,
'theme_name': default_theme_name,
'theme_author': default_theme_author,
'theme_author_url': '{{template_config.theme_author_url}}',
'theme_link': default_theme_link,
'theme_version': '{{site.version}}',
'cookies_accepted': 'pending',
'whitelistedPages': default_white_listed_pages,
'deleteOnDecline': false,
'showConsentOnPending': false,
'stopScrolling': true,
'session_active': false,
'last_session_ts': '',
'cc_authenticated': false
};
// ---------------------------------------------------------------------------
// helper functions
// ---------------------------------------------------------------------------
function executeFunctionByName(functionName, context /*, args */) {
// See: https://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string
//
var args = Array.prototype.slice.call(arguments, 2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
// ---------------------------------------------------------------------------
// main object
// ---------------------------------------------------------------------------
return {
// -------------------------------------------------------------------------
// Initializer
// -------------------------------------------------------------------------
init: function (options) {
// -----------------------------------------------------------------------
// global var (function)
// -----------------------------------------------------------------------
var logger = log4javascript.getLogger('j1.init');
var url = new parseURL(window.location.href)
var baseUrl = url.origin;
var epoch = Math.floor(Date.now()/1000);
var timestamp_now = moment.unix(epoch).format('YYYY-MM-DD HH:mm:ss');
var curr_state = 'started';
// -----------------------------------------------------------------------
// options loader
// -----------------------------------------------------------------------
var settings = $.extend(
{
foo: 'foo_option',
bar: 'bar_option'
},
options
);
// catch senseless detect url 404 errors (middleware /status)
// See: https://stackoverflow.com/questions/4687235/jquery-get-or-post-to-catch-page-load-error-eg-404
$.ajaxSetup({
// called on `$.get()`, `$.post()`, `$.ajax()`
statusCode : {
// raised on response status code 404
404 : function (jqxhr, textStatus, errorThrown) {
var interval_count = 0;
var max_count = 10;
var dependencies_met_logger = setInterval(function() {
interval_count += 1;
if ( j1.adapter.logger.getState() == 'finished' ) {
var logger = log4javascript.getLogger('j1.init');
clearInterval(dependencies_met_logger);
if(jqxhr.responseText.indexOf('GET /status') > -1) {
logger.info('no middleware found on url /status: ignored');
logger.info('continue on mode: web');
}
if (interval_count > max_count) {
logger.warn('dependency check failed for module: logger');
logger.warn('continue on initializer unchecked');
j1.adapter.navigator.init();
}
}
}, 25);
}
}
});
// -----------------------------------------------------------------------
// Session ON_CLOSE event
// Update user STATE cookie|Remove user SESSION cookie on window CLOSE
// See: https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing
// -----------------------------------------------------------------------
window.addEventListener('beforeunload', function (event) {
var cookie_names = j1.getCookieNames();
var cookie_user_state_name = cookie_names.user_state;
var cookie_user_session_name = cookie_names.user_session;
var epoch = Math.floor(Date.now()/1000);
var timestamp_now = moment.unix(epoch).format('YYYY-MM-DD HH:mm:ss');
var user_state = j1.readCookie(cookie_user_state_name);
var ep_status;
var url;
var baseUrl;
user_state.session_active = false;
user_state.last_session_ts = timestamp_now;
// DANGEROUS (??): delete user session in browser using MULTI_TAB!
// if (j1.existsCookie(cookie_names.user_session)) {
// var bla = cookie_names.user_session;
// j1.deleteCookie(cookie_names.user_session)
// }
j1.writeCookie({
name: cookie_user_state_name,
data: user_state,
expires: 365
});
});
// -----------------------------------------------------------------------
// Initialize|Load (existing) user cookies
// -----------------------------------------------------------------------
user_session.created = timestamp_now;
user_session.timestamp = timestamp_now;
user_session = j1.existsCookie(cookie_names.user_session)
? j1.readCookie(cookie_names.user_session)
: j1.writeCookie({
name: cookie_names.user_session,
data: user_session,
});
user_state = j1.existsCookie(cookie_names.user_state)
? j1.readCookie(cookie_names.user_state)
: j1.writeCookie({
name: cookie_names.user_state,
data: user_state,
expires: 365
});
user_state.session_active = true;
j1.writeCookie({
name: cookie_names.user_state,
data: user_state,
expires: 365
});
// Detect middleware (mode 'app') and update user session cookie
// -----------------------------------------------------------------------
// if (user_session.mode === 'na' || user_session.mode === 'app') {
if (user_session.mode === 'na') {
var url = new parseURL(window.location.href);
var ep_status = baseUrl + '/status' + '?page=' + window.location.pathname;
var detectTimeout = 50;
baseUrl = url.origin;
$.when ($.ajax(ep_status))
.then(function(data) {
var logger = log4javascript.getLogger('j1.init');
user_session = j1.readCookie(cookie_names.user_session);
user_session.mode = 'app';
user_session.requested_page = window.location.pathname;
user_session.timestamp = timestamp_now;
user_session = j1.mergeData(user_session, data);
logText = 'mode detected: ' + user_session.mode;
logger.info(logText);
logger.info('update user session cookie');
j1.writeCookie({
name: cookie_names.user_session,
data: user_session
});
j1.setState(curr_state);
logger.info('state: ' + j1.getState());
})
.catch(function(error) {
// jadams, 2018-08-31: Why a hell a setTimeout is needed ???
setTimeout (function() {
var logger = log4javascript.getLogger('j1.init');
user_session = j1.readCookie(cookie_names.user_session);
user_session.mode = 'web';
user_session.requested_page = window.location.pathname;
user_session.timestamp = timestamp_now;
logText = 'mode detected: ' + user_session.mode;
logger.info(logText);
j1.writeCookie({
name: cookie_names.user_session,
data: user_session
});
j1.setState(curr_state);
logger.info('state: ' + j1.getState());
}, detectTimeout);
});
} else {
state = 'started';
logger.info('state: ' + state);
logger.info('page is being initialized');
}
{% comment %} Deferred data loads
See: https://stackoverflow.com/questions/3709597/wait-until-all-jquery-ajax-requests-are-done
Load J1 Template data objects 'asychronously'
-------------------------------------------------------------------------- {% endcomment %}
// -----------------------------------------------------------------------
// data loader (should be rewitten to xhrData() )
// -----------------------------------------------------------------------
$.when (
j1.getColorData(colors_data_path),
j1.getFontSizeData(font_size_data_path),
j1.getMessageCatalog(message_catalog_data_path))
.done (function(colorData, fontSizes, messageCatalog, runtime) {
j1.colors = colorData[0];
j1.fonts = fontSizes[0];
// set logger for callback|anonymous
//
var logger = log4javascript.getLogger('j1.init');
logText = j1.getMessage('info', 'getState', 'text');
logText = logText + j1.getMessage('info', 'getState', 'data_objects');
logText = logText + j1.getMessage('info', 'getState', 'finished');
j1.logger('j1.init', 'info', logText);
logText = j1.getMessage('info', 'setState', 'text');
logText = logText + j1.getMessage('info', 'setState', 'started');
j1.logger('j1.init', 'info', logText);
executeFunctionByName('j1.setState', window, state);
// set logger for callback|anonymous
var logger = log4javascript.getLogger('j1.init');
if ( settings.scrollbar === 'false' ) {
$('body').addClass( 'hide-scrollbar' )
$('html').addClass( 'hide-scrollbar-moz' )
}
logger.info('read user state from cookie');
user_session = j1.readCookie(cookie_names.user_session);
// process|update UserState
//
themeName = user_session.theme_name;
themeCss = user_session.theme_css;
themeExtensionCss = user_session.theme_extension_css;
// save last page access
// See: https://stackoverflow.com/questions/3528324/how-to-get-the-previous-url-in-javascript
// See: https://developer.mozilla.org/de/docs/Web/API/Window/history
//
user_session.timestamp = timestamp_now;
referrer = new parseURL(document.referrer);
current_page = window.location.pathname;
user_session.requested_page = current_page;
user_session.previous_page = referrer.search === '' ?
(referrer.pathname === '' ? current_page : referrer.pathname) :
(user_session.previous_page === '' || user_session.previous_page === 'na'
? '/'
: user_session.previous_page
);
// calculate last 'pager' if any
//
if (rePager.test(user_session.previous_page)) {
last_pager = user_session.previous_page;
user_session.last_pager = last_pager;
} else {
last_pager = user_session.last_pager;
}
logger.info('update user session cookie');
j1.writeCookie({
name: cookie_names.user_session,
data: user_session
});
// ---------------------------------------------------------------------
// Initialize page resources for global modules (sequential asynchronous)
// (should be rewitten to xhrData() )
// ---------------------------------------------------------------------
$.when (
j1.initBanner(settings),
j1.initPanel(settings),
j1.initFooter(settings) )
.then (function (initBanner_response, initPanel_response, initFooter_response) {
var logger = log4javascript.getLogger('j1.init');
// Wait for LAST thenable (footer) in chain finishes
var footerLoaded = setInterval(function() {
if ( j1.getState() == 'footer_loaded') {
// clear interval checking
clearInterval(footerLoaded);
logger.info('loading data completed');
// Continue to run initializers
//
state = j1.getMessage('info', 'setState', 'running');
logText = j1.getMessage('info', 'setState', 'text');
logText = logText + j1.getMessage('info', 'setState', 'running');
j1.logger('j1.init', 'info', logText);
user_session.timestamp = timestamp_now;
j1.writeCookie({
name: cookie_names.user_session,
data: user_session
});
// ---------------------------------------------------------------
// Finalize|Display page (sequential asynchronous)
// NOTE:
// jadams 2019-01-20: for MDB, enabled only drawer, switch
// and ripples
// ---------------------------------------------------------------
$.when (
j1.initMDB(settings),
j1.initClipboard(settings))
.then (function () {
j1.displayPage();
})
.catch(function(error) {
var logger = log4javascript.getLogger('j1.init');
json_data = JSON.stringify(error, undefined, 2);
logText = 'deferred: ' + json_data;
logger.error(logText);
});
}
}, 25); // END 'footerLoaded'
}) // END load global modules
.catch(function(error) {
var logger = log4javascript.getLogger('j1.init');
json_data = JSON.stringify(error, undefined, 2);
logText = 'deferred: ' + json_data;
logger.error(logText);
});
}) // END load global data objects
.catch(function(error) {
var logger = log4javascript.getLogger('j1.init');
json_data = JSON.stringify(error, undefined, 2);
logText = 'deferred: ' + json_data;
logger.error(logText);
});
}, // END init
// -------------------------------------------------------------------------
// initBanner
// AJAX fetcher to load and place all banner used for a page
// -------------------------------------------------------------------------
initBanner: function (options) {
var logger = log4javascript.getLogger('j1.initBanner');
var banner = [];
var bannerOptions = [];
var mod = 'j1';
{% comment %}
Closure to pass additional data (e.g. #banner_id) to AJAX load callback
See: http://stackoverflow.com/questions/939032/jquery-pass-more-parameters-into-callback
-------------------------------------------------------------------------- {% endcomment %}
var cb_load_closure = function(banner_id) {
return function ( responseTxt, statusTxt, xhr ) {
if ( statusTxt == 'success' ) {
logText = 'loading banner completed on id: ' +banner_id;
logger.info(logText);
}
if ( statusTxt == 'error' ) {
logText = 'loading banner failed on id: ' +banner_id+ ', error: ' + xhr.status + ': ' + xhr.statusText;
logger.error(logText);
// Set|Log status
state = 'failed';
logger.error('state: ' + state);
}
};
};
{% comment %} Collect all banner id|s configured
-------------------------------------------------------------------------- {% endcomment %}
{% for items in banner_config_settings %}
{% assign key = items[0] %}
{% assign value = items[1] %}
{% if key == 'divider' %} {% assign banner_config = value %} {% endif %}
{% if key == 'teaser' %} {% assign banner_config = value %} {% endif %}
{% if key == 'image' %} {% assign banner_config = value %} {% endif %}
{% if key == 'parallax' %} {% assign banner_config = value %} {% endif %}
{% if key == 'exception' %} {% assign banner_config = value %} {% endif %}
{% for items in banner_config %}
{% for banners in items %}
{% for banner in banners %}
{% for item in banner %}
{% assign key = item[0] %}
{% assign value = item[1] %}
{% if key and debug %} item:value {{key}}:{{value}} {% endif %}
{% if key == 'id' %} {% assign id = value %} {% endif %}
{% if key == 'enabled' %} {% assign enabled = value %} {% endif %}
{% if key == 'background_color_1' %} {% assign background_color_1 = value %} {% endif %}
{% if key == 'background_color_2' %} {% assign background_color_2 = value %} {% endif %}
{% endfor %}
{% endfor %}
{% if id and enabled %}
{% comment %} Add CSS styles for current banner to section
-------------------------------------------------------------------- {% endcomment %}
{% if background_color_1 and background_color_2 %}
var banner_backround_style = '';
// Initialze banner background gradient/colors
banner_backround_style += "";
$('head').append( banner_backround_style );
{% endif %}
{% comment %} Register current banner
-------------------------------------------------------------------- {% endcomment %}
banner.push('{{id}}');
{% endif %}
{% endfor %} {% comment %} END banners {% endcomment %}
{% comment %} Reset (Liquid) element variables
---------------------------------------------------------------------- {% endcomment %}
{% assign id = nil %}
{% assign enabled = nil %}
{% assign background_color_1 = nil %}
{% assign background_color_2 = nil %}
{% assign banner_config = nil %}
{% endfor %} {% comment %} END banner_config {% endcomment %}
{% endfor %} {% comment %} END banner_config_settings {% endcomment %}
{% comment %} REGISTER exceptions container
-------------------------------------------------------------------------- {% endcomment %}
banner.push('exception_container');
{% comment %} LOAD all banner registered
-------------------------------------------------------------------------- {% endcomment %}
if ( banner.length ) {
for (var i in banner) {
var id = '#' + banner[i];
var selector = $(id);
if (selector.length) {
logText = 'loading banner on id: ' +banner[i];
logger.info(logText);
var banner_data_path = '{{banner_data_path}} ' + id + ' > *';
selector.load( banner_data_path, cb_load_closure( id ) );
}
}
} else {
logText = 'no banner found in site';
logger.info(logText);
}
return true;
}, // END initBanner
// -------------------------------------------------------------------------
// initPanel
// AJAX fetcher to load and place all panel used for a page
// -------------------------------------------------------------------------
// ToDo:
initPanel: function ( options ) {
var logger = log4javascript.getLogger('j1.initPanel');
var panel = [];
var mod = 'j1';
{% comment %} Closure to pass additional data (e.g. panel_id) to AJAX load callback
See: http://stackoverflow.com/questions/939032/jquery-pass-more-parameters-into-callback
-------------------------------------------------------------------------- {% endcomment %}
var cb_load_closure = function(panel_id) {
return function ( responseTxt, statusTxt, xhr ) {
if ( statusTxt == 'success' ) {
logText = 'loading panel completed on id: ' +panel_id;
logger.info(logText);
}
if ( statusTxt == 'error' ) {
logText = 'loading panel failed on id: ' +panel_id+ ', error ' + xhr.status + ': ' + xhr.statusText;
logger.error(logText);
// Set|Log status
state = 'Error';
logger.error('state: ' + state);
}
};
};
{% comment %} Collect all panel id|s configured
-------------------------------------------------------------------------- {% endcomment %}
{% for items in panel_config_settings %}
{% assign key = items[0] %}
{% assign value = items[1] %}
{% if key == 'intro' %} {% assign panel_config = value %} {% endif %}
{% if key == 'service' %} {% assign panel_config = value %} {% endif %}
{% if key == 'step' %} {% assign panel_config = value %} {% endif %}
{% if key == 'news' %} {% assign panel_config = value %} {% endif %}
{% if key == 'exception' %} {% assign panel_config = value %} {% endif %}
{% for items in panel_config %}
{% for panels in items %}
{% for panel in panels %}
{% for item in panel %}
{% assign key = item[0] %}
{% assign value = item[1] %}
{% if key and debug %} item:value {{key}}:{{value}} {% endif %}
{% if key == 'id' %} {% assign id = value %} {% endif %}
{% if key == 'enabled' %} {% assign enabled = value %} {% endif %}
{% endfor %}
{% endfor %}
{% comment %} Register current panel
-------------------------------------------------------------------------- {% endcomment %}
{% if id and enabled %}
panel.push('{{id}}');
{% endif %}
{% comment %} Reset (Liquid) element variables
-------------------------------------------------------------------------- {% endcomment %}
{% assign id = nil %}
{% assign enabled = nil %}
{% assign panel_config = nil %}
{% endfor %} {% comment %} END panels {% endcomment %}
{% endfor %} {% comment %} END panel_config {% endcomment %}
{% endfor %} {% comment %} END panel_config_settings {% endcomment %}
if ( panel.length ) {
for (var i in panel) {
var id = "#" + panel[i];
var selector = $(id);
if ( selector.length ) {
logText = 'loading panel on id: ' +panel[i];
logger.info(logText);
var panel_data_path = '{{panel_data_path}} ' + id + ' > *';
selector.load( panel_data_path, cb_load_closure( id ) );
}
}
} else {
logText = 'no panel found in site';
logger.info(logText);
}
return true;
}, // END initPanel
// -------------------------------------------------------------------------
// initFooter
// AJAX fetcher to load and place the footer used for a page
// -------------------------------------------------------------------------
initFooter: function ( options ) {
var logger = log4javascript.getLogger('j1.initFooter');
var mod = 'j1';
logText = 'initialization started';
logger.info(logText);
var cb_load_closure = function(footer_id) {
return function ( responseTxt, statusTxt, xhr ) {
if ( statusTxt == 'success' ) {
logText = 'footer loaded successfully on id: ' + footer_id;
logger.info(logText);
state = 'footer_loaded';
logger.info('set state for module ' + mod + ': ' + state);
executeFunctionByName(mod + '.setState', window, state)
logText = 'initialization finished';
logger.info(logText);
}
if ( statusTxt == 'error' ) {
logText = 'loading footer failed on id: ' +footer_id+ ', error ' + xhr.status + ': ' + xhr.statusText;
logger.error(logText);
// Set|Log status
state = 'failed';
logger.error('state: ' + state);
logText = 'initialization finished';
logger.info(logText);
}
};
};
var id = '#' + '{{footer_id}}';
var selector = $(id);
if ( selector.length ) {
var footer_data_path = '{{footer_data_path}}';
// var footer_data_path = '{{footer_data_path}}' + id + ' > *';
selector.load( footer_data_path, cb_load_closure( id ) );
}
return true;
}, // END initFooter
// -------------------------------------------------------------------------
// initClipboard
// Create copy-to-clipboard for all pages
// -------------------------------------------------------------------------
initClipboard: function ( options ) {
var logger = log4javascript.getLogger('j1.initClipboard');
logText = 'initialization started';
logger.info(logText);
// insert copy to clipboard button before all elements having a
// class of ".highlight" assigned to (e.g. Asciidoc source blocks)
$('.highlight').each(function () {
// Check if no clipboard should be applied
var isNoClip = $(this).closest('.noclip');
if ( isNoClip.length == 0) {
var btnHtml = 'Copy
';
var bumms = $(this).closest('.noclip');
$(this).before(btnHtml);
$('.btn-clipboard').tooltip();
}
});
var clipboard = new Clipboard( '.btn-clipboard', {
target: function target(trigger) {
return trigger.parentNode.nextElementSibling;
}
});
// Manage clipboard events
clipboard.on('success', function (e) {
$(e.trigger).attr('title', 'copied!').tooltip('_fixTitle').tooltip('show').attr('title', 'Copy to clipboard').tooltip('_fixTitle');
var logger = log4javascript.getLogger('j1.initClipboard');
var logText = 'initialization copy-to-clipboard sucessfull';
logger.debug(logText);
/* Cleanup clipped data for trailing numbers */
var splitted = e.text.split('\n');
var concat;
var i;
for (i=0; i *";
selector.load( modal_html_data_path, cb_load_closure( mod, id ) );
return true;
} else {
logText = "data not loaded"
logger.warn(logText);
// Set processing state to 'finished' to complete module load
state = 'finished';
logger.info('state: ' + state);
executeFunctionByName(mod + '.setState', window, state)
return false;
}
}, // END xhrData
// -------------------------------------------------------------------------
// xhrApi: XMLHttpRequest (XHR) based async server API request
// Request an REST API at 'url', using verb 'type' of response type 'type'
// -------------------------------------------------------------------------
xhrApi: function (url, request_type, data_type) {
var logger = log4javascript.getLogger('j1.xhrApi');
var type = typeof request_type == 'undefined' || request_type == '' ? 'GET' : request_type;
var data_type = typeof data_type == 'undefined' || data_type == '' ? 'json' : data_type;
return $.ajax({
url: url,
type: type,
dataType: data_type,
success: function(data) {
if (typeof data == 'string') {
return JSON.parse(data);
}
if (typeof data == 'object') {
return data;
}
},
error: function(error) {
logger.error('xhr request failed: ' + error.statusText);
}
});
}, // END xhrApi
// -------------------------------------------------------------------------
// fetchAPI: Fetch (Promise) based async request
// Returns the current git state collected from /git endpoint
// -------------------------------------------------------------------------
fetchAPI: function (params, cbData) {
var logger = log4javascript.getLogger('j1.fetchAPI');
var cbData = cbData;
var parameters = params == '' ? 'all' : params;
var url = 'http://localhost:41001/gut';
async function callAPI() {
const URL = url;
const fetchResult = fetch(URL)
const response = await fetchResult;
if (response.ok) {
const jsonData = await response.json();
json_data = JSON.stringify(jsonData, undefined, 2);
logText = 'response from fetch received: ' + json_data;
logger.info(logText);
//console.log(jsonData);
} else {
throw Error(response.statusText);
// logger.error("Fetch request failed: " + response.statusText);
}
}
callAPI();
return true;
}, // END fetchAPI
// -------------------------------------------------------------------------
// getRuntimeData: Returns the j1_runtime data object
//
// -------------------------------------------------------------------------
getRuntimeData: function (data_path) {
var logger = log4javascript.getLogger('j1.getRuntimeData');
var logText;
return $.ajax({
url: data_path,
success: function (contents) {
logText = 'data loaded successfully';
logger.info(logText);
state = 'runtime_data_loaded_success';
logger.info('state: ' + state);
executeFunctionByName('j1.setState', window, state);
},
error: function (err) {
logText = 'runtime data not loaded: ' + err;
logger.warn(logText);
state = 'runtime_data_loaded_failed';
logger.info('state: ' + state);
executeFunctionByName('j1.setState', window, state)
return false;
}
});
}, // END getRuntimeData
// -------------------------------------------------------------------------
// getColorData: Returns the j1_colors object
// Load color definitions from colors_data_path
// -------------------------------------------------------------------------
getColorData: function (data_path) {
var logger = log4javascript.getLogger('j1.getColorData');
var j1_colors = {};
return $.ajax({
url: data_path,
success: function (data) {
var logText = "color data loaded successfully"
logger.info(logText);
state = 'color_data_loaded_success';
logger.info('state: ' + state);
executeFunctionByName('j1.setState', window, state);
if (typeof data == 'string') {
j1_colors = JSON.parse(data);
}
if (typeof data == 'object') {
j1_colors = data;
}
},
error: function (data) {
var logText = "color data not loaded"
logger.warn(logText);
state = 'color_data_loaded_failed';
logger.info('state: ' + state);
executeFunctionByName('j1.setState', window, state)
return false;
}
});
}, // END getColorData
// -------------------------------------------------------------------------
// setColorData:
//
// -------------------------------------------------------------------------
setColorData: function (color) {
if ( typeof color != 'undefined' ) {
var reHex = /^#[A-Fa-f0-9]+$/;
var reRGBA = /^rgba/;
var isHex = color.match(reHex);
var isRGBA = color.match(reRGBA);
if ( typeof j1.colors[color] != 'undefined' ) {
return j1.colors[color];
} else if (isHex) {
return color;
} else if (isRGBA) {
return color;
} else {
return false;
}
} else {
return false;
}
}, // END setColorData
// -------------------------------------------------------------------------
// getFontSizeData: Returns the j1_font_sizes object
// Load loadFontSize definitions from font_size_data_path
// -------------------------------------------------------------------------
getFontSizeData: function (data_path) {
var logger = log4javascript.getLogger('j1.getFontSizeData');
var j1_font_sizes = {};
return $.ajax({
url: data_path,
success: function (data) {
var logText = "font size data loaded successfully"
logger.info(logText);
state = 'fontsize_data_loaded_success';
logger.info('state: ' + state);
executeFunctionByName('j1.setState', window, state);
if (typeof data == 'string') {
j1_font_sizes = JSON.parse(data);
}
if (typeof data == 'object') {
j1_font_sizes = data;
}
},
error: function (data) {
var logText = "font size data not loaded"
logger.warn(logText);
state = 'fontsize_data_loaded_failed';
logger.info('state: ' + state);
executeFunctionByName('j1.setState', window, state)
return false;
}
});
}, // END getFontSizeData
// -------------------------------------------------------------------------
// getFontSize: Returns the CSS value for a 'logical' fontsize
// out of the j1_font_sizes object
// -------------------------------------------------------------------------
setFontSize: function (size) {
if ( typeof size != 'undefined' ) {
var reCSS = /\bpx\b|\brem\b|\bem\b|\%|\binherit\b|\binitial\b|\bunset\b/;
var isCSS = size.match(reCSS);
// if ( typeof j1_font_sizes[size] != "undefined" ) {
if ( typeof j1.fonts[size] != "undefined" ) {
return j1.fonts[size];
} else if (isCSS) {
return size;
} else {
return false;
}
} else {
return false;
}
}, // END getFontSize
// -------------------------------------------------------------------------
// loadMessageCatalog
// Loads the message catalog object
// -------------------------------------------------------------------------
getMessageCatalog: function (data_path /*, request_type, data_type*/) {
var logger = log4javascript.getLogger('j1.loadMessageCatalog');
var message_catalog = {};
var type = typeof request_type == 'undefined' || request_type == '' ? 'GET' : request_type;
var data_type = typeof data_type == 'undefined' || data_type == '' ? 'text' : data_type;
var messageData;
var logBase;
var logText;
var property;
return $.ajax({
url: data_path,
type: type,
dataType: data_type,
success: function (data) {
messageData = yaml.safeLoad(data);
for (property in messageData) {
if (messageData.hasOwnProperty(property)) {
message_catalog[property] = {};
messageData[property].forEach((element) => {
var key = Object.keys(element)[0];
var value = element[Object.keys(element)[0]];
message_catalog[property][key] = value;
});
}
}
j1.messages = message_catalog;
logBase = message_catalog.info.getData.message
logText = logBase.text + logBase.message_catalog + logBase.finished;
logger.info(logText);
},
error: function(data) {
var json_data = JSON.stringify(data, undefined, 2);
logBase = message_catalog.error.getData.message;
logText = logBase.text + logBase.xhr + ': ' + json_data
logger.error(logText);
}
});
}, // END getMessageCatalog
// -------------------------------------------------------------------------
// readCookie:
//
// -------------------------------------------------------------------------
readCookie: function (name) {
var data;
var data_json;
var cookieExists = j1.existsCookie(name);
if (cookieExists) {
data_json = window.atob(Cookies.get(name));
data = JSON.parse(data_json);
if (data) {
return data;
} else {
return false;
}
} else {
return false;
}
}, // END readCookie
// -------------------------------------------------------------------------
// writeCookie:
// Write 'data' to a cookie 'name'. If not exists, the cookie gets
// created. Returns 'true' if cookie was written, otherwise 'false'.
//
writeCookie: function (options /*name, data, [path, expires, secure]*/) {
var defaults = {
name: '',
data: {},
path: '/',
expires: 0,
secure: false
};
var settings = $.extend(defaults, options);
var epoch = Math.floor(Date.now()/1000);
var timestamp = moment.unix(epoch).format('YYYY-MM-DD hh:mm:ss');
var cookie_data = {};
var data_json;
var data_encoded;
if (j1.existsCookie(settings.name)) {
cookie_data = j1.readCookie(settings.name);
cookie_data.timestamp = timestamp;
cookie_data = j1.mergeData(cookie_data, settings.data);
data_json = JSON.stringify( cookie_data );
data_encoded = window.btoa(data_json);
if (settings.expires > 0) {
Cookies.set(settings.name, data_encoded, { expires: settings.expires });
} else {
Cookies.set(settings.name, data_encoded);
}
} else {
cookie_data = settings.data
data_json = JSON.stringify( settings.data );
data_encoded = window.btoa(data_json);
if (settings.expires > 0) {
Cookies.set(settings.name, data_encoded, { expires: settings.expires });
} else {
Cookies.set(settings.name, data_encoded);
}
}
if (j1.existsCookie(settings.name)) {
return cookie_data;
} else {
return false;
}
}, // END writeCookie
// -------------------------------------------------------------------------
// Clears all given cookies by name (except cookies set to httpOnly).
// For all cookies the expire date is set in the past, those cookies
// are 'session' cookies. All session cookies are deleted (automatically)
// by the browser if the last session (browser window) is closed.
// See: https://stackoverflow.com/questions/179355/clearing-all-cookies-with-javascript
// -------------------------------------------------------------------------
removeCookie: function (options /*name [, path]*/) {
var cookieExists;
var defaults = {
name: '',
path: '/'
};
var settings = $.extend(defaults, options);
Cookies.remove(settings.name, { path: settings.path });
}, // END removeCookie
// -------------------------------------------------------------------------
// Clears all given cookies by name (except cookies set to httpOnly).
// For all cookies the expire date is set in the past, those cookies
// are 'session' cookies. All session cookies are deleted (automatically)
// by the browser if the last session (browser window) is closed.
// See: https://stackoverflow.com/questions/179355/clearing-all-cookies-with-javascript
// -------------------------------------------------------------------------
deleteCookie: function (options) {
var name = options;
var all_cookies = document.cookie.split("; ");
if ( name === 'all' ) {
for (var c = 0; c < all_cookies.length; c++) {
var d = window.location.hostname.split(".");
while (d.length > 0) {
var cookieBase = encodeURIComponent(all_cookies[c].split(";")[0].split("=")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path=';
var p = location.pathname.split('/');
document.cookie = cookieBase + '/';
while (p.length > 0) {
document.cookie = cookieBase + p.join('/');
p.pop();
};
d.shift();
}
}
} else {
document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
}
return true;
}, // END deleteCookie
// -------------------------------------------------------------------------
// returns true if a given cookie exists
// -------------------------------------------------------------------------
existsCookie: function (name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
var end = dc.length; // default to end of the string
var cookieExists = false;
var cookieContent = '';
// found, and not in first position
if (begin !== -1) {
// exclude the "; "
begin += 2;
} else {
//see if cookie is in first position
begin = dc.indexOf(prefix);
// not found at all or found as a portion of another cookie name
if (begin === -1 || begin !== 0 ) return false;
}
// if ";" is found somewhere after the prefix position then "end" is
// that position, otherwise it defaults to the end of the string
if (dc.indexOf(";", begin) !== -1) {
end = dc.indexOf(";", begin);
}
cookieContent = decodeURI(dc.substring(begin + prefix.length, end) ).replace(/"/g, '');
cookieExists = cookieContent.length ? true : false;
return cookieExists;
}, // END existsCookie
// -------------------------------------------------------------------------
// Resolve MACROs
//
// See:
// https://stackoverflow.com/questions/5376431/wildcards-in-jquery-selectors
// https://stackoverflow.com/questions/16400072/jquery-each-only-affects-last-element
// https://dzone.com/articles/why-does-javascript-loop-only-use-last-value
// https://stackoverflow.com/questions/179713/how-to-change-the-href-for-a-hyperlink-using-jquery
// https://stackoverflow.com/questions/5223/length-of-a-javascript-object
// -------------------------------------------------------------------------
resolveMacros: function (user_data) {
var logger = log4javascript.getLogger('j1.resolveMacros');
if (Object.keys(user_data).length) {
$('[id^=macro-]').each(function() {
$('#macro-provider').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??provider', user_data.provider));
this.href = this.href.replace(/.*\/??provider-site-url/, user_data.provider_site_url);
});
$('#macro-user-name').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??user-name', user_data.user_name));
this.href = this.href.replace(/.*\/??provider_member_url/, user_data.provider_member_url);
});
$('#macro-provider-permissions').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??provider-permissions', user_data.provider_permissions));
this.href = this.href.replace(/.*\/??provider_member_url/, user_data.provider_member_url);
});
$('#macro-provider-membership').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??provider-membership', user_data.provider_membership));
this.href = this.href.replace(/.*\/??provider_member_url/, user_data.provider_member_url);
});
$('#macro-cookie-state').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??cookie-state', user_data.cookies_accepted));
this.href = this.href.replace(/.*\/??provider_privacy_url/, user_data.provider_privacy_url);
});
$('#macro-theme-name').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??theme-name', user_data.theme_name));
});
$('#macro-theme-author').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??theme-author', user_data.theme_author));
this.href = this.href.replace(/.*\/??theme-author-url/, user_data.theme_author_url);
});
$('#macro-theme-version').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace('??theme-version', user_data.theme_version));
});
});
return true;
} else {
logger.error('no user data provided');
return false;
}
}, // END resolveMacros
// -------------------------------------------------------------------------
// Update MACROs
// Update the values, NOT the placeholders
// -------------------------------------------------------------------------
updateMacros: function (user_data) {
var logger = log4javascript.getLogger('j1.updateMacros');
if (Object.keys(user_data).length) {
$('[id^=macro-]').each(function() {
$('#macro-provider').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace(/Provider:.*/, 'Provider: ' + user_data.provider));
$('#macro-provider').attr("href", user_data.provider_site_url);
});
$('#macro-user-name').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace(/User:.*/, 'User: ' + user_data.user_name));
$('#macro-user-name').attr("href", user_data.provider_member_url);
});
$('#macro-provider-permissions').each(function() {
var $this = $(this);
var $html = $this.html();
// $this.html($html.replace(/public|protected|private|blocked/, user_data.provider_permissions));
$this.html($html.replace(/public.*|protected.*|private.*|blocked.*/, user_data.provider_permissions));
$('#macro-provider-permissions').attr("href", user_data.provider_member_url);
});
$('#macro-provider-membership').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace(/guest|member/, user_data.provider_membership));
$('#macro-provider-membership').attr("href", user_data.provider_member_url);
});
$('#macro-cookie-state').each(function() {
var $this = $(this);
var $html = $this.html();
$this.html($html.replace(/accepted|declined|pending/, user_data.cookies_accepted));
$('#macro-cookie-state').attr("href", user_data.provider_privacy_url);
});
});
return true;
} else {
logger.error('no user data provided');
return false;
}
}, // END updateMacros
// -------------------------------------------------------------------------
// getMessage
// Get a log message from the log message catalog object
// -------------------------------------------------------------------------
getMessage: function (level, message, property) {
var message = j1.messages[level][message]["message"][property];
return message;
}, // END getMessage
// -------------------------------------------------------------------------
// logger
// Log a message
// -------------------------------------------------------------------------
logger: function (logger, level, message) {
var logger = log4javascript.getLogger(logger);
logger[level](message);
return true;
}, // END logger
// -------------------------------------------------------------------------
// getBaseUrl
// -------------------------------------------------------------------------
// getBaseUrl: function () {
// var myUrl = window.location.href;
// var ua = platform.name.toLowerCase();
// var reURL = new RegExp('(http[s]?:\/\/)?([^\/]+)(.*)');
// var baseUrl;
// //var reGroups;
//
// // NOTE: named capture groups NOT supported by FF + IE11
// // if ( ua === 'chrome' ) {
// // reURL = new RegExp('(?http[s]?:\/\/)?(?[^\/]+)(?.*)');
// // reGroups = myUrl.match(reURL).groups;
// // baseUrl = reGroups.prot + reGroups.host;
// // } else {
// // reURL = new RegExp('(http[s]?:\/\/)?([^\/]+)(.*)');
// // myUrl.match(reURL);
// // baseUrl = RegExp.$1 + RegExp.$2 + RegExp.$3;
// // }
//
// myUrl.match(reURL);
// // baseUrl = RegExp.$1 + RegExp.$2 + RegExp.$3;
// baseUrl = RegExp.$1 + RegExp.$2;
//
// return baseUrl;
// }, // END getBaseUrl
// -------------------------------------------------------------------------
// getPath
// See: https://stackoverflow.com/questions/27745/getting-parts-of-a-url-regex
// -------------------------------------------------------------------------
// getPath: function ( myUrl ) {
// var url = new parseURL(myUrl)
// // var reURL = new RegExp('(http[s]?:\/\/)?([^\/]+)(.*)');
// // var path;
// //
// // myUrl.match(reURL);
// path = url.path;
//
// return path;
// }, // END getPath
// -------------------------------------------------------------------------
// Send message
// -------------------------------------------------------------------------
sendMessage: function ( sender, receiver, message ) {
var logger = log4javascript.getLogger('j1.sendMessage');
// var json_message = JSON.stringify(message, undefined, 2); // multiline
var json_message = JSON.stringify(message);
if ( receiver === 'j1' ) {
logText = 'send message from ' + sender + ' to' + receiver + ': ' + json_message;
logger.debug(logText);
executeFunctionByName('j1' + '.messageHandler', window, sender, message)
} else {
logText = 'send message from ' + sender + ' to ' + receiver + ': ' + json_message;
logger.debug(logText);
//executeFunctionByName('j1.' + receiver + '.messageHandler', window, sender, message)
executeFunctionByName(receiver + '.messageHandler', window, sender, message)
}
}, // END sendMessage
// -------------------------------------------------------------------------
// messageHandler: MessageHandler for J1 CookieConsent module
// Manage messages send from other J1 modules
// -------------------------------------------------------------------------
messageHandler: function ( sender, message ) {
// var json_message = JSON.stringify(message, undefined, 2); // multiline
var json_message = JSON.stringify(message);
logText = 'received message from ' + sender + ': ' + json_message;
logger.debug(logText);
// -----------------------------------------------------------------------
// Process commands|actions
// -----------------------------------------------------------------------
if ( message.type === 'command' && message.action === 'module_initialized' ) {
_this.setState('finished');
logger.info(message.text);
}
//
// Place handling of other command|action here
//
return true;
}, // END messageHandler
// -------------------------------------------------------------------------
// getStyleValue:
// returns the value of a style from a css class definition
// example: j1.getStyleValue('bg-primary', 'background-color')
getStyleValue: function (className, style) {
var elementId = 'test-' + className,
testElement = document.getElementById(elementId),
val;
if (testElement === null) {
testElement = document.createElement('div');
testElement.className = className;
testElement.style.display = 'none';
document.body.appendChild(testElement);
}
val = $(testElement).css(style);
document.body.removeChild(testElement);
return val;
}, // END getStyleValue
// -------------------------------------------------------------------------
// Returns the names of cookies used for J1 Template
// -------------------------------------------------------------------------
getCookieNames: function () {
return cookie_names;
}, // end getCookieNames
// -------------------------------------------------------------------------
// Set dynamic styles
// -------------------------------------------------------------------------
setCss: function () {
var logger = log4javascript.getLogger('j1.setCss');
var bg_primary = j1.getStyleValue('bg-primary', 'background-color');
logger.info('set color scheme for selected theme');
// globals
// -----------------------------------------------------------------------
$('head').append('');
// mdi icons
// -----------------------------------------------------------------------
$('head').append('');
$('head').append('');
$('head').append('');
$('head').append('');
// asciidoc
// -----------------------------------------------------------------------
var admonitionblock_note_color = bg_primary;
var admonitionblock_tip_color = j1.getStyleValue('btn-success', 'background-color');
var admonitionblock_important_color = j1.getStyleValue('btn-warning', 'background-color');
var admonitionblock_warning_color = j1.getStyleValue('icon-warning', 'color');
var admonitionblock_caution_color = j1.getStyleValue('btn-danger', 'background-color');
$('head').append('');
$('head').append('');
$('head').append('');
$('head').append('');
$('head').append('');
// bs base styles
// -----------------------------------------------------------------------
$('head').append('');
// bs tool tips
// -----------------------------------------------------------------------
$('head').append('');
// asciidoc results viewer
// -----------------------------------------------------------------------
$('head').append('');
// clipboard
// -----------------------------------------------------------------------
$('head').append('');
// extended modals
// -----------------------------------------------------------------------
var tabs_pills_link_color_active = j1.setColorData('md_blue'); // j1.getStyleValue('btn-info', 'background-color');
var tabs_pills_link_color_hover = j1.setColorData('md_gray_300'); // j1.getStyleValue('btn-secondary', 'background-color');
// nav module
// -----------------------------------------------------------------------
$('head').append('');
$('head').append('');
return true;
}, // END setCss
// -------------------------------------------------------------------------
// Set the current (processing) state of the module
// -------------------------------------------------------------------------
setState: function (stat) {
state= stat;
//j1.state stat;
}, // end setState
// -------------------------------------------------------------------------
// Returns the current (processing) state of the module
// -------------------------------------------------------------------------
getState: function () {
// return j1.state;
return state;
}, // end getState
// -------------------------------------------------------------------------
// Set the current mode of the site (web|app)
// -------------------------------------------------------------------------
setMode: function (mod) {
mode = mod;
}, // END setMode
// -------------------------------------------------------------------------
// Return the current mode of the site (web|app)
// -------------------------------------------------------------------------
getMode: function () {
return mode;
}, // END getMode
// -------------------------------------------------------------------------
// getUserAgent
// Return the name of the web browser
// -------------------------------------------------------------------------
checkUserAgent: function (ua_name) {
if (navigator.userAgent.search(ua_name) >= 0) {
return true;
} else {
return false;
}
}, // END checkUserAgent
// -------------------------------------------------------------------------
// Return always true (for testing purposes)
// -------------------------------------------------------------------------
getTrue: function () {
return true;
}, // END isTrue
// -------------------------------------------------------------------------
// Return always false (for testing purposes)
// -------------------------------------------------------------------------
getFalse: function () {
return false;
}, // END isTrue
// -------------------------------------------------------------------------
// Return users to their browser homepage
// -------------------------------------------------------------------------
goHome: function () {
// most browsers
if (typeof window.home == 'function') {
window.home();
} else if (document.all) {
// for IE
window.location.href = "about:home";
} else {
window.location.href = "about:blank";
}
} // END gohome
} // END j1 (return)
}) (j1, window);
{% endcapture %}
{{ cache | strip_empty_lines }}
{% assign cache = nil %}