/**
* 
* @TODO:

documentation 

*/


;bam.mediawall.game = (function(window, document, $, undefined, bam){	

	/**
	**************** Private ****************
	*/
	
	var $doc = $(document),
		CORE = bam.mediawall,
		_curIndex = 0, // current panel index
		_curGameID,
		_isActive = false,
		_config={}, // copied at init from CORE	
		_linescore={
			activeClass		: "mw_linescore_on",
			container		: "mw_linescore_obj",
			$container		: null, // populated at init
			counter			: 0,
			loadRequests	: 0,
			game			: null // populated at init and updated with each showLinescore() 	
		},			

		_log=function(msg){			
			if (CORE.debug && typeof console !== "undefined" && !!console.log && !!console.dir) {
				if (typeof msg === "string") console.log("bam.mediawall.game: "+msg);
				else if (typeof msg === "object") console.dir(msg);
				else console.log(msg);			
			}	
		},	
		
		/**
		 * 
		 * _get
		 * @private
		 * Cached jQuery selector getter
		 */
		_get = function(selector) {
			return _get.cache[selector] = _get.cache[selector]||$(selector);
		},
		
		
		/** 		
		* TRACKING
		* 
		* Click events are delegated to the #media_wall container
		* Only those whose target has the class "trackThis" are processed
		* Default track values exist
		* Custom values can be added in the markup using the following classes:
		* isDynamic, compName, compActivity, actionGen
		*  
		*/		
		_track = function(){
			$doc.selector = "#media_wall";  
			$doc.live("click", function(e) {
				var $target = $(e.target);			
				if($target.hasClass("trackThis")) {				
					var isDynamic 		= ($target.attr("isDynamic") === undefined) ? false : $target.attr("isDynamic");
					var compActivity	= ($target.attr("compActivity") === undefined) ? $target.text() + " Click" : $target.attr("compActivity");
					var actionGen 		= ($target.attr("actionGen") === undefined) ? true : $target.attr("actionGen");
					bam.tracking.track({
						async:{
							isDynamic: isDynamic,		
							compName: _config.compname,								
							compActivity: _config.club.toUpperCase() + " Mediawall: " + compActivity,							
							actionGen: actionGen
						}
					}, $target);
				}									
			});				
		},
		
		

		
		_initLineScore = function(defaultGameID) {
			_log("Linescore initialized. defaultGameID="+defaultGameID);				
			//_linescore.counter=0;
			_linescore.main = new bam.linescore("bam.mediawall.game.load");
			_linescore.main.Scale = false;
			_linescore.main.Width = 300;
			_linescore.main.Height = 60;
			_linescore.main.LinescoreFLV = "/flash/mediawall/y2009/baseLinescore.swf";			
			_linescore.main.DefaultGID = defaultGameID;	 // Ex: 2010_07_27_oakmlb_texmlb_1				
			if(!!_config.ispostseason) _linescore.main.sbRules = "/flash/scoreboard/y2011/sb_rules_st.xml";
					
			// url params for setting data source and current date. this is for testing and does not work on prod.				
			if(!!bam.env.host["isQA"] || !!bam.env.host["isDev"]) _linescore.main.BaseURL = "gd.qa.mlb.com";				
			
			// stub for qa.theabl.com.
			// @TODO: remove this once bam.env gets updated for this domain.
			if(~document.location.search.indexOf("env=qa")) _linescore.main.BaseURL = "gd.qa.mlb.com";				
						
			if(!!bam.env.host["isProd"] && ~document.location.search.indexOf("currentdate=")) {	
				var results = new RegExp('[\\?&]currentdate=([^&#]*)').exec(window.location.href);		
				if(!!results)_linescore.main.CurrentDate = results[1];	
				// EX: _linescore.main.CurrentDate = 20090402;	
			}				
		
			/**
			* PREVIEW
			*
			* updates the gamestate banner and postblurb links
			* this gets called by  the linescore callback (bam.mediawall.onDataReady)
			* 
			* LOGIC:
			* 
			* PREVIEW (Gameday not available)
			* 	Banner:  WATCH PREVIEW (If available)
			* 	Blurb:  Watch live on MLB.TV | Preview (if available)
			* PRE-GAME/LINEUPS/GAMEDAY is available
			* 	Banner:  WATCH GAMEDAY (If available. If not, use PREVIEW)
			* 	Blurb:  Watch live on MLB.TV | Gameday (if available. If not, use Preview)
			* PRE-GAME/LINEUPS/GAMEDAY is available AND audio is available
			* 	Banner:  WATCH LISTEN GAMEDAY (LISTEN goes to At Bat)
			* 	Blurb: Watch | Listen | Gameday (Listen goes to At Bat)
			*
			* Prefixes:
			* gd - gameday
			* pb - post-blurb media link (Ex: c.$pb_mlbtv)
			* b - banner media link (Ex: c.$b_mlbtv)
			* 
			* 
			*/	
			
			_linescore.onpreview = function(){					
						
				var c 			= _config, //shortcut handle for data object
					tempStr 	= c.status.toLowerCase().replace(/\s+/g,''),
					banner 		= "";		
				_log("_linescore.onpreview. displaying data object below.");		
				_log(c);			
				// set the banner image
				if(c.status==="Preview" || c.status==="Pre-Game")tempStr="preview";
				else if(c.status==="Delayed Start"||c.status==="Suspended")tempStr+="_preview";					
				banner=c.bannerbase + tempStr + ".gif";	
				c.$panel.find(".mw_game_state").css("background","transparent url(" + banner + ") no-repeat");						
				if(!!c.gd_enabled){
					if(!c.gd_link_exists){
						// WATCH
						c.$pb_mlbtv.html(c.previewtvtext).attr("href",c.mlbtv_link).addClass("inline");	
						c.$b_mlbtv.html(c.tvtext).attr("href", c.mlbtv_link).addClass("inline");												
						// PREVIEW (If available)
						if(!!c.preview_link){			
							c.$pb_gd.prev().addClass("inline").end().html(c.previewtext).attr("href",c.preview_link).addClass("inline");		
							c.$b_gd.html(c.previewtext).attr("href",c.preview_link).addClass("inline");							
						}
					} else if(c.gd_link_exists && !c.audio_exists){	
						// WATCH
						c.$pb_mlbtv.html(c.previewtvtext).attr("href",c.mlbtv_link).addClass("inline");
						c.$b_mlbtv.html(c.tvtext).attr("href", c.mlbtv_link).addClass("inline");						
						// GAMEDAY
						c.$pb_gd.prev().addClass("inline").end().html(c.gamedaytext).attr("href",c.gd_link).addClass("inline");	
						c.$b_gd.html(c.gamedaytext).attr("href",c.gd_link).addClass("inline");			
					} else if(c.gd_link_exists && !!c.audio_exists){
						// WATCH
						c.$pb_mlbtv.html(c.tvtext).attr("href",c.mlbtv_link).addClass("inline");
						c.$b_mlbtv.html(c.tvtext).attr("href", c.mlbtv_link).addClass("inline");	
						// LISTEN
						var isatbat = (c.gameday_sw === "P") ? true : false;	
						if(isatbat || !!c.audio_exists) {
							var thelink=(isatbat)?c.atbat_link:c.audio_link;
							c.$pb_listen.prev().addClass("inline").end().html(c.audiotext).attr("href",thelink).addClass("inline");	
							c.$b_listen.attr("href", thelink).html(c.audiotext).addClass("inline");	
						}
						// GAMEDAY
						c.$pb_gd.prev().addClass("inline").end().html(c.gamedaytext).attr("href",c.gd_link).addClass("inline");	
						c.$b_gd.html(c.gamedaytext).attr("href",c.gd_link).addClass("inline");	
					}
				}
				
			}; // end _linescore.preview
			
	
			/**
			* LIVE
			*
			* updates the gamestate banner and postblurb links
			* this gets called by  the linescore callback (bam.mediawall.onDataReady)
			* 
			* Prefixes:
			* gd - gameday
			* pb - post-blurb media link (Ex: c.$pb_mlbtv)
			* b - banner media link (Ex: c.$b_mlbtv)
			* 
			*/	
			_linescore.onlive = function(){				
				var c 			= _config, //shortcut	handle for data object
					tempStr 	= c.status.toLowerCase().replace(/\s+/g,''),
					banner 		= "";		
				_log("_linescore.live. displaying data object below.");		
				_log(c);			
				// set the banner image
				if(c.status==="In Progress" || c.status==="Warmup")tempStr="live";
				else if(c.status==="Delayed Start")tempStr+="_live";				
				banner=c.bannerbase + tempStr + ".gif";	
				c.$panel.find(".mw_game_state").css("background","transparent url(" + banner + ") no-repeat");				
				// WATCH
				c.$pb_mlbtv.html(c.tvtext).attr("href",c.mlbtv_link).addClass("inline");
				c.$b_mlbtv.html(c.tvtext).attr("href", c.mlbtv_link).addClass("inline");					
				
				if(!!c.gd_enabled){		
					// LISTEN		
					var isatbat = (c.gameday_sw === "P") ? true : false;
					if(isatbat || !!c.audio_exists) { 
						var thelink=(isatbat)?c.atbat_link:c.audio_link;
						c.$pb_listen.prev().addClass("inline").end().html(c.audiotext).attr("href",thelink).addClass("inline");	
						c.$b_listen.html(c.audiotext).attr("href",thelink).addClass("inline");	
					} 
					// GAMEDAY			
					c.$pb_gd.prev().addClass("inline").end().html(c.gamedaytext).attr("href",c.gd_link).addClass("inline");	
					c.$b_gd.html(c.gamedaytext).attr("href",c.gd_link).addClass("inline");							
				} else {
					c.$pb_gd.prev().andSelf().removeClass("inline");	
					c.$pb_listen.prev().andSelf().removeClass("inline");	
				}						
			};
			
			
			/**
			* FINAL
			*
			* updates the gamestate banner and postblurb links
			* this gets called by  the linescore callback (bam.mediawall.onDataReady)
			* 
			* Prefixes:
			* gd - gameday
			* pb - post-blurb media link (Ex: c.$pb_mlbtv)
			* b - banner media link (Ex: c.$b_mlbtv)
			* 
			*/			
			_linescore.onfinal = function(){				
				var c 			= _config, //shortcut	handle for data object
					tempStr 	= c.status.toLowerCase().replace(/\s+/g,''),
					tempGD		= "",					
					banner 		= "";		
				_log("_linescore.onfinal. displaying data object below.");		
				_log(c);
				// set the banner image
				if(c.status==="Final" || c.status==="Game Over")tempStr="final";
				else if(c.status==="Suspended")tempStr+="_final";				
				banner=c.bannerbase + tempStr + ".gif";	
				c.$panel.find(".mw_game_state").css("background","transparent url(" + banner + ") no-repeat");					
				// hide the dividers in the post blurb area, since we'll only show one link
				c.$panel.find(".mw_media_link span").hide();				
				if(!!c.wrap_link){
					// hide gameday
					c.$pb_gd.removeClass("inline");	
					c.$b_gd.removeClass("inline");
					// WRAP
					c.$panel.find(".mw_link_wrap").html(c.wraptext + " &gt;").attr("href",c.wrap_link).addClass("inline");
					c.$panel.find(".mw_lnk_wrapup").html(c.wraptext).attr("href",c.wrap_link).addClass("inline");
				}else if(c.gameday_sw!=="N" && c.status!=="Suspended" && c.status!=="Postponed"){
					// GAMEDAY	
					tempGD = (!!c.gd_link_exists) ? c.gd_link : "javascript:void(launchGameday({gid:'" + _curGameID + "'}))";					
					c.$pb_gd.html(c.gamedaytext).attr("href",tempGD).addClass("inline");	
					c.$b_gd.html(c.gamedaytext).attr("href",tempGD).addClass("inline");	
				}			
				// BOX
				if(c.status!=="Postponed") c.$panel.find(".mw_lnk_boxscore").html(c.boxtext).addClass("inline");	
			};			
			
			
			_linescore.onextendedfinal = function(){
				_log("_linescore.onextendedfinal");	
				_linescore.onfinal();
				_config.$panel.find(".mw_blurb_left, .mw_media_link").hide();
			};
			
			_linescore.main.Init(_linescore.container);
							
		},  // end _initLineScore	
	
	
	
		_bindevents = function(){	
			_log("_bindevents");	
			CORE.bind("rotationBegin",function(){
				_log("rotationBegin event fired.");			
				_hideLinescore();							
			});				
			CORE.bind("rotationEnd",function(){
				_curIndex = CORE.getCurrentPanelIndex();
				_curIndex--;				
				var panelObj = CORE.getConfig("panels")[_curIndex];
				if(!!panelObj && !!panelObj.gameid && panelObj.defkey === "mediawall-game" && panelObj.no_bscore !== "1" ) {
					_loadGame(panelObj.gameid);
				}			
			});	
		},
			
	
		_loadGame = function(gid){		
			_linescore.game = gid;				
			if(_linescore.loadRequests<3) {		
				// this is here to hide the error that happens in firefox when the mediawall is not in the browser's viewport 		
				try{ 
					_log("_loadGame called, _linescore.loadRequests="+ _linescore.loadRequests + ", gid="+gid);
					_linescore.main.LoadGame(gid, "_linescore.OnDataReady_main");													
				}catch(err){
					_log("_loadGame Error:" + err);
					_linescore.loadRequests++;
					_loadGame(gid);
				}		
			}else{
				// @TODO: fail mechanism? Perhaps iPad support would go here?
			}			
		},
			
	
		_showLinescore = function(){	
			_linescore.$container.addClass(_linescore.activeClass);		
		},		
				
		
		_hideLinescore = function(){	
			_linescore.$container.removeClass(_linescore.activeClass);			
			_linescore.loadRequests=0;
		},
	
	
		/*
		*
		*
		*
		*
		* ROOT LEVEL OBJECT
		*
		* @public
		*
		*
		*/
	
		_game = {				
			
			init: function(gameday) {		
				_log("initializing...");		
				_isActive = true;
				_track();
				if (typeof bam.linescore == "undefined") {
					$.ajax({type:"GET", async:false, cache:true, url:"/shared/scripts/bam.linescore.js", dataType:"script"});	
				}				
				_get.cache = {};
				_linescore.$container = _get("#" + _linescore.container);			
				_config = CORE.getAllConfigs();				 
				_bindevents();					
				_linescore.game = _curGameID = gameday;
				_initLineScore(_linescore.game);	
				delete _game.init;			
    	    },		
			
			load: function(){
				var data = ["home_team_name", "away_team_name", "away_file_code", "home_file_code", "gamestateGrouping","activeLinks", "gameday_sw", "status", ["individualLink", "postseason_tv"] ];
				if(bam.clubhome) {
				 	data = [
						"home_team_name", "away_team_name", "away_team_runs", "home_team_runs",
						"inning", "outs", "top_inning", "runner_on_base_status",
						"venue", "time", "ampm", "time_zone", "away_time", "away_time_zone", "away_ampm",
						"home_time", "home_time_zone", "home_ampm",	"home_team_id", "away_team_id",
						"away_file_code", "home_file_code", "home_code", "away_code", "shortPlayerNames", 
						"home_win", "home_loss", "away_win", "away_loss", "activeLinks", 
						"gamestateGrouping", "gameday_sw", "status", ["individualLink", "postseason_tv"]	
					];
				}
				_linescore.main.UpdateRequest(data, "bam.mediawall.game.onDataReady");
			},		
			

			// @TODO: consider moving to event/trigger for gamestate changes		
			onDataReady: function(json){
				_log("onDataReady. displaying json below. _curIndex="+_curIndex);
				_log(json);
				var c, 
					panelObj = _config.panels[_curIndex],				
					$panel = _get("#media_wall .mw_panel:not('.isClone'):eq("+_curIndex+")");	
	
				$.extend(_config, json, {
					$panel			:	$panel,
					$pb_mlbtv		:	$panel.find(".mw_link_mlbtv"),
					$pb_gd			:	$panel.find(".mw_link_gameday"),
					$pb_listen		:	$panel.find(".mw_link_audio"),
					$pb_wrap		:	$panel.find(".mw_link_wrap"),
					$b_mlbtv		:	$panel.find(".mw_lnk_video"),
					$b_gd			:	$panel.find(".mw_lnk_gameday"),
					$b_listen		:	$panel.find(".mw_lnk_audio"),
					$b_wrap			:	$panel.find(".mw_lnk_wrapup"),
					gd_enabled		:	(json.gameday_sw === "Y" || json.gameday_sw === "E" || json.gameday_sw === "P"),					
					gd_link			:	json.gameday_link,							
					gd_link_exists	:	!!json.gameday_link,					
					audio_exists	:	!!json.audio_link,
					audio_link		:	"javascript:void("+json.audio_link+")",
					mlbtv_link		:	json.mlbtv_link || _config.mediacenterlink
				});
					
				c = _config; //shortcut handle for data object		
				// set media links to initial (hidden) state
				$panel.find(".mw_media_link a,  .mw_game_state a, .mw_link_wrap").removeClass("inline");		
				if(c.mlbtv_link!==c.mediacenterlink)c.mlbtv_link="javascript:"+c.mlbtv_link;			
				
				// @TODO: why does it need to check _linescore.counter?
				
				if(!!panelObj.gameid && panelObj.defkey === "mediawall-game" && panelObj.no_bscore !== "1" ) {
					_curGameID = panelObj.gameday;					
					$.extend(_config, {
						atbat_link : "javascript:void(launchGameday({gid:\""+panelObj.gameday+"\",mode:\"atbat\"}))"
					});				
					if(c.gamestate==="preview"){
						//preview
						_showLinescore();
						_linescore.onpreview();
					} else if(c.gamestate==="live"){
						//live
						_showLinescore(); 
						_linescore.onlive();
					} else if(c.gamestate==="final" && panelObj.hide_linescore === "1" ){				
						//extended final
						_hideLinescore();
						_linescore.onextendedfinal();
					} else if(c.gamestate==="final" && panelObj.hide_linescore === "0" ){
						//final
						_showLinescore(); 
						_linescore.onfinal();
					}
					
				} else {
					
					_hideLinescore();
				
				}			
						
									
				// invoke optional callback function			
				if($.isFunction(c.linescorecallback)) c.linescorecallback(c);	
				
				// increment counter w/ each swf poll
				// @TODO: why?
				_linescore.counter++;
		
			},
			
			isActive: function(){
				return _isActive;
			},
			
			getCurrentGame: function(){
				return _curGameID;
			}			
			
		};
		
	
	// bind init to gamePanelFound (triggered in mediawall.tpl)
	CORE.one("gamePanelFound",function(e,gameday){
		_game.init(gameday);			
	});	
		
	return _game;	
		
})(this, this.document, this.jQuery, undefined, this.bam);

