From 35ee87d90946e4a9f0a021bc0b6db05cac02920c Mon Sep 17 00:00:00 2001 From: Markerov Date: Thu, 1 Jan 2015 14:10:26 +0800 Subject: [PATCH] merge relative-time into local-time --- js/local-time.js | 78 +++++++++++++++++++++++++++++++++------- js/relative-time.js | 88 --------------------------------------------- 2 files changed, 65 insertions(+), 101 deletions(-) delete mode 100644 js/relative-time.js diff --git a/js/local-time.js b/js/local-time.js index a4e25d6d..ac67673c 100644 --- a/js/local-time.js +++ b/js/local-time.js @@ -14,6 +14,8 @@ */ onready(function(){ + 'use strict'; + var iso8601 = function(s) { s = s.replace(/\.\d\d\d+/,""); // remove milliseconds s = s.replace(/-/,"/").replace(/-/,"/"); @@ -36,28 +38,78 @@ onready(function(){ return strftime(window.post_date, t, datelocale); }; + function timeDifference(current, previous) { + + var msPerMinute = 60 * 1000; + var msPerHour = msPerMinute * 60; + var msPerDay = msPerHour * 24; + var msPerMonth = msPerDay * 30; + var msPerYear = msPerDay * 365; + + var elapsed = current - previous; + + if (elapsed < msPerMinute) { + return 'Just now'; + } else if (elapsed < msPerHour) { + return Math.round(elapsed/msPerMinute) + (Math.round(elapsed/msPerMinute)<=1 ? ' minute ago':' minutes ago'); + } else if (elapsed < msPerDay ) { + return Math.round(elapsed/msPerHour ) + (Math.round(elapsed/msPerHour)<=1 ? ' hour ago':' hours ago'); + } else if (elapsed < msPerMonth) { + return Math.round(elapsed/msPerDay) + (Math.round(elapsed/msPerDay)<=1 ? ' day ago':' days ago'); + } else if (elapsed < msPerYear) { + return Math.round(elapsed/msPerMonth) + (Math.round(elapsed/msPerMonth)<=1 ? ' month ago':' months ago'); + } else { + return Math.round(elapsed/msPerYear ) + (Math.round(elapsed/msPerYear)<=1 ? ' year ago':' years ago'); + } + } + var do_localtime = function(elem) { var times = elem.getElementsByTagName('time'); - + var currentTime = Date.now(); + for(var i = 0; i < times.length; i++) { - if(typeof times[i].getAttribute('data-local') == 'undefined') - continue; - - var t = iso8601(times[i].getAttribute('datetime')); - - + var t = times[i].getAttribute('datetime'); + var postTime = new Date(t); + times[i].setAttribute('data-local', 'true'); - times[i].innerHTML = dateformat(t); - }; + + if (!localStorage.show_relative_time || localStorage.show_relative_time === 'false') { + times[i].innerHTML = dateformat(iso8601(t)); + times[i].setAttribute('title', timeDifference(currentTime, postTime.getTime())); + } else { + times[i].innerHTML = timeDifference(currentTime, postTime.getTime()); + times[i].setAttribute('title', dateformat(iso8601(t))); + } + + } }; - do_localtime(document); - - if (window.jQuery) { + if (window.Options && Options.get_tab('general') && window.jQuery) { + var interval_id; + Options.extend_tab('general', ''); + + $('#show-relative-time>input').on('change', function() { + if (localStorage.show_relative_time === 'true') { + localStorage.show_relative_time = 'false'; + clearInterval(interval_id); + } else { + localStorage.show_relative_time = 'true'; + interval_id = setInterval(do_localtime, 30000, document); + } + // no need to refresh page + do_localtime(document); + }); + + if (localStorage.show_relative_time === 'true') { + $('#show-relative-time>input').attr('checked','checked'); + interval_id = setInterval(do_localtime, 30000, document); + } + // allow to work with auto-reload.js, etc. $(document).on('new_post', function(e, post) { do_localtime(post); }); } -}); + do_localtime(document); +}); diff --git a/js/relative-time.js b/js/relative-time.js deleted file mode 100644 index 596d4616..00000000 --- a/js/relative-time.js +++ /dev/null @@ -1,88 +0,0 @@ -/* - * relative-time.js - * Replaces the timestamps in posts to show 'x minutes/hours/days ago', - * while displaying the absolute time in tooltip - * - * Usage: - * $config['additional_javascript'][] = 'js/jquery.min.js'; - * $config['additional_javascript'][] = 'js/relative-time.js'; - */ -if (active_page == 'index' || active_page == 'thread') { - onready(function () { - 'use strict'; - - var selector, event_type; - if (window.Options && Options.get_tab('general')) { - selector = '#show-relative-time>input'; - event_type = 'change'; - Options.extend_tab('general', ''); - } else { - selector = '#show-relative-time'; - event_type = 'click'; - $('hr:first').before('
'+_('Show relative time')+'
'); - } - - $(selector).on(event_type, function() { - if (localStorage.show_relative_time === 'true') { - localStorage.show_relative_time = 'false'; - } else { - localStorage.show_relative_time = 'true'; - } - }); - - - function update() { - var currentTime = Date.now(); - $('div.post time').each(function () { - var postTime = new Date($(this).attr('datetime')); - - $(this) - .text( timeDifference(currentTime, postTime.getTime()) ) - .attr('title', postTime.toLocaleString('en-GB', { - weekday: 'short', - day: 'numeric', - month: 'numeric', - year: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - hour12: false - })); - }); - } - - function timeDifference(current, previous) { - - var msPerMinute = 60 * 1000; - var msPerHour = msPerMinute * 60; - var msPerDay = msPerHour * 24; - var msPerMonth = msPerDay * 30; - var msPerYear = msPerDay * 365; - - var elapsed = current - previous; - - if (elapsed < msPerMinute) { - return 'Just now'; - } else if (elapsed < msPerHour) { - return Math.round(elapsed/msPerMinute) + (Math.round(elapsed/msPerMinute)<=1 ? ' minute ago':' minutes ago'); - } else if (elapsed < msPerDay ) { - return Math.round(elapsed/msPerHour ) + (Math.round(elapsed/msPerHour)<=1 ? ' hour ago':' hours ago'); - } else if (elapsed < msPerMonth) { - return Math.round(elapsed/msPerDay) + (Math.round(elapsed/msPerDay)<=1 ? ' day ago':' days ago'); - } else if (elapsed < msPerYear) { - return Math.round(elapsed/msPerMonth) + (Math.round(elapsed/msPerMonth)<=1 ? ' month ago':' months ago'); - } else { - return Math.round(elapsed/msPerYear ) + (Math.round(elapsed/msPerYear)<=1 ? ' year ago':' years ago'); - } - } - - if (!localStorage.show_relative_time || localStorage.show_relative_time === 'false') { - return; - } else { - $('#show-relative-time>input').attr('checked','checked'); - setInterval(update, 30000); - $(document).on('new_post', update); - update(); - } - }); -}