Showing source for: https://static.twizzit.com/v2/login
Duration: 0.213396s
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Twizzit</title>
<link rel="stylesheet" href="/v2/css/bootstrap-twizzit.css">
<link rel="stylesheet" href="/v2/css/ekko-lightbox.css">
<link rel="stylesheet" href="/v2/css/fontawesome/css/all.min.css?20220321">
<link rel="stylesheet" href="/v2/css/customScrollbar/customScrollbar.min.css">
<link rel="stylesheet" href="/v2/css/select2/select2.min.css">
<link rel="stylesheet" href="/v2/css/select2/select2-bootstrap4.css?20230126">
<link rel="stylesheet" type="text/css" href="/v2/css/slick/slick.min.css">
<link rel="stylesheet" href="/v2/css/swiper.min.css">
<script src="/v2/js/jquery-3.3.1.min.js" ></script>
<link rel="stylesheet" href="/v2/css/flatpickr.min.css">
<style>
.debug {
border: 3px solid magenta;
}
.flatpickr-calendar .flatpickr-clear, .flatpickr-calendar .flatpickr-today {
padding: .5rem;
background-color: #f3f3f3 ;
cursor: pointer;
}
.flatpickr-calendar .flatpickr-clear:hover, .flatpickr-calendar .flatpickr-today:hover {
padding: .5rem;
background-color: #e2e2e2 ;
cursor: pointer;
}
@supports (-webkit-touch-callout: none) {
/* only ios */
@media (min-height: 750px) {
.tw-module-header-primary, .tw-element-header-primary {
padding-top: 30px!important;
}
}
}
</style>
<link rel="stylesheet" href="/v2/css/twizzit-theme.css?20231102">
<link rel="stylesheet" href="/v2/css/sortable-theme-bootstrap.css?2911">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-PPXQSXJP9Q"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-PPXQSXJP9Q');
</script>
<style>
#main-wrapper{
overflow:auto;
}
.club-result-wrapper{
overflow:auto;
}
#login-wrapper, #recover-user-results-wrapper{
height:690px;
}
.club-image-wrapper {
position: relative;
margin: 1rem auto;
width: 8rem;
height: 8rem;
}
.list-button {
background-color: rgba(233, 239, 240, 0.5);
margin-bottom: .5rem;
border-radius: 6px;
text-align: left;
font-weight: bold;
text-decoration: none;
color: #022e3e;
cursor: pointer;
}
.list-button:hover {
background-color: rgba(233, 239, 240, 0.65);
}
.image-wrapper {
position: relative;
width: 100px;
height: 100px;
margin-left:auto;
margin-right:auto;
}
.club-image-wrapper {
position: relative;
margin: 1rem auto;
width: 8rem;
height: 8rem;
}
.login-header{
margin-top:0px;
margin-bottom: 30px;
}
/*
.twizzit-logo-header {
background-image: url('/v2/images/twizzit/logo-new-landscape.png');
background-position: center;
background-repeat: no-repeat;
background-size: contain;
height: 200px;
}
.twizzit-logo-header-mobile {
background-image: url('/v2/images/twizzit/logo-new.png');
}
*/
.twizzit-logo-swirl {
background-image: url('/v2/images/twizzit/logo_swirl_xs.png');
background-repeat:no-repeat;
background-size:contain;
background-position: center center;
height:100px;
}
.twizzit-logo-text {
background-image: url('/v2/images/twizzit/logo_text_dark_sm.png');
background-repeat:no-repeat;
background-size:contain;
background-position: top center;
height:40px;
margin-top:10px;
}
.user-greeting{
margin-top:10px;
}
.user-image {
background-image: url('');
background-size: cover;
background-position: center;
border-radius: 50%;
width: 100px;
height: 100px;
box-shadow: 0px 2px 10px rgba(0,0,0,0.2);
}
.club-image {
position: absolute;
right: -0.2rem;
bottom: -0.2rem;
background-size: cover;
background-repeat: no-repeat;
background-position: center;
border-radius: 50%;
width: 2rem;
height: 2rem;
}
/* .image-small {
width: 24px;
height: 24px;
border-radius: 50%;
border: 1px solid #b8b4c0;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
display: inline-block;
}*/
/*
#clear-fields {
position: absolute;
top: 1rem;
left: 2rem;
}
*/
.login-footer{
/*min-height: 60px;*/
}
@media (max-width: 992px) {
#login-wrapper, #recover-user-results-wrapper {
height: auto;
}
}
@media (max-width: 768px) {
.login-header{
margin-bottom: 0px;
}
#login-wrapper, #recover-user-results-wrapper{
height:auto;
}
.h-mobile-100 {
height: 100%;
}
.club-result-wrapper{
height:auto;
overflow:visible;
}
}
</style>
<style>
</style>
<link rel="icon" type="image/x-icon" href="/v2/favicon.ico" />
</head>
<body role="document" class="default ">
<div class="wrapper base" >
<div id="main-wrapper" class="pt-0 h-100">
<div class="module-container h-100">
<div class="container h-100" >
<div class="row justify-content-center align-items-center h-100">
<div class="col-12 col-md-8 col-lg-6 h-mobile-100 d-flex flex-column justify-content-start justify-content-md-center">
<div id="login-wrapper" class="basic-container-md-up d-flex flex-column justify-content-start ">
<div class="row">
<div class="col-12" style="height:50px;">
<div id="clear-fields" class="d-none float:left;" >
<button class="btn btn-lg btn-outline btn-circle" onclick="clearFields();"><i class="fal fa-arrow-left"></i></button>
</div>
</div>
</div>
<div class="row no-gutters login-header">
<div class="col-12 ">
<div class="twizzit-logo-swirl"></div>
<div class="image-wrapper " style="display:none;">
<div class="user-image"></div>
<div class="club-image"></div>
</div>
</div>
<div class="col-12 ">
<div class="twizzit-logo-text text-center"></div>
<div class="user-greeting text-center h-100" style="display:none;">
<div class="h-100 d-flex justify-content-center align-items-center">
<div >
<div id="welcome-club">Welcome to <span></span></div>
<h4 id="welcome-slogan" class="mb-0"><span></span></h4>
</div>
</div>
</div>
</div>
</div>
<div class="row login-body">
<div class="col-10 offset-1">
<form accept-charset="UTF-8" role="form" action="/v2/login" method="post">
<input type="hidden" name="mobileDeviceType" value="">
<input type="hidden" name="mobileDeviceId" value="">
<input type="hidden" name="token" value="d979ef869334136224c64be43104cdff38a0876b14deffc920430784f5052ecc">
<fieldset id="login-field-set">
<div class="form-group mt-4 mt-lg-0">
<div class="input-group">
<div class="input-group ">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-user"></i></span>
</div>
<input type="text" class="form-control" placeholder="Username" name="username" aria-describedby="sizing-addon1" autofocus>
</div>
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group ">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-lock"></i></span>
</div>
<input type="password" class="form-control" placeholder="Password" name="password" autocomplete="current-password" aria-describedby="sizing-addon1" autofocus>
</div>
</div>
</div>
<div class="form-group d-none" id="auth-code">
<input type="text" name="authCode" id="inputAuthCode" class="form-control" placeholder="Auth code" autocomplete="false">
</div>
<button class="btn btn-lg btn-primary btn-block btn-feedback" type="submit" >Login</button>
<div class="text-center px-3 pt-2 text-muted" >By signing in, I agree to the Twizzit's <a target='_blank' href='https://twizzit.com/v2/knowledgebase/conditions-generales/privacy-policy/privacy-policy'>Privacy policy</a> and <a target='_blank' href='https://twizzit.com/v2/knowledgebase/conditions-generales/conditions-utilisation/conditions-utilisation'>Terms of Use</a>.</div>
</fieldset>
</form>
</div>
</div>
<div class="row login-footer flex-shrink-0 flex-grow-1">
<div class="col-10 offset-1">
<div id="unknown-user-fields">
<div class="my-2 my-lg-4 text-center">
<a href="/v2/register" class="font-weight-bold btn-feedback" >Forgot username or password?</a>
</div>
<div class="mt-2 text-center text-muted">
<span>Don't have a username?</span>
</div>
<div class="text-center">
<a href="/v2/register" class="font-weight-bold btn-feedback" >Register here</a>
</div>
</div>
<div id="known-user-fields" class="d-none">
<div class="text-center mt-4">
<a href="#" id="forgot-password-link" class="font-weight-bold btn-feedback" >Forgot password?</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
let browserLanguages = getBrowserLanguage();
if (browserLanguages.length > 0) {
let firstLanguage = browserLanguages[0].slice(0, 2);
console.log(firstLanguage);
if (['nl', 'fr'].includes(firstLanguage) && firstLanguage !== 'en') {
window.location = '?locale=' + firstLanguage;
}
}
});
function getBrowserLanguage() {
let browserLanguages = [];
if (navigator.languages) {
browserLanguages = navigator.languages;
}
if (0 === browserLanguages.length && (navigator.language || navigator.userLanguage)) {
browserLanguages.push(navigator.language || navigator.userLanguage);
}
if (0 === browserLanguages.length && (navigator.browserLanguage || navigator.systemLanguage)) {
browserLanguages.push(navigator.browserLanguage || navigator.systemLanguage);
}
return browserLanguages.join('|').toLowerCase().split('|');
}
$('form input[name="username"]').blur(function(event){
if (! $(this).val().length) {
return;
}
if(event.relatedTarget && event.relatedTarget.type == "submit"){
return false;
}
$.ajax({
url: '/v2/ajax/login/info',
method: 'POST',
data: {
username: $(this).val(),
},
success: function (response) {
if (response.hasOwnProperty('forgotPasswordLink')) {
$('#forgot-password-link').attr('href', response.forgotPasswordLink);
}
if (response.hasOwnProperty('auth') && response.auth === 1) {
$('#auth-code').removeClass('d-none');
} else {
$('#auth-code').addClass('d-none');
}
},
error: function () {
fbs.pushError("Failed to save data");
}
});
});
function showFields() {
$('.twizzit-logo-swirl').hide();
$('.twizzit-logo-text').hide();
$('.image-wrapper').fadeIn(500);
$('.user-greeting').show();
$('.image-wrapper').fadeIn();
$('.user-greeting').fadeIn();
$('#unknown-user-fields').addClass('d-none');
$('#known-user-fields').removeClass('d-none');
$('#clear-fields').removeClass('d-none');
}
function hideFields() {
$('.twizzit-logo-swirl').show();
$('.twizzit-logo-text').show();
$('.image-wrapper').hide();
$('.user-greeting').hide();
$('#known-user-fields').addClass('d-none');
$('#unknown-user-fields').removeClass('d-none');
$('#clear-fields').addClass('d-none');
}
function clearFields() {
$('[name="username"], [name="password"]').val('');
hideFields();
}
</script>
</div>
<div id="main-modal-container" style="display:none;"></div>
</div>
<style>
.splash-loader {
display: none;
z-index: 9999;
}
@media(max-width: 992px) {
.splash-loader {
background: rgba(21, 53, 68, 0.1);
}
.splash-loader .tw-full-screen-lg-down {
background: transparent;
}
.splash-loader.visible {
display: block;
position: fixed;
top: 0px;
bottom: 0px;
left: 0px;
width: 100%;
z-index: 99999;
background: #f9f9f9;
}
.splash-loader .tw-spinner-lg {
position: absolute;
top: 40%;
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
}
.gray-splash {
background-color:#f4f7f7;
}
body.expanded .splash-loader .tw-element-body .fa-circle-notch{
color:white;
}
}
</style>
<div class="splash-loader tw-full-screen-lg-down d-lg-none">
<div class="d-flex flex-column h-100">
<div class="tw-element-header-primary d-flex flex-column justify-content-center align-items-stretch">
<div class="row no-gutter">
<div class="col-3"></div>
<div class="col-6 d-flex flex-column align-items-center"></div>
<div class="col-3"></div>
</div>
</div>
<div class="tw-element-body d-flex justify-content-center h-100 align-items-center">
<i class="fal fa-circle-notch fa-spin fa-4x"></i>
</div>
</div>
</div>
<script type="text/javascript">
$(document).on('click', '.btn-feedback', function () {
showLoader();
});
function showLoader() {
$('.splash-loader').addClass('show');
setTimeout(function() {
$('.splash-loader').removeClass('show');
}, 7000);
}
function hideLoader() {
$('.splash-loader').removeClass('show');
}
</script>
<div id="activity-details-modal"></div>
<script type="text/javascript" src="/v2/js/bootstrap.bundle.min.js"></script>
<script type="text/javascript" src="/v2/js/ekko-lightbox.js" defer></script>
<script type="text/javascript" src="/v2/js/table-sortable.js"></script>
<script async type="text/javascript">$.fn.modal.Constructor.prototype._enforceFocus = function() {};</script>
<script type="text/javascript" src="/v2/js/feedbackStack.js?20230303" defer></script>
<script type="text/javascript" src="/v2/js/jquery.mCustomScrollbar.min.js"></script>
<script type="text/javascript" src="/v2/js/jquery.inputmask.bundle.min.js"></script>
<script type="text/javascript" src="/v2/js/flatpickr.js"></script>
<script type="text/javascript" src="/v2/js/bs-custom-file-input.min.js"></script>
<script type="text/javascript" src="/v2/js/isMobile.min.js"></script>
<script type="text/javascript" src="/v2/js/formEmpty.js"></script>
<script type="text/javascript" src="/v2/js/historyManager.js?1"></script>
<script type="text/javascript" src="/v2/js/Datepicker.js?20240305"></script>
<script type="text/javascript" src="/v2/js/utils.js?45148424"></script>
<script type="text/javascript" src="/v2/js/select2_modified.js?1711"></script>
<script> $.fn.select2.defaults.set("theme", "bootstrap4"); </script>
<script type="text/javascript" src="/v2/js/twizzit.js"></script>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/[email protected]/slick/slick.min.js"></script>
<script type="text/javascript" src="/v2/js/polyfills/object_assign.js"></script>
<script type="text/javascript" src="/v2/js/polyfills/custom_event.js"></script>
<script type="text/javascript" src="/v2/js/classes/ConfigurableObject.js?2"></script>
<script type="text/javascript" src="/v2/js/classes/Modal.js?5"></script>
<script type="text/javascript" src="/v2/js/classes/SidePanel.js?4"></script>
<script type="text/javascript" src="/v2/js/classes/ModalCollection.js?2"></script>
<script type="text/javascript" src="/v2/js/classes/SidePanelCollection.js?2"></script>
<script type="text/javascript" src="/v2/js/classes/Loqate.js"></script>
<script type="text/javascript">
var spinner = '<div style="text-align: center;"><i class="fal fa-circle-notch fa-2x fa-spin m-2"></i></div>';
var spinnerLarge = '<div style="text-align: center;"><i class="fal fa-circle-notch fa-4x fa-spin m-4"></i></div>';
function isMobileBreakpoint() {
return window.matchMedia("(max-width: 992px)").matches;
}
/**
* Use this instance to create a modal.
* Example:
* modalCollection.create('link-to-resource-modal', { title: "Link resource" });
*/
const modalCollection = new ModalCollection();
const sidePanelCollection = new SidePanelCollection();
function showModalPlaceholder(selector, classes) {
const modalPlaceholder = '<div id="modal-placeholder" class="modal fade"><div class="modal-dialog ' + (classes ? classes : '') + '" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="btn tw-btn-noborder d-block d-lg-none float-left tw-full-screen-modal-back" data-dismiss="modal" aria-hidden="true"><i class="fal fa-long-arrow-left" aria-hidden="true"></i> </button><h5 class="modal-title"></h5><button type="button" class="close d-none d-lg-block" data-dismiss="modal" aria-hidden="true">×</button></div></div></div></div>';
$(selector).html(modalPlaceholder);
$('#modal-placeholder').modal('show');
}
function hideModalPlaceholder() {
$('#modal-placeholder').remove();
$('.modal-backdrop').remove();
}
var flatpickrInstances = [];
var flatpickrLocale = 'en';
var flatpickrTranslations = {
clear: "Clear",
today: "Today"
};
window.regex = {
decimal: /^[0-9.]+$/,
email: /^[a-zA-Z0-9.!#$%&'*+\:?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
date: /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/,
ISODate: /^(\d{4})\-(\d{1,2})\-(\d{1,2})$/,
votas: /[a-zA-Z0-9]{8}\-[a-zA-Z0-9]{4}\-[a-zA-Z0-9]{4}\-[a-zA-Z0-9]{4}\-[a-zA-Z0-9]{12}/,
url: /^[(http(s)?):\/\/(www\.)?a-zA-Z0-9\-@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/=]*)/,
}
document.addEventListener('scroll', function(event) {
if (!event.target.className) {
return;
}
const isScrolling = $(event.target).scrollTop() > 0;
switch (true) {
case $(event.target).hasClass('tw-element-body'):
$(event.target).prevAll('.tw-element-header-primary').toggleClass('scrolling', isScrolling);
$(event.target).prevAll('.tw-element-header-secondary').toggleClass('scrolling', isScrolling);
$(event.target).prevAll('.tw-element-header-data-list').toggleClass('scrolling', isScrolling);
break;
case $(event.target).hasClass('tw-module-body'):
$(event.target).prevAll('.tw-module-header-primary').toggleClass('scrolling', isScrolling);
$(event.target).prevAll('.tw-module-header-secondary').toggleClass('scrolling', isScrolling);
$(event.target).prevAll('.tw-module-header-data-list').toggleClass('scrolling', isScrolling);
break;
case $(event.target).hasClass('tw-module-body-page'):
{
const body = $(event.target).parents('.tw-module-body');
$(body).prevAll('.tw-module-header-primary').toggleClass('scrolling', isScrolling);
$(body).prevAll('.tw-module-header-secondary').toggleClass('scrolling', isScrolling);
$(body).prevAll('.tw-module-header-data-list').toggleClass('scrolling', isScrolling);
}
break;
case $(event.target).hasClass('tw-element-body-page'):
{
const body = $(event.target).parents('.tw-element-body');
$(body).prevAll('.tw-element-header-primary').toggleClass('scrolling', isScrolling);
$(body).prevAll('.tw-element-header-secondary').toggleClass('scrolling', isScrolling);
$(body).prevAll('.tw-element-header-data-list').toggleClass('scrolling', isScrolling);
}
break;
}
}, true);
$(document).ready(function () {
$(document).on('click', '.tw-btn-options', function () {
$(this).toggleClass('open');
});
if (!isMobile.any) {
$('.custom-scroll-bar, .custom-scroll-bar-dark').mCustomScrollbar({
theme: 'minimal',
scrollInertia: 100
});
}
$(document).on('click', '.js-fullscreen-image[data-url]', function showFullscreenProfileImage(event) {
event.preventDefault();
event.stopPropagation();
const imagePath = $(this).data('url');
$('body').append('<div id="js-fullscreen-image-container" tabindex="0"><img src="' + imagePath + '" alt="Image not found"></div>');
$('#js-fullscreen-image-container')
.off()
.click(function removeFullscreenProfileImage(event) {
if (event.target.tagName !== 'IMG') {
$(this).remove();
}
})
.keyup(function removeFullscreenProfileImageByEsc(event) {
event.preventDefault();
event.stopPropagation();
if (('undefined' !== typeof event.key && 'Escape' === event.key) || (27 === event.which)) {
$(this).remove();
}
})
.focus();
historyManager.setBackAction({ action: 'removeFullscreenImage' }, true);
});
});
$(document).on('show.bs.modal', '.modal-stacked', function(e) {
var parentModal = $('.modal-stacked.show:visible');
if (parentModal.length || ($(e.target).parents('#results-container').length && 'create-template-document-modal' !== $(e.target).attr('id'))) {
if (!$(e.target).hasClass('modal-stacked') || $(e.target).hasClass('modal-master')) {
return false;
}
var identifier = Math.floor(Math.random() * 10000) + 1;
var newModal = e.target;
$(parentModal).attr('data-modal-identifier', identifier);
$(e.target).attr('data-parent-modal', identifier);
$(newModal).before('<div data-modal-placeholder="' + identifier + '"></div>');
$(newModal).detach().appendTo($('#main-modal-container'));
$('#main-modal-container').show();
$(parentModal).modal('hide');
}
});
$(document).on('hidden.bs.modal', '.modal-stacked', function(e) {
if ($('[data-modal-placeholder="' + $(e.target).attr('data-parent-modal') + '"]').length) {
$(e.target).detach();
$('[data-modal-placeholder="' + $(e.target).attr('data-parent-modal') + '"]').replaceWith($(e.target));
$('[data-modal-identifier="' + $(e.target).attr('data-parent-modal') + '"]').modal('show');
}
});
/*
* Compare arrays (recursively), loose comparison for values (['1', '3'] == [1, 3])
* To check if array contains equal elements: call .sort() on both arrays
*/
Array.prototype.compare = function (array) {
if (!array) {
return false;
}
if (this.length !== array.length) {
return false;
}
for (var i = 0; i < this.length; i++) {
if (this[i] instanceof Array && array[i] instanceof Array) {
if (!this[i].compare(array[i])) {
return false;
}
} else if (this[i] != array[i]) {
return false;
}
}
return true;
};
/**
* Alternative method to serialize a form with disabled inputs
*/
$.fn.serializeIncludeDisabled = function () {
let disabled = this.find(":input:disabled").prop("disabled", false);
let serialized = this.serialize();
disabled.prop("disabled", true);
return serialized;
};
$.fn.serializeArrayIncludeDisabled = function () {
let disabled = this.find(":input:disabled").prop("disabled", false);
let serialized = this.serializeArray();
disabled.prop("disabled", true);
$('input[type="checkbox"]:not(:checked), input[type="radio"]:not(:checked)', this).each(function() {
serialized.push({name: $(this).attr('name'), value: "0"});
});
return serialized;
};
$.fn.serializeArrayIncludeCheckboxes = function () {
let result = $(this).serializeArray();
$('input[type="checkbox"]:not(:checked)', this).each(function() {
result.push({name: $(this).attr('name'), value: "0"});
});
return result;
};
function shareDialog(title, message, url) {
if (typeof window.ReactNativeWebView != 'undefined') {
window.ReactNativeWebView.postMessage(JSON.stringify({
type: 'share',
title: title,
message: message,
url: url
}));
}
}
function toCurrency(number) {
const { format } = new Intl.NumberFormat('nl-BE', {
style: 'decimal',
//currency: 'EUR',
minimumFractionDigits: 2
});
return format(number).replace('.', ' ');
}
function formToArray(form) {
return form.serializeArray().reduce(function(a, x) {
let value = x.value;
if ('checkbox' === $(`[name="${x.name}"]`)[0].type) {
value = 'on' === x.value ? 1 : x.value;
}
if (x.name.indexOf('[]') !== -1) {
if (typeof a[x.name.replace('[]', '')] === 'undefined') {
a[x.name.replace('[]', '')] = [];
}
a[x.name.replace('[]', '')].push(value);
} else {
a[x.name] = value;
}
return a;
}, {});
}
function deepMergeObjects(object1, object2) {
/*console.log('merge:' );
console.log(object1);
console.log(object2);*/
if ('undefined' === typeof object1) {
return object2;
}
if ('undefined' === typeof object2) {
return object1;
}
const merged = {
...object1,
...object2
};
for (const key of Object.keys(merged)) {
if (typeof merged[key] === 'object' && merged[key] !== null) {
if (Array.isArray(object1[key]) && Array.isArray(object2[key])) {
merged[key] = [...object1[key], ...object2[key]];
} else {
merged[key] = deepMergeObjects(object1[key], object2[key]);
}
}
}
return merged;
}
</script>
<script type="text/javascript">
function showDesktopNotification(title, body, profileUrl, url)
{
var notification = new Notification(title, {body: body, icon: profileUrl, tag: url});
notification.onclick = function (x) {
window.open(url);
x.target.cancel();
};
}
function desktopNotification(title, body, profileUrl, url)
{
if (!("Notification" in window)) {
console.log("This browser does not support desktop notification");
} else if (Notification.permission === "granted") {
showDesktopNotification(title, body, profileUrl, url);
} else if (Notification.permission !== 'denied') {
Notification.requestPermission(function (permission) {
if (permission === "granted") {
showDesktopNotification(title, body, profileUrl, url);
}
});
}
}
function retrieveDesktopNotifications() {
if (!("Notification" in window) || (typeof isMobile !== 'undefined' && isMobile.any)) {
// console.log("This browser does not support desktop notifications");
} else if (Notification.permission === "granted") {
if ((typeof document.hidden === "undefined" || false === document.hidden)) {
window.setTimeout(retrieveDesktopNotifications, 55000);
return;
}
$.ajax({
url: "/v2/ajax/notification/desktop",
type: "POST",
format: "json",
success: function (data) {
$(data).each(function () {
desktopNotification(this.title, this.body, this.image, this.url);
});
if ((performance.now() / 1000) < 1800) {
window.setTimeout(retrieveDesktopNotifications, 55000);
}
}
});
} else if (Notification.permission !== 'denied') {
Notification.requestPermission(function (permission) {
if (permission === "granted") {
window.setTimeout(retrieveDesktopNotifications, 55000);
}
}
);
}
}
$(document).ready(function () {
window.setTimeout(retrieveDesktopNotifications, 55000);
});
</script>
<script type="text/javascript" src="/v2/js/init-flatpickr.js?45148424"></script>
</div>
</body>
</html>