MediaWiki:Gadget-fix-schedule-times.js

// vim: ts=4 sw=4 et ai si $.when(   $.ready ).then( function  { // quit immediately if dontFixSchedule is in the URL after the ? if(window.location.search.indexOf("dontFixSchedule")>=0)return;

// Configuration var CONFERENCE_DAYS = { "Friday, October 8": Date.UTC( 2021, /* month index, not month number! */ 9, 8 ), "Saturday, October 9": Date.UTC( 2021, 9, 9 ), "Sunday, October 10": Date.UTC( 2021, 9, 10 ) };   var WRITTEN_SCHEDULE_OFFSET_SECONDS = -4 * 3600; // written schedule for WCNA 2021 is Eastern Time which is UTC-4

// Other constants var TIME_REGEX = /(\d\d):(\d\d)( - (\d\d):(\d\d)|\+)/;

function formatRelativeTime( minutesUntilStart, minutesUntilEnd ) { if ( minutesUntilStart > /* one day */ 1440 ) { return "In " + ( minutesUntilStart / 1440 ).toFixed( 0 ) + " days"; } else if ( minutesUntilStart > /* 3 hours */ 180 ) { return "In " + ( minutesUntilStart / 60 ).toFixed( 0 ) + " hours"; } else if ( minutesUntilStart > 120 ) { return "In 2 hours and " + ( minutesUntilStart % 60 ).toFixed( 0 ) + " minutes"; } else if ( minutesUntilStart > 60 ) { return "In an hour and " + ( minutesUntilStart % 60 ).toFixed( 0 ) + " minutes"; } else if ( minutesUntilStart > 1 ) { return "In " + minutesUntilStart.toFixed( 0 ) + " minutes"; } else if ( minutesUntilStart > 0 ) { return "In less than a minute"; } else if ( minutesUntilStart > -1 ) { return "Started just now"; } else if ( minutesUntilStart > -5 ) { return "Started " + ( -minutesUntilStart ).toFixed( 0 ) + " minutes ago"; } else if ( minutesUntilEnd > 1 ) { return "Ends in " + minutesUntilEnd.toFixed( 0 ) + " minutes"; } else if ( minutesUntilEnd > 0 ) { return "Ends in one minute"; } else if ( minutesUntilEnd > -1 ) { return "Ended just now"; } else if ( minutesUntilEnd > -60 ) { return "Ended " + ( -minutesUntilEnd ).toFixed( 0 ) + " minutes ago"; } else if ( minutesUntilEnd > -1440 ) { return "Ended " + ( -minutesUntilEnd / 60 ).toFixed( 0 ) + " hours ago"; } else { return "Ended " + ( -minutesUntilEnd / 1440 ).toFixed( 0 ) + " days ago"; }   }

function formatTime( unixTimestamp ) { return new Date( unixTimestamp * 1000 ).toLocaleTimeString.replace( /(\d\d?:\d\d):00/, "$1" ).replace( / /g, " " ); }

function makeHtml( originalTimeMatch, tableCell ) { var dayHeading = $( tableCell ).closest( "table" ).prev.prev; // skip icon key var dayHeadingText = dayHeading.find( ".mw-headline" ).text; var baseDateUnix = Math.floor( CONFERENCE_DAYS[dayHeadingText] / 1000 );

// First, get the actual timestamps var startTimeUnix = baseDateUnix + parseInt( originalTimeMatch[1], 10 ) * 3600 + parseInt( originalTimeMatch[2], 10 ) * 60 - WRITTEN_SCHEDULE_OFFSET_SECONDS; var endTimeUnix = originalTimeMatch[4] ? ( baseDateUnix + parseInt( originalTimeMatch[4], 10 ) * 3600 +               parseInt( originalTimeMatch[5], 10 ) * 60 - WRITTEN_SCHEDULE_OFFSET_SECONDS ) : startTimeUnix;

// Now, get some text like "Starts in 10 minutes". var nowUnix = Math.floor( new Date.getTime / 1000 ); var relativeTimeFormatted = formatRelativeTime(           ( startTimeUnix - nowUnix ) / 60,            ( endTimeUnix - nowUnix ) / 60        ); return formatTime( startTimeUnix ) + " - " + ( ( startTimeUnix === endTimeUnix ) ? "" : formatTime( endTimeUnix ) ) + " (" + relativeTimeFormatted + ")"; }

$( "small" ).each( function {        if ( this.textContent === "(US Eastern Time)" ) { try{            $( this ).text( "In " + Intl.DateTimeFormat.resolvedOptions.timeZone.replace( /_/g, " " ) + " time" ); }catch(e){ console.error(e); $(this).text("In your local timezone (hover to see Eastern U.S. time)");        }        }    } );

$( "td" ).each( function {        var match = TIME_REGEX.exec( this.textContent );        if ( match ) {            this.innerHTML = this.innerHTML.replace( match[0], "" + match[0] + " " );        }    } );

function go { $( "span.fixed" ).each( function {            $( this ).html( makeHtml( TIME_REGEX.exec( this.dataset.original ), this.parentNode ) );        } ); }

go; window.setInterval( go, 60 * 1000 ); } );