var updateTimer=null; function initUpdates(){ if(updateTimer == null){ updateTimer = setInterval("runUpdates()",1000); } } function runUpdates(){ if(settings['tickets_count'] != undefined){ settings['tickets_count--tasks_left_count'] = settings['tickets_count']+settings['tasks_left_count']; }else{ settings['tickets_count--tasks_left_count'] = settings['tasks_left_count']; } for(i in settings){ if($(".settings-update--"+i).get(0) != undefined){ $(".settings-update--"+i).each(function(){ if(settings[i] != ""){ if($(this).hasClass('show-on-value') && !$(this).hasClass('has-value')){ $(this).addClass('has-value'); $(this).parents('.true-block').addClass('need-attention'); } }else{ $(this).removeClass('has-value'); $(this).parents('.true-block').removeClass('need-attention'); } if($(this).data('target') != undefined){ $(this).find($(this).data('target')).html(settings[i]).attr('x-value',settings[i]); }else{ $(this).html(settings[i]).attr('x-value',settings[i]); } }); } } for(i in settings.tasks){ if($(".settings-update--tasks--"+i).get(0) != undefined){ $(".settings-update--tasks--"+i).each(function(){ if($(this).hasClass('show-on-value-bool')){ if(!settings.tasks[i]){ $(this).addClass('has-value'); $(this).parents('.true-block').addClass('need-attention'); }else{ $(this).removeClass('has-value'); $(this).parents('.true-block').removeClass('need-attention'); } } if($(this).hasClass('show-on-value')){ if(settings.tasks[i] != ""){ if(!$(this).hasClass('has-value')){ $(this).addClass('has-value'); $(this).parents('.true-block').addClass('need-attention'); } }else{ $(this).removeClass('has-value'); $(this).parents('.true-block').removeClass('need-attention'); } } if($(this).data('target') != undefined){ $(this).find($(this).data('target')).html(settings.tasks[i]).attr('x-value',settings.tasks[i]); }else{ $(this).html(settings.tasks[i]).attr('x-value',settings.tasks[i]); } }); } } $(document).trigger('vvTasks',settings.tasks); $('.js-calculate-time-ago:not(.js-calculate-time-ago-disabled)').each(function(){ $(this).html(timeAgo( new Date($(this).attr('x-value') * 1000) )); }); $('.js-calculate-time-until:not(.js-calculate-time-until-disabled)').each(function(){ $(this).html(timeUntil( new Date($(this).attr('x-value') * 1000) )); }); } const MONTH_NAMES = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; function getFormattedDate(date, prefomattedDate = false, hideYear = false) { const day = date.getDate(); const month = MONTH_NAMES[date.getMonth()]; const year = date.getFullYear(); const hours = date.getHours(); let minutes = date.getMinutes(); if (minutes < 10) { // Adding leading zero to minutes minutes = '0'+minutes; } if (prefomattedDate) { // Today at 10:20 // Yesterday at 10:20 return prefomattedDate+' at '+hours+':'+minutes; } if (hideYear) { // 10. January at 10:20 return month+' '+day+' at '+hours+':'+minutes; } // 10. January 2017. at 10:20 return year+' '+month+' '+day+' at '+hours+':'+minutes; } // --- Main function function timeUntil(dateParam) { if (!dateParam) { vvDebugg('dateParam not set'); return null; } const date = typeof dateParam === 'object' ? dateParam : new Date(dateParam); const DAY_IN_MS = 86400000; // 24 * 60 * 60 * 1000 const today = new Date(); const yesterday = new Date( today - DAY_IN_MS); const seconds = Math.round(( date - today) / 1000); const minutes = Math.round(seconds / 60); const hours = Math.round(seconds / 60 / 60); const isToday = today.toDateString() === date.toDateString(); const isYesterday = yesterday.toDateString() === date.toDateString(); const isThisYear = today.getFullYear() === date.getFullYear(); if (seconds < 5) { return 'now'; }else if (seconds < 60) { return seconds+' seconds'; }else if (seconds < 90) { return 'in about a minute '; }else if (minutes < 60) { return 'in '+minutes+' minutes'; }else if (hours < 60) { return 'in '+hours+' hours'; }else if (isToday) { return getFormattedDate(date, 'Today'); // Today at 10:20 }else if (isYesterday) { return getFormattedDate(date, 'Yesterday'); // Yesterday at 10:20 }else if (isThisYear) { return getFormattedDate(date, false, true); // 10. January at 10:20 } return getFormattedDate(date); // 10. January 2017. at 10:20 } function timeAgo(dateParam) { if (!dateParam) { return null; } const date = typeof dateParam === 'object' ? dateParam : new Date(dateParam); const DAY_IN_MS = 86400000; // 24 * 60 * 60 * 1000 const today = new Date(); const yesterday = new Date(today - DAY_IN_MS); const seconds = Math.round((today - date) / 1000); const minutes = Math.round(seconds / 60); const hours = Math.round(seconds / 60 / 60); const days = Math.floor(seconds / 60 / 60 / 24 ); const isToday = today.toDateString() === date.toDateString(); const isYesterday = yesterday.toDateString() === date.toDateString(); const isThisYear = today.getFullYear() === date.getFullYear(); if (seconds < 5) { return 'now'; }else if (seconds < 60) { return seconds+'s ago'; }else if (seconds < 90) { return 'about a minute ago'; }else if (minutes < 60) { return minutes+'m ago'; }else if (hours < 8) { return hours+'h ago'; }else if (isToday) { return getFormattedDate(date, 'Today'); // Today at 10:20 }else if (isYesterday) { return getFormattedDate(date, 'Yesterday'); // Yesterday at 10:20 }else if (days < 7) { return getFormattedDate(date, days+' days ago '); // x days ago at 10:20 ; }else if (isThisYear) { return getFormattedDate(date, false, true); // 10. January at 10:20 } return getFormattedDate(date); // 10. January 2017. at 10:20 }