var playerHandle;
var rssBrowserHandle;
var channelBrowserHandle;
var gaSwfHandle;

var channelDataUrl= null; // of the form http://www.sportpass.tv/mds/[country|world]/xml/channels.xml
var channelToPlay = "";
var videoToPlay = "";
var firstVideoUrl = "";
var rssXmlToLoad = "";
var frameColor = " 0x37a40f";
var activeTitlesColor = "0x37a40f";
var autostart = false;
var hasFirstPlayed = false; // INTERNAL! First play is treated differently than subsequent ones 

var currentChannelData = new Array(); //used to store descriptive info about the current channel
var currentVideoData = new Array(); // used to store descriptive info about the current video

var encodedChannelTitle = null; //persisted for tracking video starts/ends 
var encodedVideoTitle = null; //persisted for tracking video starts/ends

var siteMode = "standard";
var embedType = "";
var embedCodeGeneratorType = "video";
var embedPrepend = null;
var rssBrowserWidth = 436;
var rssBrowserHeight = 36;
var channelBrowserWidth = 1024;
var channelBrowserHeight = 70;
var playerWidth = 600;
var playerHeight = 340;
var videoDetailsImageWidth = 80;
var videoDetailsImageHeight = 60;
var bannerAdDelayInMS = 5000;

var maxCharsInChannelDescription = 150;
var maxCharsInVideoDescription = 400;
var videoDetailsTimeoutId = null; 
var chanDetailsTimeoutId = null;
var onVideoErrorTimeoutId = null;
var accordionTimeoutId = null;
var heartbeatTimeInSec = 0;
var country = null; 
var gaAcctId = null;
var gaReportingPageRoot = null;
var docPrepend = null;

var firstVideoObj = null; // used internally to launch the JW video embed player w/ thumb

function setProperty(type, value)
{
	if (value == null || value < 1) return false;
	switch (type)
	{
		case "firstVideoUrl":
			firstVideoUrl = value;
		break;
		case "embedCodeGeneratorType":
			embedCodeGeneratorType = value;
		break;
		case "channelToPlay":
			channelToPlay = value;
		break;
		case "videoToPlay":
			videoToPlay = value;
		break;
		case "country":
			country = value;
		break;
		case "gaAcctId":
			gaAcctId = value;
		break;	
		case "rssBrowserWidth":
			rssBrowserWidth = value;
		break;
		case "rssBrowserHeight":
			rssBrowserHeight = value;
		break;
		case "channelBrowserWidth":
			channelBrowserWidth = value;
		break;
		case "channelBrowserHeight":
			channelBrowserHeight = value;
		break;
		case "playerWidth":
			playerWidth = value;
		break;
		case "playerHeight":
			playerHeight = value;
		break;
		case "videoDetailsImageWidth":
			videoDetailsImageWidth = value;
		break;
		case "videoDetailsImageHeight":
			videoDetailsImageHeight = value;
		break;
		case "maxCharsInVideoDescription":
			maxCharsInVideoDescription = value;
		break;
		case "maxCharsInChannelDescription":
			maxCharsInChannelDescription = value;
		break;
		case "siteMode":
			siteMode = value;
		break;
		case "embedType":
			embedType = value;
		break;
		case "bannerAdDelayInMS":
			bannerAdDelayInMS = value;
		break;
		case "rssXmlToLoad":
			rssXmlToLoad = value;
		break;
		case "embedPrepend":
			embedPrepend = value;
		break;
		default:
			return false;
	}
	return true;
}



function startPlayer(dataUrl)
{	
	// change this function to set channelDataUrl
	initCurrentDataHolders(dataUrl);
	setGaReportingPageRoot();	
	setChannelAndVideoFromPath();
	createPlayer();	
}

function initCurrentDataHolders(dataUrl)
{
 	currentChannelData["title"] = "";
 	currentChannelData["description"] = "";
 	currentChannelData["url"] = dataUrl;
 	
 	currentVideoData["title"] = "";
 	currentVideoData["description"] = "";
 	currentVideoData["image"] = "";
 	currentVideoData["url"] = "";
 	
 	channelDataUrl = dataUrl;
}

function setGaReportingPageRoot()
{
	var siteModeLabel = siteMode + ((embedType!="")?"_"+embedType:""); //"standard" or "embed" plus embed type for embed
	gaReportingPageRoot = "ga/" + country + "/" + siteModeLabel + "/";
}

function setChannelAndVideoFromPath()
{
	var path = location.href;
	var channelTitle = "";
	var videoTitle = "";
	var substrIndex = path.search(/#/);
	docPrepend = location.href;
	if (substrIndex > -1)
	{
		docPrepend = path.substr(0,substrIndex);
		path = path.substr(substrIndex+1);	
		titles = path.split("/");
		channelTitle = titles[1];
		if (titles[2])
		{
			videoTitle = titles[2];
		}
		if (channelTitle!="" && channelTitle!=null)
		{
			channelToPlay = decodeTitleFromFriendlyUrl(channelTitle);
		}
		if (videoTitle!="" && videoTitle!=null)
		{
			videoToPlay = decodeTitleFromFriendlyUrl(videoTitle);
		}
	}	
}

function createPlayer()
{
	debug("In createPlayer()");
	// sets up the video player itself
	var so = new SWFObject('/swf/mediaplayer.swf','mpl',playerWidth,playerHeight,'9');	
	so.addParam('allowfullscreen','true');
	so.addParam('allowScriptAccess','always');
	so.addParam("wmode","transparent"); // for premium longtail ad plugin
	so.addVariable('displayclick','fullscreen');
	so.addVariable('fullscreen','true');
	so.addVariable('repeat','list');
	so.addVariable('bufferlength','2');
	so.addVariable('callback','analytics');
	so.addVariable('controlbar','bottom');
	so.addVariable("backcolor","0x000000");
	so.addVariable("frontcolor","0x999999");
	so.addVariable("lightcolor", frameColor);	
	so.addVariable('linktarget','none');
	so.addVariable('abouttext','MediaMerx');
	so.addVariable('aboutlink','http://www.mediamerx.com');
	
	// premium ad settings
	so.addVariable("channel", "13375"); //premium code, standard was 12731
	so.addVariable("plugins", "ltas"); 
	so.addVariable('ltas.mediaid','defaultSportsVideo'); //p (needs to get updated dynamically)
	so.addVariable('title','The best international sports video for fans around the world'); //p (needs to get updated dynamically)
	so.addVariable('description','SportPass.TV provides videos of cricket, football, soccer, tennis, hockey, basketball, golf, racing and much more.'); // p (needs to get updated dynamically)

	// disable autostart for all embeds
	if (siteMode!="standard")
	{
		autostart = false;
	}
	
	if (firstVideoUrl!="" && embedType=="video") // this is a single video embed instance w/ just jw player
	{
		var thumburl = null;
		if (firstVideoUrl.indexOf("youtube")>-1)
		{
			// derive the thumb for yt videos
			var components = firstVideoUrl.split("/");
			var id = ((components[components.length-1]).split(".swf"))[0];
			thumburl = "http://i.ytimg.com/vi/"+id+"/default.jpg";
		}
		firstVideoObj = {file:firstVideoUrl,image:thumburl}; // this will get sent to the player later
	}
	
	if (videoToPlay!="" || channelToPlay!=""){
		// this is a linked-to video with flash components loaded
		// override the first video url, if any
		firstVideoUrl = null;
	}
	
	if (document.getElementById("mediaspace"))
	{
		so.write("mediaspace");
		//debug("triggering onPlayerReady() via delay");
		onPlayerReady();
	}
	else
	{
		//debug("Didn't find mediaspace");
		so.write("player");
	}
	
}

function playerReady(obj) 
{
	// player calls this function when it initializes. callback is built into the player swf
	// JW ad code screws this up for some reason and call never happens.
	//debug("In playerReady() function -- called by JW Player.  Triggering onPlayerReady()");
	onPlayerReady();
};

function onPlayerReady()
{
	// jury-rigged a little bit to account for JW bug with ad plug-in
	playerHandle = getSwf('mpl');
	if (!playerHandle)
	{
		setTimeout(onPlayerReady,750);
		//debug("in onPlayerReady() - Player handle not defined yet.  Will retry after delay.");
		return;
	}
	
	if (!setPlayerListeners())
	{
		setTimeout(onPlayerReady,750);
		//debug("in onPlayerReady() - Player listeners not connected yet.  Will retry after delay.");
		return;
	};
	
	createGaSwf();
	setTimeout(createRssBrowser,500);	
	//debug("in onPlayerReady() -- initializations complete");
}

function createGaSwf()
{
	// build the swf for flash GA
	var gaObj = new SWFObject('/swf/gaTracker.swf','ga',1,1,'9');
	gaObj.addParam("allowScriptAccess","always");
	gaObj.addParam("wmode","transparent");
	gaObj.addVariable("gaAcctNumber",gaAcctId);
	gaObj.addVariable("onReadyFnName","gaSwfReady");
	gaObj.write("gaSwf");
	gaSwfHandle = getSwf("ga");
}

function gaSwfReady()
{
	
	if (currentChannelData["url"]==null)
	{
		trackSingleVideoEmbed();
		debug("Tracked single video embed");
	}

	trackHeartbeat();
}	

function createRssBrowser()
{
	// builds the rssBrowser browser (assuming it should exist on the page!)
	if (heartbeatTimeInSec==0)
	{	
		// treating LTAS plugin bug where swf onReadys not getting called in XP FF
		setTimeout(gaSwfReady,5000);
	}
	
	if (embedType=="video")
	{
		// do not create the rssBrowser, but do initialize the video player w/ first video info
		playerHandle.sendEvent("LOAD",firstVideoObj);	
		return;
	}
	
	var browserObj = new SWFObject('/swf/rssbrowser_sp.swf','rb',rssBrowserWidth,rssBrowserHeight,'9');
	browserObj.addParam("allowScriptAccess","always");
	browserObj.addParam("wmode","transparent");
	browserObj.addVariable("activeColor",frameColor);
	browserObj.addVariable("inactiveColor","0xCCCCCC");
	browserObj.addVariable("backgroundColor","0x000000");
	browserObj.addVariable("videoToPlay",videoToPlay);
	browserObj.write("videos");
	rssBrowserHandle = getSwf("rb");
}

function rssBrowserReady()
{
	// rssBrowser swf calls this function after it initializes. 
	createChannelBrowser();
	setTimeout(updateCurrentEmbedLink,2500);
	setTimeout(brightenAccordion,1500);
	setTimeout(delayedDimAccordion,1500);
	setTimeout(updateChannelRollout,2600);
}

function createChannelBrowser()
{
	// builds the channels selector 
	var cbObj = new SWFObject('/swf/channelbrowser_sp.swf','cb',channelBrowserWidth,channelBrowserHeight,'9');
	cbObj.addParam("allowScriptAccess","always");
	cbObj.addParam("wmode","transparent");
	cbObj.addVariable("channelDataUrl",channelDataUrl);
	cbObj.addVariable("activeColor",frameColor);
	cbObj.addVariable("channelToPlay",channelToPlay);
	cbObj.addVariable("rssXmlToLoad",rssXmlToLoad);
	cbObj.write("channels");
	channelBrowserHandle = getSwf("cb");
}

function setPlayerListeners()
{
	// instead of updating item display when JW updates, update internally within videos browser and send "play" event to JW
	// add JW model listeners (tracking ERROR and STATE events)
	
	if (playerHandle.addModelListener)
	{
		playerHandle.addModelListener("ERROR","onPlayerError");
		playerHandle.addModelListener("STATE","onPlayerStateChange");
		return true;
	}
	else
	{
		return false;
	}
}

function onPlayerError(msg)
{
	if (onVideoErrorTimeoutId!=null)
	{
		clearTimeout(onVideoErrorTimeoutId);
		onVideoErrorTimeoutId = null;
	}
	onVideoErrorTimeoutId = setTimeout(function(){rssBrowserHandle.playNextVideo()},3000);
}

function onPlayerStateChange(status)
{
	if (status.newstate=="COMPLETED" && status.newstate!=status.oldstate)
	{
		trackVideoEnd();
		if(rssBrowserHandle.playNextVideo()==false)
		{
			channelBrowserHandle.changeToNextChannel();
		}
	}
}

function updateChannelsXml(url)
{
	//used to switch between local, world, extreme
	channelBrowserHandle.updateChannelsFeedUrl(url);
}

function updateChannelRollover(title,description)
{
	// update title display
	// document.getElementById("channel_title").innerHTML=title;
	if (siteMode=="standard") return; // as of June 23rd revision the descriptions are hidden
	
	
	//set & limit the description to two sentences.
	document.getElementById("channel_desc").innerHTML=truncateText(description,maxCharsInChannelDescription);

	// make element visible	
	if (chanDetailsTimeoutId!=null)
	{
		clearTimeout(chanDetailsTimeoutId);
		chanDetailsTimeoutId = null;
	}
	makeElementVisible("channel_desc");
	return;
}

function updateChannelRollout()
{
	// restore the channel title to the currently active title
	//document.getElementById("channel_title").innerHTML=currentChannelData["title"];
	if (siteMode=="standard") return; // as of June 23rd revision the descriptions are hidden
	
	// hide the description
	if (document.getElementById("channel_desc").innerHTML == currentChannelData["description"])
	{
		if (chanDetailsTimeoutId!=null)
		{
			clearTimeout(chanDetailsTimeoutId);
			chanDetailsTimeoutId = null;
		}
		chanDetailsTimeoutId = setTimeout(makeElementHidden,15000,"channel_desc");
	}
	else
	{
		makeElementHidden("channel_desc");
	}		
	return;
}

function hideVideoDetailsAndShowAd()
{
	//makeElementHidden("video_details");
	//makeElementVisible("Ad728x90");
}

function showVideoDetailsAndHideAd()
{
	//makeElementHidden("Ad728x90");
	makeElementVisible("video_details");
}

function updateVideoDetails(date, title, description, image)
{
	title = stripHTML(title);
	description = truncateText(stripHTML(description),maxCharsInVideoDescription);
	
	if (videoDetailsTimeoutId!=null)
	{
		clearTimeout(videoDetailsTimeoutId);
		videoDetailsTimeoutId = null;
	}

	if (siteMode=="standard")
	{
		// called by rssbrowser in response to mouseover off a box
		document.getElementById("video_image").innerHTML = "<img width='"+videoDetailsImageWidth+"' height='"+videoDetailsImageHeight+"' src='"+image+"' />";
		document.getElementById("video_date").innerHTML = date;
		document.getElementById("video_title").innerHTML = title;
		document.getElementById("video_desc").innerHTML = description;
	
		showVideoDetailsAndHideAd();	
		videoDetailsTimeoutId = setTimeout(hideVideoDetailsAndShowAd,bannerAdDelayInMS); //setTimeout(makeElementHidden,15000,"video_details");
		
	}
	return;
}
function makeElementVisible(id)
{	
	var handle = document.getElementById(id);
	if (handle!=null)
	{
		var style = handle.style;
		style.display = "block";
		
	}
}
function makeElementHidden(id)
{
	var handle = document.getElementById(id);
	if (handle!=null)
	{
		var style = handle.style;
		style.display = "none";
	}
}

function updateCurrentEmbedLink()
{
	encodedChannelTitle = encodeTitleForFriendlyUrl(currentChannelData["title"]);
	encodedVideoTitle = encodeTitleForFriendlyUrl(currentVideoData["title"]);
	var embedLink = embedPrepend + "#/"+ encodedChannelTitle + "/" + encodedVideoTitle + "/";
	document.getElementById("embedLinkInput").value=embedLink; 

	var docLink = docPrepend + "#/" + encodedChannelTitle + "/" + encodedVideoTitle + "/";
	location.href = docLink;
	
	generateEmbedCode();
	trackVideoStart();
}

function encodeTitleForFriendlyUrl(title)
{
	title = title.replace(/ /g, "_");
	title = title.replace(/&/g,"!@amp!");
	title = title.replace(/\//g, "!2f!");
	title = title.replace(/#/g,"!23!");
	return (encodeURI(title));
}

function decodeTitleFromFriendlyUrl(title)
{
	title = decodeURI(title);
	title = title.replace(/_/g, " ");
	title = title.replace(/!@amp!/g,"%26");
	title = title.replace(/!2f!/g, "/");
	title = title.replace(/!23!/g,"#");	
	return title;
}

function updateCurrentChannelData(title, description)
{
	//window.alert("Got "+title+", "+description);
	/// IN RESPONSE TO A CHANNEL CLICK
	currentChannelData["title"] = title;
	currentChannelData["description"] = truncateText(description,maxCharsInChannelDescription);
	trackChannelClick(title);
}

function truncateText(source, number)
{
	// strip out strange Â characters
	source = escape(source);
	source = source.replace(/%C2%A0/g, " ");
	source = unescape(source);
	
	// split on "." and return as many full sentences as will fit.
	var sentences = source.split('. ');
	if (sentences.length > 1)
	{	
		source = "";
		for (var i=0; i<sentences.length; i++)
		{	
			if (source.length + sentences[i].length < number)
			{	
				source += sentences[i]+". ";
			}
			else
			{
				// the sentence would exceed the character limit, so quit
				break;
			}
		}
	}
	else
	{
		// there is only one sentence.  if it's too long, restrict it
		if (source.length>number)
		{
			source = source.substr(0,number)+"...";
		}
	}
	
	return source;
}

function stripHTML(oldString) {

	  return oldString.replace(/<&#91;^>&#93;*>/g, "");

}

function changeToChannel(url)
{
	if (url!=currentChannelData["url"])
	{
		// load the new url into the rss browser swf, which will launch playback of the first video
		rssBrowserHandle.loadNewFeed(url);
	}			
}

function playThisVideo(url, title, desc, img)
{
	var obj = {file:url,image:img};
	if (hasFirstPlayed==false)
	{
		hasFirstPlayed = true;
		playerHandle.sendEvent("LOAD",obj);	
		if (autostart){
			playerHandle.sendEvent("PLAY","true");
		}
	} else if (url!=currentVideoData["url"])
	{
		// track video click
		playerHandle.sendEvent("STOP");
		playerHandle.sendEvent("LOAD",obj);
		playerHandle.sendEvent("PLAY","true");
	}
	
	updateCurrentVideoData(url, title, desc, img);
	updateCurrentEmbedLink();
}

function updateCurrentVideoData(url, title, description, image)
{
	
	currentVideoData["url"] = url;
	currentVideoData["title"] = title;
	currentVideoData["description"] = description;
	currentVideoData["image"] = image;
}

function changeChannelByName(pName)
{
	channelBrowserHandle.changeChannelByName(pName);
}


function brightenAccordion()
{
	if (siteMode=="embed") { return; }
	if (accordionTimeoutId!=null)
	{
		clearTimeout(accordionTimeoutId);
	}
	document.getElementById("accordion").style.visibility="visible";
	$("#accordion").fadeTo('slow',1.0);	
	
	document.getElementById("codes").style.visibility="visible";
	$("#codes").fadeTo('slow',1.0);
	
	document.getElementById("Ad120x90").style.display="block";
}

function delayedDimAccordion()
{
	if (siteMode=="embed") { return; }
	if (accordionTimeoutId!=null)
	{
		clearTimeout(accordionTimeoutId);
	}
	accordionTimeoutId = setTimeout(dimAccordion,5000);	
}

function dimAccordion()
{
	if (siteMode=="embed") { return; }
	$("#accordion").fadeTo("slow",0.2);	
	$("#codes").fadeTo("slow",0.2);
	document.getElementById("Ad120x90").style.display="none";
}

function debug(msg)
{
	//document.getElementById("debug").innerHTML += msg + "<br/>";
	return;
}

function getSwf(gid) 
{
	if(navigator.appName.indexOf("Microsoft") != -1) 
	{
		return window[gid];
	} 
	else 
	{
		return document[gid];
	}
};

function selectCode(id)
{
	var h = document.getElementById(id);
	h.focus();
	h.select();
}

function changeEmbedMode(type)
{
	if (type=="video" || type=="channel" || type=="site")
	{
		setProperty("embedCodeGeneratorType",type);
	}
	generateEmbedCode();
}
function generateEmbedCode()
{
	if (siteMode!="standard") return; // should only appear in full site
	var h = document.getElementById("ta");
	var iFrameHeight = null;
	var iFrameWidth = null;
	var iFrameSrcUrl = null;
	var iFrameCode = null;
	
	document.getElementById("embedderVideoLink").style.color = "#888";
	document.getElementById("embedderChannelLink").style.color = "#888";
	document.getElementById("embedderSiteLink").style.color = "#888";
	
	switch(embedCodeGeneratorType)
	{
		case "video":
			iFrameHeight = 300;
			iFrameWidth = 400;
		 	iFrameSrcUrl = embedPrepend+"?embed=true&height="+iFrameHeight+"&width="+iFrameWidth+"&embed_type=video&embed_url="+currentVideoData["url"];
			document.getElementById("embedderVideoLink").style.color = "#eee";
		break;
		case "channel":
			iFrameHeight = 366;
			iFrameWidth = 466;
			iFrameSrcUrl = embedPrepend+"?embed=true&height="+(iFrameHeight-66)+"&width="+iFrameWidth+"&embed_type=channel#/"+encodeTitleForFriendlyUrl(currentChannelData["title"])+"/";
			document.getElementById("embedderChannelLink").style.color = "#eee";
		break;
		case "site":
			iFrameHeight = 502;
			iFrameWidth = 610;
			iFrameSrcUrl = embedPrepend+"?embed=true&height="+iFrameHeight+"&width="+iFrameWidth+"&embed_type=site";
			document.getElementById("embedderSiteLink").style.color = "#eee";
		break;
	}
	
	iFrameCode = "<iframe id=\"sportpass\" ";
	iFrameCode += "src=\""+iFrameSrcUrl+"\" ";
	iFrameCode += "width=\""+iFrameWidth+"\" ";
	iFrameCode += "height=\""+iFrameHeight+"\" ";
	iFrameCode += "frameborder = \"0\" ";
	iFrameCode += "scrolling = \"no\" >";
	iFrameCode += "</iframe>"; 
		
	h.value = iFrameCode;
}

function trackCategoryClick(name)
{
	
	var virtualPageName = gaReportingPageRoot+"category_click/"+name;
	gaSwfHandle.trackPageview(virtualPageName);
}

function trackCategoryChannelClick(catName, chanName)
{
	var virtualPageName = gaReportingPageRoot+"category_click/"+catName+"/"+chanName;
	gaSwfHandle.trackPageview(virtualPageName);
}

function trackChannelClick(name)
{
	var virtualPageName = gaReportingPageRoot+"channel_click/"+name;
	gaSwfHandle.trackPageview(virtualPageName);
}

function trackVideoStart()
{
	var virtualPageName = gaReportingPageRoot+"video_start/"+encodedChannelTitle+"/"+encodedVideoTitle;
	gaSwfHandle.trackPageview(virtualPageName);
}

function trackVideoEnd()
{
	var virtualPageName = gaReportingPageRoot+"video_end/"+encodedChannelTitle+"/"+encodedVideoTitle;
	gaSwfHandle.trackPageview(virtualPageName);
}

function trackHeartbeat()
{
	var virtualPageName = gaReportingPageRoot+"heartbeat/"+heartbeatTimeInSec+"s";
	gaSwfHandle.trackPageview(virtualPageName);
	setTimeout(trackHeartbeat,15000);
	heartbeatTimeInSec += 15; 
}

function trackSingleVideoEmbed()
{
	var virtualPageName = gaReportingPageRoot+"url/"+firstVideoUrl;
	gaSwfHandle.trackPageview(virtualPageName);
}