/** * redbasic theme specific JavaScript */ let redbasic_dark_mode = localStorage.getItem('redbasic_dark_mode'); let redbasic_theme_color = localStorage.getItem('redbasic_theme_color'); if (redbasic_dark_mode == 1) { $('html').attr('data-bs-theme', 'dark'); } if (redbasic_dark_mode == 0) { $('html').attr('data-bs-theme', 'light'); } if (redbasic_theme_color) { $('meta[name=theme-color]').attr('content', redbasic_theme_color); } $(document).ready(function() { // provide a fake progress bar for pwa standalone mode if (window.matchMedia('(display-mode: standalone)').matches) { $(window).on('beforeunload', function(){ if ($('.page-loader').length) { return; } $('
').prependTo('body'); }); } if (redbasic_dark_mode == 1) { $('#theme-switch-icon').removeClass('bi-moon').addClass('bi-sun'); $('[data-bs-theme="light"]').attr('data-bs-theme', 'dark'); } if (redbasic_dark_mode == 0) { $('#theme-switch-icon').removeClass('bi-sun').addClass('bi-moon'); $('[data-bs-theme="dark"]:not(nav)').attr('data-bs-theme', 'light'); } if (redbasic_theme_color != $('nav').css('background-color')) { $('meta[name=theme-color]').attr('content', $('nav').css('background-color')); localStorage.setItem('redbasic_theme_color', $('nav').css('background-color')); } // CSS3 calc() fallback (for unsupported browsers) $('body').append(''); if( $('#css3-calc').width() == 10) { $(window).resize(function() { if($(window).width() < 992) { $('main').css('width', $(window).width() + $('aside').outerWidth() ); } else { $('main').css('width', '100%'); } }); } $('#css3-calc').remove(); // Remove the test element if($(window).width() < 1200) { $("#right_aside_wrapper").children().detach().appendTo('#left_aside_wrapper'); $('#notifications_wrapper').addClass('d-none'); } if (document.querySelector('#region_1')) { stickyScroll('.aside_spacer_left', '.aside_spacer_top_left', 'section', parseFloat(document.querySelector('main').getBoundingClientRect().top), 20); } if (document.querySelector('#region_3')) { stickyScroll('.aside_spacer_right', '.aside_spacer_top_right', 'section', parseFloat(document.querySelector('main').getBoundingClientRect().top), 20); } $('.usermenu').click(function() { if($('#navbar-collapse-1, #navbar-collapse-2').hasClass('show')){ $('#navbar-collapse-1, #navbar-collapse-2').removeClass('show'); } }); $('#theme-switch').click(function() { if ($('html').attr('data-bs-theme') === 'dark') { if ($('nav').data('bs-theme') === 'dark') { $('[data-bs-theme="dark"]:not(nav)').attr('data-bs-theme', 'light'); } else { $('[data-bs-theme="dark"]').attr('data-bs-theme', 'light'); } localStorage.setItem('redbasic_dark_mode', 0); $('#theme-switch-icon').removeClass('bi-sun').addClass('bi-moon'); } else { $('[data-bs-theme="light"]').attr('data-bs-theme', 'dark'); localStorage.setItem('redbasic_dark_mode', 1); $('#theme-switch-icon').removeClass('bi-moon').addClass('bi-sun'); } $('meta[name=theme-color]').attr('content', $('nav').css('background-color')); localStorage.setItem('redbasic_theme_color', $('nav').css('background-color')); }); $('#menu-btn').click(function() { if($('#navbar-collapse-1').hasClass('show')){ $('#navbar-collapse-1').removeClass('show'); } }); $('.notifications-btn').click(function(e) { e.preventDefault(); e.stopPropagation(); if($('#navbar-collapse-2').hasClass('show')){ $('#navbar-collapse-2').removeClass('show'); } }); $("input[data-role=cat-tagsinput]").tagsinput({ tagClass: 'badge rounded-pill bg-warning text-dark' }); $('a.disabled').click(function(e) { e.preventDefault(); e.stopPropagation(); }); var doctitle = document.title; function checkNotify() { var notifyUpdateElem = document.getElementById('notify-update'); if(notifyUpdateElem !== null) { if(notifyUpdateElem.innerHTML !== "") document.title = "(" + notifyUpdateElem.innerHTML + ") " + doctitle; else document.title = doctitle; } } setInterval(function () {checkNotify();}, 10 * 1000); var touch_start = null; var touch_max = window.innerWidth / 10; window.addEventListener('touchstart', function(e) { if (e.touches.length === 1){ //just one finger touched touch_start = e.touches.item(0).clientX; if (touch_start < touch_max) { $('body').css('overflow-y', 'hidden'); } } else { //a second finger hit the screen, abort the touch touch_start = null; } }); window.addEventListener('touchend', function(e) { $('body').css('overflow-y', ''); let touch_offset = 30; //at least 30px are a swipe if (touch_start) { //the only finger that hit the screen left it let touch_end = e.changedTouches.item(0).clientX; if (touch_end > (touch_start + touch_offset)) { //a left -> right swipe if (touch_start < touch_max) { toggleAside(); } } if (touch_end < (touch_start - touch_offset)) { //a right -> left swipe } } }); }); function setStyle(element, cssProperty) { for (var property in cssProperty){ element.style[property] = cssProperty[property]; } } function stickyScroll(sticky, stickyTop, container, topOffset, bottomOffset) { var lastScrollTop = 0; var sticky = document.querySelector(sticky); if (!sticky) { return; } var stickyHeight = sticky.getBoundingClientRect().height; var stickyTop = document.querySelector(stickyTop); var content = document.querySelector(container); var diff = window.innerHeight - stickyHeight; var h = 0; var lasth = 0; var st = window.pageYOffset || document.documentElement.scrollTop; var resizeObserver = new ResizeObserver(function(entries) { stickyHeight = sticky.getBoundingClientRect().height; st = window.pageYOffset || document.documentElement.scrollTop; diff = window.innerHeight - stickyHeight; }); resizeObserver.observe(sticky); resizeObserver.observe(content); window.addEventListener('scroll', function() { if(window.innerHeight > stickyHeight + topOffset) { setStyle(stickyTop, { height: 0 + 'px' }); setStyle(sticky, { position: 'sticky', top: topOffset + 'px'}); } else { st = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426" if (st > lastScrollTop){ // downscroll code setStyle(stickyTop, { height: lasth + 'px' }); setStyle(sticky, { position: 'sticky', top: Math.round(diff) - bottomOffset + 'px', bottom: '' }); } else { // upscroll code h = sticky.getBoundingClientRect().top - content.getBoundingClientRect().top; if(Math.round(stickyTop.getBoundingClientRect().height) === lasth) { setStyle(stickyTop, { height: Math.round(h) + 'px' }); } lasth = Math.round(h); setStyle(sticky, { position: 'sticky', top: '', bottom: Math.round(diff) - topOffset + 'px' }); } lastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling } }, false); } function makeFullScreen(full) { if(typeof full=='undefined' || full == true) { $('main').addClass('fullscreen'); $('header, nav, aside, #fullscreen-btn').attr('style','display:none !important'); $('#inline-btn').show(); } else { $('main').removeClass('fullscreen'); $('header, nav, aside, #fullscreen-btn').show(); $('#inline-btn').hide(); } }