function TV2Player(index,progId,itemId,autoplay,layout) {
	var webtvUrl = TV2Player.webtvUrl;
    if (!webtvUrl) webtvUrl = 'http://www.katsomo.fi/';
	var webtvPath = '/';
	var jsonPath = 'dido/meta.dox?';
	var bannerPath = 'http://www.katsomo.fi/multimedia/webtv/images/dido/banner/';
	var defaultAdCategory = 'ad.tv2.no';
	var defaultStartBannerLink = 'http://www.katsomo.fi/';
	var defaultStartBanner = bannerPath + 'sumo_banner.jpg';
	var defaultBandwidth = 800;
	var maxBandwidth = 800;
	var bwCookieName = 'webtv.bandwidth2';

	var tipVisible = false;
	var fromAddress = '';
	var fromName = '';
	var embedVisible = false;
	var effectDuration = 0.5;
	var expandTimeout;
	
	var minimizing = false;
	var restoring = false;
	var minimizeTimeout;
	var sliderTop;
	var isDragging = false;
	var isInSlider = false;
	
	var relatedCount = 4;
	var relatedGalleryCount = 5;
	var programTitle = '';
	var programText = '';
	var pngImageText = ''
	var txTime;
	var shareable = false;
	var adCategory = defaultAdCategory;
	var dartAdUrl = 'http://ad.doubleclick.net/adi/{adCategory};sz=450x60;tile=2;dc_seed=';
	var homeUrl = webtvUrl;
	var design = 'default';

	var treeId;	

	var programType;
	
	var plElm = $('tv2VideoPlayer' + index);
	var sizeElm = plElm.getElementsByTagName('div')[0];
	var modeElm = sizeElm.getElementsByTagName('div')[0];
	var designElm = modeElm.getElementsByTagName('div')[0];


	var isBadIe = (/MSIE ((5\.5)|6)/.test(navigator.userAgent) &&	navigator.platform == "Win32");
	var isInVideoCenter = (document.body.id == 'videoCenter');
	var isSelfContained = (document.body.className && document.body.className.indexOf('selfContained')>=0);
	var rotatorOnly = (location.href.indexOf('rotatorOnly=true')>0);

	var rotator = new TV2Rotator(index,progId);
	var player;
	
	// DART (DoubleClick) video ads
	var dartPlayer;

	if (rotatorOnly) {
		rotator.load();
	} else {
		var onPlayerHide = function(){
				$('prePanel' + index).style.visibility = 'visible';
			};

		player = new VideoPlayer(index,false,false,{onHide: onPlayerHide, onPlayerClick: playerClicked});
		rotator.setPlayer(player);
		
	}
	// Message resource surrogate
	if (!window.$MR) {
		var messages = new Object();
	
		function addMessage(key,message) {
			messages[key] = message;
		}
		
		function getMessage(key) {
			if (messages[key]==null) {
				return '!?!' + key + '!?!';
			}
			return messages[key];
		}

		messages['sumo.web.video.nonIE.missingPlugin']='<p>Olet käyttämässä Windows Media Playeria videon katsomiseen. Ohjelma ei ole asennettu oikein tai sen versio pitää päivittää. <a href="http://windowsmedia.com/download">Asenna viimeisin versio täältä.</a></p>';
		messages['sumo.web.video.status.quality1']='Videolaatu (kaistanleveys): ';
		messages['sumo.web.video.status.quality2']=' kbit/s. Klikkaa tästä muuttaksesi laadun.';
		messages['sumo.web.video.status.wmperror1']='Ohjelmassa Windows Media Player tapahtui virhe.';
		messages['sumo.web.video.status.wmperror2']='Klikkaa tästä saadaksesi lisätietoja.';
		messages['sumo.web.video.wmperrordialog1']='<p><br>Windows Media Player ei voi näyttää videota.</p>  <p>Helpdeskistämme saat lisätietoja.</p>';
		messages['sumo.general.video.status.startingvideo']='Video käynnistyy:<br>';
		messages['sumo.general.video.status.checkstarted']='Tarkista että ohjelma alkoi.';
		messages['sumo.general.video.status.notstarted']='Video ei käynnistynyt - kokeile uudelleen hetken kuluttua.';
		messages['sumo.general.video.status.buffering']='Bufferoi';
		messages['sumo.general.video.status.loading']='Hakee videota ({percent} % suoritettu)';
		messages['sumo.general.video.control.skipback']='Takaisin';
		messages['sumo.general.video.control.skipforward']='Eteenpäin';
		messages['sumo.general.video.control.skipto']='Hyppää';
		messages['sumo.web.video.upgrademessage'] = 'Parempaan videolaatuun, asenna <a href="http://port25.technet.com/pages/windows-media-player-firefox-plugin-download.aspx" target="_blank">Windows Media Player Firefox plugin</a>.';
		
		window.$MR = getMessage;
	}

	if (rotatorOnly) {
		Event.observe('startButton' + index,'click',function(e){ Event.stop(e)},false);
		Event.observe('startImage' + index,'click',function(e){ Event.stop(e)},false);
		Event.observe('restoreVideo' + index,'click',function(e){ Event.stop(e)},false);
		//Event.observe('shareButton' + index,'click',function(e){ Event.stop(e)},false);
		//Event.observe('sharePreButton' + index,'click',function(e){ Event.stop(e)},false);
	} else {
		Event.observe('startButton' + index,'click',startVideo,false);
		Event.observe('startImage' + index,'click',startVideo,false);
		Event.observe('restoreVideo' + index,'click',restoreVideo,false);
		Event.observe('shareButton' + index,'click',showEmbed,false);
		Event.observe('shareButton2' + index,'click',showEmbed,false);
		Event.observe('sharePreButton' + index,'click',showEmbed,false);
	}	

		// Prepare parameters
		var queryParams = location.search.toQueryParams();

		treeId = queryParams.treeId;
	
		
		//programTitle = rotator.getBanner(treeId);
		if (queryParams.autoplay=='true') autoplay=true;
		var live = queryParams.live;


	// get metadata on program, related programs and trees
	getMetadata();


	// show player
	plElm.style.visibility = 'visible';


	
	if (autoplay && !rotatorOnly) startVideo();

// Initialization (constructor) end




// -----------------------
// Member methods

	function startNewVideo(newProgId,newItemId,isLive,newProgramTitle) {
		startVideo(null,newProgId,newItemId,false,newProgramTitle);
	}
	
	function stopVideo() {
		player.hide();
	}

	this.startNewVideo = startNewVideo;
	this.stopVideo = stopVideo;
		
		
	function startVideo(e,newProgId,newItemId,isLive,newProgramTitle) {
		var oldProgId = progId;
		if (newProgId) {
			progId = newProgId;
			if (newItemId) {
				itemId = newItemId;
			}
		}
		
		if (newProgramTitle) {
			programTitle = newProgramTitle;
		}

		if (isLive!=null) live = isLive;
		
		
		if (Element.hasClassName(modeElm,'sumoMini') && layout.related) {
			modeElm.className = 'sumoMedium';
		}

		track();


		var bw;
		if (layout && layout.useDefaultBW) {
			bw = defaultBandwidth;
		}	else { 
			bw = getBandwidth();
			logDebug('Bandwidth from cookie: ' + bw);
		}
			
		if (!bw) {
			var bwTester = new BandwidthTester([],[],null,8000,false,logError,logDebug);
			bwTester.run({
				onStart: function() {
					Element.addClassName('prePanel' + index,'testingBw');
				},
				onComplete: function(bw) {
					storeBandwidth(bw);
					getVideoAds(bw);
					Element.removeClassName('prePanel' + index,'testingBw');
					logDebug('Bandwidth: ' + bw);
					
				},
				onTimeout: function() {
					storeBandwidth(defaultBandwidth);
					getVideoAds(defaultBandwidth);
					Element.removeClassName('prePanel' + index,'testingBw');
					logDebug('Bandwidth test timed out');
				},
				onError: function(code,message) {
					storeBandwidth(defaultBandwidth);
					Element.removeClassName('prePanel' + index,'testingBw');
					logDebug('Bandwidth test failed');
				}	
			});
		} else 
			getVideoAds(bw);
			
		if (e) Event.stop(e);
	}

	function getVideoAds(bw) {
		try {
			if (dido.adDispatcher.hasHandler('getVideoAds')) {
				dido.adDispatcher.getHandler('getVideoAds')(['preroll','postroll','sponsor1','sponsor2'],treeId,progId,function(adData){doStartVideo(bw,adData)});
			} else {
				doStartVideo(bw);
			}
		} catch(e) {
			logError('fetchVideoAds',e);
			doStartVideo(bw);
		}
	}


	function doStartVideo(bw,adData) {
		try {
			if (bw>maxBandwidth) bw = maxBandwidth;
			var adParams = "";
			if (adData && adData.ad) {
				if (adData.ad.preroll && adData.ad.preroll.format=='sumo-program' && adData.ad.preroll.id)
					adParams += '&a1=' + adData.ad.preroll.id;
					
				if (adData.ad.sponsor1 && adData.ad.sponsor1.format=='sumo-program' && adData.ad.sponsor1.id)
					adParams += '&a2=' + adData.ad.sponsor1.id;

				if (adData.ad.sponsor2 && adData.ad.sponsor2.format=='sumo-program' && adData.ad.sponsor2.id)
					adParams += '&a3=' + adData.ad.sponsor2.id;

				if (adData.ad.postroll && adData.ad.postroll.format=='sumo-program' && adData.ad.postroll.id)
					adParams += '&a4=' + adData.ad.postroll.id;
				
			}

			player.show();
			resetVideoSize();
			$('prePanel' + index).style.visibility = 'hidden';
			player.start({	
				'metaUrl': webtvUrl + 'metafile.asx?p=' + progId + (itemId ? '&i=' + itemId : '') + adParams + '&bw=' + bw,
				'progId': progId, 
				'hostProgId': null, 
				'programTitle': programTitle,
				'live': live, 
				'timeBegin': 0, 
				'startPos': 0, 
				'adData': adData, 
				'onShowExternalAd': showBannerAd,
				'onVideoAdPlay': dido.adDispatcher.getHandler('logVideoAdDisplay'),
				'bufferFlash': null
			});

			if (window._JT) {
			  _JT.SET('ve.category',programType);
			  _JT.SET('ve.id',progId);
			  _JT.SET('ve.name',programTitle);
			  _JT.SET('ve.txtime',add0(txTime.getMonth() + 1) + '/' + add0(txTime.getDate()) + '/' + (txTime.getFullYear() + '').substring(2) + ' ' + add0(txTime.getHours()) + ':' + add0(txTime.getMinutes())); // MM/DD/YY HH:mm
			  _JT.SET('ve.treeid',treeId);
			  _JT.SET('ve.type',live ? 'Live' : 'Vod'); // "Vod" or "Live"
			  _JT.SET('ve.payment','Free'); // "Free" if free content - "Paid" if chargeable
			  _JT.SET('ve.eventtype','start'); // "start" constant (until we can track stop/resume/etc
			  _JT.SET('t',document.title);
			  _JT.SEND();
				
			}
			
		} catch(ex) {
			logError(ex);
		}
	}

	function add0(number) {
		if (number < 10) {
			return '0' + number;
		}
		return number;
	}
	
	function getMetadata() {
		window.didoJSON.get('prog',progId,function(element) {
				programTitle = element.title;
				programText = element.text;
				shareable = element.sharable;
				txTime = new Date();
				txTime.setTime(element.txtime);
				treeId = element.treeId;
				live = element.live;
				pngImageText = element.pngText;
				
				var relatedTreeId;
				
				// Get tree
				window.didoJSON.get('tree',element.treeId,function(tree) {
						//if (tree.dido_player_adCategory && tree.dido_player_adCategory.indexOf('ad.tv2.no')==0)
							adCategory = tree.dido_player_adCategory
						//else
						//	adCategory = defaultAdCategory;
						logDebug('Ad category: ' + tree.dido_player_adCategory);
						
						programType = tree.programType;
							
						if (designElm.className.length < 15) { // sumoPlayerBox
							if (location.href.indexOf('design=')>0) {
									if (location.href.indexOf('design=default')>0)
										design = 'default';
									else if (location.href.indexOf('design=nyhetene')>0)
										design = 'nyhetene';
							} else if (tree.dido_player_design) {
								logDebug('Setting player design: ' + tree.dido_player_design);
								design = tree.dido_player_design;

							}
							Element.addClassName(designElm,design);
						}
						
						if (tree.dido_player_relatedTreeId)
							relatedTreeId = tree.dido_player_relatedTreeId;
						
						var sumoUrl = webtvUrl;
						
						if (tree.dido_player_sumoUrl)
							sumoUrl = tree.dido_player_sumoUrl
						else 
							sumoUrl = webtvUrl;
							
						var logoUrl = sumoUrl;

						$('sumoButton' + index).href = sumoUrl;
						$('logoButton' + index).href = logoUrl;
						$('logoPreButton' + index).href = logoUrl;
						if(layout.usePngText && pngImageText){
							$('pngImage'+ index).innerHTML = pngImageText;
						}
						
						if (tree.dido_player_homeUrl) {
							homeUrl = tree.dido_player_homeUrl && tree.dido_player_homeUrl;
						} 
						logDebug('Home url: ' + homeUrl);
						
						var startBannerLink = defaultStartBannerLink;
						if (tree.dido_player_bannerLink)
							startBannerLink = tree.dido_player_bannerLink;
						var startBanner = defaultStartBanner;
						if (tree.dido_player_banner)
							startBanner = bannerPath + tree.dido_player_banner;
						logDebug('Start banner: ' + startBanner);
						//$('sumoBannerAd'+index).innerHTML = '<a href="' + startBannerLink + '" target="_blank"><img src="' + startBanner + '"></a>'

				
						if (layout.relatedGallery) {
							if (element.related && element.related.programs && element.related.programs.length > 0) {
								// Current program is also listed in the gallery. Or, no.
								var itemCode = ''; //'<li class="relatedItemExposed" id="relatedItem'  + index  + '-' + progId + '"></li>';;
								for (var i=0;i<relatedGalleryCount && i<element.related.programs.length; i++) {
									var item = element.related.programs[i];
										itemCode += '<li class="relatedItemExposed" id="relatedItem'  + index  + '-' + item.id + '"></li>';
								}
								
								$('relatedList' + index).innerHTML = itemCode;

		
								for (var i=0;i<relatedGalleryCount && i<element.related.programs.length; i++) {
									var item = element.related.programs[i];
									logDebug('adding related program ' + item);
								
									var relatedHomeUrl = webtvUrl;
									if (item.tree.dido_player_homeUrl)
										relatedHomeUrl = item.tree.dido_player_homeUrl;
									
									var relationTitle = (item.relationTitle ? item.relationTitle : item.title);
									var relationText = (item.relationText ? item.relationText : item.text);
									
									
									var itemContent = '';
									itemContent += '<a title="' + relationTitle + '" progId="' + item.id + '" href="' + relatedHomeUrl + '?progId='+ item.id +'">';
									itemContent += '<img onerror="this.style.visibility = \'hidden\'" src="http://www.katsomo.fi/multimedia/vman/VMan-P' + Math.floor(parseInt(item.id)/1000) + '/VMan-P' + item.id + '_122x90.jpg">';
									itemContent += '<span class="sumoRelatedText">' + relationText + '</span>';
									itemContent += '<span class="sumoRelatedTitle">' + relationTitle + '</span></a>';
				
									$('relatedItem' + index  + '-' + item.id).innerHTML = itemContent;
									Event.observe($('relatedItem' + index  + '-' + item.id).getElementsByTagName('a')[0],'click',function(e){
											Event.stop(e);
											var elm = Event.element(e);
											if (elm.nodeName.toLowerCase() != 'a') {
												elm = elm.parentNode;
											} 
											startNewVideo(elm.getAttribute('progId'),null,false,elm.title); 										
										},false);						
								}
							}
						
						
						} else if (layout.related) {
						
							if (element.related && element.related.programs && element.related.programs.length > 0) {
								var itemCode = '';
								for (var i=0;i<relatedCount && i<element.related.programs.length; i++) {
									var item = element.related.programs[i];
										itemCode += '<li id="relatedItem'  + index  + '-' + item.id + '"></li>';
								}
								$('relatedList' + index).innerHTML = itemCode;
									
								// Looping twice, letting the DOM finish updating itself
								for (var i=0;i<relatedCount && i<element.related.programs.length; i++) {
									var item = element.related.programs[i];
			
									logDebug('adding related program ' + item);
									
									var relatedHomeUrl = webtvUrl;
									if (item.tree.dido_player_homeUrl)
										relatedHomeUrl = item.tree.dido_player_homeUrl;
									
									var relationTitle = (item.relationTitle ? item.relationTitle : item.title);
									
									var itemContent = '';
									itemContent += '<a target="_blank" href="' + relatedHomeUrl + '?progId='+ item.id +'">';
									itemContent += '<img onerror="if (this.parentNode && this.parentNode.parentNode) {this.parentNode.parentNode.style.display = \'none\'}" src="http://www.katsomo.fi/multimedia/vman/VMan-P' + Math.floor(parseInt(item.id)/1000) + '/VMan-P' + item.id + '_122x90.jpg">';
									itemContent += '<span>' + relationTitle + '</span></a>';
															
									$('relatedItem' + index  + '-' + item.id).innerHTML = itemContent;
									var theLink = $('relatedItem' + index  + '-' + item.id).getElementsByTagName('a')[0];
									var theBlind = $('relatedItem' + index  + '-' + item.id).getElementsByTagName('span')[0];
									if (theLink && theBlind) {
										regGalleryEffect(theLink,theBlind);
									}
									

								}
							} else if (relatedTreeId){
								window.didoJSON.get('programsByTree',relatedTreeId,function(programsByTree) {
										var i=0;
										programsByTree.programList.each(function(program){
												if (i<relatedCount && program.id!=progId) {
													var itemCode = '<li id="relatedItem' + index + '-' + program.id + '">';
													itemCode += '<a target="_blank" desc="' + program.title + '" href="' + homeUrl + '?progId='+ program.id +'">';
													itemCode += '<img onerror="if (this.parentNode && this.parentNode.parentNode) {this.parentNode.parentNode.style.display = \'none\'}" src="http://www.katsomo.fi/multimedia/vman/VMan-P' + Math.floor(parseInt(program.id)/1000) + '/VMan-P' + program.id + '_122x90.jpg">';
													
													itemCode += '<span>' + program.title + '</span></a></li>';
													$('relatedList' + index).innerHTML = $('relatedList' + index).innerHTML + itemCode; 
													i++;
												}
											});
											
										// Looping twice, letting the DOM finish updating itself
										i=0;
										programsByTree.programList.each(function(program){
												if (i<relatedCount && program.id!=progId) {
													var theLink = $('relatedItem' + index + '-' + program.id).getElementsByTagName('a')[0];
													var theBlind = $('relatedItem' + index + '-' + program.id).getElementsByTagName('span')[0];
													if (theLink && theBlind) {
														regGalleryEffect(theLink,theBlind);
													}
													i++;
												}
											});
									},function() {logDebug('Related tree programs not found');});
							} else {
								window.didoJSON.get('treeByProg',progId,function(treeByProg) {
										var i=0;
										treeByProg.programList.each(function(program){
												if (i<relatedCount && program.id!=progId) {
													var itemCode = '<li id="relatedItem' + index + '-' + program.id + '">';
													itemCode += '<a target="_blank" desc="' + program.title + '" href="' + homeUrl + '?progId='+ program.id +'">';
													itemCode += '<img onerror="if (this.parentNode && this.parentNode.parentNode) {this.parentNode.parentNode.style.display = \'none\'}" src="http://www.katsomo.fi/multimedia/vman/VMan-P' + Math.floor(parseInt(program.id)/1000) + '/VMan-P' + program.id + '_122x90.jpg">';
													
													itemCode += '<span>' + program.title + '</span></a></li>';
													$('relatedList' + index).innerHTML = $('relatedList' + index).innerHTML + itemCode; 
													i++;
												}
											});
											
										// Looping twice, letting the DOM finish updating itself
										i=0;
										treeByProg.programList.each(function(program){
												if (i<relatedCount && program.id!=progId) {
													var theLink = $('relatedItem' + index + '-' + program.id).getElementsByTagName('a')[0];
													var theBlind = $('relatedItem' + index + '-' + program.id).getElementsByTagName('span')[0];
													if (theLink && theBlind) {
														regGalleryEffect(theLink,theBlind);
													}
													i++;
												}
											});
			
			
									},function() {logDebug('More programs from tree not found');});
							}
						}
					},function() {logDebug('Tree metadata not found');});
			},function() {logDebug('Program metadata not found');});
	}
	
	function showRelatedTitle(title) {
		//$('programTitle' + index).innerHTML = title;
		Element.addClassName('programTitle' + index,'relatedTitle');
	}

	function hideRelatedTitle() {
		//$('programTitle' + index).innerHTML = programTitle;
		Element.removeClassName('programTitle' + index,'relatedTitle');
	}

	function hideBrokenImg(elm) {
	
	}

	function showSliderButton() {
	  if (sliderTop) $('sliderButton' + index).style.top = sliderTop;
	}
	function hideSliderButton() {
		logDebug('Hide slider: isInSlider: ' + isInSlider);
		if (!isDragging) {
			if (sliderTop==null) sliderTop = $('sliderButton' + index).currentStyle.top;
			$('sliderButton' + index).style.top = '1000px';
		}
	}
	
	function onEnterSlider() {
		isInSlider = true;
		showSliderButton();
		
	}
	
	function onExitSlider() {
		isInSlider = false;
		hideSliderButton();
	}
	
	function onStartDragging () {
		isDragging=true;
		logDebug('Start dragging: isInSlider: ' + isInSlider);
	}
	
	function onEndDragging () {
		isDragging=false;
		if (!isInSlider) {
			hideSliderButton();
		}
		logDebug('End dragging: isInSlider: ' + isInSlider);
	}



	function showBannerAd(companionPosition,companionId) {
		if (!layout || (layout && layout.bannerAd)) {

			Element.addClassName('sumoBannerAd' + index,'adShowing');
			
			if (layout.related || layout.relatedGallery)
				modeElm.className = 'sumoNormal'
			else
				modeElm.className = 'sumoMedium';

			dido.adDispatcher.getHandler('injectAd')(companionPosition,companionId);
			//if (Element.hasClassName(plElm,'mini') && ($('sumoBannerAd' + index).currentStyle.display=='none' || !Element.hasClassName(plElm,'medium'))) {
				//Element.removeClassName(plElm,'mini');
				//Element.addClassName(plElm,'medium');
			//}
		}
	}

	function showDartBannerAd() {
		logDebug('ShowDartBannerAd',adCategory);
		if (!layout || (layout && layout.bannerAd)) {
			var ord = Math.random() * 10000000000000000;
			var compString = dartAdUrl.replace(/{adCategory}/ig,adCategory);  // + dartPlayer.getAd().getDartId() + ';ord=' + ord;
			var compTag = dartPlayer.getRoadblockURL(compString);
	   	$('sumoBannerAd' + index).innerHTML = '<iframe src="' + compTag + ' scrolling="no" frameborder="0" allowtransparency="true">' + '</iframe>';
			Element.addClassName('sumoBannerAd' + index,'adShowing');
			
			if (layout.related || layout.relatedGallery)
				modeElm.className = 'sumoNormal'
			else
				modeElm.className = 'sumoMedium';
		}
	}

	function minimizeVideo() {
		var interval = 50;
		if (minimizing) return;
		if (restoring) clearTimeout(minimizeTimeout);
		resetVideoSize();
		$('features' + index).style.display = 'block';
		$('rotator' + index).style.visibility = 'hidden';
		minimizing = true;
		Element.addClassName('videoPanel' + index,'minimize1');
		minimizeTimeout = setTimeout(
			function() {
				Element.removeClassName('videoPanel' + index,'minimize1');
				Element.addClassName('videoPanel' + index,'minimize2');
				minimizeTimeout = setTimeout(
					function() {
						Element.removeClassName('videoPanel' + index,'minimize2');
						Element.addClassName('videoPanel' + index,'minimize3');
						minimizeTimeout = setTimeout(
							function() {
								Element.removeClassName('videoPanel' + index,'minimize3');
								Element.addClassName('videoPanel' + index,'minimized');
								minimizing = false;
							},interval);
					},interval);
			},interval);
		
	}

	function restoreVideo(ev) {
		var interval = 50;
		if (restoring) return;
		if (minimizing) clearTimeout(minimizeTimeout);
		resetVideoSize();
		restoring = true;
		$('features' + index).style.display = 'block';
		Element.addClassName('videoPanel' + index,'minimize3');
		minimizeTimeout = setTimeout(
			function() {
				Element.removeClassName('videoPanel' + index,'minimize3');
				Element.addClassName('videoPanel' + index,'minimize2');
				minimizeTimeout = setTimeout(
					function() {
						Element.removeClassName('videoPanel' + index,'minimize2');
						Element.addClassName('videoPanel' + index,'minimize1');
						minimizeTimeout = setTimeout(
							function() {
								Element.removeClassName('videoPanel' + index,'minimize1');
								$('features' + index).style.display = 'none';
								restoring = false;
							},interval);
					},interval);				
			},interval);
		if(ev) Event.stop(ev);	
	}

	function resetVideoSize() {
		Element.removeClassName('videoPanel' + index,'minimized');
		Element.removeClassName('videoPanel' + index,'minimize1');
		Element.removeClassName('videoPanel' + index,'minimize2');
		Element.removeClassName('videoPanel' + index,'minimize3');
		$('rotator' + index).style.visibility = 'visible';
		$('features' + index).style.display = 'none';
		tipVisible = false;
		embedVisible = false;
	}
	
	function playerClicked() {
		if (tipVisible || embedVisible) {
			restoreVideo();
		} else {
			player.gotoFullscreen();
		}
	}

	
	function showTipAFriend(e) {

		clearTimeout(expandTimeout);
		try {
			if (!tipVisible) {
				createTipForm();
			}

			if (embedVisible) {
				embedVisible = false;
				tipVisible = true;
				if (e) Event.stop(e);	
				return;
			}
			if (tipVisible) {
				restoreVideo();
				tipVisible = false;		
			} else {
				minimizeVideo();
				$('sumoToAddress'+index).focus();
				tipVisible = true;
			}
		} catch(ex) {
			logError(ex);
		}
		if(e) Event.stop(e);		
	}

	function createTipForm() {
		var tipHtml = '';
		tipHtml += '<form action="/ajax/external/tipAFriend.dox" class="sumoTipForm" id="sumoTipForm' + index + '">';
		tipHtml += '<input type="hidden" name="action" value="send">';
		tipHtml += '<input type="hidden" name="progId" value="' + progId + '">';
		tipHtml += '<h5 class="sumoFeatureTitle">Kerro kaverille</h5>';
		tipHtml += '<p><label for="toAddress">Kaverisi sähköpostiosoite:</label><input type="text" id="sumoToAddress' + index + '" name="toAddress" value=""></p>';
		tipHtml += '<p><label for="fromAddress">Sähköpostiosoitteesi:</label><input type="text" id="sumoFromAddress' + index + '" name="fromAddress" value="' + fromAddress + '"></p>';
		tipHtml += '<p><label for="name">Nimesi:</label><input type="text" name="name" id="sumoFromName' + index + '" value="' + fromName + '"></p>';
		tipHtml += '<p class="sumoSubmit"><input type="submit" value="Lähetä" id="sumoTipButton' + index + '"></p>';
		tipHtml += '</form>';
				
		$('featuresContent' + index).innerHTML = tipHtml;
		
		/*Event.observe('sumoTipButton' + index,'click',function(e){
				$('sumoTipForm'+index).onsubmit();
				Event.stop(e);
				return false;
			},false);
		*/
		
		
		Event.observe('sumoTipForm' + index,'submit',function(e){
				try {
					$('sumoTipButton' + index).disabled = true;
					var parameters = 'action=send&progId=' + progId + '&fromName=' + escape($F('sumoFromName' + index)) + '&fromAddress=' + escape($F('sumoFromAddress' + index)) + '&toAddress=' + escape($F('sumoToAddress' + index));
					// Storing for subsequent tipping
					fromName = $F('sumoFromName' + index);
					fromAddress = $F('sumoFromAddress' + index);
					getFromWebTV('/ajax/external/tipAFriend.dox',parameters,null,
						function(){
							$('featuresContent' + index).innerHTML = '<p style="margin-top: 18px; text-align: center">Vinkki lähetetty.</p><p style="margin-top: 18px; text-align: center"><a id="tipMore'+ index + '" href="" style="color: black; text-decoration: underline">Lähetä useammalle</a></p>';
							Event.observe('tipMore' + index,'click',function(ev){
									clearTimeout(expandTimeout);
									createTipForm();
									Event.stop(ev);
								},false);
							expandTimeout = setTimeout(showTipAFriend,4000);
						},
						function(){
							$('featuresContent' + index).innerHTML = '<p style="margin-top: 18px; text-align: center">Lähetys ei onnistunut.</p>';
							expandTimeout = setTimeout(showTipAFriend,4000);
						});
				} catch(ex) {
					logError(ex);
				}
				Event.stop(e);
				return false;
			},false);
	}

	function showEmbed(e) {
	  clearTimeout(expandTimeout);

		try {
			createEmbedForm();
			if (tipVisible) {
				tipVisible = false;
				embedVisible = true;
				Event.stop(e);	
				return;	
			}
			if (embedVisible) {
				restoreVideo();
				embedVisible = false;		
			} else {
				minimizeVideo();
				embedVisible = true;
			}
		} catch(ex) {
			logError(ex);
		}
		Event.stop(e);
	}


	function createEmbedForm() {
		var isIe = navigator.userAgent.indexOf("MSIE")>=0 && navigator.userAgent.indexOf("Opera")<0 && navigator.userAgent.indexOf("Mac")<0;
		var embedCode = '&lt;iframe scrolling=&quot;no&quot; style=&quot;width: 468px; height: 452px; border: 0px&quot; allowtransparency=&quot;true&quot; frameborder=&quot;0&quot;';
		embedCode += ' src=&quot;' + webtvUrl + 'dido/embed.dox?progId=' + progId;
		if (treeId) embedCode+= '&amp;amp;treeId=' + treeId;
		embedCode += '&quot;&gt;&lt;/iframe&gt;';
		
		var programLink = webtvUrl + '?progId=' + progId;
	
		var featuresHeader = '<h5 class="sumoFeatureTitle">Lähetä videolinkki</h5>';
		featuresHeader += '<h6 class="sumoFeatureProgramTitle">' + programTitle + '</h5>';

		$('featuresHeader'+index).innerHTML = featuresHeader;
	
		var embedHtml = '<div class="tv2border"></div>';
		embedHtml += '<form class="sumoEmbedForm" id="sumoEmbedForm' + index + '">';
		
		if (shareable) {
			embedHtml += '<p><label for="embedCode">Upota nettisivuille tai blogiin:</label>';
			embedHtml += '<input type="text" id="embedCode' + index + '" name="embedCode" value="' + embedCode + '">';
			if (isIe) embedHtml += '<a href="" class="sumoCopyButton" id="copyEmbedButton' + index + '" title="Kopioi"><span>Kopioi</span></a>';
		}
		embedHtml += '</p><p><label for="programLink">Videon osoite:</label>';
		embedHtml += '<input type="text" id="programLink' + index + '" name="programLink" value="' + programLink + '">';
		if (isIe) embedHtml += '<a href="" class="sumoCopyButton" id="copyLinkButton' + index + '" title="Kopioi"><span>Kopioi</span></a>';
		embedHtml += '</p><p class="facebookLink"><a id="addToFaceBook' + index + '"  target="_blank" href="http://www.facebook.com/share.php?u=' + webtvUrl + '%3FprogId=' + progId + '&t=Video+fra+TV+2">Jaa Facebookissa</a></p>';
		embedHtml += '</form>';
		var tipHtml = '<div class="tv2border"></div>';
		tipHtml += '<form action="/ajax/external/tipAFriend.dox" class="sumoTipForm" id="sumoTipForm' + index + '">';
		tipHtml += '<input type="hidden" name="action" value="send">';
		tipHtml += '<input type="hidden" name="progId" value="' + progId + '">';
		tipHtml += '<p><label for="sumoToAddress' + index + '">Kaverisi sähköpostiosoite:</label><input type="text" id="sumoToAddress' + index + '" name="toAddress" value=""></p>';
		tipHtml += '<p><label for="sumoFromAddress' + index + '">Sähköpostiosoitteesi:</label><input type="text" id="sumoFromAddress' + index + '" name="fromAddress" value="' + fromAddress + '"></p>';
		tipHtml += '<p><label for="sumoFromName' + index + '">Nimesi:</label><input type="text" name="name" id="sumoFromName' + index + '" value="' + fromName + '"></p>';
		tipHtml += '<p class="sumoSubmit"><input type="submit" value="Lähetä" id="sumoTipButton' + index + '"></p>';
		tipHtml += '</form>';

				
		$('featuresContent' + index).innerHTML = embedHtml + tipHtml;
		if (shareable) {
			Event.observe('embedCode' + index,'click',function(ev){
					Event.element(ev).focus();
					Event.element(ev).select();
				
				},false);
		}
		Event.observe('programLink' + index,'click',function(ev){
				Event.element(ev).focus();
				Event.element(ev).select();
			
			},false);	
		if (isIe) {
			if (shareable) Element.addClassName('embedCode' + index,'narrow');
			Element.addClassName('programLink' + index,'narrow');
			if (shareable) Event.observe('copyEmbedButton' + index,'click',function(ev) {
					try {
						var textRange = $('embedCode' + index).createTextRange();
						textRange.execCommand("RemoveFormat");
						textRange.execCommand("Copy");
					} catch(ex) {}
					Event.stop(ev);
				},false);
			Event.observe('copyLinkButton' + index,'click',function(ev) {
					try {
						var textRange = $('programLink' + index).createTextRange();
						textRange.execCommand("RemoveFormat");
						textRange.execCommand("Copy");
					} catch(ex) {}
					Event.stop(ev);
				},false);
		}
		
		Event.observe('sumoTipForm' + index,'submit',function(e){
				try {
					$('sumoTipButton' + index).disabled = true;
					var parameters = 'action=send&progId=' + progId + '&fromName=' + escape($F('sumoFromName' + index)) + '&fromAddress=' + escape($F('sumoFromAddress' + index)) + '&toAddress=' + escape($F('sumoToAddress' + index));
					// Storing for subsequent tipping
					fromName = $F('sumoFromName' + index);
					fromAddress = $F('sumoFromAddress' + index);
					if (!$F('sumoToAddress' + index)) {
						alert('Unohdit antaa vastaanottajan sähköpostiosoitteen.');
						$('sumoTipButton' + index).disabled = false;
						Event.stop(e);
						return false;
					}
					if (!fromAddress) {
						alert('Voit antaa sähköpostiosoitteesi.');
						$('sumoTipButton' + index).disabled = false;
						Event.stop(e);
						return false;
					}
					if (!fromName) {
						alert('Unohdit antaa nimesi.');
						$('sumoTipButton' + index).disabled = false;
						Event.stop(e);
						return false;
					}
					getFromWebTV('/ajax/external/tipAFriend.dox',parameters,null,
						function(){
							$('featuresContent' + index).innerHTML = '<p style="margin-top: 18px; text-align: center">Vinkki on lähetetty.</p><p style="margin-top: 18px; text-align: center"><a id="tipMore'+ index + '" href="" style="text-decoration: underline">Lähetä useammalle</a></p>';
							Event.observe('tipMore' + index,'click',function(ev){
									clearTimeout(expandTimeout);
									createEmbedForm();
									Event.stop(ev);
								},false);
							expandTimeout = setTimeout(showEmbed,4000);
						},
						function(){
							$('featuresContent' + index).innerHTML = '<p style="margin-top: 18px; text-align: center">Vihjeen lähettäminen ei onnistunut.</p>';
							expandTimeout = setTimeout(showEmbed,4000);
						});
				} catch(ex) {
					logError(ex);
				}
				Event.stop(e);
				return false;
			},false);
		
	}
	
	function regGalleryEffect(elm,target,dy) {
		var blindingUp = false;
		var blindingDown = false;
		var up = false;
		var currentEffect;

		try {
			Event.observe(elm, 'mouseover', onGalleryMouseOver, false);
			Event.observe(elm, 'mouseout', onGalleryMouseOut, false);
			if (!dy) {
				dy = parseInt($(target).offsetTop);
			}
		} catch(e) {
			logError(e);
		}

		function onGalleryMouseOver(e) {
			if (!dy) {
				dy = parseInt($(target).offsetTop);
			}
			if (currentEffect) currentEffect.cancel();
			currentEffect = new Effect.Move(target, {y: 0, duration: 0.3, mode: 'absolute', afterFinish: function(){}} );
		}

		function onGalleryMouseOut(e) {
			if (currentEffect) currentEffect.cancel();
			currentEffect = new Effect.Move(target, {y: dy, duration: 0.3, mode: 'absolute', afterFinish: function(){}} );
		}	
	}

	function track() {

	}

	function prepareStreamTracking() {
	}
	

	function getJSON(path,parameters,onComplete,onFailure) {
		if (true || window.location.href.indexOf('webtv.tv2.no/')>=0) {
			// Feel like home
			getFromWebTV(path,parameters,null,onComplete,onFailure);			
		} else {
			// Foreign domain
			var head = document.getElementsByTagName("head")[0];
			if (!head) {
				head = document.getElementsByTagName("body")[0];
			}         
			var newScript = document.createElement('script');
			newScript.type = 'text/javascript';
			newScript.onerror = onFailure;
			newScript.onload = onComplete;
			newScript.onreadystatechange=function(){if(newScript.readyState=='loaded' || newScript.readyState=='complete'){onComplete();}};
			newScript.src = webtvUrl + buildAjaxUrl(path,parameters);
			
			head.appendChild(newScript);
		}
	}

	function getFromWebTV(action,params,target,onComplete,onFailure) {
		var webtvPath = 'http://www.katsomo.fi/';
		var url;

		url = webtvPath + action;
		
		url = buildAjaxUrl(url,params);

		
		if (target) {
			var loader = new Ajax.Updater(
			target, 
			url, {
					'method': 'get', 
					'onComplete': onComplete,
					'onFailure': onFailure,
					'evalScripts': true
				});
		} else {
			var loader = new Ajax.Request(
			url, {
					'method': 'get', 
					'onSuccess': onComplete,
					'onFailure': onFailure,
					'evalScripts': true
				});
		}
		
	}

	function writeCookie(name, value, expires, path, domain, secure) {
	  logDebug('writeCookie: ' + name + '/' + value + '/' + expires + '/' + domain + '/' + secure);
	  var curCookie = name + "=" + escape(value) +
	      ((expires) ? "; expires=" + expires.toGMTString() : "") +
	      ((path) ? "; path=" + path : "") +
	      ((domain) ? "; domain=" + domain : "") +
	      ((secure) ? "; secure" : "");
	  document.cookie = curCookie;
	}

	function readCookie(name) {
	  var dc = document.cookie;
	  var prefix = name + "=";
	  var begin = dc.indexOf("; " + prefix);
	  if (begin == -1) {
	    begin = dc.indexOf(prefix);
	    if (begin != 0) return null;
	  } else
	    begin += 2;
	  var end = document.cookie.indexOf(";", begin);
	  if (end == -1)
	    end = dc.length;
	  return unescape(dc.substring(begin + prefix.length, end));
	}


	function storeBandwidth(bw) {
		var expiryDate = new Date();
		expiryDate.setMonth(expiryDate.getMonth() + 1);
		if (location.href.indexOf('dontstore=true')>0) {
			expiryDate = null;
		}
		writeCookie(bwCookieName, bw, expiryDate, '/');
	}

	function getBandwidth() {
		return readCookie(bwCookieName);
	}

	function buildAjaxUrl(path, params) {
		var date = new Date();
		if (params)
			return path + '?' + params + '&serial='+date.getTime();
		else
			return path + '?' + 'serial='+date.getTime();

		return '&serial='+date.getTime();
	}
}

function Dido() {
	function AdDispatcher() {
		var adHandlers = {};
		
		this.addHandler = function(handlerName,handler) {
				adHandlers[handlerName] = handler;
			}

		this.getHandler = function(handlerName) {
				if (adHandlers[handlerName])
					return adHandlers[handlerName]
				else
					return function(){};
			}
		
		this.hasHandler = function(handlerName) {
				return true && adHandlers[handlerName];
			}
			
		this.listHandlers = function() {
				var x = '';
				for (var i in adHandlers) {
					x = x + i + ': ' + adHandlers[i].toString() + ' --- ';
				}
				return x;
			}
	}

	this.adDispatcher = new AdDispatcher();
}


function DidoJSON() {
	var webtvUrl = TV2Player.webtvUrl;
  
  if (!webtvUrl) webtvUrl = 'http://www.katsomo.fi/';
	var jsonPath = 'dido/meta.dox?';

	var callbacks = new Object();
	var data = new Object();
	var isLoading = new Object();
	
	this.get = function(datatype,id,onComplete,onFailure) {
		try {
			if (data[datatype] && data[datatype][id]) {
				onComplete(data[datatype][id]);
			} else {
				if (callbacks[datatype]==null)
					callbacks[datatype] = new Object();
				if (callbacks[datatype][id]==null)
					callbacks[datatype][id] = new Array();
				callbacks[datatype][id][callbacks[datatype][id].length] = onComplete;
				if (!(isLoading[datatype] && isLoading[datatype][id]==true)) {
					var paramName;
					var path = webtvUrl + jsonPath + datatype + 'Id=' + id + '&callback=window.didoJSON.add';
					
					var head = document.getElementsByTagName("head")[0];

					if (!head) {
						head = document.getElementsByTagName("body")[0];
					}
					var newScript = document.createElement('script');
					newScript.type = 'text/javascript';
					if (onFailure)
						newScript.onerror = onFailure;
				
					if (!isLoading[datatype])
						isLoading[datatype] = new Object();
					isLoading[datatype][id] = true;

					//newScript.onload = onComplete;
					//newScript.onreadystatechange=function(){if(newScript.readyState=='loaded' || newScript.readyState=='complete'){onComplete();}};

					newScript.src = path; //webtvUrl + buildAjaxUrl(path,parameters);
					head.appendChild(newScript);
				}
			}
		} catch(ex) {
			logError(ex);
			//onFailure(ex);
		}
	}

	this.add = function(result) {
		for (var datatype in result) {
			if (datatype != 'success') {
				id = result[datatype].id;
				if (data[datatype]==null)
					data[datatype] = new Object();
				data[datatype][id] = result[datatype];
				if (callbacks[datatype] && callbacks[datatype][id]) {
					for (var i=0; i<callbacks[datatype][id].length;i++) {
						try {
							callbacks[datatype][id][i](result[datatype]);
						} catch(e) { if(location.href.indexOf('debug=true')>0) {alert(e.message)}}
					}
					callbacks[datatype][id]=null; 
				}
				if (isLoading[datatype])
					isLoading[datatype][id] = false;
			}
		}
	}
}


function TV2Rotator(index,progId) {
	var rotatorPE;
	var rotatorId = 0;
	var rotatorTimeout = 5;
	var delayId;
	var rotatorPaused = false;
	var rotatorDelayed = false;
	var rotatorHasList = false;
	var rotatorListLength = 5;
	var player;
	var selectedClassName = 'sSelected';
	var separatedClassName = 'sSeparated';
	
	
	this.load = function(loadRelated,onStartVideoClick) {
		$('rotator'+index).style.display = 'block';
		$('prePanel' + index).style.visibility = 'visible';
		var rotatorUrl = '/dido/listOtherContent.dox?progId='+progId;
		if (loadRelated) {
			var rotatorUrl = '/dido/listRelatedContent.dox?progId='+progId;
		}

		var plElm = $('tv2VideoPlayer' + index);
		var sizeElm = plElm.getElementsByTagName('div')[0];
		if (Element.hasClassName(sizeElm,'sumoBig')) rotatorUrl = rotatorUrl + '&layout=big';
		var loader = new Ajax.Updater(
			'rotator'+index, 
			rotatorUrl, {
					'method': 'get', 
					'evalScripts': true,
					'onComplete': function() {
							try {

								// fix all pngs if ie6
								if (/MSIE ((5\.5)|6)/.test(navigator.userAgent) &&	navigator.platform == "Win32") {
									var rotatorImages = $('rotator'+index).getElementsByTagName('img');
									for (var k=0; k<rotatorImages.length;k++) {
										var rotImg = rotatorImages[k];
										if (/\.png$/i.test(rotImg.src) && (rotImg.className.indexOf('pngImg') || rotImg.className.indexOf('pngTextImg'))) {
											var pngUrl = rotImg.src;
											rotImg.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + pngUrl + "',sizingMethod='scale')";
											rotImg.src = 'http://www.katsomo.fi/images/pixel.gif';
										}					
									}							
								} 

								var i=0;
								while ($('rotatorButton' + progId + '-' + i)) {
									Event.observe('rotatorButton' + progId + '-' + i,'click', function(e) {
												var thisId = Event.element(e).id;
												if (thisId.length==0)
													thisId = Event.element(e).parentNode.id;
												rotateTo(thisId.substring(thisId.length-1));
												Event.stop(e);		
											}
										,false);
									i++;
								}
								
								
								if (loadRelated) {
									var j=0;
									while ($('rotatorItem' + progId + j)) {
										Event.observe('rotatorItem' + progId + j,'click', function(e) {
													var elm = Event.element(e);
													Event.stop(e);
													while (elm.nodeName.toLowerCase()!='a') {
														elm = elm.parentNode;
													}							
													onStartVideoClick(elm.getAttribute('progId'),false,elm.title);
												}
											,false);
										j++;
									}
									/*
									Event.observe('rotatorStartButton' + progId,'click', function(e) {
												var elm = $('rotatorItem' + progId + getRotatorId());
												onStartVideoClick(elm.getAttribute('progId'),false,elm.title);
												Event.stop(e);
											}
										,false);
									*/
								} else {
									/*
									Event.observe('rotatorStartButton' + progId,'click', function(e) {
												window.open($('rotatorItem' + progId + getRotatorId()).href,'_blank');
												Event.stop(e);
											}
										,false);
									*/
								}
								startRotator();
							} catch(ex) {
								logError(ex);
							}
						}});
	}

	function getBanner(treeId) {

	}
	
	
	function setPlayer(pl) {
		player = pl;
	}
	
	this.getBanner = getBanner;
	this.setPlayer = setPlayer;
	
	

	function startRotator() {
		stopRotator();
		rotatorId = 0;
		if($('rotatorItem'+progId+rotatorId)!=null && $('rotatorItem'+progId+(rotatorId+1))) {
			rotatorPE = new PeriodicalExecuter(rotate, rotatorTimeout);
		}
	}
	
	function stopRotator() {
		if (rotatorPE && rotatorPE.stop)
			rotatorPE.stop();
		rotatorPE = null;
		rotatorId = 0;
	}

	function pauseRotator(delay) {
			if (delay) {
				window.clearTimeout(delayId);
				delayId = window.setTimeout(function(){resumeRotator(true)},delay*1000);
				rotatorDelayed = true;
			}
			rotatorPaused = true;
	}

	function getRotatorId() {
		return rotatorId;
	}

	function resumeRotator(delayFinished) {
		if (!rotatorDelayed || delayFinished) {
			rotatorDelayed = false;
			rotatorPaused = false;			
		}
	}

	function rotateTo(newId) {
		newId = newId * 1;
		pauseRotator();
		var oldId = rotatorId;
		rotatorId = newId;
		if (newId == oldId) {
			pauseRotator(20);
			return;
		}
		// clean up last selected button

		Element.removeClassName('rotatorButton' + progId + '-' + oldId,'sSelected');

		if ($('rotatorButton'+progId + '-'+(oldId-1))) {
			Element.addClassName('rotatorButton' + progId + '-' + (oldId-1),'sSeparated');
		}


		if ($('rotatorButton' + progId + '-' +oldId).className.indexOf('sLastButton')<0) {
			Element.addClassName('rotatorButton' + progId + '-' + (oldId),'sSeparated');
		}
		// switch item text, if any
		if ($('rotatorText' + progId + rotatorId)) {
			Element.hide('rotatorText' + progId + (oldId));
			Element.show('rotatorText' + progId + rotatorId);
		}
		
		// show new button
		Element.removeClassName('rotatorButton' + progId + '-' + rotatorId,'sSeparated');
		if ($('rotatorButton'+progId + '-' +(rotatorId-1))) {
			Element.removeClassName('rotatorButton' + progId + '-' + (rotatorId-1),'sSeparated');
		}
		Element.addClassName('rotatorButton' + progId + '-' + rotatorId,'sSelected');



		// show item image
		if (oldId < newId) {
			Effect.Appear('rotatorItem' + progId +(rotatorId), { 
					duration: 0.5,
					from: 0.0,
					to: 1.0,
					afterFinish: function(e) {
						Element.hide('rotatorItem'+progId+(oldId));
					}
				});
		} else {
			Effect.Appear('rotatorItem'+progId+(rotatorId), { 
					duration: 0.1,
					from: 0.0,
					to: 1.0
				});
			Effect.Appear('rotatorItem'+progId+(oldId), { 
					duration: 0.5,
					from: 1.0,
					to: 0.0,
					afterFinish: function(e) {
						Element.hide('rotatorItem'+progId+(oldId));
					}
				});
		}

		pauseRotator(20);
	}

	function rotate() {
		if (!(rotatorPaused || (player &&player.isPlaying()))) {
			if($('rotatorItem'+progId+rotatorId)==null) {
				stopRotator();
			} else {
				try {
					rotatorId = rotatorId + 1;
					if($('rotatorItem'+progId+rotatorId)==null) {
						//debug('Last rotator item ' + rotatorId + ', starts over again');
						Element.hide('rotatorItem'+progId+(rotatorId-1));
						Element.removeClassName('rotatorButton'+progId + '-' + (rotatorId-1),'sSelected');
						if ($('rotatorButton' + progId + '-' + (rotatorId-2))) {
							Element.addClassName('rotatorButton'+progId + '-' + (rotatorId-2),'sSeparated');
						}
						rotatorId = 0;
					}
					//debug('Rotating to item ' + rotatorId);
					if (rotatorId>0) {
						if ($('rotatorText'+progId + (rotatorId-1)))
							Element.hide('rotatorText'+progId + (rotatorId-1));
						Element.removeClassName('rotatorButton'+progId + '-' + (rotatorId-1),'sSelected');
						Element.removeClassName('rotatorButton'+progId + '-' + (rotatorId-1),'sSeparated');
					}
					if (rotatorId>1) {
						Element.addClassName('rotatorButton'+progId + '-' + (rotatorId-2),'sSeparated');

					}
					if ($('rotatorText'+progId + rotatorId))
						Element.show('rotatorText'+progId + rotatorId);

					Element.removeClassName('rotatorButton' + progId + '-' + rotatorId,'sSeparated');
					Element.addClassName('rotatorButton' + progId + '-' + rotatorId,'sSelected');
					Effect.Appear('rotatorItem'+progId+(rotatorId), { 
							duration: 0.5,
							from: 0.0,
							to: 1.0,
							afterFinish: function(e) {
								if (rotatorId>0) Element.hide('rotatorItem'+progId+(rotatorId-1));
							}
						});
				} catch(e) {
					logError(e);
				}
			}
		}
	}
}

function logError(ex,ex2) {
	var e = ex;
	if (ex2) e = ex2;
	if (location.href.indexOf('debug=true')>0) {
		alert((ex2?e + ':':'') + ex.name + '\n' + ex.message);				
	}
}

function logDebug(msg,msg2) {
	if (location.href.indexOf('debug=true')>0) {
		if ($('debugList'))
			$('debugList').innerHTML = $('debugList').innerHTML + '<li>' + msg + (msg2?': ' + msg2:'') + '</li>';
		else
			window.status = msg + (msg2?': ' + msg2:'');	
	}
}
if (location.href.indexOf("local=true")>0)
  TV2Player.webtvUrl = '/'
else
  if (!TV2Player.webtvUrl) TV2Player.webtvUrl = 'http://www.katsomo.fi/';

TV2Player.insertPlayer = function (progAndItemId, isMainPlayer, injectElementId, autoplay, layoutId, design) {
	// DEFINITIONS
	var layouts = new Array();
	layouts[0] = {className1: 'sumoSmall', className2: 'sumoNormal', bannerAd: true, related: true, useDefaultBW: true,usePngText:true};
	layouts[1] = {className1: 'sumoSmall', className2: 'sumoMini', bannerAd: true, related: true, useDefaultBW: true, usePngText:true};
	layouts[2] = {className1: 'sumoBig', className2: 'sumoMini', bannerAd: true, related: false};
	layouts[3] = {className1: 'sumoBig', className2: 'sumoNormal', bannerAd: true, related: true};
	layouts[4] = {className1: 'sumoBig', className2: 'sumoMedium2', bannerAd: true, relatedGallery: true};
	layouts[5] = {className1: 'sumoSmall', className2: 'sumoMini', bannerAd: true, related: false, useDefaultBW: true, usePngText:true};
	layouts[6] = {className1: 'sumoSmall2', className2: 'sumoMini', bannerAd: false, related: false, useDefaultBW: true, relatedHardcoded: true};
	layouts[7] = {className1: 'sumoSmall', className2: 'sumoMedium', bannerAd: false, related: true, useDefaultBW: true, usePngText:true};


	var progId;
	var itemId;
	
	var splitted = ('' + progAndItemId).split('-');
	
	progId = splitted[0];
	
	if (splitted[1])
		itemId = splitted[1];
	
	var webtvUrl =  TV2Player.webtvUrl;

	// Set up JSON cross domain loader
	if (!window.didoJSON)
		window.didoJSON = new DidoJSON();

	// Set up ad loader
	if (!window.dido) {
		window.dido = new Dido();
	}

	var scriptList;
	var cssUrl;
	
	if (location.href.indexOf("local=true")>0) {
		scriptList = [webtvUrl + 'script-static/dido-player.js?debug=true&reload=true'];
	} else {
		scriptList = [webtvUrl + 'script-static/dido-player.js'];
	}
	
	if (location.href.indexOf("local=true")>0) {
		cssUrl = webtvUrl + 'css-static/dido-player.css?debug=true&reload=true';
	} else { 
		cssUrl = webtvUrl + 'css-static/dido-player.css';
	}

	if (layoutId==null) layoutId = 0;
	var layoutParamName = 'layout=';
	var paramLoc = location.href.indexOf(layoutParamName);
	if (paramLoc>0) {
		layoutId = location.href.substring(paramLoc + layoutParamName.length,paramLoc + layoutParamName.length+1);
	}
	
	var layout = layouts[layoutId];
		
	var isSafari = (navigator.userAgent.toLowerCase().indexOf('safari')>=0);
	var cssLoaded = false;

	function showInjectElement() {
		if (injectElementId && document.getElementById(injectElementId))
			document.getElementById(injectElementId).style.display = 'block';
		cssLoaded = true;
	}

	function loadScripts(scripts,onComplete) {
		var i=-1;
		var finished = false;

		loadNextScript();
		
		
		function loadNextScript() {
			i++;
			if (i<scripts.length) {
				var head = document.getElementsByTagName("head")[0];         
				var newScript = document.createElement('script');
				newScript.onload = loadNextScript;
				newScript.type = 'text/javascript';
				newScript.onreadystatechange=function(){if(newScript.readyState=='loaded' || newScript.readyState=='complete'){loadNextScript()}};
				newScript.src =  scripts[i];
				head.appendChild(newScript);
				if (isSafari) {
					loadNextScript();
				}
			} else if (onComplete && !finished) {
				if (isSafari) {
					finished = true;
					tryOnComplete();
				} else {
					finished = true;
					onComplete();
				}
			}
		}
		
		function tryOnComplete() {
			try {
				onComplete();
			} catch(e) {
				window.setTimeout(tryOnComplete,500);
			}
		}

	}


	if (location.href.indexOf('debug=true')>0 && (!injectElementId || !document.getElementById(injectElementId))) {
		alert('Placeholder element not supplied.');
		return;
	}

	var index;
	if (isMainPlayer)
		index = 0;
	else
		index = progAndItemId;
		
	var imageUrl = 'http://www.katsomo.fi/multimedia/vman/VMan-P' + Math.floor(parseInt(progId)/1000) + '/VMan-P' + progId + (itemId ? '-I' + itemId : '') + '.jpg';
	
	// putting the css in the head part, complying to the HTML standard
	var cssNode = document.createElement('link');
	cssNode.type = 'text/css';
	cssNode.rel = 'stylesheet';
	cssNode.href = cssUrl;
	if (cssNode.readyState == null) {
		showInjectElement();
	}
	cssNode.onreadystatechange=function(){if(cssNode.readyState=='loaded' || cssNode.readyState=='complete'){showInjectElement()}};

	cssNode.media = 'screen';
	cssNode.title = 'TV2Player';
	var h = document.getElementsByTagName("head")[0];
	if (h)
		h.appendChild(cssNode);
	else
		document.getElementsByTagName("body")[0].appendChild(cssNode);
	
	if (injectElementId) {
		loadScripts(scriptList,function() {
			  /*
			  if (location.href.indexOf('rotatorOnly=true')>0) {
			    var rotator = new TV2Rotator(index,progId);
	    		rotator.load();
	    		var queryParams = location.search.toQueryParams();
	    		rotator.getBanner(queryParams.treeId);
	    		
	    		
	    	} else {*/

					var player = new TV2Player(index,progId,itemId,autoplay,layout,itemId);
					window.lastTV2Player = player;
				//}
			});
	} else {
		var sc = '';
		for (var i=0; i<scriptList.length; i++) {
			sc += '<script type="text/javascript" src="' + webtvUrl + scriptList[i] + '"></script>';
		}
		document.write(sc);
	}
	
	
	var c = '';
	
	// multiple divs due to IE6 bug on CSS selectors with a combination of more than one class name for same element	
	c += '<div class="tv2Player" id="tv2VideoPlayer{index}" style="visibility: hidden">';
	c += '<div class="' + (layout.className1?layout.className1:'') + '">'; // [small|big]
	c += '<div class="' + (layout.className2?layout.className2:'') + '">'; // [<empty>|mini|medium]
	c += '<div class="sumoPlayerBox ' + (design?design:'') + '">'; // [tv2no|nyhetene|sporten|(...)]
	c+='  <div class="prePanel" id="prePanel{index}">';
	c+='    <div class="videoControls">';
	c+='      <a class="logoButton videoButton" target="_blank" href="http://www.katsomo.fi/" id="logoPreButton{index}"></a>';
	c+='      <a class="playButton videoButton" title="Soita" href="" id="startButton{index}"><span>Soita</span></a>';
	c+='      <span class="stopButton videoButton"></span>';
	c+='      <span class="prevButton videoButton"></span>';
	c+='      <span class="nextButton videoButton"></span>';
	c+='      <div class="playerTime"></div>';
	c+='      <div class="slider"></div>';
	c+='      <span class="volDownButton videoButton"></span>';
	c+='      <span class="soundButton videoButton"></span>';
	c+='      <span class="volUpButton videoButton"></span>';
	c+='      <span class="fullscreenButton videoButton"></span>';

	c+='      <a class="shareButton videoButton" title="Pysäytä" href="" id="sharePreButton{index}"><span>Pysäytä</span></a>';


	c+='    </div>';
	c+='    <div class="sumoPoster">';
	c+='      <a href="" id="startImage{index}"><img class="posterImage" src="{imageUrl}" onerror="this.style.visibility=\'hidden\'">';
	c+='        <span class="bwTestMessage"></span><span class="startBanner"><div class="pngTitle" id="pngImage{index}"></div></span></a>';
	c+='    </div>';
	c+='  </div>';
	c+='  <div class="videoPanel" id="videoPanel{index}">';
	c+='    <div class="ad" id="videoAdStart{index}"></div>';
	c+='    <div class="ad" id="videoAdEnd{index}"></div>';
	c+='    <div class="bg" id="bg{index}"></div>';
	c+='    <div class="videoObject" id="video{index}"></div>';
	c+='    <div class="videoControls" id="videoControls{index}">';
	c+='      <a class="logoButton videoButton" target="_blank" href="http://www.katsomo.fi/" id="logoButton{index}"></a>';
	c+='      <a class="playButton videoButton" title="Soita/tauko" href="" id="playButton{index}"><span>Soita</span></a>';
	c+='      <a class="stopButton videoButton" title="Pysäytä" href="" id="stopButton{index}"><span>Pysäytä</span></a>';
	c+='      <a class="prevButton videoButton" title="Taaksepäin" href="" id="prevButton{index}"><span>Taaksepäin</span></a>';
	c+='      <a class="nextButton videoButton" title="Eteenpäin" href="" id="nextButton{index}"><span>Eteenpäin</span></a>';
	c+='      <div class="playerTime" id="playerTime{index}">';
	c+='        <span class="timeElapsed" id="timeElapsed{index}"></span>';
	c+='        <span class="timeSeparator" id="timeSeparator{index}">/</span>';
	c+='        <span class="duration" id="duration{index}"></span>';
	c+='      </div>';
	c+='      <div title="Klikkaa ja vedä siirtyäksesi videossa" class="slider" id="slider{index}">';
	c+='        <div class="progressBar" title="Klikkaa ja vedä siirtyäksesi videossa" id="progressBar{index}"></div>';
	c+='        <div class="sliderButton" title="Klikkaa ja vedä siirtyäksesi videossa" id="sliderButton{index}"></div>';
	c+='      </div>';
	c+='      <div class="playerStatus" id="playerStatus{index}"></div>';
	c+='      <a class="volDownButton videoButton" title="Hiljemmalle" href="" id="volDownButton{index}"><span>Hiljemmalle</span></a>';
	c+='      <a class="soundButton videoButton" title="Hiljennä" href="" id="muteButton{index}"><span>Hiljennä</span></a>';
	c+='      <a class="volUpButton videoButton" title="Kovemmalle" href="" id="volUpButton{index}"><span>Kovemmalle</span></a>';
	c+='      <a class="fullscreenButton videoButton" href="" title="Koko ikkuna" id="fullscreenButton{index}"><span>Koko ikkuna</span></a>';
	c+='      <a class="toolsButton videoButton" title="Lisää" href="" id="toolsButton{index}"><span>Lisää...</span></a>';
	c+='      <a class="shareButton videoButton" title="Kerro kaverille" href="" id="shareButton{index}"><span>Kerro kaverille</span></a>';

	c+='    </div>';
	c+='  </div>';
	c+='  <div class="sRotator" id="rotator{index}"></div>';
	c+='  <div class="sumoFeatures" id="features{index}">';
	c+='  	<a href="" id="restoreVideo{index}" class="sumoRestoreVideo" title="Suurenna"><img class="sumoPreviewImage" src="{imageUrl}"></a>';
	c+='  	<div class="sumoFeaturesHeader" id="featuresHeader{index}"/></div>';
	c+='  	<div class="sumoFeaturesContent" id="featuresContent{index}"></div>';
	c+='  </div>';
	c+='  <div class="sumoBottom" id="sumoBottom{index}">';
	c+='    <ul class="sumoRelatedList" id="relatedList{index}"></ul>';
	c+='    <a class="shareButton2" href="" id="shareButton2{index}"></a>';
	c+='    <a class="sumoButton" href="" target="_blank" id="sumoButton{index}"></a>';
	c+='  </div>';
	c+='  <div class="bannerAd" id="sumoBannerAd{index}"></div>';
	c += '</div></div></div></div>';

	if (!injectElementId) {	
		// NOT SUPPORTED YET
		c += '<sc' + 'ript type="text/javascript">';
  	c += 'try {';
  	c += 'var mainPlayer = new TV2Player(';
  	if (isMainPlayer) 
  		c += '{index}'
  	else
  		c += '{progId}';
  	c += ',{progId}); } catch(e) { if(location.href.indexOf(\'debug=true\')>0) {alert(e.message)}}';
  	c += '</sc' + 'ript>';
	}
	c = c.replace(/{index}/ig,index);
	c = c.replace(/{progId}/ig,progId);
	c = c.replace(/{imageUrl}/ig,imageUrl);
	
	if (injectElementId) {
		var elm = document.getElementById(injectElementId);


		// TODO: Bedre metode for å sjekke om CSS-en er lastet.
		if (!cssLoaded)
			elm.style.display = 'none';
		try {
		
			elm.innerHTML = c; 
		
		} catch(e) { if(location.href.indexOf('debug=true')>0) {alert(e.message)}};
	} else {
		document.write(c);
	}
}


