function TWidgetDisplay()
{
	var isPageLoaded = false;
	var rotator = null;

	this.cbVideoBegin = function(type, args, me)
	{
		setVisibility('idCoverAd', false);
		setVisibility('idTextAd', false);
	}

	this.cbVideoEnd = function(type, args, me)
	{
		//do nothing
	}

	this.cbRestore = function(type, args, me)
	{
		//Enable normal banner rotation areas
		setVisibility('idBanner728x90', true);
		setVisibility('idCoverAd', true);

		//We do not have any active normal text rotation
		setVisibility('idTextAd', false);

		//Start banner rotation again
		rotator.Start(true);
	}


	this.cbStationData = function(type, args, me)
	{
		var station = args[0];
		DynWrite('idStationName', station['name']);
	}

	this.cbHistoryLoaded = function(type, args, me)
	{
		this.doDisplayHistory();
	}

	this.cbDisplayMedia = function(type, args, me)
	{
		this.doDisplayHistory();
	}

	this.cbDisplayAds = function(type, args, me)
	{
		this.doDisplayHistory();
	}

	this.cbPlayerLoaded = function(type, args, me)
	{
		//Resize player to make up the difference in size between WMP and Silverlight player controls
		if(doitall.player.isControllable() && doitall.player.getPlayer().getContextName()!='TWMPlayer')
		{
			doitall.player.setSize(doitall.player.width, 50);
		}

		if(doitall.player.isControllable())
		{
			//Do nothing
			//FUTURE: Hide player and show custom HTML controls instead??
		}
		else
		{
			//Show Silverlight Message
			document.getElementById('idStatusRow'). innerHTML = "<a href='http://www.microsoft.com/silverlight/install.aspx' target='_blank'>Install <b>Silverlight</b> for a better experience!</a>";
			setVisibility('idStatusRow', true);
		}

		//Hide initial loading page
		doitall.player.onBuffering.fire(100);
	}

	this.cbBuffering = function(type, args, me)
	{
		var bufferProgress = args[0];
		DynWrite('idStatus','Buffering ('+bufferProgress+'%)');
		setVisibility('idStatusRow',(bufferProgress!=100));
	}

	this.doDisplayHistory = function()
	{
		//var idHistory = document.getElementById('idHistory');
		var list = doitall.mediadata.getMediaHistory(5, "S,A"); //Return one item with songtype of A or S (Advertisement or Normal song)

		for(var i=0; i<list.length; i++) //Iterate through all the items returned (Should only be 1)
		{
			var media = list[i];
			if(i==0)
			 {
			 	if(list[i]['songtype']=='A')
			 	{
			 		this.doDisplayAds(media);
				}
				else
				{
					this.doDisplayMedia(media);
				}
			 }
			 else
			 {
			 	setVisibility('idHistory'+i, true);
			 	DynWrite('idArtistTitle'+i, media['combined']);

			 	var clickURL = null;
			 	var buyTitle = 'Buy';
			 	if(media['clickurl']!=null && media['clickurl']!='')
			 	{
			 		clickURL = media['clickurl'];
			 		buyTitle = 'Info';
			 	}
			 	else if(media['buycd']!=null && media['buycd']!='')
			 	{
			 		clickURL = media['buycd'];
			 	}

			 	if(clickURL!=null)
			 	{
			 		setVisibility('idHistoryLink'+i, true);
			 		var idHistoryLink_href = document.getElementById('idHistoryLink_href'+i);
			 		if(typeof(idHistoryLink_href)!='undefined')
			 		idHistoryLink_href.href = clickURL;
					idHistoryLink_href.innerHTML = buyTitle;
			 	}
			 	else setVisibility('idHistoryLink'+i, false);

			 	setVisibility('idHistory'+i, true);
			 }
		}
	}

	this.doDisplayMedia = function(media)
	{
		var list = doitall.mediadata.getMediaHistory(5, "S"); //Return one item with songtype of A or S (Advertisement or Normal song)

		DynWrite('idArtist',media['artist']);
		DynWrite('idTitle',media['title']);

		DynWrite('idBuyLink_href','Buy Track');
		document.getElementById('idBuyLink_href').href = media['buycd'];
		setVisibility('idBuyLink', true);
	}

	this.doDisplayAds = function(ad)
	{
		DynWrite('idArtist','Commercial Break');
		DynWrite('idTitle',ad['title']);

		//Stop banner rotation while in-stream ads are busy
		rotator.Stop();

		if(ad['clickurl']!=null && ad['clickurl']!='')
		{
			DynWrite('idBuyLink_href','Click to visit Sponsor');
			document.getElementById('idBuyLink_href').href = ad['clickurl'];
			setVisibility('idBuyLink', true);
		}
		else setVisibility('idBuyLink', false);

		//Hide banner/text-ad areas
		setVisibility('idCoverAd', false);
		setVisibility('idTextAd', false);

		if(ad['bannerID']>0)
		{
			setVisibility('idBanner728x90', true);
			doitall.streamads.DisplayInFrame(document.getElementById('frmAd728x90'), ad, 'banner');
		}
		else setVisibility('idBanner728x90', false);

		//See if we can display new Banner/Text-ads
		//Since we share the same area with the video ads
		//we can only do so if no video is being displayed
		if(ad['hasvideo']!='yes')
		{
			if(ad['coverID']>0)
			{
				setVisibility('idCoverAd', true);
				doitall.streamads.DisplayInFrame(document.getElementById('frmAd300x250'), ad, 'cover');
			}
			else if(ad['textID']>0)
			{
				setVisibility('idTextAd', true);
				doitall.streamads.DisplayInID(document.getElementById('idTextAd'), ad, 'text');
			}
		}
	}

	this.IFrameAttach = function(id)
	{
		var frm = new TIFrameRotator();
		frm.Attach(id);
		rotator.Add(frm);
		return frm;
	}

	this.InitWidgetDisplay = function(pid, sid)
	{
		//Advertisement rotator
		rotator = new TAutoIFrameRotator();
		rotator.interval = 4*60*1000; //Rotate every 4min

		var frmAd728x90 = this.IFrameAttach('frmAd728x90');
		var frmAd300x250 = this.IFrameAttach('frmAd300x250');

		frmAd728x90.AddURL("http://adserver.1.fm/BannerRotator.aspx?size=3", 90);
		frmAd300x250.AddURL("http://adserver.1.fm/BannerRotator.aspx?size=2", 90);

		//Advertisement frames
		if(pid>0)
		{
			//FUTURE: StreamAds Advertisement support (10% of rotation)
			frmAd728x90.AddURL("http://sa-m.streamads.com/view?t=b&o=html&zid=2&bsr=468,60,728,90&ct=_blank&ss=1&pid="+pid, 10);
			frmAd300x250.AddURL("http://sa-m.streamads.com/view?t=b&o=html&zid=2&bsr=100,100,320,250&ct=_blank&ss=1&pid="+pid, 10);
		}

		//Start rotating banners immediately
		rotator.Start(true);
	}
}


//##############################################################################
function TPlayerWidget()
{
	this.pid = 0;
	this.sid = 0;
	this.mediaURL = null;
	this.useSC = false;
	this.testingPhase = false;
	this.stationName = null;
	this.displayWidget = null;


	//## PUBLIC METHODS
	this.loadWidget_HTML = function()
	{
		//Initialize external specified params
		this.InitParams();

		if(this.sid<=0) { this.widgetError('SpacialNet/AudioRealm Station SID not specified.'); return false; }
		if(this.pid<=0) { this.widgetError('StreamAds Station PID not specified.'); return false; }

		//var widgetHTML = '<div id="idPlayerWidget"><div id="idStationName">Loading station...</div><div id="idNowPlaying"><div id="idArtist">Please wait.</div><div id="idTitle">Stream will start shortly...</div><div id="idBuyLink"><a id="idBuyLink_href" href="#" target="_blank">Buy</a></div></div><div id="idPlayerSpace"></div><div id="idCoverArea" style="width: 320px; height: 250px;"><div style="display:none;" id="idCoverAd"></div><div style="display:none;" id="idTextAd"></div><div style="display:none;" id="idCoverPic"><img id="imgCoverPic" onload="ShowCoverPic();" onerror="setVisibility(\'idCoverPic\',false);"></div><div id="idVideoArea"></div></div><div id="idStatusRow"><img id="idStatusImg" src="images/loader-transparent.gif" align="absmiddle"><span id="idStatus">Loading ...</span></div></div>';
		//document.write(widgetHTML);

		// Subscribe to onConfigure so that we can do configuration as soon as DOM is ready
		doitall.onConfigure.subscribe(this.doWidgetConfigure, this, true);

		// We call init to set up doitall and prepare the onConfigure event
		doitall.init();

		return true;
	}

	this.loadWidget_ASX = function(idWMPlayer)
	{
		isASX = true;
		internalPlayer = idWMPlayer;
		return this.loadWidget_HTML();
	}

	//## PRIVATE VARIABLES
	var isASX = false;
	var internalPlayer = null;

	//## PRIVATE METHODS
	this.widgetError = function(msg) { document.write('<font color="maroon">Error loading widget:</font> '+msg+'<br />'); }

	this.doWidgetConfigure = function()
	{
		this.InitializeWidget();
	}

	this.InitializeWidget = function()
	{
		this.displayWidget = new TWidgetDisplay();

		doitall.publisherID = this.pid;
		doitall.stationID = this.sid;
		doitall.player.mediaurl = this.mediaURL;
		doitall.useWMPOnChrome = this.useSC;
		doitall.timeoutPadding = 45000;

		if(this.testingPhase)
		{
			if(typeof(AdSense)!='undefined') AdSense.testingPhase = true;
			if(typeof(Lint)!='undefined') Lint.debugMode = true;
		}

		//Turn on/off features
		doitall.useGateway = true;
		doitall.useLocalMedia = true;
		doitall.preloadHistory = true;
		doitall.useDataPoller = false; //We assume it will be picked up from scripting metadata

		//Subscribe to events
		doitall.onMedia.subscribe(this.displayWidget.cbDisplayMedia, this.displayWidget, true);
		doitall.onAds.subscribe(this.displayWidget.cbDisplayAds, this.displayWidget, true);
		doitall.onStationData.subscribe(this.displayWidget.cbStationData, this.displayWidget, true);
		doitall.onHistoryLoaded.subscribe(this.displayWidget.cbHistoryLoaded, this.displayWidget, true);
		doitall.onRestore.subscribe(this.displayWidget.cbRestore, this.displayWidget, true);
		doitall.onVideoBegin.subscribe(this.displayWidget.cbVideoBegin, this.displayWidget, true);
		doitall.onVideoEnd.subscribe(this.displayWidget.cbVideoEnd, this.displayWidget, true);
		doitall.player.onLoaded.subscribe(this.displayWidget.cbPlayerLoaded, this.displayWidget, true);
		doitall.player.onBuffering.subscribe(this.displayWidget.cbBuffering, this.displayWidget, true);

		//Register advertisement areas
		doitall.RegisterVideoArea('idVideoArea');

		//Load hard-coded station information
		if(this.stationName!=null)
		{
			doitall.loadStationInfo = false;
			var myStationData = {"name": this.stationName, "webpicturedir": ""}
			if(typeof(dpStationInfoCallback)=="function") dpStationInfoCallback(myStationData);
		}
		else doitall.loadStationInfo = true;

		//If we are running inside ASX's HTMLView
		if(isASX)
		{
			//Hide Player Space as we won't be using it
			setVisibility('idPlayerSpace', false);

			//Attach player
			var wmplayer = new TWMPlayer();
			wmplayer.attachPlayer(internalPlayer);
			doitall.player.attachPlayer(wmplayer);
		}
		//Normal HTML page
		else
		{
			//Player settings
			doitall.RegisterPlayerSpace('idPlayerSpace');
			doitall.player.width = 380;
			doitall.player.height = 45;
			doitall.player.showcontrols = true;
			doitall.player.autostart = true;
		}

		//Initialize display widget
		this.displayWidget.InitWidgetDisplay(doitall.publisherID, doitall.stationID);
	}

	this.InitParams = function()
	{
		var params = ParseQueryStr();
		var id = 100;
		if(params['id']!='undefined' && params['id']>0) id = params['id'];
		ApplyStationSettings(id);
	}
}

var playerWidget = new TPlayerWidget();

function ApplyStationSettings(lookup_id)
{
	if(lookup_id>0)
	{
		playerWidget.pid = stations[lookup_id]['pid'];
		playerWidget.sid = stations[lookup_id]['sid'];
		playerWidget.stationName = stations[lookup_id]['name'];
		playerWidget.mediaURL = stations[lookup_id]['url'];

		//Turn on ad-sense testing for Test stations
		if(lookup_id==100 || lookup_id==101) playerWidget.testingPhase = true;
	}
}
