/*
 *  @include "/MSG.Player/web/js/browser.js" 
 *  @include "/MSG.Player/web/js/swfobject.js"
 *  @include "/MSG.Player/web/js/tpPDK.js"
 */

msgPlayer = new function ()
{
	var DESKTOP = 'desktop';
	var MOBILE = 'mobile';
	var IPAD = 'ipad';
	
	var FLASH = 'flash';
	var HTML5 = 'html5';
	
	// for some reason url autodetection causes problems in some browsers when displaying player in IFRAME sometimes
	// not sure - may be it was caused by another issue fixed later
	// so if there will be some issues with, will need to set "site" and "base" URLs explicitly
    var siteUrl = location.protocol + '//' + location.host + '/videos/';
    var baseUrl = location.protocol + '//' + location.host + '/swf/tpPlayer/';

    //var siteUrl = 'http://msgcom.omnigon.com/videos/';
    //var baseUrl = 'http://msgcom.omnigon.com/swf/tpPlayer/';
	
	var desktopFeedUrl = 'http://feed.theplatform.com/f/TZlbt/NBzzJok_5hX0';
	var mobileFeedUrl = 'http://feed.theplatform.com/f/TZlbt/K26rBjCJhQYx';
	var iPadFeedUrl = 'http://feed.theplatform.com/f/TZlbt/xNXnoyMUOiIJ';
	
	var feedUrls = {};
	feedUrls[DESKTOP] = desktopFeedUrl;
	feedUrls[MOBILE] = mobileFeedUrl;
	feedUrls[IPAD] = iPadFeedUrl;
	
	var requestedMediaId = null;
	
	
	this.createIn = function (target, width, height, mediaId, autoPlay, redirectRelatedItems, feed, type)
	{
		return this.createPlayer(target, width, height, mediaId, autoPlay, redirectRelatedItems, feed, type);
	};

	this.create = function (width, height, mediaId, autoPlay, redirectRelatedItems, feed, type)
	{
		return this.createPlayer(null, width, height, mediaId, autoPlay, redirectRelatedItems, feed, type);
	};
	
	this.createPlayer = function (target, width, height, mediaId, autoPlay, redirectRelatedItems, feed, type)
	{
		//feed = MOBILE;
		//type = HTML5;
		
		if (target && $(target) == null)
		{
			throw new Error('Can\'t find target: ' + target);
		}
		
		requestedMediaId = mediaId;
		
		var feedFormat = getFeedFormat(feed);
		var feedUrl = feedUrls[feedFormat];
		var mediaUrl = getMediaUrl(feedUrl, mediaId);
		
		var seed = Math.round(Math.random() * 1000000);
		
		this.createPlayerContainers(target, seed, width, height);

		if (useFlashPlayer(feedFormat, type)) 
		{
			this.createFlashPlayer(seed, width, height, feedUrl, mediaUrl);
		}
		else
		{
			this.createHTML5Player(seed, width, height, feedUrl, mediaUrl);
		}
		
		this.setupPlayerListeners(seed, autoPlay, redirectRelatedItems);
		
		return {
			
			start: function()
			{
				try
				{
					tpController.clickPlayButton(['scope' + seed]);
				}
				catch (e)
				{
					tpController.trace('[ERROR] Player' + seed + ': can\'t start video');
				}
			},
			
			play: function()
			{
				try
				{
					tpController.pause(false, ['scope' + seed]);
				}
				catch (e)
				{
					tpController.trace('[ERROR] Player' + seed + ': can\'t play video');
				}
			},
			
			pause: function()
			{
				try
				{
					tpController.pause(true, ['scope' + seed]);
				}
				catch (e)
				{
					tpController.trace('[ERROR] Player' + seed + ': can\'t pause video');
				}
			}
			
		};
	};
	
	var getFeedFormat = function (feed) 
	{
		if (feed)
		{
			return feed;
		}
		else
		{
			return msgPlayerUtils.isIOS() ? IPAD : (msgPlayerUtils.isAndroid() || !BROWSER.is_Flash) ? MOBILE : DESKTOP;
		}
	};
	
	var useFlashPlayer = function (feedFormat, type) 
	{
		if (type)
		{
			return (type == FLASH);
		}
		else
		{
			return (feedFormat == DESKTOP || (feedFormat == MOBILE && BROWSER.is_Flash));
		}
	};
	
	var getMediaUrl = function (feedUrl, mediaId)
	{
		if (feedUrl.charAt(feedUrl.length-1) != '/') feedUrl += '/';
		
		var mediaUrl = feedUrl + mediaId;
		
		return mediaUrl;
	};	
		
	this.createPlayerContainers = function (target, seed, width, height)
	{
		// placeholder for player
		var html = msgPlayerUtils.substitute('<div id="{0}" style="width:{1}px; height:{2}px;"></div>', 
			'player' + seed, width, height);
		
		// placeholder for release model
		html += msgPlayerUtils.substitute('<div id="{0}" style="position:absolute; top:0px; left:0px;"></div>', 
				'releasemodel' + seed);
		
		if (target)
		{
			setHTML(target, html);
		}
		else
		{
			writeHTML(html);
		}
		
		// it fixes bug when release model is displayed inside invisible container;
		// however it creates new issue in IE7:
		// http://www.nirmaltv.com/2007/08/08/how-to-fix-internet-explorer-cannot-open-the-internet-site-operation-aborted-error/
		/*
		var releaseModelDiv = document.createElement('div');
		releaseModelDiv.setAttribute('id', 'releasemodel' + seed);
		releaseModelDiv.setAttribute('style', 'position:absolute; top:0px; left:0px;');

		document.body.appendChild(releaseModelDiv);
		*/
	};
	
	this.createFlashPlayer = function (seed, width, height, feedUrl, mediaUrl)
	{
		this.createFlashVideoPlayer(seed, width, height, feedUrl);
		this.createFlashReleaseModel(seed, mediaUrl);
	};
	
	this.createFlashVideoPlayer = function (seed, width, height, feedUrl)
	{
		var player = new Player('player' + seed, width, height);
		
		player.fp.quality = 'high';
		player.fp.scale = 'noscale';
		player.fp.salign = 'tl';
		player.fp.menu = 'false';
		player.fp.allowScriptAccess = 'always';
		player.fp.wmode = 'transparent';
		player.fp.allowFullScreen = 'true';
		player.fp.bgcolor = '#000000';		
		
		player.scopes = 'scope' + seed;
		player.logLevel = 'warn';
		
		if (msgPlayerUtils.isAndroid())
		{
			player.skinURL = baseUrl + 'pdk/swf/skinGlass.swf';
			player.layoutUrl = baseUrl + 'data/mobileLayout.xml';
		}
		else
		{
			player.skinURL = baseUrl + 'pdk/swf/skinCinematic.swf';
			player.layoutUrl = baseUrl + 'data/desktopLayout.xml';
		}
		
		player.playerURL = 'Obtaining data...';
		player.embeddedPlayerHTML = 'Obtaining data...';
		
		player.relatedItemsURL = feedUrl
	    	+ '?range=1-' 
	    	+ '&byRelatedReleasePid={releasePID}'
	    	+ '&siteMap=true&linkUrl=%7Btitle%7D';
		
		player.backgroundColor = '0x000000';
		player.controlBackgroundColor = '0x000000';
		player.controlColor = '0xFFFFFF';
		player.controlFrameColor = '0x545759';
		player.controlHighlightColor = '0x242424';
		player.controlHoverColor = '0xFFFFFF';
		player.controlSelectedColor = '0xAAAAAA';
		player.frameColor = '0x545759';
		player.loadProgressColor = '0xFFFFFF';
		player.pageBackgroundColor = '0x000000';
		player.playProgressColor = '0xD79A30';
		player.textBackgroundColor = '0x383838';
		player.textColor = '0xFFFFFF';
		player.scrubberColor = '0xFFFFFF';
		player.scrubberFrameColor = '0xD79A30';
		player.scrubTrackColor = '0xFFFFFF';
		player.allowFullScreen = 'true';
		player.autoPlay = 'false';
		player.showFullTime = 'true';
		player.showNav = 'false';
		player.showTitle = 'false';
		player.allowLink = 'true';
		player.endCard = 'tpMenuCard';
	
		player.plugin1 = 'type=adcomponent|URL=' + baseUrl + 'pdk/swf/inStream.swf|priority=1|host=ad.doubleclick.net';
		
		player.bind();
	};
	
	this.createFlashReleaseModel = function (seed, mediaUrl)
	{
		var releaseModel = new ReleaseModel('releasemodel' + seed);
		
		releaseModel.fp.wmode = 'transparent';
		releaseModel.fp.allowScriptAccess = 'always';
		
		releaseModel.scopes = 'scope' + seed;
		releaseModel.logLevel = 'warn';
		
		releaseModel.feedsServiceUrl = mediaUrl;
		releaseModel.params = 'siteMap=true&linkUrl=%7Btitle%7D&fields=author%2Ccontent%2CdefaultThumbnailUrl%2Cdescription%2CpubDate%2Ctitle%2Clink%2Cid%2Cplmedia$metrics';
		
		releaseModel.bind();
	};

	this.createHTML5Player = function (seed, width, height, feedUrl, mediaUrl)
	{
		this.createHTML5VideoPlayer(seed, width, height, feedUrl);
		this.createHTML5ReleaseModel(seed, mediaUrl);
	};
	
	this.createHTML5VideoPlayer = function (seed, width, height, feedUrl)
	{
		var player = new Player('player' + seed, width, height);
		
		player.scopes = 'scope' + seed;
		player.logLevel = 'debug';
		
		player.layoutUrl = baseUrl + 'data/mobileLayout.xml';
		
		player.relatedItemsURL = feedUrl
	    	+ '?range=1-' 
	    	+ '&byRelatedReleasePid={releasePID}'
	    	+ '&siteMap=true&linkUrl=%7Btitle%7D';
		
		player.autoPlay = 'false';
		player.showFullTime = 'true';
		player.showNav = 'false';
		player.showTitle = 'false';
		player.allowLink = 'true';
		player.endCard = 'tpMenuCard';
	
		player.plugin1 = 'type=adcomponent|URL=' + baseUrl + 'pdk/js/plugins/vast.js|priority=1|hosts=ad.doubleclick.net';
		
		player.bind();
	};
	
	this.createHTML5ReleaseModel = function (seed, mediaUrl)
	{
		var releaseModel = new ReleaseModel('releasemodel' + seed);
		
		releaseModel.scopes = 'scope' + seed;
		releaseModel.logLevel = 'debug';
		
		releaseModel.feedsServiceUrl = mediaUrl;
		releaseModel.params = 'siteMap=true&linkUrl=%7Btitle%7D&fields=author%2Ccontent%2CdefaultThumbnailUrl%2Cdescription%2CpubDate%2Ctitle%2Clink%2Cid';
		
		releaseModel.bind();
	};
	
	this.setupPlayerListeners = function (seed, autoPlay, redirectRelatedItems) 
	{
		if (!tpController)
		{
			setTimeout(this.setupPlayerListeners, 50, seed, autoPlay, redirectRelatedItems);
			return;
		}
		
		var me = this;
		
		var updateRelease = function (release)
		{
			if (release && release.id && release.link)
			{
    			var playerUrl = me.generatePlayerUrl(release.link);
    			tpController.callFunction('setPlayerUrl', [playerUrl], ['scope' + seed]);

				var mediaId = getMediaId(release);
				var embeddedPlayerHTML = me.generateEmbedHTML(mediaId);
				tpController.callFunction('setEmbeddedPlayerHtml', [embeddedPlayerHTML], ['scope' + seed]);
			}
		};
		
		tpController.addEventListener(
			'OnRefreshReleaseModel', 
			function(event) 
			{
		    	var feed = event.data;
		
		    	if (feed && feed.entries && feed.entries[0]) 
		    	{
		    		if (autoPlay)
		    		{
		    			tpController.setReleaseURL(feed.entries[0].url, true, ['scope' + seed]);
		    		}
		    		else
		    		{
	    				tpController.loadReleaseURL(feed.entries[0].url, true, ['scope' + seed]);
		    		}
		    		
		    		updateRelease(feed.entries[0]);
		    	}
			},
			['scope' + seed]
		);
		
		tpController.addEventListener('OnSetRelease', function(event) 
			{
				updateRelease(event.data);
			
				var mediaId = getMediaId(event.data);
				if (redirectRelatedItems && mediaId != requestedMediaId) 
				{
					var link = event.data.link;
					if (link) {
						document.location.href = me.generatePlayerUrl(link);
					}
				}
			},
			['scope' + seed]
		);
		
	};
	
	this.generatePlayerUrl = function (link)
	{
		return (siteUrl + link);
	};
	
	this.generateEmbedHTML = function (mediaId)
	{
		var id = 'MSG' + Math.round(Math.random() * 10000000);
		var width = 620;
		var height = 349; 
		var src = baseUrl + 'swf/flvPlayerEmbed.swf';
		
		var flashvars = msgPlayerUtils.substitute(
			'baseUrl={0}&siteUrl={1}&v={0}data/flashvars.txt&mediaId={2}',
			baseUrl, siteUrl, mediaId
		);
		
		return msgPlayerUtils.substitute(
			'<iframe src="{5}player.html?mediaId={6}" width="{1}" height="{2}" frameborder="0" scrolling="no"></iframe>\n' + 
			'<!--\n' +
				'If your site does not support iframes, remove IFRAME block above and ' +
				'uncomment OBJECT block below to use Flash Video Player for embedding.\n' +
				'Please note, Flash Video Player won\'t work on iOS devices.\n' +
			'-->\n' +
			'<!--\n' + 
			'<object id="{0}" width="{1}" height="{2}" data="{3}" flashvars="{4}" ' + 
				'type="application/x-shockwave-flash" allowFullScreen="true" wmode="transparent">\n' +
					'<param name="movie" value="{3}" />\n' +
					'<param name="wmode" value="transparent"/>\n' +
					'<param name="allowFullScreen" value="true"/>\n' +
					'<param name="flashvars" value="{4}"/>\n' +
			'</object>\n' +
			'-->',
			id, width, height, src, flashvars, baseUrl, mediaId);
	};
	
	var getMediaId = function (release) {
		return (release && release.id) ? release.id.substr(release.id.lastIndexOf('/') + 1) : null;
	};
	
	var $ = function (el) 
	{
		return (typeof el == "string") ? document.getElementById(el) : el;
	};

	var addHTML = function(target, html)
	{
		var t = $(target);
		
		if (t && t.innerHTML != null)
		{
			t.innerHTML += html;
		}
	};
	
	var setHTML = function(target, html)
	{
		var t = $(target);
		
		if (t && t.innerHTML != null)
		{
			t.innerHTML = html;
		}
	};
	
	var writeHTML = function (html)
	{
		document.write(msgPlayerUtils.substitute.apply(msgPlayerUtils, arguments));
	};
	
};
	
	
msgPlayerUtils = new function ()
{
	var params;
	
	this.getParam = function (key, defaultValue)
	{
		if (!params)
		{
			params = {};
			var href = document.location.href; 
			
			if (href.indexOf('?') > 0 && href.indexOf('=') > 0) 
			{
				var query = href.split('?')[1].split('&');
		
				for (var i = 0; i < query.length; i++) 
				{
					var pair = query[i].split('=');
					params[pair[0].toLowerCase()] = pair[1];
				}
			}
		}
		
		key = key.toLowerCase();
		
		return (params[key] != null) ? params[key] : defaultValue;
	};
	
	this.log = function (str) {
		if (window.console && window.console.log) {
			window.console.log(str);
		}
	};
	
	this.isIPad = function () 
	{
		return (navigator.userAgent.match(/iPad/i));
	};
	
	this.isIPod = function () 
	{
		return (navigator.userAgent.match(/iPod/i));
	};
	
	this.isIPhone = function () 
	{
		return (navigator.userAgent.match(/iPhone/i));
	};
	
	this.isAndroid = function () 
	{
		return (navigator.userAgent.match(/Android/i));
	};
	
	this.isVideoPhone = function () 
	{
		return this.isIPhone() || this.isIPod() || this.isAndroid();
	};
	
	this.isIOS = function () 
	{
		return this.isIPhone() || this.isIPod() || this.isIPad();
	};
	
	
	this.substitute = function ()
	{
		var str = arguments[0];
		var args = arguments;
		
		if (str == null) return '';
	
		var len = args.length;
	
		for (var i = 1; i < len; i++)
		{
			str = str.replace(new RegExp('\\{' + (i-1) + '\\}', 'g'), args[i]);
		}
	
		return str;
	};
		
	this.addUrlParam = function (url, key, value)
	{
		return url + ( (url.indexOf('?') == -1) ? '?' : '&' ) + key + '=' + value;
	};
		
	this.parseXML = function (text)
	{
		if (window.DOMParser)
		{
			var parser = new DOMParser();
			var xmlDoc = parser.parseFromString(text, 'text/xml');
		}
		else // Internet Explorer
		{
			var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
			xmlDoc.async = 'false';
			xmlDoc.loadXML(text); 
		} 	
		return xmlDoc;
	};
};
