var Standings = (function(){
    var bhp = bam.homePath;
 
 
	//Load dependencies
    var _properties = {};
	bam.loadSync(bhp + "bam.datetime.js",
				 bhp + "bam.cookies.js",
				 bhp + "bam.datagrid2.js",
				 bhp + "bam.css.js");
   
	var  //TODAY = bam.datetime.parseYMD(bam.datetime.DateTime(bam.EASTERN_TIME).toYMD());
	TODAY = bam.datetime.DateTime('9/28/2011');
    if(bam.EASTERN_TIME.getHours() < 11) {
	  TODAY.setDate(TODAY.getDate() - 1);
    } 
    var  cache,
	SYS_YEAR = TODAY.getFullYear(),
	DATE = SYS_YEAR + TODAY.formatDate("/MM/dd"),
	TEST_YEAR,
	STARTDATE = bam.datetime.parseYMD(bam.datetime.DateTime("2011/03/31").toYMD()),
	ENDDATE = bam.datetime.parseYMD(bam.datetime.DateTime("2011/09/28").toYMD()),
	PREVIOUS_END = bam.datetime.parseYMD(bam.datetime.DateTime("2010/10/03").toYMD()),
	dp = $('#standingsDaypicker').daypicker({min:STARTDATE.formatDate("yyyy/MM/dd"),max:TODAY.formatDate("yyyy/MM/dd")}),
	STANDINGS_TYPE=['standings_all','standings_spring','standings_wildcard'],
	RESULTS_MAX = 16,
	DEFAULT_TEAM = bam.cookies.get('mlbteamcookie'),
	SEASON_LEAGUES = {
		regular: [103, 104],
		spring: [103, 104, 114, 115]
	},
	LEAGUES = {	AL: 103, NL: 104, CL: 114, GL: 115	},
	DIVISIONS = { 103: { West:200, East:201, Central:202}, //AL
				  104: { West:203, East:204, Central:205}  //NL
	},
	DIVISION_TEAMS = {				
			200: {oak:0,ana:0,sea:0,tex:0},		  		//AL - West
			201: {bos:0,bal:0,nyy:0,tb:0,tor:0}, 		//AL - East
			202: {cws:0,cle:0,det:0,kc:0,"min":0},		//AL - Central
			203: {ari:0,col:0,la:0,sd:0,sf:0},			//NL - West
			204: {was:0,fla:0,nym:0,phi:0,atl:0},		//NL - East
			205: {chc:0,cin:0,hou:0,mil:0,pit:0,stl:0}	//NL - Central
	},
	SHOW_PREFIX_LEGEND = false,
	DIVISION_NAMES = {East:"East", Central:"Central", West:"West", 0:"East", 1:"Central", 2:"West"},
	SEASON_STATUS_URI = "/lookup/json/named.properties_info_events_season.bam?season=%0&sport_code='mlb'&org_id=1",
	SPRING_SEASON_URI = "/lookup/json/named.standings_spring_repeater.bam?" +
					"season=%0&sit_code=%27h0%27&" + $.param({league_id: SEASON_LEAGUES.spring}),
	REGULAR_URI="/lookup/json/named.standings_schedule_date.bam?season=%0&schedule_game_date.game_date='%1'"+
        	     "&sit_code='h0'&league_id=103&league_id=104&all_star_sw='N'&version=2",
	HISTORICAL_URI = "/lookup/json/named.historical_standings_schedule_date.bam?season=%0&game_date='%1'&sit_code='h0'&league_id=103&"+
				  "league_id=104&all_star_sw='N'&version=2",
	SEASON_DATES = "/lookup/json/named.org_history.bam?org_code=%27mlb%27",
	SEASONS,
    CURRENT_SEASON_DATES,
	NO_DATA_MSG = "Data is currently unavailable",
	COMMON_COL_WIDTH = "25px",
	CLUB_PROPS,
	normalizeGameId = function (gameId) {
    	return gameId.replace(/[\-\/]/g, '_');
  	},
	makeGamedayLink = function (id, text) {
    	return '<a href="javascript:void(launchGameday({gid:\'' + id + '\'}));">' + text + '</a>';
  	},
  	makeBoxscoreLink = function(id,text) {
  		return '<a href="/news/boxscore.jsp?gid='+id+'">'+text+'</a>';
  	},
	gameDateDecorator = function (game_id,game_type,text) {
    	if (game_id === null) { return game_id; }
			var id = normalizeGameId(game_id);
	  	if ((game_type === 'S') || (game_type === 'E') ) {
    		return makeBoxscoreLink(id, text);
		} else {
    		return makeGamedayLink(id, text);
		}
  	},
  	gameBoxScoreDecorator = function (game_id,text) {
    	if (game_id === null) { return game_id; }
			var id = normalizeGameId(game_id);
	  		return makeBoxscoreLink(id, text);
	},
	makeYearMenu = function(){
		var menuItems = "";
		for(var i=2011, j=1993; i>j; i--){
			menuItems = menuItems + '<option value="'+i+'">'+i+'</option>';
		}
		$("#standing_year").append(menuItems);
	},
 
	DECORATOR_PREFIX_NAME = function(){	
				var prefixedName = view.setTeamPrefix.apply(this, arguments),
					team_code,
					team_id = this.rawData.team_id, 
					clubUrl;
					if(CLUB_PROPS && (team_id in CLUB_PROPS)) {
					  clubUrl = CLUB_PROPS[team_id].club_common_url;
					  team_code = CLUB_PROPS[team_id].team_code;
					  prefixedName = "<a href=\"http://"+clubUrl+"\" class=\""+team_code+"\">" + prefixedName + "</a>";
				}
				return prefixedName;
			},
	//defautl team title
	COLUMN_TITLE_DEFAULT =[{title: "Wild Card Teams", dataField:"team_short", decorator:DECORATOR_PREFIX_NAME}],
	COLUMN_TITLE_DEFAULT_FULL =[{title: "Wild Card Teams", dataField:"team_full", decorator:DECORATOR_PREFIX_NAME}],
 
	//division titles
	COLUMN_TITLE_LEADERS=[{title: "Division Leaders", dataField:"team_short" ,decorator:DECORATOR_PREFIX_NAME}],
	COLUMN_TITLE_LEADERS_FULL=[{title: "Division Leaders", dataField:"team_full" ,decorator:DECORATOR_PREFIX_NAME}],
 
	//default column definitions
	COLUMN_DEFS = [
		{title: "W", 	 dataField:"w"},
		{title: "L", 	 dataField:"l"},
		{title: "PCT",	 dataField:"pct"},
		{title: "WCGB", 	 dataField:"gb"},
		{title: "WCE #", 	 dataField:"elim"},
		{title: "L10",   dataField:"last_ten"},
		{title: "STRK",  dataField:"streak"},
		{title: "LAST GAME", dataField:"last_game"},
		{title: "NEXT GAME", dataField:"next_game"},
		{title: "wc", 	 visible:false, dataField:"wild_card"},
		{title: "dc", 	 visible:false, dataField:"division_champ"},
		{title: "po", 	 visible:false, dataField:"playoffs_sw"},
		{title: "pl", 	 visible:false, dataField:"playoffs_flag_mlb"}
	],
	COLUMN_DEFS_DEFAULT = {columns: $.merge(COLUMN_TITLE_DEFAULT,COLUMN_DEFS)},
	COLUMN_DEFS_DEFAULT_FULL = {columns: $.merge(COLUMN_TITLE_DEFAULT_FULL,COLUMN_DEFS)},
	
	/* 
	* merge division title defintion with default COLUMN_DEFS 
	* so grid displays East, Central, West 
	*/
	COLUMN_DEFS_LEADERS = {columns: $.merge(COLUMN_TITLE_LEADERS,COLUMN_DEFS)},
	COLUMN_DEFS_LEADERS_FULL = {columns: $.merge(COLUMN_TITLE_LEADERS_FULL,COLUMN_DEFS)},
	
	//base grid
	DATAGRID_BASE = {		
		tableClass:"stats_table data_grid",
		noResultsMessage: NO_DATA_MSG,
		sortable: false,
		columns: COLUMN_DEFS
	},
	
	//generic grid with team title
	DEFAULT_GRID = new bam.datagrid.DataGrid($.extend(DATAGRID_BASE,COLUMN_DEFS_DEFAULT)),
	DEFAULT_GRID_FULL = new bam.datagrid.DataGrid($.extend(DATAGRID_BASE,COLUMN_DEFS_DEFAULT_FULL)),
	
	//division leaders extend base grid with new column definitions
	LEADERS_GRID = new bam.datagrid.DataGrid($.extend(DATAGRID_BASE,COLUMN_DEFS_LEADERS));
	LEADERS_GRID_FULL = new bam.datagrid.DataGrid($.extend(DATAGRID_BASE,COLUMN_DEFS_LEADERS_FULL));
 
	//Formats a string by replacing positional $n placeholders with arguments
	//ex: formatString("this is a %0", "test") -> this is a test
	function formatString() {   // Args: str, $0, $1 ....
		if(arguments[1]) {
			  var args = Array.prototype.slice.apply(arguments, [1]), rx = /%([0-9])/g;
			  return arguments[0].replace(rx, function($0, $1) {
				  return args[~~+$1] || '';
			  });		
		  }
	  }
	  
	    /*
	    * Look up for season start/end dates
	    */
	    var seasonDatesLookUp = $.loadable({
				url: SEASON_DATES,
				dataType: 'text',
				async:false,
				dataFilter: function(data,type){
					var data = $.parseJSON(data);
					var seasonDates = data.org_history.queryResults;
					return seasonDates;
				}
			});
		seasonDatesLookUp.onLoadSuccess(function(evt,data){
       	     SEASONS = data;
       	 });
		seasonDatesLookUp.load();
 
	
	    /*
	    * Look up for season start/end dates
	    */
	    var seasonStatusLookUp = $.loadable({
				url: formatString(SEASON_STATUS_URI,2011),
				dataType: 'text',
				dataFilter: function(data,type){
					var data = $.parseJSON(data);
					var seasonInfo = data.properties_info_events_season;
					return seasonInfo;
				}
			});
	    /*
	    * Spring Sesaon lookup
	    *	   
	    *
	    */
		var springSeasonLookUp = $.loadable({
				url: formatString(SPRING_SEASON_URI,SYS_YEAR),
				dataType: 'text',
				dataFilter: function(data,type){
					var data = $.parseJSON(data);
					var league = data.standings_spring_repeater.standings_spring;
					return league;
				}
			});
		
		/*
		*This lookup encompasses Wild Card, and game schedule data
		*
		*/
		var seasonWCLookUp = $.loadable({
				url:formatString(REGULAR_URI,SYS_YEAR,DATE),
				dataType: 'text',
				error: function() {
					var $err = $("<div></div>").addClass("dataError").text("There was an error processing your request. Please reload and try again.");
					$err.appendTo("#sub_nav");
					$("div[id^=standingsWildCardAL]").hide();
					$("div[id^=standingsWildCardNL]").hide();
				},
				beforeSend: function(){
				     $("#standingsWildCardAL").fadeTo("slow", 0.33);
				     $("#standingsWildCardNL").fadeTo("slow", 0.33);
				},
                dataFilter: function(data,type){
				    var out = [];
					var data = $.parseJSON(data);
					var league, AL_league, NL_league, leaders, NL_leaders, AL_leaders;
					var schedule = data.standings_schedule_date.schedule_game_date_team_chain.schedule_game_date_rptr;
					league = data.standings_schedule_date.standings_wild_card_date_rptr.standings_wild_card_date;
					leaders = data.standings_schedule_date.standings_all_date_rptr.standings_all_date;
					 NL_leaders = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,leaders[0])),leaders[0]); 
					 AL_leaders = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,leaders[1])),leaders[1]);
					leaders[0].queryResults.row = NL_leaders;
					leaders[1].queryResults.row = AL_leaders;
					NL_league = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,league[0])),league[0]);
					AL_league = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,league[1])),league[1]);
					league[0].queryResults.row = NL_league; //NL with last/next game data
					league[1].queryResults.row = AL_league; //AL with last/next game data
		            
		            out[0] = league;
		            out[1] = leaders;
		           
		            return out;
			 	}
			});
		
		/*
		* This lookup encompasses Wild Card, and game schedule data
		* This is a historical lookup and retrives data for any year before the current regular Season
		*/
		var historicalWCLookUp = $.loadable({
				url:formatString(HISTORICAL_URI,SYS_YEAR,DATE),
				dataType: 'text',
				error: function() {
					var $err = $("<div></div>").addClass("dataError").text("There was an error processing your request. Please reload and try again.");
					$err.appendTo("#sub_nav");
					$("div[id^=standingsWildCardAL]").hide();
					$("div[id^=standingsWildCardNL]").hide();
				},
				beforeSend: function(){
				     $("#standingsWildCardAL").fadeTo("slow", 0.33);
				     $("#standingsWildCardNL").fadeTo("slow", 0.33);
				},
                dataFilter: function(data,type){
                    var out = [];
					var data = $.parseJSON(data);
					var league, AL_league, NL_league, leaders, NL_leaders, AL_leaders;
					var schedule = data.historical_standings_schedule_date.schedule_game_date_team_chain.schedule_game_date_rptr;
					league = data.historical_standings_schedule_date.standings_wild_card_date_rptr.standings_wild_card_date;
					leaders = data.historical_standings_schedule_date.standings_all_date_rptr.standings_all_date;
					 NL_leaders = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,leaders[0])),leaders[0]); 
					 AL_leaders = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,leaders[1])),leaders[1]);
					leaders[0].queryResults.row = NL_leaders;
					leaders[1].queryResults.row = AL_leaders;
					NL_league = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,league[0])),league[0]);
					AL_league = model.mergeDates(model.extractGameDates(model.extractScheduleData(schedule,league[1])),league[1]);
					league[0].queryResults.row = NL_league; //NL with last/next game data
					league[1].queryResults.row = AL_league; //AL with last/next game data
		            
		           out[0] = league;
		           out[1] = leaders;
			return out;
			 	}
			}); 
	    	
    var model = {
			/*
			* Load grid with data
			*
			*/
			fillDatagrid : function (dgObj, data, userLimit) {
				if(data && data.length) {
					dgObj.clearData();
				  	$.each(data.slice(0, (~~+userLimit || RESULTS_MAX)), function(i, row) {														  
						dgObj.insertRow(row);
				    });
				}
				return dgObj;
		  	},
		  	
		  	/*
		  	* Extract standings data per divsion from league data
		  	* Extract division data by league AL/NL/GL/CL
		  	*/
		  	filterByDivisionLeader: function(division, data) {
				var out = [];
			  	if(data && data.length) {
					var j = 0;
				  	for(var i=0; i<data.length; i+=1){
						if((data[i].division_id === division) && (data[i].gb === "-")){
					   		out[j] = data[i];
					   		j+=1;
						}
				  	}
				  
			  	}
			  	return out;
		  	},
		  	
		  	/*
		  	* Extract division leaders for Wild Card standings
		  	*
		  	*/
		  	filterDivisionLeaders : function(league,data){
				var out = [];
				var m = 0;
				var NL = [DIVISIONS[104].East,DIVISIONS[104].Central,DIVISIONS[104].West];
				var AL = [DIVISIONS[103].East,DIVISIONS[103].Central,DIVISIONS[103].West];
				if(league === 104){
				    for(var i=0, j=NL.length; i<j; i++){
				        var leaders = model.filterByDivisionLeader(NL[i],data);
				        for(var k=0, l=leaders.length; k<l; k++){
				            out[m] = leaders[k];
				            m++;
				        }
				    }
				}else if(league === 103){
					for(var i=0, j=AL.length; i<j; i++){
					    var leaders = model.filterByDivisionLeader(AL[i],data);
				        for(var k=0, l = leaders.length; k<l; k++){
				            out[m] = leaders[k];
				            m++
				        }
				    }				
				}
				out.sort(function(a, b){
					return b.w-a.w;
				});
				return out;
		  	},
		  	
		  	/*
		  	* Removes division leaders from league data for Wild Card Standings
		  	*
		  	*/
		  	removeDivisionLeaders : function(leaders,data){
			  	var out = [];
			  	for(var i=0; i<=leaders.length-1; i+=1){
					for(var j=0; j<=data.length-1; j+=1){
						if(leaders[i].team_id === data[j].team_id){
							data.splice(j,1);
							out = data;
					  	}
				   	}
			  	}
			  	return out;
		  	},
		  	
		  	/*
		  	* Extract game schedule data from lookup per league
		  	*
		  	*/
		  	extractScheduleData: function(schedule,league){
			   var data = league.queryResults.row,
			   team_id,
			   out = [],
			   x=0;
			   for(var i=0; i<=data.length-1;i+=1){
				   team_id = data[i].team_id;
				   for(var j=0; j<= schedule.length-1; j+=1){
					   var sched_teamId = schedule[j].team_id;
					   if(sched_teamId === team_id){
						   out[x] = schedule[j];
						   x+=1;
					   }
				   }
			   }
			   return out;
		  	},
		  	
		  	/*
		  	* Extract game schedule creates new obj with last/next game data
		  	*
		  	*/
		  	extractGameDates : function(schedule){
			   var out = [];
			   var prev_game = [];
			   var next_game = [];
			   if (typeof(schedule) !== "undefined") {
					   for(var i=0; i<=schedule.length-1;i+=1){ 
						   var obj = {}, date, last, next;
						   prev_game = schedule[i].schedule_game_date.queryResults.row[0];
						   next_game = schedule[i].schedule_game_date.queryResults.row[1];
				           if(prev_game && next_game){
						   var prev_game_ind = prev_game.game_status_ind;
						   var next_game_ind = next_game.game_status_ind;
		 
						   if(prev_game.away_score == "0" && prev_game.home_score == "0"){
							  prev_game.away_score = "";
							  prev_game.home_score = "";
						   } 
							  
						   if(next_game.away_score == "0" && next_game.home_score == "0" ){
							  next_game.away_score = "";
							  next_game.home_score = "";
						   } 
		 
						   
						   //last game
						   date = prev_game.game_time_away.split("/",2);
						   last = date[0]+"/"+date[1];
		 
						   switch (prev_game_ind.charAt(0))
						   {
							case "D":
							  if(schedule[i].team_id === prev_game.away_team_id){
								last = last + " @ " + prev_game.home_team_abbrev +", PPD";  
							  }
							  else{
								   last = last + " vs "+ prev_game.away_team_abbrev +", PPD";
							  }
							  break;
							case "T":
							  if(schedule[i].team_id === prev_game.away_team_id){
								last = last + " @ " + prev_game.home_team_abbrev +", "+ prev_game.away_score+ "-"+ prev_game.home_score +" (SUSP)";  
							  }
							  else{
								   last = last + " vs "+ prev_game.away_team_abbrev +", "+ prev_game.home_score+ "-"+ prev_game.away_score +" (SUSP)";
							  }
							  break;
							case "U":
							  if(schedule[i].team_id === prev_game.away_team_id){
								last = last + " @ " + prev_game.home_team_abbrev +", "+ prev_game.away_score+ "-"+ prev_game.home_score +" (SUSP)";  
							  }
							  else{
								   last = last + " vs "+ prev_game.away_team_abbrev +", "+ prev_game.home_score+ "-"+ prev_game.away_score +" (SUSP)";
							  }
							  break;
							case "Q":
							  if(schedule[i].team_id === prev_game.away_team_id){
								last = last + " @ " + prev_game.home_team_abbrev +", FORFEIT";  
							  }
							  else{
								   last = last + " vs "+ prev_game.away_team_abbrev +", FORFEIT";
							  }
							  break;
							case "R":
							  if(schedule[i].team_id === prev_game.away_team_id){
								last = last + " @ " + prev_game.home_team_abbrev +", FORFEIT";  
							  }
							  else{
								   last = last + " vs "+ prev_game.away_team_abbrev +", FORFEIT";
							  }
							  break;				  
							default:
							
							   if(schedule[i].team_id === prev_game.away_team_id){
								  last = last + " @ " + prev_game.home_team_abbrev +", " + prev_game.away_result + " " + prev_game.away_score+ "-"+ prev_game.home_score;  
							   }
							   else{
								  last = last + " vs "+ prev_game.away_team_abbrev +", " + prev_game.home_result + " " + prev_game.home_score+ "-"+ prev_game.away_score;
							   }
						   }	   
						   
						   if(TEST_YEAR >= 2005 && TEST_YEAR < TODAY.getFullYear()){
							last = gameBoxScoreDecorator(prev_game.game_id,last);
						   }else if(TEST_YEAR == TODAY.getFullYear()){
							last = gameDateDecorator(prev_game.game_id,prev_game.gameday_sw,last);
						   }				   
		 
		 
						   //next game
						   date = next_game.game_time_away.split("/",2);
						   next = date[0]+"/"+date[1];
						   
						   switch(next_game_ind.charAt(0)){
							case "D":
								if(schedule[i].team_id === next_game.away_team_id){
									next = next + " @ " + next_game.home_team_abbrev +", PPD";
								}
								else{
									next = next + " vs "+ next_game.away_team_abbrev +", PPD";
								}
								break;
							case "T":
								if(schedule[i].team_id === next_game.away_team_id){
									next = next + " @ " + next_game.home_team_abbrev +", SUSP";
								}
								else{
									next = next + " vs "+ next_game.away_team_abbrev +", SUSP";
								}
								break;
							 case "U":
								if(schedule[i].team_id === next_game.away_team_id){
									next = next + " @ " + next_game.home_team_abbrev +", SUSP";
								}
								else{
									next = next + " vs "+ next_game.away_team_abbrev +", SUSP";
								}
								break;
							 case "Q":
								if(schedule[i].team_id === next_game.away_team_id){
									next = next + " @ " + next_game.home_team_abbrev +", FORFEIT";
								}
								else{
									next = next + " vs "+ next_game.away_team_abbrev +", FORFEIT";
								}
								break;
							  case "R":
								if(schedule[i].team_id === next_game.away_team_id){
									next = next + " @ " + next_game.home_team_abbrev +", FORFEIT";
								}
								else{
									next = next + " vs "+ next_game.away_team_abbrev +", FORFEIT";
								}
								break;
							default:
								var time;
								if(schedule[i].team_id === next_game.away_team_id){
									time = bam.datetime.parseISODate(next_game.game_time_et).formatDate("h:mm");
									if(time ==="3:33"){
										next = next + " @ " + next_game.home_team_abbrev;
									}else{
										next = next + " @ " + next_game.home_team_abbrev +", "+ bam.datetime.parseISODate(next_game.game_time_et).formatDate("h:mm A");			                
									}
									
								}
								else{
								   time = bam.datetime.parseISODate(next_game.game_time_et).formatDate("h:mm");
								   if(time === "3:33"){
									   next = next + " vs "+ next_game.away_team_abbrev ;
			
								   }else{
									   next = next + " vs "+ next_game.away_team_abbrev +", "+ bam.datetime.parseISODate(next_game.game_time_et).formatDate("h:mm A");
								   }
								}
						   
						   }//end switch
						   
						   /*
						   
						   if(schedule[i].team_id === next_game.away_team_id){
							next = next + " @ " + next_game.home_team_abbrev +", "+
							next_game.away_result + " " + next_game.away_score+ "-"+
							next_game.home_score;
						   }
						   else{
							   next = next + " vs "+ next_game.away_team_abbrev +", "+
							   next_game.home_result + " " + next_game.home_score+ "-"+
							   next_game.away_score;
						   }
						  */
						  
					   if(TEST_YEAR >= 2005 && TEST_YEAR < TODAY.getFullYear()){
						next = gameBoxScoreDecorator(next_game.game_id,next);
					   }else if(TEST_YEAR == TODAY.getFullYear()){
						next = gameDateDecorator(next_game.game_id,next_game.gameday_sw,next);
					   }
					}else{
					   last = "";
					   next = "";
					}	
				   obj.last_game = last; //last game i.e. 5/6 @ LAA, L 4-5
				   obj.next_game = next; //next game i.e. 5/7 vs LAA, L 4-5
				   obj.team_id = schedule[i].team_id; //add team_id to use as key
				   out[i] = obj;
			   }
			   return out;
			  }	
		  	},
		  	/*
		  	* inserts game dates into league data array.
		  	* 
		  	*/
		  	mergeDates : function(dates,league){
			 var out = [],
			 x = 0;
			 for(var i = 0; i<=dates.length-1; i+=1){
				 if(dates[i].team_id === league.queryResults.row[i].team_id){
					out[x] = $.extend(league.queryResults.row[i],dates[i]);
					x+=1;
				  }
			 }
			 return out;
		  	},
			getSeasonInfo : function(data){
	  			var out = {};
				out.season_start = bam.datetime.parseISODate(data.org_history.queryResults.row.first_date_seas);
				out.season_end = bam.datetime.parseISODate(data.org_history.queryResults.row.last_date_seas);
				out.spring_training_start = bam.datetime.parseISODate(data.schedule_event_info.queryResults.row[0].game_date);
				out.spring_training_end = bam.datetime.parseISODate(data.schedule_event_info.queryResults.row[1].game_date);
				out.season = data.org_history.queryResults.row.year;
				return out;
		   },
		 setCurrentDates : function(data){
            CURRENT_SEASON_DATES = model.getSeasonInfo(data);	
          },
	      setDates : function(data){
            SEASONS = data;	
          }
 
 
	};//end model
 
	var view = {
		
			//Pre-pends a prefix to the team name (runs in the scope of the datagrid.row)
			setTeamPrefix: function(o) {
				var out = o.value,
				wild_card = this.cell("wild_card").val(),
				division_champ = this.cell("division_champ").val(),
				playoffs_sw = this.cell("playoffs_sw").val(),
				playoffs_flag_mlb = this.cell("playoffs_flag_mlb").val(),
				prefix = (division_champ === 'Y')?"y-":
					(playoffs_flag_mlb === "x")?"x-":
					(wild_card === 'Y')?"w-":"";
					  
				if(!!prefix) { SHOW_PREFIX_LEGEND = true; }
				
				return prefix + out;
			},	
			//Render a single standings grid
			renderGrid: function(dgObj,el) {
				dgObj.render(el);
 
			},
			//Refreshes grid content
			refreshGrid: function(dgObj,el) {
				dgObj.render(el);
				dgObj.refreshView();
			},
			/*
			* onchange takes year and performs a new lookup
			*
			*/
			onChangeYear : function(){
 
				$('#standing_year').change(function(){
					var year = $('#standing_year').val();
					TEST_YEAR = year;
					var seasonEnd, seasonStart;
					for(var i=0, j=SEASONS.row.length; i<j; i++){
						if(SEASONS.row[i].year == year){
						  seasonEnd =  bam.datetime.parseISODate(SEASONS.row[i].last_date_seas);
						  seasonStart =  bam.datetime.parseISODate(SEASONS.row[i].first_date_seas);
						} 
					}
					if(year == TODAY.getFullYear()){
					    var today;
						if(TODAY.valueOf() > ENDDATE.valueOf()){
							today = bam.datetime.parseYMD(bam.datetime.DateTime(ENDDATE).toYMD());
						}else{
							today = bam.datetime.parseYMD(bam.datetime.DateTime(TODAY).toYMD());    			
						}
						dp.daypicker('option', 'max', today.formatDate("yyyy/MM/dd"));
						dp.daypicker('option', 'min', seasonStart.formatDate("yyyy/MM/dd"));
						dp.daypicker('setDate',today.formatDate('yyyy/MM/dd'));
						view.setViewLinksRegular(today);
						location.hash = today.formatDate("yyyyMMdd");
					}else{
						dp.daypicker('option', 'max', seasonEnd.formatDate("yyyy/MM/dd"));
						dp.daypicker('option', 'min', seasonStart.formatDate("yyyy/MM/dd"));
						dp.daypicker('setDate',seasonEnd.formatDate('yyyy/MM/dd'));
						view.setViewLinksWC(seasonEnd);
						location.hash = seasonEnd.formatDate("yyyyMMdd");
					}
				   bam.tracking.simStatsPgView({pageName:"Major League Baseball: Standings: Wild Card Standings",channel:"Standings",source:"Wild Card Standings",control:"Standings: Year Select"});			 
				});			
	       },
	       columnsShowDefault: function(){
				var seasonEnd, seasonStart;
				var date = dp.daypicker("getDate");
				for(var i=0, j=SEASONS.row.length; i<j; i++){
					if(SEASONS.row[i].year == date.getFullYear()){
					  seasonEnd =  bam.datetime.parseISODate(SEASONS.row[i].last_date_seas);
					} 
				}
 
				var fields = [9,11,12,13,14,15,16,17,18,19,20,21];
				var fieldsBefore1950 = [5,6,7,8,9,10,11,12,13,14,15,16,17,18];
				var fieldsBefore1950Show = [19,20,21]
				
				if(TEST_YEAR < 1950){
					for(var i=0, j=fieldsBefore1950.length; i<j; i++){
						DEFAULT_GRID_FULL.hideColumn(fieldsBefore1950[i]);
						LEADERS_GRID_FULL.hideColumn(fieldsBefore1950[i]);
					 }  
					 
					 for(var i=0, j=fieldsBefore1950Show.length; i<j; i++){
						DEFAULT_GRID_FULL.showColumn(fieldsBefore1950Show[i]);
						LEADERS_GRID_FULL.showColumn(fieldsBefore1950Show[i]);
					} 
				
				}else{
					for(var i=0, j=fields.length; i<j; i++){
                        if(TEST_YEAR < TODAY.getFullYear()){
							DEFAULT_GRID_FULL.hideColumn(fields[i]);
							LEADERS_GRID_FULL.hideColumn(fields[i]);
                        }else{
							DEFAULT_GRID.hideColumn(fields[i]);
							LEADERS_GRID.hideColumn(fields[i]);
						}
					}
					
					//hide next game if end of season
					if(date.valueOf() != seasonEnd.valueOf()){
						if(date.getFullYear() < TODAY.getFullYear()){
							DEFAULT_GRID_FULL.showColumn(fields[0]);
							LEADERS_GRID_FULL.showColumn(fields[0]);
						}else{
							DEFAULT_GRID.showColumn(fields[0]);
							LEADERS_GRID.showColumn(fields[0]);
						}
					}
 
					
				}
			},
	       	//tab to next/previous set of columns
			tabs: function(){
				var counter = 0;
				var fields1 = [5,6,7,8,9,10],
				fields2 = [11,12,13,14,15,16],
				fields3 = [17,18,19,20,21];
		
				if(TEST_YEAR < TODAY.getFullYear()){
				  fields1 =  [5,6,7,8,9];
				}
				
			   $("#stats_next").click(function(){
				  
				  if(TEST_YEAR < TODAY.getFullYear()){
					$("#stats_prev").live('click', function(){
						$('.dg-next_game').hide();
					});
				  }
					if(counter === 0){	        
						for(var i=0, j=fields1.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){
								g_GRID_FULL.hideColumn(fields1[i]);
								LEADERS_GRID_FULL.hideColumn(fields1[i]);
							}else{
								DEFAULT_GRID.hideColumn(fields1[i]);
								LEADERS_GRID.hideColumn(fields1[i]);
                            }
						}
						
						for(var i=0, j=fields2.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){
								DEFAULT_GRID_FULL.showColumn(fields2[i]);
								LEADERS_GRID_FULL.showColumn(fields2[i]);
                            }else{
								DEFAULT_GRID.showColumn(fields2[i]);
								LEADERS_GRID.showColumn(fields2[i]);
                            }
						}
						counter += 1;
						 $(".stats_prev_default").css("background-position","0 -71px");
					}
					else if(counter === 1){
						for(var i=0, j=fields2.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){
								DEFAULT_GRID_FULL.hideColumn(fields2[i]);
								LEADERS_GRID_FULL.hideColumn(fields2[i]);
                            }else{
								DEFAULT_GRID.hideColumn(fields2[i]);
								LEADERS_GRID.hideColumn(fields2[i]);
                            }
						}
						
						for(var i=0, j=fields3.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){
								DEFAULT_GRID_FULL.showColumn(fields3[i]);
								LEADERS_GRID_FULL.showColumn(fields3[i]);
                            }else{
								DEFAULT_GRID.showColumn(fields3[i]);
								LEADERS_GRID.showColumn(fields3[i]);
                            }
						}
						counter += 1;
						$(".stats_next_default").css("background-position","-1px -220px");
					}
					bam.tracking.simStatsPgView({pageName:"Major League Baseball: Standings: Wild Card Standings",channel:"Standings",source:"Wild Card Standings",control:"Standings : More Standings Click"});			 
			  });
			   $("#stats_prev").click(function(){
					if(counter === 2){
						for(var i=0, j=fields3.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){
								DEFAULT_GRID_FULL.hideColumn(fields3[i]);
								LEADERS_GRID_FULL.hideColumn(fields3[i]);
                            }else{
								DEFAULT_GRID.hideColumn(fields3[i]);
								LEADERS_GRID.hideColumn(fields3[i]);
                            }
						}
						
						for(var i=0, j=fields2.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){
								DEFAULT_GRID_FULL.showColumn(fields2[i]);
								LEADERS_GRID_FULL.showColumn(fields2[i]);
                            }else{
								DEFAULT_GRID.showColumn(fields2[i]);
								LEADERS_GRID.showColumn(fields2[i]);
                            }
						}
						counter -= 1;
						$(".stats_next_default").css("background-position","0 -106px");
						
					}
					else if(counter === 1){
						for(var i=0, j=fields2.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){                            
								DEFAULT_GRID_FULL.hideColumn(fields2[i]);
								LEADERS_GRID_FULL.hideColumn(fields2[i]);
							}else{
								DEFAULT_GRID.hideColumn(fields2[i]);
								LEADERS_GRID.hideColumn(fields2[i]);
                            }
						}
						
						for(var i=0, j=fields1.length; i<j; i++){
                            if(TEST_YEAR < TODAY.getFullYear()){                            
								DEFAULT_GRID_FULL.showColumn(fields1[i]);
								LEADERS_GRID_FULL.showColumn(fields1[i]);
                            }else{
								DEFAULT_GRID.showColumn(fields1[i]);
								LEADERS_GRID.showColumn(fields1[i]);
                            }
						}
						counter -= 1;
						$(".stats_prev_default").css("background-position","-1px -185px");
					}
					bam.tracking.simStatsPgView({pageName:"Major League Baseball: Standings: Wild Card Standings",channel:"Standings",source:"Wild Card Standings",control:"Standings : More Standings Click"});			 
			  });
			},
			setViewLinksWC: function(date){
				var regularSeasonLink = $('.topnav_regular').find('a').attr("href");
				var springSeasonLink = $('.topnav_spring').find('a').attr("href");
				var ymd = "?ymd=";
				var year = date.getFullYear();
				$('#standingsContainer').addClass('currentYear');
				if(year < "2006"){
				    $('.topnav_spring').css('display','none');
				}else{
				    $('.topnav_spring').css('display','inline');
				}
				$('.topnav_wildcard').css('display','inline');
				$("#standing_year").selectmenu({width:120});
				$("#standing_year").val(year);
				$('.ui-selectmenu-status').text(year);
				regularSeasonLink = regularSeasonLink.split("?");
				regularSeasonLink = regularSeasonLink[0] + ymd + date.formatDate("yyyyMMdd");
				$('.topnav_regular').find('a').attr("href",regularSeasonLink);
				springSeasonLink = springSeasonLink.split("?");
				springSeasonLink = springSeasonLink[0] + ymd + date.formatDate("yyyyMMdd");
				$('.topnav_spring').find('a').attr("href",springSeasonLink);
				$('#next_stats').hide();
				$('#split').hide();
 
			},
			setViewLinksRegular: function(date){
				var regularSeasonLink = $('.topnav_regular').find('a').attr("href");
				var springSeasonLink = $('.topnav_spring').find('a').attr("href");
				var ymd = "?ymd=";
				var year = date.getFullYear();
				if(year < "2006"){
				    $('.topnav_spring').css('display','none');
				}else{
				    $('.topnav_spring').css('display','inline');
				}
				$('.topnav_wildcard').css('display','inline');
				$('#standingsContainer').addClass('currentYear');
				$("#standing_year").selectmenu({width:120});
				$("#standing_year").val(year);
				$('.ui-selectmenu-status').text(year);
				regularSeasonLink = regularSeasonLink.split("?");
				regularSeasonLink = regularSeasonLink[0] + ymd + date.formatDate("yyyyMMdd");
				$('.topnav_regular').find('a').attr("href",regularSeasonLink);
				springSeasonLink = springSeasonLink.split("?");
				springSeasonLink = springSeasonLink[0] + ymd + date.formatDate("yyyyMMdd");
				$('.topnav_spring').find('a').attr("href",springSeasonLink);
				$('#next_stats').hide();
				$('#split').hide();
			},
 
    setToolTips : function(){
	  
	  var tipCfg = {
	     content : "",
	     style : {
			     name: 'light', // Inherit the rest of the attributes from the preset dark style
			     tip: 'bottomMiddle',
			     border: {
					 width: 2,
					 radius: 5
				  }
		  },
		  show: {
			 when: {event:"click"},//show it on the click
			 ready: true,
			 solo: true, // Only show one tooltip at a time
			 delay: 0
		  },
		  position: {
			 corner: {
				 target: 'topMiddle',
				 tooltip: 'bottomMiddle'
			 }
		  }
	  };
		  
      $("th.dg-gb").live("click", function(){				
		var content = {content:'Wild Card games behind'};		
		$(this).qtip($.extend(tipCfg,content));	
	  });
	  
	  $("th.dg-elim").live("click", function(){				
		var content = {content:'Wild Card Elimination Number'};		
		$(this).qtip($.extend(tipCfg,content));	
	  });
	  
    },
    setView1998 : function() {
	    var html = '<div id="standingsCopyright">Day-by-day historical standings information was obtained free of charge from and is copyrighted by Retrosheet.</div>';
        if(!$("div#standingsCopyright").length){
           $("#standingsContainer").append(html).show();
        }
        // Day-by-day historical standings information was obtained free of charge from and is copyrighted by Retrosheet.
    }
 
	};//end view
 
	var controller = {	
	        /*
	        * sends league data to model to filter division leaders and removes leaders
	        * from the league data.
	        * After the data is filtered it is sent to the view for rendering
	        */
			renderWildCardStandings : function(data){
			    $(".dataError").remove();
		        $("div[id^=standings]").show();
			    var league, leaders, NL_league, AL_league, NL_leaders, AL_leaders;
				league = data[0];
				leaders = data[1];
				NL_league = league[0].queryResults.row;
				AL_league = league[1].queryResults.row;
				NL_leaders = leaders[0].queryResults.row;
				AL_leaders = leaders[1].queryResults.row;
				NL_leaders = model.filterDivisionLeaders(LEAGUES.NL,NL_leaders); // NL division leaders
				AL_leaders = model.filterDivisionLeaders(LEAGUES.AL,AL_leaders); // AL division leaders
				
				if(TEST_YEAR < TODAY.getFullYear()){
					//render WC Division Leaders  TO DO: view.renderGrid();			
					controller.sendToView(LEADERS_GRID_FULL,AL_leaders,"al_division_leadersStandingsData");
					controller.sendToView(LEADERS_GRID_FULL,NL_leaders,"nl_division_leadersStandingsData");
					//render WC standings
					controller.sendToView(DEFAULT_GRID_FULL,NL_league,"nlwcStandingsData");
					controller.sendToView(DEFAULT_GRID_FULL,AL_league,"alwcStandingsData");
				}else{
					//render WC Division Leaders  TO DO: view.renderGrid();			
					controller.sendToView(LEADERS_GRID,AL_leaders,"al_division_leadersStandingsData");
					controller.sendToView(LEADERS_GRID,NL_leaders,"nl_division_leadersStandingsData");
					//render WC standings
					controller.sendToView(DEFAULT_GRID,NL_league,"nlwcStandingsData");
					controller.sendToView(DEFAULT_GRID,AL_league,"alwcStandingsData");
				}
				
				$("#standingsWildCardAL").fadeTo("slow", 1);
		        $("#standingsWildCardNL").fadeTo("slow", 1);
		        
			},
			// renders data to screen
			sendToView : function(dgObj,data,el){
				model.fillDatagrid(dgObj,data);
				view.renderGrid(dgObj,el);
			},
			// setter/getter
			set: function(key,value){
				if(key && typeof(value)!=="undefined") {
					_properties[key]=value;
				}
				//_log("setting property: " + key + ". Displaying _properties below:");
				//_log(_properties);
			},
			get: function(key) {
				//_log("getting " + key);
				return (key && key in _properties)?_properties[key]:null;
			},
		    // properties lookup
			getClubProperties: function() {
				var out;// = this.get('clubprops');
				if(!out) {
					$.ajax({ 
						async: false, 
						url: "/scripts/club_properties.jsp", 
						dataType: 'json', 
						data: { responseType: "json", hashKey: "team_id"}, 
						success: function(json){ 
							out = json;
							//mvc.set("clubprops",json); //TODO change this 
						}, 
						error: function(xhr) {_log("Error accessing club properties: " + xhr.status + " " + xhr.statusText);} 
					});
				}
				return out;
			},
 
			loadIt:function(date){
				var fDate = bam.datetime.parseYMD(bam.datetime.DateTime(date).toYMD());
				//if end of season
				if(fDate.valueOf() > ENDDATE.valueOf()){
					fDate = bam.datetime.parseYMD(bam.datetime.DateTime(ENDDATE).toYMD());
				}
				var newDate = fDate.formatDate('yyyy/MM/dd');
				var seasonEnd, seasonStart;
				if(fDate.getFullYear() < TODAY.getFullYear()){ //historical
					for(var i=0, j=SEASONS.row.length; i<j; i++){
					 if(SEASONS.row[i].year == fDate.getFullYear()){
					   seasonEnd =  bam.datetime.parseISODate(SEASONS.row[i].last_date_seas);
					   seasonStart =  bam.datetime.parseISODate(SEASONS.row[i].all_star_date);
					  } 
					 }
					 dp.daypicker('option', 'max', seasonEnd.formatDate("yyyy/MM/dd"));		    
					 dp.daypicker('option', 'min', seasonStart.formatDate("yyyy/MM/dd"));
					 dp.daypicker('setDate',fDate.formatDate('yyyy/MM/dd'));
					 view.setViewLinksWC(seasonEnd);
					 //console.log("default on load");
				}else if((fDate.valueOf() < STARTDATE.valueOf()) && (fDate.getFullYear() == TODAY.getFullYear())){
					 for(var i=0, j=SEASONS.row.length; i<j; i++){
						 if(SEASONS.row[i].year == fDate.getFullYear()-1){
							seasonEnd =  bam.datetime.parseISODate(SEASONS.row[i].last_date_seas);
							seasonStart =  bam.datetime.parseISODate(SEASONS.row[i].all_star_date);
						 } 
					 }
					 dp.daypicker('option', 'max', seasonEnd.formatDate("yyyy/MM/dd"));		    
					 dp.daypicker('option', 'min', seasonStart.formatDate("yyyy/MM/dd"));
					 dp.daypicker('setDate',seasonEnd.formatDate('yyyy/MM/dd'));
					 view.setViewLinksWC(seasonEnd);
				}else if((fDate.valueOf() < TODAY.valueOf()) && (fDate.getFullYear() == TODAY.getFullYear())){
					 dp.daypicker('setDate',fDate.formatDate('yyyy/MM/dd'));
					 view.setViewLinksRegular(fDate);		
				}else{ 		   
					 var today = bam.datetime.parseYMD(bam.datetime.DateTime(TODAY).toYMD());
					 var uri = formatString(REGULAR_URI,today.getFullYear(),today.formatDate('yyyy/MM/dd'));
					 dp.daypicker('option', 'max', today.formatDate("yyyy/MM/dd"));
					 dp.daypicker('setDate',today.formatDate("yyyy/MM/dd"));
					 seasonWCLookUp.load({url:uri});
					 view.setViewLinksRegular(today);
					 //console.log("default");
				}//end if		
			},
			init: function(date){					
			    var year,_date,paramDate,mm,dd;
 
				if(location.hash == "" || location.hash == "undefined"){
				     _date = date;
				}else{
				  	var hashdate = location.hash.split("#");
				   _date = hashdate[1];
 
				}
 
				if(_date){
					paramDate = _date + "";
					year = paramDate.substr(0,4);
					mm = paramDate.substr(4,2);
					dd = paramDate.substr(6,2);
					paramDate = year + "/" + mm + "/" + dd;
				}
				
				TEST_YEAR = year;
				CLUB_PROPS = controller.getClubProperties();
				//console.log(CLUB_PROPS);
				if(TODAY.valueOf() > ENDDATE.valueOf()){
				  dp.daypicker('option', 'max', ENDDATE.formatDate("yyyy/MM/dd"));
				}
			
			    //day picker initialize
				dp.bind('daypickerchange', function(evt,data) {  	 	       
					var date = data.year + "/" + data.month + "/" + data.day;
					var sdate = bam.datetime.parseYMD(bam.datetime.DateTime(date).toYMD());
					var uri;
					//var hash = location.hash;
					if(sdate.valueOf() == TODAY.valueOf()){
						controller.loadIt(sdate.formatDate("yyyy/MM/dd"));
					}else{					
					    uri = formatString(HISTORICAL_URI,sdate.getFullYear(),sdate.formatDate('yyyy/MM/dd'));
					    historicalWCLookUp.load({url:uri});
					    view.setViewLinksWC(sdate);

/*					     //historical lookup. exception if it is before 11am and date passed is the previous day do regular lookup
					     var today = bam.datetime.parseYMD(bam.datetime.DateTime(TODAY).toYMD());
						 if (bam.EASTERN_TIME.getHours() < 11) {
							 if(sdate.getDate() === today.getDate()){
								uri = formatString(REGULAR_URI,sdate.getFullYear(),sdate.formatDate('yyyy/MM/dd'));
								seasonWCLookUp.load({url:uri});
								console.log(sdate);
								view.setViewLinksRegular(sdate);
								dp.daypicker('option', 'max', sdate.formatDate("yyyy/MM/dd"));		    
							 }else{
							    uri = formatString(HISTORICAL_URI,sdate.getFullYear(),sdate.formatDate('yyyy/MM/dd'));
							    historicalWCLookUp.load({url:uri});
							    view.setViewLinksWC(sdate);
                         }     
						}else{
								uri = formatString(HISTORICAL_URI,sdate.getFullYear(),sdate.formatDate('yyyy/MM/dd'));
								historicalWCLookUp.load({url:uri});
								view.setViewLinksWC(sdate);
						}
*/
					}
     				view.columnsShowDefault();
     				// 1998 messaging
					if (sdate.getFullYear() < 1999) {
						view.setView1998();
					}else{
					  $('div#standingsCopyright').remove();
					}
 
         	        location.hash = sdate.formatDate("yyyyMMdd");
				});		
 
                //day picker click tracking
				dp.bind("daypickerselect daypickernext daypickerprevious",function(){
					bam.tracking.simStatsPgView({pageName:"Major League Baseball: Standings: Wild Card Standings",channel:"Standings",source:"Wild Card Standings",control:"Standings: Date Select"});			  
				});
 
 
				makeYearMenu();
				view.onChangeYear();//Year change handler
				view.setToolTips();
				view.columnsShowDefault();
 
				//all of the loadable onLoadSuccess handlers
				seasonWCLookUp.onLoadSuccess(function(evt,data){
					controller.renderWildCardStandings(data);
				});
				
				historicalWCLookUp.onLoadSuccess(function(evt,data){
					controller.renderWildCardStandings(data);
				});
								
				controller.loadIt(paramDate);
 	
 	
            }// end init
		
	}//end controller
 
	return controller;
 
})();//end Standings
