j1-template 2021.1.12 → 2021.1.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_app.html +1 -1
  3. data/_includes/themes/j1/layouts/content_generator_blog_archive.html +1 -1
  4. data/_includes/themes/j1/layouts/content_generator_collection.html +1 -1
  5. data/_includes/themes/j1/layouts/content_generator_page.html +4 -1
  6. data/_includes/themes/j1/layouts/content_generator_post.html +1 -1
  7. data/_includes/themes/j1/layouts/content_generator_raw.html +1 -1
  8. data/_includes/themes/j1/layouts/layout_metadata_generator.html +55 -0
  9. data/_includes/themes/j1/modules/connectors/comment/commento.html +31 -0
  10. data/_includes/themes/j1/modules/connectors/comment/custom-provider.html +7 -8
  11. data/_includes/themes/j1/modules/connectors/comment/disqus.html +12 -54
  12. data/_includes/themes/j1/modules/connectors/comment/facebook.html +7 -8
  13. data/_includes/themes/j1/modules/connectors/comment/hyvor.html +33 -0
  14. data/_includes/themes/j1/modules/connectors/comment/just-comments.html +31 -0
  15. data/_includes/themes/j1/modules/connectors/comments +3 -0
  16. data/_layouts/default.html +51 -0
  17. data/assets/data/disqus.js +81 -0
  18. data/assets/data/hyvor.js +72 -0
  19. data/assets/error_pages/HTTP204.html +2 -1
  20. data/assets/error_pages/HTTP400.html +2 -1
  21. data/assets/error_pages/HTTP401.html +2 -1
  22. data/assets/error_pages/HTTP403.html +2 -1
  23. data/assets/error_pages/HTTP404.html +2 -1
  24. data/assets/error_pages/HTTP444.html +93 -0
  25. data/assets/error_pages/HTTP500.html +2 -1
  26. data/assets/error_pages/HTTP501.html +2 -1
  27. data/assets/error_pages/HTTP502.html +2 -1
  28. data/assets/error_pages/HTTP503.html +2 -1
  29. data/assets/themes/j1/adapter/js/algolia.js +10 -10
  30. data/assets/themes/j1/adapter/js/asciidoctor.js +6 -6
  31. data/assets/themes/j1/adapter/js/attic.js +17 -17
  32. data/assets/themes/j1/adapter/js/bmd.js +6 -6
  33. data/assets/themes/j1/adapter/js/carousel.js +10 -10
  34. data/assets/themes/j1/adapter/js/clipboard.js +10 -10
  35. data/assets/themes/j1/adapter/js/cookieConsent.js +46 -20
  36. data/assets/themes/j1/adapter/js/fam.js +34 -34
  37. data/assets/themes/j1/adapter/js/framer.js +6 -6
  38. data/assets/themes/j1/adapter/js/j1.js +322 -209
  39. data/assets/themes/j1/adapter/js/justifiedGallery.js +11 -11
  40. data/assets/themes/j1/adapter/js/justifiedGalleryCustomizer.js +19 -19
  41. data/assets/themes/j1/adapter/js/lightbox.js +6 -6
  42. data/assets/themes/j1/adapter/js/logger.js +7 -7
  43. data/assets/themes/j1/adapter/js/mmenu.js +25 -25
  44. data/assets/themes/j1/adapter/js/navigator.js +48 -48
  45. data/assets/themes/j1/adapter/js/quicksearch.js +6 -6
  46. data/assets/themes/j1/adapter/js/rouge.js +7 -7
  47. data/assets/themes/j1/adapter/js/rtable.js +6 -6
  48. data/assets/themes/j1/adapter/js/themer.js +24 -20
  49. data/assets/themes/j1/adapter/js/toccer.js +9 -9
  50. data/assets/themes/j1/modules/backstretch/js/backstretch.js +3 -3
  51. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +27 -20
  52. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.min.js +287 -1
  53. data/assets/themes/j1/modules/lunrSearch/js/quicksearch.js +1 -1
  54. data/assets/themes/j1/modules/themeSwitcher/js/switcher.js +19 -19
  55. data/lib/j1/version.rb +1 -1
  56. data/lib/starter_web/Gemfile +1 -1
  57. data/lib/starter_web/_config.yml +42 -24
  58. data/lib/starter_web/_data/j1_config.yml +22 -11
  59. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  60. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  61. data/lib/starter_web/index.html +3 -3
  62. data/lib/starter_web/package.json +1 -1
  63. data/lib/starter_web/pages/public/asciidoc_skeletons/book/book.adoc +3 -0
  64. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +3 -0
  65. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +3 -0
  66. data/lib/starter_web/pages/public/blog/navigator/archive.html +4 -0
  67. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +4 -0
  68. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +4 -0
  69. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +5 -1
  70. data/lib/starter_web/pages/public/blog/navigator/index.html +4 -0
  71. data/lib/starter_web/pages/public/cookieConsent.adoc +3 -0
  72. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +0 -1
  73. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +2 -1
  74. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +0 -2
  75. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +0 -2
  76. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +0 -1
  77. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +0 -1
  78. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +0 -1
  79. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +0 -1
  80. data/lib/starter_web/pages/public/learn/roundtrip/600_quicksearch.adoc +0 -1
  81. data/lib/starter_web/pages/public/learn/where_to_go.adoc +0 -1
  82. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +3 -1
  83. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +3 -1
  84. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +78 -17
  85. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +3 -1
  86. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  87. data/lib/starter_web/utilsrv/package.json +1 -1
  88. metadata +8 -3
  89. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.org.asciidoc +0 -244
@@ -127,8 +127,8 @@ j1.adapter['fam'] = (function (j1, window) {
127
127
 
128
128
  // initialize state flag
129
129
  _this.setState('started');
130
- logger.info('set module state to: ' + _this.getState());
131
- logger.info('module is being initialized');
130
+ logger.info('\n' + 'set module state to: ' + _this.getState());
131
+ logger.info('\n' + 'module is being initialized');
132
132
 
133
133
  // create settings object from frontmatterOptions
134
134
  var frontmatterOptions = options != null ? $.extend({}, options) : {};
@@ -161,7 +161,7 @@ j1.adapter['fam'] = (function (j1, window) {
161
161
 
162
162
  var dependencies_met_navigator = setInterval(function() {
163
163
  if (j1.adapter.navigator.getState() == 'finished') {
164
- logger.info('met dependencies for: navigator');
164
+ logger.info('\n' + 'met dependencies for: navigator');
165
165
  _this.famLoader(moduleOptions);
166
166
  clearInterval(dependencies_met_navigator);
167
167
  }
@@ -175,10 +175,10 @@ j1.adapter['fam'] = (function (j1, window) {
175
175
  famLoader: function (famOptions) {
176
176
 
177
177
  _this.setState('loading');
178
- logger.info('set module state to: ' + _this.getState());
179
- logger.info('load HTML data for fam');
178
+ logger.info('\n' + 'set module state to: ' + _this.getState());
179
+ logger.info('\n' + 'load HTML data for fam');
180
180
 
181
- j1.xhrData ({
181
+ j1.loadHTML({
182
182
  xhr_container_id: famOptions.xhr_container_id,
183
183
  xhr_data_path: famOptions.xhr_data_path,
184
184
  xhr_data_element: famOptions.fam_menu_id },
@@ -192,15 +192,15 @@ j1.adapter['fam'] = (function (j1, window) {
192
192
  var dependencies_met_fam_initialized = setInterval (function () {
193
193
  if (j1.xhrDOMState['#' + famOptions.xhr_container_id] == 'success' && j1.getState() == 'finished') {
194
194
  _this.setState('loaded');
195
- logger.info('set module state to: ' + _this.getState());
196
- logger.info('HTML data for fam: ' + _this.getState());
195
+ logger.info('\n' + 'set module state to: ' + _this.getState());
196
+ logger.info('\n' + 'HTML data for fam: ' + _this.getState());
197
197
 
198
198
  // _this.scrollSpy(famOptions);
199
199
  _this.buttonInitializer(famOptions);
200
200
 
201
201
  _this.setState('finished');
202
- logger.info('state: ' + _this.getState());
203
- logger.info('module initialized successfully');
202
+ logger.info('\n' + 'state: ' + _this.getState());
203
+ logger.info('\n' + 'module initialized successfully');
204
204
 
205
205
  $('.fam-btn').show();
206
206
 
@@ -231,14 +231,14 @@ j1.adapter['fam'] = (function (j1, window) {
231
231
  //
232
232
  $('a[href="#void"]').click(function(e) {
233
233
  e.preventDefault ? e.preventDefault() : e.returnValue = false;
234
- logger.info('bound click event to "#void", suppress default action');
234
+ logger.info('\n' + 'bound click event to "#void", suppress default action');
235
235
  });
236
236
 
237
237
  // check if multiple buttons detected
238
238
  if ( famButtons.length == 1 ) {
239
239
  _this.setState('processing');
240
- logger.info('set module state to: ' + _this.getState());
241
- logger.info('initialize fam menu');
240
+ logger.info('\n' + 'set module state to: ' + _this.getState());
241
+ logger.info('\n' + 'initialize fam menu');
242
242
 
243
243
  actionButtonId = famButtons[0].firstElementChild.id;
244
244
  actionMenuId = actionButtonId.replace('_button', '');
@@ -281,25 +281,25 @@ j1.adapter['fam'] = (function (j1, window) {
281
281
  eventHandler = item.event_handler;
282
282
  // check if eventhandler configured is a SINGLE word
283
283
  if (eventHandler.split(' ').length == 1) {
284
- logger.info('register pre-configured eventhandler ' +eventHandler+ ' on id: #' + item.id);
284
+ logger.info('\n' + 'register pre-configured eventhandler ' +eventHandler+ ' on id: #' + item.id);
285
285
 
286
286
  if ( eventHandler === 'open_mmenu_toc' ) {
287
287
  if ($('#j1-toc-mgr').length) {
288
- logger.info('found toc in page: enabled');
288
+ logger.info('\n' + 'found toc in page: enabled');
289
289
  var dependencies_met_toccer_finished = setInterval (function () {
290
290
  if ( j1.adapter.toccer.getState() == 'finished' ) {
291
- logger.info('met dependencies for: toccer');
291
+ logger.info('\n' + 'met dependencies for: toccer');
292
292
 
293
293
  // famOptions.mode === 'icon'
294
- // ? logger.info('fam mode detected: icon')
295
- // : logger.info('fam mode detected: menu');
294
+ // ? logger.info('\n' + 'fam mode detected: icon')
295
+ // : logger.info('\n' + 'fam mode detected: menu');
296
296
 
297
297
  $('#open_mmenu_toc').show();
298
298
  clearInterval(dependencies_met_toccer_finished);
299
299
  }
300
300
  }, 25); // END dependencies_met_toccer_finished
301
301
  } else {
302
- logger.info('found toc in page: disabled');
302
+ logger.info('\n' + 'found toc in page: disabled');
303
303
  }
304
304
  } else {
305
305
  $('#' + item.id).show();
@@ -313,16 +313,16 @@ j1.adapter['fam'] = (function (j1, window) {
313
313
  });
314
314
  });
315
315
  } else {
316
- logger.info('register custom eventhandler on id: #' + item.id);
316
+ logger.info('\n' + 'register custom eventhandler on id: #' + item.id);
317
317
  }
318
318
  } else {
319
319
  // alert ('Creating Eventhandler failed on id: #' + item.id);
320
- logger.error('Creating Eventhandler failed on id: #' + item.id);
320
+ logger.error('\n' + 'creating Eventhandler failed on id: #' + item.id);
321
321
  } // END if items (action buttons)
322
322
  });
323
323
  } else {
324
324
  // single action, create FAB
325
- logger.info('single action found for FAM, create: FAB');
325
+ logger.info('\n' + 'single action found for FAM, create: FAB');
326
326
 
327
327
  // disable hover event (CSS)
328
328
  // $actionButton.css({'pointer-events': 'none'})
@@ -331,7 +331,7 @@ j1.adapter['fam'] = (function (j1, window) {
331
331
  eventHandler = item.event_handler;
332
332
  // check if eventhandler configured is a SINGLE word
333
333
  if (eventHandler.split(' ').length == 1) {
334
- logger.info('register pre-configured eventhandler ' +eventHandler+ ' on id: #' + actionButtonId);
334
+ logger.info('\n' + 'register pre-configured eventhandler ' +eventHandler+ ' on id: #' + actionButtonId);
335
335
 
336
336
  if (eventHandler === 'scroll_to_top') {
337
337
  // register click event
@@ -346,10 +346,10 @@ j1.adapter['fam'] = (function (j1, window) {
346
346
  if ( eventHandler === 'open_mmenu_toc' ) {
347
347
  // check if toccer (toc_mgr) is available
348
348
  if ($('#j1-toc-mgr').length) {
349
- logger.info('found toc in page: enabled');
349
+ logger.info('\n' + 'found toc in page: enabled');
350
350
  var dependencies_met_toccer_finished = setInterval (function () {
351
351
  if ( j1.adapter.toccer.getState() == 'finished' ) {
352
- logger.info('met dependencies for toccer: finished');
352
+ logger.info('\n' + 'met dependencies for toccer: finished');
353
353
  // change the id of the $actionButton to the already
354
354
  // registered id by mmenu adapter of ('open_mmenu_toc')
355
355
  // to open the TOC sidebar
@@ -359,8 +359,8 @@ j1.adapter['fam'] = (function (j1, window) {
359
359
  }
360
360
  }, 25); // END dependencies_met_toccer_finished
361
361
  } else {
362
- logger.info('found toc in page: disabled');
363
- logger.info('eventhandler: disabled');
362
+ logger.info('\n' + 'found toc in page: disabled');
363
+ logger.info('\n' + 'eventhandler: disabled');
364
364
  }
365
365
  } // END if eventHandler == open_mmenu_toc
366
366
  }
@@ -368,8 +368,8 @@ j1.adapter['fam'] = (function (j1, window) {
368
368
  } // END else
369
369
  } else {
370
370
  // alert ('Multiple FAM buttons found: ' + famButtons.length);
371
- logger.error('Multiple FAM buttons found: ' + famButtons.length);
372
- logger.info('FAM container set to hidden: ' + $famContainer);
371
+ logger.error('\n' + 'multiple FAM buttons found: ' + famButtons.length);
372
+ logger.info('\n' + 'FAM container set to hidden: ' + $famContainer);
373
373
  $famContainer.hide();
374
374
  } // END if famButton
375
375
  }, // END buttonInitializer
@@ -573,7 +573,7 @@ j1.adapter['fam'] = (function (j1, window) {
573
573
  // var json_message = JSON.stringify(message, undefined, 2); // multiline
574
574
  var json_message = JSON.stringify(message);
575
575
 
576
- logText = 'received message from ' + sender + ': ' + json_message;
576
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
577
577
  logger.debug(logText);
578
578
 
579
579
  // -----------------------------------------------------------------------
@@ -583,10 +583,10 @@ j1.adapter['fam'] = (function (j1, window) {
583
583
  //
584
584
  // Place handling of command|action here
585
585
  //
586
- logger.info(message.text);
586
+ logger.info('\n' + message.text);
587
587
  }
588
588
  if (message.type === 'command' && message.action === 'status') {
589
- logger.info('messageHandler: received - ' + message.action);
589
+ logger.info('\n' + 'messageHandler: received - ' + message.action);
590
590
  }
591
591
 
592
592
  //
@@ -645,8 +645,8 @@ j1.adapter['fam'] = (function (j1, window) {
645
645
  ? $famContainer.css('display','block')
646
646
  : $famContainer.css('display','none');
647
647
 
648
- // logger.debug('content pos detected as: ' + m + 'px');
649
- // logger.debug('scroll pos detected as: ' + scrollPos + 'px');
648
+ // logger.debug('\n' + 'content pos detected as: ' + m + 'px');
649
+ // logger.debug('\n' + 'scroll pos detected as: ' + scrollPos + 'px');
650
650
  }); // END setTop on scroll
651
651
 
652
652
  }, // END scrollSpy
@@ -115,8 +115,8 @@ j1.adapter['framer'] = (function (j1, window) {
115
115
 
116
116
  // initialize state flag
117
117
  _this.setState('started');
118
- logger.info('state: ' + _this.getState());
119
- logger.info('module is being initialized');
118
+ logger.info('\n' + 'state: ' + _this.getState());
119
+ logger.info('\n' + 'module is being initialized');
120
120
 
121
121
  // -----------------------------------------------------------------------
122
122
  // Default module settings
@@ -160,8 +160,8 @@ j1.adapter['framer'] = (function (j1, window) {
160
160
  });
161
161
 
162
162
  _this.setState('finished');
163
- logger.info('state: ' + _this.getState());
164
- logger.info('initializing module finished');
163
+ logger.info('\n' + 'state: ' + _this.getState());
164
+ logger.info('\n' + 'initializing module finished');
165
165
 
166
166
  clearInterval(dependencies_met_page_finished);
167
167
 
@@ -179,7 +179,7 @@ j1.adapter['framer'] = (function (j1, window) {
179
179
  messageHandler: function (sender, message) {
180
180
  var json_message = JSON.stringify(message, undefined, 2);
181
181
 
182
- logText = 'received message from ' + sender + ': ' + json_message;
182
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
183
183
  logger.debug(logText);
184
184
 
185
185
  // -----------------------------------------------------------------------
@@ -189,7 +189,7 @@ j1.adapter['framer'] = (function (j1, window) {
189
189
  //
190
190
  // Place handling of command|action here
191
191
  //
192
- logger.info(message.text);
192
+ logger.info('\n' + message.text);
193
193
  }
194
194
 
195
195
  //
@@ -75,6 +75,23 @@ regenerate: true
75
75
  {% assign panel_data_path = panel_config_defaults.data_path %}
76
76
 
77
77
  {% assign hideOnReload = modules.themer_options.hideOnReload %}
78
+ {% assign comment_provider = template_config.comments.provider %}
79
+
80
+ {% comment %} Set variables
81
+ -------------------------------------------------------------------------------- {% endcomment %}
82
+ {% if comment_provider == 'disqus' %}
83
+ {% assign site_id = template_config.comments.disqus.site_id %}
84
+ {% elsif comment_provider == 'hyvor' %}
85
+ {% assign site_id = template_config.comments.hyvor.site_id %}
86
+ {% elsif comment_provider == 'commento' %}
87
+ {% assign site_id = template_config.comments.commento.site_id %}
88
+ {% elsif comment_provider == 'just-comments' %}
89
+ {% assign site_id = template_config.comments.just-comments.site_id %}
90
+ {% elsif comment_provider == 'facebook' %}
91
+ {% assign site_id = template_config.comments.facebook.site_id %}
92
+ {% else %}
93
+ {% assign site_id = false %}
94
+ {% endif %}
78
95
 
79
96
  {% assign production = false %}
80
97
  {% if environment == 'prod' or environment == 'production' %}
@@ -124,11 +141,18 @@ var j1 = (function () {
124
141
  var state = 'not_started';
125
142
  var mode = 'not_detected';
126
143
 
127
- // Tracking information (GA)
144
+ // Default tracking provider information
128
145
  var tracking_enabled = ('{{tracking_enabled}}' === 'true') ? true: false;
129
146
  var tracking_id = '{{tracking_id}}';
130
147
  var tracking_id_valid = (tracking_id.includes('tracking-id')) ? false : true;
131
148
 
149
+ // Default comment provider information
150
+ var comment_provider = '{{comment_provider}}';
151
+ var site_id = '{{site_id}}';
152
+
153
+ // Default translator settings (currently NOT supported)
154
+ // var translation_enabled = {{template_config.translation.enabled}};
155
+
132
156
  var current_user_data;
133
157
  var current_page;
134
158
  var previous_page;
@@ -138,9 +162,6 @@ var j1 = (function () {
138
162
  var user_session_detected;
139
163
  var cookie_written;
140
164
 
141
- // Translatior settings (currently NOT supported)
142
- // var translation_enabled = {{template_config.translation.enabled}};
143
-
144
165
  // Theme information
145
166
  var themeName;
146
167
  var themeCss;
@@ -165,7 +186,7 @@ var j1 = (function () {
165
186
  var baseUrl;
166
187
  var referrer;
167
188
 
168
- // initial cookie values
189
+ // initial cookie settings
169
190
  var cookie_names = {
170
191
  'app_session': '{{template_config.cookies.app_session}}',
171
192
  'user_session': '{{template_config.cookies.user_session}}',
@@ -233,6 +254,9 @@ var j1 = (function () {
233
254
  var logger = log4javascript.getLogger('j1.init');
234
255
  var url = new liteURL(window.location.href);
235
256
  var baseUrl = url.origin;
257
+ var hostname = url.hostname;
258
+ var domain = hostname.substring(hostname.lastIndexOf('.', hostname.lastIndexOf('.') - 1) + 1);
259
+ var secure = (url.protocol.includes('https')) ? true : false;
236
260
  var date = new Date();
237
261
  var timestamp_now = date.toISOString();
238
262
  var curr_state = 'started';
@@ -280,34 +304,37 @@ var j1 = (function () {
280
304
  cookie_written = j1.writeCookie({
281
305
  name: cookie_names.user_consent,
282
306
  data: user_consent,
283
- samesite: 'Strict'
307
+ samesite: 'Strict',
308
+ secure: secure
284
309
  });
285
310
  if (!cookie_written) {
286
- logger.error('failed to write cookie: ' + cookie_names.user_consent);
311
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_consent);
287
312
  }
288
313
  cookie_written = j1.writeCookie({
289
314
  name: cookie_names.user_state,
290
315
  data: user_state,
291
- samesite: 'Strict'
316
+ samesite: 'Strict',
317
+ secure: secure
292
318
  });
293
319
  if (!cookie_written) {
294
- logger.error('failed to write cookie: ' + cookie_names.user_consent);
320
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_consent);
295
321
  }
296
322
  } else {
297
323
  cookie_written = j1.writeCookie({
298
324
  name: cookie_names.user_state,
299
325
  data: user_state,
300
326
  samesite: 'Strict',
327
+ secure: secure,
301
328
  expires: 365
302
329
  });
303
330
  if (!cookie_written) {
304
- logger.error('failed to write cookie: ' + cookie_names.user_state);
331
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_state);
305
332
  }
306
333
  }
307
334
  } else {
308
335
  // jadams, 2021-07-11: on beforeunload, a vaild state cookie
309
336
  // is expected
310
- logger.fatal('missing cookie detected: ' + cookie_names.user_state);
337
+ logger.fatal('\n' + 'missing cookie detected: ' + cookie_names.user_state);
311
338
  }
312
339
  }); // END beforeunload
313
340
 
@@ -323,10 +350,11 @@ var j1 = (function () {
323
350
  : cookie_written = j1.writeCookie({
324
351
  name: cookie_names.user_session,
325
352
  data: user_session,
326
- samesite: 'Strict'
353
+ samesite: 'Strict',
354
+ secure: secure
327
355
  });
328
356
  if (!cookie_written) {
329
- logger.error('failed to write cookie: ' + cookie_names.user_session);
357
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
330
358
  }
331
359
 
332
360
  user_state = j1.existsCookie(cookie_names.user_state)
@@ -335,10 +363,11 @@ var j1 = (function () {
335
363
  name: cookie_names.user_state,
336
364
  data: user_state,
337
365
  samesite: 'Strict',
366
+ secure: secure,
338
367
  expires: 365
339
368
  });
340
369
  if (!cookie_written) {
341
- logger.error('failed to write cookie: ' + cookie_names.user_state);
370
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_state);
342
371
  }
343
372
 
344
373
  // jadams, 2021-07-11: Found situation that user_state NOT initialized
@@ -346,7 +375,7 @@ var j1 = (function () {
346
375
  // TODO: Check if/why user state (cookie NOT created?) NOT initialized
347
376
  // for what reason.
348
377
  if (!user_state) {
349
- logger.error('cookie not found: ' + cookie_names.user_state);
378
+ logger.error('\n' + 'cookie not found: ' + cookie_names.user_state);
350
379
  user_state = j1.readCookie(cookie_names.user_state);
351
380
  user_state.session_active = true;
352
381
  }
@@ -356,20 +385,22 @@ var j1 = (function () {
356
385
  cookie_written = j1.writeCookie({
357
386
  name: cookie_names.user_state,
358
387
  data: user_state,
359
- samesite: 'Strict'
388
+ samesite: 'Strict',
389
+ secure: secure
360
390
  });
361
391
  if (!cookie_written) {
362
- logger.error('failed to write cookie: ' + cookie_names.user_state);
392
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_state);
363
393
  }
364
394
  } else {
365
395
  cookie_written = j1.writeCookie({
366
396
  name: cookie_names.user_state,
367
397
  data: user_state,
368
398
  samesite: 'Strict',
399
+ secure: secure,
369
400
  expires: 365
370
401
  });
371
402
  if (!cookie_written) {
372
- logger.error('failed to write cookie: ' + cookie_names.user_state);
403
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_state);
373
404
  }
374
405
  }
375
406
 
@@ -393,40 +424,41 @@ var j1 = (function () {
393
424
  user_session.requested_page = window.location.pathname;
394
425
  user_session.timestamp = timestamp_now;
395
426
  user_session = j1.mergeData(user_session, data);
396
- logText = 'mode detected: ' + user_session.mode;
427
+ logText = '\n' + 'mode detected: ' + user_session.mode;
397
428
 
398
429
  logger.info(logText);
399
- logger.info('update user session cookie');
430
+ logger.info('\n' + 'update user session cookie');
400
431
  cookie_written = j1.writeCookie({
401
432
  name: cookie_names.user_session,
402
433
  data: user_session,
403
- samesite: 'Strict'
434
+ samesite: 'Strict',
435
+ secure: secure
404
436
  });
405
437
 
406
438
  if (!cookie_written) {
407
- logger.error('failed to write cookie: ' + cookie_names.user_session);
439
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
408
440
  }
409
441
 
410
442
  j1.setState(curr_state);
411
- logger.info('state: ' + j1.getState());
443
+ logger.info('\n' + 'state: ' + j1.getState());
412
444
 
413
445
  var dependencies_met_page_displayed = setInterval (function () {
414
446
  if (j1.getState() == 'finished') {
415
447
  if (j1.authEnabled()) {
416
448
  if (user_session.authenticated === 'true') {
417
449
  // set signout
418
- logger.info('show signout icon');
450
+ logger.info('\n' + 'show signout icon');
419
451
  $('#navLinkSignInOut').attr('data-target','#modalOmniSignOut');
420
452
  $('#iconSignInOut').removeClass('mdi-login').addClass('mdi-logout');
421
453
  } else {
422
454
  // set signin
423
- logger.info('show signin icon');
455
+ logger.info('\n' + 'show signin icon');
424
456
  $('#navLinkSignInOut').attr('data-target','#modalOmniSignIn');
425
457
  $('#iconSignInOut').removeClass('mdi-logout').addClass('mdi-login');
426
458
  }
427
- logger.info('authentication detected as: ' + user_session.authenticated);
459
+ logger.info('\n' + 'authentication detected as: ' + user_session.authenticated);
428
460
  $('#quickLinksSignInOutButton').css('display', 'block');
429
- logger.info('met dependencies for: j1');
461
+ logger.info('\n' + 'met dependencies for: j1');
430
462
  clearInterval(dependencies_met_page_displayed);
431
463
  }
432
464
  }
@@ -440,38 +472,39 @@ var j1 = (function () {
440
472
  user_session.mode = 'web';
441
473
  user_session.requested_page = window.location.pathname;
442
474
  user_session.timestamp = timestamp_now;
443
- logText = 'mode detected: ' + user_session.mode;
475
+ logText = '\n' + 'mode detected: ' + user_session.mode;
444
476
 
445
477
  logger.info(logText);
446
478
  cookie_written = j1.writeCookie({
447
479
  name: cookie_names.user_session,
448
480
  data: user_session,
449
- samesite: 'Strict'
481
+ samesite: 'Strict',
482
+ secure: secure
450
483
  });
451
484
  if (!cookie_written) {
452
- logger.error('failed to write cookie: ' + cookie_names.user_session);
485
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
453
486
  }
454
487
 
455
488
  j1.setState(curr_state);
456
- logger.info('state: ' + j1.getState());
489
+ logger.info('\n' + 'state: ' + j1.getState());
457
490
  }, detectTimeout);
458
491
  });
459
492
  } else { // web mode
460
493
  state = 'started';
461
- logger.info('state: ' + state);
462
- logger.info('page is being initialized');
494
+ logger.info('\n' + 'state: ' + state);
495
+ logger.info('\n' + 'page is being initialized');
463
496
  }
464
497
 
465
498
  state = 'started';
466
- logger.info('state: ' + state);
467
- logger.info('page is being initialized');
499
+ logger.info('\n' + 'state: ' + state);
500
+ logger.info('\n' + 'page is being initialized');
468
501
 
469
502
  if ( settings.scrollbar === 'false' ) {
470
503
  $('body').addClass('hide-scrollbar');
471
504
  $('html').addClass('hide-scrollbar-moz');
472
505
  }
473
506
 
474
- logger.info('read user state from cookie');
507
+ logger.info('\n' + 'read user state from cookie');
475
508
  user_session = j1.readCookie(cookie_names.user_session);
476
509
 
477
510
  // process|update user state cookie
@@ -501,15 +534,16 @@ var j1 = (function () {
501
534
  last_pager = user_session.last_pager;
502
535
  }
503
536
 
504
- logger.info('update user session cookie');
537
+ logger.info('\n' + 'update user session cookie');
505
538
  cookie_written = j1.writeCookie({
506
539
  name: cookie_names.user_session,
507
540
  data: user_session,
508
- samesite: 'Strict'
541
+ samesite: 'Strict',
542
+ secure: secure
509
543
  });
510
544
 
511
545
  if (!cookie_written) {
512
- logger.error('failed to write cookie: ' + cookie_names.user_session);
546
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
513
547
  }
514
548
 
515
549
  // NOTE: asynchronous calls should be rewitten to xhrData
@@ -519,17 +553,18 @@ var j1 = (function () {
519
553
  j1.initFooter(settings);
520
554
 
521
555
  state = 'running';
522
- logger.info('state: ' + state);
523
- logger.info(logText);
556
+ logger.info('\n' + 'state: ' + state);
557
+ // logger.info(logText);
524
558
 
525
559
  user_session.timestamp = timestamp_now;
526
560
  cookie_written = j1.writeCookie({
527
561
  name: cookie_names.user_session,
528
562
  data: user_session,
529
- samesite: 'Strict'
563
+ samesite: 'Strict',
564
+ secure: secure
530
565
  });
531
566
  if (!cookie_written) {
532
- logger.error('failed to write cookie: ' + cookie_names.user_session);
567
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
533
568
  }
534
569
 
535
570
  // -----------------------------------------------------------------------
@@ -561,20 +596,20 @@ var j1 = (function () {
561
596
  return function ( responseTxt, statusTxt, xhr ) {
562
597
  if ( statusTxt == 'success' ) {
563
598
  var logger = log4javascript.getLogger('j1.adapter.xhrData');
564
- logText = 'loading banner completed on id: ' +banner_id;
599
+ logText = '\n' + 'loading banner completed on id: ' +banner_id;
565
600
  logger.info(logText);
566
601
  j1.setXhrDataState(banner_id, statusTxt);
567
602
  j1.setXhrDomState(banner_id, statusTxt);
568
- logger.info('XHR data loaded in the DOM: ' + banner_id);
603
+ logger.info('\n' + 'XHR data loaded in the DOM: ' + banner_id);
569
604
  }
570
605
  if ( statusTxt == 'error' ) {
571
- logText = 'loading banner failed on id: ' +banner_id+ ', error: ' + xhr.status + ': ' + xhr.statusText;
606
+ logText = '\n' + 'loading banner failed on id: ' +banner_id+ ', error: ' + xhr.status + ': ' + xhr.statusText;
572
607
  logger.error(logText);
573
608
  j1.setXhrDataState(banner_id, statusTxt);
574
609
  j1.setXhrDomState(banner_id, statusTxt);
575
610
  // Set|Log status
576
611
  state = 'failed';
577
- logger.error('state: ' + state);
612
+ logger.error('\n' + 'state: ' + state);
578
613
  }
579
614
  };
580
615
  };
@@ -635,15 +670,15 @@ var j1 = (function () {
635
670
  var id = '#' + banner[i];
636
671
  var selector = $(id);
637
672
  if (selector.length) {
638
- logText = 'loading banner on id: ' +banner[i];
673
+ logText = '\n' + 'loading banner on id: ' +banner[i];
639
674
  logger.info(logText);
640
675
  var banner_data_path = '{{banner_data_path}} ' + id;
641
676
  selector.load(banner_data_path, cb_load_closure(id));
642
677
  }
643
678
  } // END for
644
679
  } else {
645
- logText = 'no banner found in site';
646
- logger.info(logText);
680
+ logText = '\n' + 'no banner found in site';
681
+ logger.warn(logText);
647
682
  return false;
648
683
  }
649
684
  return true;
@@ -672,20 +707,20 @@ var j1 = (function () {
672
707
  return function ( responseTxt, statusTxt, xhr ) {
673
708
  var logger = log4javascript.getLogger('j1.adapter.xhrData');
674
709
  if ( statusTxt == 'success' ) {
675
- logText = 'loading panel completed on id: ' +panel_id;
710
+ logText = '\n' + 'loading panel completed on id: ' +panel_id;
676
711
  logger.info(logText);
677
712
  j1.setXhrDataState(panel_id, statusTxt);
678
713
  j1.setXhrDomState(panel_id, statusTxt);
679
- logger.info('XHR data loaded in the DOM: ' + panel_id);
714
+ logger.info('\n' + 'XHR data loaded in the DOM: ' + panel_id);
680
715
  }
681
716
  if ( statusTxt == 'error' ) {
682
- logText = 'loading panel failed on id: ' +panel_id+ ', error ' + xhr.status + ': ' + xhr.statusText;
717
+ logText = '\n' + 'loading panel failed on id: ' +panel_id+ ', error ' + xhr.status + ': ' + xhr.statusText;
683
718
  logger.error(logText);
684
719
  j1.setXhrDataState(panel_id, statusTxt);
685
720
  j1.setXhrDomState(panel_id, statusTxt);
686
721
  // Set|Log status
687
722
  state = 'Error';
688
- logger.error('state: ' + state);
723
+ logger.error('\n' + 'state: ' + state);
689
724
  }
690
725
  };
691
726
  };
@@ -738,15 +773,15 @@ var j1 = (function () {
738
773
  var id = '#' + panel[i];
739
774
  var selector = $(id);
740
775
  if ( selector.length ) {
741
- logText = 'loading panel on id: ' +panel[i];
776
+ logText = '\n' + 'loading panel on id: ' +panel[i];
742
777
  logger.info(logText);
743
778
  var panel_data_path = '{{panel_data_path}} ' + id;
744
779
  selector.load(panel_data_path, cb_load_closure(id));
745
780
  }
746
781
  } // END for
747
782
  } else {
748
- logText = 'no panel found in site';
749
- logger.info(logText);
783
+ logText = '\n' + 'no panel found in site';
784
+ logger.warn(logText);
750
785
  return false;
751
786
  }
752
787
  return true;
@@ -761,31 +796,31 @@ var j1 = (function () {
761
796
  var mod = 'j1';
762
797
  var logText;
763
798
 
764
- logText = 'loading footer started';
799
+ logText = '\n' + 'loading footer started';
765
800
  logger.info(logText);
766
801
 
767
802
  var cb_load_closure = function(footer_id) {
768
803
  return function ( responseTxt, statusTxt, xhr ) {
769
804
  var logger = log4javascript.getLogger('j1.adapter.xhrData');
770
805
  if ( statusTxt == 'success' ) {
771
- logText = 'footer loaded successfully on id: ' + footer_id;
806
+ logText = '\n' + 'footer loaded successfully on id: ' + footer_id;
772
807
  logger.info(logText);
773
808
  j1.setXhrDataState(footer_id, statusTxt);
774
809
  j1.setXhrDomState(footer_id, statusTxt);
775
- logger.info('XHR data loaded in the DOM: ' + footer_id);
776
- logText = 'initialization finished';
810
+ logger.info('\n' + 'XHR data loaded in the DOM: ' + footer_id);
811
+ logText = '\n' + 'initialization finished';
777
812
  logger.info(logText);
778
813
  }
779
814
  if ( statusTxt == 'error' ) {
780
- logText = 'loading footer failed on id: ' +footer_id+ ', error ' + xhr.status + ': ' + xhr.statusText;
815
+ logText = '\n' + 'loading footer failed on id: ' +footer_id+ ', error ' + xhr.status + ': ' + xhr.statusText;
781
816
  logger.error(logText);
782
817
  j1.setXhrDataState(footer_id, statusTxt);
783
818
  j1.setXhrDomState(footer_id, statusTxt);
784
819
 
785
820
  // Set|Log status
786
821
  state = 'failed';
787
- logger.error('state: ' + state);
788
- logText = 'initialization finished';
822
+ logger.error('\n' + 'state: ' + state);
823
+ logText = '\n' + 'initialization finished';
789
824
  logger.info(logText);
790
825
  }
791
826
  };
@@ -797,7 +832,7 @@ var j1 = (function () {
797
832
  var footer_data_path = '{{footer_data_path}} ' + id;
798
833
  selector.load(footer_data_path, cb_load_closure(id));
799
834
  } else {
800
- logText = 'data not loaded';
835
+ logText = '\n' + 'data not loaded';
801
836
  logger.warn(logText);
802
837
  j1.setXhrDataState(id, 'not loaded');
803
838
  j1.setXhrDomState(id, 'pending');
@@ -821,9 +856,11 @@ var j1 = (function () {
821
856
  var flickerTimeout = {{template_config.flicker_timeout}};
822
857
  var url = new liteURL(window.location.href);
823
858
  var baseUrl = url.origin;
859
+ var secure = (url.protocol.includes('https')) ? true : false;
824
860
  var ep_status = baseUrl + '/status' + '?page=' + window.location.pathname;
825
861
  var user_session = j1.readCookie(cookie_names.user_session);
826
862
  var user_state = j1.readCookie(cookie_names.user_state);
863
+ var user_consent = j1.readCookie(cookie_names.user_consent);
827
864
  var current_url = new liteURL(window.location.href);
828
865
  var providerPermissions = {};
829
866
  var provider;
@@ -831,14 +868,36 @@ var j1 = (function () {
831
868
  var appDetected;
832
869
  var categoryAllowed;
833
870
 
834
- logger.info('finalize page');
871
+ // provider APIs require user consent
872
+ var meta_analytics = $('meta[name=analytics]').attr('content');
873
+ var analytics = (meta_analytics === 'true') ? true: false;
874
+ var meta_comments = $('meta[name=comments]').attr('content');
875
+ var comments = (meta_comments === 'true') ? true: false;
876
+ var meta_advertising = $('meta[name=advertising]').attr('content');
877
+ var advertising = (meta_advertising === 'true') ? true: false;
878
+ var meta_youtube = $('meta[name=youtube]').attr('content');
879
+ var youtube = (meta_youtube === 'true') ? true: false;
880
+ var meta_vimeo = $('meta[name=vimeo]').attr('content');
881
+ var vimeo = (meta_vimeo === 'true') ? true: false;
882
+
883
+ // personalized content require user consent
884
+ var meta_personalization = $('meta[name=personalization]').attr('content');
885
+ var personalization = (meta_personalization === 'true') ? true: false;
886
+
887
+ // if personalized content detected, page requires user consent
888
+ if (personalization && !user_consent.personalization) {
889
+ // redirect to error paged (blocked content)
890
+ window.location.href = "/444.html";
891
+ }
892
+
893
+ logger.info('\n' + 'finalize page');
835
894
  j1.setCss();
836
895
 
837
- logText= 'loading page partials: started';
896
+ logText= '\n' + 'loading page partials: started';
838
897
  logger.info(logText);
839
898
 
840
899
  if (j1.appDetected()) { // app mode
841
- logger.info('mode detected: app');
900
+ logger.info('\n' + 'mode detected: app');
842
901
 
843
902
  $.when ($.ajax(ep_status))
844
903
  .then(function(data) {
@@ -850,10 +909,11 @@ var j1 = (function () {
850
909
  cookie_written = j1.writeCookie({
851
910
  name: cookie_names.user_session,
852
911
  data: user_session,
853
- samesite: 'Strict'
912
+ samesite: 'Strict',
913
+ secure: secure
854
914
  });
855
915
  if (!cookie_written) {
856
- logger.error('failed to write cookie: ' + cookie_names.user_session);
916
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
857
917
  }
858
918
 
859
919
  providerPermissions = user_session.provider_permissions;
@@ -880,26 +940,66 @@ var j1 = (function () {
880
940
 
881
941
  // show the page delayed
882
942
  setTimeout (function() {
943
+
944
+ // Manage providers for personalization OptIn/Out (Comments|Ads)
945
+ if (!user_consent.personalization) {
946
+ logger.warn('\n' + 'disable comment provider: ' + comment_provider);
947
+ $('#leave-a-comment').remove();
948
+ if (comment_provider === 'disqus') {
949
+ $('#dsq-count-scr').remove();
950
+ $('#disqus-thread').remove();
951
+ }
952
+ if (comment_provider === 'hyvor') {
953
+ $('#hyvor-embed').remove();
954
+ $('#hyvor-talk-view').remove();
955
+ }
956
+ } else {
957
+ if (comments) {
958
+ logger.warn('\n' + 'enable comment provider: ' + comment_provider);
959
+ $('#main-content').append('<h2 id="leave-a-comment" class="mt-4">Leave a comment</h2>');
960
+ if (comment_provider === 'disqus') {
961
+ logger.info('\n' + 'load comment provider code: ' + comment_provider);
962
+ $('#main-content').append('<div id="disqus_thread"></div>');
963
+ $('body').append('<script async id="dsq-count-scr" src="//' + site_id + '.disqus.com/count.js"></script>');
964
+ j1.loadJS({
965
+ xhr_data_path: '/assets/data/' + comment_provider + '.js',
966
+ xhr_data_element: comment_provider
967
+ });
968
+ }
969
+ if (comment_provider === 'hyvor') {
970
+ $('body').append('<script> var HYVOR_TALK_WEBSITE = ' + site_id + '; var HYVOR_TALK_CONFIG = { url: false, id: false };');
971
+ $('#main-content').append('<div id="hyvor-talk-view"></div>');
972
+ $('body').append('<script async id="hyvor-embed" type="text/javascript" src="//talk.hyvor.com/web-api/embed.js"></script>');
973
+ }
974
+ } // END comments
975
+ } // END personalization
976
+
883
977
  // display page
884
- $('#no_flicker').css('display', 'block');
978
+ $('#no_flicker').css('display', 'block');
885
979
 
886
980
  // NOTE: Placed tracking warning/info here because page may reloaded
887
981
  // after cookie consent selection
888
- //
889
- if (tracking_enabled && !tracking_id_valid) {
890
- logger.error('tracking enabled, but invalid tracking id found: ' + tracking_id);
982
+ if (user_consent.analyses) {
983
+ logger.info('\n' + 'tracking allowed, privacy settings for analysis: ' + user_consent.analyses);
984
+ if (tracking_enabled && !tracking_id_valid) {
985
+ logger.error('\n' + 'tracking enabled, but invalid tracking id found: ' + tracking_id);
986
+ } else if (tracking_enabled && tracking_id_valid) {
987
+ logger.warn('\n' + 'tracking enabled, tracking id found: ' + tracking_id);
988
+ } else {
989
+ logger.warn('\n' + 'tracking disabled, tracking id found: ' + tracking_id);
990
+ }
891
991
  } else {
892
- logger.warn('tracking enabled, tracking id found: ' + tracking_id);
992
+ logger.warn('\n' + 'tracking not allowed, privacy settings for analysis: ' + user_consent.analyses);
893
993
  }
894
994
 
895
995
  // show|hide cookie icon (should MOVED to Cookiebar ???)
896
996
  if (j1.existsCookie(cookie_names.user_consent)) {
897
997
  // Display cookie icon
898
- logText = 'show cookie icon';
998
+ logText = '\n' + 'show cookie icon';
899
999
  logger.info(logText);
900
1000
  $('#quickLinksCookieButton').css('display', 'block');
901
1001
  } else {
902
- logText = 'hide cookie icon';
1002
+ logText = '\n' + 'hide cookie icon';
903
1003
  logger.info(logText);
904
1004
  // Display cookie icon
905
1005
  $('#quickLinksCookieButton').css('display', 'none');
@@ -907,8 +1007,8 @@ var j1 = (function () {
907
1007
 
908
1008
  // show|hide translator icon (currently NOT supported)
909
1009
  // if (translation_enabled) {
910
- // logger.info('translator detected: google');
911
- // logger.info('initialize language selector');
1010
+ // logger.info('\n' + 'translator detected: google');
1011
+ // logger.info('\n' + 'initialize language selector');
912
1012
  // $('.goog-te-combo').addClass('form-control');
913
1013
  // }
914
1014
 
@@ -918,16 +1018,16 @@ var j1 = (function () {
918
1018
  if (j1.authEnabled()) {
919
1019
  if (user_session.authenticated === 'true') {
920
1020
  // set signout
921
- logger.info('show signout icon');
1021
+ logger.info('\n' + 'show signout icon');
922
1022
  $('#navLinkSignInOut').attr('data-target','#modalOmniSignOut');
923
1023
  $('#iconSignInOut').removeClass('mdi-login').addClass('mdi-logout');
924
1024
  } else {
925
1025
  // set signin
926
- logger.info('show signin icon');
1026
+ logger.info('\n' + 'show signin icon');
927
1027
  $('#navLinkSignInOut').attr('data-target','#modalOmniSignIn');
928
1028
  $('#iconSignInOut').removeClass('mdi-logout').addClass('mdi-login');
929
1029
  }
930
- logger.info('authentication detected as: ' + user_session.authenticated);
1030
+ logger.info('\n' + 'authentication detected as: ' + user_session.authenticated);
931
1031
  $('#quickLinksSignInOutButton').css('display', 'block');
932
1032
  }
933
1033
 
@@ -936,25 +1036,25 @@ var j1 = (function () {
936
1036
  j1.scrollTo();
937
1037
 
938
1038
  if (user_session.previous_page !== user_session.current_page) {
939
- logText = 'page change detected';
1039
+ logText = '\n' + 'page change detected';
940
1040
  logger.info(logText);
941
- logText = 'previous page: ' + user_session.previous_page;
1041
+ logText = '\n' + 'previous page: ' + user_session.previous_page;
942
1042
  logger.info(logText);
943
- logText = 'current page: ' + user_session.current_page;
1043
+ logText = '\n' + 'current page: ' + user_session.current_page;
944
1044
  logger.info(logText);
945
1045
  }
946
1046
 
947
1047
  // update sidebar for changed theme data
948
- logger.info('update sidebar');
1048
+ logger.info('\n' + 'update sidebar');
949
1049
  user_state = j1.readCookie(cookie_names.user_state);
950
1050
  current_user_data = j1.mergeData(user_session, user_state);
951
1051
  j1.core.navigator.updateSidebar(current_user_data);
952
1052
 
953
1053
  // Set|Log status
954
1054
  state = 'finished';
955
- logText = 'state: ' + state;
1055
+ logText = '\n' + 'state: ' + state;
956
1056
  logger.info(logText);
957
- logText = 'page finalized successfully';
1057
+ logText = '\n' + 'page finalized successfully';
958
1058
  logger.info(logText);
959
1059
 
960
1060
  }, flickerTimeout);
@@ -963,39 +1063,79 @@ var j1 = (function () {
963
1063
  // show the page delayed
964
1064
  setTimeout (function() {
965
1065
  j1.setState('finished');
966
- logger.info('state: finished');
967
- logger.info('page initialization: finished');
1066
+ logger.info('\n' + 'state: finished');
1067
+ logger.info('\n' + 'page initialization: finished');
1068
+
1069
+ // Manage providers for personalization OptIn/Out (Comments|Ads)
1070
+ if (!user_consent.personalization) {
1071
+ logger.warn('\n' + 'disable comment provider: ' + comment_provider);
1072
+ $('#leave-a-comment').remove();
1073
+ if (comment_provider === 'disqus') {
1074
+ $('#dsq-count-scr').remove();
1075
+ $('#disqus-thread').remove();
1076
+ }
1077
+ if (comment_provider === 'hyvor') {
1078
+ $('#hyvor-embed').remove();
1079
+ $('#hyvor-talk-view').remove();
1080
+ }
1081
+ } else {
1082
+ if (comments) {
1083
+ logger.warn('\n' + 'enable comment provider: ' + comment_provider);
1084
+ $('#main-content').append('<h2 id="leave-a-comment" class="mt-4">Leave a comment</h2>');
1085
+ if (comment_provider === 'disqus') {
1086
+ logger.info('\n' + 'load comment provider code: ' + comment_provider);
1087
+ $('#main-content').append('<div id="disqus_thread"></div>');
1088
+ $('body').append('<script async id="dsq-count-scr" src="//' + site_id + '.disqus.com/count.js"></script>');
1089
+ j1.loadJS({
1090
+ xhr_data_path: '/assets/data/' + comment_provider + '.js',
1091
+ xhr_data_element: comment_provider
1092
+ });
1093
+ }
1094
+ if (comment_provider === 'hyvor') {
1095
+ $('body').append('<script> var HYVOR_TALK_WEBSITE = ' + site_id + '; var HYVOR_TALK_CONFIG = { url: false, id: false };');
1096
+ $('#main-content').append('<div id="hyvor-talk-view"></div>');
1097
+ $('body').append('<script async id="hyvor-embed" type="text/javascript" src="//talk.hyvor.com/web-api/embed.js"></script>');
1098
+ }
1099
+ } // END comments
1100
+ } // END personalization
968
1101
 
969
1102
  // display page
970
1103
  $('#no_flicker').css('display', 'block');
971
1104
 
972
1105
  // NOTE: Placed tracking warning/info here because page may reloaded
973
1106
  // after cookie consent selection
974
- //
975
- if (tracking_enabled && !tracking_id_valid) {
976
- logger.error('tracking enabled, but invalid tracking id found: ' + tracking_id);
1107
+ if (user_consent.analyses) {
1108
+ logger.info('\n' + 'tracking allowed, privacy settings for analysis: ' + user_consent.analyses);
1109
+ if (tracking_enabled && !tracking_id_valid) {
1110
+ logger.error('\n' + 'tracking enabled, but invalid tracking id found: ' + tracking_id);
1111
+ } else if (tracking_enabled && tracking_id_valid) {
1112
+ logger.warn('\n' + 'tracking enabled, tracking id found: ' + tracking_id);
1113
+ } else {
1114
+ logger.warn('\n' + 'tracking disabled, tracking id found: ' + tracking_id);
1115
+ }
977
1116
  } else {
978
- logger.warn('tracking enabled, tracking id found: ' + tracking_id);
1117
+ logger.warn('\n' + 'tracking not allowed, privacy settings for analysis: ' + user_consent.analyses);
979
1118
  }
980
1119
 
981
- logger.info('mode detected: web');
982
- logger.info('hide signin icon');
1120
+ logger.info('\n' + 'mode detected: web');
1121
+ logger.info('\n' + 'hide signin icon');
983
1122
  $('#quickLinksSignInOutButton').css('display', 'none');
984
1123
 
985
1124
  user_session.current_page = current_url.pathname;
986
1125
  cookie_written = j1.writeCookie({
987
1126
  name: cookie_names.user_session,
988
1127
  data: user_session,
989
- samesite: 'Strict'
1128
+ samesite: 'Strict',
1129
+ secure: secure
990
1130
  });
991
1131
  if (!cookie_written) {
992
- logger.error('failed to write cookie: ' + cookie_names.user_session);
1132
+ logger.error('\n' + 'failed to write cookie: ' + cookie_names.user_session);
993
1133
  }
994
1134
 
995
1135
  // show|hide translator icon (currently NOT supported)
996
1136
  // if (translation_enabled) {
997
- // logger.info('translator detected: google');
998
- // logger.info('initialize language selector');
1137
+ // logger.info('\n' + 'translator detected: google');
1138
+ // logger.info('\n' + 'initialize language selector');
999
1139
  // $('.goog-te-combo').addClass('form-control');
1000
1140
  // }
1001
1141
 
@@ -1005,11 +1145,11 @@ var j1 = (function () {
1005
1145
  // show|hide cookie icon
1006
1146
  if (j1.existsCookie(cookie_names.user_consent)) {
1007
1147
  // Display cookie icon
1008
- logText = 'show cookie icon';
1148
+ logText = '\n' + 'show cookie icon';
1009
1149
  logger.info(logText);
1010
1150
  $('#quickLinksCookieButton').css('display', 'block');
1011
1151
  } else {
1012
- logText = 'hide cookie icon';
1152
+ logText = '\n' + 'hide cookie icon';
1013
1153
  logger.info(logText);
1014
1154
  // Display cookie icon
1015
1155
  $('#quickLinksCookieButton').css('display', 'none');
@@ -1020,25 +1160,25 @@ var j1 = (function () {
1020
1160
  j1.scrollTo();
1021
1161
 
1022
1162
  if (user_session.previous_page !== user_session.current_page) {
1023
- logText = 'page change detected';
1163
+ logText = '\n' + 'page change detected';
1024
1164
  logger.info(logText);
1025
- logText = 'previous page: ' + user_session.previous_page;
1165
+ logText = '\n' + 'previous page: ' + user_session.previous_page;
1026
1166
  logger.info(logText);
1027
- logText = 'current page: ' + user_session.current_page;
1167
+ logText = '\n' + 'current page: ' + user_session.current_page;
1028
1168
  logger.info(logText);
1029
1169
  }
1030
1170
 
1031
1171
  // update sidebar for changed theme data
1032
- logger.info('update sidebar');
1172
+ logger.info('\n' + 'update sidebar');
1033
1173
  user_state = j1.readCookie(cookie_names.user_state);
1034
1174
  current_user_data = j1.mergeData(user_session, user_state);
1035
1175
  j1.core.navigator.updateSidebar(current_user_data);
1036
1176
 
1037
1177
  // set|log status
1038
1178
  state = 'finished';
1039
- logText = 'state: ' + state;
1179
+ logText = '\n' + 'state: ' + state;
1040
1180
  logger.info(logText);
1041
- logText = 'page finalized successfully';
1181
+ logText = '\n' + 'page finalized successfully';
1042
1182
  logger.info(logText);
1043
1183
 
1044
1184
  }, flickerTimeout);
@@ -1146,7 +1286,7 @@ var j1 = (function () {
1146
1286
  $(window).scrollTop($(window).scrollTop()-1);
1147
1287
  } // END if anchor_id
1148
1288
  } else if (anchor_id === '#') {
1149
- logger.info('bound click event to "#", suppress default action');
1289
+ logger.info('\n' + 'bound click event to "#", suppress default action');
1150
1290
  $(window).scrollTop($(window).scrollTop()+1);
1151
1291
  $(window).scrollTop($(window).scrollTop()-1);
1152
1292
  return false;
@@ -1184,12 +1324,12 @@ var j1 = (function () {
1184
1324
  }, // END appDetected
1185
1325
 
1186
1326
  // -------------------------------------------------------------------------
1187
- // xhrData()
1188
- // Load data asychronously using XHR|jQuery on an HTML element (e.g. <div>)
1327
+ // loadHTML()
1328
+ // Load HTML data asychronously using XHR|jQuery on an element (e.g. <div>)
1189
1329
  // specified by xhr_container_id, xhr_data_path (options)
1190
1330
  // -------------------------------------------------------------------------
1191
- xhrData: function (options, mod, status) {
1192
- var logger = log4javascript.getLogger('j1.adapter.xhrData');
1331
+ loadHTML: function (options, mod, status) {
1332
+ var logger = log4javascript.getLogger('j1.adapter.loadHTML');
1193
1333
  var selector = $('#' + options.xhr_container_id);
1194
1334
  var state = status;
1195
1335
  var observer_options = {
@@ -1203,12 +1343,12 @@ var j1 = (function () {
1203
1343
 
1204
1344
  var cb_load_closure = function(mod, id) {
1205
1345
  return function (responseTxt, statusTxt, xhr) {
1206
- var logger = log4javascript.getLogger('j1.adapter.xhrData');
1346
+ var logger = log4javascript.getLogger('j1.adapter.loadHTML');
1207
1347
  if ( statusTxt === 'success' ) {
1208
1348
  j1.setXhrDataState(id, statusTxt);
1209
1349
  j1.setXhrDomState(id, 'pending');
1210
1350
 
1211
- logText = 'data loaded successfully on id: ' +id;
1351
+ logText = '\n' + 'data loaded successfully on id: ' +id;
1212
1352
  logger.info(logText);
1213
1353
  state = true;
1214
1354
  }
@@ -1216,12 +1356,12 @@ var j1 = (function () {
1216
1356
  // jadams, 2020-07-21: to be checked why id could be UNDEFINED
1217
1357
  if (typeof(id) != "undefined") {
1218
1358
  state = 'failed';
1219
- logger.info('set state for ' +mod+ ' to: ' + state);
1359
+ logger.info('\n' + 'set state for ' +mod+ ' to: ' + state);
1220
1360
  // jadams, 2020-07-21: intermediate state should DISABLED
1221
1361
  // executeFunctionByName(mod + '.setState', window, state);
1222
1362
  j1.setXhrDataState(id, statusTxt);
1223
1363
  j1.setXhrDomState(id, 'pending');
1224
- logText = 'loading data failed on id: ' +id+ ', error ' + xhr.status + ': ' + xhr.statusText;
1364
+ logText = '\n' + 'loading data failed on id: ' +id+ ', error ' + xhr.status + ': ' + xhr.statusText;
1225
1365
  logger.error(logText);
1226
1366
  state = false;
1227
1367
  }
@@ -1242,9 +1382,9 @@ var j1 = (function () {
1242
1382
 
1243
1383
  // failsafe - prevent XHR load errors
1244
1384
  if (options.xhr_data_element !== '') {
1245
- logger.info('XHR data element found: ' + options.xhr_data_element);
1385
+ logger.info('\n' + 'XHR data element found: ' + options.xhr_data_element);
1246
1386
  } else {
1247
- logger.warn('no XHR data element found, loading data aborted');
1387
+ logger.warn('\n' + 'no XHR data element found, loading data aborted');
1248
1388
  return;
1249
1389
  }
1250
1390
 
@@ -1266,30 +1406,68 @@ var j1 = (function () {
1266
1406
  function mutationHandler (mutationRecords) {
1267
1407
  mutationRecords.forEach ( function (mutation) {
1268
1408
  if (mutation.addedNodes.length) {
1269
- logger.info('XHR data loaded in the DOM: ' + id);
1409
+ logger.info('\n' + 'XHR data loaded in the DOM: ' + id);
1270
1410
  j1.setXhrDomState(id, 'success');
1271
1411
  }
1272
1412
  });
1273
1413
  }
1274
1414
  } else {
1275
1415
  // jadams, 2020-07-21: To be clarified why a id is "undefined"
1276
-
1277
1416
  // failsafe - prevent XHR load errors
1278
1417
  if (id != '#undefined') {
1279
- logText = 'data not loaded on id:' + id;
1418
+ logText = '\n' + 'data not loaded on id:' + id;
1280
1419
  logger.warn(logText);
1281
1420
  j1.setXhrDataState(id, 'not loaded');
1282
1421
  j1.setXhrDomState(id, 'not loaded');
1283
1422
  // Set processing state to 'finished' to complete module load
1284
1423
  state = 'finished';
1285
- logger.info('state: ' + state);
1424
+ logger.info('\n' + 'state: ' + state);
1286
1425
  // jadams, 2020-07-21: intermediate state should DISABLED
1287
1426
  // executeFunctionByName(mod + '.setState', window, state);
1288
1427
  state = false;
1289
1428
  }
1290
1429
  }
1291
1430
  return state;
1292
- }, // END xhrData
1431
+ }, // END loadHTML
1432
+
1433
+ // -------------------------------------------------------------------------
1434
+ // loadJS()
1435
+ // Load JS data asychronously using jQuery (XHR)
1436
+ // -------------------------------------------------------------------------
1437
+ loadJS: function (options, mod, status) {
1438
+ var logger = log4javascript.getLogger('j1.adapter.loadJS');
1439
+ var state = status;
1440
+ var logText;
1441
+
1442
+ var cb_load_closure = function(mod, id) {
1443
+ return function (responseTxt, statusTxt, xhr) {
1444
+ var logger = log4javascript.getLogger('j1.adapter.loadJS');
1445
+ if ( statusTxt === 'success' ) {
1446
+ j1.setXhrDataState(id, statusTxt);
1447
+
1448
+ logText = '\n' + 'data loaded successfully for: ' +id;
1449
+ logger.info(logText);
1450
+ state = true;
1451
+ }
1452
+ if ( statusTxt === 'error' ) {
1453
+ state = 'failed';
1454
+ logger.info('\n' + 'set state for ' +mod+ ' to: ' + state);
1455
+ j1.setXhrDataState(id, statusTxt);
1456
+ logText = '\n' + 'loading data failed for: ' +id+ ', error ' + xhr.status + ': ' + xhr.statusText;
1457
+ logger.error(logText);
1458
+ state = false;
1459
+ }
1460
+ };
1461
+ };
1462
+
1463
+ $.ajax({
1464
+ url: options.xhr_data_path,
1465
+ dataType: 'script',
1466
+ success: cb_load_closure(mod, options.xhr_data_element)
1467
+ });
1468
+
1469
+ return state;
1470
+ }, // END loadJS
1293
1471
 
1294
1472
  // -------------------------------------------------------------------------
1295
1473
  // readCookie (Vanilla JS)
@@ -1339,67 +1517,6 @@ var j1 = (function () {
1339
1517
  // must now also specify the Secure attribute (they require a secure
1340
1518
  // context/HTTPS).
1341
1519
  // -------------------------------------------------------------------------
1342
- //
1343
- // writeCookie: function (options /*name, data, [path, expires, samesite, http_only, secure]*/) {
1344
- // var defaults = {
1345
- // data: {},
1346
- // name: '',
1347
- // path: '/',
1348
- // expires: 0,
1349
- // samesite: 'Lax',
1350
- // http_only: false,
1351
- // secure: false
1352
- // };
1353
- // var settings = $.extend(defaults, options);
1354
- // var date = new Date();
1355
- // var timestamp_now = date.toISOString();
1356
- // var cookie_data = {};
1357
- // var data_json;
1358
- // var data_encoded;
1359
- //
1360
- // if (j1.existsCookie(settings.name)) {
1361
- // cookie_data = j1.readCookie(settings.name);
1362
- // cookie_data.timestamp = timestamp_now;
1363
- // cookie_data = j1.mergeData(cookie_data, settings.data);
1364
- // data_json = JSON.stringify( cookie_data );
1365
- // data_encoded = window.btoa(data_json);
1366
- //
1367
- // if (settings.expires > 0) {
1368
- // Cookies.set(settings.name, data_encoded, {
1369
- // expires: settings.expires,
1370
- // SameSite: settings.samesite
1371
- // });
1372
- // } else {
1373
- // Cookies.set(settings.name, data_encoded, {
1374
- // SameSite: settings.samesite
1375
- // });
1376
- // }
1377
- // } else {
1378
- // cookie_data = settings.data;
1379
- // data_json = JSON.stringify(settings.data);
1380
- // data_encoded = window.btoa(data_json);
1381
- //
1382
- // if (settings.expires > 0) {
1383
- // Cookies.set(settings.name, data_encoded, {
1384
- // expires: settings.expires,
1385
- // SameSite: settings.samesite
1386
- // });
1387
- // } else {
1388
- // Cookies.set(settings.name, data_encoded, {
1389
- // SameSite: settings.samesite
1390
- // });
1391
- // }
1392
- // }
1393
- //
1394
- // if (j1.existsCookie(settings.name)) {
1395
- // return cookie_data;
1396
- // } else {
1397
- // return false;
1398
- // }
1399
- //
1400
- // }, // END writeCookie
1401
-
1402
-
1403
1520
  writeCookie: function (options /*name, data, [path, expires, samesite, http_only, secure]*/) {
1404
1521
  var defaults = {
1405
1522
  data: {},
@@ -1482,21 +1599,17 @@ var j1 = (function () {
1482
1599
  // -------------------------------------------------------------------------
1483
1600
  // removeCookie (Vanilla JS)
1484
1601
  // -------------------------------------------------------------------------
1485
- // removeCookie: function (options /*name [, path]*/) {
1486
- // var cookieExists;
1487
- // var defaults = {
1488
- // name: '',
1489
- // path: '/'
1490
- // };
1491
- // var settings = $.extend(defaults, options);
1492
- //
1493
- // Cookies.remove(settings.name, { path: settings.path });
1494
- //
1495
- // }, // END removeCookie
1496
- removeCookie: function (name) {
1497
- if (j1.findCookie(name)) {
1498
- // clear cookie content and set expiry date in the past
1499
- document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
1602
+ removeCookie: function (options /*name, [path, domain]*/) {
1603
+ var cookieExists;
1604
+ var defaults = {
1605
+ domain: 'localhost',
1606
+ path: '/'
1607
+ };
1608
+ var settings = $.extend(defaults, options);
1609
+
1610
+ if (j1.findCookie(settings.name)) {
1611
+ // clear cookie CONTENT and set expiry date in the PAST
1612
+ document.cookie = settings.name + '=; domain=' + settings.domain + '; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
1500
1613
  return true;
1501
1614
  } else {
1502
1615
  return false;
@@ -1666,11 +1779,11 @@ var j1 = (function () {
1666
1779
  });
1667
1780
 
1668
1781
  });
1669
- logger.info('met dependencies for: sidebarLoaded');
1782
+ logger.info('\n' + 'met dependencies for: sidebarLoaded');
1670
1783
  clearInterval(sidebarLoaded);
1671
1784
  return true;
1672
1785
  } else {
1673
- logger.error('no user data provided');
1786
+ logger.error('\n' + 'no user data provided');
1674
1787
  clearInterval(sidebarLoaded);
1675
1788
  return false;
1676
1789
  }
@@ -1724,11 +1837,11 @@ var j1 = (function () {
1724
1837
  });
1725
1838
 
1726
1839
  });
1727
- logger.info('met dependencies for: sidebarLoaded');
1840
+ logger.info('\n' + 'met dependencies for: sidebarLoaded');
1728
1841
  clearInterval(sidebarLoaded);
1729
1842
  return true;
1730
1843
  } else {
1731
- logger.error('no user data provided');
1844
+ logger.error('\n' + 'no user data provided');
1732
1845
  clearInterval(sidebarLoaded);
1733
1846
  return false;
1734
1847
  }
@@ -1767,11 +1880,11 @@ var j1 = (function () {
1767
1880
  var json_message = JSON.stringify(message);
1768
1881
 
1769
1882
  if ( receiver === 'j1' ) {
1770
- logText = 'send message from ' + sender + ' to' + receiver + ': ' + json_message;
1883
+ logText = '\n' + 'send message from ' + sender + ' to' + receiver + ': ' + json_message;
1771
1884
  logger.debug(logText);
1772
1885
  executeFunctionByName('j1' + '.messageHandler', window, sender, message);
1773
1886
  } else {
1774
- logText = 'send message from ' + sender + ' to ' + receiver + ': ' + json_message;
1887
+ logText = '\n' + 'send message from ' + sender + ' to ' + receiver + ': ' + json_message;
1775
1888
  logger.debug(logText);
1776
1889
  //executeFunctionByName('j1.' + receiver + '.messageHandler', window, sender, message)
1777
1890
  executeFunctionByName(receiver + '.messageHandler', window, sender, message);
@@ -1787,7 +1900,7 @@ var j1 = (function () {
1787
1900
  // var json_message = JSON.stringify(message, undefined, 2); // multiline
1788
1901
  var json_message = JSON.stringify(message);
1789
1902
 
1790
- logText = 'received message from ' + sender + ': ' + json_message;
1903
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
1791
1904
  logger.debug(logText);
1792
1905
 
1793
1906
  // -----------------------------------------------------------------------
@@ -1795,7 +1908,7 @@ var j1 = (function () {
1795
1908
  // -----------------------------------------------------------------------
1796
1909
  if ( message.type === 'command' && message.action === 'module_initialized' ) {
1797
1910
  _this.setState('finished');
1798
- logger.info(message.text);
1911
+ logger.info('\n' + message.text);
1799
1912
  }
1800
1913
 
1801
1914
  //
@@ -1858,7 +1971,7 @@ var j1 = (function () {
1858
1971
  var bg_primary = j1.getStyleValue('bg-primary', 'background-color');
1859
1972
  var bg_secondary = j1.getStyleValue('bg-secondary', 'background-color');
1860
1973
 
1861
- logger.info('set color scheme for selected theme');
1974
+ logger.info('\n' + 'set color scheme for selected theme');
1862
1975
 
1863
1976
  // globals
1864
1977
  // -----------------------------------------------------------------------