<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://gw1wiki.ezgame.cc/index.php?action=history&amp;feed=atom&amp;title=Widget%3AEvent_countdown</id>
	<title>Widget:Event countdown - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://gw1wiki.ezgame.cc/index.php?action=history&amp;feed=atom&amp;title=Widget%3AEvent_countdown"/>
	<link rel="alternate" type="text/html" href="https://gw1wiki.ezgame.cc/index.php?title=Widget:Event_countdown&amp;action=history"/>
	<updated>2026-10-17T23:16:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://gw1wiki.ezgame.cc/index.php?title=Widget:Event_countdown&amp;diff=3154&amp;oldid=prev</id>
		<title>gww&gt;Chieftain Alex at 22:19, 11 September 2026</title>
		<link rel="alternate" type="text/html" href="https://gw1wiki.ezgame.cc/index.php?title=Widget:Event_countdown&amp;diff=3154&amp;oldid=prev"/>
		<updated>2026-09-11T22:19:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
== Description ==&lt;br /&gt;
This widget displays the remaining for the current event, or time until the next event. This widget should be used via the wrapper template {{tl|Event countdown widget}} to track usage.&lt;br /&gt;
&lt;br /&gt;
The widget/wrapper template can however only be used in combination with {{tl|Event countdown}}, as the widget itself does not produce an output, it only modifies the output of the other template.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
This widget has no parameters.&lt;br /&gt;
&lt;br /&gt;
=== Data attributes used ===&lt;br /&gt;
; data-name&lt;br /&gt;
: Optional. Displayed text for what starts (default: &amp;lt;tt&amp;gt;The event&amp;lt;/tt&amp;gt;)&lt;br /&gt;
; data-displayutc&lt;br /&gt;
: The time (UTC) to begin displaying the event timer.&lt;br /&gt;
; data-startutc&lt;br /&gt;
: The event start time (UTC).&lt;br /&gt;
; data-endutc&lt;br /&gt;
: The event end time (UTC).&lt;br /&gt;
; data-interval&lt;br /&gt;
: The number of minutes between the beginning of each event (default: &amp;lt;tt&amp;gt;180&amp;lt;/tt&amp;gt;)&lt;br /&gt;
; data-duration&lt;br /&gt;
: Optional. The duration of each repetitions in minutes (default: &amp;lt;tt&amp;gt;30&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Example wikicode ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Event countdown&lt;br /&gt;
| [[#Schedule|Wintersday finale]] in Lion's Arch&lt;br /&gt;
| displayutc = Jul 1 {{CURRENTYEAR}} 00:00&lt;br /&gt;
| startutc = Jul 1 {{CURRENTYEAR}} 08:01&lt;br /&gt;
| endutc = Jul 2 {{CURRENTYEAR}} 08:01&lt;br /&gt;
| interval = 180&lt;br /&gt;
| duration = 15&lt;br /&gt;
| margin-top = -3.65em&lt;br /&gt;
| border-bottom = 1px solid #AAA&lt;br /&gt;
}}&lt;br /&gt;
{{Event countdown&lt;br /&gt;
| Wintersday finale in Kamadan&lt;br /&gt;
| displayutc = Jul 1 {{CURRENTYEAR}} 00:00&lt;br /&gt;
| startutc = Jul 1 {{CURRENTYEAR}} 08:16&lt;br /&gt;
| endutc = Jul 2 {{CURRENTYEAR}} 08:16&lt;br /&gt;
| interval = 180&lt;br /&gt;
| duration = 15&lt;br /&gt;
| margin-top = -1.95em&lt;br /&gt;
| border-bottom = 1px solid #AAA&lt;br /&gt;
}}&lt;br /&gt;
{{Event countdown widget}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Widgets]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--{counter assign=&amp;quot;EventCountdown_counter&amp;quot; name=&amp;quot;EventCountdown_counter&amp;quot;}--&amp;gt;&amp;lt;!--{if $EventCountdown_counter eq 1}--&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
/* Guild Wars Wiki: Event timer */&lt;br /&gt;
// Main function&lt;br /&gt;
function eventCountdown() {&lt;br /&gt;
  // Repeat this for every countdown timer&lt;br /&gt;
  $.each( $('.event-countdown'), function(i,v){&lt;br /&gt;
&lt;br /&gt;
    // Input parameters and defaults&lt;br /&gt;
    var display_utc  = new Date(v.attributes['data-displayutc'].value) || new Date('01 Jul 2018 00:00 UTC'); // display timer from this time onwards&lt;br /&gt;
    var start_utc    = new Date(v.attributes['data-startutc'].value) || new Date('01 Jul 2018 08:01 UTC'); // start time of first event&lt;br /&gt;
    var end_utc      = new Date(v.attributes['data-endutc'].value) || new Date('02 Jul 2018 08:16 UTC'); // end time of last event&lt;br /&gt;
    var duration_min = Number(v.attributes['data-duration'].value) || 30; // duration of event, in minutes&lt;br /&gt;
    var interval_min = Number(v.attributes['data-interval'].value) || 180; // time between the beginning of each event, in minutes&lt;br /&gt;
    var name         = v.attributes['data-name'].value || 'The event';&lt;br /&gt;
&lt;br /&gt;
    // Calculated parameters (part 1)&lt;br /&gt;
    var now_utc     = new Date();&lt;br /&gt;
&lt;br /&gt;
    var now_ms      = now_utc.valueOf();&lt;br /&gt;
    var display_ms  = display_utc.valueOf();&lt;br /&gt;
    var start_ms    = start_utc.valueOf();&lt;br /&gt;
    var end_ms      = end_utc.valueOf();&lt;br /&gt;
&lt;br /&gt;
    // Check if timer should be showing -- if not, quit&lt;br /&gt;
    if (now_ms &amp;lt; display_ms || now_ms &amp;gt; end_ms) {&lt;br /&gt;
      $(v).addClass('hide');&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Calculated parameters (part 2)&lt;br /&gt;
    var duration_ms = duration_min * 60 * 1000;&lt;br /&gt;
    var interval_ms = interval_min * 60 * 1000;&lt;br /&gt;
&lt;br /&gt;
    var cycle = (now_ms - start_ms) / interval_ms; // has lots of decimals&lt;br /&gt;
&lt;br /&gt;
    var cycle_event_start_ms = start_ms + ( interval_ms * Math.floor(cycle) );&lt;br /&gt;
    var cycle_event_end_ms   = cycle_event_start_ms + duration_ms;&lt;br /&gt;
    var cycle_end_ms         = cycle_event_start_ms + interval_ms;&lt;br /&gt;
&lt;br /&gt;
    // Calculated parameters for display (part 3)&lt;br /&gt;
    var now_min             = now_ms / (1000 * 60);&lt;br /&gt;
    var cycle_event_end_min = cycle_event_end_ms / (1000 * 60);&lt;br /&gt;
    var cycle_end_min       = cycle_end_ms / (1000 * 60);&lt;br /&gt;
&lt;br /&gt;
    // Calculate if the current event has finished&lt;br /&gt;
    if (now_min &amp;gt; cycle_event_end_min) {&lt;br /&gt;
      // If an event has ended, display the time until the next event, in minutes&lt;br /&gt;
      var text = name + ' starts in ' + timeText(cycle_end_min - now_min) + '.';&lt;br /&gt;
    } else {&lt;br /&gt;
      // If an event is ongoing, display the time remaining, in minutes&lt;br /&gt;
      var text = name + ' has started. ' + timeText(cycle_event_end_min - now_min) + ' until the current event ends.';&lt;br /&gt;
    }&lt;br /&gt;
    $(v).text(text);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Helper function to format time text from numerical minutes into words&lt;br /&gt;
function timeText(minutes) {&lt;br /&gt;
  minutes = Math.floor(minutes);&lt;br /&gt;
&lt;br /&gt;
  // Calculated parameters&lt;br /&gt;
  var m = minutes % 60;&lt;br /&gt;
  var h = Math.floor(minutes/60);&lt;br /&gt;
  var text = '';&lt;br /&gt;
&lt;br /&gt;
  // Check if less than a minute to go&lt;br /&gt;
  if ( minutes &amp;lt; 1) {&lt;br /&gt;
    text = 'less than a minute';&lt;br /&gt;
    return text;&lt;br /&gt;
  } else if (m &amp;gt; 0 &amp;amp;&amp;amp; h &amp;gt; 0) {&lt;br /&gt;
    text = h + ' hour' + (h &amp;gt; 1 ? 's' : '') + ' and ' + m + ' minute' + (m &amp;gt; 1 ? 's' : '');&lt;br /&gt;
  } else if (m == 0 &amp;amp;&amp;amp; h &amp;gt; 0) {&lt;br /&gt;
    text = h + ' hour' + (h &amp;gt; 1 ? 's' : '');&lt;br /&gt;
  } else if (m &amp;gt; 0 &amp;amp;&amp;amp; h == 0) {&lt;br /&gt;
    text = m + ' minute' + (m &amp;gt; 1 ? 's' : '');&lt;br /&gt;
  }&lt;br /&gt;
  return text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DEFER LOADING SCRIPT UNTIL JQUERY IS READY. WAIT 40MS BETWEEN ATTEMPTS.&lt;br /&gt;
function defer(method) {&lt;br /&gt;
    if (window.jQuery) {&lt;br /&gt;
        method();&lt;br /&gt;
    } else {&lt;br /&gt;
        setTimeout(function() { defer(method) }, 40);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INITIALISATION&lt;br /&gt;
defer(function () {&lt;br /&gt;
  // Run once immediately&lt;br /&gt;
  eventCountdown();&lt;br /&gt;
  // Then run again every 60 seconds&lt;br /&gt;
  setInterval(eventCountdown, 60*1000);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;!--{/if}--&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>gww&gt;Chieftain Alex</name></author>
	</entry>
</feed>