var playerHandle;
var rssBrowserHandle;
var channelBrowserHandle;

var channelDataUrl= null;// of the form http://www.sportpass.tv/mds/[country|world|extreme]/xml/channels.xml
var frameColor = " 0x399EDD";
var activeTitlesColor = "0x399EDD";

var playItemIndex;

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 upNextVideoData = new Array(); // used to store descriptive info about the upcoming video

var siteMode = "standard";
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 videoDetailsOpacity = 100;

var maxCharsInChannelDescription = 330;
var maxCharsInVideoDescription = 1000;
var hideUpNextDisplay = true;
var videoDetailsTimeoutId = null; 
var chanDetailsTimeoutId = null;
var marqueeTimeoutId = null;

function setProperty(type, value)
{
	if (value == null || value < 1) return false;
	switch (type)
	{
		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 "videoDetailsOpacity":
			videoDetailsOpacity = value;
		break;
		case "siteMode":
			siteMode = value;
		break;
		default:
			return false;
	}
	return true;
}

function startPlayer(dataUrl)
{	
	// change this function to set channelDataUrl
 	currentChannelData["title"] = "";
 	currentChannelData["description"] = "";
 	currentChannelData["url"] = dataUrl;
 	
 	currentVideoData["title"] = "";
 	currentVideoData["description"] = "";
 	currentVideoData["image"] = "";
 	
 	upNextVideoData["title"] = "";
 	upNextVideoData["description"] = "";
 	upNextVideoData["image"]= "";
 	
	channelDataUrl = dataUrl;
	createPlayer();	
}

function 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.addVariable('autostart','false');
	so.addVariable('displayclick','fullscreen');
	so.addVariable('fullscreen','true');
	so.addVariable('repeat','list');
	so.addVariable('bufferlength','2');
	so.addVariable('callback','analytics');
	so.addVariable('controlbar','over');
	so.addVariable("frontcolor","0xf1f6fb");
	so.addVariable("lightcolor", "0x399edd");
	so.addVariable('backcolor','0x000000');
	so.addVariable('linktarget','none');
	so.addVariable('abouttext','MediaMerx');
	so.addVariable('aboutlink','http://www.mediamerx.com');
	so.write("player");
}

function playerReady(obj) 
{
	// player calls this function when it initializes. callback is built into the player swf
	var id = obj['id'];
	var version = obj['version'];
	var client = obj['client'];
	playerHandle = getSwf('mpl');
	setPlayerListeners();
	//createRssBrowser();
};

function rssBrowserReady()
{
	// rssBrowser swf calls this function after it initializes.
	createChannelBrowser();
	setTimeout(showNowPlaying,2500);
	setTimeout(updateChannelRollout,2600);
}
	
function getSwf(gid) 
{
	if(navigator.appName.indexOf("Microsoft") != -1) 
	{
		return window[gid];
	} 
	else 
	{
		return document[gid];
	}
};

function createRssBrowser()
{
	// builds the videos browser 
	var browserObj = new SWFObject('swf/rssbrowser_sp.swf','rb',rssBrowserWidth,rssBrowserHeight,'9');
	browserObj.addParam("allowScriptAccess","always");
	browserObj.addVariable("activeColor",frameColor);
	browserObj.addVariable("inactiveColor","0xCCCCCC");
	browserObj.addVariable("backgroundColor","0x000000");
	browserObj.write("videos");
	rssBrowserHandle = getSwf("rb");
}

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

function setPlayerListeners()
{
	// setup call backs -- JS functions for player to call in response to player events
	
	// register js callback to track when a new playlist has completed loading
	if (playerHandle.addControllerListener("PLAYLIST","startPlayback")==false)
	{
		window.alert("error setting playlist listener");
	}
	
	// register js callback for when the current video item changes
	if (playerHandle.addControllerListener("ITEM","updateItemDisplay")==false)
	{
		window.alert("failed to set item listener on controller");
	}
	
	// listen to when video changes state
	if (playerHandle.addModelListener)
	{
		playerHandle.addModelListener("ERROR","playNext");
		playerHandle.addModelListener("STATE","onPlayerStateChange");
		return true;
	}
}

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;
	
	//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;
	}
	makeElementOpaque("channel_desc");
	return;
}

function updateChannelRollout()
{
	// restore the channel title to the currently active title
	document.getElementById("channel_title").innerHTML=currentChannelData["title"];
	
	// hide the description
	if (document.getElementById("channel_desc").innerHTML == currentChannelData["description"])
	{
		if (chanDetailsTimeoutId!=null)
		{
			clearTimeout(chanDetailsTimeoutId);
			chanDetailsTimeoutId = null;
		}
		chanDetailsTimeoutId = setTimeout(makeElementTransparent,15000,"channel_desc");
	}
	else
	{
		makeElementTransparent("channel_desc");
	}		
	return;
}

function updateVideoDetails(date, title, description, image)
{
	title = stripHTML(title);
	description = stripHTML(description);
	
	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.replace(/<[^>]*>/g, "");
	
		makeElementOpaque("video_details");	
		videoDetailsTimeoutId = setTimeout('makeElementTransparent("video_details")',15000);
	}
	else if (siteMode=="embed")
	{
		// stop the upNext / nowPlaying ticker
		if (marqueeTimeoutId!=null){
			clearTimeout(marqueeTimeoutId);
		}
		
		updateMarquee(title);
		videoDetailsTimeoutId = setTimeout(showNowPlaying,10000);
	}
	return;
}
function makeElementOpaque(id)
{	
	var handle = document.getElementById(id);
	if (handle!=null)
	{
		var style = handle.style;
		style.display = 'block';
		/* style.filter = "alpha(opacity="+videoDetailsOpacity+")"; // for IE
		style.opacity = videoDetailsOpacity/100; // for CSS3 */
	}
}
function makeElementTransparent(id)
{
	var handle = document.getElementById(id);
	if (handle!=null)
	{
		var style = handle.style;
		style.display = 'none';
		/* style.filter = "alpha(opacity=0)"; // for IE
		style.opacity = "0"; // for CSS3 */
	}
}

function showNowPlaying()
{
	if (currentVideoData["title"]) {
		if (marqueeTimeoutId!=null)
		{
			clearTimeout(marqueeTimeoutId);
		}
		updateMarquee("NOW PLAYING: "+currentVideoData["title"]);
		marqueeTimeoutId = setTimeout(showUpNext,8000);
	}
}

function showUpNext()
{
	if (upNextVideoData["title"]) {
		if (marqueeTimeoutId!=null)
		{
			clearTimeout(marqueeTimeoutId);
		}
		if (!hideUpNextDisplay)
		{
			updateMarquee("UP NEXT: "+upNextVideoData["title"]);
		}
		
		marqueeTimeoutId = setTimeout(showNowPlaying,8000);
	}
}

function onPlayerStateChange(status)
{
	if (status.newstate=="COMPLETED" && status.newstate!=status.oldstate)
	{
		playNext();
	}
}

function playNext() {
	setTimeout("playNextDelayed()", 100);
}

function playNextDelayed() {
	var index = upNextVideoData["index"];
	if (index) {
		var div = document.getElementById('video_holder'+(index+1));
		loadVideo(currentChannelData["index"], index, div);
		div.onmouseover(); div.onmouseout();
	}
}

function updateMarquee(displayText)
{
	document.getElementById("marquee").innerHTML=displayText;
}

function updateCurrentChannelData(title, description, index)
{
	//window.alert("Got "+title+", "+description);
	currentChannelData["title"] = title;
	currentChannelData["description"] = truncateText(description,maxCharsInChannelDescription);
	currentChannelData["index"] = index;
}

function updateCurrentVideoData(title, description, image)
{
	currentVideoData["title"] = title;
	currentVideoData["description"] = description.replace(/<[^>]*>/g, "");
	currentVideoData["image"] = image;
}

function updateUpNextVideoData(title, description, image, index)
{
	upNextVideoData["title"] = title;
	upNextVideoData["description"] = description;
	upNextVideoData["image"] = image;
	upNextVideoData["index"] = index;
}

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 updatePlayer(url, single_videos)
{
	if (url!=currentChannelData["url"])
	{
		if (!single_videos)
		{
			// load the new url into the rss browser swf
			rssBrowserHandle.loadNewFeed(url);
		
			// load the new url into the video player and set the playback item index
			updateVideo(url,0);
		}
		else
		{
			currentChannelData["url"] = url;
		}
		
		return true;
	} return false;
}

function updateVideo(url,id)
{
	// updates the video loaded in the video player in response to a user click
	playerHandle.sendEvent("STOP");
	playItemIndex = id;
	
	if (currentChannelData["url"]!=url)
	{
		currentChannelData["url"] = url;
		playerHandle.sendEvent("LOAD",url);
		// playback will trigger automatically when the playlist has been loaded
	}
	else
	{
		// manually start playback on new index
		playerHandle.sendEvent("ITEM",playItemIndex);
	}
}

function playVideo(url) {
	if (currentVideoData["url"]!=url)
	{
		currentVideoData["url"] = url;
		
		// return false if there's no player handle
		if (!playerHandle) return false;
		
		playerHandle.sendEvent("LOAD",url);
		return true;
	} return false;
}

function startPlayback(infoObj)
{
	playerHandle.sendEvent("ITEM",playItemIndex);
	//window.alert("Current channel url is: "+cuurentChannelUrl);
}

function updateItemDisplay(infoObj)
{
	// get the list of videos
	var playlist = playerHandle.getPlaylist();
	
	// retrieve the index of the current item
	index = infoObj.index;
	
	// capture the current item's title/description/image
	var currItem = playlist[index];
	updateCurrentVideoData(currItem['title'], currItem['description'], currItem['image']); 
	
	// update the rss browser's display
	rssBrowserHandle.updateActiveItem(index,currentChannelData["url"]);
	
	// retrieve the next item's title/image/description (if available)
	if (index+1 < playlist.length)
	{
		var nextItem = playlist[index+1];
		updateUpNextVideoData(nextItem["title"], nextItem["description"], nextItem["image"]);
		hideUpNextDisplay = false;
	}
	else
	{
		hideUpNextDisplay = true;
		updateUpNextVideoData("","","");	
	}
	
	// reset the marquee
	showNowPlaying();
	
}
