>
    <head>
      <script type="text/javascript" src="settings.js" />
      <script type="text/javascript" src="lang_eng.js" />
      <script type="text/javascript" src="channels.js" />
    </head>
<script language="Javascript">

//
// Javascript VDR client for Motorola VIP19x0 & VIP19x3
//
// Martin Voerman Rekordc@gmail.com
//
//
//

window.onkeydown = onKeyDown;

function onLoad() {

	is = toi.informationService;
	ss = toi.schedulerService;
	aos = toi.audioOutputService;
	vos = toi.videoOutputService;
	fps = toi.frontPanelService;
	ams = toi.assetManagerService;

	GetSettings();
	createPlayer();
	createEitCache();

	if(pipPlayer){
		addPipVideoplane();
		createPip();
	}
	if(PipSwitchGuide){
		createPip();
	}

	embedTeletextPlugin();
	aos.setVolume(AudioOut, StartVolume);
	aos.setMuteState(AudioOut, false);
	showDisplay(Right(currChan.toString(),4), false, 100, 0 );
	play(channels[currChan]);

	if (EPGMode) {
		eitCache.setFilterMode(eitCache.FILTER_MODE_PF_AND_SCHEDULE);
	} else {
		eitCache.setFilterMode(eitCache.FILTER_MODE_PF_ONLY);
	}
	eitCache.addEventListener(eitCache.ON_CACHE_UPDATED, onCacheUpdated);
	mediaPlayer.addEventListener(mediaPlayer.ON_DATA_AVAILABLE,onDataAvailableEvent);
	mediaPlayer.addEventListener(mediaPlayer.ON_STATE_CHANGED, MPD); 

	if (is.getObject("var.capabilities.dvr") == "FALSE") { 
		mediaRecorder = 0;
		// No harddisk, no recorder functions possible
	}

	if (is.getObject("config.architecture.target") !== "vip1903" && fullupdate !== 2) { 
		fullupdate = 0;
		// No 19x3 so better turn fullupdate EPG off
	}

	if (mediaRecorder) {
		createRecorder();
		mediaRecorder.addEventListener(mediaRecorder.ON_STATE_CHANGED, onRecorderStateChanged);
	}

	    is.addEventListener(is.ON_OBJECTS_CHANGED, onEvent);
	    is.subscribeObject(onEvent, "var.io.state", true);

	    ss.addEventListener(ss.ON_SCHEDULED_START, onScheduledStart);
	    ss.addEventListener(ss.ON_SCHEDULED_STOP, onScheduledStop);
	    ss.setCategorySubscription(onScheduledStart, "*");
	    ss.setCategorySubscription(onScheduledStop, "*");

	setOSDscale();
	SetupFonts();

	setOSDtimer();
	showOSD();
	videoplane.subtitles = Boolean(ShowSubs);
	colorkeys.innerHTML = "<font color=red> " +  NN[4] + " </font><font color=green > " + NN[1] + " </font><font color=yellow> " + NN[2] + " </font><font color=blue> " + NN[5] + " </font>";
	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[0] + "</center></h1>";
}

function SetupFonts() {
//setup fontsize
	colorkeys.style.fontSize = fsKeys;
	osdvolume.style.fontSize = fsCA;
	osdtime.style.fontSize = fsTime;
	osdname.style.fontSize = fsName;
	osdepg.style.fontSize = fsEpg;
	osdca.style.fontSize = fsCA;
	switchtimer.style.fontSize = fsEpg;
	osdepginfo.style.fontSize = fsEpginfo;
	osdepginfonext.style.fontSize = fsEpginfo;
	osdnr.style.fontSize = fsChan;
	osdlang.style.fontSize = fsAudio;
//setup fontcolors/ backgroundcolor
	document.body.style.backgroundColor = "#ccc";
	osdvolume.style.color = "green";
	osdtime.style.color = "white";
	osdname.style.color = "black";
	osdepg.style.color = "white";
	osdca.style.color = "black";
	switchtimer.style.color = "white";
	switchtimer.style.background = "red";
	osdnr.style.background = "red";
	var i = "#3366ff";
	osdmedia.style.background = i;
	osdmain.style.background = i;
	schedule.style.background = i;
	mainmenu.style.background = i;
	mediaList.style.background = i;
	osdepginfo.style.background = i;
	osdepginfonext.style.background = i;
	channelList.style.background = "#bbb";
	osdnr.style.color = "black";
	osdlang.style.color = "white";
	color_bg = "#fc5";
	color_main_head = "color:white";
	color_main_font = "color:black";
	color_epg_head = "color:white";
	color_epg_title = "color:white";
	color_epg_avinfo = "color:black";
	color_epg_info = "color:yellow";
	color_sched_head = "color:white";
	color_sched_font = "color:black";
	color_chan_epg = "color:black";
	color_osdtimer = "color:black";
	color_timerinfo = "color:white";
	color_media_osd = "color:white";
	color_progress1 = "<font color=red>";
	color_progress2 = "<font color=white>";
	color_notset = "color:grey";
}


function GetSettings() {
	//test for settings, create if not excists.
	try {
		if (!is.getObject("vip.serveraddress")) {} 
	} catch(e) {
		is.setObject("vip.serveraddress","0",is.STORAGE_PERMANENT)
	}

	try {
		if (!is.getObject("vip.languagepriority")) {} 
	} catch(e) {
		is.setObject("vip.languagepriority","0",is.STORAGE_PERMANENT)
	}

	try {
		if (!is.getObject("vip.OSDlanguage")) {} 
	} catch(e) {
		is.setObject("vip.OSDlanguage","0",is.STORAGE_PERMANENT)
	}

	try {
		if (!is.getObject("vip.testing")) {} 
	} catch(e) {
		is.setObject("vip.testing","0",is.STORAGE_PERMANENT)
	}


	try {
		if (!is.getObject("vip.resolution")) {} 
	} catch(e) {
		is.setObject("vip.resolution","2",is.STORAGE_PERMANENT)
	}

	try {
		if (!is.getObject("vip.testing2")) {} 
	} catch(e) {
		is.setObject("vip.testing2","0",is.STORAGE_PERMANENT)
		//show info if channel is on hardcoded list of non free
	}

	try {
		if (!is.getObject("vip.fav_max_channel")) {} 
	} catch(e) {
		is.setObject("vip.fav_max_channel","0",is.STORAGE_PERMANENT)
	}

	try {
		if (!is.getObject("vip.showsubs")) {} 
	} catch(e) {
		is.setObject("vip.showsubs","1",is.STORAGE_PERMANENT)
	}


	var sel_group;
	for (var i=0;i<10;i++) {
		sel_group = "vip.group." + i;
		try {
			if (!is.getObject(sel_group)) {} 
		} catch(e) {
			if (!minChan[i]) {
				is.setObject(sel_group,"0",is.STORAGE_PERMANENT)
			} else {
				is.setObject(sel_group,"1",is.STORAGE_PERMANENT)
			}
		}
	}

	for (var i=0;i<10;i++) {
		if (minChan[i]) {minchan[i] = minChan[i];}
		sel_group = "vip.group." + i;
		if (is.getObject(sel_group) == "0") { minChan[i] = "";}
	}

	audio = Number(is.getObject("vip.languagepriority"));
	server_ip = server_ip_array[Number(is.getObject("vip.serveraddress"))];
	for (var i=0;i<10;i++) { if (ServerAdres[i] !== "FullURL" && ServerAdres[i] !== "MultiCast") {ServerAdres[i] = server_ip + StreamPort;} }
	ServerAdres[Fav_group] = server_ip + StreamPort;

	lang_nr = Number(is.getObject("vip.OSDlanguage"));
	loadjs(langfile[lang_nr]);

	experimental = Number(is.getObject("vip.testing"));// Use some experimental code
	testing2 = Number(is.getObject("vip.testing2"));// Use some experimental code
	ShowSubs = Number(is.getObject("vip.showsubs"));

	Set_Res = Number(is.getObject("vip.resolution"));
	VideoOutput();
	Read_Fav();

	is.setObject("cfg.media.subtitling.languagepriority",subs_prio,is.STORAGE_PERMANENT);
	// set default subtitle language to 


	//if needed types can be set here. Default of the box is normal.
	//is.setObject("cfg.media.subtitling.typepriority","hearing_impaired",is.STORAGE_PERMANENT);
	//is.setObject("cfg.media.subtitling.typepriority","normal",is.STORAGE_PERMANENT);
	//is.setObject("cfg.media.audio.typepriority","normal",is.STORAGE_PERMANENT);
	//is.setObject("cfg.media.audio.typepriority","hearing_impaired",is.STORAGE_PERMANENT);
	//is.setObject("cfg.media.audio.typepriority","visually_impaired",is.STORAGE_PERMANENT);


	for (var x = 0;  x < 10; x++) { 
		searchtimers[x] = "" ; // To solve displaying undefined
		timers[x] = "" ;
		if (maxChan[x]) { //check changed to maxChan because minChan can be unset from menu
			for (var i = minChan[x];  i < (maxChan[x]+1); i++) { 
			EPG[0][4][i] = "";EPG[1][4][i] = "";EPG[0][5][i] = "";EPG[1][5][i] = "";
			EPG[0][7][i] = "";EPG[1][7][i] = "";AvInfo[i] = "";
			}
		}
	}
	for (var i = minChan[Fav_group];  i < (maxChan[Fav_group]+10); i++) { 
		EPG[0][4][i] = "";EPG[1][4][i] = "";EPG[0][5][i] = "";EPG[1][5][i] = "";EPG[0][7][i] = "";EPG[1][7][i] = "";AvInfo[i] = "";
	}
	//Check if there is a SmartTV or Restfulapi VDR server plugin
	CheckPlugins();
// override check for testing :
//	smartTVplugin = 0 ;
//	Restfulapiplugin = 1;
	if (smartTVplugin && Restfulapiplugin == 0) {
		// smartTVplugin YES
		// Restfulapiplugin NO
		get_timer = 1;
		if (get_recordings == 0 ) {get_recordings = 1;}
		get_marks = 1;
	} else if (smartTVplugin == 0 && Restfulapiplugin) {
		// smartTVplugin NO
		// Restfulapiplugin YES
		get_timer = 0;
		if (get_recordings == 1 ) {get_recordings = 0;}
		get_marks = 0;
	} else if (smartTVplugin == 0 && Restfulapiplugin == 0) {
		// smartTVplugin NO
		// Restfulapiplugin NO
		get_recordings = 2; //from streamdev
	}

}

function loadjs(filename){
	var oHead = document.getElementsByTagName('HEAD').item(0);
	var oScript= document.createElement("script");
	oScript.type = "text/javascript";
	oScript.src= filename;
	oHead.appendChild( oScript);
}

function onEvent(event) {
var numObjs = event.objectNames.length;
  for (var i=0; i<numObjs; i++) {
	if(event.objectNames[i] == "var.io.state" && is.getObject(event.objectNames[i]) == "standby" && KillStream == 1){
		try {
			if (isMediaMenu) { 
				if (mediaList.style.opacity == 0) {setResume();} // No mediamenu on screen so set resume.
			}
			mediaPlayer.close();
			SetLed(2,2,0);// At request no more blinking on standby.

		} catch(e) {
		alert(e);
		}
	} else if(event.objectNames[i] == "var.io.state" && is.getObject(event.objectNames[i]) == "normal" && KillStream == 1){
		play(channels[currChan]);
		if(isMediaMenu) {
			if (mediaList.style.opacity == 0) {
			if (get_recordings == 1) {
			setTimeout("GetMarks(); getResume(); playRec(recLink[currMed]+ '?mode=streamtoend&time=' + position);",100);
			} else if (get_recordings == 2) {
			setTimeout("playRec(recLink[currMed]+ '?pos=time.' + position);",100);
			}

			} else {
				showDisplay("STOP", false, 100, 0 );
				showMediaList();
			}
		}
	}
  }
}
	
function onUnload() {
	try {
		mediaPlayer.close();
		mediaPlayer.releaseInstance();
	if(TimeShift){
		mediaPlayer.stopTimeshiftBuffering();
		mediaPlayer.discardTimeshiftBuffer();
		}
	if(mediaRecorder){
		mediaRecorder.close();
		mediaRecorder.releaseInstance();
	}
	if(pipPlayer){
		pipPlayer.close();
		pipPlayer.releaseInstance();
	}

	is.removeEventListener(is.ON_OBJECTS_CHANGED, onEvent);
	eitCache.removeEventListener(eitCache.ON_CACHE_UPDATED, onCacheUpdated);
	mediaPlayer.removeEventListener(mediaPlayer.ON_DATA_AVAILABLE,onDataAvailableEvent);
	mediaPlayer.removeEventListener(mediaPlayer.ON_STATE_CHANGED, MPD); 
	mediaRecorder.removeEventListener(mediaRecorder.ON_STATE_CHANGED, onRecorderStateChanged);

	} catch(e) {
		alert(e);
	}
}

function incChan(step) {
    currChan += step;
    if (currChan > maxChan[ChanGroup]) {
        currChan = minChan[ChanGroup];
    }
    osdnr.style.opacity = isFullscreen; 
    OSDchannr(currChan);
}

function decChan(step) {
    currChan -= step;
    if (currChan < minChan[ChanGroup] ) {
        currChan = maxChan[ChanGroup] ;
    }
    osdnr.style.opacity = isFullscreen; 
    OSDchannr(currChan);
}

function VolumeUp() {
	if (Volume < 5) {
		var VolStep = 1;
	} else {
		var VolStep = VolumeStep;
	}

	Volume += VolStep;
        if (Volume > 100) {
            Volume = 100;
        }
        aos.setVolume(AudioOut, Volume);
	showVolume();
}

function VolumeDown() {
	if (Volume > 5) {
		var VolStep = VolumeStep;
	} else {
		var VolStep = 1;
	}

	Volume -= VolStep;
        if (Volume < 0) {
            Volume = 0;
        }
        aos.setVolume(AudioOut, Volume);
	showVolume();
}


function VolumeMute() {
	state = aos.getMuteState(AudioOut);
	aos.setMuteState(AudioOut, !state);
	mute = 1 - state;
        osdmute.style.opacity = mute; 
}

function createEitCache() {
  try {
	eitCache = toi.dvbEitService.createInstance();
  } catch(e) {
    alert("Failed getting eitCache: " + e);
  }
}

function createPlayer() {
  try {
    mediaPlayer = toi.mediaService.createPlayerInstance();
  } catch(e) {
    alert("Failed creating player: " + e);
  }
}


function createRecorder() {
	try {
		mediaRecorder = toi.mediaService.createRecorderInstance();
	} catch(e) {
		alert("Cannot create media recorder: " + e);
		mediaRecorder = "";
	}
}

function createPip() {
  try {
    pipPlayer = toi.mediaService.createPipPlayerInstance();
  } catch(e) {
    alert("Failed creating PIP player: " + e);
  }
}


function addPipVideoplane() {
  var pipVideoDiv = document.getElementById("pipVideoDiv");
  pipVideoDiv.innerHTML = "<videoplane id='pipvideoplane' index=1 style='position:fixed;left:70%;top:60%;height:20%;width:20%;z-index:50;'></videoplane>";
  document.body.appendChild(pipVideoDiv);
}

function pipplay(uri) {
try {
	if (pipPlayer.getState() != pipPlayer.STATE_IDLE) {
		pipPlayer.close();
	 }
	if (PIPDelayID != -1) { clearTimeout(PIPDelayID); PIPDelayID = -1; }

	if (ServerAdres[ChanGroup] == "MultiCast" ) {
 	SI=channels[currChan].split("-");
	uri = SI[4];
	} else if (ServerAdres[ChanGroup] == "FullURL" ) {
	// uri = ready!
	} else {
	uri = ServerAdres[ChanGroup] + uri;
	}
	pipPlayer.open(uri);
	PIPDelayID = setTimeout("pipPlayer.play(1000);", 500);
  } catch (e) {
    alert("Failed opening PIP stream: " + e);
    return;
  }
}


function play(uri) {
  try {
    if (initialDelayID != -1) { clearTimeout(initialDelayID); initialDelayID = -1; }
    if (PlayDelayID != -1) { clearTimeout(PlayDelayID); PlayDelayID = -1; }
    if (initialDelayPlayID != -1) { clearTimeout(initialDelayPlayID); initialDelayPlayID = -1; }

    if (mediaPlayer.getState() != mediaPlayer.STATE_IDLE) { mediaPlayer.close(); }
    if (isSchedule) { schedule.style.opacity = 0; isSchedule = 0;}
    if (epgactive) { osdepginfo.style.opacity = 0; osdepginfonext.style.opacity = 0; epgactive = 0;}

    if (ServerAdres[ChanGroup] == "MultiCast" ) { SI=channels[currChan].split("-"); uri = SI[4];
    } else if (ServerAdres[ChanGroup] == "FullURL" ) {	// uri = ready!
    } else { uri = ServerAdres[ChanGroup] + uri; }

    URL = uri;
    initialDelayPlayID = setTimeout("mediaPlayer.open(URL);mediaPlayer.play(1000);GetEPG(currChan);ExtraStuff();",initialDelayPlay);
    initialDelayPlay = 500; // wait 500 ms before zap to next channel
    PlayDelayID = setTimeout("initialDelayPlay = 0;",5000);
    SetLed(1,1,0);

    if(isFullscreen) { showOSD(); }

    showDisplay(Right(currChan.toString(),4), false, 100, 0 );
        
  } catch (e) {
    alert("Failed opening stream: " + e);
    alert("error: " + mediaPlayer.getTimeshiftError().source);
    alert("error: " + mediaPlayer.getTimeshiftError().details);
    return;
  }
}

function preview(urip) {
	if(SwitchGuide) {
		play(urip);
	} else if (PipSwitchGuide && fullupdate) {
		pipplay(urip);
	}

	if (isSchedule) { schedule.style.opacity = 0; isSchedule = 0;}
	if (epgactive) { osdepginfo.style.opacity = 0; osdepginfonext.style.opacity = 0; epgactive = 0;}
	showChannelList();
}


function onDataAvailableEvent(event) {
	dataAvailable = event.status;
	//alert("onDataAvailableEvent : " + event.status);
	if(event.status==true) {
		updateStreamInfo(currChan);
	} 
}


function updateStreamInfo(currStream) {

var streamInfo = mediaPlayer.getStreamInfo();
var cList = streamInfo.availableComponents;
var x;
var xs = 0;
var subs = "";
xx = 0;
AvInfo[currStream] = "";
lang_prio_dyn.length = 0;
subs_prio_dyn.length = 0;
Radioicon = "\uE00E";

for(x=0; x<cList.length;x++) {
	if(cList[x].type == 0) {
	lang_prio_dyn[xx] = mediaPlayer.getAudioStreamInfo(cList[x]).language;
	AvInfo[currStream] = AvInfo[currStream] + " Audio " + xx + " " + mediaPlayer.getAudioStreamInfo(cList[x]).encoding + " - " + mediaPlayer.getAudioStreamInfo(cList[x]).language + " , ";

	//
//	alert (mediaPlayer.getAudioStreamInfo(cList[x]).sampleRate);
//	alert (mediaPlayer.getAudioStreamInfo(cList[x]).channelFormat);
	// AUDIO_CHANNEL_FORMAT_UNKNOWN = 0
	// AUDIO_CHANNEL_FORMAT_SINGLE_MONO = 1
	// AUDIO_CHANNEL_FORMAT_DUAL_MONO = 2
	// AUDIO_CHANNEL_FORMAT_STEREO = 3
	// AUDIO_CHANNEL_FORMAT_3_FRONT_1_BACK = 4
	// AUDIO_CHANNEL_FORMAT_3_FRONT_2_BACK = 5
	// AUDIO_CHANNEL_FORMAT_3_FRONT_2_BACK_LFE = 6
	// AUDIO_CHANNEL_FORMAT_3_FRONT_2_SIDE_2_BACK_LFE = 7
//	alert (mediaPlayer.getAudioStreamInfo(cList[x]).channelMode);
	// AUDIO_CHANNEL_MODE_NORMAL = 0
	// AUDIO_CHANNEL_MODE_DUAL_MONO_LEFT_ONLY = 1
	// AUDIO_CHANNEL_MODE_DUAL_MONO_RIGHT_ONLY = 2
	// AUDIO_CHANNEL_MODE_DUAL_MONO_STEREO = 3
	// AUDIO_CHANNEL_MODE_DUAL_MONO_MIXED = 4

	if (lang_prio_dyn[xx] !== "NAR") { 
		xx += 1; 
	} else { 
		lang_prio_dyn.length = xx;
	}


	}
	if(cList[x].type == 1) {
	Radioicon = "\uE00F";
	AvInfo[currStream] = AvInfo[currStream] + " Video " + mediaPlayer.getVideoStreamInfo(cList[x]).encoding + " size : " + mediaPlayer.getVideoStreamInfo(cList[x]).resolutionX + " x " + mediaPlayer.getVideoStreamInfo(cList[x]).resolutionY;
	if (mediaPlayer.getVideoStreamInfo(cList[x]).aspectRatio == "0") { AvInfo[currStream] = AvInfo[currStream] + " (?:?)"; }
	if (mediaPlayer.getVideoStreamInfo(cList[x]).aspectRatio == "1") { AvInfo[currStream] = AvInfo[currStream] + " (4:3)"; }
	if (mediaPlayer.getVideoStreamInfo(cList[x]).aspectRatio == "2") { AvInfo[currStream] = AvInfo[currStream] + " (16:9)"; }
	}

	if(cList[x].type == 2) {
		if (xs == 0) { subs = " SUBS : " } else { subs += " , ";}
		subs_prio_dyn[xs] = mediaPlayer.getSubtitleStreamInfo(cList[x]).language;
		subs = subs + subs_prio_dyn[xs];
		xs += 1;
	}

	if(cList[x].type == 3) {
	alert("COMPONENT_SUBTITLE_CAPTION");
	//This is an ARIB specific type of subtitles
	}
	if(cList[x].type == 4) {
	alert("COMPONENT_SUBTITLE_SUPERIMPOSE");
	//This is an ARIB specific type of subtitles and used mainly for displaying alert messages on screen.
	}
	if(cList[x].type == 5) {
//		alert("TeletextStreamInfo : " + mediaPlayer.getTeletextStreamInfo(cList[x]).language)
		AvInfo[currStream] += " TXT";
	}


	}
	AvInfo[currStream] += subs;
}


function VideoOutput() {

videoConfig = vos.getVideoConfiguration();

 var session = null;
  try {
    var currentOutput = 0; //0 = normaly HDMI
    displayInfo=videoConfig.getDisplayInfo(videoConfig.getVideoOutputs()[currentOutput]);
    var desiredMode = VideoOutputModes[Set_Res];

    // create the session
    session = vos.createVideoConfigurationSession();
    session.setDefaultVideoMode(videoConfig.getVideoOutputs()[currentOutput], desiredMode);
    session.apply();
    session.releaseInstance();

  }
  catch (e) {
    if (session != null) {
      session.releaseInstance();
    }
    alert(e);
  }

setOSDscale();
SetupFonts();

}

function setOSDscale() {
	fsAudio = (16*Yfactor[Set_Res]) + "px";
	fsTime = (16*Yfactor[Set_Res]) + "px";
	fsName = (27*Yfactor[Set_Res]) + "px";
	fsMenu = (27*Yfactor[Set_Res]) + "px";
	fsChan = (43*Yfactor[Set_Res]) + "px"; 
	fsCA = (32*Yfactor[Set_Res]) + "px";
	fsMenuMain = (35*Yfactor[Set_Res]) + "px";
	fsEpg = (19*Yfactor[Set_Res]) + "px";
	fsEpginfo = (21*Yfactor[Set_Res]) + "px";
	fsList = (18*Yfactor[Set_Res]) + "px";
	fsSchedList = (18*Yfactor[Set_Res]) + "px";
	fsSched = (26*Yfactor[Set_Res]) + "px";
	fsRec = (35*Yfactor[Set_Res]) + "px";
	fsReclist = (19*Yfactor[Set_Res]) + "px";
	fsMedia = (27*Yfactor[Set_Res]) + "px";
	fsKeys = (19*Yfactor[Set_Res]) + "px";
}

function addzero(zero)
{
if (zero<10)
  {
  zero="0" + zero;
  }

return zero;
}

function ExtraStuff(){
	if(TimeShift){
	    initialDelayID = setTimeout("startTimeshiftBuffering();", 5000);
	}
	if(testing2) {
			if (CAdelayID != -1) { clearTimeout(CAdelayID); CAdelayID = -1; switchtimer.style.opacity = 0;}
		if ( 	(currChan > 10 && currChan < 26 )  || (currChan > 40 && currChan < 50 )   || (currChan > 50 && currChan < 120 ) ||
			(currChan > 151 && currChan < 200) || (currChan > 604 && currChan < 612 ) || (currChan > 624 && currChan < 631) ||
			(currChan > 632 && currChan < 700) || (currChan > 8004 && currChan < 8027) )
		{
			//Show info if set nonfree
			switchtimer.innerHTML = "<pre><center>\n" + Lang[90] +"\n\n </center></pre>"; // Non free channel message
			switchtimer.style.opacity = 1;
			CAdelayID = setTimeout("switchtimer.style.opacity = 0; ",ShowSetTimer);
		}
	}

}

function startTimeshiftBuffering() {
    // check that media player is working
    if (mediaPlayer.getState() != mediaPlayer.STATE_PLAYING ) {
      alert("Media Player must be playing when starting timeshift buffering!");
      return;
    }

    mediaPlayer.startTimeshiftBuffering(600);
}


function FullScreen() {
	videoplane.style.width = "100%";
	videoplane.style.height = "100%";
	videoplane.style.left = "0px";
	videoplane.style.top = "0px";
	if(PipSwitchGuide){
		if (pipPlayer.getState() != pipPlayer.STATE_IDLE) {
			pipPlayer.close();
		 }
	}
}


function onKeyDown(event) {
    if(isVisible) {
 	onKeyTeletext(event.keyIdentifier);
    } else if(isSetupMenu) {
	onKeyMenu(event.keyIdentifier);
    } else if(isMediaMenu) {
	onKeyMedia(event.keyIdentifier);
    } else {

    switch(event.keyIdentifier) {

    case "ChannelUp":
    case "Up":
	if(isFullscreen) {
		count = 0; Change = 0;
		prevChan = currChan;
		do
		{
		        incChan(1);
		}
		while (!channels[currChan]);
	        play(channels[currChan]);
	} else {
	// swap up <> down in guide mode
		count = 0; Change = 0;
		do
		{
		        decChan(1);
		}
		while (!channels[currChan]);
	        preview(channels[currChan]);
	}
        break;
    case "ChannelDown":
    case "Down":
	if(isFullscreen) {
		count = 0; Change = 0;
		prevChan = currChan;
		do
		{
		        decChan(1);
		}
		while (!channels[currChan]);
	        play(channels[currChan]);
	} else {
	// swap up <> down in guide mode
		count = 0; Change = 0;
		do
		{
		        incChan(1);
		}
		while (!channels[currChan]);
	        preview(channels[currChan]);
	}
	break;
    case "Left":
	count = 0; Change = 0;
	if(isFullscreen) {
	defChan[ChanGroup] = currChan;
	do
		{
		do
			ChanGroup -= 1;
		while (protChn[ChanGroup] == 1 && ShowProtectedChannels == 1) 
		if (ChanGroup < 0) {
			ChanGroup = 9;
			}
		}
	while (!minChan[ChanGroup]);
	currChan = defChan[ChanGroup];
	play(channels[currChan]);
	} else {
	prevChan = currChan;
	if (currChan > (minChan[ChanGroup] + 8)) {
	decChan(9);
	} else {
		currChan = baseChn[ChanGroup] + (maxChan[ChanGroup] - currChan);
	}
	do
	{
	        decChan(1);
	}
	while (!channels[currChan]);
        preview(channels[currChan]);
	}
	break;
    case "Right":
	count = 0; Change = 0;
	if(isFullscreen) {
	defChan[ChanGroup] = currChan;
	do
		{
		do
			ChanGroup += 1;
		while (protChn[ChanGroup] == 1 && ShowProtectedChannels == 1)
		if (ChanGroup > 9) {
			ChanGroup = 0;
			}
		}
	while (!minChan[ChanGroup]);
	currChan = defChan[ChanGroup];
	play(channels[currChan]);

	} else {
	prevChan = currChan;
	if (currChan < (maxChan[ChanGroup] - 9 )) {
	incChan(9);
	} else {
		currChan = baseChn[ChanGroup] + (maxChan[ChanGroup] - currChan);
	}
	do
	{
	        incChan(1);
	}
	while (!channels[currChan]);
        preview(channels[currChan]);
	}
	break;
  case "Red":
	if(isFullscreen) {
		if(showClock == 0 )	{
		 	showDisplay("", true, 80, 1 );
			showClock = 1;
		} else if(showClock == 1 ) {
			showClock = 0;
			showDisplay(Right(currChan.toString(),4), false, 100, 0 );
		}
	} else if(isSchedule == 0){
		if(NowNext) {	
			settimer(EPG[NowNext][2][currChan],EPG[NowNext][1][currChan],0,1);
		}
	}
        break;
   case "Green":
	if(isFullscreen) {
		if(!epgactive) {
			if (audio_dyn < (lang_prio_dyn.length -1)) { audio_dyn += 1} else { audio_dyn = 0 }
			if (lang_prio_dyn.length > 1) {
				is.setObject("cfg.media.audio.languagepriority",lang_prio_dyn[audio_dyn] + "," + lang_prio[audio],is.STORAGE_PERMANENT);
				osdlang.style.opacity = 1;
				osdlang.innerHTML = "<img src='unmute.png'> " + lang_prio_dyn[audio_dyn] + " ";
				setTimeout("osdlang.style.opacity = 0; ", 3000);
			}
		}
	} else if(isSchedule == 0 && !epgactive){
		colorkeys.innerHTML = "<font color=red> " +  NN[3 + NowNext] + " </font><font color=green> " + NN[NowNext] + " </font><font color=yellow> " + NN[2] + " </font><font color=blue> " + NN[5] + " </font>";
		NowNext = 1 - NowNext;
		showChannelList();
	}

	if(epgactive) {
		NowNext = 1 - NowNext;
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity ;
		osdepginfonext.style.opacity = 1 - osdepginfo.style.opacity;
	}


	break;
   case "Yellow":
	if(isFullscreen) {
		if(epgactive) {
			osdepginfo.style.opacity = 0;
			osdepginfonext.style.opacity = 0;
			epgactive = 0;
		}
		mediaList.style.opacity = 0.9;
		set_yellow_key = 1;
		setTimeout("getSchedule(currChan);LoadMediaSettings();",100);
	} else {
		GetSchedule(currChan,15);
		schedule.style.opacity = 1 - schedule.style.opacity;
		isSchedule = schedule.style.opacity;
		if(isSchedule == 1){
			colorkeys.innerHTML = "<font color=red> " +  NN[4] + " </font><font color=green> " + NN[4] + " </font><font color=yellow> " + NN[6] + " </font><font color=blue> " + NN[4] + " </font>";
			} else {
			colorkeys.innerHTML = "<font color=red> " +  NN[3 + (1 - NowNext)] + " </font><font color=green> " + NN[1 - NowNext] + " </font><font color=yellow> " + NN[2] + " </font><font color=blue> " + NN[5] + " </font>";
			}
	}
	break;

   case "Info":
   case "Blue":
//	if(isFullscreen) {
//	RestartPortal();
//	} else 
	if(isSchedule == 0) {
			if(!epgactive) {
			updateOSDtime(currChan);
			SetOsdInfo();
				if(isFullscreen) { NowNext = 0;}
				if (NowNext) {
					osdepginfo.style.opacity = 0;
					osdepginfonext.style.opacity = 1;
				} else {
					osdepginfo.style.opacity = 1;
					osdepginfonext.style.opacity = 0;
				}			
			epgactive = 1;		
			} else {
			osdepginfo.style.opacity = 0;
			osdepginfonext.style.opacity = 0;
			epgactive = 0;
			}
//		setTimeout("epgactive = 0; osdepginfo.style.opacity = 0; osdepginfonext.style.opacity = 0;", 5000);
	}
	break;
   case "BrowserBack":
	if(count) {
		count = 0;
		osdnr.style.opacity = 0;
		if(isFullscreen) {
			showDisplay(Right(currChan.toString(),4), false, 100, 0 );
		}
		Change = 0;
	} else {
		if(isSchedule) {
			isSchedule = 0;
			schedule.style.opacity = 0;
			break;
		}

		if(isFullscreen) {
		//SHOW epg info
			if(!epgactive) {
//			SetOsdInfo();
//			osdepginfo.style.opacity = 1;
//			osdepginfonext.style.opacity = 0;
//			epgactive = 1;		
			} else {
			osdepginfo.style.opacity = 0;
			osdepginfonext.style.opacity = 0;
			epgactive = 0;
			}
//		setTimeout("epgactive = 0; osdepginfo.style.opacity = 0; osdepginfonext.style.opacity = 0;", 5000);
		} else if(!isFullscreen){
			osdepginfo.style.opacity = 0;
			osdepginfonext.style.opacity = 0;
			epgactive = 0;
			isFullscreen = 1;
			FullScreen();
			currChan = preChan;
			ChanGroup = preGrp;
		}
	}
	break;

   case "Enter":
	// OK key on frontpanel
   case "Accept":
	if(isFullscreen) {
	// fullscreen
		if (osdmain.style.opacity !== 0) {opacity = 0; OSD(opacity);}
		if(count == 0) {
			if (osdtimeout) {
				clearTimeout(osdtimeout);
				osdtimeout = 0;
				opacity = 0;
				OSD(opacity);
				break;
				}
		osdepg.innerHTML = "";
		showOSD();
	        GetEPG(currChan);
		updateOSDtime(currChan);
		osdepg.innerHTML = "<p>" + EPG[0][7][currChan] + "</p>\n<p>" + EPG[1][7][currChan] + "</p>";
//		showOSD();
		} else {
			CheckChannel(Change);
			count = 0;
			if(ChangeOK) { 	
				play(channels[currChan]);
				ChangeOK = 0;
				}
		  }
	} else {
	// if not fullscreen
		if(count){
			CheckChannel(Change);
			count = 0;
			if(ChangeOK) { 	
				preview(channels[currChan]);
				ChangeOK = 0;
				}
		  } else {
		isFullscreen = 1;
		FullScreen();
		if(isSchedule) { isSchedule = 0; schedule.style.opacity = 0; }
	        play(channels[currChan]);
		}
	}
        break;

   case "Menu":
		if(isFullscreen) {
			if(count) {
				count = 0;
				osdnr.style.opacity = 0;
				showDisplay(Right(currChan.toString(),4), false, 100, 0 );
				Change = 0;
			}
		osdepginfo.style.opacity = 0;
		osdepginfonext.style.opacity = 0;
		isSetupMenu = 1;
		mainmenu.style.opacity = 0.8;
		menu = 0;
		InitMenu(menu);
		}
		break;
   case KEY_FAV:
   case "Scroll":
		if(isFullscreen) {
			NowNext = 0;
			videoplane.style.width = (320*Xfactor[Set_Res])+"px";
			videoplane.style.height = (240*Yfactor[Set_Res])+"px";
			videoplane.style.left = (380*Xfactor[Set_Res])+"px";
			videoplane.style.top = (300*Yfactor[Set_Res])+"px";
			isFullscreen = 0;
			ClearScreen();
			channelList.style.opacity = 1;
			colorkeys.innerHTML = "<font color=red> " +  NN[3 + (1 - NowNext)] + " </font><font color=green> " + NN[1 - NowNext] + " </font><font color=yellow> " + NN[2] + " </font><font color=blue> " + NN[5] + " </font>";
			colorkeys.style.opacity = 1;
			showChannelList();
			if(!SwitchGuide) {
			preChan = currChan;
			preGrp = ChanGroup;
			}
		} else {
			isSchedule = 0;
			schedule.style.opacity = 0;
			isFullscreen = 1;
			FullScreen();
			if(!SwitchGuide) {
			currChan = preChan;
			ChanGroup = preGrp;
			}
		}
		break;
    case "TV":
    case "RADIO":
	if(isFullscreen) {
		if(ChanGroup !== 9) {
		//Radio
		defChan[ChanGroup] = currChan;
		ChanGroup = 9;
		currChan = defChan[9];
		} else {
		//TV
		defChan[ChanGroup] = currChan;
		ChanGroup = 0;
		currChan = defChan[0];
		}
		isSetupMenu = 0;
		mainmenu.style.opacity = 0;
		play(channels[currChan]);
	}
	break;
    case KEY_0:
	digit = 0;
	Makedigit();
        break;
    case KEY_1:
	digit = 1;
	Makedigit();
        break;
    case KEY_2:
	digit = 2;
	Makedigit();
        break;
    case KEY_3:
	digit = 3;
	Makedigit();
        break;
    case KEY_4:
	digit = 4;
	Makedigit();
        break;
    case KEY_5:
	digit = 5;
	Makedigit();
        break;
    case KEY_6:
	digit = 6;
	Makedigit();
        break;
    case KEY_7:
	digit = 7;
	Makedigit();
        break;
    case KEY_8:
	digit = 8;
	Makedigit();
        break;
    case KEY_9:
	digit = 9;
	Makedigit();
        break;

   case KEY_A:// |> key on old long kpn 1710/1760 remote
        break;
   case KEY_B:// hh key on old long kpn 1710/1760 remote
	if (prevChan !== currChan) {
		currChan = [prevChan, prevChan = currChan][0];
		count = 0;
		play(channels[currChan]);
		}
	break;
   case KEY_C:// @ key on old long kpn 1710/1760 remote
	if(isFullscreen && Fav_max_channel !== 0 && ChanGroup !== Fav_group) {
	timerID = (defChan[Fav_group] - Fav_base - 1); if (timerID < 0) { timerID = 0;}
	maxTimers = Fav_max_channel;
	GotoFav(defChan[Fav_group]);
	} else if(isFullscreen && ChanGroup == Fav_group) {
	timerID = (currChan - Fav_base - 1);
	}
	if(isFullscreen && Fav_max_channel !== 0) {
		if(count) {
			count = 0;
			osdnr.style.opacity = 0;
			showDisplay(Right(currChan.toString(),4), false, 100, 0 );
			Change = 0;
		}
		osdepginfo.style.opacity = 0;
		osdepginfonext.style.opacity = 0;
		isSetupMenu = 1;
		mainmenu.style.opacity = 0.8;
		menu = 10;
		InitMenu(menu);
	}


        break;
   case KEY_D:// >@ key on old long kpn 1710/1760 remote
	if (protChn[ChanGroup] !== 1 && ChanGroup !== Fav_group) {
		AddtoFav();
	}
	break;

   case "Teletext":
	if(isFullscreen) {
		ClearScreen();
		isVisible = 1;
		setVisible(isVisible);
		}
	break;
    case "VolumeMute":
	VolumeMute();
	break;
    case "VolumeUp":
	VolumeUp();
	break;
    case "VolumeDown":
	VolumeDown();
	break;

    case "MediaRewind":
	if(isFullscreen) {
	      mediaPlayer.play(mediaPlayer.PACE_REWIND);
	} else {
		count = 0; Change = 0;
		defChan[ChanGroup] = currChan;
		do {
			do
				ChanGroup -= 1;
			while (protChn[ChanGroup] == 1 && ShowProtectedChannels == 1) 
			if (ChanGroup < 0) {
				ChanGroup = 9;
			}
		}
		while (!minChan[ChanGroup]);
		currChan = defChan[ChanGroup];
		preview(channels[currChan]);
	}
	break;
    case "MediaForward":
	if(isFullscreen) {
	      mediaPlayer.play(mediaPlayer.PACE_FASTFORWARD);
	} else {
	count = 0; Change = 0;
	defChan[ChanGroup] = currChan;
	do{
		do
			ChanGroup += 1;
		while (protChn[ChanGroup] == 1 && ShowProtectedChannels == 1)
		if (ChanGroup > 9) {
			ChanGroup = 0;
			}
		}
	while (!minChan[ChanGroup]);
	currChan = defChan[ChanGroup];
        preview(channels[currChan]);
	}
	break;
	case "MediaPlayPause":

		if(isFullscreen && PauseOnServer) {
		   	if(mediaPlayer.getState() == mediaPlayer.STATE_PLAYING) {
				isPause = 1;
				ServerPause();
				SetLed(1,1,10);
//				setTimeout("mediaPlayer.play(0);",5000);
				mediaPlayer.play(0);
				break;
			}
			if(mediaPlayer.getState() == mediaPlayer.STATE_PAUSED || mediaPlayer.getState() == mediaPlayer.STATE_FASTFORWARDING ||
			   mediaPlayer.getState() == mediaPlayer.STATE_REWINDING) {
				SetLed(1,1,0);
				mediaPlayer.play(mediaPlayer.PACE_PLAY);
				break;
			}

		}

		if(TimeShift){
			if(mediaPlayer.getState() == mediaPlayer.STATE_PAUSED || mediaPlayer.getState() == mediaPlayer.STATE_FASTFORWARDING || mediaPlayer.getState() == mediaPlayer.STATE_REWINDING) {
				SetLed(1,1,0);
				mediaPlayer.play(mediaPlayer.PACE_PLAY);
				break;
			}
		   	if(mediaPlayer.getState() == mediaPlayer.STATE_PLAYING) {
				SetLed(1,1,10);
				mediaPlayer.play(0);
				break;
			}
		}
		break;
	case "MediaStop":
	    if (isRecording == 1) { 
		recordStop();
		isRecording = 0;
	    } else {
		try {
		SetLed(1,1,0);
		if(TimeShift){ mediaPlayer.playFromPosition(mediaPlayer.POSITION_LIVE,mediaPlayer.PACE_PLAY); }
		} catch(e) {
			alert(e);
		}
		}
	break;
	case KEY_REC:
	case "MediaRecord":
	if(isSchedule == 0) {
			if(epgactive) {
				ServerTimer(channels[currChan],EPG[NowNext][6][currChan]);
				settimer(EPG[NowNext][2][currChan],EPG[NowNext][1][currChan],(EPG[NowNext][3][currChan]*60),2);
			} else {
				ServerRecordStart();
			}
	}
//	if(isFullscreen && !epgactive) {
//		ServerRecordStart();
//	} else if(isSchedule == 0){
//		if(NowNext) {
//		} else {
//			// make timer for recording
//			ServerTimer(channels[currChan],EPG[NowNext][6][currChan]);
//			settimer(EPG[NowNext][2][currChan],EPG[NowNext][1][currChan],(EPG[NowNext][3][currChan]*60),2);
//		} else {
//			ServerRecordStart();
//		}
//	}


	break;
	case KEY_OPNAMES:
	case KEY_FILM:
	if (smartTVplugin) {
	// jump to recordings menu.
		if(isFullscreen) {
			if(count) {
				count = 0;
				osdnr.style.opacity = 0;
				showDisplay(Right(currChan.toString(),4), false, 100, 0 );
				Change = 0;
			}
		osdepginfo.style.opacity = 0;
		osdepginfonext.style.opacity = 0;
		mediaList.style.opacity = 0.9;
		mainmenu.style.opacity = 0;
		recPath = "/recordings.xml";
		setTimeout("getRecList();LoadMediaSettings();",100);
		}
		break;
	}
	default:
        break;
    }
  }
}


function GotoFav(ChanID) {
		count = 0; Change = 0;
		prevChan = ""; Fav_key1 = "";
		defChan[ChanGroup] = currChan;
		ChanGroup = Fav_group;
		currChan = ChanID;
		play(channels[currChan]);
}


function AddtoFav() {
	Fav_max_channel  += 1;
	maxChan[Fav_group] = Fav_base + Fav_max_channel;
	channelsnames[(Fav_base + Fav_max_channel)] = channelsnames[currChan];
	channels[(Fav_base + Fav_max_channel)] = channels[currChan];
		is.setObject(("vip.channelsnames." + Fav_max_channel),channelsnames[currChan],is.STORAGE_PERMANENT)
		is.setObject(("vip.channels." + Fav_max_channel),channels[currChan],is.STORAGE_PERMANENT)
		is.setObject("vip.fav_max_channel",Fav_max_channel.toString(),is.STORAGE_PERMANENT)
	settimer(0,channels[currChan],Fav_max_channel ,2);
}


function Read_Fav() {
	Fav_max_channel = Number(is.getObject("vip.fav_max_channel"));
	maxChan[Fav_group] = Fav_base + Fav_max_channel;
		for (var i=1; i<=Fav_max_channel; i++) {
		channelsnames[(i+Fav_base)] = is.getObject(("vip.channelsnames." + i));
		channels[(i+Fav_base)] = is.getObject(("vip.channels." + i));
		}
}


function Makedigit() {
	prevChan = currChan;
	Change = (Change*10) + digit;
	count += 1;
	osdnr.style.opacity = isFullscreen; 
        OSDchannr(Change);
	if(isFullscreen) {
		showDisplay((Change.toString()), false, 100, 0 ); 
	}

    if (count>channeldigits) {
	CheckChannel(Change);
	count = 0;
	}
    if(ChangeOK) { 
	if(isFullscreen) {
	        play(channels[currChan]);
	} else {
	        preview(channels[currChan]);
	}
	ChangeOK = 0;
	}
}

function CheckChannel(CheckThis) {
// function to check if channel exists
	CheckThis = baseChn[ChanGroup] + CheckThis;
	if(channels[CheckThis]) {
		ChangeOK = 1;
		currChan = CheckThis;
	} else {
		ChangeOK = 0;
	}
	if(prevChan == currChan) { 
	ChangeOK = 0 ;
	}
	osdnr.style.opacity = 0;
	if(isFullscreen) {
	showDisplay(Right(currChan.toString(),4), false, 100, 0 );
	}
	Change = 0;

}


function showDisplay(showtxt,colonState,intensity,currentMode) {
	if(!showClock){
	fps.setSegmentDisplayState(toi.statics.ToiFrontPanelServiceSegmentDisplayState.create(showtxt,colonState,intensity,currentMode));
	}
}

function SetLed(NumLed,color,blinkfreq){
	var state = toi.statics.ToiFrontPanelServiceLedState.create(color, blinkfreq);
	fps.setLedState(NumLed, state);
}


function showOSD() {
	if (osdtimeout) {
		clearTimeout(osdtimeout);
	}
	SetOsdInfo();
	opacity = 1;
	OSD(opacity);
	osdtimeout = setTimeout("fadeOut(); osdtimeout = 0;", ShowOsdTime);
}

function showVolume() {
	if (osdVolumetimeout) {
		clearTimeout(osdVolumetimeout);
	}
	osdvolume.innerHTML = Lang[1] + " : " + Volume + "% \uE007" + (new Array(Volume)).join("\uE008") + (new Array(100 - Volume)).join("\uE009") + "\uE00A";
	osdvolume.style.opacity = 1;
	osdVolumetimeout = setTimeout("osdvolume.style.opacity = 0;", ShowOsdTime);
}


function OSD(opacity) {
    osdmain.style.opacity = opacity;
    osdnr.style.opacity = opacity;
    osdtime.style.opacity = opacity;
    osdname.style.opacity = opacity;
    osdepg.style.opacity = opacity;
    osdca.style.opacity = opacity;
    osdtimer.style.opacity = opacity;
}


function SetOsdInfo() {
    OSDchannr(currChan);
    date_time();
    OSDhtml();
    return;
}

function onCacheUpdated() {
        GetEPG(currChan);
	if (osdtimeout) { SetOsdInfo();	} 
}

function OSDchannr(channr) {
	osdnr.innerHTML = "<center>" + Right(channr,3) + "</center>";

//	Show logo's
//	if (experimental) {
//		osdnr.innerHTML = "<img src='" + channels[currChan] + ".logo.jpg' style='width:80%; max-height:100%; position:absolute; left:10%;' >"; 
//	}

}

function OSDhtml(){
    osdtime.innerHTML = result;
	if (ShowSource == 1) {
	    osdname.innerHTML = channels[currChan].split("-")[0] + "\uE003" + Left(channelsnames[currChan],30);
	} else {
	    osdname.innerHTML = Left(channelsnames[currChan],30);
	}
    osdepg.innerHTML = "<p>" + EPG[0][7][currChan] + "</p>\n<p>" + EPG[1][7][currChan] + "</p>";
    osdepginfo.innerHTML =  "<center><p style='" + color_epg_head + ";' >" + currChan + "\uE003" + channelsnames[currChan] + "</p><p style='" + color_epg_avinfo + ";' >" + AvInfo[currChan] + "</p><p style='" + color_epg_title + ";'>" + EPG[0][7][currChan] + EPG[0][9][currChan] + EPG[0][8][currChan] + "</p>\n<p style='" + color_epg_info + ";'>" + EPG[0][4][currChan] + "</p>\n<p>" + Left(EPG[0][5][currChan],750) + "</p></center>";
    osdepginfonext.innerHTML =  "<center><p style='" + color_epg_head + ";'>"  + currChan + "\uE003" + channelsnames[currChan] + "</p><p style='" + color_epg_title + ";'>" +  EPG[1][7][currChan] + EPG[1][9][currChan] + EPG[1][8][currChan] + "</p>\n<p style='" + color_epg_info + ";'>" + EPG[1][4][currChan] + "</p>\n<p>" + Left(EPG[1][5][currChan],750) + "</p></center>";
}

function updateOSDtime(timchan) {

	tijd = EPG[0][2][timchan];
	date = new Date(tijd*1000); 
	tijd = date.toUTCString();
	tijd = new Date(tijd);
	dateCurrent = new Date();
	var EPGminutes = Math.floor((dateCurrent.getTime() - date.getTime()) /1000/60);
	var tm = tijd.getMinutes();
	var th = tijd.getHours();
	th=addzero(th);
	tm=addzero(tm);

	EPG[0][7][timchan] =  th + ":" + tm + " (" + EPGminutes + " / " + ((EPG[0][3][timchan])-EPGminutes).toFixed(0) + ")" + " " + EPG[0][1][timchan] + " ";
	if (!EPG[0][2][timchan] || ((EPG[0][3][timchan]-EPGminutes) < 0))
	{
		EPG[0][7][timchan] = " ";
	}

}


function settimer(ProgTime,ProgName,ProgDura,SwitchTimer) {
// 1 - switchonly, 2 - record on server (display info only), 3 - record local
	if(SwitchTimer == 1) {	
		  try {
		    switchtimerID = ss.schedule("SwitchOnly","notification", ProgTime , 0);
		    ss.setParameter(switchtimerID, "Channel", currChan.toString() );
		  }
		  catch (e) {
		    alert(e);
		  }
	} else if(SwitchTimer == 3) {	
		  try {
		    var x = ss.schedule("RecLocal","record_hd_from_ip", ProgTime , ProgDura);
		    ss.setParameter(x, "Channel", currChan.toString() );
		    ss.setParameter(x, "Title", ProgName );
		  }
		  catch (e) {
		    alert(e);
		  }
	}

	if ( ProgTime == 0 && SwitchTimer == 2 && ProgDura !== 0 ) {
		var x = Lang[3] + ProgDura + "</pre>";
	} else if ( ProgTime == 0 && SwitchTimer == 2) {
		var x = "</pre>";
	} else {
		tijd = ProgTime;
		date = new Date(tijd*1000); 
		tijd = date.toUTCString();
		tijd = new Date(tijd);
		var tm = tijd.getMinutes();
		var th = tijd.getHours();
		th=addzero(th);
		tm=addzero(tm);
		var x = Lang[4] + th + ":" + tm  + "</pre>";
	}

	switchtimer.innerHTML = "<pre>" + Lang[2] + Left(ProgName,30) + "\n" + Lang[3] + channelsnames[currChan] + "\n" + x;
	setOSDtimer();

	switchtimer.style.opacity = 1;
	setTimeout("switchtimer.style.opacity = 0; ", ShowSetTimer);

}


function setOSDtimer() {
		// Only for type "SwitchOnly"
		var today = new Date;
		today = today / 1000;
		var x = ss.getBookingIds("SwitchOnly", today, 0)
		if (x.length !== 0) {
		tijd = ss.getNextStartTime("SwitchOnly");
		date = new Date(tijd*1000); 
		tijd = date.toUTCString();
		tijd = new Date(tijd);
		var tm = tijd.getMinutes();
		var th = tijd.getHours();
		th=addzero(th);
		tm=addzero(tm);
		osdtimer.innerHTML = "<p style='" + color_osdtimer + ";font-size:" + fsList + ";'>" + th + ":" + tm + "</p>";
		SetLed(0,2,1);
		switchicon = "\uE00C";
		osdca.innerHTML = CAicon + switchicon + RECicon;
		} else {
		osdtimer.innerHTML = " ";
		SetLed(0,0,0);
		switchicon = '\uE003';
		osdca.innerHTML = CAicon + switchicon + RECicon;
		}
}

// Left n characters of str
function Left(str, n){
  if (n <= 0)
    return "";
  else if (n > String(str).length)
    return str;
  else
    return String(str).substring(0,n);
}

// Right n characters of str
function Right(str, n){
  if (n <= 0)
    return "";
  else if (n > String(str).length)
    return str;
  else {
    var iLen = String(str).length;
    return String(str).substring(iLen, iLen - n);
  }
}

function fadeIn() {
    opacity += 0.2;
	    OSD(opcity);
    if (opacity >= 1) {
	setTimeout("fadeOut()", 200);
	return;
    }
    setTimeout("fadeIn()", 100);
}

function fadeOut() {
    opacity -= 0.5;
	OSD(opacity);
    if (opacity <= 0) {
	return;
    }
    setTimeout("fadeOut()", 100);
}

function RestartPortal(){

    try {
	ids = toi.applicationService.getApplicationIds();
	for ( i = 0; i < ids.length; ++i ){
	    info = toi.applicationService.getInfo(ids[i]);
	    if (info.applicationName == "WebKit Portal"){
		 dump("Killing app " + ids[i] + ": " + info.applicationName);
		 toi.applicationService.kill(ids[i]);
	    }
	}
    }
    catch(e) { dump(e) };
}

function date_time()
{
        date = new Date;
        year = date.getFullYear();
        month = date.getMonth();
        d = date.getDate();
        day = date.getDay();
        h = date.getHours();
        m = date.getMinutes();
	h=addzero(h);
	m=addzero(m);
        result = ''+days[day]+' '+d+' '+months[month]+' '+year+' '+h+':'+m;
        return;
}

function date_time_rec()
{
        date = new Date(Number(recStrt[currMed])*1000);
        year = date.getFullYear();
        month = date.getMonth();
	month = addzero(month + 1);
        d = date.getDate();
	d = addzero(d);
        day = date.getDay();
        h = date.getHours();
        m = date.getMinutes();
	h = addzero(h);
	m = addzero(m);
	if (year!==1970) { 
        	result = ' ' + d + '-' + month + '-' + year + ' ' + h + ':' + m;
	} else {
		result = "";
	}
	return;
}

// EPG Section

function GetEPG(epgchan)
{
	EPG[0][7][epgchan] = "";
	EPGShortnow = "";
	EPGExtnow = "";
	EPG[1][7][epgchan] = "";
	EPGShortnext = "";
	EPGExtnext = "";
	SI="";
  try {

	eitCache.clearServices();

	 StreamInfo(epgchan);

	 eitService = toi.statics.ToiDvbEitCacheServiceItem.create(SI[1],SI[2],SI[3]);
	 eitCache.addService(eitService);
	 event = eitCache.getPresentEvent(eitService);
	if(event.freeCaMode){
		CAicon = "\uE00D";
	} else {
		CAicon = Radioicon;
	}

		osdca.innerHTML = CAicon + switchicon + RECicon;

	if (event.name)	{
	 events = eitCache.getEvents(eitService, (Math.round(new Date().getTime()/1000.0)), 2000000000);
 	    extEventsnow = eitCache.getExtendedEventInfo(eitService, events.infoSequence[0].eventId);
	    EPGShortnow = extEventsnow.shortInfo;
	    EPGExtnow = extEventsnow.extendedInfo;
	    Extok = 1;
	} else { Extok = 0; }

	EPG[0][1][epgchan] = event.name;
	EPG[0][2][epgchan] = event.time;
	EPG[0][3][epgchan] = (event.duration/60);
	EPG[0][4][epgchan] = "";
	EPG[0][5][epgchan] = "";
	EPG[0][6][epgchan] = event.eventId;
	if (event.parentalRating) {
		EPG[0][8][epgchan] = "<br>(" + Lang[5] + (event.parentalRating + 3) + " )";
	} else {
		EPG[0][8][epgchan] = "";
	}

	if (event.contentNibbles) {
		connib = event.contentNibbles;
		Nibbles();
		EPG[0][9][epgchan] = "<br>" + content;
	} else {
		EPG[0][9][epgchan] = "";
	}


	if(EPGShortnow) {
	EPG[0][4][epgchan] = EPGShortnow;
	} else {
	EPG[0][4][epgchan] = "";
	}
	if(EPGExtnow) {
	EPG[0][5][epgchan] = EPGExtnow;
	} else {
	EPG[0][5][epgchan] = "";
	}

	if (EPG[0][5][epgchan] = EPG[0][4][epgchan]) { EPG[0][5][epgchan] = "";}

	updateOSDtime(epgchan);

	 event = eitCache.getFollowingEvent(eitService);
	if (Extok) {
		for (var i = 0; i < events.infoSequence.length && i < 4; i++) {
	 	    extEvents = eitCache.getExtendedEventInfo(eitService, events.infoSequence[i].eventId);
			if (extEvents.eventId == event.eventId) {
			    EPGShortnext = extEvents.shortInfo;
			    EPGExtnext = extEvents.extendedInfo; 
			}
		}
	}

	EPG[1][1][epgchan] = event.name;
	EPG[1][2][epgchan] = event.time;
	EPG[1][3][epgchan] = (event.duration/60);
	EPG[1][4][epgchan] = "";
	EPG[1][5][epgchan] = "";
	EPG[1][6][epgchan] = event.eventId;
	if (event.parentalRating) {
		EPG[1][8][epgchan] = "<br>(" + Lang[5] + (event.parentalRating + 3) + " )";
	} else {
		EPG[1][8][epgchan] = "";
	}

	if (event.contentNibbles) {
		connib = event.contentNibbles;
		Nibbles();
		EPG[1][9][epgchan] = "<br>" + content;
	} else {
		EPG[1][9][epgchan] = "";
	}

	if(EPGShortnext) {
	EPG[1][4][epgchan] = EPGShortnext;
	} else {
	EPG[1][4][epgchan] = "";
	}
	if(EPGExtnext) {
	EPG[1][5][epgchan] = EPGExtnext;
	} else {
	EPG[1][5][epgchan] = "";
	}
	
	if (EPG[1][5][epgchan] = EPG[1][4][epgchan]) { EPG[1][5][epgchan] = "";}

	tijd = event.time;
	date = new Date(tijd*1000); 
	tijd = date.toUTCString();
	tijd = new Date(tijd);
	var tm = tijd.getMinutes();
	var th = tijd.getHours();
	th=addzero(th);
	tm=addzero(tm);
	 EPG[1][7][epgchan] = th + ":" + tm + " (" + (event.duration/60).toFixed(0) + ")" + "          " + event.name + " ";

	if (!event.time) 
	{
		EPG[1][7][epgchan] = " ";
	}


  } catch(e) {
    alert("Get EPG problem: " + e);
    CAicon = "\uE01A";
  }
} 


function Nibbles() {
	content = "";
	if (connib >= 0x00001000 && connib < 0x00002000) { content = CLang[0]; }
	if (connib >= 0x00002000 && connib < 0x00003000) { content = CLang[10]; }
	if (connib >= 0x00003000 && connib < 0x00004000) { content = CLang[20]; }
	if (connib >= 0x00004000 && connib < 0x00005000) { content = CLang[30]; }
	if (connib >= 0x00005000 && connib < 0x00006000) { content = CLang[40]; }
	if (connib >= 0x00006000 && connib < 0x00007000) { content = CLang[50]; }
	if (connib >= 0x00007000 && connib < 0x00008000) { content = CLang[60]; }
	if (connib >= 0x00008000 && connib < 0x00009000) { content = CLang[70]; }
	if (connib >= 0x00009000 && connib < 0x0000A000) { content = CLang[80]; }
	if (connib >= 0x0000A000 && connib < 0x0000B000) { content = CLang[90]; }
	if (connib >= 0x0000B000 && connib < 0x0000C000) { content = CLang[100]; }
	// alert(connib);
}


function GetSchedule(schchan,tablelength){
	//Old style Schedule, used in Guide View.
	SI = "";
  try {
	 StreamInfo(schchan);

	 eitService = toi.statics.ToiDvbEitCacheServiceItem.create(SI[1],SI[2],SI[3]);
	 eitCache.addService(eitService);
	 event = eitCache.getPresentEvent(eitService);
	 events = eitCache.getEvents(eitService, (Math.round(new Date().getTime()/1000.0)), 2000000000);

	if (event.name)	{
	    if (events.more) {
	      var t = eitCache.getEvents(eitService, (Math.round(new Date().getTime()/1000.0)), 2000000000);
	      events.infoSequence.concat(t.infoSequence);
	      events.more = t.more;
	    }

	    var txt = "<table><tr>";
	    var i = 0;
	    for (i = 0; i < events.infoSequence.length && i < tablelength; i++) {

		while ((i > 0) && (events.infoSequence[i].eventId == events.infoSequence[(i-1)].eventId)) {
			i = i + 1;
		}

		tijd = events.infoSequence[i].time;
		date = new Date(tijd*1000); 
		tijd = date.toUTCString();
		tijd = new Date(tijd);
		var tm = tijd.getMinutes();
		var th = tijd.getHours();
		th=addzero(th);
		tm=addzero(tm);

	      txt = txt + "<td style='font-size:" + fsSchedList + ";" + color_sched_font + ";'>\uE003\uE003\uE003\uE003\uE003" + th + ":" + tm + "     (" + (events.infoSequence[i].duration/60).toFixed(0) + ")  " + Left(events.infoSequence[i].name,30) + "</td></tr>";
	    }
	   txt = txt + "</table>";
	   schedule.innerHTML = "<p style='" + color_sched_head + ";font-size:" + fsSched + ";'>" + "\uE003" + schchan + "\uE003" + channelsnames[schchan] + txt + "</p>";
	} else {
	  schedule.innerHTML = "<p style='" + color_sched_head + ";font-size:" + fsSched + ";'>" + "\uE003" + schchan + "\uE003" + channelsnames[schchan] + "</p>";
	}

  } catch(e) {
    alert("Get EPG problem: " + e);
    schedule.innerHTML = "<p style='" + color_sched_head + ";font-size:" + fsSched + ";'>" + "\uE003" + schchan + "\uE003" + channelsnames[schchan] + "</p><p>" + Lang[6] + "</p>";
  }

}


function StreamInfo(si) {
	// EPG Filter
	// streaminfo
	// SI[x] 0-sat,1-NID,2-TID,3-SID
 	SI=channels[si].split("-");

	//default setting : English
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);

	if(SI[0]=="C") {
	// Default on Cable - Dutch // Ziggo.
	is.setObject("cfg.locale.ui","dut",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="T") {
	// DVB-T default German.
	is.setObject("cfg.locale.ui","ger",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="8720") {
	// KPN DVB-T (might also be used for some german)
	is.setObject("cfg.locale.ui","dut",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S19.2E") {
	// Default on 19E German.
	is.setObject("cfg.locale.ui","ger",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S28.2E") {
	// Default on 28E English
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	} 

	if(SI[0]=="S42.0E") {
	is.setObject("cfg.locale.ui","tur",is.STORAGE_VOLATILE);
	} 

	if(SI[0]=="S42.0E" && SI[3]=="3601") {
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	} 

	if(SI[1]=="133") {
	//sky deutchland
	is.setObject("cfg.locale.ui","DEU",is.STORAGE_VOLATILE);
	}

	if(SI[2]=="1107") {
	//Sat1/pro7 deutchland
	is.setObject("cfg.locale.ui","DEU",is.STORAGE_VOLATILE);
	}

//	if(SI[2]=="1057") {
//	//RTL HD transponder
//	is.setObject("cfg.locale.ui","GER",is.STORAGE_VOLATILE);
//	}

//	if(SI[2]=="1057" && SI[3]=="61204") {
//	//Sport1 HD (daytime only?)
//	is.setObject("cfg.locale.ui","DEU",is.STORAGE_VOLATILE);
//	}

	if(SI[2]=="1055" || SI[2]=="1053" || SI[2]=="1041" || SI[2]=="1017" || SI[2]=="1109") {
	//HD+ transponder
	is.setObject("cfg.locale.ui","DEU",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S13.0E" && (SI[2]=="1600" || SI[2]=="1000" || SI[2]=="1500" || SI[2]=="1300" || SI[2]=="300" || SI[2]=="1100" )) {
	//NC+ (Polish)
	is.setObject("cfg.locale.ui","pol",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S13.0E" && (SI[2]=="11200" || SI[2]=="400" || SI[2]=="12000" || SI[2]=="11400" || SI[2]=="11900" || SI[2]=="11600" )) {
	//NC+ (Polish)
	is.setObject("cfg.locale.ui","pol",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S13.0E" && (SI[2]=="11000" || SI[2]=="1400")) {
	//NC+ (Polish)
	is.setObject("cfg.locale.ui","pol",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="113") {
	//PolSat
	is.setObject("cfg.locale.ui","pol",is.STORAGE_VOLATILE);
	}

	if((SI[0]=="S19.2E" && SI[2]=="1059") ) {
		//TVP transponder
		is.setObject("cfg.locale.ui","pol",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="64511") {
	//sky Italia
	is.setObject("cfg.locale.ui","ita",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S13.0E" && (SI[2]=="5400" || SI[2]=="12400" || SI[2]=="65419" || SI[2]=="65417" )) {
	//Rai Italia
	is.setObject("cfg.locale.ui","ita",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="53" || (SI[0]=="S19.2E" && SI[2]=="1037") ) {
	//Canal Digitaal/ TV Vlaanderen 
	is.setObject("cfg.locale.ui","dut",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="53" && (SI[3]=="2042" || SI[3]=="2043" )) {
	//Canal Digitaal/ TV Vlaanderen 
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="53" && (SI[3]=="2045") ) {
	//Canal Digitaal/ TV Vlaanderen 
	is.setObject("cfg.locale.ui","fra",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="54") {
	//ZON / 30W
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="83") {
	//MEO / 30W
	is.setObject("cfg.locale.ui","por",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="49") {
	//Digital 30W
	is.setObject("cfg.locale.ui","spa",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && ( SI[2]=="3202" || SI[2]=="3208" || SI[2]=="3211" || SI[2]=="3222" || SI[2]=="3225") ) {
	//Canal Digitaal/ TV Vlaanderen (NID:3 is used for more than only CDS/TVV on 23East)
	is.setObject("cfg.locale.ui","dut",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && SI[2]=="3208" && SI[3]=="7037") {
	// Some other EPG
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && ( SI[2]=="3217") ) {
	// 23E - Deluxe HD
	is.setObject("cfg.locale.ui","DEU",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && SI[2]=="3212" && ( SI[3]=="14052" || SI[3]=="14055" ) ) {
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && ( SI[2]=="3205" || SI[2]=="3209" || SI[2]=="3210" || SI[2]=="3221" || SI[2]=="3219" || SI[2]=="3226")) {
	//Canal Digitaal/ TV Vlaanderen use CZE channels on 23East
	// Strangly set filter to cze but epg is in Dutch. (But not for JimJam)
	is.setObject("cfg.locale.ui","cze",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && SI[2]=="3219" && SI[3]=="13135" ) {
	//JimJam Dutch
	is.setObject("cfg.locale.ui","dut",is.STORAGE_VOLATILE);
	}

	if(SI[1]=="3" && SI[2]=="3211" && ( SI[3]=="20863" || SI[3]=="20865") ) {
	//MGM & Film+ CZ
	is.setObject("cfg.locale.ui","cze",is.STORAGE_VOLATILE);
	}

	if((SI[0]=="S13.0E" && SI[3]=="14003") || (SI[0]=="S13.0E" && SI[3]=="14009") || (SI[0]=="S13.0E" && SI[3]=="14051") || (SI[0]=="S13.0E" && SI[3]=="951")) {
	//Swiss ITA channels
		is.setObject("cfg.locale.ui","ita",is.STORAGE_VOLATILE);
	}

	if((SI[0]=="S13.0E" && SI[2]=="12800")) {
		is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	if((SI[0]=="S13.0E" && SI[3]=="14002") || (SI[0]=="S13.0E" && SI[3]=="14008") || (SI[0]=="S13.0E" && SI[3]=="17203") || (SI[0]=="S13.0E" && SI[3]=="17204") ) {
	//Swiss FRA channels
		is.setObject("cfg.locale.ui","fra",is.STORAGE_VOLATILE);
	}

	if((SI[0]=="S13.0E" && SI[3]=="17201") || (SI[0]=="S13.0E" && SI[3]=="17202") || (SI[0]=="S13.0E" && SI[3]=="901") || (SI[0]=="S13.0E" && SI[3]=="907") || (SI[0]=="S13.0E" && SI[3]=="911") ) {
	//Swiss GER channels
		is.setObject("cfg.locale.ui","ger",is.STORAGE_VOLATILE);
	}

	if((SI[0]=="S19.2E" && SI[2]=="1111" && SI[3]=="7290") ) {
		//Sky News on WDR HD transponder
		is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S19.2E" && ( (SI[2]=="1018") || (SI[2]=="1020") || (SI[2]=="1022") || (SI[2]=="1024") || (SI[2]=="1026") || (SI[2]=="1068") || (SI[2]=="1070") || (SI[2]=="1072") || (SI[2]=="1074") || (SI[2]=="1076") || (SI[2]=="1080") || (SI[2]=="1084") || (SI[2]=="1086") || (SI[2]=="1090") || (SI[2]=="1092") || (SI[2]=="1094") || (SI[2]=="1096") || (SI[2]=="1100") || (SI[2]=="1102") || (SI[2]=="1106") || (SI[2]=="1110") || (SI[2]=="1112") || (SI[2]=="1114") || (SI[2]=="1116") || (SI[2]=="1118") || (SI[2]=="1120"))) {
	//CanalSat S19.2
		is.setObject("cfg.locale.ui","fra",is.STORAGE_VOLATILE);
	}

	// MTV transponder 1078 / 1066
	if(SI[0]=="S19.2E" && SI[2]=="1078" && ( SI[3]=="28674" || SI[3]=="28675" || SI[3]=="28677" )) {
	//Nick JR France
		is.setObject("cfg.locale.ui","fra",is.STORAGE_VOLATILE);
	}
	if(SI[0]=="S19.2E" && SI[2]=="1078" && SI[3]=="28679") {
	//Nick NL
		is.setObject("cfg.locale.ui","dut",is.STORAGE_VOLATILE);
	}
	if(SI[0]=="S19.2E" && SI[2]=="1078" && ( SI[3]=="28673" || SI[3]=="28676" )) {
	//Deutsch
		is.setObject("cfg.locale.ui","ger",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S19.2E" && SI[2]=="1066") {
		is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}
	if(SI[0]=="S19.2E" && SI[2]=="1066" && ( SI[3]=="28652" || SI[3]=="28661" )) {
		is.setObject("cfg.locale.ui","fra",is.STORAGE_VOLATILE);
	}

	//Canal Sat 
	if(SI[0]=="S19.2E" && SI[1]=="1" && SI[2]=="1088" ) {
	is.setObject("cfg.locale.ui","fre",is.STORAGE_VOLATILE);
	}

	if(SI[0]=="S13.0E" && SI[1]=="319") {
	is.setObject("cfg.locale.ui","fre",is.STORAGE_VOLATILE);
	}

	//Euronews / Eurosport
	if(SI[0]=="S13.0E" && SI[1]=="318" && SI[2]=="200") {
	is.setObject("cfg.locale.ui","fra",is.STORAGE_VOLATILE);
	}

	//bloomberg 19.2E
	if(SI[0]=="S19.2E" && SI[2]=="1026" && SI[3]=="10067") {
	is.setObject("cfg.locale.ui","eng",is.STORAGE_VOLATILE);
	}

	//Canal+
	if(SI[0]=="S19.2E" && SI[1]=="1" && SI[2]=="1060" ) {
	is.setObject("cfg.locale.ui","spa",is.STORAGE_VOLATILE);
	}

	//Russian
	if(SI[0]=="S13.0E" && SI[2]=="8100") {
		is.setObject("cfg.locale.ui","ger",is.STORAGE_VOLATILE);
		//doesn't work but dvbsnoop does show 'ISO639_2_language_code:  ger' 
	}


}


// End of EPG section



// Channelslist / EPG Guide
//
// show currchan - 5
// highlite currchan
// show currchan + 5
// 
// check if chan is OK
// 
function showChannelList() {
	var liststyle = "";
	var htmlstring = "<table border='0'><tr>";
	listChan = currChan-5;
	for(var i=currChan-5; i<=currChan+5; i++) {
		do
			{
				listChan += 1;
				if (listChan<minChan[ChanGroup]) {
					listChan=maxChan[ChanGroup];
					}
				if (listChan>maxChan[ChanGroup]) {
					listChan=minChan[ChanGroup];
				}
			}

		while (!channels[listChan] && (listChan<maxChan[ChanGroup]));
		if (fullupdate) { GetEPG(listChan); }
		if ( listChan == currChan) { 
			if (!fullupdate) { GetEPG(listChan); }
			liststyle = "background:" + color_bg + ";";
		}  else {
			liststyle = "";
		}
		EpgInfo[0] = EPG[0][7][listChan];
		EpgInfo[1] = EPG[1][7][listChan];
		htmlstring = htmlstring + "<td style='" + liststyle + "font-size:" + fsList + ";'>\uE003\uE003" + listChan + "\uE003</td><td style='" + liststyle + "font-size:" + fsList + ";'>" + Left(channelsnames[listChan],15) + "\uE003</td><td style='" + liststyle + "font-size:" + fsList + ";'>"  + Left(EpgInfo[NowNext],64) + "</td></tr>";
	}
	htmlstring = htmlstring + "</table>";
	channelList.innerHTML = htmlstring;
        chanlistepg.innerHTML = "<center><p style='" + color_chan_epg + ";font-size:" + fsEpg + ";'>" + EPG[NowNext][1][currChan] + "</p><p style='" + color_chan_epg + ";font-size:" + fsList + ";'>" + Left(EPG[NowNext][4][currChan],250) + "</p></center>" ;

}


// END of Channelslist / EPG Guide

// TeleTXT section

function embedTeletextPlugin() {
  teletext = document.createElement("embed");
  teletext.id = "teletext";
  teletext.type = "application/motorola-teletext-plugin";
  teletext.style.position = "absolute";
  teletext.style.width = "100%";
  teletext.style.height = "100%";
  teletext.style.top = "10px"; // has to be 1 rather than 0
  teletext.style.left = "10px"; // has to be 1 rather than 0
  teletext.style.zIndex = "501";
  return teletext;
}


function setVisible(isVisible) {
  if (isVisible) {
    videoplane.style.width = "50%";
    videoplane.style.left = "50%";
    document.body.appendChild(teletext);
    teletext.style.width = "50%";
    teletext.style.visibility = "visible";
    channelList.style.visibility = "hidden";
    colorkeys.style.visibility = "hidden";
  } else {
    teletext.style.visibility = "hidden";
    channelList.style.visibility = "visible";
    colorkeys.style.visibility = "visible";
  }
}


function onKeyTeletext(keyCode) {
  switch(keyCode) {
    case "Left":
      teletext.api.gotoNextPage();
    break;
    case "Right":
      teletext.api.gotoPreviousPage();
    break;
    case "Red":
      teletext.api.inputRedKey();
    break;
    case "Green":
      teletext.api.inputGreenKey();
    break;
    case "Yellow":
      teletext.api.inputYellowKey();
    break;
    case "Blue":
      teletext.api.inputCyanKey();
    break;
    case "MediaRewind":
      teletext.api.gotoPreviousSubpage();
    break;
    case "MediaForward":
      teletext.api.gotoNextSubpage();
    break;
    case "MediaStop":
	teletext.style.width = "100%";
	teletext.api.transparent = !teletext.api.transparent;
	FullScreen();
    break;
    case "BrowserBack":
    case "Teletext":
	isVisible = 0;
	FullScreen();
	setVisible(isVisible);		
    break;

    case "TV":
      teletext.api.gotoIndexPage();
    break;

	case KEY_0:
	    teletext.api.inputDigit(0);
	break;
	case KEY_1:
	    teletext.api.inputDigit(1);
	break;
	case KEY_2:
	    teletext.api.inputDigit(2);
	break;
	case KEY_3:
	    teletext.api.inputDigit(3);
	break;
	case KEY_4:
	    teletext.api.inputDigit(4);
	break;
	case KEY_5:
	    teletext.api.inputDigit(5);
	break;
	case KEY_6:
	    teletext.api.inputDigit(6);
	break;
	case KEY_7:
	    teletext.api.inputDigit(7);
	break;
	case KEY_8:
	    teletext.api.inputDigit(8);
	break;
	case KEY_9:
	    teletext.api.inputDigit(9);
	break;



  }
}

// end of TeleTXT section


// Menu section

function onKeyMenu(keyCode) {
  switch(keyCode) {
    case "BrowserBack":
	if ((menu == 5 || menu == 7) && osdepginfo.style.opacity == 1) {
		osdepginfo.style.opacity = 0;
	} else if (menu == 10 || menu == MainMenu) {
		isSetupMenu = 0;
		mainmenu.style.opacity = 0;
		osdepginfo.style.opacity = 0;
	} else if (menu !== MainMenu) {
		if (menu == 3 ) { isFullscreen = 0; play(channels[currChan]); isFullscreen = 1;MPDListener = 0;}
		menu = MainMenu;
		InitMenu(menu);
	}
	break;
    case "Menu":
	if (menu == 3 ) { play(channels[currChan]);MPDListener = 0;}
	isSetupMenu = 0;
	mainmenu.style.opacity = 0;
	osdepginfo.style.opacity = 0;
    break;

    case "Left":
    break;
    case "Right":
    break;
    case "Up":
	if (menu == 2) {
	    timerID -= 1;
			var x = ss.getBookingIds("*", 0, 0);
		    if (timerID < x[0]) { timerID = x[0]; }
	} else 	if (menu == 5 || menu == 7 || menu == 10) {
	    timerID -= 1;
		    if (timerID < 0) { timerID = 0; }
	}
		InitMenu(menu);
    break;
    case "Down":
	if (menu == 2) {
	    timerID += 1;
		var x = ss.getBookingIds("*", 0, 0);
		    if (timerID > x[x.length-1] ) { timerID = x[x.length-1]; }
	} else 	if (menu == 5 || menu == 7 || menu == 10) {
	    timerID += 1;
			if (timerID > (maxTimers - 1) && maxTimers !== 0) { timerID = maxTimers - 1; }
	}
		InitMenu(menu);
    break;
    case "Accept":
    	if (menu == 2 && isMediaMenu !== 1) {
		var x = ss.getParameter(timerID, "assetURI");
		getRecOK = 0;
		LoadMediaSettings();
		isSetupMenu = 0;
		mediaList.style.opacity = 0;
		mainmenu.style.opacity = 0;
		currMed = -1;
		playRec(x);
		//UnloadMediaSettings();
	}
	if (menu == 10) { 
		GotoFav((timerID + Fav_base + 1));
		isSetupMenu = 0;
		mainmenu.style.opacity = 0;
		osdepginfo.style.opacity = 0;
	}
	if (menu == 5) {
		// Show EPG info Timer
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
		osdepginfo.innerHTML = "<center><pre style='" + color_timerinfo + ";'>\n\n\n" + Lang[0] + "\n\n\n </pre></center>" ;
		setTimeout("ShowTimerInfo();",100);
	}
	if (menu == 7) {
		// Show more info Current SearchTimer
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
	       	osdepginfo.innerHTML = "<center><pre style='" + color_main_head + ";'>" + searchtimersSearch[timerID] + "\n\n\n\n<center>" + Lang[0] + "</center></pre>" ;
		setTimeout("ShowSearchTimerInfo();",100);
	}

    break;
    case "Red":
    	if (menu == 1) {
		if (subs_dyn < (subs_prio_dyn.length -1)) { subs_dyn += 1} else { subs_dyn = 0 }
		if (subs_prio_dyn.length > 0) {
			is.setObject("cfg.media.subtitling.languagepriority", (subs_prio_dyn[subs_dyn] + "," + subs_prio),is.STORAGE_PERMANENT);
		} else {
			is.setObject("cfg.media.subtitling.languagepriority",subs_prio,is.STORAGE_PERMANENT);
		}
		InitMenu(menu);
		break;
	} else if (menu == 2) {
		var x = ss.getBookingIds("*", 0, 0);
		if (x.length > 0) {
			alert(timerID); //Show timerID for debug, some times it won't delete.
			ss.remove(timerID);
			timer[timerID] = "";
			LoadTimers();
			if (timer.length !== 0) { do { timerID = timerID + 1; } while (!timer[timerID] && (timerID < timer.length)) }
			setOSDtimer();
			InitMenu(menu);
		}
	} else 	if (menu == 5 && smartTVplugin) {
		osdepginfo.style.opacity = 0;
		mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[7] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n\n\n<center>" + Lang[0] + "</center></pre>";
		DeleteTimers();
		setTimeout("LoadTimersServer();InitMenu(menu);",100);
	} else 	if (menu == 10) {
		channels[(timerID + Fav_base + 1)]="";
		channelsnames[(timerID + Fav_base + 1)]="";
		is.setObject(("vip.channelsnames." + (timerID + 1)),"",is.STORAGE_PERMANENT)
		is.setObject(("vip.channels." + (timerID + 1)),"",is.STORAGE_PERMANENT)
		if (Fav_max_channel == (timerID + 1)) { 
			Fav_max_channel = timerID;
			maxTimers = Fav_max_channel;
			is.setObject("vip.fav_max_channel",Fav_max_channel.toString(),is.STORAGE_PERMANENT)
			timerID -= 1; if (timerID < 0) {timerID = 0;}
		}
		setTimeout("InitMenu(menu);",100);
	}
    break;
    case "Green":
    	if (menu == 1) {
		Set_Res = Set_Res + 1;
		if (Set_Res > (VideoOutputModes.length-1)) { Set_Res = 0;}
		// save the info
		is.setObject("vip.resolution",Set_Res.toString(),is.STORAGE_PERMANENT)

		VideoOutput();
		InitMenu(menu);
	} else 	if (menu == 5 && smartTVplugin) {
		activate_timers(timerID);
		InitMenu(menu);
	} else 	if (menu == 10) {
		//move up
		if (timerID !== 0) {
			x = timerID + Fav_base + 1;
			x1 = channels[x];
			y1 = channelsnames[x];
			x2 = channels[(x - 1)];
			y2 = channelsnames[(x - 1)];
			is.setObject(("vip.channelsnames." + (timerID + 1)),y2,is.STORAGE_PERMANENT)
			is.setObject(("vip.channels." + (timerID + 1)),x2,is.STORAGE_PERMANENT)
			is.setObject(("vip.channelsnames." + timerID),y1,is.STORAGE_PERMANENT)
			is.setObject(("vip.channels." + timerID),x1,is.STORAGE_PERMANENT)
			channelsnames[x] = y2;
			channels[x] = x2;
			channelsnames[(x - 1)] = y1;
			channels[(x - 1)] = x1;
			timerID -= 1;
			setTimeout("InitMenu(menu);",100);
		}
	} 
    break;
    case "Yellow":
	if (menu == MainMenu) {
		menu = 4; // INFO menu
		InitMenu(menu);
	} else 	if (menu == 1) {
		menu = 9; // INFO2 menu
		InitMenu(menu);
	} else 	if (menu == 10) {
		//move down
		if (timerID !== (maxTimers - 1)) {
			x = timerID + Fav_base + 1;
			x1 = channels[x];
			y1 = channelsnames[x];
			x2 = channels[(x + 1)];
			y2 = channelsnames[(x + 1)];
			is.setObject(("vip.channelsnames." + (timerID + 1)),y2,is.STORAGE_PERMANENT)
			is.setObject(("vip.channels." + (timerID + 1)),x2,is.STORAGE_PERMANENT)
			is.setObject(("vip.channelsnames." + (timerID + 2)),y1,is.STORAGE_PERMANENT)
			is.setObject(("vip.channels." + (timerID + 2)),x1,is.STORAGE_PERMANENT)
			channelsnames[x] = y2;
			channels[x] = x2;
			channelsnames[(x + 1)] = y1;
			channels[(x + 1)] = x1;
			timerID += 1;
			setTimeout("InitMenu(menu);",100);
		}
	}
    break;
    case "Blue":
		if (menu == 0) {
		RestartPortal();
	} else 	if (menu == 5) {
		// Show EPG info Timer
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
		osdepginfo.innerHTML = "<center><pre style='" + color_timerinfo + ";'>\n\n\n" + Lang[0] + "\n\n\n </pre></center>" ;
		setTimeout("ShowTimerInfo();",100);
	} else 	if (menu == 7) {
		// Show info SearchTimers
	       	osdepginfo.innerHTML = SearchTimer[timerID] ;
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
	} else if (menu == 10) {
		if (protChn[ChanGroup] !== 1 && ChanGroup !== Fav_group) {
			AddtoFav();
		}
	}
    break;
    case "MediaRewind":
	 if (menu == 1) {
		if (experimental) { // mute output 0 (analog out), keep output 3 'decoder output' unmuted
			aos.setVolume(0, 0); 
			}
	}
    break;
    case "MediaForward":
	 if (menu == 1) {
		if (experimental) { aos.setVolume(0, 100); }
	}

    break;
    case "MediaStop":
	if (menu == 1) {
		//set sleep timer.
		SleepTimer += 15;
		if (SleepTimerID != -1) {
		  clearTimeout(SleepTimerID);
		  SleepTimerID = -1;
		}
		if (SleepTimer > 90) {
			SleepTimer = 0;
		} else {
			SleepTimerID = setTimeout("SleepTimer = 0;toi.platformService.setStandby(true);", (SleepTimer * 60 * 1000));
		}
	}
	InitMenu(menu);
    break;
    case "Teletext":
	UseNewReclist = 1 - UseNewReclist;
	alert(UseNewReclist);
    break;
    case "TV":
    break;
	case KEY_1:
		if (menu == MainMenu) {
		menu = 1;
		} else if (menu == 1) {
		 ShowSubs = 1 - ShowSubs;
		 videoplane.subtitles = Boolean(ShowSubs); // Enable subtitles or Disable subtitles
		 is.setObject("vip.showsubs",ShowSubs.toString(),is.STORAGE_PERMANENT);
		} else	if (menu == 8) {
			SetGroup(1);
		}

	InitMenu(menu);
	break;
	case KEY_2:
		if (menu == MainMenu) {
			LoadTimers();
				if (timer.length !== 0) { do { timerID += 1; } while (!timer[timerID] && (timerID < timer.length)) }
			menu = 2;
		}

		if (menu == 1) {
			if(subsmode == 0 ) {	
				is.setObject("cfg.media.subtitling.modepriority","Teletext,DVB",is.STORAGE_PERMANENT);
				subsmode = 1;
			} else {
				is.setObject("cfg.media.subtitling.modepriority","DVB,Teletext",is.STORAGE_PERMANENT);
				subsmode = 0;
			}
		}

		if (menu == 8) {
		SetGroup(2);
		}
		InitMenu(menu);
	break;
	case KEY_3:
	if (menu == 0) {
			isSetupMenu = 0;
			mediaList.style.opacity = 0.9;
			mainmenu.style.opacity = 0;
			setTimeout("getSchedule(currChan);LoadMediaSettings();",100);
	} else	if (menu == 1) {
			if (audio < (lang_prio.length -1)) { audio += 1} else { audio = 0 }
				is.setObject("vip.languagepriority",audio.toString(),is.STORAGE_PERMANENT);
				is.setObject("cfg.media.audio.languagepriority",lang_prio[audio],is.STORAGE_PERMANENT);
		InitMenu(menu);
	} else	if (menu == 8) {
		SetGroup(3);
		InitMenu(menu);
	} 

	break;
	case KEY_4:
		if (menu == 0) {
			isSetupMenu = 0;
			mediaList.style.opacity = 0.9;
			mainmenu.style.opacity = 0;
			recPath = "/recordings.xml";
			setTimeout("getRecList();LoadMediaSettings();",100);
		} else if (menu == 1) {
		//Init here. menu = 0 don't need init!
		menu = 8;
		InitMenu(menu);
		} else if (menu == 8) {
		SetGroup(4);
		InitMenu(menu);
		}

	break;
	case KEY_5:
		if (menu == MainMenu && (Restfulapiplugin || smartTVplugin)) {
			mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[7] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n\n\n<center>" + Lang[0] + "</center></pre>";
			timerID = 0;
			menu = 5;
			setTimeout("LoadTimersServer();InitMenu(menu);",200);
		}

	if (menu == 1) {
		var x = is.getObject("vip.serveraddress");
		x = Number(x);
		if (x < (server_ip_array.length -1)) { x += 1} else { x = 0 }
		is.setObject("vip.serveraddress",x.toString(),is.STORAGE_PERMANENT);

		server_ip = server_ip_array[x];
		for (var i=0;i<10;i++) {
			if (ServerAdres[i] !== "FullURL" && ServerAdres[i] !== "MultiCast") {ServerAdres[i] = server_ip + StreamPort;}
		}
		InitMenu(menu);
		}

		if (menu == 8) {
		SetGroup(5);
		InitMenu(menu);
		}
	break;
	case KEY_6:
	if (menu == 0 && Restfulapiplugin) {
			isSetupMenu = 0;
			mediaList.style.opacity = 0.9;
			mainmenu.style.opacity = 0;
			setTimeout("getServerSchedule();LoadMediaSettings();",100);
			}

	if (menu == 1) {
		if(showClock == 0 )	{
		 	showDisplay("", true, 80, 1 );
			showClock = 1;
		} else if(showClock == 1 ) {
			showClock = 0;
	 		showDisplay(Right(currChan.toString(),4), false, 100, 0 );
		}
		InitMenu(menu);
	}
		if (menu == 8) {
		SetGroup(6);
		InitMenu(menu);
		}

	break;
	case KEY_7:
		if (menu == 0 && smartTVplugin) {
			isSetupMenu = 0;
			mediaList.style.opacity = 0.9;
			mainmenu.style.opacity = 0;
			recPath = "/media.xml";
			setTimeout("getRecList();LoadMediaSettings();",100);
			}


		if (menu == 1) {
			ShowProtectedChannels = 1 - ShowProtectedChannels;
			if (ProtectID) { clearTimeout(ProtectID); }
			if (ShowProtectedChannels == 0 && ProtectTimeOut !== 0 ) {
				ProtectID = setTimeout("ShowProtectedChannels = 1; if (protChn[ChanGroup] == 1) {ChanGroup = 0; currChan = defChan[ChanGroup]; play(currChan); }",ProtectTimeOut);
				}
			if (ShowProtectedChannels == 1 && protChn[ChanGroup] == 1) { ChanGroup = 0; currChan = defChan[ChanGroup]; play(currChan); }
			isSetupMenu = 0;
			mainmenu.style.opacity = 0;
		}
		if (menu == 8) {
		SetGroup(7);
		InitMenu(menu);
		}

	break;
	case KEY_8:
	if (menu == MainMenu && Restfulapiplugin) {
			mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[8] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n\n\n<center>" + Lang[0] + "</center></pre>";
			timerID = 0;
			menu = 7;
			setTimeout("LoadSearchTimersServer();InitMenu(menu);",200);
		}
	if (menu == 1) {
		if(SwitchGuide == 0 )	{
			SwitchGuide = 1;
		} else if(SwitchGuide == 1 ) {
			SwitchGuide = 0;
		}
		InitMenu(menu);
	}
	if (menu == 8) {
		SetGroup(8);
		InitMenu(menu);
	}


	break;
	case KEY_9:
		if ((menu == 0 || menu == 3) && ShowMPD) {
			menu = 3;
			playMPD(server_ip + MPDAddress);
		} else if (menu == 1) {
			if (lang_nr < (OSDLang.length -1)) { lang_nr += 1} else { lang_nr = 0 }
			is.setObject("vip.OSDlanguage",lang_nr.toString(),is.STORAGE_PERMANENT);
			loadjs(langfile[lang_nr]);
			setTimeout("InitMenu(menu);",100);
		} else if (menu == 8) {
			SetGroup(9);
		}

		InitMenu(menu);
	break;
	case KEY_0:
		if (menu !== MainMenu && menu !== 8 ) {
			if (menu == 3 ) { isFullscreen = 0; play(channels[currChan]); isFullscreen = 1; MPDListener = 0;}
			menu = MainMenu;	
			InitMenu(menu);
		} else if (menu == 8) {
			SetGroup(0);
			InitMenu(menu);
		} else if (menu == 0) {
			timerID = 0; maxTimers = Fav_max_channel;
			menu = 10; if (ChanGroup !== Fav_group) { Fav_key1 = Lang[86]; }
			InitMenu(menu);
		}

	break;
    case "VolumeMute":
	VolumeMute();
	break;
    case "VolumeUp":
	VolumeUp();
	break;
    case "VolumeDown":
	VolumeDown();
	break;
    case KEY_A:// |> key on old long kpn 1710/1760 remote
        break;
    case KEY_B:// hh key on old long kpn 1710/1760 remote
        break;
    case KEY_C:// @ key on old long kpn 1710/1760 remote
	if (menu == 10 ) {
		isSetupMenu = 0;
		mainmenu.style.opacity = 0;
		osdepginfo.style.opacity = 0;
	}
        break;
    case KEY_D:// >@ key on old long kpn 1710/1760 remote
        break;

	default:
        break;
  }
}


function InitMenu(menu) {

// 0 = Main Menu
// 1 = settings menu
// 2 = Timers menu
// 3 = MPD Menu
// 4 = INFO Menu
// 5 = Timers from Server
// 6 = Main Menu (when watching recording)
// 7 = SearchTimers from Server
// 8 = ChannelGroups enable/disable
// 9 = INFO2 menu
// 10 = Favorite Edit menu

osdepginfo.style.opacity = 0;

if(menu == 0) { // Main Menu
	MainMenu = 0;
	var htmltext = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[9] + "\n ( " + Version + " )</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>   1 -" + Lang[10] + "\n   2 -" + Lang[7] + "\n   3 -" + Lang[11];
	htmltext += "\n   4 -" + Lang[12]; 
	if (Restfulapiplugin) { 
		htmltext += "\n   5 -" + Lang[13]; 
	} else { 
		htmltext += "<font style='" + color_notset +";'>" + "\n   5 -" + Lang[13] + "<font style='" + color_main_font +";'>" ;
	}
	if (Restfulapiplugin) { 
		htmltext += "\n   6 -" + Lang[14]; 
	} else {
		htmltext += "<font style='" + color_notset +";'>" + "\n   6 -" + Lang[14] + "<font style='" + color_main_font +";'>" ;  
	}
	if (smartTVplugin) { 
		htmltext += "\n   7 -" + Lang[15]; 
	} else { 
		htmltext += "<font style='" + color_notset +";'>" + "\n   7 -" + Lang[15] + "<font style='" + color_main_font +";'>" ; 
	}
	if (Restfulapiplugin) { 
		htmltext += "\n   8 -" + Lang[16];
	} else {
		htmltext += "<font style='" + color_notset +";'>" + "\n   8 -" + Lang[16] + "<font style='" + color_main_font +";'>" ;  
	}
	if (ShowMPD) { 
		htmltext += "\n   9 -" + Lang[17]; 
	} else { 
		htmltext += "<font style='" + color_notset +";'>" + "\n   9 -" + Lang[17] + "<font style='" + color_main_font +";'>" ; 
	}

	htmltext += "\n   0 - " + Lang[83] + "\n\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[35] + "   <font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[18] + "</pre>";
	mainmenu.innerHTML = htmltext;
}

if(menu == 6) { // Main Menu when watching recording
	MainMenu = 6;
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[9] + "\n ( " + Version + " )</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>   1 -" + Lang[10] + "\n   2 -" + Lang[7] + "\n\n\n   5 -" + Lang[13] + "\n\n\n   8 -" + Lang[16] + "\n\n\n\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[35] + "   <font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "</pre>";
}


if(menu == 1) { // settings menu
	var htmltext = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[10] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>   1 - ";
	if (ShowSubs) { htmltext += "\uE017"; } else { htmltext += "\uE016"; }
	htmltext += Lang[20] + ": " + (is.getObject("cfg.media.subtitling.languagepriority"));
	if (subs_prio_dyn.length > 0) { htmltext += " (" + (subs_dyn + 1 ) + "/" + subs_prio_dyn.length + ") "; }
	htmltext += "\n   2 - \uE003" + Lang[22] + (is.getObject("cfg.media.subtitling.modepriority"));
	htmltext += "\n   3 - \uE003" + Lang[24] + (is.getObject("cfg.media.audio.languagepriority")); 
	htmltext += "\n   4 - " + Lang[82] + "\n   5 - VDR : " + server_ip + "\n   6 - ";
	if (showClock) { htmltext += "\uE017"; } else { htmltext += "\uE016"; }
	htmltext += Lang[25] + "\n   7 - ";
	if (ShowProtectedChannels) { htmltext += "\uE017"; } else { htmltext += "\uE016"; }
	htmltext += Lang[26] + "\n   8 - ";
	if (SwitchGuide) { htmltext += "\uE017"; } else { htmltext += "\uE016"; }
	htmltext += Lang[27] + "\n   9 -" + Lang[23] + OSDLang[lang_nr] + "\n   \u25AA -" + Lang[29];

	if (SleepTimer) { htmltext += SleepTimer + Lang[30]; } else { htmltext += Lang[31]; }

	htmltext += "\n\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[20];
	htmltext += "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> - " + VideoOutputModes_txt[VideoOutputModes[Set_Res]] + " ";  
	htmltext += "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[35];
	htmltext += "<font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] +"</pre>";
//	htmltext += "\n   0 -" + Lang[9] +"</pre>";
	mainmenu.innerHTML = htmltext;
}

if(menu == 2) { // Timers menu
	booking = "";
	var x = timerID - 1;
	var y = ss.getBookingIds("*", 0, 0);
	if (y.length !== 0) {
	for (var i=0;i<10;i++) {
		if (timer.length !== 0) { do { x += 1; } while (!timer[x] && (x < timer.length)) }

			if (i == 0) {
			booking += "<font style='background:" + color_bg + ";-webkit-border-radius:25px;" + color_main_font + ";font-size:" + fsMenu + ";'>";
			} else if (i == 1) {
			booking += "</font>";
			} 

		if (timer.length > x) {
			booking += timer[x];
		} else {
			booking += "\n";
		}
	}
	}


	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[7] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n   0 -" + Lang[9] + "\n" + booking + "   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[48] + "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "   <font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "</pre>";
}

if(menu == 3) { // MPD Menu
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[33] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>" + Lang[34] + "\n 0 -" + Lang[9] + "</pre>";
}

if(menu == 4) { // INFO Menu
	var htmltext = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[35] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>";
	try {
		htmltext += "\n   Product name: " + is.getObject("config.productdisplayname");
		htmltext += "\n   Build date : " + is.getObject("config.build.date");
		htmltext += "\n\n   IP address : " + is.getObject("config.ipaddress");

		var x = is.getObject("cfg.ip.eth0.mode");
		if (x == "DHCP") { htmltext += "\n \uE003\uE017 "; } else { htmltext += "\n \uE003\uE016 "; }
		htmltext += "DHCP";
		var x = is.getObject("var.capabilities.dvr");
		if (x !== "FALSE") { htmltext += "\n \uE003\uE017 "; } else { htmltext += "\n \uE003\uE016 "; }
		htmltext += "DVR \n";
		htmltext += "\n   VDR address : " + server_ip;
		htmltext += "\n   Vip Client\uE003\uE003\uE003: " + Version;
		htmltext += "\n   Channel list\uE003: " + Chan_Ver;

	} catch(e) {
		alert("Error : " + e);
	}
	htmltext += "\n\n   0 -" + Lang[9] + "</pre>";
	mainmenu.innerHTML = htmltext;

}

if(menu == 5) { // Timers from Server
	if (timerOK) {
	//	booking = "<center>" + Lang[32] + "</center>";
	booking = "<font style='background:" + color_bg + ";-webkit-border-radius:25px;" + color_main_font + ";font-size:" + fsMenu + ";'>";
	var x = timerID - 1;
	for (var i=0;i<10;i++) {
		if (maxTimers !== 0) { do { x += 1; } while (!timers[x] && (x < maxTimers)) }
		if (maxTimers > x) { booking += timers[x]; } else { booking += "\n"; }
		if (i == 0) { booking += "</font>"; } 
	}
	if (get_timer) {
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[7] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n" + booking + "\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[48] + "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[49] + "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "   <font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[28] + "</pre>";
	 } else {
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[7] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n" + booking + "\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "   <font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[28] + "</pre>";
	 }
	}
}


if(menu == 7) { // SearchTimers from Server
	if (timerOK) {
	// 	booking = "<center>" + Lang[32] + "</center>";
	booking = "<font style='background:" + color_bg + ";-webkit-border-radius:25px;" + color_main_font + ";font-size:" + fsMenu + ";'>";
	var x = timerID - 1;
	for (var i=0;i<10;i++) {
		if (maxTimers !== 0) { do { x += 1; } while (!searchtimers[x] && (x < maxTimers)) }
		if (maxTimers > x) { booking += searchtimers[x]; } else { booking += "\n"; }
		if (i == 0) { booking += "</font>"; } 
	}
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[8] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n" + booking + "\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[19] + "   <font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[28] + "</pre>";

	}
}

if(menu == 8) { // ChannelGroups enable/disable
	var htmltext = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[80] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n";
	for (var i=0;i<10;i++) {
		if (maxChan[i]) { 
			htmltext += "<font style='" + color_main_font + ";'>"; 
		} else { 
			htmltext += "<font style='" + color_notset + ";'>"; 
		}

		htmltext += "\uE003" + i + "\uE003-\uE003";
		if (is.getObject(("vip.group." + i)) == "1") { htmltext += "\uE017"; } else { htmltext += "\uE016"; }
		htmltext += "\uE003" + Lang[81] + i + "\n";
	}
	htmltext += "</pre>";
	mainmenu.innerHTML = htmltext;
	}

if(menu == 9) { // INFO2 Menu
	var htmltext = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[35] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>";
	try {
		if (fullupdate !== 0) { htmltext += "\n \uE017 "; } else { htmltext += "\n \uE016 "; }
		htmltext += "Full EPG Update ";

		experimental = Number(is.getObject("vip.testing"));
		if (experimental) { htmltext += "\n \uE017 "; } else { htmltext += "\n \uE016 "; }
		htmltext += "Experimental";
		if (Number(is.getObject("vip.testing2"))) { htmltext += "\n \uE017 "; } else { htmltext += "\n \uE016 "; }
		htmltext += "Experimental 2 (Info box 'not in package')";
		if (Restfulapiplugin) { htmltext += "\n \uE017 "; } else { htmltext += "\n \uE016 "; }
		htmltext += "Has Restfulapiplugin"
		if (smartTVplugin) { htmltext += "\n \uE017 "; } else { htmltext += "\n \uE016 "; }
		htmltext += "Has smartTVplugin"
		htmltext += "\n gettimers from";
		if (get_timer == 1) { 
			htmltext += " smarttvweb "; 
		} else { 
			htmltext += " restfulapi "; 
		}

		htmltext += "\n getmarks from";
		if (get_marks == 1) { htmltext += " smarttvweb "; } else { htmltext += " restfulapi "; }
		htmltext += "\n getrecordings from";
		if (get_recordings == 1) { 
			htmltext += " smarttvweb "; 
		} else if (get_recordings == 0) { 
			htmltext += " restfulapi "; 
		} else {
			htmltext += " streamdev "; 
		}
		htmltext += "\n EPGMode : "
		if (EPGMode) { htmltext += "Full EPG"; } else { htmltext += "Now/Next Only"; }
	} catch(e) {
		alert("Error : " + e);
	}
	htmltext += "\n\n   0 -" + Lang[9] + "</pre>";
	mainmenu.innerHTML = htmltext;

}

if(menu == 10) { // Favorite edit Menu
	var htmltext = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[83]
	htmltext += "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>\n"
	htmltext += "<font style='background:" + color_bg + ";-webkit-border-radius:25px;" + color_main_font + ";font-size:" + fsMenu + ";'>";
	var x = timerID;
	for (var i=0;i<10;i++) {
		if (maxTimers !== 0) { x += 1;}
		if (maxTimers >= x && x !== 0) { htmltext += " \u0003\u0003 " + x + " \u0003\u0003 " + channelsnames[(x + Fav_base)] + " \u0003\u0003\u0003 \n"; } else { htmltext += "\n"; }
		if (i == 0) { htmltext += "</font>"; } 
	}
	htmltext += "\n   <font style='color:red;'>\u25CF<font style='" + color_main_font + ";'> -" + Lang[87]; 
	htmltext += "<font style='color:green;'>\u25CF<font style='" + color_main_font + ";'> -"
	if (timerID == 0) { htmltext += Lang[19] } else { htmltext += Lang[84] } //no move up
	htmltext += "<font style='color:yellow;'>\u25CF<font style='" + color_main_font + ";'> -"
	if (timerID == (maxTimers - 1) || x == 0) { htmltext += Lang[19] } else { htmltext += Lang[85] } //no move down
	htmltext += "<font style='color:blue;'>\u25CF<font style='" + color_main_font + ";'> -" + Fav_key1 + "</pre>";
	mainmenu.innerHTML = htmltext;
}

} // end of initmenu

function SetGroup(isgroup) {
	is.setObject("vip.group." + isgroup,(1 - is.getObject("vip.group." + isgroup)).toString(),is.STORAGE_PERMANENT);
	if (is.getObject("vip.group." + isgroup) == "0") { minChan[isgroup] = "";} else {minChan[isgroup] = minchan[isgroup];}
}

function LoadTimers() {
		timer.length = 0;
		var booking = "";
		var x = ss.getBookingIds("*", 0, 0);
			for (var i=0;i<x.length;i++) { 
				var y = ss.getBooking(x[i]);
				booking = "   ID " + x[i];
				booking += " " + y.category;
				booking += " " + ss.getParameter(x[i], "Channel");
				tijd = y.start;
				date = new Date(tijd*1000); 
				tijd = date.toUTCString();
				tijd = new Date(tijd);
			        month = tijd.getMonth();
			        d = tijd.getDate();
		        	day = tijd.getDay();
				var tm = tijd.getMinutes();
				var th = tijd.getHours();
				th=addzero(th);
				tm=addzero(tm);

				booking += " Start " + Left(days[day],3) + " " + d + " " + Left(months[month],3) + " " + th + ":" + tm + "  ";

					if (y.category !== "SwitchOnly") {
						booking += " " + (y.duration/60).toFixed(0) + " min";
					}

				timer[(x[i])] = booking + "\n" ;

				}
}


function LoadTimersServer() {
try {

 if (get_timer==1) {
   //Get timers from SmartTVweb
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + recServ + "/timers.xml?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("timer");
   maxTimers = x.length;
	timers.length = 0; // clear timers[i] tries to clear crap if current x.length < previous x.length
   for (var i=0;i<x.length;i++)
	  { 
		var fill = "\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003";
	  timersFlag[i] = x[i].getElementsByTagName("flags")[0].childNodes[0].nodeValue;
	  timersStrt[i] = Right("000" + x[i].getElementsByTagName("start")[0].childNodes[0].nodeValue,4);
	  timersStop[i] = Right("000" + x[i].getElementsByTagName("stop")[0].childNodes[0].nodeValue,4);

	  timersEvnt[i] = x[i].getElementsByTagName("eventid")[0].childNodes[0].nodeValue; // event_id
	  timersID[i] = x[i].getElementsByTagName("index")[0].childNodes[0].nodeValue; // index
	  timersChan[i]  = x[i].getElementsByTagName("channelid")[0].childNodes[0].nodeValue; // channel_id
	  timersName[i] = x[i].getElementsByTagName("channelname")[0].childNodes[0].nodeValue + fill;
	  timersDay[i] = x[i].getElementsByTagName("day")[0].childNodes[0].nodeValue;
	  timersDays[i] = new Date(timersDay[i]*1000);
	  timersDays[i] = timersDays[i].getDate() + "\uE003" + Left(months[timersDays[i].getMonth()],4);
	  timersFile[i] = x[i].getElementsByTagName("file")[0].childNodes[0].nodeValue + fill + fill;

	  if (timersFlag[i] == "1") { 
		timers[i] = "\uE003\uE00C\uE003";
	  } else if (timersFlag[i] == "9" || timersFlag[i] == "11" ) { 
		timers[i] = "\uE003\uE00B\uE003";
	  } else if (timersFlag[i] == "0") { 
		timers[i] = "\uE003\uE003\uE003";
	  }  else { 
		timers[i] = "\uE003?\uE003";
	  }

	  timers[i] += timersDays[i] + "\uE003" + timersStrt[i] + "\uE003" + timersStop[i] + "\uE003" + Left(timersName[i],8) + "\uE003" + Left(timersFile[i],15) + "\n" ;
	  timerOK = 1;
	  }
 } else if (get_timer == 0) {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/timers.xml"),false);  // ?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("timer");
   maxTimers = x.length;
   for (var i=0;i<x.length;i++)
	  { 
	  var fill = "\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003";
	  timersID[i] = x[i].getElementsByTagName("param")[0].childNodes[0].nodeValue;
	  timersChan[i] = x[i].getElementsByTagName("param")[11].childNodes[0].nodeValue;
	  timersFlag[i] = x[i].getElementsByTagName("param")[1].childNodes[0].nodeValue;
	  timersStrt[i] = Right("00" + x[i].getElementsByTagName("param")[2].childNodes[0].nodeValue,4);
	  timersStop[i] = Right("00" + x[i].getElementsByTagName("param")[3].childNodes[0].nodeValue,4);
	  timersEvnt[i] = x[i].getElementsByTagName("param")[8].childNodes[0].nodeValue;
	  timersDays[i] = x[i].getElementsByTagName("param")[9].childNodes[0].nodeValue;
	  if (timersDays[i] == "-------" ) { 
		timersDays[i] = x[i].getElementsByTagName("param")[10].childNodes[0].nodeValue;
	  } else { 
		timersDays[i] += "\uE003\uE003\uE003";
	  }
	  timersName[i] = x[i].getElementsByTagName("param")[15].childNodes[0].nodeValue + fill;
	  timersFile[i] = x[i].getElementsByTagName("param")[14].childNodes[0].nodeValue + fill + fill;
	  if (timersFlag[i] == "1") { 
		timers[i] = "\uE003\uE00C\uE003";
	  } else if (timersFlag[i] == "9") { 
		timers[i] = "\uE003\uE00B\uE003";
	  } else { 
		timers[i] = "\uE003\uE003\uE003";
	  }
	  timers[i] += timersDays[i] + "\uE003" + timersStrt[i] + "\uE003" + timersStop[i] + "\uE003" + Left(timersName[i],8) + "\uE003" + Left(timersFile[i],15) + "\n" ;
	  timerOK = 1;
	  }

 }
  } catch(e) {
    timerOK = 0;
    alert("Get Timers problem: " + e);
    mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[7] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'><center>\n  " + Lang[36] + ": \n " + server_ip + "</center></pre>";
  }
}

function DeleteTimers() {
if (get_timer==1) {
 try {

	xmlhttp=new XMLHttpRequest();
 //
 // SmartTVWeb
 //	xmlhttp.open("GET",(server_ip + recServ + "/deleteTimer?guid=" + timersChan[timerID] + "&dy=" + timersDay[timerID] 
 //			+ "&st=" + timersStrt[timerID] + "&sp=" + timersStop[timerID] + "&" + new Date().getTime()),false);
	xmlhttp.open("GET",(server_ip + recServ + "/deleteTimer?index=" + timersID[timerID] + "&" + new Date().getTime()),false);
	xmlhttp.send();

  } catch(e) {
    alert("Deleting Timers problem: " + e);
  }
 }
}

function activate_timers(){
if (get_timer==1) {
	// (De)activate timers.
 try {

	xmlhttp=new XMLHttpRequest();
	if (timersFlag[timerID] == "0") { 
	xmlhttp.open("GET",(server_ip + recServ + "/activateTimer?index=" + timersID[timerID] + "&activate=true&" + new Date().getTime()),false);
	} else {
	xmlhttp.open("GET",(server_ip + recServ + "/activateTimer?index=" + timersID[timerID] + "&activate=false&" + new Date().getTime()),false);
	}
	xmlhttp.send();

	if (timersFlag[timerID] == "0") { 
		timers[timerID] = timers[timerID].substr(0, 1) + "\uE00C" + timers[timerID].substr(2);
		timersFlag[timerID] = "1"
	} else {
		timers[timerID] = timers[timerID].substr(0, 1) + "\uE003" + timers[timerID].substr(2);
		timersFlag[timerID] = "0"
	}
  } catch(e) {
    alert("(De)Activate Timers problem: " + e);
  }
 }
}

function ShowTimerInfo() {
 if (osdepginfo.style.opacity == 1) {
  //Like Show EPG Info
  //setup some dummy vars
  var info1 = ""; var info2 = ""; var info3 = ""; var info4="";
  if (timersEvnt[timerID] > 0) {

	try {
	   xmlhttp=new XMLHttpRequest();
	   xmlhttp.open("GET",(server_ip + RestFulAPI + "/events/" + timersChan[timerID] + "/" + timersEvnt[timerID] + ".xml?" + new Date().getTime()),false);  
	   xmlhttp.send();
	   xmlDoc=xmlhttp.responseXML;
	   var x=xmlDoc.getElementsByTagName("event");
		// x[0].getElementsByTagName("param")[1].childNodes[0].nodeValue --> Title
		// x[0].getElementsByTagName("param")[2].childNodes[0].nodeValue --> Short_text
		// x[0].getElementsByTagName("param")[3].childNodes[0].nodeValue --> Description
		// x[0].getElementsByTagName("param")[5].childNodes[0].nodeValue --> ChannelsName

		info1 = x[0].getElementsByTagName("param")[1].childNodes[0].nodeValue;
		info2 = x[0].getElementsByTagName("param")[5].childNodes[0].nodeValue;
		info4 = x[0].getElementsByTagName("param")[3].childNodes[0].nodeValue;
		info3 = x[0].getElementsByTagName("param")[2].childNodes[0].nodeValue + "</p><p>";

	  } catch(e) {
	    alert("Get EPG problem: " + e);

	  }
  } else {
	info3 = Lang[37];
  }
       	osdepginfo.innerHTML = "<center><pre style='" + color_timerinfo + ";'>" + Left(info1,60) + "\n " + timersDays[timerID] + " " + 
	timersStrt[timerID] + " - " + timersStop[timerID] + "\n" + info2 + "\n </pre><p>" + info3 + Left(info4,750) + "</p></center>" ;
 }
}

function LoadSearchTimersServer() {
try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/searchtimers.xml?" + new Date().getTime()),false); //"),false);  // 
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("searchtimer");
   maxTimers = x.length;
	searchtimers.length = 0; // clear timers[i] tries to clear crap if current x.length < previous x.length
   for (var i=0;i<x.length;i++)
	  { 
		var fill = "\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003\uE003";
	  searchtimersID[i] = x[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
	  searchtimersSearch[i] = x[i].getElementsByTagName("search")[0].childNodes[0].nodeValue;
	  searchtimersFlag[i] = x[i].getElementsByTagName("use_as_searchtimer")[0].childNodes[0].nodeValue;
	  if (searchtimersFlag[i] == "1") { 
		searchtimers[i] = "\uE003\uE017\uE003";
	  } else if (searchtimersFlag[i] == "0") { 
		searchtimers[i] = "\uE003\uE016\uE003";
	  }  else { 
		searchtimers[i] = "\uE003?\uE003";
	  }

		// Extended INFO
		SearchTimer[i] = "<center><pre style='" + color_main_head + ";'>" + x[i].getElementsByTagName("search")[0].childNodes[0].nodeValue + "\n </pre></center><pre>";
		if ((x[i].getElementsByTagName("use_as_searchtimer")[0].childNodes[0].nodeValue) == 0) {
			SearchTimer[i]  += "\uE003\uE016\uE003" + Lang[40] + "\n";
		} else {
			SearchTimer[i]  += "\uE003\uE017\uE003" + Lang[40] + "\n";
		}
		SearchTimer[i] = SearchTimer[i] + "\uE003\uE003\uE003Mode :\uE003" + (searchmode[x[i].getElementsByTagName("mode")[0].childNodes[0].nodeValue]) + "\n";
		if ((x[i].getElementsByTagName("use_time")[0].childNodes[0].nodeValue) == 1) {
			SearchTimer[i]  += "\uE003\uE017\uE003" + Lang[41] + "\uE003" + 
					x[i].getElementsByTagName("start_time")[0].childNodes[0].nodeValue + 
					"\uE003-\uE003" + x[i].getElementsByTagName("stop_time")[0].childNodes[0].nodeValue  + "\n";
		} else {
			SearchTimer[i]  += "\uE003\uE016\uE003" + Lang[41] + "\uE003" + "\n";
		}
		if ((x[i].getElementsByTagName("use_dayofweek")[0].childNodes[0].nodeValue) == 0) {
			SearchTimer[i] += "\uE003\uE016\uE003" + Lang[47] + "\uE003" + "\n";
		} else {
			//bit is used for dayofweek.
			var dowx = x[i].getElementsByTagName("dayofweek")[0].childNodes[0].nodeValue;
			var dow = "";
			if (dowx > 0) { var y = 1;} else { var y = 0;}
			dowx = Math.abs(dowx);
			for (var dowi=0; dowi<7; dowi++)
			{
				var mask = 1 << dowi;
				if ((dowx & mask) != 0) { dow += days[(dowi+y)] + "\uE003";}
			}
			SearchTimer[i] += "\uE003\uE017\uE003" + Lang[47] + "\uE003:\uE003" + dow + "\n";
		}


		if ((x[i].getElementsByTagName("use_channel")[0].childNodes[0].nodeValue) == 0) {
			SearchTimer[i] += "\uE003\uE016\uE003" + Lang[42] + "\uE003" + "\n";
		} else {
			SearchTimer[i] += "\uE003\uE017\uE003" + Lang[42] + "\uE003:\uE003" + 
					searchchan[(x[i].getElementsByTagName("use_channel")[0].childNodes[0].nodeValue)] + "\uE003" + 
					x[i].getElementsByTagName("channels")[0].childNodes[0].nodeValue + "\n";
		}

		SearchTimer[i]  += "\n</pre>";
		// End of Extended INFO


	  searchtimers[i] += searchtimersSearch[i]  + "\uE003\uE003\n" ;
	  timerOK = 1;
	  }
  } catch(e) {
    timerOK = 0;
    alert("Get SearchTimers problem: " + e);
    mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[8] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'><center>\n  " + Lang[43] + ": \n " + server_ip + RestFulAPI + "</center></pre>";
  }
}

function ShowSearchTimerInfo() {
	// info about a search timer.
  //Like Show EPG Info
  //setup some dummy vars

  var info1 = ""; var info2 = "";

	try {
	   xmlhttp=new XMLHttpRequest();
	   xmlhttp.open("GET",(server_ip + RestFulAPI + "/searchtimers/search/" + searchtimersID[timerID] + ".xml?" + new Date().getTime()),false);  
	   xmlhttp.send();
	   xmlDoc=xmlhttp.responseXML;
	   var x=xmlDoc.getElementsByTagName("event");
	   var maxinfo = x.length; if (maxinfo > 15) { maxinfo = 15;}
		
	   for (var i=0;i<maxinfo;i++)
		  { 
			info2 = x[i].getElementsByTagName("param")[16].childNodes[0].nodeValue; // Timer exists
			if (info2 == "true") {
				info1 += "\uE003\uE00C\uE003";
			} else {
				info1 += "\uE003\uE003\uE003";
			}
			info2 = x[i].getElementsByTagName("param")[17].childNodes[0].nodeValue; // Timer active
			if (info2 == "true") {
				info1 += "\uE017\uE003";
			} else {
				info1 += "\uE016\uE003";
			}

			info2 = x[i].getElementsByTagName("param")[6].childNodes[0].nodeValue; // Time
			        date = new Date(Number(info2)*1000);
	        		month = date.getMonth();
			        d = date.getDate();
		        	day = date.getDay();
			        h = date.getHours();
			        m = date.getMinutes();
				h=addzero(h);
				m=addzero(m);
			info2 = Left(days[day],3) + "\uE003" + d + "\uE003" + Left(months[month],3) + "\uE003" + h + ':' + m;
			info1 += info2;
			info2 = "\uE003\uE003" + x[i].getElementsByTagName("param")[7].childNodes[0].nodeValue/60 + "\uE003"; // Duration
			info1 += "\uE003" + Right(info2,3) + Lang[56] + "\uE003" + x[i].getElementsByTagName("param")[5].childNodes[0].nodeValue + "\uE003"; // Channel
			info1 += "\uE003" + Left(x[i].getElementsByTagName("param")[1].childNodes[0].nodeValue,25) + "\uE003"; // Programm Title
			info1 += "\n";
			
		}

	  } catch(e) {
	    alert("Get SearchTimer INFO problem: " + e);

	  }

       	osdepginfo.innerHTML = "<center><pre style='" + color_main_head + ";'>" + searchtimersSearch[timerID] + "\n </pre></center><pre>" + info1 + "</pre>" ;

}

// End of Menu section

// MPD Section

function MPD(ev) {
//     alert("Media player state changed: " + ev);
//     alert("Media player state changed: state=" + ev.state + ", reason=" + ev.reason + ", code=" + ev.code);
//     alert("Media player error :" + mediaPlayer.getError().details);
if (MPDListener == 0) {
	if (ev.state == 6 ) { 
		if (ev.reason == "CommandClose" && ErrorAgain == 0) {
			setTimeout("mediaPlayer.open(URL);mediaPlayer.play(1000);GetEPG(currChan);ExtraStuff();",500);
			ErrorAgain = 1;
		} else {
			ErrorAgain = 0;
			alert("Media player state changed: state=" + ev.state + ", reason=" + ev.reason + ", code=" + ev.code);
			showDisplay("ERRR", false, 100, 0 ); 
			if (experimental) {
				settimer(0,ev.reason,0,2);
			} else {
				settimer(0,Lang[67],0,2);
			}
		}
	}
	
} else {
	if ( ev.state == 6 && ev.reason == "HostUnreachable" ) {
	    showDisplay("ERRR", false, 100, 0 );
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[60] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>" + Lang[34] + "\n   0 -" + Lang[9] + "\n   9 -" + Lang[61] + "\n\n<center style='" + color_main_head + ";'>" + Lang[62] + ": \n" + server_ip + MPDAddress + "</center></pre>";
	  } else if ( ev.state == 2 ) { // && ev.reason == "PositionEnd" ) {
	    showDisplay("STOP", false, 100, 0 );
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[60] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>" + Lang[34] + "\n   0 -" + Lang[9] + "\n   9 -" + Lang[63] + "\n\n<center style='" + color_main_head + ";'>" + Lang[64] + ": \n" + server_ip + MPDAddress + "\n" + Lang[65] + "</center></pre>";
	  } else if ( ev.state == 3 && ev.reason == "CommandPlay" ) {
	showDisplay("MPD", false, 100, 0 );
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[60] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>" + Lang[34] + "\n   0 -" + Lang[9] + "\n\n\n<center style='" + color_main_head + ";'>" + Lang[64] + ": \n" + server_ip + MPDAddress + "</center></pre>";
	  } else {
	    showDisplay("ERRR", false, 100, 0 );
	mainmenu.innerHTML = "<h1><center style='font-size:" + fsMenuMain + ";" + color_main_head + ";'>" + Lang[60] + "</center></h1><pre style='" + color_main_font + ";font-size:" + fsMenu + ";'>" + Lang[34] + "\n   0 -" + Lang[9] + "\n   9 -" + Lang[63] + "\n\n<center style='" + color_main_head + ";'>Error : " + ev.state + "\n" + Lang[66] + ": " + ev.reason + "</center></pre>";
	}
}

}

function playMPD(uri) {
  try {
    if (mediaPlayer.getState() != mediaPlayer.STATE_IDLE) {
      mediaPlayer.close();
    }
	MPDListener = 1;
	mediaPlayer.open(uri);
	mediaPlayer.play(1000);
  } catch (e) {
    alert("Failed opening recording: " + e);
    return;
  }
}


// End of MPD Section

// Media Player Section

function LoadMediaSettings() {
		subgroup = 0;
		isMediaMenu = 1;
		isFullscreen = 0;
		if (getRecOK !== 2) { showDisplay("STOP", false, 100, 0 ); }
		currMed = 0;
		if (getRecOK) { showMediaList();}
		mediaPlayer.addEventListener(mediaPlayer.ON_POSITION_CHANGED, ShowMediaOSD);
		mediaPlayer.addEventListener(mediaPlayer.ON_STATE_CHANGED, onStateChanged);
}

function UnloadMediaSettings() {
	mediaPlayer.removeEventListener(mediaPlayer.ON_POSITION_CHANGED, ShowMediaOSD);
	mediaPlayer.removeEventListener(mediaPlayer.ON_STATE_CHANGED, onStateChanged);
	mediaList.style.opacity = 0;
	osdmedia.style.opacity = 0;
	osdtime.style.opacity = 0;
	osdepginfo.style.opacity = 0;
	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[0] + "</center></h1>";
	showDisplay(Right(currChan.toString(),4), false, 100, 0 );
	isMediaMenu = 0;
	isFullscreen = 1;
	isPause = 0;
	set_yellow_key = 0;
	if (mediaPlayer.getState() != mediaPlayer.STATE_PLAYING ) {
        play(channels[currChan]);
	}
}



function onKeyMedia(keyCode) {
if (DelisOK) {
	switch(keyCode) {
	case "Accept":
	  mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[0] + "</center></h1>";
	  switchtimer.style.opacity = 0;
	  setTimeout("DelRec2(); getRecList(); showMediaList();",100)
	default:
	  switchtimer.style.opacity = 0;
	  DelisOK = 0;
	break;
  	} // end of switch
} else if (mediaList.style.opacity != 0) { 
  switch(keyCode) {
    case "BrowserBack":
	if (subgroup && osdepginfo.style.opacity == 0) { 	
		mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[0] + "</center></h1>";
		setTimeout("getRecList(); showMediaList();",100)
		subgroup = 0;
		break;
	}
	if (osdepginfo.style.opacity == 1) { osdepginfo.style.opacity = 0; break; }
    case "TV":
	UnloadMediaSettings();
        break;
    case "Yellow":
	if (set_yellow_key) { 
		//hide/display schedule with same button
		UnloadMediaSettings();
	}
	break;
    case "Right":
	if (getRecOK !== 0) {
           for (var i=0;i<10;i++) {
		do
		{
		        incMed(1);
		}
	//	while (!recTitl[currMed]);
		while (!recList[currMed]);
	   }	
	showMediaList();
	}
	break;
    case "Left":
	if (getRecOK !== 0) {
           for (var i=0;i<10;i++) {
		do
		{
		        decMed(1);
		}
	//	while (!recTitl[currMed]);
		while (!recList[currMed]);
	   }
	showMediaList();
	}
	break;
    case "Down":
	if (getRecOK !== 0) {
	do
	{
	        incMed(1);
	}
	//	while (!recTitl[currMed]);
		while (!recList[currMed]);
	showMediaList();
	}
        break;
    case "Up":
	if (getRecOK !== 0) {
	do
	{
	        decMed(1);
	}
	//	while (!recTitl[currMed]);
		while (!recList[currMed]);
	showMediaList();
	}
	break;
  case "Accept":
  case "MediaPlayPause":
	if (getRecOK == 2) {
		ShowInfo();
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
	}
	if (getRecOK == 1) {
		if (recGroup[currMed] !== 0 && subgroup == 0 && ShowSubDir) {
			setTimeout("MakeRecList3(recGroup[currMed]); showMediaList();",100)
			subgroup = 1;
		} else {
			recList[currMed] = "\u0003" + recList[currMed].substring(1);
			mediaList.style.opacity = 0;
			if (get_recordings == 1) {
			setTimeout("GetMarks(); getResume(); playRec(recLink[currMed]+ '?mode=streamtoend&time=' + position);",100);
			} else if (get_recordings == 2) {
//			setTimeout("playRec(recLink[currMed]+ '?pos=resume');",100)
			position = 0;
			setTimeout("playRec(recLink[currMed]);",100)
			}
		}
	}
        break;
    case "Red":
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
	   // Only delete item if it isn't a subdir marker
	   DelRec(); 
	}
	if (getRecOK == 2) { //set timer
			settimer(recStrt[currMed],recTitl[currMed],recDura[currMed],1);
	 }
	break;
    case "Blue":
	// only show info if not a subdir marker or if in EPG mode
	if ( (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) || getRecOK == 2) {
	ShowInfo();
	osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
	}
	break;
    case "Green":
	if (getRecOK == 2 && mediaRecorder) { //set timer only if mediaRecorder = 1, unit has harddisk
			settimer(recStrt[currMed],recTitl[currMed],recDura[currMed],3);
	 }
	break;

    case "VolumeMute":
	VolumeMute();
	break;
    case "VolumeUp":
	VolumeUp();
	break;
    case "VolumeDown":
	VolumeDown();
	break;

    case KEY_REC:
    case "MediaRecord":
	// make timer for recording
	if (getRecOK == 2) { //set timer
			settimer(recStrt[currMed],recTitl[currMed],recDura[currMed],2);
			ServerTimer(channels[currChan],recGUID[currMed]);
	 } 
        break;
   case KEY_0:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
	// Only rewind file if it isn't a subdir marker
	setResumeNull();
	showMediaList();
	}
	break;
   case KEY_1:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(1);
	}
	break;
   case KEY_2:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(2);
	}
	break;
   case KEY_3:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(3);
	}
	break;
   case KEY_4:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(4);
	}
	break;
   case KEY_5:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(5);
	}
	break;
   case KEY_6:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(6);
	}
	break;
   case KEY_7:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(7);
	}
	break;
   case KEY_8:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(8);
	}
	break;
   case KEY_9:
	if (getRecOK == 1 && (recGroup[currMed] == 0 || subgroup == 1)) { 
		// Only do reccmds if it isn't a subdir marker
		reccmds(9);
	}
	break;



	default:
        break;
  } // end of switch
} else { 
  switch(keyCode) {
    case "BrowserBack":
//		ShowInfo();
//		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
		break;
    case "TV":
	setResume();
	play(channels[currChan]);
	UnloadMediaSettings();
        break;
    break;
    case "Down":
	if (mediaPlayer.getState() != mediaPlayer.STATE_PAUSED) {
	      showDisplay("PAUS", false, 100, 0 );
	      mediaPlayer.play(0);
	}
        break;
    case "Up":
	if (mediaPlayer.getState() != mediaPlayer.STATE_PLAYING) {
		if (currMed == -1 ) {
		      showDisplay("PLAY", false, 100, 0 );
		      mediaPlayer.play(1000);
		} else {		
		      position += (mediaPlayer.getPosition()/1000);
			if (get_recordings == 1) {
			      playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
			} else if (get_recordings == 2) {
			      playRec((recLink[currMed] + "?pos=time." + position));
			}
		}
	}
	break;
  case "Accept":
	osdmedia.style.opacity = 1 - osdmedia.style.opacity;
	osdtime.style.opacity = osdmedia.style.opacity;
	ShowMediaOSD();
        break;
   case "Green":
	if (audio_dyn < (lang_prio_dyn.length -1)) { audio_dyn += 1} else { audio_dyn = 0 }
	if (lang_prio_dyn.length > 1) {
		is.setObject("cfg.media.audio.languagepriority",lang_prio_dyn[audio_dyn] + "," + lang_prio[audio],is.STORAGE_PERMANENT);
		osdlang.style.opacity = 1;
		osdlang.innerHTML = "<img src='unmute.png'> " + lang_prio_dyn[audio_dyn] + " ";
		setTimeout("osdlang.style.opacity = 0; ", 3000);
	}
	break;
    case "Yellow":
	 ShowSubs = 1 - ShowSubs;
	 videoplane.subtitles = Boolean(ShowSubs); // Enable subtitles or Disable subtitles
	break;
    case "Blue":
	if ( isPause == 0 ) {
		ShowInfo();
		osdepginfo.style.opacity = 1 - osdepginfo.style.opacity;
	}
	break;
    case "Red":
	GetMarks();
	ShowMediaOSD();
	break;

   case "Menu":
	osdepginfo.style.opacity = 0;
	osdepginfonext.style.opacity = 0;
	isSetupMenu = 1;
	mainmenu.style.opacity = 0.8;
	menu = 6;
	InitMenu(menu);
	break;

    case "VolumeMute":
	VolumeMute();
	break;
    case "VolumeUp":
	VolumeUp()
	break;
    case "VolumeDown":
	VolumeDown();
	break;


    case KEY_REC:
    case "MediaRecord":
	//	recordStart(recLink[currMed]);
	//	UnloadMediaSettings();
	break;
    case "MediaRewind":
	    if (mediaPlayer.getState() != mediaPlayer.STATE_IDLE) {
	      mediaPlayer.play(-4000);
	    showDisplay("REW", false, 100, 0 );
	    }
    break;
    case "MediaForward":
	    if (mediaPlayer.getState() != mediaPlayer.STATE_IDLE) {
	      mediaPlayer.play(4000);
	    showDisplay("FF", false, 100, 0 );
	    }
    break;
    case "MediaStop":
	    if (currMed == -1 || isPause == 1) {
		    osdepginfo.style.opacity = 0;
		    isFullscreen = 1; play(channels[currChan]); 
		    UnloadMediaSettings();		
	    } else {
		    setResume();
		    osdepginfo.style.opacity = 0;
		    isFullscreen = 0; play(channels[currChan]); isFullscreen = 1;
		//	if (isRecording == 1) { 
		//	recordStop();
		//	isRecording = 0;
		//	}

		    mediaList.style.opacity = 0.9;
		    showDisplay("STOP", false, 100, 0 );
		    showMediaList();
	    }
    break;
	case "MediaPlayPause":
	    if (mediaPlayer.getState() != mediaPlayer.STATE_PAUSED) {
	      showDisplay("PAUS", false, 100, 0 );
	      mediaPlayer.play(0);
	    } else {
		if (currMed == -1 ) {
		      showDisplay("PLAY", false, 100, 0 );
		      mediaPlayer.play(1000);
		} else {		
			position += (mediaPlayer.getPosition()/1000);
			if (get_recordings == 1) {
				playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
			} else if (get_recordings == 2) {
				playRec((recLink[currMed] + "?pos=time." + position));
			}
		}
    	    }
	break;
    case KEY_1:
	position += (mediaPlayer.getPosition()/1000) - 30;
	if (position <= 0) { position = 0;} 
			if (get_recordings == 1) {
			      playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
			} else if (get_recordings == 2) {
			      playRec((recLink[currMed] + "?pos=time." + position));
			}
	break;
    case KEY_4:
	position += (mediaPlayer.getPosition()/1000) - 60;
	if (position <= 0) { position = 0;} 
			if (get_recordings == 1) {
			      playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
			} else if (get_recordings == 2) {
			      playRec((recLink[currMed] + "?pos=time." + position));
			}
	break;
    case KEY_7:
	position += (mediaPlayer.getPosition()/1000) - 240;
	if (position <= 0) { position = 0;} 
			if (get_recordings == 1) {
			      playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
			} else if (get_recordings == 2) {
			      playRec((recLink[currMed] + "?pos=time." + position));
			}
	break;

    case KEY_5:
	if (recMark.length>posMark && get_recordings == 1) {	
		position = recMark[posMark]; 
		playRec(recLink[currMed] + "?mode=streamtoend&time=" + position); 
	}
	break;
    case KEY_2:
	if (posMark>0 && get_recordings == 1) {	
		posMark -= 1;
		position = recMark[posMark]; 
		playRec(recLink[currMed] + "?mode=streamtoend&time=" + position); 
	}
	break;
    case KEY_8:
	if (recMark[posMark+1] && get_recordings == 1) {	
		posMark += 1;
		position = recMark[posMark]; 
		playRec(recLink[currMed] + "?mode=streamtoend&time=" + position); 
	}
	break;



    case KEY_3:
	position += (mediaPlayer.getPosition()/1000) + 30;
	if (get_recordings == 1) {
		if (position >= recDura[currMed]) {
		 	BackToTV();
		} else {
			playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
		}
	} else if (get_recordings == 2) {
		playRec((recLink[currMed] + "?pos=time." + position));
	}
	break;
    case KEY_6:
	position += (mediaPlayer.getPosition()/1000) + 60;
	if (get_recordings == 1) {
		if (position >= recDura[currMed]) {
		 	BackToTV();
		} else {
			playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
		}
	} else if (get_recordings == 2) {
		playRec((recLink[currMed] + "?pos=time." + position));
	}
	break;
    case KEY_9:
	position += (mediaPlayer.getPosition()/1000) + 240;
	if (get_recordings == 1) {
		if (position >= recDura[currMed]) {
		 	BackToTV();
		} else {
			playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
		}
	} else if (get_recordings == 2) {
		playRec((recLink[currMed] + "?pos=time." + position));
	}
	break;
   case KEY_0:
	position = 0; posMark = 0;
			if (get_recordings == 1) {
			      playRec((recLink[currMed] + "?mode=streamtoend&time=" + position));
			} else if (get_recordings == 2) {
			      playRec((recLink[currMed] + "?pos=time." + position));
			}
	break;

	default:
        break;
  } // end of switch
 } // end of if
}

function getRecList() {
	getVDRstatus();
	MaxInGroup = 14;
	subgroup = 0;
try {
 if (get_recordings ==1) {
	 // get recordings from smartTVWeb
	  xmlhttp=new XMLHttpRequest();
	   xmlhttp.open("GET",(server_ip + recServ + recPath + "?" + new Date().getTime()),false);
	   xmlhttp.send();
	   xmlDoc=xmlhttp.responseXML; 
	   var x=xmlDoc.getElementsByTagName("item");
	   nrMedia = x.length - 1;
	   recTitl.length = 0;
	   rec_lst.length = 0;

	 if (UseNewReclist && recPath == "/recordings.xml") {
	   for (var i=0;i<x.length;i++)
		  { 
			rec_lst[i] = new Array();
			for (var yy=0;yy<9;yy++) { rec_lst[i][yy] = new Array(); }
			  rec_lst[i][0] = (x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue);
			  rec_lst[i][0] = rec_lst[i][0].split("~");
			  rec_lst[i][1] = (x[i].getElementsByTagName("enclosure")[0].getAttribute('url'));
			  rec_lst[i][2] = (x[i].getElementsByTagName("description")[0].childNodes[0].nodeValue);
			  rec_lst[i][3] = (x[i].getElementsByTagName("duration")[0].childNodes[0].nodeValue);
			  rec_lst[i][4] = (x[i].getElementsByTagName("start")[0].childNodes[0].nodeValue);
			  rec_lst[i][5] = (x[i].getElementsByTagName("isnew")[0].childNodes[0].nodeValue);
			  rec_lst[i][6] = (x[i].getElementsByTagName("guid")[0].childNodes[0].nodeValue);
			  //Get channel number from recordings, shows right names only if server & client use same channel order
			  recDummy = rec_lst[i][6].split(".");
			  recDummy = recDummy[(recDummy.length-2)].split("-");
			  rec_lst[i][7] = recDummy[0] + "\uE003-\uE003" + channelsnames[(recDummy[0])];
			  rec_lst[i][8] = protChn[Number(Left((recDummy[0] / 1000),1))];

	 }

	  //Get channel number from recordings
		rec_lst.sort();
	   	for (var i=0;i<x.length;i++) {
			recTitl[i] = rec_lst[i][0];
			recLink[i] = rec_lst[i][1];
			recDesc[i] = rec_lst[i][2];
			recDura[i] = rec_lst[i][3];
			recStrt[i] = rec_lst[i][4];
			rec_New[i] = rec_lst[i][5];
			recGUID[i] = rec_lst[i][6];
			recChan[i] = rec_lst[i][7];
			recProt[i] = rec_lst[i][8];
		}
		recProt[i] = 1;
	 } else {

	 // old recordings list function
	 // also used for media listing

	   for (var i=0;i<x.length;i++) { 
	          recTitl[i] = (x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue);
	          recTitl[i] = recTitl[i].split("~");
	 //          recLink[i] = (x[i].getElementsByTagName("link")[0].childNodes[0].nodeValue);
	          recLink[i] = (x[i].getElementsByTagName("enclosure")[0].getAttribute('url'));
	          recDesc[i] = (x[i].getElementsByTagName("description")[0].childNodes[0].nodeValue);
	          recDura[i] = (x[i].getElementsByTagName("duration")[0].childNodes[0].nodeValue);
	          recStrt[i] = (x[i].getElementsByTagName("start")[0].childNodes[0].nodeValue);
	          rec_New[i] = (x[i].getElementsByTagName("isnew")[0].childNodes[0].nodeValue);
	          recGUID[i] = (x[i].getElementsByTagName("guid")[0].childNodes[0].nodeValue);
	                if (recPath == "/recordings.xml") {
	                  //Get channel number from recordings
	                  recDummy = recGUID[i].split(".");
	                  recDummy = recDummy[(recDummy.length-2)].split("-");
	                  recChan[i] = recDummy[0] + "\uE003-\uE003" + channelsnames[(recDummy[0])];
	                  recProt[i] = protChn[Number(Left((recDummy[0] / 1000),1))];
	                } else {
	                  //Media directory
	                  recChan[i] = "Media File";
	                  recProt[i] = 0; // No protection for Media Files.
	                }
	         }
	// try to fix display double entries in the last directory. (Only shown for some time after deleting files, should be fixed now)
	recProt[i] = 1;
   }
} else if (get_recordings == 2) {
//get recordings from streamdev
//no media directory or delete support
  xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + StreamPort + "recordings.rss?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("item");
   nrMedia = x.length - 1;
   recTitl.length = 0;

   for (var i=0;i<x.length;i++)
	  { 
			  rec_lst[i] = new Array();
			  for (var yy=0;yy<9;yy++) { rec_lst[i][yy] = new Array(); }
			  rec_lst[i][0] = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
			  rec_lst[i][0] = rec_lst[i][0].split("~");
			  rec_lst[i][0][0] = Right(rec_lst[i][0][0], (rec_lst[i][0][0].length - 18));
				if (Left(rec_lst[i][0][0],1) == " ") {
					rec_lst[i][0][0] = Right(rec_lst[i][0][0], (rec_lst[i][0][0].length - 1));
				}
				if (Left(rec_lst[i][0][0],1) == " ") {
					rec_lst[i][0][0] = Right(rec_lst[i][0][0], (rec_lst[i][0][0].length - 1));
				}

			  rec_lst[i][1] = x[i].getElementsByTagName("enclosure")[0].getAttribute('url');
			  rec_lst[i][2] = "";
			  rec_lst[i][3] = "";
			  rec_lst[i][4] = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
			  rec_lst[i][4] = rec_lst[i][4].split(" ");
			  rec_lst[i][4] = rec_lst[i][4][1] + " " + rec_lst[i][4][2];
			  rec_lst[i][5] = "";
			  rec_lst[i][6] = x[i].getElementsByTagName("link")[0].childNodes[0].nodeValue;
			  rec_lst[i][7] = 0;
			  rec_lst[i][8] = 0;
	 }

		rec_lst.sort();
	   	for (var i=0;i<x.length;i++) {
			recTitl[i] = rec_lst[i][0];
			recLink[i] = rec_lst[i][1];
			recDesc[i] = rec_lst[i][2];
			recDura[i] = rec_lst[i][3];
			recStrt[i] = rec_lst[i][4];
			rec_New[i] = rec_lst[i][5];
			recGUID[i] = rec_lst[i][6];
			recChan[i] = rec_lst[i][7];
			recProt[i] = rec_lst[i][8];
		}


	recProt[i] = 1;
} else if (get_recordings == 0) {
	 // get recordings from restfulapi
	  xmlhttp=new XMLHttpRequest();
	   xmlhttp.open("GET",(server_ip + RestFulAPI + "/recordings.xml?" + new Date().getTime()),false);
	   xmlhttp.send();
	   xmlDoc=xmlhttp.responseXML; 
	   var x=xmlDoc.getElementsByTagName("recording");
	   nrMedia = x.length - 1;
	   recTitl.length = 0;
	   rec_lst.length = 0;

	 if (UseNewReclist) {
	   for (var i=0;i<x.length;i++)
		  { 
			rec_lst[i] = new Array();
			for (var yy=0;yy<9;yy++) { rec_lst[i][yy] = new Array(); }
			  rec_lst[i][0] = x[i].getElementsByTagName("param")[1].childNodes[0].nodeValue;
			  rec_lst[i][0] = rec_lst[i][0].split("~");
			  rec_lst[i][1] = x[i].getElementsByTagName("param")[2].childNodes[0].nodeValue;
			  rec_lst[i][2] = x[i].getElementsByTagName("param")[13].textContent; 
			  rec_lst[i][3] = x[i].getElementsByTagName("param")[8].childNodes[0].nodeValue;
			  rec_lst[i][4] = x[i].getElementsByTagName("param")[14].childNodes[0].nodeValue;
			  rec_lst[i][5] = x[i].getElementsByTagName("param")[4].childNodes[0].nodeValue;
			  rec_lst[i][6] = x[i].getElementsByTagName("param")[0].childNodes[0].nodeValue;
			  //Get channel number from recordings, shows right names only if server & client use same channel order
			  recDummy = rec_lst[i][1].split(".");
			  recDummy = recDummy[(recDummy.length-2)].split("-");
			  rec_lst[i][7] = recDummy[0] + "\uE003-\uE003" + channelsnames[(recDummy[0])];
			  rec_lst[i][8] = protChn[Number(Left((recDummy[0] / 1000),1))];

	 }

	  //Get channel number from recordings
		rec_lst.sort();
	   	for (var i=0;i<x.length;i++) {
			recTitl[i] = rec_lst[i][0];
			recLink[i] = rec_lst[i][1];
			recDesc[i] = rec_lst[i][2];
			recDura[i] = rec_lst[i][3];
			recStrt[i] = rec_lst[i][4];
			rec_New[i] = rec_lst[i][5];
			recGUID[i] = rec_lst[i][6];
			recChan[i] = rec_lst[i][7];
			recProt[i] = rec_lst[i][8];
		}
		recProt[i] = 1;
	 } else {

	 // old recordings list function
	 // also used for media listing

	   for (var i=0;i<x.length;i++) { 
	          recTitl[i] = (x[i].getElementsByTagName("param")[1].childNodes[0].nodeValue);
	          recTitl[i] = recTitl[i].split("~");
	          recLink[i] = (x[i].getElementsByTagName("param")[2].childNodes[0].nodeValue);
	          recDesc[i] = (x[i].getElementsByTagName("param")[13].childNodes[0].nodeValue);
	          recDura[i] = (x[i].getElementsByTagName("param")[8].childNodes[0].nodeValue);
	          recStrt[i] = (x[i].getElementsByTagName("param")[14].childNodes[0].nodeValue);
	          rec_New[i] = (x[i].getElementsByTagName("param")[4].childNodes[0].nodeValue);
	          recGUID[i] = (x[i].getElementsByTagName("param")[0].childNodes[0].nodeValue);
	                  //Get channel number from recordings
	                  recDummy = recLink[i].split(".");
	                  recDummy = recDummy[(recDummy.length-2)].split("-");
	                  recChan[i] = recDummy[0] + "\uE003-\uE003" + channelsnames[(recDummy[0])];
	                  recProt[i] = protChn[Number(Left((recDummy[0] / 1000),1))];
	         }
	// try to fix display double entries in the last directory. (Only shown for some time after deleting files, should be fixed now)
	recProt[i] = 1;
   }

}

//end of get_recordings
	if (ShowSubDir) {
		MakeRecList2();
	} else {
		MakeRecList();
	}
	if (i!==0) { getRecOK = 1; } else {
	getRecOK = 0;
	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[38] + "</center><pre>\n\n\n" + Lang[37] + "</pre></h1>";
	}
  } catch(e) {
    alert("Get Recordings problem: " + e);
	getRecOK = 0;
	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[38] + "</center><pre>\n\n\n" + Lang[39] + "</pre></h1>";
  }
}


function GetMarks() {

if (get_marks==1) {
 try {
   posMark = 0;
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + recServ + "/getMarks.xml?guid=" + recGUID[currMed] + "&" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML;
   recMark = [];
   var x=xmlDoc.getElementsByTagName("mark");
	   for (var i=0;i<x.length;i++)
		{
		var y = x[i].childNodes[0].nodeValue.split(",");
		recMark[i] = Number(y[0]);
		}
  } catch(e) {
    alert("Getting Marks problem: " + e);
  }
 } else {
  try {
   posMark = 0;
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/recordings/" + currMed + ".xml?marks=true&" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML;
   recMark = [];
   var x=xmlDoc.getElementsByTagName("mark");
	   for (var i=0;i<x.length;i++)
		{
		var y = x[i].childNodes[0].nodeValue.split(":");
		recMark[i] = Number(y[0]*3600) + Number(y[1]*60) + Number(y[2]);
		}
  } catch(e) {
    alert("Getting Marks problem: " + e);
  }
 }
}


function setResume() {
if (get_recordings == 1) {
try {
	position += (mediaPlayer.getPosition()/1000)
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("POST", server_ip + recServ + "/setResume.xml?guid=" + recGUID[currMed] + "&resume=" + position, false);
        xmlhttp.send();
	recList[currMed] = "\uE003" + recList[currMed].substring(1);
  } catch(e) {
    alert("Setting Resume problem: " + e);
  }
}
}

function getResume() {
position = 0;
if (get_recordings == 1) {
try {
	  var xmlhttp = new XMLHttpRequest();
	  var i = 0;
	  xmlhttp.open("GET", server_ip + recServ + "/getResume.xml?guid=" + recGUID[currMed] + "&" + new Date().getTime(), false);
	  xmlhttp.send();
	  xmlDoc=xmlhttp.responseXML; 
	  i = xmlDoc.getElementsByTagName("resume")[0].childNodes[0].nodeValue.split(",");
	  position = Number(i[0]);
  } catch(e) {
    alert("Getting Resume problem: " + e);
  }
}
}


function setResumeNull() {
if (get_recordings == 1) {
try {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("POST", server_ip + recServ + "/setResume.xml?guid=" + recGUID[currMed] + "&resume=0", false);
        xmlhttp.send();
	recList[currMed] = "\uE010" + recList[currMed].substring(1);
  } catch(e) {
    alert("Setting Resume problem: " + e);
  }
}
}

function reccmds(option) {
try {
	option = Number(option);
	if (RecCmds[option] > -1 ) {
	        var xmlhttp = new XMLHttpRequest();
	        xmlhttp.open("POST", server_ip + recServ + "/execreccmd?cmd=" + RecCmds[option] + "&guid=\"" + recGUID[currMed] + "\"", false);
	        xmlhttp.send();
		recList[currMed] = RecCmdsIcon[option] + recList[currMed].substring(1);
		showMediaList();
	}
  } catch(e) {
    alert("Execute reccmds problem: " + e);
  }

}



function CheckPlugins() {
try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + recServ + "/vdrstatus.xml?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
	smartTVplugin = 1;
  } catch(e) {
    alert("NO smartTVplugin: " + e);
	smartTVplugin = 0;
  }

//Check for Restfulapi

try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/info.xml?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
    Restfulapiplugin = 1;
  } catch(e) {
    alert("NO Restfulapiplugin: " + e);
    Restfulapiplugin = 0;
  }
}

function getVDRstatus() {
if (smartTVplugin == 1) {
try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + recServ + "/vdrstatus.xml?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
//   var x=xmlDoc.getElementsByTagName("vdrstatus");
   var x=xmlDoc.getElementsByTagName("diskspace");
	  free_space = x[0].getElementsByTagName("free")[0].childNodes[0].nodeValue;
	  perc_space = x[0].getElementsByTagName("percent")[0].childNodes[0].nodeValue;
  } catch(e) {
    alert("Get VDR Status problem: " + e);
  }
}
if (smartTVplugin == 0 && Restfulapiplugin == 1) {
try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/info.xml?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("diskusage");
	  free_space = x[0].getElementsByTagName("free_mb")[0].childNodes[0].nodeValue;
	  perc_space = x[0].getElementsByTagName("used_percent")[0].childNodes[0].nodeValue;
  } catch(e) {
    alert("Get VDR Status problem: " + e);
  }
 }
}


function DelRec() {
if (get_recordings == 1) {
	if (osdepginfo.style.opacity == 1) {osdepginfo.style.opacity = 0;}
try {
	//popup for confirm
	switchtimer.style.opacity = 1;
	switchtimer.innerHTML = "<pre><center>" + Lang[44] +"\n" + Lang[45] + "\n\n " + Left(recTitl[currMed],30) + "</center></pre>"; // Recording Name
	DelisOK = 1
  } catch(e) {
    alert("Delete Recordings problem: " + e);
  }
}
}

function DelRec2() {
try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("POST",(server_ip + recServ + "/deleteRecording.xml?id=" + recGUID[currMed] ),false);
   xmlhttp.send();
   recList[currMed] = "";
   recGroup[currMed] = -1;
   recProt[currMed] = 0;
  } catch(e) {
    alert("Delete Recordings problem: " + e);
  }
}




function MakeRecList() {
//old style list
   var x = "";
   var xx = "";
   for (var i=0;i<recTitl.length;i++)
	{
	if (recTitl[i][recMap + 2]) { 
		if (recTitl[i][recMap + 1] != xx) {
						var y = recTitl[i][recMap].length + 1;
						if (recTitl[i][recMap] != x) {
								recList[i] = "\uE002 " + recTitl[i][recMap] + " \uE002 " + String(recTitl[i]).substring(y);
							} else {
								recList[i] = "\uE003 " + new Array(y).join("\uE003") + " \uE002 " + String(recTitl[i]).substring(y);
							}
					} else {
						var y = recTitl[i][recMap + 1].length + recTitl[i][recMap].length + 4;
						recList[i] = new Array(y).join("\uE003") + String(recTitl[i]).substring(y - 2);
						}
	} else if (recTitl[i][recMap + 1]) { 
					if (recTitl[i][recMap] != x) {
						recList[i] = "\uE002" + recTitl[i];
					} else {
						var y = recTitl[i][recMap].length + 4;
						recList[i] = new Array(y).join("\uE003") + String(recTitl[i]).substring(y - 3);
					}
				} else { 
					recList[i] = "\uE003" + recTitl[i];
				}
	if (get_recordings == 2 ) {
		result = recStrt[i];
	} else{ 
		AddInfo(i);
	}

	if (rec_New[i] == "true" ) 
		{ 
		recList[i] = "\uE010" + result + "\uE003" + recList[i]; 
		} else { 
		recList[i] = "\uE003" + result + "\uE003" + recList[i]; 
		}
	x = recTitl[i][recMap];
	xx = recTitl[i][recMap + 1];
	if ((recProt[i] == 1) && (ShowProtectedChannels == 1)) { recList[i] = "";}
	}
}

function MakeRecList2() {
//new style with sub maps
   var x = "";
   var xx = 0;
   for (var i=0;i<recTitl.length;i++)
	{
	 if (recTitl[i][1]) { 
					if (recTitl[i][0] != x) {
						
						recList[i] = "\uE002\uE003" + recTitl[i][0];
						xx += 1;
					} else {
						recList[i] = "" ; 
					}
					recGroup[i] = xx;
				} else { 
					recGroup[i] = 0;
						if (get_recordings == 2 ) {
							result = recStrt[i];
						} else{ 
							AddInfo(i);
							result += "\uE003" + (recDura[i]/60).toFixed(0);
						}
						if (rec_New[i] == "true" ) { 
							recList[i] = "\uE010" + result + "\uE003" + recTitl[i]; 
						} else { 
							recList[i] = "\uE003" + result + "\uE003" + recTitl[i];
						}
				}

	if ((recProt[i] == 1) && (ShowProtectedChannels == 1)) { recList[i] = "";}

	x = recTitl[i][0];
	}
}

function MakeRecList3(GroupID) {
   MaxInGroup = -1;
   for (var i=0;i<recTitl.length;i++)
	{
		if (recGroup[i] == GroupID) {
			var tmp = "";
			   for (var ii=1;ii<recTitl[i].length;ii++)
				{
				tmp += "\uE003" + recTitl[i][ii];
				}
			if (get_recordings == 2 ) {
				result = recStrt[i];
			} else{ 
				AddInfo(i);
				result += "\uE003" + (recDura[i]/60).toFixed(0);
			}
			if (rec_New[i] == "true" ) { 
				recList[i] = "\uE010" + result + tmp; // recTitl[i]; 
			} else { 
				recList[i] = "\uE003" + result + tmp; //recTitl[i]; 
			}

			MaxInGroup = MaxInGroup + 1;
			if ((recProt[i] == 1) && (ShowProtectedChannels == 1)) { recList[i] = "";}

		} else {
			recList[i] = "" ; 
		}
	}
}

function AddInfo(info) {
//Add Date to item
        date = new Date(Number(recStrt[info])*1000);
        year = date.getFullYear();
        month = date.getMonth();
        d = date.getDate();
        h = date.getHours();
        m = date.getMinutes();
	month=addzero(month + 1);
	d=addzero(d);
	h=addzero(h);
	m=addzero(m);
	if ( year==1970 ) { 
		result = "\uE003";
	} else {
	        result = "\uE003" + d + '-' + month + '-' + year + ' ' + h + ':' + m;
	}
//
}

function showMediaList() {
	if (osdepginfo.style.opacity == 1) {osdepginfo.style.opacity = 0;}
	osdmedia.style.opacity = 0;
	osdtime.style.opacity = 0;
	var liststyle = "";
	listMed = currMed - 1;
	var MaxMed = -1;

	if (getRecOK == 1) {
		var htmlstring = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[38] + "(" + Lang[46] + (100 - perc_space) + "%, " + (free_space/1024).toFixed(0) + " GB) </center></h1><table border='0'><tr>";

		if (subgroup) { 
			if (MaxInGroup < 14){ MaxMed = MaxInGroup; } else {MaxMed = 14; }
		}
		if (!subgroup) { 
			for(var i=0; i<=nrMedia; i++) {
				if (recList[i]) { MaxMed += 1;}
			}
		}

	} else {

		if (nrMedia < 14) {MaxMed = nrMedia; } else {MaxMed = 14; }
		var htmlstring = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[11] + channelsnames[currChan] + " </center></h1><table border='0'><tr>";
	}

	if (MaxMed > 14) { MaxMed = 14; }
	if (MaxMed < 0 ) { MaxMed = 0; }

	for(var i=currMed; i<=currMed + MaxMed; i++) {
		if (listMed>=nrMedia) { listMed= -1; }
		if (listMed<-1) { listMed=nrMedia - 1; } 
//		if (listMed>nrMedia) { listMed= -1; }

		do
			{
				listMed += 1;
			}
		while (!recList[listMed] && (listMed<=nrMedia));

		if ( listMed == currMed) { 
			liststyle = " style='background:" + color_bg + ";-webkit-border-radius:25px;";
		}  else {
			liststyle = " style='";
		}
		
//		alert(recList[listMed]);
//		alert(listMed + " : " + nrMedia);
		if (listMed > nrMedia) { recList[listMed] = ""; }

		if (recList[listMed]) {
		//Solves empty string at the end.
		htmlstring += "<td" + liststyle + "font-size:" + fsReclist + ";'>\uE003" + Left(recList[listMed],60) + "\uE003\uE003</td></tr>";
		}
	}
	mediaList.innerHTML = htmlstring + "</table>";
	//ShowInfo();
}

function getServerSchedule() {
try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/events/" + channels[currChan] + ".xml?timespan=" + serverEPGdays + "&" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("event");
   nrMedia = x.length - 1;
   for (var i=0;i<x.length;i++)
	  { 

/*	// restful api layout dd 10/04/2013
	// <event>
	// 1 <param name="id">516</param>
	// 2 <param name="title">Thuis</param>
	// 3 <param name="short_text"/ >
	// 4 <param name="description">Soapserie (BE).</param>
	// 5 <param name="channel">S19.2E-53-1105-4016</param>
	// 6 <param name="channel_name">BVN (S)</param>
	// 7 <param name="start_time">1365608700</param>
	// 8 <param name="duration">1500</param>
	// 9 <param name="table_id">78</param>
	// 10 <param name="version">7</param>
	// 11 <param name="parental_rating">0</param>
	// 12 <param name="vps">0</param>
	// 13 <param name="images">0</param>
	// 14 <param name="components">
	//	<component stream="1" type="1" language="dut" description="4:3"/ >
	//	<component stream="2" type="1" language="dut" description=""/ ></param>
	// 15 <param name="contents">
	// 16 <content name="Soap/Melodrama/Folkloric"/ ></param>
	// 17 <param name="raw_contents"><raw_content name="21"/ ></param>
	// 18 <param name="timer_exists">false</param>
	// 19 <param name="timer_active">false</param>
	// 20 <param name="timer_id"/ >
	// </event>
*/

	recTitl[i] = x[i].getElementsByTagName("param")[1].childNodes[0].nodeValue;
		try { 
			recDesc[i] = x[i].getElementsByTagName("param")[3].childNodes[0].nodeValue; 
		} catch(e) {
			recDesc[i] = "";
		}
	recDura[i] = x[i].getElementsByTagName("param")[7].childNodes[0].nodeValue;
	recStrt[i] = x[i].getElementsByTagName("param")[6].childNodes[0].nodeValue;
	recChan[i] = currChan + "\uE003-\uE003" + channelsnames[currChan];
	recGUID[i] = x[i].getElementsByTagName("param")[0].childNodes[0].nodeValue;

        date = new Date(Number(recStrt[i])*1000);
	        year = date.getFullYear();
	        month = date.getMonth();
	        d = date.getDate();
        	day = date.getDay();
	        h = date.getHours();
	        m = date.getMinutes();
		h=addzero(h);
		m=addzero(m);
	recList[i] = ''+days[day]+' '+d+' '+months[month]+' '+year+' '+h+':'+m + " " + recTitl[i];

	  }
 	getRecOK = 2;
  } catch(e) {
    alert("Get EPG problem: " + e);
	getRecOK = 0;
	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[50] + "</center><pre>\n\n\n" + Lang[51] + "</pre></h1>";
  }
}

function getSchedule(schchan){
	SI = "";
	recTitl.length = 0;
	nrMedia = 0;
  try {
	 StreamInfo(schchan);

	 eitService = toi.statics.ToiDvbEitCacheServiceItem.create(SI[1],SI[2],SI[3]);
	 eitCache.addService(eitService);
	 event = eitCache.getPresentEvent(eitService);
	 events = eitCache.getEvents(eitService, (Math.round(new Date().getTime()/1000.0)), 2000000000);

	if (event.name)	{
	    if (events.more) {
	      var t = eitCache.getEvents(eitService, (Math.round(new Date().getTime()/1000.0)), 2000000000);
	      events.infoSequence.concat(t.infoSequence);
	      events.more = t.more;
	    }
	    nrMedia = events.infoSequence.length - 1;
	    for (var i = 0; i < events.infoSequence.length; i++) {

		// Double info or scrollbar twice on the screen if nrMedia < 14
		while ((i > 0) && (events.infoSequence[i].eventId == events.infoSequence[(i-1)].eventId) && (nrMedia > 14)) {
			recList[i] = "";
			i += 1;
		}

		recTitl[i] = events.infoSequence[i].name;
		recDesc[i] = eitCache.getExtendedEventInfo(eitService,events.infoSequence[i].eventId).extendedInfo;
		if (recDesc[i] == "" ) { recDesc[i] = eitCache.getExtendedEventInfo(eitService,events.infoSequence[i].eventId).shortInfo;}
		recDura[i] = events.infoSequence[i].duration;
		recStrt[i] = events.infoSequence[i].time;
		recChan[i] = schchan + "\uE003-\uE003" + channelsnames[schchan];
		recGUID[i] = events.infoSequence[i].eventId;

	        date = new Date(Number(recStrt[i])*1000);
		        year = date.getFullYear();
		        month = date.getMonth();
		        d = date.getDate();
	        	day = date.getDay();
		        h = date.getHours();
		        m = date.getMinutes();
			h=addzero(h);
			m=addzero(m);
			recList[i] = ' ' + days[day] + ' ' + d + ' ' + months[month] + ' ' + year + " " + h + ":" + m + " (" + (recDura[i]/60).toFixed(0) + ") " + Left(recTitl[i],30);
		}
	getRecOK = 2;
	} else {
	getRecOK = 0;

	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[11] + "</center><pre>\n\n\n" + Lang[52] + "</pre></h1>";

	if (experimental) {
	mediaList.innerHTML += "<img src='" + channels[schchan] + ".jpg' style='width:100%; position:absolute; left:0%; top:-11%;'>";
	}

	}
  } catch(e) {
	getRecOK = 0;
	mediaList.innerHTML = "<h1><center style='font-size:" + fsRec + ";" + color_main_head + ";'>" + Lang[11] + "</center><pre>\n\n\n" + Lang[53] + "</pre></h1>";
  }

}



function incMed(step) {
    currMed += step;
    if (currMed > nrMedia ) {
        currMed = 0;
    }
}

function decMed(step) {
    currMed -= step;
    if (currMed < 0) {
        currMed = nrMedia;
    }
}

function playRec(uri) {
  try {
    if (mediaPlayer.getState() != mediaPlayer.STATE_IDLE) {
      mediaPlayer.close();
    }
	if (osdepginfo.style.opacity == 1) {osdepginfo.style.opacity = 0;}
	mediaPlayer.open(uri);
	mediaPlayer.play(1000);
	showDisplay("PLAY", false, 100, 0 );
  } catch (e) {
    alert("Failed opening recording: " + e);
    return;
  }
}


function pauseRec(uri) {
  try {
    if (mediaPlayer.getState() != mediaPlayer.STATE_IDLE) {
      mediaPlayer.close();
    }
	if (osdepginfo.style.opacity == 1) {osdepginfo.style.opacity = 0;}
	mediaPlayer.open(uri);
	mediaPlayer.play(0);
	showDisplay("PAUS", false, 100, 0 );
  } catch (e) {
    alert("Failed opening recording: " + e);
    return;
  }
}



function createNewAsset() {
	try {
		assetId = ams.createAsset(ams.ASSET_PVR);
		alert("Created " + assetId);
	} catch(e) {
		alert("Couldn't create asset: " + e);
	}
}

function recordStart(uri) {
	alert("opening mediaRecorder...");
	createNewAsset();
	try {
		mediaRecorder.open(uri, assetId);
	} catch(e) {
		alert("Cannot open mediaRecorder. " + e);
	}

	try {
		mediaRecorder.record();
		isRecording = 1;
	} catch(e) {
		alert("Cannot record! " + e);
	}
}


function recordStop() {
	try {
		mediaRecorder.close();
		isRecording = 0;
	} catch(e) {
		alert("Cannot stop mediaRecorder! " + e);
	}
}

function onStateChanged(ev) {
//    alert("Media player state changed: state=" + ev.state + ", reason=" + ev.reason + ", code=" + ev.code);

	if ( ( ev.state == 6 && ev.reason == "HostUnreachable" ) || ( ev.state == 2 && ev.reason == "PositionEnd" )) {
	BackToTV();
	}

}

// Start recording/ timeshift

function ServerRecordStart() {
//Record current program

	try {
	   xmlhttp=new XMLHttpRequest();
	   xmlhttp.open("GET",(server_ip + recServ + "/addTimer?guid=" + channels[currChan] + "&" + new Date().getTime() ),false);
	   xmlhttp.send();

		if (xmlhttp.responseXML == null) {
		    //settimer(EPG[NowNext][2][currChan],Lang[55],0,2);
		    //Timer not set, try direct recording
		    ServerRecord();
		    settimer(0,Lang[57],0,2);
		} else {
		   settimer(EPG[NowNext][2][currChan],EPG[NowNext][1][currChan],0,2);
		}

	  } catch(e) {
	    alert("Sending Timers to server problem: " + e);
	    settimer(0,Lang[55],0,2);
	  }

}


function ServerRecord() {
//Instant record on server

  try {
	xmlhttp=new XMLHttpRequest();
	//switch server to current channel
	xmlhttp.open("POST",(server_ip + RestFulAPI + "/remote/switch/" + channels[currChan]),true);
	xmlhttp.send();
	//start recording
	setTimeout("xmlhttp.open('POST',(server_ip + RestFulAPI + '/remote/Record'),false);xmlhttp.send();",5000);
  } catch(e) {
   alert("Sending key to server problem: " + e);
   settimer(0,Lang[55],0,2);
  }

//end of function
}



function ServerPause() {
//Instant pause on server
	ServerRecord();
	settimer(EPG[NowNext][2][currChan],Lang[70],0,2);
	setTimeout("getPauseFile();",6000);
//end of function
}




function getPauseFile() {

try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + RestFulAPI + "/recordings.xml?" + new Date().getTime()),false);
   xmlhttp.send();
   xmlDoc=xmlhttp.responseXML; 
   var x=xmlDoc.getElementsByTagName("recording");
   nrMedia = x.length - 1;
   for (var i=0;i<x.length;i++)
	  { 
	var xx = x[i].getElementsByTagName("param")[2].childNodes[0].nodeValue.split(".");
	xx = xx[(xx.length-2)].split("-");

	if ( xx[0] == currChan ) {
		recLink[0] = server_ip + recServ + x[i].getElementsByTagName("param")[2].childNodes[0].nodeValue;
		}

	 }

  } catch(e) {
    alert("Get Recordings problem: " + e);
  }
	getRecOK = 0;
	recDura[0] = 0; // 3600;// set to 1 hour
	LoadMediaSettings();// sets currMed to 0
	recTitl[0] = "Time Shift File"
	position = 0;
	pauseRec(recLink[0]);

}



function ServerTimer(guid,evid) {

try {
   xmlhttp=new XMLHttpRequest();
   xmlhttp.open("GET",(server_ip + recServ + "/addTimer?guid=" + guid + "&evid=" + evid + "&" + new Date().getTime() ),false);
   xmlhttp.send();
  } catch(e) {
    alert("Sending Timers to server problem: " + e);
  }


}



function BackToTV() {
	    play(channels[currChan]);
	    if (isPause == 1) { 
		UnloadMediaSettings(); 
	    } else {
	    	mediaList.style.opacity = 0.9;
	    	showDisplay("STOP", false, 100, 0 );
	    	showMediaList();
		AvInfo.length = 0;
	    }
}


function onRecorderStateChanged(event) {
//  alert("EVENT! " + event.reason + " *** " + event.state);
  RECicon = "\uE003"; // 0xE003 0x83 Fixed width blank
  switch (event.state) {
    case mediaRecorder.STATE_IDLE:
	//  "STATE_IDLE";
      break;
    case mediaRecorder.STATE_CONNECTING:
	//  "STATE_CONNECTING";
      break;
    case mediaRecorder.STATE_PAUSED:
	//  "STATE_PAUSED";
      break;
    case mediaRecorder.STATE_RECORDING:
	//  "STATE_RECORDING";
	RECicon = "\uE00B"; // 0xE00B 0x8B REC
      break;
    case mediaRecorder.STATE_FAILED:
	//  "STATE_FAILED";
	recordStop();
      break;
  }

}

function ShowMediaOSD() {
if (get_recordings == 1) {
	// Display Name/ length 
	var pos = position + (mediaPlayer.getPosition()/1000);
	var pos2 = (pos / Number(recDura[currMed])) * 100;
	if (pos2 < 1) { pos2 = 1;} 
	if (pos2 >100) {pos2 = 100;} // in case of viewing while still recording.
	if (pos>recMark[posMark] && recMark.length-1>posMark) { posMark += 1;}
	pos2 = ((pos2 * 140) / 100).toFixed(0);  // make it 40% bigger
	var pos5 = "\uE007" + new Array(pos2 - 1).join("\uE008") + new Array(140 - pos2).join("\uE009") + "\uE00A"
	var pos4 = "";
	var pos6 = pos5;
	var fontc = color_progress1;
	var x = 0;
	  for (var i=0; i<recMark.length; i++) {
		var pos3 = recMark[i] / Number(recDura[currMed]) * 100;
		pos3 = ((pos3 * 140) / 100).toFixed(0); // make it 40% bigger
		pos4 += fontc + Left(pos6,pos3 - x);
		if (fontc == "</font>" + color_progress2) { fontc = "</font>" + color_progress1; } else { fontc = "</font>" + color_progress2;}
		x = pos3;
		pos6 = Right(pos5,140 - pos3);
		}
	pos4 += "</font>" + color_progress1 + pos6 + "</font>";
	var x = (Number(recDura[currMed])/60).toFixed(0);
	if (pos/60 > x) { x = (pos/60).toFixed(0);}
	date_time();
	osdtime.innerHTML = result;
	date_time_rec();
	osdmedia.innerHTML = "<pre style='" + color_media_osd + ";font-size:" + fsMedia +";'> \n  " + (pos/60).toFixed(0) + " / " + x + "  " + Left(recTitl[currMed],40) + "\n  " + pos4 + "\n " + result + " </pre>";
} else if ( get_recordings == 2) {
	var pos = position + (mediaPlayer.getPosition()/1000);
	date_time();
	osdtime.innerHTML = result;
	osdmedia.innerHTML = "<pre style='" + color_media_osd + ";font-size:" + fsMedia +";'> \n  " + (pos/60).toFixed(0) + " \n " + Left(recTitl[currMed],40) + "\n  \n " + recStrt[currMed] + " </pre>";
}
}

function ShowInfo() {
//Like Show EPG Info
        date = new Date(Number(recStrt[currMed])*1000);
        year = date.getFullYear();
        month = date.getMonth();
        d = date.getDate();
        day = date.getDay();
        h = date.getHours();
        m = date.getMinutes();
	h = addzero(h);
	m = addzero(m);
        result = '' + days[day] + ' ' + d + ' ' + months[month] + ' ' + year + ' ' + h + ':' + m;
	if ( mediaList.style.opacity == 0 ) { updateStreamInfo(currMed);} else { AvInfo[currMed] = "";}

	if (year!==1970) { 	
       		osdepginfo.innerHTML = "<center><pre style='" + color_epg_head + ";'>" + Left(recTitl[currMed],60) 
					+ "</pre><p style='" + color_epg_avinfo + ";'>" + AvInfo[currMed] 
					+ "</p><pre style='" + color_epg_title + ";'> " + result + "\n " 
					+ (recDura[currMed] / 60).toFixed(0) + Lang[54] + "\n " + recChan[currMed] + "  "
					+ "\n </pre><p style='" + color_epg_info + ";'>" + Left(recDesc[currMed],750) + "</p></center>";
	} else {
		//info for non-vdr recordings
	       	osdepginfo.innerHTML = "<center><pre style='" + color_epg_head + ";'>" + Left(recTitl[currMed],60) 
					+ "\n </pre><p style='" + color_epg_avinfo + ";'>" + AvInfo[currMed] + " " + "\n \n </p></center>";
	}
}

function onScheduledStart(event) {
  // event is of type ToiSchedulerServiceBooking, see docs
    var timertype = event.booking.category;

  if ( timertype == "SwitchOnly") {
	ClearScreen();
	isFullscreen = 1; FullScreen(); 
	isVisible = 0; setVisible(isVisible); 
	setOSDtimer();

	//Switch from recordings
	if (isMediaMenu) { 
		if (mediaList.style.opacity == 0) {setResume();} // No mediamenu on screen so set resume.
		UnloadMediaSettings();
	}

	prevChan = currChan;
	currChan = Number(ss.getParameter(event.booking.id, "Channel"));
	ChanGroup = Number(Left((currChan / 1000),1));

	// check if Group isn't protected
	if ((protChn[ChanGroup] == 1) && (ShowProtectedChannels == 1)) {
		currChan = prevChan;
		ChanGroup = Number(Left((currChan / 1000),1));
	}

	// switch only if not already on that channel.
	if (currChan !== prevChan) {
		play(channels[currChan]);
	} 
  } else {
	  try {
	    createNewAsset();

		var recChannr = Number(ss.getParameter(event.booking.id, "Channel"));
		var recGroup = Number(Left((recChannr / 1000),1));
		var recChan = 0;
		if (ServerAdres[recGroup] == "MultiCast" ) {
		 	SI=channels[recChannr].split("-");
			recChan = SI[4];
		} else {
			recChan = ServerAdres[recGroup] + channels[recChannr];
		}

	    mediaRecorder.open(recChan, assetId);

	    var propList = new Array(ams.PROPERTY_SYSTEM_PLAYBACKURI);
	    var properties = ams.getProperties(assetId, propList);
	    var assetURI = properties[0].value;

	    // save the assetId in the booking
	    ss.setParameter(event.booking.id, "assetURI", assetURI);

	    mediaRecorder.record();
	    alert("Recording to " + assetURI);
	  }
	  catch (e) {
	    alert(e);
	  }
	}
}


function onScheduledStop(event) {
    var timertype = event.booking.category;
	if ( timertype == "SwitchOnly") {
	    ss.remove(event.booking.id);
	    setOSDtimer();
	} else {
	  try {
	    mediaRecorder.close();
	  }
	  catch (e) {
	    alert(e);
	  }
	} 

}


function ClearScreen() {
	isSchedule = 0; schedule.style.opacity = 0;
	isSetupMenu = 0;
	epgactive = 0;
	osdepginfonext.style.opacity = 0;
	osdepginfo.style.opacity = 0;
	mainmenu.style.opacity = 0;
}

</script>


<body onload="onLoad()" onunload="onUnload()">
    	<embed type="application/x-motorola-toi" hidden="true">

	<div id="channelList" style="width:100%; height:48%; position:absolute; left:7%; top:4%;;z-index:400;"></div>
	<div id="colorkeys" style="width:100%; position:absolute; left:10%; top:84%;z-index:401;"></div>
	<div id="chanlistepg" style="width:42%; position:absolute; left:7%; top:50%;z-index:402;"></div>

	<videoplane id='videoplane' style='position:absolute;left:0px;top:0px;height:100%;width:100%;z-index:500;'></videoplane>
	<div id="pipVideoDiv" ></div>

	<div id="osdvolume" style="width:63%; position:absolute; left:10%; top:80%;z-index:501;opacity:0;">Volume : </div>
	<div id="osdmedia" style="width:80%;position:absolute;left:10%;top:60%;z-index:505;opacity:0;-webkit-border-radius:50px;"></div>

	<div id="osdmain" style="width:80%; position:absolute;left:10%;top:60%;bottom:9%;z-index:505;-webkit-border-radius:50px;"></div>
	<div id="osdtime" style="width:42%; position:absolute; left:58%; top:63%;z-index:505;"></div>
	<div id="osdname" style="width:69%;height:4%; position:absolute; left:12%; top:66%;z-index:505;"></div>
	<div id="osdepg" style="width:63%; position:absolute; left:21%; top:69%;z-index:505;"></div>
	<div id="osdtimer" style="width:7%; position:absolute; left:12%; top:69%;z-index:505;"></div>
	<div id="osdca" style="width:5%; position:absolute; left:75%; top:67%;z-index:505;"></div>

	<div id="osdnr" style="width:10%;height:9%; position:absolute; left:12%; top:56%;z-index:505;opacity:0;-webkit-border-radius:25px;"></div>

	<div id="schedule" style="width:50%; height:75%; position:absolute; left:25%; top:10%;opacity:0;z-index:510;-webkit-border-radius:50px;"></div>

	<div id="osdmute" style="width:7%; position:absolute; left:76%; top:9%;z-index:515;opacity:0;"><img src="mute.png"></div>
	<div id="osdlang" style="width:7%; position:absolute; left:76%; top:9%;z-index:515;opacity:0;"></div>

	<div id="mainmenu"  style="width:80%; position:absolute; left:10%; top:10%; bottom:10%;z-index:520;opacity:0;-webkit-border-radius:50px;"></div>
	<div id="mediaList" style="width:80%; position:absolute; left:10%; top:10%; bottom:10%;z-index:520;opacity:0;-webkit-border-radius:50px;"></div>

	<div id="switchtimer" style="width:45%; position:absolute; left:21%; top:26%;z-index:530;opacity:0;-webkit-border-radius:25px;"></div>
	<div id="osdepginfo" style="width:80%; position:absolute; left:10%; top:10%;z-index:525;opacity:0;-webkit-border-radius:50px;"></div>
	<div id="osdepginfonext" style="width:80%; position:absolute; left:10%; top:10%;z-index:525;opacity:0;-webkit-border-radius:50px;"></div>
</body>
</html>