/**
 * Tours Schedule Page scripts
 *
 * @Brendan Lynch
 * @1.0
 */

function initSchedule(){
	//var nextYearScheduleReady = true; //Set this manually to "true" when next year's schedule is uploaded, false all other times. Remember to change back to "false" on Jan. 1st.
	var optionYear;
	var nextYearScheduleReady = false;
	scheduleType = (scheduleType == '' || scheduleType == null) ? 'r' : scheduleType;
	scheduleYear = (scheduleYear == '' || scheduleYear == null) ? (new Date().getFullYear()) : scheduleYear;
	scheduleData = function (n) { var num = parseInt(n) || ''; return '/golf/static/xml/leaderboard/' + (parseInt(scheduleYear) + num) + '/schedule/schedule.xml';}
	var currentMonth = new Date().getMonth();
	var nextScheduledYear = new Date().getFullYear() + 1;
	//var nextScheduledYear = (nextScheduledYear == '' || nextScheduledYear == null) ? (new Date().getFullYear() + 1) : nextScheduledYear;
	
	if(currentMonth > 10){ // If current month is December (11), perform AJAX call to check if /leaderboard/[next year]/schedule.xml has been created.
		jQuery.ajax({
			type: 'get', url: scheduleData(1),
			async: false, // To ensure that the data is checked before the drawing of the dropdown
			success: function(){nextYearScheduleReady = true;},
			error: function(){nextYearScheduleReady = false;}
		});
	}
	//console.log(nextYearScheduleReady + "...." + typeof(currentMonth) + "...." + currentMonth)
	var div = document.getElementsByClassName("schedule");
	if (div && scheduleYear && scheduleType) {
		var schedule = new scheduleLoader(div[0], scheduleData(), scheduleType);
	}
	
	var currentYear = new Date().getFullYear();
	
	function createYear (year) {
		optionYear = document.createElement('option');
		optionYear.appendChild(document.createTextNode(year));
		if (year == scheduleYear) {
			optionYear.setAttribute("selected", "selected");
		}
		$('schedule_year').appendChild(optionYear);
	}
	if(nextYearScheduleReady == true || (scheduleYear > currentYear)){
		createYear(nextScheduledYear);
	}
	
	for (var i = currentYear; i >= 2007; i--) {
		createYear(i);
		/*optionYear = document.createElement('option');
		optionYear.appendChild(document.createTextNode(i));
		if (i == scheduleYear) {
			optionYear.selected = 'selected';
		}
		$('schedule_year').appendChild(optionYear);*/
	}
	
	$('schedule_year').show();
	$('schedule_year').onchange = goToScheduleYear;
}

function goToScheduleYear() {
	var selectedYear = this.options[this.selectedIndex].childNodes[0].nodeValue;
	var newUrl = scheduleUrlPath.replace(',,', ',' + scheduleType + '-' + selectedYear + ',');
	document.location = newUrl;
}

if (typeof Class != "undefined") {
	var scheduleLoader = Class.create();
	scheduleLoader.prototype = {

		divTarget  : null,
		schedType  : null,
		schedData  : null,

		initialize : function(targ, src, type) {
			try {
				this.divTarget = targ;
				this.schedType = type;
				this.getData(src);
			} catch(e) {}

		},

		getData: function (url) {
			if (url) {
				this.xmlHTTP = new Ajax.Request(url, {asynchronous: true, onSuccess: (this.handlerFunc).bindAsEventListener(this), onFailure: (this.errFunc).bindAsEventListener(this), method: "get" });
			}
		},

		handlerFunc: function(t) {
			var monthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
			var currentWeek = t.responseXML.getElementsByTagName("thisWeek")[0];
			var weekNumber = parseInt(currentWeek.getElementsByTagName("date")[0].getAttribute("weeknumber"),10) + 1;
			// please note that times should be ignored
			var startDate = new Date();
			startDate.setFullYear(this.nodeContent(currentWeek.getElementsByTagName("start")[0].getElementsByTagName("yr")[0]),parseInt(this.nodeContent(currentWeek.getElementsByTagName("start")[0].getElementsByTagName("month")[0]),10)-1,this.nodeContent(currentWeek.getElementsByTagName("start")[0].getElementsByTagName("day")[0]));
			startDate.setHours(0);
			startDate.setMinutes(0);
			startDate.setSeconds(0);
			var endDate = new Date();
			endDate.setFullYear(this.nodeContent(currentWeek.getElementsByTagName("end")[0].getElementsByTagName("yr")[0]),parseInt(this.nodeContent(currentWeek.getElementsByTagName("end")[0].getElementsByTagName("month")[0]),10)-1,this.nodeContent(currentWeek.getElementsByTagName("end")[0].getElementsByTagName("day")[0]));
			endDate.setHours(0);
			endDate.setMinutes(0);
			endDate.setSeconds(0);

			// display date heading
			var currentWeekHeading = document.getElementById("lboard-body").getElementsByTagName("div")[0].getElementsByTagName("h2")[0];
			var currentWeekHeadingContent = " (";
			currentWeekHeadingContent += startDate.getDate();
			if (startDate.getMonth() != endDate.getMonth()) {
				currentWeekHeadingContent += " " + monthNames[startDate.getMonth()];
			}
			if (startDate.getFullYear() != endDate.getFullYear()) {
				currentWeekHeadingContent += ", " + startDate.getFullYear();
			}
			currentWeekHeadingContent += " - " + endDate.getDate() + " " + monthNames[endDate.getMonth()] + ", " + endDate.getFullYear() + ")";
			//currentWeekHeading.innerHTML += currentWeekHeadingContent;

			var currentYear = parseInt(t.responseXML.getElementsByTagName("years")[0].getElementsByTagName("year")[0].getAttribute("year"),10);
			var currentYearHeading = document.getElementById("lboard-body").getElementsByTagName("div")[2].getElementsByTagName("h2")[0];
			currentYearHeading.innerHTML = currentYear + " " + currentYearHeading.innerHTML;

			var currentWeekTarget = document.getElementById("lboard-body").getElementsByTagName("div")[1].getElementsByTagName("tbody")[0];

			var completeTourTarget = document.getElementById("lboard-body").getElementsByTagName("div")[3].getElementsByTagName("tbody")[0];

			var tourArray = t.responseXML.getElementsByTagName("tours")[0].getElementsByTagName("tour");
			var tourFound = false;
			var isTrnScored = [];
			for (var i = 0; i < tourArray.length; i++) {
				var tourID = tourArray[i].getAttribute("tourCodeLc");
				if (tourID == this.schedType) {
					// gather data for selected tour type
					tourFound = true;
					this.schedData = [];
					var tournamentArray = tourArray[i].getElementsByTagName("trn");
					for (var j = 0; j < tournamentArray.length; j++) {
						var tArray = tournamentArray[j];
						var tObj = new Object();
						try {
							tObj.tourID = tourID;
							isTrnScored[j] = tArray.getAttribute('scored');
							tObj.tournamentId = tArray.getAttribute("permNum");
							try {
								tObj.purse = parseInt(tArray.getElementsByTagName("Purse")[0].firstChild.nodeValue.split(",").join(""),10);
							} catch(e) {};
							if (tObj.purse == undefined) {
								tObj.purse = null;
							}
							tObj.name = tArray.getElementsByTagName("trnName")[0].getElementsByTagName("medium")[0].firstChild.nodeValue;
							tObj.weekNumber = parseInt(tArray.getElementsByTagName("date")[0].getAttribute("weeknumber"),10);
							tObj.startDate = new Date();
							tObj.startDate.setFullYear(this.nodeContent(tArray.getElementsByTagName("start")[0].getElementsByTagName("yr")[0]),parseInt(this.nodeContent(tArray.getElementsByTagName("start")[0].getElementsByTagName("month")[0]),10)-1,this.nodeContent(tArray.getElementsByTagName("start")[0].getElementsByTagName("day")[0]));
							tObj.startDate.setHours(0);
							tObj.startDate.setMinutes(0);
							tObj.startDate.setSeconds(0);
							tObj.endDate = new Date();
							tObj.endDate.setFullYear(this.nodeContent(tArray.getElementsByTagName("end")[0].getElementsByTagName("yr")[0]),parseInt(this.nodeContent(tArray.getElementsByTagName("end")[0].getElementsByTagName("month")[0]),10)-1,this.nodeContent(tArray.getElementsByTagName("end")[0].getElementsByTagName("day")[0]));
							tObj.endDate.setHours(0);
							tObj.endDate.setMinutes(0);
							tObj.endDate.setSeconds(0);
							
							var trnFormat = tArray.getAttribute('format');
							
							/* TO-DO: TII: Create correct leaderboard URL to insert in link href attributes */
							if(trnFormat == 'Match' && tObj.name == 'WGC-Accenture Match Play Championship') {
								tObj.lboardURL = '/golf/tours_news/leaderboard/wgc-match-play-' + tObj.startDate.getFullYear();
							}														
							else if(trnFormat == 'Match' && tObj.name == 'The Presidents Cup') {
										tObj.lboardURL = '/golf/tours_news/leaderboard/presidents_cup_' + tObj.startDate.getFullYear();

							}
							else if(tObj.name == 'Ryder Cup') {
										tObj.lboardURL = '/golf/tours_news/leaderboard/rydercup_' + tObj.startDate.getFullYear();	

							}
							else if(trnFormat == 'Match') {
								tObj.lboardURL = '/golf/tours_news/leaderboard/match_play';
							}
							else {
                                var lbFolder = tObj.tourID + tObj.startDate.getFullYear() + tObj.tournamentId;
								tObj.lboardURL = "/golf/tours_news/leaderboard/0,28360," + lbFolder + ",00.html?folder=" + lbFolder;
							}
							
							tObj.courseArray = new Array();
							var cDArray = tArray.getElementsByTagName("courses")[0].getElementsByTagName("course");
							for (var c = 0; c < cDArray.length; c++) {
								var cArray = cDArray[c];
								var cObj = new Object();
								try {
									cObj.courseId = cArray.getAttribute("number");
									cObj.name = cArray.getElementsByTagName("courseName")[0].firstChild.nodeValue;
									try {
										cObj.locationState = cArray.getElementsByTagName("state")[0].firstChild.nodeValue;
									} catch(e) {
										cObj.locationState = "";
									}
									cObj.locationCity = cArray.getElementsByTagName("city")[0].firstChild.nodeValue;
									cObj.locationCountry = cArray.getElementsByTagName("country")[0].firstChild.nodeValue;

/* TO-DO: TII: Create correct course URL to insert in link href attributes */
									cObj.courseURL = "#?CID=" + cObj.courseId;

								} catch(e) {};
								tObj.courseArray.push(cObj);
							}
							tObj.networkData = "N/A";
							
							var championNode = tArray.getElementsByTagName("champion")[0];
							
							if (!championNode) {
								tObj.championName = "N/A";
							} else {
								tObj.championId = championNode.getAttribute("plrNum");

/* TO-DO: TII: Create correct course URL to insert in link href attributes */
								tObj.championURL  = "/golf/tours_news/playerdetails/0,28352,"+ tObj.championId +",00.html";

								var champFN;
								var champMN;
								var champLN;
								try {
									champFN = championNode.getElementsByTagName("first")[0].firstChild.nodeValue;
								} catch(e) {
									champFN = "";
								};
								try {
									champMN = championNode.getElementsByTagName("middle")[0].firstChild.nodeValue;
								} catch(e) {
									champMN = "";
								};
								try {
									champLN = championNode.getElementsByTagName("last")[0].firstChild.nodeValue;
								} catch(e) {
									champLN = "";
								};
								tObj.championName = ((champFN) ? champFN : "") + ((champMN) ? " " + champMN + " " : " ") + champLN;
							}
						} catch(e) { /* discard errors */ };
						this.schedData.push(tObj);
					}
					break;
				}
			}
			if (!tourFound) {
				// no data found for tour selected
				var trNode = document.createElement("tr");
				trNode.className = "odd";
				var tdNode = document.createElement("td");
				tdNode.colSpan = 6;
				tdNode.innerHTML = "No schedule is available for the selected tour.";
				trNode.appendChild(tdNode);
				currentWeekTarget.appendChild(trNode);
				var trNode2 = trNode.cloneNode(true);
				completeTourTarget.appendChild(trNode2);
			} else {
				var sdMonth;
				var trNode;
				var tdNode;
				var tdContent;
				var clonedNodeCount = 0;
				var hl = 0;
				var jarr;
				
				var isaMajor = function(x){
					var arr = ['014','026','100','033','468','500'];
					jarr = arr.join(",");
					return jarr.indexOf(x);
				}
				
				
				for (var i = 0; i < this.schedData.length; i++) {
					var sd = this.schedData[i];
					// display month header
					if (sd.startDate.getMonth() != sdMonth) {
						trNode = document.createElement("tr");
						trNode.className = "header";
						tdNode = document.createElement("td");
						tdNode.colSpan = 6;
						tdNode.innerHTML = "<div>" + monthNames[sd.startDate.getMonth()] + "</div>";
						trNode.appendChild(tdNode);
						completeTourTarget.appendChild(trNode);
						hl = 0;
					}
					// display tour data
					trNode = document.createElement("tr");
					trNode.className = (hl % 2 == 0) ? "odd" : "even";
					tdNode = document.createElement("td");
					// figure out dates
					tdContent = sd.startDate.getDate();
					if (sd.startDate.getMonth() != sd.endDate.getMonth()) {
						tdContent += " " + monthNames[sd.startDate.getMonth()];
					}
					tdContent += " - " + sd.endDate.getDate() + " " + monthNames[sd.endDate.getMonth()];
					tdNode.innerHTML = "<p>" + tdContent + "</p>";
					trNode.appendChild(tdNode);
					tdNode = document.createElement("td");
					var defending = '';
					var bHasHappened = true;
						/*
								show a D if it is a defending Champion if the tournament
								has not happend yet this year. This compares the end of
								the current week to the end of the tournament with a day buffer
								getTime is in milliseconds and 86400000 is how many of them in a day
						*/
						if(sd.endDate.getTime() > (endDate.getTime() + 86400000))
						{
						   defending = (sd.name == "The Presidents Cup" || sd.name == "The President's Cup" || sd.name == "Ryder Cup" ) ? '&nbsp;(' + (sd.endDate.getFullYear() -2) + ')' : '&nbsp;(' + (sd.endDate.getFullYear() -1) + ')';
						   bHasHappened = false;
						}
					if (bHasHappened && (tournamentArray[i].getAttribute("scored")>0 || isaMajor(tournamentArray[i].getAttribute("permNum"))>-1)) {
						tdContent = '<p><a href="' + sd.lboardURL + '">' + sd.name + '</a></p>';
					} else {
						tdContent = '<p>' + sd.name + '</p>';
					}
					for (var c = 0; c < sd.courseArray.length; c++) {
						var cd = sd.courseArray[c];
						tdContent += '<p><!--a href="' + cd.courseURL + '"-->' + cd.name + '<!--/a--></p>';
						tdContent += '<p>' + cd.locationCity + ', ' + cd.locationState + ', ' + cd.locationCountry + '</p>';
						tdContent = tdContent.split(", , ").join(", "); // tidy international events
					}
					tdNode.innerHTML = tdContent;
					trNode.appendChild(tdNode);

					trNode.appendChild(tdNode);
					tdNode = document.createElement("td");

					tdNode.innerHTML = (sd.championName.indexOf('N/A') > -1) ? '<p><b>' + sd.championName + defending + '</b></p>' : '<p><a href="' + sd.championURL + '">' + sd.championName + defending + '</a></p>';

					trNode.appendChild(tdNode);
					tdNode = document.createElement("td");
					tdNode.innerHTML = (sd.purse == null) ? "N/A" : "$" + (sd.purse / 1000000) + "M";
					trNode.appendChild(tdNode);
					tdNode = document.createElement("td");
					if (bHasHappened && (tournamentArray[i].getAttribute("scored")>0 || isaMajor(tournamentArray[i].getAttribute("permNum"))>-1)) {
						tdContent = '<p><a href="' + sd.lboardURL + '">Leaderboard</a></p>';
						tdNode.innerHTML = tdContent;
					}
					trNode.appendChild(tdNode);

					// if the tournament is in the current week, copy it to the "This Week" table
					if (sd.weekNumber == weekNumber) {
						var trNode2 = trNode.cloneNode(true);
						if (clonedNodeCount % 2 == 0) {
							trNode2.className = "odd";
						} else {
							trNode2.className = "even";
						}
						currentWeekTarget.appendChild(trNode2);
						clonedNodeCount++;
					}

					completeTourTarget.appendChild(trNode);

					sdMonth = sd.startDate.getMonth();
					hl++;
				}
				// if there are no events this week, notify user
				if (clonedNodeCount == 0) {
					trNode = document.createElement("tr");
					trNode.className = "odd";
					tdNode = document.createElement("td");
					tdNode.colSpan = 6;
					tdNode.innerHTML = "No tournaments are scheduled for this week.";
					trNode.appendChild(tdNode);
					currentWeekTarget.appendChild(trNode);
				}
			}
		},

		errFunc: function(t) {
    		//alert('Error ' + t.status + ' -- ' + t.statusText);
		},

/* Utility functions */
		buildAnchor : function(href, className) {
			var a = document.createElement("a");
			if (href) a.href = href;
			if (className) a.className = className;
			return a;
		},

		buildLI : function(className) {
			var li = document.createElement("li");
			if (className) li.className = className;
			return li;
		},

		nodeContent : function(node) {
			return node.firstChild.nodeValue;
		}
	};
}

Event.observe (window, "load", initSchedule);