if (!window.TV2Player) var TV2Player = {}

TV2Player.Player = function(index,progId,autoplay,layout) {
	var webtvUrl = TV2Player.webtvUrl;
	var webtvPath = '/webtv/';
	var jsonPath = 'dido/meta.dox?';
	var bannerPath = 'http://webtv.tv2.no/multimedia/webtv/images/dido/banner/';
	var defaultAdCategory = 'tv2/forside';
	var defaultStartBannerLink = 'http://webtv.tv2.no/webtv/';
	var defaultStartBanner = bannerPath + 'sumo_banner.jpg';
	var defaultBandwidth = 800;
	var maxBandwidth = 2000;
	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 = 3;
	var relatedGalleryCount = 5;
	var relatedTreeId;
	var programTitle = '';
	var programText = '';
	var txTime;
	var live = false;	
	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 = 'tv2no';

	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(){
				rotator.load(true,startNewVideo);
			};
		if (!layout.relatedGallery) {
			onPlayerHide = rotator.load;
		}
		if (layout.relatedHardcoded) {
			onPlayerHide = loadHardcodedEnd;
		}
		if (layout.rotator != null && layout.rotator == false) {
			onPlayerHide = function () {
					$('prePanel' + index).style.visibility = 'visible';
				}
		}
		player = new VideoPlayer(index,false,false,{onHide: onPlayerHide, onPlayerClick: playerClicked, onProgramError: showMessage});
		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>Du trenger Windows Media Player for å se video. Denne er ikke installert eller ikke riktig satt opp. <a href="http://windowsmedia.com/download">Last ned Windows Media Player her</a>.</p>';
		messages['sumo.web.video.status.quality1']='Videokvalitet (båndbredde): ';
		messages['sumo.web.video.status.quality2']=' kbit/s. Klikk her for å endre kvalitet.';
		messages['sumo.web.video.status.wmperror1']='Det oppstod en feil i Windows Media Player.';
		messages['sumo.web.video.status.wmperror2']=' Klikk her for mer info.';
		messages['sumo.web.video.wmperrordialog1']='<p><br>Windows Media Player klarte ikke å spille av videoen og rapporterte feilmeldingen over.</p>  <p>I vårt hjelpesenter kan du få mer informasjon og hjelp til å løse problemet.</p>';
		messages['sumo.general.video.status.startingvideo']='Starter video: ';
		messages['sumo.general.video.status.checkstarted']='Kontrollerer om programmet er startet.';
		messages['sumo.general.video.status.notstarted']='Ikke startet - prøver igjen om litt.';
		messages['sumo.general.video.status.buffering']='Bufrer';
		messages['sumo.general.video.control.skipback']='Hopp bakover';
		messages['sumo.general.video.control.skipforward']='Hopp fremover';
		messages['sumo.general.video.control.skipto']='Gå til';
		messages['sumo.web.video.upgrademessage'] = 'For bedre videoavspilling, last ned <a href="http://port25.technet.com/pages/windows-media-player-firefox-plugin-download.aspx" target="_blank">Windows Media Player plugin for Firefox</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();
	var treeId;
	treeId = queryParams.treeId;

	
	//programTitle = rotator.getBanner(treeId);
	if (queryParams.autoplay=='true') autoplay=true;
	//if (queryParams.live) live = queryParams.live;

	// get metadata on program, related programs and trees
	getMetadata(DidoJSON.getInstance(webtvUrl));



	if ($('sliderButton' + index).currentStyle) {
		Event.observe('slider' + index,'mouseover',onEnterSlider,false);
		Event.observe('slider' + index,'mouseout',onExitSlider,false);
		//Event.observe('sliderButton' + index,'mousedown',onStartDragging,false);
		//Event.observe('sliderButton' + index,'mouseup',onEndDragging,false);
		hideSliderButton();
	}

	// show player
	plElm.style.visibility = 'visible';

	var muted = false;
	if (layout.className1=='sumoSmall2' && autoplay) {
		muted = true;
	}


// Initialization (constructor) end




// -----------------------
// Member methods

	function startNewVideo(newProgId,isLive,newProgramTitle,pMuted) {
		if (pMuted!=null) muted = pMuted;
		startVideo(null,newProgId,isLive,newProgramTitle);
	}
	
	function stopVideo() {
		player.hide();
	}

	this.startNewVideo = startNewVideo;
	this.stopVideo = stopVideo;
		
		
	function startVideo(e,newProgId,isLive,newProgramTitle) {
		var oldProgId = progId;
		if (newProgId) {
			progId = newProgId;
		}
		if (newProgramTitle) {
			programTitle = newProgramTitle;
		}

		if (isLive!=null) live = isLive;

		var localStartTime;

		var didoJSON = DidoJSON.getInstance(webtvUrl);
		didoJSON.getCurrentTime(function(element) {
				if (element.time && txTime) {
					var serverTime = new Date();
					serverTime.setTime(element.time);
					var startOffset = txTime.getTime() - serverTime.getTime();
					if (!live) startOffset += 15000;
					if (startOffset > 0) { // program not started
						if (!$('overlay' + index)) {
							var localTime = new Date();
							localStartTime = new Date(localTime.getTime() + startOffset);
							var offsetTime = new Date(startOffset);

							var countdownElm = document.createElement('div');
							countdownElm.className = 'posterOverlay';
							countdownElm.id = 'overlay' + index;
							var cdi = '<div class="overlayBg"></div>';
							//cdi += '<div class="countdown" id="countdown' + index + '">';
							cdi += '<p class="countdown" id="countdown' + index + '"></p>';
							if (live)
								cdi += '<p class="countdownText">til sendingen starter</p>';
							else
								cdi += '<p class="countdownText">til videoen starter</p>';
							countdownElm.innerHTML = cdi;
							$('startImage' + index).parentNode.appendChild(countdownElm);
							$('startImage' + index).addClassName('noStartBanner');
							
							
							countdown();
						}

					} else { // program started
						prepareVideo();
					}
				} else prepareVideo();
			});

		function countdown() {
			var currentOffset = localStartTime.getTime() - (new Date()).getTime();
			if (currentOffset >1000) {
				$('countdown' + index).innerHTML = formatUtcTime(new Date(currentOffset));
				window.setTimeout(countdown,200);
			} else {
				prepareVideo();
			}
		}

		function formatUtcTime(t) {
			var h = Math.floor(t.getTime() / 3600000);
			var m = t.getUTCMinutes();
			var s = t.getUTCSeconds();
			
			var str = '';
			
			if (h>0) {
				if (h<10) str += '0';
				str += h + ':';
			} 
			if (m<10) str += '0';
			str += m + ':';
			if (s<10) str += '0';
			str += s;
			return str;
		}

			
		if (e) Event.stop(e);
	}

	function prepareVideo() {
		if (Element.hasClassName(modeElm,'sumoMini') && layout.related) {
			modeElm.className = 'sumoMedium';
		}

		track();

		// override if testing ads
		if (location.href.indexOf('adtest=true')>0)
			adCategory = 'tv2underholdning.no/program/dealornodeal';
		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);
					doStartVideo(bw);
					Element.removeClassName('prePanel' + index,'testingBw');
					logDebug('Bandwidth: ' + bw);
					
				},
				onTimeout: function() {
					storeBandwidth(defaultBandwidth);
					doStartVideo(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 
			doStartVideo(bw);
	}


	function prepareVideoAds(bw) {
	
		if (location.href.indexOf('adtest=true')>0) {
		// hent ASX, parse
		
			var adUrl = '/pfadx/' + adCategory + ';sz=680x383;ord=' + Math.floor(Math.random()*100000000) + ';bw=600'
	
			var loader = new Ajax.Request(adUrl, {
						'method': 'get', 
						'onFailure': function() {doStartVideo(bw)},
						'onError': function() {doStartVideo(bw)},
						'evalScripts': false,
						'onSuccess': function(transport) {
								//try {
								var responseText = transport.responseText.toLowerCase();
								var adParamLead = '<param name="dartadid" value="';
								var adIdPos = responseText.indexOf(adParamLead) + adParamLead.length;
								if (adIdPos>0) {
									var remainder = responseText.substring(adIdPos,responseText.length);
									var adId = responseText.substring(adIdPos,adIdPos + remainder.indexOf('"'));
									doStartVideo(bw,adId);
								} else {
									doStartVideo(bw);
								}
								//} catch(e) {}
							}
					});
		} else
		 	doStartVideo(bw);
		
	}


	function doStartVideo(bw) {
		try {
			if (bw>maxBandwidth) bw = maxBandwidth;
			player.show();
			resetVideoSize();

			var metaUrl = webtvUrl + 'metafile.asx?p=' + progId + '&bw=' + bw;
			if (adCategory && adCategory.length>0)
				metaUrl = metaUrl + '&ac=' + adCategory;
			
			$('prePanel' + index).style.visibility = 'hidden';
			player.start({	
				'metaUrl': metaUrl,
				'progId': progId, 
				'hostProgId': null, 
				'programTitle': programTitle,
				'live': live, 
				'timeBegin': 0, 
				'startPos': 0, 
				'muted': muted,
				'adCategory': adCategory, 
				'startAdPos': 'Video_Stor_F', 
				'endAdPos': 'Video_Stor_E', 
				'bannerAdPos': '450x60_no1',
				'onShowExternalAd': showBannerAd,
				'bufferFlash': null
			});
			// Dart ad integration
			if (window.DartPlayer) {
				DARTReady = function() {
					dartPlayer.attachOnAdStart(showDartBannerAd);
					dartPlayer.attachOnAdComplete(function(){ logDebug('dartPlayer','Ad completed')});			
				}
				dartPlayer = new DartPlayer('video' + index, DARTReady);
			}

		} catch(ex) {
			logError(ex);
		}
	}

	function showMessage(message,details,progId) {
		$('rotator' + index).style.visibility = 'hidden';
		var cdi = '<div class="overlayBg"></div><p class="posterMessage">{message}</p>';
		if ($('overlay' + index)) {
			$('overlay' + index).innerHTML = cdi.replace(/{message}/ig,message);
		} else {
			var overlayElm = document.createElement('div');
			overlayElm.className = 'posterOverlay';
			overlayElm.id = 'overlay' + index;

			overlayElm.innerHTML = cdi.replace(/{message}/ig,message);;
			$('startImage' + index).parentNode.appendChild(overlayElm);
			$('startImage' + index).addClassName('noStartBanner');
			Event.observe(overlayElm,'click',function(e) {
					if (e.ctrlKey && e.shiftKey) {
						$('overlay' + index).innerHTML = cdi.replace(/{message}/ig,details + '<br>progId: ' + progId);
					} else {
						$('overlay' + index).remove();
						$('startImage' + index).removeClassName('noStartBanner');
					}
					
				});
		}

		player.hide();
	}

	function getMetadata(didoJSON) {
		didoJSON.get('prog',progId,function(element) {
				programTitle = element.title;
				programText = element.text;
				shareable = element.sharable;
				live = element.live;
				txTime = new Date();
				txTime.setTime(element.txtime);


				
				// Get tree
				didoJSON.get('tree',element.treeId,function(tree) {
						//if (tree.dido_player_adCategory)
							adCategory = tree.dido_player_adCategory;
						//else
						//	adCategory = defaultAdCategory;
						logDebug('Ad category: ' + tree.dido_player_adCategory);
						
						if (designElm.className.length < 15) { // sumoPlayerBox
							if (location.href.indexOf('design=')>0) {
									if (location.href.indexOf('design=sporten')>0)
										design = 'sporten';
									else if (location.href.indexOf('design=nyhetene')>0)
										design = 'nyhetene';
									else if (location.href.indexOf('design=tv2no')>0)
										design = 'tv2no';
									else if (location.href.indexOf('design=veret')>0)
										design = 'veret';
									else if (location.href.indexOf('design=tabloid')>0)
										design = 'tabloid';
									else if (location.href.indexOf('design=underholdning')>0)
										design = 'underholdning';
									else if (location.href.indexOf('design=tv2hjelperdeg')>0)
										design = 'tv2hjelperdeg';
									else if (location.href.indexOf('design=kjendisnorge')>0)
										design = 'kjendisnorge';
									else if (location.href.indexOf('design=humor')>0)
										design = 'humor';
									else if (location.href.indexOf('design=stabak')>0)
										design = 'stabak';
									else if (location.href.indexOf('design=prosjektx')>0)
										design = 'prosjektx';
							} 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;
						var logoUrl = 'http://tv2.no';
						
						if (tree.dido_player_sumoUrl)
							sumoUrl = tree.dido_player_sumoUrl
						else 
							if (design=='nyhetene') {
								sumoUrl = 'http://webtv.tv2.no/webtv/?treeId=1';
								logoUrl = 'http://tv2nyhetene.no';
							} else if (design=='underholdning') {
								sumoUrl = 'http://webtv.tv2.no/webtv/?treeId=3';
								logoUrl = 'http://tv2underholdning.no';
							} else if (design=='sporten') {
								sumoUrl = 'http://webtv.tv2.no/webtv/?treeId=2220';
								logoUrl = 'http://tv2sporten.no';
							} else if (design=='veret') {
								sumoUrl = 'http://webtv.tv2.no/webtv/?treeId=5';
								logoUrl = 'http://tv2.no/ver';
							} else if (design=='kjendisnorge') {
								sumoUrl = 'http://webtv.tv2.no/webtv/?treeId=15';
								logoUrl = 'http://www.tv2underholdning.no/gkn/kjendis/';
							} else if (design=='tv2hjelperdeg') {
								sumoUrl = 'http://webtv.tv2.no/webtv/sumo/?treeId=38001';
								logoUrl = 'http://www.tv2underholdning.no/hjelperdeg/testbasen/';
							} else if (design=='brann') {								
								logoUrl = 'http://brann.no/';
							}
							
						if (design=='brann') {								
								logoUrl = 'http://brann.no/';
						}	
						

						$('sumoButton' + index).href = sumoUrl;
						$('logoButton' + index).href = logoUrl;
						$('logoPreButton' + index).href = logoUrl;
						
						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;
		
								/*
								var firstItemContent = '';
								
								firstItemContent += '<a title="' + programTitle + '" progId="' + progId + '" href="' + homeUrl + '?progId='+ progId +'">';
								firstItemContent += '<img onerror="this.style.visibility = \'hidden\'" src="http://www.tv2.no/tvid/VMan-P' + Math.floor(parseInt(progId)/1000) + '/VMan-P' + progId + '_122x90.jpg">';
								firstItemContent += '<span class="sumoRelatedText">' + programText + '</span>';
								firstItemContent += '<span class="sumoRelatedTitle">' + programTitle + '</span></a>';
														
								$('relatedItem' + index  + '-' + progId).innerHTML = firstItemContent;
		
								Event.observe($('relatedItem' + index  + '-' + progId).getElementsByTagName('a')[0],'click',function(e){
										Event.stop(e);
										var elm = Event.element(e);
										if (elm.nodeName.toLowerCase() != 'a') {
											elm = elm.parentNode;
										} 
										startNewVideo(elm.progId,false,elm.title); 									
									},false);
								*/
		
								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.tv2.no/tvid/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'),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.tv2.no/tvid/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);
									}
									
									
									/*
									
									didoJSON.get('prog',item,function(element2) {
			
											
										},function() {logDebug('Related program metadata not found');});
									*/
								}
							} else if (relatedTreeId){
								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.tv2.no/tvid/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 {
								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.tv2.no/tvid/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');});
							}
						}
						if (autoplay && !rotatorOnly) startVideo();
					},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(bannerCode) {
		if (!layout || (layout && layout.bannerAd)) {

			$('sumoBannerAd' + index).innerHTML = '<div>' + bannerCode + '</div>';
			Element.addClassName('sumoBannerAd' + index,'adShowing');
			
			if (layout.related || layout.relatedGallery)
				modeElm.className = 'sumoNormal'
			else
				modeElm.className = 'sumoMedium';

			//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 loadHardcodedEnd() {
		// Yes, I know. Hard coding is very, very bad.
		$('prePanel' + index).style.visibility = 'visible';
		if ($('overlay' + index))
			return;
		if (design=='sporten' || window.location.hostname.indexOf('tv2sporten')>=0) {
			arg1 = 'treeByProg';
			arg2 = progId;
			if (relatedTreeId) {
				arg1 = 'programsByTree';
				arg2 = relatedTreeId;
			}
			
			DidoJSON.getInstance(webtvUrl).get(arg1,arg2,function(treeList) {
					var u = '<p style="margin: 10px; margin-bottom: 2px; font-weight: bold; font-size: 12px">Flere videoer fra TV2Sporten.no:</p>'
					
					u += '<ul style="margin: 10px; margin-top: 0px; font-size: 12px;">';
					var i=0;
					treeList.programList.each(function(program){
							if (program.id != progId && i<6) {
								u += '<li style="list-style-type: none; margin: 0px; padding: 0px">';
								u += '<a style="color: white; text-decoration: underline" href="' + homeUrl + '?progId=' + program.id + '">';
								if (program.txtime) {
									var txTime = new Date();
									txTime.setTime(program.txtime);
									u += txTime.getDate() + '.' + (txTime.getMonth() + 1) + '. ';
								}
								u += program.title + '</a></li>';
								i++;
							}
						});
					u += '</ul>';
					u += '<p style="margin: 10px; margin-bottom: 2px; font-weight: bold; font-size: 12px">';
					u += '<a style="text-decoration: underline; color: white" href="http://webtv.tv2.no/webtv/?treeId=250">';
					u += 'Livesenteret: Se fotball og håndball direkte!</a></p>';
					
					$('rotator'+index).innerHTML = u;
					$('rotator'+index).style.display = 'block';
					$('prePanel' + index).style.visibility = 'visible';
				});
		}
	}


	function minimizeVideo() {
		var interval = 50;
		if (minimizing) return;
		if (restoring) clearTimeout(minimizeTimeout);
		resetVideoSize();
		$('features' + index).style.display = 'block';
		$('rotator' + index).style.visibility = 'hidden';
		//loadDock();
		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 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;
		if (design == 'stabak')	embedCode += '&amp;amp;layout=7';
		embedCode += '&quot;&gt;&lt;/iframe&gt;';
		
		var programLink = webtvUrl + '?progId=' + progId + '&amp;treeId=777';
	
		var featuresHeader = '<h5 class="sumoFeatureTitle">Del med andre</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">Sett inn på nettsider eller blogg:</label>';
			embedHtml += '<input type="text" id="embedCode' + index + '" name="embedCode" value="' + embedCode + '">';
			if (isIe) embedHtml += '<a href="" class="sumoCopyButton" id="copyEmbedButton' + index + '" title="Kopier"><span>Kopier</span></a>';
		}
		embedHtml += '</p><p><label for="programLink">Lenke til video:</label>';
		embedHtml += '<input type="text" id="programLink' + index + '" name="programLink" value="' + programLink + '">';
		if (isIe) embedHtml += '<a href="" class="sumoCopyButton" id="copyLinkButton' + index + '" title="Kopier"><span>Kopier</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">Legg til på Facebook</a></p>';
		embedHtml += '</form>';
		var tipHtml = '<div class="tv2border"></div>';
		tipHtml += '<form action="/webtv/dido/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 + '">Tips en venn på e-post:</label><input type="text" id="sumoToAddress' + index + '" name="toAddress" value=""></p>';
		tipHtml += '<p><label for="sumoFromAddress' + index + '">Din e-postadresse:</label><input type="text" id="sumoFromAddress' + index + '" name="fromAddress" value="' + fromAddress + '"></p>';
		tipHtml += '<p><label for="sumoFromName' + index + '">Ditt navn:</label><input type="text" name="name" id="sumoFromName' + index + '" value="' + fromName + '"></p>';
		tipHtml += '<p class="sumoSubmit"><input type="submit" value="Send tips" 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&fromName=' + escape($F('sumoFromName' + index)) + '&fromAddress=' + escape($F('sumoFromAddress' + index)) + '&toAddress=' + escape($F('sumoToAddress' + index));
					if (location.pathname.indexOf('/webtv/dido/')<0) {
						parameters += '&url=' + escape(location.href);
					} else {
						parameters += '&progId=' + progId;
					}
					
					// Storing for subsequent tipping
					fromName = $F('sumoFromName' + index);
					fromAddress = $F('sumoFromAddress' + index);
					if (!$F('sumoToAddress' + index)) {
						alert('Du må fylle ut navnet ditt.');
						$('sumoTipButton' + index).disabled = false;
						Event.stop(e);
						return false;
					}
					if (!fromAddress) {
						alert('Du må fylle ut e-postadressen din.');
						$('sumoTipButton' + index).disabled = false;
						Event.stop(e);
						return false;
					}
					if (!fromName) {
						alert('Du må fylle ut navnet ditt.');
						$('sumoTipButton' + index).disabled = false;
						Event.stop(e);
						return false;
					}
					getFromWebTV('dido/ajax/external/tipAFriend.dox',parameters,null,
						function(){
							$('featuresContent' + index).innerHTML = '<p style="margin-top: 18px; text-align: center">Tipset er nå sendt.</p><p style="margin-top: 18px; text-align: center"><a id="tipMore'+ index + '" href="" style="text-decoration: underline">Send til flere</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">Tipset kunne dessverre ikke sendes på grunn av en feil.</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 doGoogleLog() {
			window._uacct = 'UA-2964717-1';
			var url = 'dido/play?progId=' + progId;
			if (treeId) url += '&treeId=' + treeId;
			var ref;
			if (isSelfContained) {
				ref = document.referrer;
				//ref = ref.substring(ref.indexOf('//') + 2,ref.length);
				//ref = ref.substring(0,ref.indexOf('/'));
				//if (ref.indexOf(':')>0) ref = ref.substring(0,ref.indexOf(':'));
			} else {
				ref = document.location.href; //hostname;
			}
			if (ref) {	
				__utmSetVar(ref);
			}
			urchinTracker(url);
			logDebug('Tracking completed: ' + url + ' &bull; ' + ref);
		}

		try {
			if (urchinTracker)
				doGoogleLog();
			else
				loadAndTrack('http://www.google-analytics.com/urchin.js',doGoogleLog);
		} catch(errr) {
			loadAndTrack('http://www.google-analytics.com/urchin.js',doGoogleLog);
		}

		function loadAndTrack(url,onScriptLoad) {		
			var head = document.getElementsByTagName("head")[0];         
			var newScript = document.createElement('script');
			newScript.type = 'text/javascript';
			newScript.onreadystatechange=function(){if(newScript.readyState=='loaded' || newScript.readyState=='complete'){onScriptLoad()}};
			newScript.src = url;
			newScript.onload = onScriptLoad;
			head.appendChild(newScript);
		}
	}

	function prepareStreamTracking() {
		try {
			if (bmsCaptureState) {
				logDebug('Initalizing StreamMetrix logging');
				window.smac = 'tv2i_st_no';
				window.smcc = 'no';
				window.smenc= 'ISO-8859-1';
/*
				document.write('<script for="video' + index + '" event="playStateChange(NewState)" language="JavaScript">');
				document.write('bmsCaptureState(smac, smcc, smenc, NewState, document.getElementById("video' + index + '"))');
				document.write('</script>');
*/
				var head = document.getElementsByTagName('head')[0];         
				var newScript = document.createElement('script');
				newScript.type = 'text/javascript';
				newScript.setAttribute('for','video' + index);
				newScript.setAttribute('event','playStateChange(NewState)');
				newScript.setAttribute('language','text/javascript');
				
				newScript.innerHTML = ' bmsCaptureState(smac, smcc, smenc,	NewState,	document.getElementById("video' + index + '"));'; 

				head.appendChild(newScript);
			
			}
		} catch (e) {}
	}
	

	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 = '/webtv/';
		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 loadDock() {
		function isInFamily(elm1,elm2,elmId) {
			try {
				return ((elm1.id == elmId || (elm1.nodeName.toLowerCase() == 'img' && elm1.parentNode.parentNode.parentNode.id == elmId) || (elm1.nodeName.toLowerCase() == 'li' && elm1.parentNode.id == elmId)) && 
					(elm2.id == elmId || (elm2.nodeName.toLowerCase() == 'img' && elm2.parentNode.parentNode.parentNode.id == elmId) || (elm2.nodeName.toLowerCase() == 'li' && elm2.parentNode.id == elmId)));
			} catch(e) {
				//alert('elm1: ' + elm1 + ' elm2: ' + elm2 + ' elmId: ' + elmId);				
			}
		}

		var currentEffect;
		var dockActive = false;
		var dockTitle;
		if (!$('dock' + progId)) {
			getFromWebTV('dido/listContent.dox','treeByProgId='+progId,'dockContainer'+index,function() {
					var dock = new OsXDock();
					var dockElements = $('dock'+progId).getElementsByTagName('img');
					for (var j=0; j<dockElements.length; j++) {
						Event.observe(dockElements[j],'mouseover',function(ev) {
								var elm = Event.element(ev);
								dock.enlarge(elm);
								if (currentEffect) currentEffect.cancel();
								currentEffect = new Effect.Appear('dockDetails'+progId,{ duration: 0.5, from: 0, to: 1});
								if (!dockTitle)
									dockTitle = $('dockDetails' + progId).innerHTML;
								$('dockDetails' + progId).innerHTML = elm.parentNode.previousSibling.innerHTML;
								//logDebug(elm.parentNode.previousSibling.innerText);
							}, false);
						Event.observe(dockElements[j],'mouseout',function(ev) {
								var elm = Event.element(ev);
								dock.reduce(elm);
								if (currentEffect) currentEffect.cancel();
								currentEffect = new Effect.Fade('dockDetails'+progId,{ duration: 0.5, from: 1, to: 0, afterFinish: function(e) {$('dockDetails' + progId).innerHTML = '';}});
								//elm.parentNode.previousSibling.style.display  = 'none';
							}, false);					
					}
				});
		}
	}

	function OsXDock() {
		this.enlarge = enlarge;
		this.reduce = reduce;
		


		/*******************************************************************************
			'Dock' style enlarging and reducing of DOM elements.
		
			Copyright (C) Nick Jarman 2005. All rights reserved.
		*******************************************************************************/
		
		// Parameters which affect the display.
		var	interval		= 10;	// How often the sizes of the items are adjusted
									// (msec? - a setting of 10 seems to work OK, 
									// though it seems quite fast)
		var enlargeSteps	= 20;	// Number of steps used to enlarge an element
		var enlargeStepSize	= 2;	// How many pixels are added to the width of an
									// element in each enlargement step.
		var reduceStepSize	= 1;	// How many pixels are subtracted from the width
									// of an element in each reduction step. Take
									// care to ensure that this is divisible by 
									// enlargeSteps * enlargeStepSize.
		
		// A few globals.
		var	timeout			= null;
		var enlargeElement	= -1;
		var	dockElements	= new Array();
		
			
		
		/*******************************************************************************
			enlarge - call this function in your element's OnMouseOver event.
		*******************************************************************************/
		function enlarge(element)
		{
			// Check to see if this element is already known to us. If it is, it's 
			// currently being reduced. Setting enlargeElement (see below) will stop
			// this happening, and cause it to be enlarged.
			elementIndex = findDockElement(element);

			// It's not known to us, so we must note a few details, wrap them in an 
			// instance of DockElement.
			if (-1 == elementIndex)
			{
				dockElements[dockElements.length] = new DockElement(element, element.width, element.width + (enlargeStepSize * enlargeSteps));
				elementIndex = dockElements.length - 1;
			}

			// Now we know which item in the dockElements array is the one to be
			// enlarged. Note that only one item at a time can be enlarged (the one 
			// under the user's pointer), but many can be reduced.
			enlargeElement = elementIndex
		
			// If there's no timeout set up, do so now.
			if (null == timeout)
			{
				timeout = setTimeout(doResize, interval);
			}
		}
		
		
		/*******************************************************************************
			enlarge - call this function in your element's OnMouseOut event.
		*******************************************************************************/
		function reduce(element)
		{
			// Ensure that the element which is asking to be reduced is the one which
			// is currently being enlarged...
			if (enlargeElement == findDockElement(element))
			{
				// ...it is, so we indicate that no elements are being enlarged.
				enlargeElement = -1;
			}
		
			// If there's no timeout set up, do so now.
			if (null == timeout)
			{
				timeout = setTimeout(doResize, interval);
			}
		}
		
		
		/*******************************************************************************
			doResize - called when the timeout expires. Simply enlarges the element
			registered for enlarging by one step, reduces all other elements by one 
			step and checks whether	more enlarging or reducing is needed. If it is, 
			another timeout is set.
		*******************************************************************************/
		function doResize()
		{
			keepEnlarging	= doEnlarge();
			keepReducing	= doReduce();
		
			if (keepEnlarging || keepReducing)
			{
				timeout = setTimeout(doResize, interval);
			}
			else
			{
				timeout = null;
			}
		}
		
		
		/*******************************************************************************
			doEnlarge - checks if there is an element to be enlarged, and if so, calls
			the enlarge method of the relevant item in the dockElements array. Returns
			a flag to indicate whether further enlargements are necessary.
		*******************************************************************************/
		function doEnlarge()
		{
			keepGoing = false;
		
			if (-1 != enlargeElement)
			{
				keepGoing = dockElements[enlargeElement].enlarge();
			}
		
			return keepGoing;
		}
		
		
		/*******************************************************************************
			doReduce - iterates through all items in the dockElements array. For each
			element, providing it is not the one being enlarged, the reduce method is
			called. Returns a flag to indicate whether further reductions are
			necessary.
		*******************************************************************************/
		function doReduce()
		{
			keepGoing		= false;
			tidyupNeeded	= false;
		
			for (thisItem = 0; thisItem < dockElements.length; thisItem ++)
			{
				// Don't reduce the item which is being enlarged!
				if (enlargeElement != thisItem)
				{
					if (dockElements[thisItem].reduce())
					{
						keepGoing = true;
					}
					else
					{
						// This element has been reduced back to its original size, so
						// it is no longer necessary to keep it in the dockElements
						// array. Set a flag to indicate it should be removed.
						dockElements[thisItem].remove = true;
						tidyupNeeded = true;
					}
				}
			}
		
			// If we have marked some items in the dockElements array for removal, now
			// is the time to remove them.
			if (tidyupNeeded)
			{
				tidyDockElements();
			}
			
			return keepGoing;
		}
		
		
		/*******************************************************************************
			findDockElement - returns the index of the supplied element in the
			dockElements array, or -1 if it does not exist.
		*******************************************************************************/
		function findDockElement(element)
		{
			thisItem	= 0;
			found		= false;
			
			while ((thisItem < dockElements.length) && !found)
			{
				if (dockElements[thisItem].element == element)
				{
					found = true;
				}
				else
				{
					thisItem ++;
				}
			}
		
			return found ? thisItem : -1;
		}
		
		
		/*******************************************************************************
			tidyDockElements - removes all items from the dockElements array whose
			remove flag is set. This is done by copying all items without the flag set
			to a temporary array, then asigning that array back to dockElements. Care 
			must be taken to adjust the value of enlargeElement, since it is an index
			into the array. Use of the splice method is avoided for compatibility with
			browsers earlier than IE5.5.
		*******************************************************************************/
		function tidyDockElements()
		{
			var tempArray	= new Array();
			var	tempEnlarge	= -1;
		
			for (thisItem = 0; thisItem < dockElements.length; thisItem ++)
			{
				if (!dockElements[thisItem].remove)
				{
					tempArray[tempArray.length] = dockElements[thisItem];
					
					if (thisItem == enlargeElement)
					{
						tempEnlarge = tempArray.length - 1;
					}
				}
			}
		
			dockElements = tempArray;
			enlargeElement = tempEnlarge;
		}
		
		
		/*******************************************************************************
			DockElement class, encapsulating a single element in the dock. This stores
			the HTML element and its original and maximum sizes. There are methods for
			enlarging and reducing the element's size by one step. An instance of this
			class is added to the dockElements array for each element that the user's
			pointer hovers over, so there's also a flag which is set when this instance
			should be removed from the array.
		*******************************************************************************/
		function DockElement(element, originalSize, maxSize)
		{
			this.element		= element;
			this.originalSize	= originalSize;
			this.maxSize		= maxSize;
			this.remove			= false;
			this.enlarge		= dockElementEnlarge;
			this.reduce			= dockElementReduce;
		}
		
		
		// Enlarge the element by one step, and return a flag indicating whether further 
		// enlargement steps are possible.
		function dockElementEnlarge()
		{
			if (this.element.width < this.maxSize)
			{
				this.element.width += enlargeStepSize;
			}
		
			return (this.element.width < this.maxSize);
		}
		
		
		// Reduce the element by one step, and return a flag indicating whether further
		// reduction steps are possible.
		function dockElementReduce()
		{
			if (this.element.width > this.originalSize)
			{
				this.element.width -= reduceStepSize;
			}
		
			return (this.element.width > this.originalSize);
		}
	}
}

if (typeof(DidoJSON)=='undefined') {
	var DidoJSON = (function (webtvUrl) {
		// Singleton
		var instance = null;
		
		return new function() {
			this.getInstance = function(webtvUrl) {
				if (instance == null) {
					instance = new JsonDido(webtvUrl);
		      instance.constructor = null;
	      }
	      return instance;
			}
		}
		
	
		function JsonDido(webtvUrl) {
			var jsonPath = 'dido/meta.dox?';
			var timeJsonPath = 'dido/time.dox?';
		
			var callbacks = new Object();
			var data = new Object();
			var isLoading = new Object();
			
			var helperId=0;
			
			var me = this;
			
			this.getCurrentTime = function(onComplete,onFailure) {
					helperId++;
					me.get('timeNow',helperId,onComplete,onFailure,timeJsonPath,true);
				}
			
			this.get = function(datatype,id,onComplete,onFailure,path,forceFresh) {
				try {
					if (!forceFresh && 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;
							if (!path) path = jsonPath;
							var completePath = webtvUrl + path + datatype + 'Id=' + id + '&callback=DidoJSON.getInstance().add';
							
							var head = document.getElementsByTagName("head")[0];
		
							if (!head) {
								head = document.getElementsByTagName("body")[0];
							}
							var newScript = document.createElement('script');
							newScript.type = 'text/javascript';
							newScript.charset = 'ISO-8859-1';
							if (onFailure)
								newScript.onerror = onFailure;
						
							if (!isLoading[datatype])
								isLoading[datatype] = new Object();
							isLoading[datatype][id] = true;
		
							newScript.src = completePath; //webtvUrl + buildAjaxUrl(path,parameters);
							head.appendChild(newScript);
						}
					}
				} catch(ex) {
					logError(ex);
					//onFailure(ex);
				}
			}
		
			this.add = function(result) {
				var id;
				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) {
		
		$('prePanel' + index).style.visibility = 'visible';
		if ($('overlay' + index))
			return;
		$('rotator'+index).style.display = 'block';
		var rotatorUrl = '/webtv/dido/listOtherContent.dox?progId='+progId;
		if (loadRelated) {
			var rotatorUrl = '/webtv/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://webtv.tv2.no/webtv/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) {
		var programTitle = 'TV 2 Sumo';
		if (treeId) {
			treeId = treeId + '';
			switch(treeId) {
				case '3312':
					$('sumoBannerAd'+index).innerHTML = '<a href="http://pub.tv2.no/TV2/zebra/magasiner/manshow/" target="_blank"><img src="/webtv/dido/images/manshow_banner.jpg"></a>';	
					break;
				case '2':
					$('sumoBannerAd'+index).innerHTML = '<a href="http://webtv.tv2.no/webtv/?treeId=2" target="_blank"><img src="/webtv/dido/images/tv2sport_banner.jpg"></a>';	
					break;
				case '2021':
					$('sumoBannerAd'+index).innerHTML = '<a href="http://www.fredrikstadfk.no/" target="_top"><img src="/webtv/dido/images/FFK_banner.jpg"></a>';	
					break;
				case '888':
					$('sumoBannerAd'+index).innerHTML = '<a href="http://www.sonen.no" target="_blank"><img src="/webtv/dido/images/sonen_banner.jpg"></a>';	
					programTitle = 'Sonen direkte';	
					break;
				case '333060':
					$('sumoBannerAd'+index).innerHTML = '<a href="http://waschera.no" target="_blank"><img src="/webtv/dido/images/waschera_banner.jpg"></a>';
					programTitle = 'Waschera direkte';	
					break;
				default:
					$('sumoBannerAd'+index).innerHTML = '<a href="http://tv2.no/sumo/" target="_blank"><img src="/webtv/dido/images/sumo_banner.jpg"></a>';			
			}
		}	else {
			$('sumoBannerAd'+index).innerHTML = '<a href="http://tv2.no/sumo/" target="_blank"><img src="/webtv/dido/images/sumo_banner.jpg"></a>';			
		}
		return programTitle;
	}
	
	
	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;	
	}
}

	if (location.href.indexOf('local=true')>0) {
		TV2Player.webtvUrl = '/webtv/';
		TV2Player.webtvExternalUrl = '/webtv/';
	} else {
		TV2Player.webtvUrl = 'http://webtv.tv2.no/webtv/';
		TV2Player.webtvExternalUrl = 'http://webtv.tv2.no/embed/';
	}

TV2Player.insertPlayer = function (progId, isMainPlayer, injectElementId, autoplay, layoutId, design, clubname) {
	// DEFINITIONS
	var layouts = new Array();
	layouts[0] = {className1: 'sumoSmall', className2: 'sumoNormal', bannerAd: true, related: true, useDefaultBW: true};
	layouts[1] = {className1: 'sumoSmall', className2: 'sumoMini', bannerAd: true, related: true, useDefaultBW: true};
	layouts[2] = {className1: 'sumoBig', className2: 'sumoMini', bannerAd: true, related: false};
	layouts[3] = {className1: 'sumoBig', className2: 'sumoMini', bannerAd: true, related: false, rotator: false};
	layouts[4] = {className1: 'sumoBig', className2: 'sumoMedium2', bannerAd: true, relatedGallery: true}; // Rundens mål
	layouts[5] = {className1: 'sumoSmall', className2: 'sumoMini', bannerAd: false, related: false, useDefaultBW: true};
	layouts[6] = {className1: 'sumoSmall2', className2: 'sumoMini', bannerAd: false, related: false, useDefaultBW: true}; // Kjappsporten
	layouts[7] = {className1: 'sumoBig2', className2: 'sumoMini', bannerAd: false, related: false, useDefaultBW: true, rotator: false}; // Stabæk
	layouts[8] = {className1: 'sumoSmall2', className2: 'sumoMini', bannerAd: false, related: false, useDefaultBW: true, rotator: false}; // Som Kjappsporten, uten sluttplakat.
	layouts[9] = {className1: 'sumoSmall', className2: 'sumoMini', bannerAd: true, related: true, useDefaultBW: true, rotator: false};

	var webtvUrl = TV2Player.webtvExternalUrl;
	
	var logoname = 'sumologo';
	if(clubname!=null){
		logoname=clubname;
	}	

	var scriptList;
	
	if (location.href.indexOf("local=true")>0) {
		scriptList = [webtvUrl + 'sumo/static-script/dido-player.js?debug=true&reload=true'];
	} else {
		scriptList = [webtvUrl + 'sumo/static-script/dido-player.js'];//,'http://ad.doubleclick.net/879366/DartPlayer_03_24.js'];
	}
	
	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.charset = 'ISO-8859-1';
				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 = progId;
	var imageDir = Math.floor(parseInt(progId)/1000);
	
	// putting the css in the head part, complying to the HTML standard
	var cssNode = document.createElement('link');
	cssNode.type = 'text/css';
	cssNode.rel = 'stylesheet';
	if (cssNode.readyState == null) {
		showInjectElement();
	}
	cssNode.onreadystatechange=function(){if(cssNode.readyState=='loaded' || cssNode.readyState=='complete'){showInjectElement()}};
	//cssNode.href = 'http://webtv.tv2.no/multimedia/webtv/dido/player/miniplayer-3.1.css';
	if (location.href.indexOf("local=true")>0) {
		cssNode.href = webtvUrl + 'sumo/static-css/dido-player.css?debug=true&reload=true';
	} else { 
		cssNode.href = webtvUrl + 'sumo/static-css/dido-player.css';
	}
	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.Player(index,progId,autoplay,layout);
					if (isMainPlayer) window.tv2video0 = player;
					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+='  <a href="http://tv2.no/" ><div class="developedby">Utviklet av <b>TV 2 Sumo</b></div> </a> ';	
	c+='  <div class="prePanel" id="prePanel{index}">';
	c+='    <div class="videoControls">';
	if(design=='clubplayer'){		
	c+=' <img class="clublogo" src="http://webtv.tv2.no/webtv/dido/images/player/clubplayer/clublogo/'+logoname+'.png" >';
	}else{
	c+='      <a class="logoButton videoButton" href="http://tv2.no/" id="logoPreButton{index}"></a>';
	}
	c+='      <a class="playButton videoButton" title="Spill av" href="" id="startButton{index}"><span>Spill av</span></a>';
	c+='      <a class="shareButton videoButton" title="Del med andre" href="" id="sharePreButton{index}"><span>Del med andre</span></a>';	
	if (layout.className1 == 'sumoSmall2') {
	c+='			<span class="stopButton videoButton"></span>';
	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+='    </div>';
	c+='    <div class="sumoPoster">';
	c+='      <a href="" id="startImage{index}"><img class="posterImage" src="http://www.tv2.no/tvid/VMan-P{imageDir}/VMan-P{progId}.jpg">';
	c+='        <span class="bwTestMessage"></span><span class="startBanner"></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" href="http://tv2.no/" id="logoButton{index}"></a>';
	c+='      <a class="playButton videoButton" title="Spill av/pause" href="" id="playButton{index}"><span>Spill av</span></a>';
	c+='      <a class="stopButton videoButton" title="Stopp" href="" id="stopButton{index}"><span>Stopp</span></a>';
	c+='      <a class="prevButton videoButton" title="G&aring; bakover" href="" id="prevButton{index}"><span>Bakover</span></a>';
	c+='      <a class="nextButton videoButton" title="G&aring; forover" href="" id="nextButton{index}"><span>Forover</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="Klikk for &aring; skifte posisjon i videoen" class="slider" id="slider{index}">';
	c+='        <div class="progressBar" title="Klikk for &aring; skifte posisjon i videoen" id="progressBar{index}"></div>';
	c+='        <div class="sliderButton" title="Klikk og dra for &aring; skifte posisjon i videoen" id="sliderButton{index}"></div>';
	c+='      </div>';
	c+='      <div class="playerStatus" id="playerStatus{index}"></div>';
	c+='      <a class="volDownButton videoButton" title="Svakere lyd" href="" id="volDownButton{index}"><span>Lyd &divide;</span></a>';
	c+='      <a class="soundButton videoButton" title="Demp" href="" id="muteButton{index}"><span>Demp</span></a>';
	c+='      <a class="volUpButton videoButton" title="Sterkere lyd" href="" id="volUpButton{index}"><span>Lyd +</span></a>';
	c+='      <a class="fullscreenButton videoButton" href="" title="Fullskjermsvideo" id="fullscreenButton{index}"><span>Full</span></a>';
	c+='      <a class="toolsButton videoButton" title="Oppsett" href="" id="toolsButton{index}"><span>Endre...</span></a>';
	c+='      <a class="shareButton videoButton" title="Del med andre" href="" id="shareButton{index}"><span>Del med andre</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="Forstørr"><img class="sumoPreviewImage" src="http://www.tv2.no/tvid/VMan-P{imageDir}/VMan-P{progId}_162x92.jpg"></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(/{imageDir}/ig,imageDir);
	
	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);
	}
}
