MediaWiki:VanaTime.js
From HorizonXI Wiki
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
//********************************************************************* // Javascript below contributes to live Vana'diel Time listed in Sidebar // All code taken from: https://www.pyogenes.com/ffxi/timer/v2.html //*************************** /* Add the class tags below to incorporate current guild times <b><p class="page-alchemy_hours"></p></b> The following are valid class tags: page-alchemy_hours page-bonecraft_hours page-clothcraft_hours page-cooking_hours page-fishing_hours page-goldsmithing_hours page-leathercraft_hours page-smithing_hours page-woodworking_hours */ //The following class tags are for the fully formatted time schedules const conquest_schedule = "vanatime-page-conquest-schedule"; const airship_schedule = "vanatime-page-airship-schedule"; //////////////////////////////////////////////////////////////////// basisDate = new Date(); basisDate.setUTCFullYear(2002, 5, 23); // Set date to 2003-06-23 basisDate.setUTCHours(15, 0, 0, 0); // Set time to 15:00:00.0000 Mndate = new Date(); Mndate.setUTCFullYear(2004, 0, 25); // Set date to 2004-01-25 Mndate.setUTCHours(2, 31, 12, 0); // Set time to 02:31:12.0000 msGameDay = (24 * 60 * 60 * 1000 / 25); // milliseconds in a game day msRealDay = (24 * 60 * 60 * 1000); // milliseconds in a real day VanaDay = new Array("Firesday", "Earthsday", "Watersday", "Windsday", "Iceday", "Lightningday", "Lightsday", "Darksday"); DayColor = new Array("#FF0000", "#AAAA00", "#0000DD", "#00AA22", "#7799FF", "#AA00AA", "#AAAAAA", "#333333"); //PhaseName = new Array("Full Moon","Waning Gibbous","Last Quarter","Waning Crescent","New Moon","Waxing Crescent","First Quarter","Waxing Gibbous"); PhaseName = new Array('\u{1F315}','\u{1F316}','\u{1F317}','\u{1F318}','\u{1F311}','\u{1F312}','\u{1F313}','\u{1F314}'); sMonth = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); RSErace = new Array("M. Hume","F. Hume","M. Elvaan","F. Elvaan","M. TaruTaru","F. TaruTaru","Mithra","Galka"); RSEloc = new Array("Gusgen Mines","Shakrami Maze","Ordelle Caves"); BoatSched = new Array("08:00", "16:00", "00:00"); BoatSched2 = new Array("06:30", "14:30", "22:30"); BoatDayOffset = new Array(0,0,7); function resetGameTime() { // **** Game time var now = new Date(); vanaDate = ((898 * 360 + 30) * msRealDay) + (now.getTime() - basisDate.getTime()) * 25; vYear = Math.floor(vanaDate / (360 * msRealDay)); vMon = Math.floor((vanaDate % (360 * msRealDay)) / (30 * msRealDay)) + 1; vDate = Math.floor((vanaDate % (30 * msRealDay)) / (msRealDay)) + 1; vHour = Math.floor((vanaDate % (msRealDay)) / (60 * 60 * 1000)); vMin = Math.floor((vanaDate % (60 * 60 * 1000)) / (60 * 1000)); vSec = Math.floor((vanaDate % (60 * 1000)) / 1000); vDay = Math.floor((vanaDate % (8 * msRealDay)) / (msRealDay)); if (vYear < 1000) { VanaYear = "0" + vYear; } else { VanaYear = vYear; } if (vMon < 10) { VanaMon = "0" + vMon; } else { VanaMon = vMon; } if (vDate < 10) { VanaDate = "0" + vDate; } else { VanaDate = vDate; } if (vHour < 10) { VanaHour = "0" + vHour; } else { VanaHour = vHour; } if (vMin < 10) { VanaMin = "0" + vMin; } else { VanaMin = vMin; } if (vSec < 10) { VanaSec = "0" + vSec; } else { VanaSec = vSec; } // Moon phase var timenow = new Date(); var localTime = timenow.getTime(); var moonDays = (Math.floor((localTime - Mndate.getTime()) / msGameDay)) % 84; var mnElapsedTime = (localTime - Mndate.getTime()) % msGameDay; // determine phase percentage moonpercent = - Math.round((42 - moonDays) / 42 * 100); if (moonpercent <= -94) { mnPhase = 0; optPhase = 4; toNextPhase = (3 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (38 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= 90) { mnPhase = 0; optPhase = 4; toNextPhase = (87 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (38 + 84 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= -93 && moonpercent <= -62) { mnPhase = 1; optPhase = 4; toNextPhase = (17 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (38 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= -61 && moonpercent <= -41) { mnPhase = 2; optPhase = 4; toNextPhase = (25 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (38 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= -40 && moonpercent <= -11) { mnPhase = 3; optPhase = 4; toNextPhase = (38 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (38 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= -10 && moonpercent <= 6) { mnPhase = 4; optPhase = 0; toNextPhase = (45 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (80 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= 7 && moonpercent <= 36) { mnPhase = 5; optPhase = 0; toNextPhase = (58 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (80 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= 37 && moonpercent <= 56) { mnPhase = 6; optPhase = 0; toNextPhase = (66 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (80 - moonDays) * msGameDay - mnElapsedTime; } else if (moonpercent >= 57 && moonpercent <= 89) { mnPhase = 7; optPhase = 0; toNextPhase = (60 - moonDays) * msGameDay - mnElapsedTime; toOptimalPhase = (80 - moonDays) * msGameDay - mnElapsedTime; } mnpercent = PhaseName[mnPhase] + Math.abs(moonpercent) + "%"; if (moonpercent <= 5 && moonpercent >= -10) { mnpercent = "<FONT COLOR='#FF0000'>" + mnpercent+ "</FONT>"; } else if (moonpercent >= 90 || moonpercent <= -95) { mnpercent = "<FONT COLOR='#0000FF'>" + mnpercent+ "</FONT>"; } //nextPhase = "Next phase (" + PhaseName[(mnPhase + 1) % 8] + "): " + formatCountdown(toNextPhase); //nextOptPhase = "Next " + PhaseName[optPhase] + ": " + formatCountdown(toOptimalPhase); //draw to sidebar element VanaTime = "<div><li><b>" + VanaHour + ":" + VanaMin + "</b> ~ " + VanaYear + "-" + VanaMon + "-" + VanaDate + "</li>"; VanaTime += "<li><span style=\"font-weight: bold; font-size:14px; color:" + DayColor[vDay] + "\" >" + VanaDay[vDay] + "</span><span style=\"font-size:14px;\"> ~ " + mnpercent + "</span></li>"; VanaTime += "</div>"; alchemy_hours = guildHelper(8, 23, 6); bonecraft_hours = guildHelper(8, 23, 3); clothcraft_hours = guildHelper(6, 21, 0); cooking_hours = guildHelper(5, 20, 7); fishing_hours = guildHelper(3, 18, 5); goldsmithing_hours = guildHelper(8, 23, 4); leathercraft_hours = guildHelper(3, 18, 4); smithing_hours = guildHelper(8, 23, 2); woodworking_hours = guildHelper(6, 21, 0); // Do not alter this line. This updates sidebar text for current time document.getElementById("n-vanatime").innerHTML = VanaTime; const page_vanatime = document.getElementsByClassName("page-vanatime"); for (let i = 0; i < page_vanatime.length; i = i+1) { page_vanatime[i].textContent = VanaTime; } const page_alchemy_hours = document.getElementsByClassName("page-alchemy_hours"); for (let i = 0; i < page_alchemy_hours.length; i = i+1) { page_alchemy_hours[i].textContent = alchemy_hours; } const page_bonecraft_hours = document.getElementsByClassName("page-bonecraft_hours"); for (let i = 0; i < page_bonecraft_hours.length; i = i+1) { page_bonecraft_hours[i].textContent = bonecraft_hours; } const page_clothcraft_hours = document.getElementsByClassName("page-clothcraft_hours"); for (let i = 0; i < page_clothcraft_hours.length; i = i+1) { page_clothcraft_hours[i].textContent = clothcraft_hours; } const page_cooking_hours = document.getElementsByClassName("page-cooking_hours"); for (let i = 0; i < page_cooking_hours.length; i = i+1) { page_cooking_hours[i].textContent = cooking_hours; } const page_fishing_hours = document.getElementsByClassName("page-fishing_hours"); for (let i = 0; i < page_fishing_hours.length; i = i+1) { page_fishing_hours[i].textContent = fishing_hours; } const page_goldsmithing_hours = document.getElementsByClassName("page-goldsmithing_hours"); for (let i = 0; i < page_goldsmithing_hours.length; i = i+1) { page_goldsmithing_hours[i].textContent = goldsmithing_hours; } const page_leathercraft_hours = document.getElementsByClassName("page-leathercraft_hours"); for (let i = 0; i < page_leathercraft_hours.length; i = i+1) { page_leathercraft_hours[i].textContent = leathercraft_hours; } const page_smithing_hours = document.getElementsByClassName("page-smithing_hours"); for (let i = 0; i < page_smithing_hours.length; i = i+1) { page_smithing_hours[i].textContent = smithing_hours; } const page_woodworking_hours = document.getElementsByClassName("page-woodworking_hours"); for (let i = 0; i < page_woodworking_hours.length; i = i+1) { page_woodworking_hours[i].textContent = woodworking_hours; } } function guildHelper(open, close, holiday) { var timenow = new Date(); var localTime = timenow.getTime(); var elapsedTime = (localTime - basisDate.getTime()) % msGameDay; var dayStart = localTime - elapsedTime; // this conversion factor tells us time elapsed since the game day started in milliseconds var convFactor = 60 * 60 * 1000 / 25; vanaDate = ((898 * 360 + 30) * msRealDay) + (localTime - basisDate.getTime()) * 25; vDay = Math.floor((vanaDate % (8 * msRealDay)) / (msRealDay)); open = open * convFactor; close = close * convFactor; openTime = open + dayStart; closeTime = close + dayStart; outputTxt = ""; guildCountdown = 0; if (openTime >= localTime) { guildCountdown = openTime - localTime; outputTxt2 = "Currently Closed. Open tomorrow."; outputTxt1 = "Opens in: "; } else if ((openTime < localTime) && (closeTime > localTime)) { guildCountdown = closeTime - localTime; outputTxt2 = "Currently Open for business."; outputTxt1 = "Closes in: "; } else if (closeTime <= localTime) { guildCountdown = (msGameDay - elapsedTime) + open; outputTxt2 = "Currently Closed. Open tomorrow."; outputTxt1 = "Opens in: "; } // adjust for holiday if ((holiday == vDay) && (closeTime > localTime)) { guildCountdown = (msGameDay - elapsedTime) + open; outputTxt2 = "Currently Closed for Holiday."; outputTxt1 = "Opens in: "; } else if (((vDay + 1) == holiday) && (closeTime <= localTime)) { guildCountdown = (msGameDay - elapsedTime) + open + msGameDay; outputTxt2 = "Currently Closed. Holiday tomorrow."; outputTxt1 = "Opens in: "; } return outputTxt1 + formatCountdown(guildCountdown) + ". " + outputTxt2; } function formatCountdown(varTime) { var dayLeft = varTime / msRealDay; var hourLeft = (dayLeft - Math.floor(dayLeft)) * 24; var minLeft = (hourLeft - Math.floor(hourLeft)) * 60; var secLeft = Math.floor((minLeft - Math.floor(minLeft)) * 60); var formattedTime = ''; dayLeft = Math.floor(dayLeft); hourLeft = Math.floor(hourLeft); minLeft = Math.floor(minLeft); if (minLeft < 10) {minLeft = '0' + minLeft;} if (secLeft < 10) {secLeft = '0' + secLeft;} if (dayLeft > 0) { formattedTime = dayLeft + ':'; if (hourLeft < 10) { formattedTime = formattedTime + '0' + hourLeft + ':'; } else { formattedTime = formattedTime + hourLeft + ':'; } } else if (hourLeft > 0) { formattedTime = hourLeft + ':'; } formattedTime = formattedTime + minLeft + ':' + secLeft; return formattedTime; } function getAirSched() { var timenow = new Date(); var localTime = timenow.getTime(); var elapsedTime = (localTime - basisDate.getTime()) % msGameDay; var dayStart = localTime - elapsedTime; vanaDate = ((898 * 360 + 30) * msRealDay) + (localTime - basisDate.getTime()) * 25; vDay = Math.floor((vanaDate % (8 * msRealDay)) / (msRealDay)); var offset1 = ((1 * 60) + 10) * 60 * 1000 / 25; // 1:10 offset used by B->J J->S var offset2 = ((2 * 60) + 40) * 60 * 1000 / 25; // 2:40 offset used by J->W K-J var offset3 = ((4 * 60) + 10) * 60 * 1000 / 25; // 4:10 offset used by J->B S->J var offset4 = ((5 * 60) + 35) * 60 * 1000 / 25; // 5:35 offset used by J->K var offset5 = ((5 * 60) + 45) * 60 * 1000 / 25; // 5:45 offset used by W->J outAir = ""; outAir += "<TABLE CLASS='vanatime-page-airship-table' WIDTH='400' CELLSPACING='0' CELLPADDING='0'>"; outAir += "<TR><TH ALIGN='LEFT'>Airship Route</TH>"; outAir += "<TH ALIGN='LEFT'>Departure Day</TH>"; outAir += "<TH ALIGN='LEFT'>Arrival</TH>"; outAir += "<TH ALIGN='LEFT'>Departure</TH></TR>"; outAir += AirHelper(elapsedTime, offset3, vDay, "Jeuno To Bastok"); outAir += AirHelper(elapsedTime, offset4, vDay, "Jeuno To Kazham"); outAir += AirHelper(elapsedTime, offset1, vDay, "Jeuno To San d'Oria"); outAir += AirHelper(elapsedTime, offset2, vDay, "Jeuno To Windurst"); outAir += AirHelper(elapsedTime, offset1, vDay, "Bastok To Jeuno"); outAir += AirHelper(elapsedTime, offset2, vDay, "Kazham To Jeuno"); outAir += AirHelper(elapsedTime, offset3, vDay, "San d'Oria To Jeuno"); outAir += AirHelper(elapsedTime, offset5, vDay, "Windurst To Jeuno"); outAir += "</TABLE>"; // when ready, delete this const airship_time = document.getElementById(airship_schedule); if (airship_time) airship_time.innerHTML = outAir; } function AirHelper(elapsed, offset, day, city) { var newOffset = offset; var count = 0; while (newOffset < elapsed) { count += 1; newOffset += (msGameDay / 4); } if (count >= 4) { day = (day + 1) % 8; } output = "<TR><TD>" + city + "</TD>"; output += "<TD><FONT COLOR=" + DayColor[day] + ">" + VanaDay[day] + "</FONT></TD>"; arrivalTime = newOffset - elapsed - 144000; if (arrivalTime < 0) { arrivalTime = 0; } output += "<TD>" + formatCountdown(arrivalTime,1) + "</TD>"; output += "<TD>" + formatCountdown(newOffset - elapsed,1) + "</TD></TR>"; return output; } function getConquest() { var now = new Date(); var timeLeft = (7 * msRealDay) - ((now.getTime() - basisDate.getTime()) % (7 * msRealDay)); vanaConq = Math.floor(timeLeft / (msGameDay)) + 1; conqDays = timeLeft / msRealDay; conqHours = (conqDays - Math.floor(conqDays)) * 24; conqMin = (conqHours - Math.floor(conqHours)) * 60; conqSec = Math.floor((conqMin - Math.floor(conqMin)) * 60); if (conqDays < 10) { conqDays = '0' + Math.floor(conqDays); } else { conqDays = Math.floor(conqDays); } if (conqHours < 10) { conqHours = '0' + Math.floor(conqHours ); } else { conqHours = Math.floor(conqHours ); } if (conqMin < 10) { conqMin = '0' + Math.floor(conqMin ); } else { conqMin = Math.floor(conqMin ); } if (conqSec < 10) { conqSec = '0' + Math.floor(conqSec ); } else { conqSec = Math.floor(conqSec ); } conqDate = formatDate(now.getTime() + timeLeft, 2); conq = vanaConq + ' Vana´diel Days <BR>' + conqDate + ' (' + formatCountdown(timeLeft) + ')'; const conquest_time = document.getElementById(conquest_schedule); if (conquest_time) conquest_time.innerHTML = conq; } function gametick(){ resetGameTime(); getConquest(); getAirSched(); setTimeout("gametick()", 50); } gametick();