// Pseudo-constants
var QuietMode=0,StartBehaviour=0,StartTime=0,WaitTimeout=300; 
// Public frame properties
var CurrentClick,CurrentMarker=false,CurMkStart=0;
// Internal variables
var aClicks=null,DelayedConceal=null,DelayedReveal=null;;
var BMk=true,PPAnim=true,PPIndex=1,PPLive='';
var scrDisp,scrFr,scrSpd;
var timAlive=false,timDelay=false,timEvent=false,timReady=false,timScroll=false,timStall=false;
var Buffering=false,EndReported=false,StartReported=false,MediaReady=false,SlidesReady=false,IgnoreCurrentPos=false;
var ClockTime=-1,FramesToLoad=0,MediaLength=0,StallPos=-1,WaitSoFar=0;
var OldSt=0;
var BufPrg=-1,MaxPos=null,Opened=null,Started=null;
var slv=null;
var TransHigh='',TransNormal='';
var WMk=0;
var zoomJumpPos=0;

//
// Debug functions
//
var debugtext='';
var winDebug=false;
function getTime() {
	var now=new Date();	
	return '('+padLeft('00',now.getHours())+':'+padLeft('00',now.getMinutes())+':'+padLeft('00',now.getSeconds())+'.'+padLeft('000',now.getMilliseconds())+') ';
}
function padLeft(Mask,Msg) {
	var s=Mask+Msg;
	return s.substr(s.length-Mask.length,Mask.length);
}
function putDebug(Msg) {
	//alert('putdebug '+msg+' '+window.onerror+' '+PodiaTop());
	if (!window.onerror) {
		var pTop=PodiaTop();
		if (pTop) {
			/*if (pTop.winDebug) {
				with (winDebug.document) {
					open();
					write(debugtext);
					close();
				}
			}
			else*/ pTop.debugtext+=getTime()+' '+Msg+'<br />';
		}
	}
}
function showDebug() {
	if (debugtext!='') {
		if (!window.onerror) {	
			//if (!winDebug) {
				winDebug=window.open('','debug','');
				if (winDebug) {
					with (winDebug.document) {
						open();
						write(debugtext);
						close();
					}
				} 
				else alert(debugtext.replace(/<br ?\/>/g,'\n'));
			//}
		}
	}
	debugtext='';
	return true;
}

//
// Global variable support functions
//
function getvalue(k) {
	var pTop=PodiaTop();
	if (isvalue(k)) return pTop.aGlobals[k].vValue;
	else return false;
}

function isvalue(k) {
	var pTop=PodiaTop();
	if (pTop.aGlobals) return pTop.aGlobals[k]; 
	else return false;
}

function setvalue(k, v) {
	var pTop=PodiaTop();
	if (isvalue(k)) {
		pTop.aGlobals[k].vValue=v;
		return v;
	}
	else {
		if (pTop.aGlobals) {
			pTop.aGlobals[k]=new pTop.Item(v);
			return v;
		}
		else return false;		
	}
}

//
// Main functions
//
function AnimDelay(DivId,Play,Retry) {
	CancelTimer(timDelay);
	putDebug('AnimDelay swf'+DivId.substring(1));
	var pFl=GetFlash(window,'swf'+DivId.substring(1));
	if (pFl) {
		try {
			if (Play) pFl.Play();
			else pFl.Stop();
		}
		catch (err) {
			timDelay=window.setTimeout('AnimDelay("'+DivId+'",'+Play+','+(Retry+1)+');',500);
			putDebug('AnimDelay API error ('+timDelay+'): '+err);
		}
	}
}

function AnimState(Div,Play) {
	//Content has rotated in a sub-frame.
	CancelTimer(timDelay);
	putDebug('AnimState '+Div.id+','+(Play?'start':'stop'));
	var pFl=GetFlash(window,'swf'+Div.id.substring(1));
	if (pFl) {
		//Flash movies.
		putDebug('AnimState Flash: '+pFl+','+'swf'+Div.id.substring(1));
		try {
			if (Play) {
				pFl.Rewind();
				pFl.Play();
			}
			else pFl.Stop();
		}
		catch (err) {
			if (Play) timDelay=window.setTimeout('AnimDelay("'+Div.id+'",'+Play+',1);',500);
			putDebug('AnimState API error ('+timDelay+'): '+err);
		}
	}
	if (Div.pppath) {
		//PowerPoint slides.
		var pPPName=GetPPName(false);
		putDebug('AnimState PPName: '+pPPName);
		if (Play) {
			var pBody=GetPPBody(window,pPPName);
			if (pBody) pBody.start();
		}
		else {
			var pBody=GetPPBody(window,pPPName);
			if (pBody) pBody.stop();
		}
	}
}

function AutoPause(Mp) {
	BMk=false;
	switch (MediaVersion(Mp)) {
		case '6':
			Mp.Pause();
			break;
		case '7':
			if (Mp.controls.isAvailable('pause')) Mp.controls.pause();
			break;
		case '8':
		case '9':
			if (Mp.CanPause) playPause(Mp,false); 
			break;
		case 'x':
			Mp.Pause();
			break;
	}
	putDebug('AutoPause');
	return true;
}

function AutoPlay(Mp) {
	var pRs=false;
	switch (MediaVersion(Mp)) {
		case '6':
			Mp.Play();
			pRs=true;
			break;
		case '7':
			if (Mp.controls.isAvailable('play')) {
				Mp.controls.play();
				pRs=true;
			}
			break;
		case '8':
		case '9':
			playPause(Mp,true,Repeat);
			pRs=true;
			break;
		case 'x':
			try {
				Mp.Play();
				pRs=true;
			}
			catch (err) {
				putDebug('AutoPlay error: '+err);
			}
			break;
		case '0':
			EventTicker();
			break;
	}
	putDebug('AutoPlay: '+pRs);
	return pRs;
}

function AutoStop(Mp) {
	switch (MediaVersion(Mp)) {
		case 'x':
			Mp.Stop();
			break;
		case '6':
			Mp.Stop();
			break;
		case '7':
			if (Mp.controls.isAvailable('stop')) Mp.controls.stop();
			break;
		case '8':
		case '9':
			//AutoPause(Mp);
			Mp.Stop();
			break;
	}
}

function BufferingReport() {
	//putDebug('BufferingReport:'+GetPlayer().BufferingProgress);
	//CancelTimer(timBuffer);
	//var pMP=GetPlayer();
	DisplayStatus(false,'Buffering',true); // '+pMP.network.bufferingProgress+'%');
	//timBuffer=window.setTimeout("BufferingReport();",500);
	return true;
}

function ButtonFfwd() {
	var pMP=GetPlayer();
	if (!ReportErrors(pMP)) {
		if (CanSeek(pMP)) JumpMarker(1);
		else DisplayStatus(false,'This lecture cannot support seeking',true);
	}
	return false;
}

function ButtonNext() {
	var pMP=GetPlayer();
	if (!ReportErrors(pMP)) {
		if (CanSeek(pMP)) {
			if (GetPlayState(pMP)=='play') AutoPause(pMP);
			SetPosition(pMP,Duration(pMP));
		}
	}
	return false;
}

function ButtonPlayPause() {
	var pMP=GetPlayer();
	if (!ReportErrors(pMP)) {
		switch(GetPlayState(pMP)) {
			case 'pause':
			case 'ready':
			case 'stop':
				AutoPlay(pMP);
				break;
			case 'play':
				AutoPause(pMP);
				break;
			case 'end':
				if (QuietMode) DisplayStatus(false,'Player closed',true);
				else alert('The player has closed');
				break;
			default:
				DisplayStatus(false,'Waiting for data ...',true);
				//if (QuietMode) DisplayStatus(false,'Waiting for data ...',true);
				//else alert('The player is waiting for more data, please wait...');
				break;
		}
	}
	return false;
}

function ButtonPrev() {
	var pMP=GetPlayer();
	if (!ReportErrors(pMP)) {
		if (CanSeek(pMP)) {
			AutoStop(pMP);
			SetPosition(pMP,0);
		}
	}
	return false;
}

function ButtonRewind() {
	var pMP=GetPlayer();
	if (!ReportErrors(pMP)) {
		if (CanSeek(pMP)) JumpMarker(-1);
		else DisplayStatus(false,'This lecture cannot support seeking and must be restarted from the beginning',true);
	}
	return false;
}

function CancelTimer(t) {
	if (t) {
		putDebug('Timer cancel '+t+' '+(window==top));
		window.clearTimeout(t);
		//t=false;
	}
	return t;
}

function CanSeek(MP) {
	switch (MediaVersion(MP)) {
		case '6':
			return MP.CanSeek;
			break;
		case '7':
			return MP.controls.isAvailable('currentPosition');
			break;
		case '8':
		case '9':
			return MP.CanSeek;
			break;
		case 'x':
			return MP.GetCanSeek();
			break;
	}
}

function CheckChildrenLoaded() {
	//PP only.
	CancelTimer(timDelay);
	var pOk=false;
	if (frames) {
		var pFr=GetPPFrame(window,true);
		if (pFr&&pFr.document&&pFr.document.frames&&pFr.document.frames.length) {
			pFr=pFr.document.frames[0];
			if (pFr) {
				var d=pFr.document;
				pOk=d&&d.body&&d.body.children&&d.images;
			}
		}
	}
	if (pOk) SlideSwitch();
	else timDelay=window.setTimeout("CheckChildrenLoaded();",250);
	return pOk;
}

function CheckReady() {
	putDebug('CheckReady:'+SlidesReady+','+MediaReady+','+StartReported+','+StartBehaviour);
	if (SlidesReady) {
		if (MediaReady) {
			if (!StartReported) {
				var pMp=GetPlayer();
				if (pMp) {
					if (pMp.settings) pMp.settings.invokeURLs=false;
					if (MediaVersion(pMp)!='8'&&MediaVersion(pMp)!='9') pMp.Enabled=true;
					//ProcessTimedEvent(0);
					if (QuietMode) RemoteStart();
					else switch (StartBehaviour) {
						case 0:
						case 1:
							RemoteStart();
							break;
						case 2:
							DisplayStatus(false,'Click <a class=status href="JavaScript://" OnClick="RemoteStart();">Play</a> to Begin');
							break;
						case 3:
							DisplayStatus(false,'Ready');
							if (confirm("The presentation has loaded - click OK to begin")) RemoteStart();
							break;
					}
				}
				else {
					putDebug('Calling EventTicker from CheckReady');
					EventTicker();
				}
			}
		}
		else {
			switch (MediaVersion(GetPlayer())) {
				case 'x':
				case '6':
				case '7':
				case '8':
				case '9':
					DisplayStatus(false,'Initialising Media...',true);			
			}
		}
	}
}

function CheckReportStart() {
	if (!StartReported&&(MediaReady||MediaVersion(GetPlayer())!='8')) {
		var CFr=getvalue('control');
		if (CFr&&CFr.OK) {
			CFr.ReportStart();
			SCOInit();
		}
		StartReported=true;
		EndReported=false;
		HideStatii();
		putDebug('Start reported');
	}
}

function convertBigEndian(o) {
	var r='';
	if (o&&o.length&&o.charCodeAt(0)>255) for (var i=o.length-1;i>=0;i--) r=String.fromCharCode(o.charCodeAt(i)>>8)+r;
	else r=o;
	return r;
}

function CurrentPosition(MP) {
	var pPos=0;
	switch (MediaVersion(MP)) {
	//switch (IgnoreCurrentPos?'':MediaVersion(MP)) {
		case '6':
			pPos=MP.CurrentPosition;
			break;
		case '7':
			pPos=MP.controls.currentPosition;
			break;
		case '8':
		case '9':
			pPos=MP.Position.Seconds;
			break;
		case 'x':
			pPos=MP.GetCurrentPosition();
			break;
		case '0':
			if (Started) pPos=((new Date()).getTime()-Started)/1000;
			break;
	}
	if (MP&&MediaLength&&pPos>MediaLength) pPos=pPos%MediaLength;
	if (pPos>MaxPos||!MaxPos) MaxPos=pPos;
	return pPos;
}

function DisplayClock() {
	var pMP=GetPlayer();
	if (pMP&&FileName(pMP)!='') return DisplayTime(CurrentPosition(pMP))+' / '+DisplayTime(Duration(pMP));
	else return '00:00:00';
}

function DisplayStatus(Fr,Msg,Dbg) {
	if (Dbg) putDebug('(Status) '+Msg);
	if (QuietMode<2) {
		var pEl=GetElement(Fr,'scrolltop');
		var pTop=PodiaTop();
		if (!pEl) pEl=GetElement(pTop,'statustext');
		if (pEl) {
			if(pEl.innerHTML!=Msg) {
				pEl.innerHTML=Msg;
				pTop.defaultStatus='';
			}
		}
		else if (pTop.defaultStatus) pTop.defaultStatus=Msg;
	}
	return true;
}

function DisplayTime(t) {
	if (t>0) {
		var h=String(parseInt(t/3600));
		var m=String(parseInt(t/60));
		var s=String(parseInt(t%60));
		return (h.length==1?'0':'')+h+':'+(m.length==1?'0':'')+m+':'+(s.length==1?'0':'')+s;
	}
	else return '00:00:00';
}

function doMediaPrefs(value) {
	writeCookie('mediaPrefs',value,30);
	window.location.reload();
}

function Duration(MP) {
	var pDr=false;
	switch (MediaVersion(MP)) {
		case '6':
			pDr=MP.Duration;
			break;
		case '7':
			pDr=MP.currentMedia.Duration;
			break;
		case '8':
		case '9':
			pDr=MP.NaturalDuration;
			break;
		case 'x':
			pDr=MP.GetDuration();
			break;
	}
	if (pDr) return pDr;
	else return MediaLength;
}

function ElapsedTime() {
	if (Opened) return ((new Date()).getTime()-Opened)/1000;
	else return 0;
}

function EventTicker() {
	//putDebug('EventTicker: '+(window==top));
	CancelTimer(timEvent);
	if (!Started)	Started=(new Date()).getTime();
	var pMP=GetPlayer();
	var pPos=CurrentPosition(pMP);
	var pPs=GetPlayState(pMP);
	var pNext=ProcessTimedEvent(pPos);
	if (Clock!=1&&ClockTime!=pPos) {
		DisplayStatus(false,'Playing: '+DisplayClock()); 
		ClockTime=pPos;
	}
	putDebug('EventTicker: '+pNext+','+pPs+','+StartReported);
	if ((pNext||Clock==0)&&(MediaVersion(pMP)!='0'||pPs=='play'||(StartReported&&pPs==''))&&!EndReported&&!IsLive) {
		var pDelay=(pNext-pPos)*1000;
		pDelay=(pDelay>200?pDelay:200);
		timEvent=window.setTimeout("EventTicker();",Clock==0?(pDelay>999?900:pDelay):pDelay);
	}
	return true;
}

function ExecuteCmd(Cm,Ht) {
	if (Cm<0) {
		var pMP=GetPlayer();
		if (pMP) AutoPause(pMP);
		Cm=0-Cm;
	}
	switch (Cm) {
		case 0:
			var img=new Image; 
			img.src=Ht;
			break;
		case 2:
			ShowUrl('quizentry.aspx?quizid='+Ht,0,0);
			break;
		case 3:
			ShowUrl('resource.aspx?id='+Ht,0,0);
			break;
		case 4:
			ShowUrl(Ht,0,0);
			break;
	}
	return true;
}

function FileName(MP) {
	switch (MediaVersion(MP)) {
		case '6':
			return MP.FileName;
			break;
		case '7':
			return MP.URL;
			break;
		case '8':
		case '9':
			return MP.Source;
			break;
		case 'x':
			return MP.GetFileName();
			break;
		default:
			return null;
	}
}

function FlashClick(FrNo) {
	var pOk=false;
	var pFc=GetFlash(window,'swf'+CurrentMarker);
	if (pFc) {
		try {
			pFc.GotoFrame(FrNo);
			pFc.Play();
			pOk=true;
			putDebug('FlashClick: swf'+CurrentMarker+','+CurrentClick+','+FrNo+','+pOk);
		}
		catch (err) {
			putDebug('FlashClick error: '+err);
		}
	}
	return pOk;
}

function GetElement(Fr,En) {
	var pEl=false;
	if (Fr&&Fr.document) {
		if (Fr.document.getElementById) pEl=Fr.document.getElementById(En);
		else if (Fr.document.all) pEl=Fr.document.all[En];
		else pEl=Fr.document[En];
	}
	return pEl;
}

function GetFlash(Fr,En) {
	if (Fr&&Fr.document) return (Fr.document[En])?Fr.document[En]:(Fr.document.embeds&&Fr.document.embeds[En])?Fr.document.embeds[En]:GetElement(Fr,En);
}

function GetFrame(Fr,En) {
	if (Fr&&Fr.document&&Fr.document.frames&&Fr.document.frames.length) return Fr.document.frames[En];
	else return false;
}

function GetPlayer() {
	var pFr=PodiaTop();
	//if (pFr.main) return pFr.main.findName("videoElement");
	if (pFr.slv) return pFr.slv;
	else {
		var pEn='MediaPlayer';
		return pFr.document.embeds&&pFr.document.embeds[pEn]?pFr.document.embeds[pEn]:GetElement(pFr,pEn);
	}
}

function GetPlayState(MP) {
	var pRes=TranslatePlayState(GetRawPlayState(MP));
	putDebug('PlayState='+pRes);
	return pRes;
}

function GetRawPlayState(MP) {
	var pPs=null;
	if (!MP) MP=GetPlayer();
	switch (MediaVersion(MP)) {
		case 'x':
			pPs=MP.GetPlayState();
			break;
		case '6':
			pPs=MP.PlayState;
			break;
		case '7':
			pPs=MP.playState;
			break;
		case '8':
		case '9':
			pPs=MP.CurrentState;
			break;
	}
	return pPs;
}

function getMouseX(e) {
   if (e.pageX || e.pageY) return e.pageX;
   if (e.clientX || e.clientY) return e.clientX; //+ document.body.scrollLeft;
   }

function getMouseY(e) {
   if (e.pageX || e.pageY) return e.pageY;
   if (e.clientX || e.clientY) return e.clientY; //+ document.body.scrollTop;
}

function GetPPBody(Fr,En) {
	var f=GetFrame(Fr,En);
	if (f&&f.document&&f.document.frames) {
		var s=f.document.frames[0];
		if (s&&s.document&&s.document.body&&s.document.body.playAnimations) return s.document.body;
		//if (s&&s.document&&s.document.body) return s.document.body;
	}
}

function GetPPElement(Fr,Pending) {
	return GetElement(Fr,Fr.GetPPName(Pending));
}

function GetPPFrame(Fr,Pending) {
	return GetFrame(Fr,Fr.GetPPName(Pending));
}

function GetPPName(Pending) {
	return 'fPP'+(Pending?1-PPIndex:PPIndex);
}

function GetStyle(El) {
	if (El&&El.style) return El.style;
	else return El;
}

function GotoChapter(Dynamic,ChapterId) {
	var pTop=PodiaTop();
	if (Dynamic) pTop.location.href='theatre.aspx?c='+ChapterId;
	else pTop.location.href='../'+ChapterId+'/theatre.htm';
	return true;
}

function HasMediaEvents() {
	switch (MediaVersion(GetPlayer())) {
		case '6':
		case '7':
		case '8':
		case '9':
			return true;
			break;
		default:
			return false;
			break;
	}
}

function HideFlash(Fr) {
	if (Fr) {
		var pSwfs=Fr.aSwfs;
		if (pSwfs&&pSwfs.length) {
			for (var i=0;i<pSwfs.length;i++) {
				var pSwf=GetElement(Fr,pSwfs[i]);
				if (pSwf&&pSwf.parentNode) {
					pStyle=GetStyle(pSwf.parentNode);
					if (pStyle) pStyle.display='none';
				}
			}
		}
	}
}

function HideStatus(Fr) {
	var pEl=GetElement(Fr,'scrolltop');
	if (pEl) {
		var pStyle=GetStyle(pEl);
		if (pStyle) pStyle.display='none';
		pStyle=GetStyle(GetElement(Fr,'skiplink'));
		if (pStyle) pStyle.display='none';
	}
	else {
		pEl=GetElement(Fr,'statustext');
		if (pEl) DisplayStatus(Fr, '&nbsp;');
	}
	return true;
}

function HideStatii() {
	return HideStatus(PodiaTop())&&HideStatus(getvalue('keynote'))&&HideStatus(getvalue('slides'));
}

function ImgFindObj(n,d) { 
	var p,i,x;
	if (!d) d=document; 
	if ((p=n.indexOf("?"))>0 && parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document; 
		n=n.substring(0,p);
	 }
	if (!(x=d[n]) && d.all) x=d.all[n]; 
	for (i=0; !x && i<d.forms.length; i++) x=d.forms[i][n];
	for (i=0; !x && d.layers && i<d.layers.length; i++) x=ImgFindObj(n,d.layers[i].document); 
	return x;
}

function ImgPreload() { 
	var d=document; 
	if (d.images) {
		if (!d.ImgArr) d.ImgArr=new Array();
		var i, j=d.ImgArr.length, a=ImgPreload.arguments; 
		for(i=0;i<a.length;i++) 
			if (a[i]&&a[i].indexOf("#")!=0) {
				d.ImgArr[j]=new Image; 
				d.ImgArr[j++].src=a[i];
			}
	  }
}

function ImgRestore() { 
	var i,x,a=document.SwapArr; 
	for (i=0; a && i<a.length && (x=a[i]) && x.oSrc; i++) x.src=x.oSrc;
}

function ImgSwap() { 
	var i,j=0,x,a=ImgSwap.arguments; 
	document.SwapArr=new Array; 
	for (i=0; i<(a.length-2); i+=3)
		if ((x=ImgFindObj(a[i]))!=null) {
			document.SwapArr[j++]=x; 
			if (!x.oSrc) x.oSrc=x.src; 
			x.src=a[i+2];
		}
}

function IsFrameReady(Fr,t) {
	if (Fr) {
		var pDone=PercentReady(Fr);
		if (pDone>0.99) {
			HideFlash(Fr);
			if (t>=0) HideStatus(Fr);
			return true;
		}
		else {
			if (t>=0) DisplayStatus(Fr,'Loading '+Fr.name+', please wait... ('+parseInt(100*pDone)+'% complete, '+t+' seconds so far)');
			return false;
		}
	}
	else return false;
}

function JumpMarker(Dir) {
	var pCurIx=-1,pNextIx;
	var pMP=GetPlayer();
	var pEv=getvalue('events'),pFr=getvalue('transcript');
	var pOK=false;
	if (pEv) {
		if (CurrentMarker) {
			for (var i=3;i<(pEv.length-1);i+=4) {
				if (pEv[i]==CurrentMarker) {
					pCurIx=i;
					break;
				}
			}
		}
		pMkIndex=pCurIx;
		while (!pOK) {
			// Find next marker
			pMkIndex+=(4*Dir);
			if (pMkIndex>0&&pMkIndex<pEv.length) {
				if (pEv[pMkIndex-3]==null) {
					// SyncTime is null
					if (QuietMode) DisplayStatus(false,'Ffwd/Rewind failed',true);
					else alert('Ffwd/Rewind failed');
					break;
				}
				else if (ReportErrors(pMP)) {
					// Media Player is broken
					break;
				}
				else if ((!pFr)||GetElement(pFr,'m'+pEv[pMkIndex])) {
					// Found target marker
					if (CanSeek(pMP)) {
						SetPosition(pMP,pEv[pMkIndex-3]);
						if (GetPlayState(pMP)!='play') {
							putDebug('Calling EventTicker from JumpMarker');
							EventTicker(); //ProcessTimedEvent(pEv[pMkIndex-3]);
						}
					}
					pOK=true;
				}
			}
			else break;
		} 
	}
	else DisplayStatus(false,'No events registered');
	return pOK;
}

function JumpPos() {
	JumpPosition(zoomJumpPos);
}

function JumpPosition(Pos) {
	var pMP=GetPlayer();
	if (CanSeek(pMP)) {
		SetPosition(pMP,Pos);
		if (GetPlayState(pMP)!='play') {
			putDebug('Calling EventTicker from JumpPosition');
			EventTicker(); 
		}
	}
	else {
		//if (QuietMode) DisplayStatus(false,'Seek disabled',true);
		//else alert('Could not seek to bookmark.');
		DisplayStatus(false,'Seek disabled',true);
	}
}

function KeepAlive() {
	CancelTimer(timAlive);
	if (!(EndReported||KeepAliveURL=='')) {
		var img=new Image; 
		img.src=KeepAliveURL+'&t='+ElapsedTime();
		var pMP=GetPlayer();
		var pPos=CurrentPosition(pMP);
		var pPs=GetPlayState(pMP);
		putDebug('KeepAlive ('+pPs+','+pPos+'): '+img.src);
		// Restart stalled media.
		if (pPs=='play'&&MediaVersion(pMP)=='8') {
			if (Repeat&&pPos==StallPos&&pPos>0) slvDelayedPlay();
			else StallPos=pPos;
		}
		else StallPos=-1;
		timAlive=window.setTimeout("KeepAlive();", 30000);
	}
}

function LoadNextPPSlide(Fr,Fn,Mk) {
	putDebug('LoadNext: '+Fn+','+Mk);
	var pEv=getvalue('events');
	if (pEv&&Fr) {
		var pCheck=((Mk?Mk:CurrentMarker)?0:2);
		for (var i=0;i<(pEv.length-1);i+=4) {
			var pMk=pEv[i+3];
			if (pCheck==0) {
				if (Mk) {
					if (pMk==Mk) pCheck=2;
				}
				else {
					if (pMk==CurrentMarker) pCheck=1;
				}
			}
			else {
				if (pCheck==1) pCheck=2;
				else {
					var pDiv=GetElement(Fr,'m'+pMk);
					if (pDiv&&pDiv.ppslide) {
						if (Fr.PPInit(false,Fn,pDiv)) return pMk;
						break;
					}
				}
			}
		}
	}
}

function MediaVersion(MP) {
	var pVer='none';
	if (MP) {
		if (MP.Tag) pVer='8';
		else if (MP.controls) pVer='7';
		else if (MP.FileName) pVer='6';
		else {
			try {
				MP.GetCurrentPosition();
				pVer='x';
			}
			catch (err) {
				pVer='0'
				//putDebug('Error:'+err);
			}
		}
	}
	return pVer;
}

function PercentReady(Fr) {
	if (Fr) {
		var pDone=0,pNoDone=0,pNoTotal=0;
		var pFrames=Fr.document.frames;
		var pImages=Fr.document.images;
		var pSwfs=Fr.aSwfs;
		if (pImages) {
			//putDebug('PercentReady IMGs: '+pImages.length);
			pNoTotal+=pImages.length;
			for (var i=0;i<pImages.length;i++) if (pImages[i].complete) pNoDone++; 
			var pImgArr=Fr.document.ImgArr;
			if (pImgArr) {
				pNoTotal+=pImgArr.length;
				for (var j=0;j<pImgArr.length;j++) if (pImgArr[j].complete||pImgArr[j].id=='imgKa'||pImgArr[j].src.indexOf('.htm')>0) pNoDone++; 
			}
		}
		if (pSwfs&&pSwfs.length) {
			//putDebug('PercentReady SWFs: '+pSwfs.length);
			for (var i=0;i<pSwfs.length;i++) {
				var pSwf=GetFlash(Fr,pSwfs[i]);
				if (pSwf) {
					pNoTotal++;
					try {
						if (pSwf.PercentLoaded()==100) pNoDone++;
						putDebug('Flash progress: '+pSwfs[i]+' '+pSwf.PercentLoaded());
					}
					catch (err) {
						pNoDone++;
						putDebug('PercentReady API error: '+err);
					}
				}
			}
		}
		if (pNoTotal==0) pDone=1;
		else pDone=pNoDone/pNoTotal;
		return pDone*100;
	}
	else return 0;
}

function PlayerBuffering(x) {
	//putDebug('PlayerBuffering:'+x);
	Buffering=x;
	if (scrFr) CancelTimer(timScroll);
	if (x) {
		CancelTimer(timEvent);
		BufferingReport();
	}
	else {
		//CancelTimer(timBuffer);
		if (GetPlayState()=='play') {
			putDebug('Calling EventTicker from PlayerBuffering');
			EventTicker();
		}
		else DisplayStatus(false,'Paused'+(Clock==1?'':': '+DisplayClock()));
	}
	return true;
}

function PlayerEndOfStream(Result) {
	//Report that the chapter has hit the end - end behaviours will be taken care of by the control pane.
	if (!EndReported) {
		CancelTimer(timAlive);
		EndReported=true;
		StartReported=false;
		var CFr=getvalue('control');
		if (CFr&&CFr.OK) {
			CFr.ReportFinish(Result,ElapsedTime());
			SCOTerminate();
		}
	}
	return Result;
}

function PlayerError(ec,ed) {
	if (!(ec||ed)) {
		ec='';
		ed='';
		var pMP=GetPlayer();
		if (pMP) {
			switch (MediaVersion(pMP)) {
				case '6':
					ec=pMP.ErrorCode;
					ed=pMP.ErrorDescription;
					break;
				case '7':
					ec=pMP.error.item(0).errorCode;
					ed=pMP.error.item(0).errorDescription;
					break;
			}
		}
	}
	if (ec==''&&ed=='') return false;
	else {
		var CFr=getvalue('control');
		if (CFr&&CFr.OK) CFr.ReportError(ec,ed);
		if (QuietMode) DisplayStatus(false,"Player Error: "+ec,true);
		else alert(ec==-2147024891?'Media could not be located. This could be due to a temporary connection fault or a firewall that is blocking media traffic.':'Player Error:\n'+ed);
		return true;
	}
}

function PlayerScriptCommand(stype, scommand) {
	if (stype=='TEXT') return ProcessTaggedEvent(scommand);
	else return false;
}

function PlayerStateChange(newst) {
	putDebug('PlayerStateChange: '+newst);
	CancelTimer(timEvent);
	var pButton,pFrame;
	var pMP=GetPlayer();
	if (MediaVersion(pMP)=='8') slvShowButtons(pMP);
	switch (TranslatePlayState(newst)) {
		case 'stop':
			//showDebug();
		case 'pause':
		case 'end':
			// Stopped or Paused
			if (pButton=GetElement(window,'aPause')) GetStyle(pButton).display='none';
			if (pButton=GetElement(window,'aPlay')) GetStyle(pButton).display='';
			switch (TranslatePlayState(newst)) {
				case 'stop':
					DisplayStatus(false,'Stopped',true);
					break;
				case 'pause':
					DisplayStatus(false,'Paused'+(Clock==1?'':': '+DisplayClock()),true);
					// Temporary bookmarking.
					if (BMk) {
						var CFr=getvalue('control');
						if (CFr&&CFr.OK) CFr.ReportSave(CurrentPosition(pMP),ElapsedTime());
					}
					else BMk=true;
					break;
				case 'end':
					DisplayStatus(false,'Player Closed',true);
					PlayerEndOfStream(true);
					break;
			}
			break;
		case 'play':
			// Playing
			if (pButton=GetElement(window,'aPlay')) GetStyle(pButton).display='none';
			if (pButton=GetElement(window,'aPause')) GetStyle(pButton).display='';
			CheckReportStart();
			if (!Buffering) {
				putDebug('Start:'+StartTime+',Duration,'+Duration(pMP)+',CanSeek,'+CanSeek(pMP));
				if (StartTime&&Duration(pMP)>StartTime) {
					if (CanSeek(pMP)) {
						SetPosition(pMP,StartTime);
						StartTime=0;
					} 
					else {
						if (QuietMode) DisplayStatus(false,'Seek disabled',true);
						else alert('Could not seek to bookmark.');
					}
				}
				putDebug('Calling EventTicker from PlayerStateChange');
				EventTicker();
			}
			if (Clock!=0) DisplayStatus(false,'Playing'+(Clock==1?'':': '+DisplayClock()),true);
			break;
		case 'ff':
			// Fast-forwarding - short-circuit the inbuilt functionality and jump to the next paragraph.
			if (TranslatePlayState(OldSt)=='play') AutoPlay(pMP);
			else AutoPause(pMP);
			ButtonFfwd();
			break;
		case 'rew':
			// Rewinding - short-circuit the inbuilt functionality and jump to the previous paragraph.
			if (TranslatePlayState(OldSt)=='play') AutoPlay(pMP);
			else AutoPause(pMP);
			ButtonRewind();
			break;
		case 'buffer':
		case 'wait':
			// Waiting
			break;
	}
	OldSt=newst;
	return true;
}

function PlayerWarning(Detail) {
	var Err="Player Warning: "+Detail;
	DisplayStatus(false,Err,true);
	var CFr=getvalue('control');
	if (CFr&&CFr.OK) CFr.ReportError(Err);
	return true;
}

function PodiaTop() {
	var pFr=window;
	if (pFr.aEvents) return pFr;
	else {
		if (pFr.parent.PodiaTop&&pFr.parent!=pFr) return pFr.parent.PodiaTop();
		else return pFr;
	}
}

function PPClick(Fwd) {
	var pOk=false;
	var pBody=GetPPBody(window,PPLive);
	if (pBody) {
		if (Fwd) pBody.pptNext();
		else pBody.pptPrev();
		pOk=true;
	}
	putDebug('PPClick:'+PPLive+','+(Fwd?'fwd':'back')+','+pOk);
	return pOk;
}

function PPInit(Immed,Id,Div) {
	var pIf=GetElement(window,Id);
	var pOk=false;
	if (pIf) {
		if (pIf.pppath==Div.pppath) {
			var pFr=GetFrame(window,Id);
			if (pFr&&pFr.GoToSld) {
				pFr.GoToSld(Div.pppath+Div.ppslide);
				pIf.ppslide=Div.ppslide;
				pOk=true;
			}
		}
		else {
			pIf.pppath=Div.pppath;
			pIf.ppslide=Div.ppslide;
			pIf.src=Div.pppath+'frame.htm#'+Div.ppslide;
			pOk=true;
		}
		if (pOk) {
			Div.ppname=Id;
			if (!Immed) window.setTimeout("PPStop('"+Id+"');",250);
		}
		putDebug('PPInit '+(Immed?'emergency':'planned')+': '+Id+','+Div.pppath+Div.ppslide+','+pOk);
	}
	return pOk;
}

function PPStop(Id) {
	var pBody=GetPPBody(window,Id);
	if (pBody) {
		if (PPLive!=Id) pBody.stop();
		putDebug('PPStop '+Id+','+PPLive);
		return true;
	}
	else window.setTimeout("PPStop('"+Id+"');",250);
}

function ProcessTaggedEvent(Cmd) {
	CancelTimer(timEvent);
	putDebug('ProcessTaggedEvent: '+Cmd);
	if (window.setOK) setOK();
	else {
		if (Cmd.substring(0,1)=="$") {
			//Process a command event.
			IgnoreCurrentPos=true;
			if (Cmd.substring(1,10)=="PODIA_END") {
				PlayerEndOfStream(true);
			}
			else if (Cmd.substring(1,12)=="PODIA_START") {
				putDebug('media player version is '+MediaVersion(GetPlayer()));
				Started=null;
				CheckReportStart();
			}
			else if (Cmd.substring(1,11)=="PODIA_TIME") {
				Started=(new Date()).getTime()-(parseInt(Cmd.substring(11))*1000);
				CheckReportStart();
			}
			//putDebug('Calling EventTicker from ProcessTaggedEvent: '+Started);
			EventTicker();
		}
		else {
			//Run through all the registered events looking for one with a tag that matches.
			var pEv=getvalue('events');
			if (pEv) {
				for (var i=0;i<(pEv.length-1);i+=4) {
					if (pEv[i]&&pEv[i+1]) {
						//Time is not null and tag is not blank.
						var aCmd=Cmd.split('|');
						if (aCmd.length&&aCmd[0].toLowerCase()==pEv[i+1].toLowerCase()) {
							//Tag matched.
							var pMk=pEv[i+3];
							if (pMk!=CurrentMarker) {
								//Rotate content.
								putDebug('New marker:'+pMk);
								CurrentClick=-1;
								PropagateEvent(pMk,CurrentPosition(GetPlayer()));
							}
							if (aCmd.length>1) {
								//Slide has clicks.
								var pArr=pEv[i+2];
								var pCl=parseInt(aCmd[1]);
								var pFrNo=(pArr&&(pArr.length-1)>pCl*2)?pArr[1+pCl*2]:0;
								putDebug('Click:'+pCl+','+CurrentClick+','+pFrNo);
								if (pFrNo) {
									//Current click fix.
									if (CurrentClick!=pCl&&PropagateClick(false,pFrNo)) CurrentClick=pCl;
								}
								else {
									while (pCl<CurrentClick) {
										if (!PropagateClick(false,null)) break;
										CurrentClick--;
									}
									while (pCl>CurrentClick) {
										if (!PropagateClick(true,null)) break;
										CurrentClick++;
									}
								}
							}
							break;
						}
					}
				}
			}
		}
	}
	return true;
}

function ProcessTimedEvent(Time) {
	CancelTimer(timEvent);
	putDebug('ProcessTimedEvent: '+Time);
	//Run through all the registered events looking for the last one before the current time, ignoring any with a time of -1.
	var pEv=getvalue('events');
	var pArr=null,pChg=0,pMk=0,pPrevMk=0,pNext=0,pStart=0;
	if (pEv) {
		for (var i=0;i<(pEv.length-1);i+=4) {
			pNext=pEv[i];
			if (!(pNext==null||pNext==-1)) {
				if (pNext>Time) break;
				else {
					pArr=pEv[i+2];
					pMk=pEv[i+3];
					if (pArr) pStart=pNext;
				}
			}
		}
		if (pNext==pStart) pNext=null;
		if (pMk) {
			if (CurrentMarker) pPrevMk=CurrentMarker;
			if (pMk!=pPrevMk) {
				if (pArr) {
					CurrentClick=-1;
					aClicks=pArr;
				}
				PropagateEvent(pMk,Time);
				pChg=1;
			}
		}
		else aClicks=null;
		if (aClicks) {
			// The current slide has clicks.
			for (var j=0;j<(aClicks.length-2);j+=2) {
				var ci=j/2;
				if (aClicks[j]) {
					// Only process clicks that have a time.
					if (pStart+aClicks[j]>Time) {
						// This click is not yet due. 
						if (CurrentClick>ci) {
							// The slide has already advanced beyond this click.
							PropagateClick(false,aClicks[j+1]);
							CurrentClick=ci;
							// Force another event to trigger ASAP by returning the same time.
							pNext=Time;
							/*
							CurrentClick=-1;
							RotateContent('slides',pMk,Time);
							pNext=Time+1;
							*/
						}
						else {
							// The click hasn't happened yet.
							if (pNext==null||pStart+aClicks[j]<pNext) pNext=pStart+aClicks[j];
						}
						break;
					}
					else {
						// This click is overdue.
						if (ci>CurrentClick) {
							// The click has not yet happened.
							if (pChg) pNext=Time+1;
							else {
								PropagateClick(true,aClicks[j+1]);
								CurrentClick=ci;
								// Force another event to trigger ASAP by returning the same time.
								pNext=Time;
							}
							break;
						}
					}
				}
				putDebug('Clicks: '+CurrentClick+','+ci+','+pStart+','+Time+','+pNext);
			}
		}
	}
	else DisplayStatus(false,'No events registered');
	//Return the time of the next event.
	if (MediaLength&&(pNext==null||pNext>MediaLength)) return MediaLength;
	else return pNext;
}

function PropagateClick(Fwd,FrNo) {
	if (PPAnim) {
		//if (isvalue('keynote')) getvalue('keynote').PPClick(Fwd);
		if (isvalue('slides')) {
			if (FrNo) return getvalue('slides').FlashClick(FrNo);
			else return getvalue('slides').PPClick(Fwd);
		}
	}
}

function PropagateEvent(Mk,Time) {
	if (scrFr) CancelTimer(timScroll);
	RotateContent('keynote',Mk,Time);
	RotateContent('quiz',Mk,Time);
	RotateContent('slides',Mk,Time);
	RotateContent('transcript',Mk,Time);
	var pCmd=getvalue('cmds');
	if (pCmd) {
		for (var i=pCmd.length-4;i>=0;i-=3) {
			if (pCmd[i]==Mk) ExecuteCmd(pCmd[i+1],pCmd[i+2]);
		}
	}
	CurrentMarker=Mk;
	return true;
}

function QuestionResponse(eid,qid,mk,ix) {
	var div=GetElement(window,'m'+mk+'-'+ix);
	if (div) SlideConceal(div);
	div=GetElement(window,'m'+mk+'-'+(ix+1));
	if (div) SlideReveal(div);
	else {
		AutoPlay(GetPlayer());
		div=GetElement(window,'m'+mk+'-x');
		if (div) SlideReveal(div);
	}
	var f=GetElement(window,'frm'+qid);
	if (f&&content&&content.PostAnswers) {
		var ctl=GetElement(window,'txt'+qid);
		if (ctl) content.PostAnswers(eid,qid,ctl.value);
		else {
			var ans='';
			for (var i=0;i<f.elements.length;i++) {
				if (f.elements[i].checked) ans+=(ans==''?'':',')+f.elements[i].value;
			}
			content.PostAnswers(eid,qid,ans);
		}
		return true;
	}
	else return false;
}

function ReadyStateChange(rs) {
	return true;
}

function RemoteStart() {
	var pMP=GetPlayer();
	putDebug('RemoteStart:'+GetPlayState(pMP));
	CancelTimer(timReady);
	if (pMP) {
		if (!ReportErrors(pMP)) {
			switch (GetPlayState(pMP)) {
				case '':
					HideStatii();
					break;
				case 'pause':
				case 'ready':
				case 'stop':
					AutoPlay(pMP);
					break;
				default:
					DisplayStatus(false,'Waiting for data ...',true);
					timReady=window.setTimeout("RemoteStart();", 1000);
					//if (QuietMode) DisplayStatus(false,'Waiting for data ...',true);
					//else alert('The player is waiting for more data, please wait...');				
			}
		}
	}
	var pSl=getvalue('slides');
	var pPm=LoadNextPPSlide(pSl,'fPP0');
	if (pPm) LoadNextPPSlide(pSl,'fPP1',pPm);
	if (!Started)	Started=(new Date()).getTime()+10000;
	putDebug('Calling EventTicker from RemoteStart');
	EventTicker();
	return false;
} 

function ReportErrors(MP) {
	if (MediaVersion(MP)=='8'||MediaVersion(MP)=='9') {
		return false;
	}
	else {
		if (MP.error&&MP.error.errorCount) {
			for (var i=0;i<MP.error.errorCount;i++) {
				if (QuietMode) DisplayStatus(false,MP.error.item(i).errorDescription,true);
				else alert('Player Error\n'+MP.error.item(i).errorCode+'\n\n'+MP.error.item(i).errorDescription);
			}
			return true;
		}
		else return false;
	}
}

function ResizeCheck(tX,tY) {
	var wX,wY;
	if (document.body&&top==self) {
		wX=document.body.clientWidth; wY=document.body.clientHeight
		if ((wX&&wX!=tX)||(wY&&wY!=tY)) {
			self.resizeBy(tX-wX,tY-wY);
			var pX=((screen.availWidth-tX)/2)-6;
			var pY=((screen.availHeight-tY)/2)-46;
			self.moveTo((pX<0?0:pX),(pY<0?0:pY));
		}
	}
	//else {wX=window.innerWidth; wY=window.innerHeight}
}

function RevealSkip(Visible) {
	var pFr=getvalue('slides');
	if (!pFr) pFr=getvalue('keynote');
	if (pFr) {
		var pEl=GetElement(pFr,'skiplink');
		var pStyle=GetStyle(pEl);
		if (pStyle) {
			if (Visible&&pEl.minheight) pStyle.height=pEl.minheight;
			pStyle.display=(Visible?'':'none');
		}
	}
}

function RotateContent(Ct,Mk,Time) {
	putDebug('Rotate content '+Ct+','+Mk+','+Time);
	var pPrevEl;
	var pStyle;
	var pEl,pFr;
	if (isvalue(Ct)) {
		pFr=getvalue(Ct);
		pEl=GetElement(pFr,'m'+Mk,true);
		if (!pEl) {
			//Find the nearest preceding marker.
			var pEv=getvalue('events');
			if (pEv) {
				var pDo=false;
				for (var i=pEv.length-2;i>0&&(!pEl)&&!(pDo&&pEv[i]==pFr.CurrentMarker);i-=4) {
					if (pEv[i]==Mk) pDo=true;
					else {
						if (pDo) {
							Mk=pEv[i];
							pEl=GetElement(pFr,'m'+Mk);
						}
					}
				}
			}
		}
		if (pEl) {
			pFr.RevealSkip(false);
			if (pFr.CurrentMarker) {
				//De-select the current pane.
				pPrevEl=GetElement(pFr,'m'+pFr.CurrentMarker);
				if (pPrevEl) {
					if (Ct=='transcript') {
						SetStyle(pPrevEl,TransNormal); 
					}
					else {
						if (pEl.ppslide) pFr.DelayedConceal=pPrevEl; 
						else pFr.SlideConceal(pPrevEl);
						if (pPrevEl.ppslide) pFr.PPLive='';
					}
				}
			}
			//Select the new pane.
			if (Ct=='transcript') {
				SetStyle(pEl,TransHigh); 
				ScrollTo(pEl);
			}
			else {
				if (pEl.ppslide) {
					pFr.DelayedReveal=pEl;
					var pPend=GetPPElement(pFr,true);
					if (pPend&&pPend.pppath==pEl.pppath&&pPend.ppslide==pEl.ppslide) pFr.SlideSwitch();
					else {
						//pPend=GetPPElement(pFr,false);
						//if (pPend&&pPend.pppath==pEl.pppath&&pPend.ppslide==pEl.ppslide) pFr.SlideSwitch();
						pFr.PPInit(true,pFr.GetPPName(true),pEl);
						pFr.timDelay=pFr.setTimeout("CheckChildrenLoaded();",250);
					}
				}
				else pFr.SlideReveal(pEl);
			}
			//Store the current marker in this frame.
			pFr.CurrentMarker=Mk;
			pFr.CurMkStart=Time;
			return true;
		}	
		else return false;
	}
	else return false;
}

function ScrollInit(Fr,Disp,Speed) {
	scrDisp=Disp;
	scrFr=Fr;
	scrSpd=Math.abs(Speed);
	if (scrFr) return ScrollIteration();
	else return false;
}

function ScrollIteration() {
	//putDebug('ScrollIteration');
	if (scrFr) CancelTimer(timScroll);
	var i;
	if (scrSpd>Math.abs(scrDisp)) i=scrDisp;
	else i=(scrDisp>0?scrSpd:0-scrSpd);
	if(i) {
		scrDisp-=i;
		scrFr.scrollBy(0,i);
		timScroll=setTimeout("ScrollIteration();",25);
	}
	return false;
}

function ScrollJump(El) {
	if (scrFr) CancelTimer(timScroll);
	if (El) {
		El.scrollIntoView(true);
		return true;
	}
	else return false;
}

function ScrollTo(El) {
	return ScrollJump(El);
}

function ScrollToBottom(Fr) {
	if (scrFr) CancelTimer(timScroll);
	return ScrollTo(GetElement(Fr,'scrollbottom'));
}

function ScrollToTop(Fr) {
	if (scrFr) CancelTimer(timScroll);
	return ScrollTo(GetElement(Fr,'scrolltop'));
}

function SetPosition(MP,Pos) {
	switch (MediaVersion(MP)) {
		case 'x':
			MP.SetCurrentPosition(Pos);
			break;
		case '6':
			MP.CurrentPosition=Pos;
			break;
		case '7':
			MP.controls.currentPosition=Pos;
			break;
		case '8':
		case '9':
			MP.Position=Pos;
			break;
	}
}

function SetStyle(El,St) {
	El.className=St;
	return true;
}

function ShowChapter(Dynamic,Parms,Width,Height) {
	var link=(Dynamic?'theatre.aspx?'+Parms:'c/'+Parms+'/theatre.htm');
	//var popup=window.open(link,'theatre','alwaysraised=yes,menubar=no,resizable=yes,toolbar=no,scrollbars=no,status=yes,height='+Height+',width='+Width+',top='+Top+',left='+Left);
	var popup=window.open(link,'','alwaysraised=yes,menubar=no,resizable=yes,toolbar=no,scrollbars=no,status=yes');
	if (popup&&popup.focus) popup.focus();
	else {
		if (QuietMode) DisplayStatus(false,'Popup blocked');
		else alert('Your browser has not allowed the new window containing your chosen presentation to open.');
	}
	return false;
}

function ShowImg(Url,PixelWidth,PixelHeight) {
	var popup=window.open(Url,'image','alwaysraised=yes,menubar=no,resizable=yes,toolbar=no,scrollbars=no,status=no,height='+(PixelHeight+20)+',width='+(PixelWidth+20));
	if (popup&&popup.focus) popup.focus();
	//else alert('Your browser has not allowed a new window to open.');
	else DisplayStatus(false,'Popup blocked - click <a class=status href="JavaScript://" OnClick="ShowImg(\''+Url+'\','+PixelWidth+','+PixelHeight+');">here</a>');
	return false;
}

function ShowUrl(Url,PixelWidth,PixelHeight) {
	var popup;
	//if (PixelWidth==0||PixelHeight==0) popup=window.open(Url,Url.indexOf('theatre.aspx')<0?'popup':'theatre','');
	//else popup=window.open(Url,Url.indexOf('theatre.aspx')<0?'url':'theatre','alwaysraised=yes,menubar=yes,resizable=yes,toolbar=no,scrollbars=yes,status=yes,height='+PixelHeight+',width='+PixelWidth);
	if ((!PixelWidth)||(!PixelHeight)) popup=window.open(Url,'','');
	else popup=window.open(Url,'','alwaysraised=yes,menubar=yes,resizable=yes,toolbar=no,scrollbars=yes,status=yes,height='+PixelHeight+',width='+PixelWidth);
	if (popup&&popup.focus) popup.focus();
	//else alert('Your browser has prevented a new window from opening.');
	else DisplayStatus(false,'Popup blocked - click <a class=status href="JavaScript://" OnClick="ShowUrl(\''+Url+'\','+PixelWidth+','+PixelHeight+');">here</a>');
	return false;
}

function SkipWait() {
	var pFr=PodiaTop();
	pFr.SlidesReady=true;
	pFr.StartBehaviour=0;
	pFr.RevealSkip(false);
	pFr.HideStatii();
	pFr.WaitForStart();
}

function SlideConceal(El) {
	var div=GetElement(window,El.id+'-x');
	if (div) SlideConceal(div);
	if (El.ppname) El=GetPPElement(window); //GetElement(window,El.ppname);
	AnimState(El,false);
	var pStyle=GetStyle(El);
	if (pStyle) pStyle.display='none';
	putDebug('Concealed '+El.id);
	if (El.pppath) {
		var pTop=PodiaTop();
		if (pTop) pTop.LoadNextPPSlide(window,GetPPName());
	}
	DelayedConceal=null; 
}

function SlideReveal(El) {
	var div=GetElement(window,El.id+'-0');
	if (div) SlideReveal(div);
	if (El.ppname) {
		El=GetElement(window,El.ppname);
		PPLive=(El?El.id:'');
		PPIndex=(PPLive=='fPP0'?0:1);
	}
	putDebug('Revealed '+El.id);
	var pStyle=GetStyle(El);
	if (pStyle) pStyle.display='';
	AnimState(El,true);
	DelayedReveal=null; 
}

function SlideSwitch() {
	if (DelayedConceal) SlideConceal(DelayedConceal);
	if (DelayedReveal) SlideReveal(DelayedReveal);
}

function StopError(msg,url,lineno) {
	putDebug('StopError: '+url+' ('+lineno+') '+msg);
	return true;
}

function TranslatePlayState(PS) {
	switch (MediaVersion(GetPlayer())) {
//		case '0':
		case '6':
			switch (PS) {
				case 0:
					return 'stop';
					break;
				case 1:
					return 'pause';
					break;
				case 2:
					return 'play';
					break;
				case 3:
					return 'wait';
					break;
				case 4:
					return 'ff';
					break;
				case 5:
					return 'rew';
					break;
				case 6:
					return 'skipff';
					break;
				case 7:
					return 'skiprew';
					break;
				case 8:
					return 'end';
					break;
				default:
					return '';
			}
			break;
		case '7':
			switch (PS) {
				case 1:
					return 'stop';
					break;
				case 2:
					return 'pause';
					break;
				case 3:
					return 'play';
					break;
				case 4:
					return 'ff';
					break;
				case 5:
					return 'rew';
					break;
				case 6:
					return 'buffer';
					break;
				case 7:
					return 'wait';
					break;
				case 8:
					return 'end';
					break;
				case 9:
					return 'trans';
					break;
				case 10:
					return 'ready';
					break;
				case 11:
					return 'reconn';
					break;
				default:
					return '';
			}
			break;
		case '8':
		case '9':
			// Silverlight play states.
			switch (PS) {
				case 'Buffering':
					return 'buffer';
					break;
				case 'Closed':
					return 'end';
					break;
				case 'Opening':
					return 'wait';
					break;
				case 'Paused':
					return 'pause';
					break;
				case 'Playing':
					return 'play';
					break;
				case 'Stopped':
					return 'stop';
					break;
				default:
					return '';
			}
			break;
		default:
			return '';
	}
}

function TheatreClose() {
	//Report that the window has closed.
	if (!EndReported) {
		CancelTimer(timAlive);
		EndReported=true;
		var CFr=getvalue('control');
		if (CFr&&CFr.OK) CFr.ReportClose(CurrentPosition(GetPlayer()),MaxPos,ElapsedTime());
	}
}

function WaitForStart() {
	putDebug('WaitForStart:'+MediaVersion(GetPlayer())+','+SlidesReady+','+MediaReady);
	CancelTimer(timReady);
	var pDone=0;
	var pMp=GetPlayer();
	WaitSoFar++;
	if (SlidesReady) {
		if (MediaReady) CheckReady();
		else {
			if (pMp) {
				/*
				if (FileName(pMp)=='') {
					switch (MediaVersion(pMp)) {
						case '6':
							pMp.FileName=MediaFile;
							break;
						case '7':
							//pMp.stretchToFit=true;
							pMp.URL=MediaFile;
							break;
					}
				}
				else {
				}
				*/
				putDebug(GetPlayState(pMp)+' '+GetRawPlayState(pMp));
				switch (GetPlayState(pMp)) {
					case 'play':
					case 'ready':
						MediaReady=true;
						CheckReady();
						switch (MediaVersion(pMp)) {
							case '6':
								pMp.AutoRewind=Repeat;
								break;
							case '7':
								pMp.settings.invokeURLs=false;
								pMp.settings.setMode('loop',Repeat);
								break;
							case '8':
							case '9':
								// Silverlight repeat?
								break;
						}				
						break;
					case 'stop':
						if (MediaVersion(pMp)=='8'||MediaVersion(pMp)=='9') {
							MediaReady=true;
							CheckReady();
						}
						break;
				}
			}
			//else alert('Cant find media player');
			else {
				//Assume dynsrc mode (and wait for mouseover instead?).
				//return false;
				MediaReady=true;
				CheckReady();
			}
		}
	}
	else {
		if (IsFrameReady(PodiaTop(),WaitSoFar)||!pMp) pDone++;
		if (IsFrameReady(getvalue('keynote'),WaitSoFar)) pDone++;
		if (IsFrameReady(getvalue('slides'),WaitSoFar)) pDone++;
		if (WaitSoFar>WaitTimeout) {
			if (pMp&&MediaVersion(pMp)!='8'&&MediaVersion(pMp)!='9') pMp.Enabled=true;
			switch (QuickStart) {
				case 0:
					RevealSkip(true);
					break;
				case 1:
					pDone=FramesToLoad;
					break;
				default:
			}
		}
		if (pDone==FramesToLoad) {	
			SlidesReady=true;
			CheckReady();
		}
	}
	if (SlidesReady&&MediaReady) return true;
	else {
			switch (MediaVersion(pMp)) {
				case '0':
					RemoteStart();
					break;
				default:	
					timReady=window.setTimeout("WaitForStart();", 1000);
			}
	}
}

function Watermark() {
	var pStyle=GetStyle(GetElement(window,'imgWm'));
	if (pStyle) {
		WMk=!WMk;
		pStyle.display=(WMk?'':'none');
		window.setTimeout("Watermark();", 2500);
	}
}

function writeCookie(name,value,days) {
    if(name&&value&&days) {
        var expire=new Date((new Date()).getTime()+days*86400000);
        window.document.cookie=name+'='+escape(value)+'; expires='+expire.toGMTString();
    }
}

function ZoomThumbnail(syncTime,imgId,h,w) {
	var pDiv=GetElement(PodiaTop(),'zoomDiv');
	var pStyle=GetStyle(pDiv);
	if (pStyle) {
		if (imgId) {
			var pImg=GetElement(PodiaTop(),'zoomImage');
			var pLnk=GetElement(PodiaTop(),'zoomLink');
			var pSrc=GetElement(window,imgId);
			if (pImg&&pSrc) {
				pImg.height=h;
				pImg.src=pSrc.src;
				pImg.width=w;
				if (pLnk) {
					zoomJumpPos=syncTime;
					pLnk.onclick=JumpPos;
				}
				var e=window.event;
				var el=PodiaTop().frames['navigation'].frameElement.offsetParent;
				var x=0,y=0;
				while (el)
				{
					x+=el.offsetLeft;
					y+=el.offsetTop;
					el=el.offsetParent;
				}
				//putDebug('Mouse:'+x+','+y+','+getMouseX(e)+','+getMouseY(e));
				if (e) {
					pStyle.left=getMouseX(e)+x;
					pStyle.top=getMouseY(e)+y;
					pStyle.zIndex=28000;
				}
				pStyle.visibility='visible';
				//alert(pImg.src+','+pImg.height+','+pImg.width);
			}
		}
		else pStyle.visibility='hidden';
	}
}
//
// Silverlight handlers
//
function slvBufferingProgressChanged(sender,EventArgs) {
	var pBp=parseInt(sender.BufferingProgress*100);
	if (BufPrg!=pBp) {
		BufPrg=pBp;
		DisplayStatus(false,'Buffering '+pBp+'%',true); 
	}
    return true;
}
function slvDelayedPlay() {
	CancelTimer(timStall);
	putDebug('slvDelayedPlay');
	var pMp=GetPlayer();
	if (pMp) AutoPlay(pMp);
}

function slvMediaOpened(sender,EventArgs) {
	putDebug('slvMediaOpened');
	if (sender) {
		if (!slv) slv=sender;
		var vid=sender.findName("videoElement")
		if (vid) {
			resize()	
			updateTimeCodesInt=setInterval("updateTimeCodes()", 100)
		}
	}
	MediaReady=true;
    return true;
}

function slvShowButtons(sender) {
	if (sender&&MediaVersion(sender)=='8') switch (GetRawPlayState(sender)) {
		case 'play':
		case 'Playing':
			showButtons(sender,true);
			break;
		default:
			showButtons(sender,false);
	}
}
