<!--
// Vana'diel Clock Script
////////////////////////////////////////////////////////////////////////////////
// Copyrights:
//  Readapted Scripting by RevolutionFinale.com and InnerSoulFederation.com
//  W3C DOM Specifications Compliant - written by RevolutionFinale.com and ISF
//  Originals from...
//   ffxi.xenoveritas.org/tools/vanaclock/time.shtml
//   www.pyogenes.com
//   mithrapride.figarocastle.org/vana_time/index.html
//   www.ffxi-sars.com/ballista/ballistamate.html
//   www.phoenixphiles.com
//   www.onlinemike.com/timer/crafttimer.html
//	 doconnor.reamined.on.ca/ffxi/
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// baseDate: Converts RealTime to VanadielTime
baseDate = new Date();
baseDate.setUTCFullYear(2002, 5, 23); 		// Set date to 2002-06-23
baseDate.setUTCHours(15, 0, 0, 0);    		// Set time to 15:00:00.0000
// baseDate: Same as baseDate but advanced 4 in game hours ahead (Aht Ferry)
baseDateAht = new Date();
baseDateAht.setUTCFullYear(2002, 5, 23); 		// Set date to 2002-06-23
baseDateAht.setUTCHours(15, 9, 36, 0);    		// Set time to 15:00:00.0000
// moonDate: Determines Phase of the Moon
moonDate = new Date();
moonDate.setUTCFullYear(2004, 0, 25); 		// Set date to 2004-01-25
moonDate.setUTCHours(2, 31, 12, 0);    		// Set time to 02:31:12.0000
// Arrays and Variables
earthDayArray = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
vanaDayArray = new Array("Firesday", "Earthsday", "Watersday", "Windsday", "Iceday", "Lightningday", "Lightsday", "Darksday");
dayColorArray = new Array("colorDD0000", "colorAAAA00", "color0000DD", "color00AA22", "color7799FF", "colorAA00AA", "colorAAAAAA", "color333333"); 
monthArray = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
monthShortArray = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nove", "Dec");
moonPhaseArray = new Array("Full Moon","Waning Gibbous","Last Quarter","Waning Crescent","New Moon","Waxing Crescent","First Quarter","Waxing Gibbous");
boatSchedule2Array = new Array("06:30", "14:30", "22:30");	// Arrive
boatScheduleArray = new Array("08:00", "16:00", "00:00");	//Depart
boatSchedule2ArrayAht = new Array("10:30", "18:30", "2:30");	// Arrive
boatScheduleArrayAht = new Array("12:00", "20:00", "04:00");	//Depart
boatSchedule2ArrayNash = new Array("05:00", "13:00", "21:00");	// Arrive
boatScheduleArrayNash = new Array("08:00", "16:00", "00:00");	//Depart
boatDayOffsetArray = new Array(0,0,7);
msRealDay = (24 * 60 * 60 * 1000);			// ms in a real day
msGameDay = (24 * 60 * 60 * 1000 / 25);		// ms in a game day
vost = ((baseDate.getTime()) - (((898 * 360) + 30) * msGameDay));
// Guild Object
var guildObject = new Object();
guildObject.fishingHoliday = "Lightningday";
guildObject.fishingBusiness = "3:00 - 18:00";
guildObject.fishingLow = "180";
guildObject.fishingHigh = "1080";
guildObject.fishingStatus = "initializing...";
guildObject.woodworkingHoliday = "Firesday";
guildObject.woodworkingBusiness = "6:00 - 21:00";
guildObject.woodworkingLow = "360";
guildObject.woodworkingHigh = "1260";
guildObject.woodworkingStatus = "initializing...";
guildObject.smithingHoliday = "Watersday";
guildObject.smithingBusiness = "8:00 - 23:00";
guildObject.smithingLow = "480";
guildObject.smithingHigh = "1380";
guildObject.smithingStatus = "initializing...";
guildObject.goldsmithingHoliday = "Iceday";
guildObject.goldsmithingBusiness = "8:00 - 23:00";
guildObject.goldsmithingLow = "480";
guildObject.goldsmithingHigh = "1380";
guildObject.goldsmithingStatus = "initializing...";
guildObject.clothcraftHoliday = "Firesday";
guildObject.clothcraftBusiness = "6:00 - 21:00";
guildObject.clothcraftLow = "360";
guildObject.clothcraftHigh = "1260";
guildObject.clothcraftStatus = "initializing...";
guildObject.leathercraftHoliday = "Iceday";
guildObject.leathercraftBusiness = "3:00 - 18:00";
guildObject.leathercraftLow = "180";
guildObject.leathercraftHigh = "1080";
guildObject.leathercraftStatus = "initializing...";
guildObject.bonecraftHoliday = "Windsday";
guildObject.bonecraftBusiness = "8:00 - 23:00";
guildObject.bonecraftLow = "480";
guildObject.bonecraftHigh = "1380";
guildObject.bonecraftStatus = "initializing...";
guildObject.alchemyHoliday = "Lightsday";
guildObject.alchemyBusiness = "8:00 - 23:00";
guildObject.alchemyLow = "480";
guildObject.alchemyHigh = "1380";
guildObject.alchemyStatus = "initializing...";
guildObject.cookingHoliday = "Darksday";
guildObject.cookingBusiness = "5:00 - 20:00";
guildObject.cookingLow = "300";
guildObject.cookingHigh = "1200";
guildObject.cookingStatus = "initializing...";
// Ballista Arrays
ballistaLevelArray = new Array("30", "30", "30", "40", "40", "40", "50", "50", "50", "60", "60", "60", "75", "75", "75");
ballistaVSArray = new Array("SvB", "BvW", "WvS", "SvB", "BvW", "WvS", "SvB", "BvW", "WvS", "SvB", "BvW", "WvS", "SvB", "BvW", "WvS");
ballistaLocationArray = new Array("Jugner", "Pashhow", "Meriphataud", "Jugner", "Pashhow", "Meriphataud", "Jugner", "Pashhow", "Meriphataud", "Jugner", "Pashhow", "Meriphataud", "Jugner", "Pashhow", "Meriphataud");
ballistaEntryFeeArray = new Array("500 Gil", "500 Gil", "500 Gil", "1000 Gil", "1000 Gil", "1000 Gil", "1500 Gil", "1500 Gil", "1500 Gil", "2000 Gil", "2000 Gil", "2000 Gil", "3000 Gil", "3000 Gil", "3000 Gil");
// Script Time Alternator: true - update, false - skip an update (Do not edit)
var scriptTimeAlternator = true;

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Starts Timer
function startTimer() {
	updatePage();
	setInterval("updatePage()", 500);
}
// Constantly Updates Output. DOM: Creates Nodes, Formats and Displays the Information
function updatePage() {
	// Common Clocks
	if (scriptTimeAlternator == true) {
		var clock_script_earth_time = getScriptEarthTime();
		document.getElementById('clock_script_earth_time').firstChild.nodeValue = clock_script_earth_time;
		scriptTimeAlternator = false;
	} else {
		scriptTimeAlternator = true;
	}
	var clock_local_earth_time = getEarthTime(4);
	var clock_vanadiel_time = getVanadielTime(3);
	document.getElementById('clock_local_earth_time').firstChild.nodeValue = clock_local_earth_time;
	document.getElementById('clock_vanadiel_time').firstChild.nodeValue = clock_vanadiel_time.vanaTime;
	
	// Day to Day Calendar
	var dayScheduleArray = getDayToDaySchedule();	// Array: Day Colour, Day Name, Earth Start Time, Earth End Time, Moon Color, Moon Name, Moon Percent
	var node;
	var i = 0;
	for (var i = 0; i < 10; i++) {
		node = document.getElementById('clock_day_'+(i+1)+'_1');
		node.className = dayScheduleArray[i][0];
		node.firstChild.nodeValue = dayScheduleArray[i][1];
		document.getElementById('clock_day_'+(i+1)+'_2').firstChild.nodeValue = dayScheduleArray[i][2];
		document.getElementById('clock_day_'+(i+1)+'_3').firstChild.nodeValue = dayScheduleArray[i][3];
		node = document.getElementById('clock_day_'+(i+1)+'_4');
		node.className = dayScheduleArray[i][4];
		node.firstChild.nodeValue = dayScheduleArray[i][5] + " (" + dayScheduleArray[i][6] + "%)";
	}
	
	// Airship Schedules
	var displayAirship = getAirshipSchedule();
	document.getElementById('clock_airship_1').firstChild.nodeValue = displayAirship.AtBast + " ET";
	document.getElementById('clock_airship_2').firstChild.nodeValue = displayAirship.AtBastJ + " ET";
	document.getElementById('clock_airship_3').firstChild.nodeValue = displayAirship.AtSand + " ET";
	document.getElementById('clock_airship_4').firstChild.nodeValue = displayAirship.AtSandJ + " ET";
	document.getElementById('clock_airship_5').firstChild.nodeValue = displayAirship.AtWind + " ET";
	document.getElementById('clock_airship_6').firstChild.nodeValue = displayAirship.AtWindJ + " ET";
	document.getElementById('clock_airship_7').firstChild.nodeValue = displayAirship.AtKazh + " ET";
	document.getElementById('clock_airship_8').firstChild.nodeValue = displayAirship.AtKazhJ + " ET";
	document.getElementById('clock_airship_9').firstChild.nodeValue = displayAirship.airshipA;
	document.getElementById('clock_airship_10').firstChild.nodeValue = displayAirship.airshipB;
	document.getElementById('clock_airship_11').firstChild.nodeValue = displayAirship.airshipC;
	document.getElementById('clock_airship_12').firstChild.nodeValue = displayAirship.airshipD;
	
	// Ferry Schedules
	var arrayObject = getFerrySchedule();	// Selbina & Mhaura
	var entryOne = arrayObject[0];
	var entryTwo = arrayObject[1];
	var entryThree = arrayObject[2];
	document.getElementById('clock_ferry_1').firstChild.nodeValue = "1. " + entryOne.formattedText + entryOne.formattedTime + " - " + entryOne.status;
	document.getElementById('clock_ferry_2').firstChild.nodeValue = "2. " + entryTwo.formattedText + entryTwo.formattedTime + " - " + entryTwo.status;
	document.getElementById('clock_ferry_3').firstChild.nodeValue = "3. " + entryThree.formattedText + entryThree.formattedTime + " - " + entryThree.status;
	var arrayObjectAht = getFerryScheduleAht();	// Mhaura & Aht Urhgan
	var entryOne = arrayObjectAht[0];
	var entryTwo = arrayObjectAht[1];
	var entryThree = arrayObjectAht[2];
	document.getElementById('clock_ferry_4').firstChild.nodeValue = "1. " + entryOne.formattedText + entryOne.formattedTime + " - " + entryOne.status;
	document.getElementById('clock_ferry_5').firstChild.nodeValue = "2. " + entryTwo.formattedText + entryTwo.formattedTime + " - " + entryTwo.status;
	document.getElementById('clock_ferry_6').firstChild.nodeValue = "3. " + entryThree.formattedText + entryThree.formattedTime + " - " + entryThree.status;
	var arrayObjectNash = getFerryScheduleNash();	// Mhaura & Aht Urhgan
	var entryOne = arrayObjectNash[0];
	var entryTwo = arrayObjectNash[1];
	var entryThree = arrayObjectNash[2];
	document.getElementById('clock_ferry_7').firstChild.nodeValue = "1. " + entryOne.formattedText + entryOne.formattedTime + " - " + entryOne.status;
	document.getElementById('clock_ferry_8').firstChild.nodeValue = "2. " + entryTwo.formattedText + entryTwo.formattedTime + " - " + entryTwo.status;
	document.getElementById('clock_ferry_9').firstChild.nodeValue = "3. " + entryThree.formattedText + entryThree.formattedTime + " - " + entryThree.status;
	
	// Guild Business Hours
	getGuildSchedule();
	i = 1;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.fishingHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.fishingBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.fishingColor;
	node.firstChild.nodeValue = guildObject.fishingStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.fishingClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.woodworkingHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.woodworkingBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.woodworkingColor;
	node.firstChild.nodeValue = guildObject.woodworkingStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.woodworkingClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.smithingHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.smithingBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.smithingColor;
	node.firstChild.nodeValue = guildObject.smithingStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.smithingClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.goldsmithingHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.goldsmithingBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.goldsmithingColor;
	node.firstChild.nodeValue = guildObject.goldsmithingStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.goldsmithingClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.clothcraftHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.clothcraftBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.clothcraftColor;
	node.firstChild.nodeValue = guildObject.clothcraftStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.clothcraftClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.leathercraftHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.leathercraftBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.leathercraftColor;
	node.firstChild.nodeValue = guildObject.leathercraftStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.leathercraftClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.bonecraftHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.bonecraftBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.bonecraftColor;
	node.firstChild.nodeValue = guildObject.bonecraftStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.bonecraftClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.alchemyHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.alchemyBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.alchemyColor;
	node.firstChild.nodeValue = guildObject.alchemyStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.alchemyClose;
	i++;
	document.getElementById('clock_guild_'+(i)+'_1').firstChild.nodeValue = guildObject.cookingHoliday;
	document.getElementById('clock_guild_'+(i)+'_2').firstChild.nodeValue = guildObject.cookingBusiness;
	node = document.getElementById('clock_guild_'+(i)+'_3');
	node.className = guildObject.cookingColor;
	node.firstChild.nodeValue = guildObject.cookingStatus;
	document.getElementById('clock_guild_'+(i)+'_4').firstChild.nodeValue = guildObject.cookingClose;
	
	// Ballista Schedules
	var ballistaScheduleOb = getBallistaSchedule();
	document.getElementById('clock_ballista_info').firstChild.nodeValue = ballistaScheduleOb.status;
	for (var i = 0; i < 10; i++) {
		document.getElementById('clock_ballista_'+(i)+'_1').firstChild.nodeValue = ballistaScheduleOb.list[i][0];
		document.getElementById('clock_ballista_'+(i)+'_2').firstChild.nodeValue = ballistaScheduleOb.list[i][1];
		document.getElementById('clock_ballista_'+(i)+'_3').firstChild.nodeValue = ballistaScheduleOb.list[i][2];
		//document.getElementById('clock_ballista_'+(i)+'_4_1').firstChild.nodeValue = ballistaScheduleOb.list[i][3][0];
		if (ballistaScheduleOb.list[i][3][0] == "B") {
			document.getElementById('clock_ballista_'+(i)+'_4_2').setAttribute('src','images/site_graphics/clock/bastok.jpg')
		} else if (ballistaScheduleOb.list[i][3][0] == "S") {
			document.getElementById('clock_ballista_'+(i)+'_4_2').setAttribute('src','images/site_graphics/clock/sandy.jpg')
		} else if (ballistaScheduleOb.list[i][3][0] == "W") {
			document.getElementById('clock_ballista_'+(i)+'_4_2').setAttribute('src','images/site_graphics/clock/windy.jpg')
		}
		if (ballistaScheduleOb.list[i][3][1] == "B") {
			document.getElementById('clock_ballista_'+(i)+'_4_3').setAttribute('src','images/site_graphics/clock/bastok.jpg')
		} else if (ballistaScheduleOb.list[i][3][1] == "S") {
			document.getElementById('clock_ballista_'+(i)+'_4_3').setAttribute('src','images/site_graphics/clock/sandy.jpg')
		} else if (ballistaScheduleOb.list[i][3][1] == "W") {
			document.getElementById('clock_ballista_'+(i)+'_4_3').setAttribute('src','images/site_graphics/clock/windy.jpg')
		}
		//document.getElementById('clock_ballista_'+(i)+'_4_4').firstChild.nodeValue = ballistaScheduleOb.list[i][3][1];
		document.getElementById('clock_ballista_'+(i)+'_5').firstChild.nodeValue = ballistaScheduleOb.list[i][4];
		document.getElementById('clock_ballista_'+(i)+'_6').firstChild.nodeValue = ballistaScheduleOb.list[i][5];
	}
	
	// Brenner Schedules
	document.getElementById('clock_brenner1').firstChild.nodeValue = "Monday 8am - Level 75";
	document.getElementById('clock_brenner2').firstChild.nodeValue = "Monday 10pm - Level 75";
	document.getElementById('clock_brenner3').firstChild.nodeValue = "Tuesday 8am - Level 30";
	document.getElementById('clock_brenner4').firstChild.nodeValue = "Tuesday 10pm - Level 30";
	document.getElementById('clock_brenner5').firstChild.nodeValue = "Wednesday 8am - Level 40";
	document.getElementById('clock_brenner6').firstChild.nodeValue = "Wednesday 10pm - Level 40";
	document.getElementById('clock_brenner7').firstChild.nodeValue = "Thursday 8am - Level 50";
	document.getElementById('clock_brenner8').firstChild.nodeValue = "Thursday 10pm - Level 50";
	document.getElementById('clock_brenner9').firstChild.nodeValue = "Friday 8am - Level 60";
	document.getElementById('clock_brenner10').firstChild.nodeValue = "Friday 8pm - Level 50";
	document.getElementById('clock_brenner11').firstChild.nodeValue = "Friday 10pm - Level 60";
	document.getElementById('clock_brenner12').firstChild.nodeValue = "Saturday 2am - Level 40";
	document.getElementById('clock_brenner13').firstChild.nodeValue = "Saturday 4am - Level 30";
	document.getElementById('clock_brenner14').firstChild.nodeValue = "Saturday 6am - Level 75";
	document.getElementById('clock_brenner15').firstChild.nodeValue = "Saturday 6pm - Level 40";
	document.getElementById('clock_brenner16').firstChild.nodeValue = "Saturday 8pm - Level 30";
	document.getElementById('clock_brenner17').firstChild.nodeValue = "Saturday 10pm - Level 75";
	document.getElementById('clock_brenner18').firstChild.nodeValue = "Sunday 2am - Level 50";
	document.getElementById('clock_brenner19').firstChild.nodeValue = "Sunday 4am - Level 60";
	document.getElementById('clock_brenner20').firstChild.nodeValue = "Sunday 10pm - Level 60";

	//boxMoonPhases();
	//boxCraft();
	//boxRse();
//	To Purgonorgo From Sunset Docks: 
//	4:50 Boarding 
//	5:30 Departure 
//	8:30 Arrival 
//	
//	16:50 Boarding 
//	17:30 Departure 
//	20:30 Arrival 
//	
//	From Sunset Docks To Purgonorgo: 
//	8:30 Boarding 
//	9:15 Departure 
//	12:10 Arrival 
//	
//	20:30 Boarding 
//	21:15 Departure 
//	0:10 Arrival 
//	
//	Dhalmel Rock tour: 
//	0:10 Boarding 
//	0:50 Departure 
//	4:55 Arrival 
//	
//	Maliyakaleya Reef (very beautiful) 
//	12:10 Boarding 
//	12:50 Departure 
//	16:55 Arrival

//South Landing to Central Landing via Emfea Waterway 
//0:15 board 
//0:50 depart 
//4:35 arrive 
//
//Central Landing to South Landing via Newtpool 
//4:35 board 
//5:10 depart 
//8:55 arrive 
//
//South Landing to North Landing 
//9:35 board 
//10:10 depart 
//16:00 arrive 
//
//North Landing to Central Landing 
//16:45 board 
//17:25 depart 
//19:15 arrive 
//
//Central Landing to South Landing via Newtpool 
//19:15 board 
//19:45 depart 
//23:35 arrive 
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves Earth Time
function getEarthTime(showDay) {
	var now = new Date();
	return formatDateEarth(now.getTime(), showDay);
}
// Formats the Earth Time String
function formatDateEarth(varTime, showDay) {
	// Take a TimeStandard and Convert to a String. yyyy-mm-dd day hh-mn-ss
	var varDate = new Date(varTime);
	var yyyy = varDate.getFullYear();
	var mm = varDate.getMonth() + 1;
	if (mm < 10) {
		mm = "0" + mm;
	}
	var dd = varDate.getDate();
	if (showDay != 3) {
		if (dd < 10) {
			dd = "0" + dd;
		}
	}
	var day = varDate.getDay();
	var hh = varDate.getHours();
	var mn = varDate.getMinutes();
	if (mn < 10) {
		mn = "0" + mn;
	}
	var ss = varDate.getSeconds();
	if (ss < 10) {
		ss = "0" + ss;
	}
	
	if (showDay == 1)  {	// "Thursday, April 01, 2006 @ 23:59:59"
		dateString = earthDayArray[day] + ", " + monthArray[mm-1] + " " + dd + ", " + yyyy + " @ " + hh + ":" + mn + ":" + ss;
	} else if (showDay == 2)  {	// "April 01, 23:59:59"
		dateString = monthArray[mm-1] + " " + dd + ",  " + hh + ":" + mn + ":" + ss;
	} else if (showDay == 3)  {	// "Thursday, April 1, 2006 - 0:00am"
		if (hh > 12) {
			hh = hh - 12;
			ampmtoggle = "pm";
		} else if (hh == 12) {
			ampmtoggle = "pm";
		} else if (hh == 0) {
			hh = 12;
			ampmtoggle = "am";
		} else {
			ampmtoggle = "am";
		}
		dateString = earthDayArray[day] + ", " + monthArray[mm-1] + " " + dd + ", " + yyyy + " - " + hh + ":" + mn + ampmtoggle;
	} else if (showDay == 4) {	// "Thursday, April 01, 2006 - 12:00:00am"
		if (hh > 12) {
			hh = hh - 12;
			ampmtoggle = "pm";
		} else if (hh == 12) {
			ampmtoggle = "pm";
		} else if (hh == 0) {
			hh = 12;
			ampmtoggle = "am";
		} else {
			ampmtoggle = "am";
		}
		dateString = earthDayArray[day] + ", " + monthArray[mm-1] + " " + dd + ", " + yyyy + " - " + hh + ":" + mn + ":" + ss + ampmtoggle;
	} else if (showDay == 5) {	// "April 01 - 12:00:00am"
		if (hh > 12) {
			hh = hh - 12;
			ampmtoggle = "pm";
		} else if (hh == 12) {
			ampmtoggle = "pm";
		} else if (hh == 0) {
			hh = 12;
			ampmtoggle = "am";
		} else {
			ampmtoggle = "am";
		}
		dateString = monthArray[mm-1] + " " + dd + " - " + hh + ":" + mn + ":" + ss + ampmtoggle;
	} else if (showDay == 6) {	// "Apr 01, 12:00am"
		if (hh > 12) {
			hh = hh - 12;
			ampmtoggle = "pm";
		} else if (hh == 12) {
			ampmtoggle = "pm";
		} else if (hh == 0) {
			hh = 12;
			ampmtoggle = "am";
		} else {
			ampmtoggle = "am";
		}
		dateString = monthShortArray[mm-1] + " " + dd + ", " + hh + ":" + mn + ampmtoggle;
	} else {	// "Thursday, April 01, 2006 @ 23:59:59"
		dateString = earthDayArray[day] + ", " + monthArray[mm-1] + " " + dd + ", " + yyyy + " @ " + hh + ":" + mn + ":" + ss;
	}
	return dateString;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves Vana'diel Time
function getVanadielTime(secondsToggle) {
	var dateVanaObject = new Object();
	var vanaTime;
	var now = new Date();
	vanaDate =  ((898 * 360 + 30) * msRealDay) + (now.getTime() - baseDate.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));
	
	// Used in the Guild Business Hours Functions
	dateVanaObject.year = vYear;
	dateVanaObject.month = vMon;
	dateVanaObject.day = vDate;
	dateVanaObject.hour = vHour;
	dateVanaObject.minute = vMin;
	dateVanaObject.element = vanaDayArray[vDay];
	
	if (secondsToggle != 3) {
		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; }
	} else if (secondsToggle == 3) {
		if (vYear < 1000) { VanaYear = "0" + vYear; } else { VanaYear = vYear; }
		VanaMon  = vMon;
		VanaDate = vDate;
		VanaHour = vHour;
		if (vMin  < 10)   { VanaMin  = "0" + vMin; }  else { VanaMin  = vMin; }
	}
	
	if (secondsToggle == 1) {	// "Firesday, Month 00 Day 00, 0000 @ 00:00"
		dateVanaObject.vanaTime = vanaDayArray[vDay] + ", Month " + VanaMon + " Day " + VanaDate + ", " + VanaYear + " @ " + VanaHour + ":" + VanaMin;
	} else if (secondsToggle == 2) {	// "Firesday, 0000 - 00 - 00 @ 00:00:00"
		dateVanaObject.vanaTime = vanaDayArray[vDay] + ", " + VanaYear + "-" + VanaMon + "-" + VanaDate + " @ " + VanaHour + ":" + VanaMin + ":" + VanaSec;
	} else if (secondsToggle == 3) {	// "Firesday, Month 0 Day 0, 0000 - 0:00"
		dateVanaObject.vanaTime = vanaDayArray[vDay] + ", Month " + VanaMon + " Day " + VanaDate + ", " + VanaYear + " - " + VanaHour + ":" + VanaMin;
	} else {	// "Firesday, 0000 - 00 - 00 @ 00:00"
		dateVanaObject.vanaTime = vanaDayArray[vDay] + ", " + VanaYear + "-" + VanaMon + "-" + VanaDate + " @ " + VanaHour + ":" + VanaMin;
	}
	return dateVanaObject;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves Day to Day Schedules
function getDayToDaySchedule()  {
	var now = new Date();
	var timeDiff = now.getTime() - moonDate.getTime();
	var weekStart = 0;
	var dayStart = 0;
	var repeatCal = 10;
	var startTime = 0;
	var endTime = 0;
	var outContainer = new Array();
	var moon = getMoonInfo(now);
	var day = getDayInfo(now);
	var selectDay = "all";
	var selectMoon = "all";
	
	if (timeDiff < 0) {
		weekStart = now.getTime() - (8 * msGameDay + (timeDiff % (8 * msGameDay)));
		dayStart = now.getTime() - (msGameDay + (timeDiff % msGameDay));
	} else {
		// Determines the earth time at the start of the current Vana'diel week (Firesday)
		weekStart = now.getTime() - (timeDiff % (8 * msGameDay));
		// Determines the earth time at the start of the current Vana'diel day
		dayStart = now.getTime() - (timeDiff % msGameDay);
	}
	
	var i = 0;
	startTime = dayStart;
	while (i < repeatCal) {
		endTime = startTime + msGameDay;
		moon = getMoonInfo(startTime);
		day = getDayInfo(startTime);
		if ((selectMoon == moon.phase || selectMoon == "all") && (selectDay == day.name || selectDay == "all")) {
			// Array: Day Colour, Day Name, Earth Start Time, Earth End Time, Moon Color, Moon Name, Moon Percent
			outContainer[i] = new Array();
			outContainer[i][0] = dayColorArray[day.index];
			outContainer[i][1] = day.name;
			outContainer[i][2] = formatDateEarth(startTime, 5);
			outContainer[i][3] = formatDateEarth(endTime, 5);
			outContainer[i][4] = moon.colorSet;
			outContainer[i][5] = moon.name;
			outContainer[i][6] = moon.percent;
		}
		startTime += msGameDay;
		i++;
	}
	outContainer[0][7] = repeatCal;
	return outContainer;
}
// Retrieves Moon Phase
function getMoonInfo(now) {
	var moonDays = 0;
	var moon = new Object();
	
	moonDays = (Math.floor((now - moonDate.getTime()) / msGameDay))  % 84;
	
	if (moonDays < 0){
		moonDays = 84 + moonDays;
	}
	
	moonpercent = - Math.round((42 - moonDays) / 42 * 100);
	
	if (moonpercent >= -10 && moonpercent <= 5)  {
		moon.phase = "NewMoon";
		moon.shortName = "NM";
		moon.name = moonPhaseArray[4];
		moon.colorSet = "colorred";
	} else if (moonpercent > 5 && moonpercent < 40) {
		moon.phase = "WXC";
		moon.shortName = "WXC";
		moon.name = moonPhaseArray[5];
		moon.colorSet = "colorblack";
	} else if (moonpercent >= 40 && moonpercent <= 55) {
		moon.phase = "FQM";
		moon.shortName = "FQM";
		moon.name = moonPhaseArray[6];
		moon.colorSet = "colorblack";
	} else if (moonpercent > 55 && moonpercent < 90) {
		moon.phase = "WXG";
		moon.shortName = "WXG";
		moon.name = moonPhaseArray[7];
		moon.colorSet = "colorblack";
	} else if (moonpercent >= 90 || moonpercent <= -95)  {
		moon.phase = "FullMoon";
		moon.shortName = "FM";
		moon.name = moonPhaseArray[0];
		moon.colorSet = "colorblue";
	} else if (moonpercent > -95 && moonpercent < -60) {
		moon.phase = "WNG";
		moon.shortName = "WNG";
		moon.name = moonPhaseArray[1];
		moon.colorSet = "colorblack";
	} else if (moonpercent >= -60 && moonpercent <= -45) {
		moon.phase = "LQM";
		moon.shortName = "LQM";
		moon.name = moonPhaseArray[2];
		moon.colorSet = "colorblack";
	} else if (moonpercent > -45 && moonpercent < -10) {
		moon.phase = "WNC";
		moon.shortName = "WNC";
		moon.name = moonPhaseArray[3];
		moon.colorSet = "colorblack";
	}
	moon.percent = Math.abs(moonpercent);
	return moon;
}
// Retrives the Day Info
function getDayInfo(now) {
	var timeDiff = now - moonDate.getTime();
	var day = new Object();
	
	if (timeDiff < 0) {
		weekStart = now - (8 * msGameDay + (timeDiff % (8 * msGameDay)));
		dayStart = now - (msGameDay + (timeDiff % msGameDay));
	} else {
		// Determines the earth time at the start of the current Vana'diel week (Firesday)
		weekStart = now - (timeDiff % (8 * msGameDay));
		// Determines the earth time at the start of the current Vana'diel day
		dayStart = now - (timeDiff % msGameDay);
	}
	
	// Determines how many days have passed since Firesday
	dayOffset = (dayStart - weekStart) / msGameDay - 2;
	if (dayOffset < 0) {
		dayOffset += 8;
	}
	
	day.index = dayOffset;
	day.name = vanaDayArray[dayOffset];
	return day;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves the Airship Schedules
function getAirshipSchedule()  {
	var airTimesObject = new Object();
	var timenow = new Date();
	var localTime = timenow.getTime();
	var elapsedTime = (localTime - baseDate.getTime()) % msGameDay;
	var dayStart = localTime - elapsedTime;
	
	vanaDate =  ((898 * 360 + 30) * msRealDay) + (localTime - baseDate.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
	
	objectAtBast = getAirHelper(elapsedTime, offset1, vDay);			// At Bastok
	objectAtBastJ = getAirHelper(elapsedTime, offset3, vDay);			// At Jeuno
	objectAtSand = getAirHelper(elapsedTime, offset3, vDay);			// At Sandy
	objectAtSandJ = getAirHelper(elapsedTime, offset1, vDay);			// At Jeuno
	objectAtWind = getAirHelper(elapsedTime, offset5, vDay);			// At Windy
	objectAtWindJ = getAirHelper(elapsedTime, offset2, vDay);			// At Jeuno
	objectAtKazh = getAirHelper(elapsedTime, offset2, vDay);			// At Kazham
	objectAtKazhJ = getAirHelper(elapsedTime, offset4, vDay);			// At Jeuno
	
	airTimesObject.airshipA = getAirshipStatus(objectAtBast.totalSecondsFromTakeoffTillDeparture, objectAtBast.status, "Bastok", objectAtBastJ.totalSecondsFromTakeoffTillDeparture, objectAtBastJ.status, "Jeuno");
	airTimesObject.airshipB = getAirshipStatus(objectAtSand.totalSecondsFromTakeoffTillDeparture, objectAtSand.status, "San d'Oria", objectAtSandJ.totalSecondsFromTakeoffTillDeparture, objectAtSandJ.status, "Jeuno");
	airTimesObject.airshipC = getAirshipStatus(objectAtWind.totalSecondsFromTakeoffTillDeparture, objectAtWind.status, "Windurst", objectAtWindJ.totalSecondsFromTakeoffTillDeparture, objectAtWindJ.status, "Jeuno");
	airTimesObject.airshipD = getAirshipStatus(objectAtKazh.totalSecondsFromTakeoffTillDeparture, objectAtKazh.status, "Kazham", objectAtKazhJ.totalSecondsFromTakeoffTillDeparture, objectAtKazhJ.status, "Jeuno");
	
	airTimesObject.AtBast = objectAtBast.formattedText + objectAtBast.formattedTime;			// Time At Bastok
	airTimesObject.AtBastJ = objectAtBastJ.formattedText + objectAtBastJ.formattedTime;			// Time At Jeuno
	airTimesObject.AtSand = objectAtSand.formattedText + objectAtSand.formattedTime;			// Time At Sandy
	airTimesObject.AtSandJ = objectAtSandJ.formattedText + objectAtSandJ.formattedTime;			// Time At Jeuno
	airTimesObject.AtWind = objectAtWind.formattedText + objectAtWind.formattedTime;			// Time At Windy
	airTimesObject.AtWindJ = objectAtWindJ.formattedText + objectAtWindJ.formattedTime;			// Time At Jeuno
	airTimesObject.AtKazh = objectAtKazh.formattedText + objectAtKazh.formattedTime;			// Time At Kazham
	airTimesObject.AtKazhJ = objectAtKazhJ.formattedText + objectAtKazhJ.formattedTime;			// Time At Jeuno
	return airTimesObject;
}
// Returns the AirShip Formatted Text String
function getAirHelper(elapsed, offset, day)  {
	var newOffset = offset;
	var count = 0;
	while (newOffset < elapsed)  {
		count += 1;
		newOffset += (msGameDay / 4);
	}
	if (count >= 4)  {
		day = (day + 1) % 8;
	}
	
	output = formatCountdown(newOffset - elapsed);
	return output;
}
// Returns AirShip Arrival and Departure Times
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 formattedObject = new Object();
	formattedObject.formattedTime = '';
	formattedObject.formattedText = '';
	
	dayLeft = Math.floor(dayLeft);
	hourLeft = Math.floor(hourLeft);
	minLeft = Math.floor(minLeft);
	
	formattedObject.totalSecondsFromTakeoffTillDeparture = secLeft + (minLeft * 60) + (hourLeft * 60 * 60) + (dayLeft * 24 * 60 * 60);
	if (formattedObject.totalSecondsFromTakeoffTillDeparture > 144) {
		// Set text to 'Arrives in' and subtract the 144 seconds to get true time
		dayLeft = (varTime - 144000) / msRealDay;
		hourLeft = (dayLeft - Math.floor(dayLeft)) * 24;
		minLeft = (hourLeft - Math.floor(hourLeft)) * 60;
		secLeft = Math.floor((minLeft - Math.floor(minLeft)) * 60);
		dayLeft = Math.floor(dayLeft);
		hourLeft = Math.floor(hourLeft);
		minLeft = Math.floor(minLeft);
		formattedObject.formattedText = 'Arrives in ';
		formattedObject.status = "0";
	} else {
		// Set text to 'Departs in' and just output the time
		formattedObject.formattedText = 'Departs in ';
		formattedObject.status = "1";
	}
	
	if (minLeft < 10) {minLeft = '0' + minLeft;}
	if (secLeft < 10) {secLeft = '0' + secLeft;}
	
	if (dayLeft > 0) {
		formattedObject.formattedTime = dayLeft + ':';
		if (hourLeft < 10) {
			formattedObject.formattedTime = formattedObject.formattedTime + '0' + hourLeft + ':';
		} else {
			formattedObject.formattedTime = formattedObject.formattedTime + hourLeft + ':';
		}         
	} else if (hourLeft > 0) {
		formattedObject.formattedTime = hourLeft + ':';
	}
	
	formattedObject.formattedTime = formattedObject.formattedTime + minLeft + ':' + secLeft;
	return formattedObject;
}
// Returns the AirShip Status Information as a Text String
function getAirshipStatus(secC, statusC, countryC, secJ, statusJ, countryJ) {
	var textStringOutput = '';
	var textDocked = 'Docked at ';
	var textEnroute = 'En Route to ';
	if (secC > secJ) {
		// countryJ will be used because airship is heading towards countryJ
		if (statusJ == "0") {
			textStringOutput = textEnroute + countryJ + " ->";
		} else if (statusJ == "1") {
			textStringOutput = textDocked + countryJ;
		} else {
			textStringOutput = "Updating...";
		}
	} else if (secC < secJ) {
		// countryC will be used because airship is heading towards countryC
		if (statusC == "0") {
			textStringOutput = "<- " + textEnroute + countryC;
		} else if (statusC == "1") {
			textStringOutput = textDocked + countryC;
		} else {
			textStringOutput = "Updating...";
		}
	} else {
		// error section, this will never happen
		textStringOutput = 'Updating...';
	}
	return textStringOutput;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves the Ferry Schedules (Selbina & Mhaura Schedules)
function getFerrySchedule()  {
	// Arrives & Departs
	// 6:30      8:00
	// 14:30     16:00
	// 22:30     0:00
	// -> 216 Seconds Docked
	var out = new Array();
	var now = new Date();
	var timeDiff = now.getTime() - baseDate.getTime();
	var hours = Math.floor((timeDiff / ( msGameDay / 3)) % 3);
	var timeLeft = (msGameDay / 3 ) - (timeDiff % (msGameDay / 3));
	var repeatFerry = 3;
	
	vanaDate =  ((898 * 360 + 30) * msRealDay) + (timeDiff) * 25;
	vDay  = Math.floor((vanaDate % (8 * msRealDay)) / (msRealDay));
	
	for ( i = 0; i < repeatFerry; i++) {
		timeLeftLoop = timeLeft + ( i * msGameDay / 3);
		dPos = (vDay + Math.floor((hours + 1 + i)/3)) % 8;
		dPos2 = (dPos + boatDayOffsetArray[(hours + i) % 3]) % 8;
		out[i] = formatCountdownFerry(timeLeftLoop, dayColorArray[dPos2], vanaDayArray[dPos2], boatSchedule2Array[(hours + i) % 3], dayColorArray[dPos], vanaDayArray[dPos], boatScheduleArray[(hours + i) % 3], i);
	}
	return out;
}
// Returns Ferry Arrival and Departure Times (216 Second Docked)
function formatCountdownFerry(varTime, dayArrivalColor, dayArrivalVana, ferryArrivalVST, dayDepartureColor, dayDepartureVana, ferryDepartureVST, rowPlace) {
	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 formattedObject = new Object();
	formattedObject.formattedTime = '';
	formattedObject.formattedText = '';
	
	dayLeft = Math.floor(dayLeft);
	hourLeft = Math.floor(hourLeft);
	minLeft = Math.floor(minLeft);
	
	formattedObject.totalSecondsFromTakeoffTillDeparture = secLeft + (minLeft * 60) + (hourLeft * 60 * 60) + (dayLeft * 24 * 60 * 60);
	if (formattedObject.totalSecondsFromTakeoffTillDeparture > 216) {
		// Set text to 'Arrives in' and subtract the 216 seconds to get true time
		arrivalTime = varTime - 216000;
		if (arrivalTime <= 0) {
			arrivalTime = 0;
		}
		dayLeft = arrivalTime / msRealDay;
		hourLeft = (dayLeft - Math.floor(dayLeft)) * 24;
		minLeft = (hourLeft - Math.floor(hourLeft)) * 60;
		secLeft = Math.floor((minLeft - Math.floor(minLeft)) * 60);
		dayLeft = Math.floor(dayLeft);
		hourLeft = Math.floor(hourLeft);
		minLeft = Math.floor(minLeft);
		formattedObject.formattedText = 'Arrives in ';
		if (rowPlace == 0) {
			formattedObject.status = "En Route";
		} else {
			formattedObject.status = "Future Arrival";
		}
		formattedObject.vanaFerryColor = dayArrivalColor
		formattedObject.vanaFerryDay = dayArrivalVana;
		formattedObject.vanaFerryTime = ferryArrivalVST;
	} else {
		// Set text to 'Departs in' and just output the time
		formattedObject.formattedText = 'Departs in ';
		formattedObject.status = "Docked";
		formattedObject.vanaFerryColor = dayDepartureColor;
		formattedObject.vanaFerryDay = dayDepartureVana;
		formattedObject.vanaFerryTime = ferryDepartureVST;
	}
	
	if (minLeft < 10) {minLeft = '0' + minLeft;}
	if (secLeft < 10) {secLeft = '0' + secLeft;}
	
	if (dayLeft > 0) {
		formattedObject.formattedTime = dayLeft + ':';
		if (hourLeft < 10) {
			formattedObject.formattedTime = formattedObject.formattedTime + '0' + hourLeft + ':';
		} else {
			formattedObject.formattedTime = formattedObject.formattedTime + hourLeft + ':';
		}         
	} else if (hourLeft > 0) {
		formattedObject.formattedTime = hourLeft + ':';
	}
	
	formattedObject.formattedTime = formattedObject.formattedTime + minLeft + ':' + secLeft + " ET (" + formattedObject.vanaFerryTime + " VT)";
	return formattedObject;
}
// Retrieves the Ferry Schedules (Mhaura & Aht Urhgan)
function getFerryScheduleAht()  {
	// Arrives & Departs
	// 2:30      4:00
	// 10:30     12:00
	// 18:30     20:00
	// -> 216 Seconds Docked
	var out = new Array();
	var now = new Date();	// Get Current Date
	var timeDiff = now.getTime() - baseDateAht.getTime();	// Find MS from Base to Now
	var hours = Math.floor((timeDiff / ( msGameDay / 3)) % 3);
	var timeLeft = (msGameDay / 3 ) - (timeDiff % (msGameDay / 3));	// Subtract 1152000 from timeDiff until whole can't be removed, time left in 3rd day
	var repeatFerry = 3;
	
	vanaDate =  ((898 * 360 + 30) * msRealDay) + (timeDiff) * 25;
	vDay  = Math.floor((vanaDate % (8 * msRealDay)) / (msRealDay));
	
	for ( i = 0; i < repeatFerry; i++) {
		timeLeftLoop = timeLeft + ( i * msGameDay / 3);
		dPos = (vDay + Math.floor((hours + 1 + i)/3)) % 8;
		dPos2 = (dPos + boatDayOffsetArray[(hours + i) % 3]) % 8;
		out[i] = formatCountdownFerry(timeLeftLoop, dayColorArray[dPos2], vanaDayArray[dPos2], boatSchedule2ArrayAht[(hours + i) % 3], dayColorArray[dPos], vanaDayArray[dPos], boatScheduleArrayAht[(hours + i) % 3], i);
	}
	return out;
}

// Retrieves the Ferry Schedules (Aht Urhgan & Nashmau)
function getFerryScheduleNash()  {
	// Arrives & Departs
	// 5:00      8:00
	// 13:00     16:00
	// 21:00     0:00
	// -> 216 Seconds Docked
	var out = new Array();
	var now = new Date();	// Get Current Date
	var timeDiff = now.getTime() - baseDate.getTime();	// Find MS from Base to Now
	var hours = Math.floor((timeDiff / ( msGameDay / 3)) % 3);
	var timeLeft = (msGameDay / 3 ) - (timeDiff % (msGameDay / 3));	// Subtract 1152000 from timeDiff until whole can't be removed, time left in 3rd day
	var repeatFerry = 3;
	
	vanaDate =  ((898 * 360 + 30) * msRealDay) + (timeDiff) * 25;
	vDay  = Math.floor((vanaDate % (8 * msRealDay)) / (msRealDay));
	
	for ( i = 0; i < repeatFerry; i++) {
		timeLeftLoop = timeLeft + ( i * msGameDay / 3);
		dPos = (vDay + Math.floor((hours + 1 + i)/3)) % 8;
		dPos2 = (dPos + boatDayOffsetArray[(hours + i) % 3]) % 8;
		out[i] = formatCountdownFerryNash(timeLeftLoop, dayColorArray[dPos2], vanaDayArray[dPos2], boatSchedule2ArrayNash[(hours + i) % 3], dayColorArray[dPos], vanaDayArray[dPos], boatScheduleArrayNash[(hours + i) % 3], i);
	}
	return out;
}
// Returns Ferry Arrival and Departure Times (432 Second Docked)
function formatCountdownFerryNash(varTime, dayArrivalColor, dayArrivalVana, ferryArrivalVST, dayDepartureColor, dayDepartureVana, ferryDepartureVST, rowPlace) {
	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 formattedObject = new Object();
	formattedObject.formattedTime = '';
	formattedObject.formattedText = '';
	
	dayLeft = Math.floor(dayLeft);
	hourLeft = Math.floor(hourLeft);
	minLeft = Math.floor(minLeft);
	
	formattedObject.totalSecondsFromTakeoffTillDeparture = secLeft + (minLeft * 60) + (hourLeft * 60 * 60) + (dayLeft * 24 * 60 * 60);
	if (formattedObject.totalSecondsFromTakeoffTillDeparture > 432) {
		// Set text to 'Arrives in' and subtract the 216 seconds to get true time
		arrivalTime = varTime - 432000;
		if (arrivalTime <= 0) {
			arrivalTime = 0;
		}
		dayLeft = arrivalTime / msRealDay;
		hourLeft = (dayLeft - Math.floor(dayLeft)) * 24;
		minLeft = (hourLeft - Math.floor(hourLeft)) * 60;
		secLeft = Math.floor((minLeft - Math.floor(minLeft)) * 60);
		dayLeft = Math.floor(dayLeft);
		hourLeft = Math.floor(hourLeft);
		minLeft = Math.floor(minLeft);
		formattedObject.formattedText = 'Arrives in ';
		if (rowPlace == 0) {
			formattedObject.status = "En Route";
		} else {
			formattedObject.status = "Future Arrival";
		}
		formattedObject.vanaFerryColor = dayArrivalColor
		formattedObject.vanaFerryDay = dayArrivalVana;
		formattedObject.vanaFerryTime = ferryArrivalVST;
	} else {
		// Set text to 'Departs in' and just output the time
		formattedObject.formattedText = 'Departs in ';
		formattedObject.status = "Docked";
		formattedObject.vanaFerryColor = dayDepartureColor;
		formattedObject.vanaFerryDay = dayDepartureVana;
		formattedObject.vanaFerryTime = ferryDepartureVST;
	}
	
	if (minLeft < 10) {minLeft = '0' + minLeft;}
	if (secLeft < 10) {secLeft = '0' + secLeft;}
	
	if (dayLeft > 0) {
		formattedObject.formattedTime = dayLeft + ':';
		if (hourLeft < 10) {
			formattedObject.formattedTime = formattedObject.formattedTime + '0' + hourLeft + ':';
		} else {
			formattedObject.formattedTime = formattedObject.formattedTime + hourLeft + ':';
		}         
	} else if (hourLeft > 0) {
		formattedObject.formattedTime = hourLeft + ':';
	}
	
	formattedObject.formattedTime = formattedObject.formattedTime + minLeft + ':' + secLeft + " ET (" + formattedObject.vanaFerryTime + " VT)";
	return formattedObject;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves the Guild Business Hours
function getGuildSchedule() {
	var currentVanaTimeObject = getVanadielTime(1);
	var hour = currentVanaTimeObject.hour;
	var minute = currentVanaTimeObject.minute;
	var element = currentVanaTimeObject.element;
	var totalMinutes = (hour * 60) + minute;
	
	guildObject.fishingStatus = getGuildStatus(element, guildObject.fishingHoliday, totalMinutes, guildObject.fishingLow, guildObject.fishingHigh, 1);
	guildObject.woodworkingStatus = getGuildStatus(element, guildObject.woodworkingHoliday, totalMinutes, guildObject.woodworkingLow, guildObject.woodworkingHigh, 1);
	guildObject.smithingStatus = getGuildStatus(element, guildObject.smithingHoliday, totalMinutes, guildObject.smithingLow, guildObject.smithingHigh, 1);
	guildObject.goldsmithingStatus = getGuildStatus(element, guildObject.goldsmithingHoliday, totalMinutes, guildObject.goldsmithingLow, guildObject.goldsmithingHigh, 1);
	guildObject.clothcraftStatus = getGuildStatus(element, guildObject.clothcraftHoliday, totalMinutes, guildObject.clothcraftLow, guildObject.clothcraftHigh, 1);
	guildObject.leathercraftStatus = getGuildStatus(element, guildObject.leathercraftHoliday, totalMinutes, guildObject.leathercraftLow, guildObject.leathercraftHigh, 1);
	guildObject.bonecraftStatus = getGuildStatus(element, guildObject.bonecraftHoliday, totalMinutes, guildObject.bonecraftLow, guildObject.bonecraftHigh, 1);
	guildObject.alchemyStatus = getGuildStatus(element, guildObject.alchemyHoliday, totalMinutes, guildObject.alchemyLow, guildObject.alchemyHigh, 1);
	guildObject.cookingStatus = getGuildStatus(element, guildObject.cookingHoliday, totalMinutes, guildObject.cookingLow, guildObject.cookingHigh, 1);
	
	guildObject.fishingColor = getGuildStatus(element, guildObject.fishingHoliday, totalMinutes, guildObject.fishingLow, guildObject.fishingHigh, 3);
	guildObject.woodworkingColor = getGuildStatus(element, guildObject.woodworkingHoliday, totalMinutes, guildObject.woodworkingLow, guildObject.woodworkingHigh, 3);
	guildObject.smithingColor = getGuildStatus(element, guildObject.smithingHoliday, totalMinutes, guildObject.smithingLow, guildObject.smithingHigh, 3);
	guildObject.goldsmithingColor = getGuildStatus(element, guildObject.goldsmithingHoliday, totalMinutes, guildObject.goldsmithingLow, guildObject.goldsmithingHigh, 3);
	guildObject.clothcraftColor = getGuildStatus(element, guildObject.clothcraftHoliday, totalMinutes, guildObject.clothcraftLow, guildObject.clothcraftHigh, 3);
	guildObject.leathercraftColor = getGuildStatus(element, guildObject.leathercraftHoliday, totalMinutes, guildObject.leathercraftLow, guildObject.leathercraftHigh, 3);
	guildObject.bonecraftColor = getGuildStatus(element, guildObject.bonecraftHoliday, totalMinutes, guildObject.bonecraftLow, guildObject.bonecraftHigh, 3);
	guildObject.alchemyColor = getGuildStatus(element, guildObject.alchemyHoliday, totalMinutes, guildObject.alchemyLow, guildObject.alchemyHigh, 3);
	guildObject.cookingColor = getGuildStatus(element, guildObject.cookingHoliday, totalMinutes, guildObject.cookingLow, guildObject.cookingHigh, 3);
	
	guildObject.fishingClose = getGuildStatus(element, guildObject.fishingHoliday, totalMinutes, guildObject.fishingLow, guildObject.fishingHigh, 2);
	guildObject.woodworkingClose = getGuildStatus(element, guildObject.woodworkingHoliday, totalMinutes, guildObject.woodworkingLow, guildObject.woodworkingHigh, 2);
	guildObject.smithingClose = getGuildStatus(element, guildObject.smithingHoliday, totalMinutes, guildObject.smithingLow, guildObject.smithingHigh, 2);
	guildObject.goldsmithingClose = getGuildStatus(element, guildObject.goldsmithingHoliday, totalMinutes, guildObject.goldsmithingLow, guildObject.goldsmithingHigh, 2);
	guildObject.clothcraftClose = getGuildStatus(element, guildObject.clothcraftHoliday, totalMinutes, guildObject.clothcraftLow, guildObject.clothcraftHigh, 2);
	guildObject.leathercraftClose = getGuildStatus(element, guildObject.leathercraftHoliday, totalMinutes, guildObject.leathercraftLow, guildObject.leathercraftHigh, 2);
	guildObject.bonecraftClose = getGuildStatus(element, guildObject.bonecraftHoliday, totalMinutes, guildObject.bonecraftLow, guildObject.bonecraftHigh, 2);
	guildObject.alchemyClose = getGuildStatus(element, guildObject.alchemyHoliday, totalMinutes, guildObject.alchemyLow, guildObject.alchemyHigh, 2);
	guildObject.cookingClose = getGuildStatus(element, guildObject.cookingHoliday, totalMinutes, guildObject.cookingLow, guildObject.cookingHigh, 2);
}
// Returns Guild Status
function getGuildStatus(element, holiday, totalminutes, low, high, selector) {
	var statusTxtTmp = "";
	if (selector == 1) {
		if (holiday == element) {
			statusTxtTmp = "Closed for Holiday";
		} else if ((totalminutes >= low) && (totalminutes < high)) {
			statusTxtTmp = "Guild Open";
		} else {
			statusTxtTmp = "Closed for Restock";
		}
	} else if (selector == 2) {
		if (holiday == element) {
			statusTxtTmp = "-";
		} else if ((totalminutes >= low) && (totalminutes < high)) {
			var tmpDifference = high - totalminutes;
			var tmpHourLeft = Math.floor(tmpDifference / 60);
			var tmpMinLeft = tmpDifference - (tmpHourLeft * 60);
			if (tmpMinLeft < 10) {
				tmpMinLeft = "0" + tmpMinLeft;
			}
			statusTxtTmp = convertVTtoET(tmpDifference) + " ET " + "(" + tmpHourLeft + ":" + tmpMinLeft + " VT)";
		} else {
			statusTxtTmp = "-";
		}
	} else if (selector == 3) {
		if (holiday == element) {
			statusTxtTmp = "colorred";
		} else if ((totalminutes >= low) && (totalminutes < high)) {
			statusTxtTmp = "colorblue";
		} else {
			statusTxtTmp = "colorred";
		}
	}
	return statusTxtTmp;
}
// Converts Vanadiel Time (Hr & Min) into Earth Time Remaining
function convertVTtoET(vtmin) {
	var minET = 0;
	var msET = Math.floor((vtmin * 60 * 1000) / 25);
	var secET = Math.floor(msET / 1000);
	if (secET > 59) {
		minET = Math.floor(secET / 60);
		secET = Math.floor(secET % 60);
	}
	if (secET < 10) {
		secET = "0" + secET;
	}
	return minET + ":" + secET;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves the Ballista Schedules
function getBallistaSchedule() {
	var balObject = new Object();
	var ballistaCTime = getVanadielTime(1);
	var year = ballistaCTime.year;
	var month = ballistaCTime.month;
	var day = ballistaCTime.day;
	var hour = ballistaCTime.hour;
	var minute = ballistaCTime.minute;
	balObject.list = new Array();
	var yearPad = "";
	var monthPad = "";
	var dayPad = "";
	var imageTmp = "";
	
	// Get the Latest Ballista Match Info
	if ((day % 2) == 1) {
		tmpMin = (hour*60) + minute;
		if (tmpMin <= 251) {									// 0:00-4:11 OR 0-251
			balObject.status = "(0:00 - 4:11) Ranking and Awards Registration for Previous Ballista Match";
		} else if ((tmpMin >= 252) && (tmpMin <= 719)) {			// 4:12-11:59 OR 252-719
			balObject.status = "(4:12 - 11:59) Awards Presentation for Previous Ballista Match";
		} else if ((tmpMin >= 720) && (tmpMin <= 1319)) {		// 12:00-21:59 OR 720-1319
			tmpStats = getBallistaData((day+1)/2);
			if (tmpStats.ballistaVS == "SvB") {
				imageTmp = "San d'Oria vs Bastok";
			} else if (tmpStats.ballistaVS == "BvW") {
				imageTmp = "Bastok vs Windurst";
			} else if (tmpStats.ballistaVS == "WvS") {
				imageTmp = "Windurst vs San d'Oria";
			}
			balObject.status = "(12:00 - 21:59) Ballista Registration Period for Level " + tmpStats.ballistaLevel + " " + imageTmp + " at " + tmpStats.ballistaLocation;
		} else if (tmpMin >= 1320) {							// 22:00-23:59 OR 1320-1439
			tmpStats = getBallistaData((day+1)/2);
			if (tmpStats.ballistaVS == "SvB") {
				imageTmp = "San d'Oria vs Bastok";
			} else if (tmpStats.ballistaVS == "BvW") {
				imageTmp = "Bastok vs Windurst";
			} else if (tmpStats.ballistaVS == "WvS") {
				imageTmp = "Windurst vs San d'Oria";
			}
			balObject.status = "(22:00 - 23:59) Ballista Closing Ceremonies for Level " + tmpStats.ballistaLevel + " " + imageTmp + " at " + tmpStats.ballistaLocation;
		}
	} else if ((day % 2) == 0) {
		tmpStats = getBallistaData(day/2);
		if (tmpStats.ballistaVS == "SvB") {
			imageTmp = "San d'Oria vs Bastok";
		} else if (tmpStats.ballistaVS == "BvW") {
			imageTmp = "Bastok vs Windurst";
		} else if (tmpStats.ballistaVS == "WvS") {
			imageTmp = "Windurst vs San d'Oria";
		}
		balObject.status = "(0:00 - 23:59) Ballista Match in Progress for Level " + tmpStats.ballistaLevel + " " + imageTmp + " at " + tmpStats.ballistaLocation;
	} else {
		balObject.status = "Updating...";
	}
	
	// Get the Ballista List Info
	for (var x = 0; x < 10; x++) {
		balObject.list[x] = new Array();	// For each row
		balObject.list[x][3] = new Array();		// For expanded Versus
		// Advance to the next even day
		if ((day % 2) == 1) {
			// Add 1 to day and calc
			day = day + 1;
		} else if ((day % 2) == 0) {
			// Add 2 to day and calc
			day = day + 2;
			if (day > 30) {
				day = 2;
				month = month + 1;
				if (month > 12) {
					month = 1;
					year = year + 1;
				}
			}
		} else {
			// Error Catch, it should never get here.
			day = 2;
		}
		// Vanadiel Date Padding
		if (year < 1000) {yearPad = "0" + year;} else {yearPad = year;}
		if (month  < 10) {monthPad = "0" + month;} else {monthPad = month;}
		if (day < 10) {dayPad = "0" + day;} else {dayPad = day;}
		// Get the Ballista Info Object
		ballistaDatatmp = getBallistaData(day/2);
		if (ballistaDatatmp.ballistaVS == "SvB") {
			balObject.list[x][3][0] = "S";
			balObject.list[x][3][1] = "B";
		} else if (ballistaDatatmp.ballistaVS == "BvW") {
			balObject.list[x][3][0] = "B";
			balObject.list[x][3][1] = "W";
		} else if (ballistaDatatmp.ballistaVS == "WvS") {
			balObject.list[x][3][0] = "W";
			balObject.list[x][3][1] = "S";
		}
		// Output HTML String
		balObject.list[x][0] = monthPad + "-" + dayPad + "-" + yearPad;
		balObject.list[x][1] = getEarthTimeFromVanadielTime(year,month,day);
		balObject.list[x][2] = ballistaDatatmp.ballistaLevel;
		balObject.list[x][4] = ballistaDatatmp.ballistaLocation;
		balObject.list[x][5] = ballistaDatatmp.ballistaEntryFee;
	}
	return balObject;
}
// Vana'diel to Earth Time Converter, finds earth time at start of vana day assuming 0:00 vana time.
function getEarthTimeFromVanadielTime(setVanaYear, setVanaMonth, setVanaDay) {
	var vanaToEarthMS = ((((setVanaYear*360)+((setVanaMonth-1)*30)+(setVanaDay-1))*msRealDay)/25) + vost;
	var finalTime = formatDateEarth(vanaToEarthMS, 5);
	return finalTime;
}
// Retrieves Ballista Data from Arrays and returns a Ballista Data Object, Day must be divided by 2 first.
function getBallistaData(dayIndex) {
	var index = dayIndex - 1;
	var ballistaObject = new Object();
	ballistaObject.ballistaLevel = ballistaLevelArray[index];
	ballistaObject.ballistaVS = ballistaVSArray[index];
	ballistaObject.ballistaLocation = ballistaLocationArray[index];
	ballistaObject.ballistaEntryFee = ballistaEntryFeeArray[index];
	return ballistaObject;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Retrieves Brenner Schedules

// -->