/*
	am - an instance of AjaxManager() that allows fetching of XML data
	this component is declared globally and is passed to all the data fetching objects.
	
	AjaxManager() is located in ajaxmanager.js file (must be linked to a document)
	
	In case you're wondering what is the structure of returned objects, answer is it'll exactly match XML nodes names and attributes:
	
	Example: 
		If XML is: <test a="1" b="2">Hello world</test>
		Object would be: obj.a = "1";
						 obj.b = "2";
						 obj.Text = "Hello World";
		
	For multiple siblings it would return an array of objects, for a single node - an object itself (so check for presense of length attribute)
	
*/

//This object is responsible for Picks Data (previously selected and new)
function PicksData(am) {
	var dataObj;
	var thisRef = this;
	this.SelectedPickID;
	this.dataUrl = "/milb/fantasy/bts/games.do?type=milb&team=0&v=2&m=picks";

	//Loads all the picks and triggers follow up function (callBack)
	//This is a mndatory method call that must immediately follow  object declaration
	this.Load = function(callBack) {
		var dataUrl = thisRef.dataUrl;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
			callBack();
		}
	};	
	//Reloads data
	this.Reload = function() {
		delete dataObj;
		thisRef.SelectedPickID = null;
		
		var dataUrl = thisRef.dataUrl;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
		}	
	}	
	//Returns Stats Object
	this.GetStats = function() {
		if(dataObj != null) {
			if(dataObj.stats) {
				return dataObj.stats;
			}
		}
		return null;
	};	
	//Returns lock time
	this.GetLockTime = function() {
		var pTime;
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				var locktime;
				if(dataObj.picks.pick.length) {
					locktime = dataObj.picks.pick[0].locktime;
					pTime = cMil2AmPm(locktime);
				} else {
					locktime = dataObj.picks.pick.locktime;
					pTime = cMil2AmPm(locktime);
				}
			}
		}
		return pTime;
	}
	//returns selected Pick object
	this.GetPick = function(idx) {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				if(dataObj.picks.pick.length) {
					thisRef.SelectedPickID = idx;
					return dataObj.picks.pick[idx];
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick;
				}
			}
		}
		return null;
	};
	//Returns Pick by date
	this.GetPickByDate = function(date) {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				var idx;
				if(dataObj.picks.pick.length) {
					var attName = "gamedate";
					idx = dataObj.picks.pick.indexOf(date,attName);
					if(idx != -1) {
						thisRef.SelectedPickID = idx;
						return dataObj.picks.pick[idx];
					}
					return null;
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick;
				}
			}
		}
		return null;
	};
	//Returns a collection of all picks
	this.GetPicks = function() {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {				
				return dataObj.picks.pick;				
			}
		}
		return null;
	};	
}

///Leagues Data
function LeaguesData(am, date) {
	var dataObj;
	var thisRef = this;
	this.SelectedLeagueID;
	this.date = date;
	this.dataUrl = "/milb/fantasy/bts/games.do?type=milb&team=0&v=2&m=leagues";
	
	//Loads all the league and triggers follow up function (callBack)
	this.Load = function(callBack) {
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.date;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	};	
	//Reloads data
	this.Reload = function() {
		delete dataObj;
		thisRef.SelectedLeagueID = null;
		
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.date;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
		}	
	}	
	
	//Returns a collection of all leagues
	this.GetLeagues = function() {
		if(dataObj != null) {
			if(dataObj.org) {				
				return dataObj.org;				
			}
		}
		return null;
	};	

}

///Teams Data
function TeamsData(am, date, lid) {
	var dataObj;
	var thisRef = this;
	this.SelectedTeamID;
	this.date = date;
	this.lid = lid;
	this.dataUrl = "/milb/fantasy/bts/games.do?type=milb&team=0&v=2&m=teams";

	//Loads all the teams and triggers follow up function (callBack)
	this.Load = function(callBack) {
	
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.date + "&league=" + thisRef.lid;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	};	
	//Reloads data
	this.Reload = function() {
		delete dataObj;
		thisRef.SelectedTeamID = null;
		
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.date;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
		}	
	}	
	

	//returns selected Team object by id
	this.GetTeam = function(id) {
		if(dataObj != null) {
			if(dataObj.gamedate && dataObj.gamedate.team) {
				var idx;
				if(dataObj.gamedate.team.length) {
					idx = dataObj.gamedate.team.indexOf(id, "code");
					if(idx != -1) {
						thisRef.SelectedTeamID = idx;
						return dataObj.gamedate.team[idx];
					} 
					return null;
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.gamedate.team;
				}
			}
		}
		return null;
	};
	
		//returns selected Team object by id
	this.GetOppTeam = function(id) {
		if(dataObj != null) {
			if(dataObj.gamedate && dataObj.gamedate.team) {
				var idx;
				if(dataObj.gamedate.team.length) {
					idx = dataObj.gamedate.team.indexOf(id, "code");
					if(idx != -1) {
						thisRef.SelectedTeamID = idx;
						return dataObj.gamedate.team[idx].opp;
					} 
					return null;
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.gamedate.team.opp;
				}
			}
		}
		return null;
	};
	
	//Returns a collection of all team
	this.GetTeams = function(lid) {
		if(dataObj != null) {
			if(dataObj.gamedate && dataObj.gamedate.team) {				
				return dataObj.gamedate.team;				
			}
		}
		return null;
	};
}

//Players Data
function PlayersData(am, teamId) {
	var dataObj;
	var thisRef = this;
	this.SelectedPlayerID;
	this.teamId = teamId;
    this.dataUrl = "/milb/fantasy/bts/games.do?type=milb&team=0&v=2&m=players";

	//Loads all the players and triggers follow up function (callBack)
	this.Load = function(callBack) {
		var dataUrl = thisRef.dataUrl + "&teamId=" + thisRef.teamId;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	};
	//Reloads data	
	this.Reload = function() {
		delete dataObj;
		thisRef.SelectedPlayerID = null;
				
		var dataUrl = thisRef.dataUrl + "&teamId=" + thisRef.teamId;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
		}	
	}
	//Returns Header
	this.GetHeader = function() {
		if(dataObj != null) {
			if(dataObj.header) {
				return dataObj.header;
			}
		}
		return null;
	}
	//Returns selected player object
	this.GetPlayer = function(id) {
		if(dataObj != null) {
			if(dataObj.team && dataObj.team.player) {
				var idx;
				if(dataObj.team.player.length) {
					idx = dataObj.team.player.indexOf(id, "id");
					if(idx != -1) {
						thisRef.SelectedPlayerID = idx;
						return dataObj.team.player[idx];
					}
					return null;
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.team.player;
				}
			}
		}
		return null;
	};
	//Returns a collection of all players
	this.GetPlayers = function() {
		if(dataObj != null) {
			if(dataObj.team && dataObj.team.player) {				
				return dataObj.team.player;				
			}
		}
		return null;
	};		
}

//Returns Results data (endDate is optional, it sets the last date in the list and 10 positions back from it)
function ResultsData(am, endDate) {
	var dataObj;
	var thisRef = this;
	var dt = new Date();
	this.endDate = (endDate == null || isEmpty(endDate))?dt.toShortDate():endDate;
	this.gameDate;
	this.ScrollDirection;
	this.SelectedPickID;
	this.dataUrl = "/milb/fantasy/bts/games.do?m=results&type=milb&team=0&v=2";

	//Loads all the picks and triggers follow up function (callBack)
	this.Load = function(callBack) {
	
		var dataUrl = thisRef.dataUrl + "&priorTo=" + thisRef.endDate;
		if(am != null) {
			am.method = "POST";
			am.request(dataUrl, loadData);
		}
	
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	};
	
	//Navigates back in time starting the date passed as "date" parameter
	this.ScrollUp = function(date, callBack) {
		delete dataObj;
		thisRef.SelectedPickID = null;
		thisRef.gameDate = date;
		
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.gameDate + "&scroll=up";
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	}
	
	//Navigates forward in time starting the date passed as "date" parameter
	this.ScrollDown = function(date, callBack) {
		delete dataObj;
		thisRef.SelectedPickID = null;
		thisRef.gameDate = date;
		
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.gameDate + "&scroll=down";
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	}
	
	//Reloads data
	this.Reload = function() {
		delete dataObj;
		thisRef.SelectedPickID = null;
		
		var dataUrl = thisRef.dataUrl + thisRef.endDate;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
		}	
	}	
	//Returns Stats Object
	this.GetStats = function() {
		if(dataObj != null) {
			if(dataObj.stats) {
				return dataObj.stats;
			}
		}
		return null;
	};	
	//returns selected Pick object
	this.GetPick = function(idx) {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				if(dataObj.picks.pick.length) {
					thisRef.SelectedPickID = idx;
					return dataObj.picks.pick[idx];
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick;
				}
			}
		}
		return null;
	};
		
	//Returns Pick by date
	this.GetPickByDate = function(date) {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				var idx;
				if(dataObj.picks.pick.length) {
					var attName = "gamedate";
					idx = dataObj.picks.pick.indexOf(date,attName);
					if(idx != -1) {
						thisRef.SelectedPickID = idx;
						return dataObj.picks.pick[idx];
					}
					return null;
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick;
				}
			}
		}
		return null;
	};
	
	//returns first Pick object
	this.GetFirstPick = function() {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				if(dataObj.picks.pick.length) {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick[0];
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick;
				}
			}
		}
		return null;
	};
	
	//returns last Pick object
	this.GetLastPick = function() {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {
				if(dataObj.picks.pick.length) {
					thisRef.SelectedPickID = dataObj.picks.pick.length-1;
					return dataObj.picks.pick[thisRef.SelectedPickID];
				} else {
					thisRef.SelectedPickID = 0;
					return dataObj.picks.pick;
				}
			}
		}
		return null;
	};
	
	//Returns a collection of all picks
	this.GetPicks = function() {
		if(dataObj != null) {
			if(dataObj.picks && dataObj.picks.pick) {				
				return dataObj.picks.pick;				
			}
		}
		return null;
	};	
}

//This object retrieves Stats data associated with results pick
function StatsData(am, date) {
	var dataObj;
	var thisRef = this;
	this.SelectedTeamID;
	this.date = date;
	this.dataUrl = "/milb/fantasy/bts/games.do?m=top_picks&type=milb&team=0&v=2";
	//Loads all the teams and triggers follow up function (callBack)
	this.Load = function(callBack) {
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.date;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			callBack();
		}
	};	
	//Reloads data
	this.Reload = function() {
		delete dataObj;
		thisRef.SelectedTeamID = null;
		
		var dataUrl = thisRef.dataUrl + "&gameDate=" + thisRef.date;
		if(am != null) {
			am.request(dataUrl, loadData);
		}
		function loadData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}			
		}	
	}		
	//Returns a collection of all team
	this.GetStats = function() {
		if(dataObj != null) {
			if(dataObj.top_pick != null) {				
				return dataObj.top_pick;				
			} else {
				return dataObj.top_pick;
			}
		}
		return null;
	};		
}

//This Object handles saving pick selection
function PicksProcessor(am) {	
	am.method = "POST";
	var dataObj;
	var thisRef = this;
	this.gameDate;
	this.playerId;
	this.team = 0;
	
	this.dataUrl = "/milb/fantasy/bts/games.do?v=2&m=make_pick&type=milb";
	//Submits picks for processing
	this.Submit = function(callBack) {
		if(!isEmpty(thisRef.dataUrl)) {
			var dataUrl = thisRef.dataUrl + "&team=" + thisRef.team + "&gameDate=" + thisRef.gameDate + "&pid=" + thisRef.playerId;
			if(am != null) {
				am.method = "POST";				
				am.request(dataUrl, sendData);
			}
		}
		function sendData(xObj) {
			if(xObj.xml != null) {
				var jObj = toJSObject(xObj.xml);
				dataObj = jObj;
				if(dataObj.response) {
					ErrorHandler(dataObj.response);
				}
			}
			am.method = "GET";
			callBack(dataObj);
		}		
	}	
}

//Internal error handler
//This function is being called in cases where XML Request returns error response
function ErrorHandler(response) {
	var code = response.code;
	var type = response.type;
	var content = response.Text;
	
	if(type == "error") {
		switch (parseInt(code)) {
			case -100: //Not logged in
				location.href = content;
				break;
			case -200: //After Lock
				alert(content);
				break;			
			default:
				var msg = "An error has occured, please try again.";  //content
				alert(msg);			
		}
	}
}