//##############################################################################
function TMetaOutput()
{
	this.PlayerLoaded = function()
		{
			//Only show player controls if player is externally controlable
			setVisibility('idPlayerControls', doitall.player.isControllable());

			//Hide player initially for gateway
			if(doitall.player.isControllable()) doitall.player.Hide();
		}

	this.CheckAndWrite = function(idRow, idStr, val)
		{
			if(val!=null && val!="")
			{
				DynWrite(idStr, val);
				setVisibility(idRow, true);
			}
			else setVisibility(idRow, false);
		}

	//Process list of tracks
	this.UpdateHistory = function()
		{
			//var idHistoryList = document.getElementById('idHistorySummary');
			//if(idHistoryList==null) return false;
			//setVisibility('idHistorySummary',true); //Make sure area is visible

			var list = doitall.mediadata.getMediaHistory(TMetaOutput.historyitems, TMetaOutput.mediatypes);

			for(var i=0; i<list.length; i++)
			{
				//If advertisement, override URLs and display items
				if(list[i]['songtype']=='A')
				{
					list[i]['artist']   = 'Sponsor';
					list[i]['album']    = null;
					list[i]['combined'] = 'Sponsor: '+list[i]['title'];

					if(list[i]['clickurl']!=null && list[i]['clickurl']!="")
					{
						list[i]['website'] = list[i]['clickurl'];
						list[i]['buycd']   = list[i]['clickurl'];
					}
				}

				//Handle first item different
				if(i==0)
				{
					setVisibility('tableTrackInfo', true);

					this.CheckAndWrite("divTitle", "title", list[i]['title']);
					this.CheckAndWrite("divArtist", "artist", list[i]['artist']);
					this.CheckAndWrite("divAlbum", "album", list[i]['album']);
					this.CheckAndWrite("divMMSS", "mmss", list[i]['mmss']);

					//BuyCD
					if(list[i]['buycd']!=null && list[i]['buycd']!="" && list[i]['buycd'].substring(11,21)!="audiorealm" ) // Changed for Creative, added removal for AudioRealm
					{
						var hrefBuyCD = document.getElementById('hrefBuyCD');
						hrefBuyCD.href = list[i]['buycd'];
						setVisibility('hrefBuyCD',true);
					}
					else setVisibility('hrefBuyCD',false);

					//Website
					if(list[i]['website']!=null && list[i]['website']!="")
					{
						var hrefArtistInfo = document.getElementById('hrefArtistInfo');
						hrefArtistInfo.href = list[i]['website'];
						setVisibility('hrefArtistInfo',true);
					}
					else setVisibility('hrefArtistInfo',false);

					//CoverPic
					setVisibility('imgCoverPic',false);
					if((list[i]['picture']!=null)&&(list[i]['picture']!=""))
					{
						//Set to coverpic zone
						metahandler.areaMainMode("coverpic");

						//Picture
						var imgCoverPic = document.getElementById('imgCoverPic');
						imgCoverPic.setAttribute('src', list[i]['picture']);

						//Link
						var hrefCoverPic = document.getElementById('hrefCoverPic');
						hrefCoverPic.href = list[i]['buycd'];
					}
				}
				//Handle rest of history items
				else
				{
					setVisibility('idRecentlyPlayed', true);

					this.CheckAndWrite("divH"+i, "H"+i, list[i]['combined']);
					var hrefH = document.getElementById("H"+i);
					hrefH.href = list[i]['buycd'];
				}
			}
		}

	this.UpdateStationData = function(station)
		{
			DynWrite("idStation_name",station["name"]);
			DynWrite("idStation_description",station["description"]);

			//Station logo
			if((station['image']!=null)&&(station['image']!=""))
			{
				setVisibility('station_logo', true);
				var imgLogo = document.getElementById('imgStationLogo');
				imgLogo.setAttribute('src', station['image']);
			}

			//Build link to station website
			var idStationWebsite = document.getElementById('idStationWebsite');
			if((station['website']!=null)&&(station['website']!=""))
			{
				var hrefStationWebsite = document.getElementById('hrefStationWebsite');
				hrefStationWebsite.href = station['website'];

				var hrefStationWebsite_logo = document.getElementById('hrefStationWebsite_logo');
				hrefStationWebsite_logo.href = station['website'];

				setVisibility("idStationWebsite",true);
			}
			else setVisibility("idStationWebsite", false);

			setVisibility("idStationInfo", true);
		}
}

//Static variables
TMetaOutput.mediatypes = 'A,S'; //Which types of tracks to get from historylist
TMetaOutput.historyitems = 5; //How many items to read from history list

//##############################################################################
TMetaHandler = function()
{
	this.metaoutput = null;

	this.Init = function()
		{
			this.do_Init();
		}

	this.Start = function()
		{
			this.do_Start();
		}

	//##########################################################################
	//PRIVATE METHODS & VARIABLES
	//--------------------------------------------------------------------------
	var lastMainMode = null;

	this.do_Init = function()
		{
			this.metaoutput = new TMetaOutput();
			//==========================================================================
			//Default doitall settings
			Lint.debugMode = true;
			doitall.RegisterVideoArea('idVideo');
			doitall.useGateway = true;
			doitall.preloadHistory = true;
			doitall.loadStationInfo = true;
			doitall.useDataPoller = true;
			doitall.useLocalMedia = true;
			doitall.useWMPOnChrome = true;

			//Subscribe to events
			doitall.onMedia.subscribe(this.cbDisplayMedia, this, true);
			doitall.onAds.subscribe(this.cbDisplayAds, this, true);
			doitall.onRestore.subscribe(this.cbRestore, this, true);
			doitall.onVideoBegin.subscribe(this.cbVideoBegin, this, true);
			doitall.onVideoEnd.subscribe(this.cbVideoEnd, this, true);
			doitall.onHistoryLoaded.subscribe(this.cbHistoryLoaded, this, true);
			doitall.onStationData.subscribe(this.cbStationData, this, true);
			doitall.player.onLoaded.subscribe(this.cbPlayerLoaded, this, true);

			this.do_ProcessParams();
		}

	this.do_Start = function()
		{
			//Load Player Settings
			if(doitall.stationID>0 && doitall.player.mediaurl==null)
			{
				doitall.player.mediaurl = 'http://player.spacialnet.com/players/listen.asx.php?htmlview=no&stationID='+doitall.stationID;
			}
			doitall.player.showcontrols = 'auto';
			doitall.player.autostart = true;
			doitall.player.width=320;
			doitall.player.height=250;
			doitall.RegisterPlayerSpace('idPlayerSpace');
		}

	this.do_ProcessParams = function()
		{
			//=====================
			//Parse external provided params
			var params = ParseQueryStr();

			//Canned demo settings
			if((params['canned']!=null) && (params['canned'].toLowerCase()=="y"))
			{
				doitall.stationID = 61540;
				doitall.publisherID = 13100;
				doitall.player.mediaurl = 'http://wm5.spacialnet.com/science1/canned/canned-localmedia-v4.wma';

				doitall.loadStationInfo = false;
				doitall.preloadHistory = false;

				//Custom station data
				var mydata = {"name":"Player Demo Station","description":"Top Hits from around the world","website":"http://www.audiorealm.com","image":"http://media.streamads.com/playersdk/v2/widgets/webplayer/arplayer/canned/logo.png","genres":"Pop,Rock,Alternative","webpicturedir":"http://media.streamads.com/playersdk/v2/widgets/webplayer/arplayer/canned/"}
				if(typeof(dpStationInfoCallback)=="function") dpStationInfoCallback(mydata);

				//Enable Debugging
				if(typeof(AdSense)!='undefined') AdSense.testingPhase = true;
				if(typeof(Lint)!='undefined') Lint.debugMode = true;
			}

			//Tune-in URL
			if(typeof(params['url'])!="undefined")
			{
				doitall.player.mediaurl = params['url'];
			}

			//Gateway support
			if(typeof(params['gw'])!="undefined")
			{
				doitall.useGateway = (params['gw'].toLowerCase()=='y') || (params['gw']>0);
			}

			//Shoutcast stream?
			if(typeof(params['sc'])!="undefined")
			{
				doitall.useWMPOnChrome = (params['sc'].toLowerCase()=='y') || (params['sc']>0);
			}

			//Don't resize player
			if((params['noresize']==null) || (params['noresize'].toLowerCase()=="n"))
			{
				showHideAd(728, 498);
				doitall.onAds.subscribe(this.cbEnlarge, this, true);
				doitall.onRestore.subscribe(this.cbShrink, this, true);
			}
		}

	//==========================================================================
	// Custom song data handling
	//##########################################################################
	this.cbPlayerLoaded = function(type, args, me)
		{
			this.metaoutput.PlayerLoaded();
		}

	this.cbStationData = function(type, args, me)
		{
			this.metaoutput.UpdateStationData(args[0]);
		}

	this.cbHistoryLoaded = function(type, args, me)
		{
			this.metaoutput.UpdateHistory();
		}

	this.cbDisplayMedia = function(type, args, me)
		{
			var media = args[0];
			this.metaoutput.UpdateHistory();
		}

	this.cbDisplayAds = function(type, args, me)
		{
		var ads = args[0];

			this.metaoutput.UpdateHistory();

			if(ads['hasvideo']!="yes")
			{
				//If we do not have a cover to display, we can display a text ad - if available
				if(ads['coverID']>0)
				{
					this.areaMainMode("coverad");
					doitall.streamads.DisplayInFrame(document.getElementById('frmCoverAd300x250'), ads, 'cover');
				}
				else this.areaMainMode("restore");
			}

			if(ads['bannerID']>0)
			{
				this.areaBottomMode("bannerad");
				doitall.streamads.DisplayInFrame(document.getElementById('frmBannerAd728x90'), ads, 'banner');
			}
			else this.areaBottomMode("restore");

			if(ads['textID']>0)
			{
				this.areaRightMode("textad");
				doitall.streamads.DisplayInID(document.getElementById('idAdText'), ads, 'text');
			}
			else this.areaRightMode("restore");
		}

	this.cbRestore = function(type, args, me)
		{
			this.areaMainMode("restore");
			this.areaRightMode("restore");
			this.areaBottomMode("restore");
			cbDisplayAds
		}

	this.cbEnlarge = function(type, args, me)
	{
		var ads = args[0];
		if(ads['bannerID']>0)
		{
			showHideAd(728, 588);
		}
	}

	this.cbShrink = function(type, args, me) {
		showHideAd(728, 498);
	}

	this.cbVideoBegin = function(type, args, me)
		{
			this.areaMainMode("videostart");
		}

	this.cbVideoEnd = function(type, args, me)
		{
			this.areaMainMode("videoend");
		}

	this.areaMainMode = function(mode)
		{
			//We can only use this area if we can conrol the player
			if(!doitall.player.isControllable()) return false;

			//See if we need to store mode for later use
			switch(mode)
			{
				case "restore"    : /* do nothing */ break;
				case "coverpic"   : lastMainMode = mode; break;
				case "videostart" : lastMainMode = mode; break;
				case "videoend"   : lastMainMode = null; mode = "restore"; break;
				default			  : lastMainMode = null; break;
			}

			//Restore to last known good mode
			if((mode=="restore")&&(lastMainMode!=null))
			{
				if(lastMainMode=="videostart") return false; //Still locked in video mode, abort
				if(lastMainMode=="coverpic") mode = lastMainMode; //Restore to coverpic mode
			}

			setVisibility("idCoverPic", mode=="coverpic");
			setVisibility("frmCoverAd300x250", mode=="coverad");
			//setVisibility("idVideo", mode=="video"); //We can't hide video area - this will prevent players from functioning

			//SLPlayer is always hidden
			if(doitall.player.getContextName()=="TSLPlayer")
			{
				doitall.player.Hide();
			}
			//Otherwise check if player should be hidden or shown
			else if(mode=="player" || mode=="restore")
				doitall.player.Show();
			else
				doitall.player.Hide();
		}

	this.areaRightMode = function(mode)
		{
			setVisibility('trAdText',  mode=="textad");
			setVisibility('divHistory', false); // Changed for Creative, was: setVisibility('divHistory', mode!="textad");
		}

	this.areaBottomMode = function(mode)
		{
			if(mode=="bannerad")
			{
				//TODO-increase popup window size
				setVisibility('frmBannerAd728x90', true);
			}
			else
			{
				setVisibility('frmBannerAd728x90',false);
				//TODO-decreate popup window size
			}
		}
	//==========================================================================
	}



	//==========================================================================
	// Functions for changing the window size
	//##########################################################################

	function detectBrowser() {
		var nVer = navigator.appVersion;
		var nAgt = navigator.userAgent;
		var browserName = navigator.appName;
		var fullVersion = '' + parseFloat(navigator.appVersion);
		var majorVersion = parseInt(navigator.appVersion, 10);
		var nameOffset, verOffset, ix;

		// In MSIE, the true version is after "MSIE" in userAgent
		if ((verOffset = nAgt.indexOf("MSIE")) != -1) {
			browserName = "Microsoft Internet Explorer";
			fullVersion = nAgt.substring(verOffset + 5);
		}
		// In Opera, the true version is after "Opera"
		else if ((verOffset = nAgt.indexOf("Opera")) != -1) {
			browserName = "Opera";
			fullVersion = nAgt.substring(verOffset + 6);
		}
		// In Chrome, the true version is after "Chrome"
		else if ((verOffset = nAgt.indexOf("Chrome")) != -1) {
			browserName = "Chrome";
			fullVersion = nAgt.substring(verOffset + 7);
		}
		// In Safari, the true version is after "Safari"
		else if ((verOffset = nAgt.indexOf("Safari")) != -1) {
			browserName = "Safari";
			fullVersion = nAgt.substring(verOffset + 7);
		}
		// In Firefox, the true version is after "Firefox"
		else if ((verOffset = nAgt.indexOf("Firefox")) != -1) {
			browserName = "Firefox";
			fullVersion = nAgt.substring(verOffset + 8);
		}
		// In most other browsers, "name/version" is at the end of userAgent
		else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
			browserName = nAgt.substring(nameOffset, verOffset);
			fullVersion = nAgt.substring(verOffset + 1);
			if (browserName.toLowerCase() == browserName.toUpperCase()) {
				browserName = navigator.appName;
			}
		}
		// trim the fullVersion string at semicolon/space if present
		if ((ix = fullVersion.indexOf(";")) != -1) fullVersion = fullVersion.substring(0, ix);
		if ((ix = fullVersion.indexOf(" ")) != -1) fullVersion = fullVersion.substring(0, ix);

		majorVersion = parseInt('' + fullVersion, 10);
		if (isNaN(majorVersion)) {
			fullVersion = '' + parseFloat(navigator.appVersion);
			majorVersion = parseInt(navigator.appVersion, 10);
		}
		//alert(browserName + ' ' + majorVersion);
		var browser = new Array();
		browser['name'] = browserName;
		browser['version'] = majorVersion;
		browser['full_version'] = fullVersion;
		browser['appName'] = navigator.appName;
		browser['userAgent'] = navigator.userAgent;

		return browser;
	}

	function changeSize(width, height) {
	    var p = document;
		(function(w, h) {
			var n = window, d = document, s = n.screen;
			function r(o) {
				n.resizeTo(w + o, h);
				return n.innerWidth || d.body.clientWidth;
			}
			function c(t, u) {
				return t > u ? (t - u) >> 1 : 0;
			}
			if (r(1) == r(0)) {
			    if (typeof p == "undefined" || p.closed) p.changeSize(w, h); n = p;
			}
			if (w > s.width || h > s.height) {
				n.moveTo(0, 0);
			}
		}
		)(width, height);
	}


	function correctBrowserSize(width, height, browser) {
		var w = width, h = height, dimentions = new Array();
		switch (browser['name']) {
			case 'Microsoft Internet Explorer':
				if (browser['version'] == 7) {
					w += 10;
					h += 82;
					break;
				}
				else if (browser['version'] == 6) {
					w += 9;
					h += 59;
					break;
				}
				else {
					w += 10;
					h += 40;
					break;
				}
				break;

			case 'Firefox':
				if (browser['version'] == 3) {
					w += 8;
					h += 81;
					break;
				}
				else if (browser['version'] == 2) {
					w += 6;
					h += 49;
					break;
				}
				else {
					w += 10;
					h += 90;
					break;
				}
				break;

			case 'Chrome':
				w += 10;
				h += 56;
				break;

			case 'Safari':
				w -= 5;
				h -= 15;
				break;

			case 'Opera':
				if(browser['version'])
				{
					w += 3;
					h -= 7;
				}
				break;

			default:
				w += 6;
				h += 49;
				break;
		}
		dimentions['w'] = w;
		dimentions['h'] = h;
		return dimentions;
	}

	function showHideAd(width, height) {
		var browser = detectBrowser();
		var Size = correctBrowserSize(width, height, browser)
		changeSize(Size['w'], Size['h'])
	}

	
	//Initialize global objects
	var metahandler = new TMetaHandler();
