ElEditors, Interface administrators, Administrators
70,888
edits
No edit summary |
No edit summary |
||
(21 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
function | $(function () { | ||
var timer = document.querySelector('.boss-timer'); | |||
if ( | if (!timer) return; | ||
// | |||
var bosses = { | |||
boss1: { | |||
href: '/w/The Great Steel Wall', | |||
img: '/wiki/images/2/22/20-4Button.png' | |||
}, | |||
boss2: { | |||
href: '/w/Plegas\'s Labyrinth', | |||
img: '/wiki/images/1/17/17-3Button.png' | |||
} | |||
} | } | ||
var breakdown_hours = []; | |||
var i = 0; | |||
while (i < 24) { | |||
if (i % 2 > 0) breakdown_hours.push(i) | |||
i++ | |||
} | } | ||
var boss1_hours = []; | |||
var i = 1; | |||
while (i < 24) { | |||
boss1_hours.push(i); | |||
i += i % 2 === 0 ? 3 : 1; | |||
} | } | ||
var status = { | |||
NA: { | |||
boss1: true, | |||
boss2: true | |||
}, | |||
EU: { | |||
boss1: true, | |||
boss2: true | |||
} | |||
} | } | ||
function start_timer(server, UTC_offset) { | |||
var timers = null; | |||
UTC_offset = getTimezoneOffset(UTC_offset); | |||
var date1; | |||
var date2 = new Date(); | |||
date2.addMinutes(date2.getTimezoneOffset()); | |||
var | date2.addTime(UTC_offset); | ||
var hourNow; | |||
function updateDungeon() { | |||
date1 = new Date(); | |||
date1.addMinutes(date1.getTimezoneOffset()); | |||
date1.addTime(UTC_offset); | |||
hourNow = date1.getHours(); | |||
var current = []; | |||
if (boss1_hours.includes(hourNow) && status[server].boss2) { | |||
status[server].boss1 = true; | |||
status[server].boss2 = false; | |||
current[server] = 'boss1'; | |||
} else if (!boss1_hours.includes(hourNow) && status[server].boss1) { | |||
status[server].boss1 = false; | |||
status[server].boss2 = true; | |||
current[server] = 'boss2'; | |||
} | |||
var currBoss = current[server]; | |||
var currBossData = bosses[currBoss].href ? bosses[currBoss] : bosses[currBoss][server]; | |||
var timer_img = $('.boss-timer-' + server + ' .boss-timer-image img'); | |||
timer_img.attr('srcset', currBossData.img).attr('src', currBossData.img); | |||
$('.boss-timer-' + server + ' .boss-timer-image a').attr('href', currBossData.href); | |||
var localizationID = '#' + currBoss + '-localization-' + server; | |||
var localization = $(localizationID).text(); | |||
console.table(localizationID, localization); | |||
if (!localization) { | |||
localization = $(localizationID.replace(server, 'NA')).text(); | |||
} | |||
$('.boss-timer-' + server + ' .boss-timer-text').text(localization); | |||
} | |||
updateDungeon(); | |||
var closestBreakdown = closestHigher(hourNow, breakdown_hours); | |||
if (hourNow == 23) { | |||
date2.addHours(2); | |||
} else { | |||
date2.addHours(closestBreakdown - hourNow); | |||
} | |||
date2.setMinutes(0); | |||
date2.setSeconds(0); | |||
var diffTime = Math.abs(date2 - date1); | |||
function | function updateTime() { | ||
$('.boss-timer-' + server + ' .boss-timer-countdown').text(msToTime(diffTime)); | |||
} | } | ||
updateTime(); | |||
var | var timer_server = document.querySelector('.boss-timer-' + server); | ||
if (!timer_server) return; | |||
if (timers) return; | |||
function updateTimers() { | |||
diffTime = diffTime - 1000; | |||
if (diffTime < 0) { | |||
diffTime = 7200000 | |||
updateDungeon(); | |||
} | |||
updateTime(); | |||
} | |||
timers = setInterval(updateTimers, 1000); | |||
} | } | ||
start_timer('NA', 'US/Pacific'); | |||
if (timer | start_timer('EU', 'CET'); | ||
$('.boss-timer img').css('display', 'inline-block'); | |||
if (isApple()) $('.boss-timer').hide(); | |||
}); | |||
function isApple() { | |||
return [ | |||
'iPad Simulator', | |||
'iPhone Simulator', | |||
'iPod Simulator', | |||
'iPad', | |||
'iPhone', | |||
'iPod' | |||
].includes(navigator.platform) | |||
// iPad on iOS 13 detection | |||
|| (navigator.userAgent.includes("Mac")) | |||
} | |||
function msToTime(s) { | |||
s = parseInt(s); | |||
// Pad to 2 or 3 digits, default is 2 | |||
function pad(n, z) { | |||
z = z || 2; | |||
return ('00' + n).slice(-z); | |||
} | |||
var ms = s % 1000; | |||
s = (s - ms) / 1000; | |||
var secs = s % 60; | |||
s = (s - secs) / 60; | |||
var mins = s % 60; | |||
var hrs = (s - mins) / 60; | |||
return pad(hrs) + ':' + pad(mins) + ':' + pad(secs) | |||
} | |||
Date.prototype.addHours = function (h) { | |||
this.setTime(this.getTime() + (h * 60 * 60 * 1000)); | |||
return this; | |||
} | |||
Date.prototype.addMinutes = function (m) { | |||
this.setTime(this.getTime() + (m * 60 * 1000)); | |||
return this; | |||
} | |||
Date.prototype.addTime = function (ms) { | |||
this.setTime(this.getTime() + ms); | |||
return this; | |||
} | |||
function closestHigher(number, candidates) { | |||
var bestCandidate = Infinity; | |||
var higherCandidates = candidates.filter(function (candidate) { return candidate > number }); | |||
higherCandidates.forEach(function (candidate) { | |||
if (candidate < bestCandidate) bestCandidate = candidate; | |||
}); | |||
return bestCandidate; | |||
} | |||
var getTimezoneOffset = (timeZone, date = new Date()) => { | |||
var tz = date.toLocaleString("en", { timeZone, timeStyle: "long" }).split(" ").slice(-1)[0]; | |||
var dateString = date.toString(); | |||
var offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`); | |||
return offset; | |||
} | |||
// Detect when tab is invisible | |||
var hidden, visibilityChange; | |||
if (typeof document.hidden !== "undefined") { | |||
}); | hidden = "hidden"; | ||
visibilityChange = "visibilitychange"; | |||
} else if (typeof document.msHidden !== "undefined") { | |||
hidden = "msHidden"; | |||
visibilityChange = "msvisibilitychange"; | |||
} else if (typeof document.webkitHidden !== "undefined") { | |||
hidden = "webkitHidden"; | |||
visibilityChange = "webkitvisibilitychange"; | |||
} |