3 var doRequestMemory = new Object();
4 var doRequestMemorySave = new Object();
8 var parentControlList = null;
11 var UpdateStreamReaderNextReadPos = 0;
12 var UpdateStreamReaderPollTimer;
13 var UpdateStreamReaderPollTimerCounter = 0;
14 var UpdateStreamReaderPollTimerCounterTwisted = 0;
15 UpdateStreamReaderRequest = null;
16 function UpdateStreamReaderStart(){
17 var ua = navigator.userAgent;
18 if(navigator.userAgent.indexOf("MSIE") >=0) {
19 debug("UpdateStreamReader IE Fix");
22 'url_updates': url_updates
24 $('UpdateStreamReaderIEFixPanel').innerHTML = RND(tplUpdateStreamReaderIE, namespace);
27 UpdateStreamReaderNextReadPos = 0;
29 UpdateStreamReaderRequest = new XMLHttpRequest();
30 UpdateStreamReaderRequest.onload = UpdateStreamReaderOnLoad;
31 UpdateStreamReaderRequest.onerror = UpdateStreamReaderOnError;
32 UpdateStreamReaderRequest.open("GET", url_updates, true);
33 UpdateStreamReaderRequest.send(null);
34 UpdateStreamReaderPollTimer = setInterval(UpdateStreamReaderLatestResponse, 10000);
38 function UpdateStreamReaderLatestResponse() {
39 UpdateStreamReaderPollTimerCounter++;
40 debug(UpdateStreamReaderPollTimerCounter);
41 if(UpdateStreamReaderPollTimerCounter > 6) {
42 clearInterval(UpdateStreamReaderPollTimer);
43 UpdateStreamReaderRequest.abort();
44 UpdateStreamReaderRequest = null;
45 UpdateStreamReaderPollTimerCounter = 0;
46 UpdateStreamReaderStart();
48 UpdateStreamReaderPollTimerCounterTwisted++;
51 var allMessages = UpdateStreamReaderRequest.responseText;
53 var unprocessed = allMessages.substring(UpdateStreamReaderNextReadPos);
54 var messageXMLEndIndex = unprocessed.indexOf("\n");
56 if (messageXMLEndIndex!=-1) {
57 var endOfFirstMessageIndex = messageXMLEndIndex + "\n".length;
58 var anUpdate = unprocessed.substring(0, endOfFirstMessageIndex);
60 var re = new RegExp("<script>parent\.(.*)</script>");
61 anUpdate = re.exec(anUpdate);
64 if (anUpdate.length == 2){
69 UpdateStreamReaderNextReadPos += endOfFirstMessageIndex;
71 if(UpdateStreamReaderNextReadPos > 65000){
72 UpdateStreamReaderRequest.abort();
73 UpdateStreamReaderRequest = null;
74 UpdateStreamReaderPollTimerCounter = 0;
75 UpdateStreamReaderStart();
76 messageXMLEndIndex = -1;
78 } while (messageXMLEndIndex != -1);
81 function UpdateStreamReaderOnLoad(){
82 window.clearInterval(UpdateStreamReaderPollTimer);
83 debug("UpdateStreamReaderOnLoad");
85 "Live Update Stream ends!<br><br>You will not receive any Update from Enigma2.<br>Should I reconnect?",
86 {windowParameters: {width:300, className: windowStyle},
88 buttonClass: "myButtonClass",
89 cancel: function(win) {debug("cancel confirm panel")},
90 ok: function(win) {UpdateStreamReaderStart(); return true;}
94 function UpdateStreamReaderOnError(){
95 // TODO: change this, because it will be called on 'PageUnload' while the request is still running
96 debug("UpdateStreamReaderOnError");
97 window.clearInterval(UpdateStreamReaderPollTimer);
99 "Live Update Stream has an Error!<br><br>You will not receive any Update from Enigma2.<br>Should I try to reconnect?",
100 {windowParameters: {width:300, className: windowStyle},
101 okLabel: "reconnect",
102 buttonClass: "myButtonClass",
103 cancel: function(win) {debug("cancel confirm panel")},
104 ok: function(win) {UpdateStreamReaderStart(); return true;}
108 //end UpdateStreamReader
110 function openWindow(title, inner, width, height, x, y, id){
111 if(id == null) id = new Date().toUTCString();
112 if(x == null) x = 460;
113 if(y == null) y = 400;
114 var win = new Window(id, {className: windowStyle, title: title, width: width, height: height});
115 win.getContent().innerHTML = inner;
116 win.setDestroyOnClose();
118 win.setLocation(y,x);//y=top,x=left
119 debug("opening Window: "+title);
122 function messageBox(t, m){
123 Dialog.alert(m, {windowParameters: {title: t, className: windowStyle, width:200}, okLabel: "Close"});
126 //RND Template Function (http://www.amix.dk)
127 function RND(tmpl, ns) {
128 var fn = function(w, g) {
131 //Support for filter functions
132 for(var i=1; i < g.length; i++) {
133 cnt = eval(g[i])(cnt);
137 return tmpl.replace(/%\(([A-Za-z0-9_|.]*)\)/g, fn);
139 function debug(text){
142 debugWin.getContent().innerHTML += "DEBUG: "+text+"<br>";
143 } catch (windowNotPresent) {}
146 function showhide(id){
148 o.display = (o.display!="none")? "none":"";
150 function set(element, value){
151 //debug(element+"-"+value);
152 element = parent.$(element);
153 if(value.length > 550) {
154 value = value.substr(0,550) + "[...]";
157 element.innerHTML = value;
159 if(navigator.userAgent.indexOf("MSIE") >=0) {
161 elementscript= $('UpdateStreamReaderIEFixIFrame').$('scriptzone');
163 elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory
169 function setComplete(element, value){
170 //debug(element+"-"+value);
171 element = parent.$(element);
173 element.innerHTML = value;
175 if(navigator.userAgent.indexOf("MSIE") >=0) {
176 elementscript= $('UpdateStreamReaderIEFixIFrame').$('scriptzone');
178 elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory
183 var requestcounter = 0;
184 function requestIndicatorUpdate(){
185 //debug(requestcounter+" open requests");
186 if(requestcounter>=1){
187 $('RequestIndicator').style.display = "inline";
189 $('RequestIndicator').style.display = "none";
192 function requestStarted(){
194 requestIndicatorUpdate();
196 function requestFinished(){
198 requestIndicatorUpdate();
200 // end requestindikator
201 function doRequest(url, readyFunction, save){
203 doRequestMemorySave[url] = save;
204 debug("doRequest: Requesting: "+url);
205 if(save == true && typeof(doRequestMemory[url]) != "undefined") {
206 readyFunction(doRequestMemory[url]);
208 debug("doRequest: loading");
209 new Ajax.Request(url,
213 requestHeaders: ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate', 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT'],
214 onException: function(o,e){ throw(e); },
215 onSuccess: function (transport, json) {
216 if(typeof(doRequestMemorySave[url]) != "undefined") {
217 if(doRequestMemorySave[url]) {
218 debug("doRequest: saving request");
219 doRequestMemory[url] = transport;
222 readyFunction(transport);
224 onComplete: requestFinished
229 function getXML(request){
230 if (document.implementation && document.implementation.createDocument){
231 var xmlDoc = request.responseXML
233 else if (window.ActiveXObject){
234 var xmlInsert = document.createElement('xml');
236 xmlInsert.setAttribute('innerHTML',request.responseText);
237 xmlInsert.setAttribute('id','_MakeAUniqueID');
238 document.body.appendChild(xmlInsert);
239 xmlDoc = $('_MakeAUniqueID');
240 document.body.removeChild($('_MakeAUniqueID'));
242 debug("Your Browser Sucks!");
246 function parentPin(servicereference) {
247 servicereference = decodeURIComponent(servicereference);
248 if(parentControlList == null || String(getSettingByName("config.ParentalControl.configured")) != "True") {
251 debug("parentPin " + parentControlList.length);
252 if(getParentControlByRef(servicereference) == servicereference) {
253 if(String(getSettingByName("config.ParentalControl.type.value")) == "whitelist") {
254 debug("leaving here 1");
258 debug("leaving here 2");
261 debug("going to ask for PIN");
263 var userInput = prompt('ParentControll was switch on.<br> Please enter PIN','PIN');
264 if (userInput != '' && userInput != null) {
265 if(String(userInput) == String(getSettingByName("config.ParentalControl.servicepin.0")) ) {
268 return parentPin(servicereference);
274 var SubServicePoller;
275 var SubServicePollerCounter = 0;
276 var SubServicePollerRef = null;
277 function zap(servicereference){
278 if(parentPin(servicereference)) {
279 new Ajax.Request( "/web/zap?sRef=" + servicereference,
285 if(SubServicePoller != 0){
286 clearInterval(SubServicePoller);
287 SubServicePollerCounter = 0;
289 SubServicePollerRef = servicereference;
290 SubServicePoller = setInterval(getSubServices, 10000);
291 SubServicePollerCounter = 1;
295 //++++ SignalPanel ++++
297 function openSignalDialog(){
298 openWindow("Signal Info",tplSignalPanel, 215, 75,620,40);
302 //++++ EPG functions ++++
303 function loadEPGBySearchString(string){
304 doRequest(url_epgsearch+escape(string),incomingEPGrequest, false);
306 function loadEPGByServiceReference(servicereference){
307 doRequest(url_epgservice+servicereference,incomingEPGrequest, false);
309 function incomingEPGrequest(request){
310 debug("incoming request" +request.readyState);
311 if (request.readyState == 4){
312 var EPGItems = new EPGList(getXML(request)).getArray(true);
313 debug("have "+EPGItems.length+" e2events");
314 if(EPGItems.length > 0){
315 var html = tplEPGListHeader;
316 for (var i=0; i < EPGItems.length; i++){
318 var item = EPGItems[i];
320 'date': item.getTimeDay(),
321 'eventid': item.getEventId(),
322 'servicereference': item.getServiceReference(),
323 'servicename': quotes2html(item.getServiceName()),
324 'title': quotes2html(item.getTitle()),
325 'titleESC': escape(item.getTitle()),
326 'starttime': item.getTimeStartString(),
327 'duration': Math.ceil(item.getDuration()/60000),
328 'description': quotes2html(item.getDescription()),
329 'endtime': item.getTimeEndString(),
330 'extdescription': quotes2html(item.getDescriptionExtended()),
332 'extdescriptionSmall': extdescriptionSmall(item.getDescriptionExtended(),String(i)),
333 'start': item.getTimeBegin(),
334 'end': item.getTimeEnd()
336 //Fill template with data and add id to our result
337 html += RND(tplEPGListItem, namespace);
338 } catch (blubb) { debug("Error rendering: "+blubb); }
340 html += tplEPGListFooter;
341 openWindow("Electronic Program Guide", html, 900, 500,50,60);
343 messageBox('No Items found!', 'Sorry but i could not find any EPG Content containing your search value');
347 function extdescriptionSmall(txt,num) {
348 if(txt.length > 410) {
349 var shortTxt = txt.substr(0,410);
350 txt = txt.replace(/\'\'/g, '"');
351 txt = txt.replace(/\\/g, '\\\\');
352 txt = txt.replace(/\'/g, '\\\'');
353 txt = txt.replace(/\"/g, '"');
354 var smallNamespace = { 'txt':txt,'number':num, 'shortTxt':shortTxt};
355 return RND(tplEPGListItemExtend, smallNamespace);
361 /////////////////////////
363 function loadServiceEPGNowNext(servicereference){
364 var url = url_epgnow+servicereference;
365 doRequest(url, incomingServiceEPGNowNext, false);
368 function incomingServiceEPGNowNext(request){
369 if(request.readyState == 4){
370 var epgevents = getXML(request).getElementsByTagName("e2eventlist").item(0).getElementsByTagName("e2event");
371 for (var c =0; c < epgevents.length;c++){
372 var eventnow = new EPGEvent(epgevents.item(c));
374 if (eventnow.getEventId() != 'None'){
375 buildServiceListEPGItem(eventnow,"NOW");
380 function buildServiceListEPGItem(epgevent,nownext){
381 var e = $(epgevent.getServiceReference()+'EPG'+nownext);
384 'starttime': epgevent.getTimeStartString(),
385 'title': epgevent.getTitle(),
386 'length': Math.ceil(epgevent.duration/60)
388 e.innerHTML = RND(tplServiceListEPGItem, namespace);
390 debug("Error rendering: "+blubb);
396 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
397 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
398 //++++ GUI functions ++++
399 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
400 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
402 var currentBodyMainElement = null
404 function setBodyMainContent(newelementname){
405 newelement =$(newelementname);
406 if(currentBodyMainElement != null){
407 currentBodyMainElement.style.display = "none";
410 newelement.style.display = "";
411 currentBodyMainElement = newelement;
414 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
415 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
416 //++++ volume functions ++++
417 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
418 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
420 function initVolumePanel(){
421 $('VolumePanel').innerHTML = tplVolumePanel;
424 function getVolume(){
425 doRequest(url_getvolume,handleVolumeRequest, false);
427 function volumeSet(newvalue){
428 doRequest(url_setvolume+newvalue,handleVolumeRequest, false);
431 doRequest(url_volumeup,handleVolumeRequest, false);
433 function volumeDown(){
434 doRequest(url_volumedown,handleVolumeRequest, false);
436 function volumeMute(){
437 doRequest(url_volumemute,handleVolumeRequest, false);
439 function handleVolumeRequest(request){
440 if (request.readyState == 4) {
441 var b = getXML(request).getElementsByTagName("e2volume");
442 var newvalue = b.item(0).getElementsByTagName('e2current').item(0).firstChild.data;
443 var mute = b.item(0).getElementsByTagName('e2ismuted').item(0).firstChild.data;
444 debug("volume"+newvalue+";"+mute);
446 for (var i = 1; i <= 10; i++) {
447 if ( (newvalue/10)>=i){
448 $("volume"+i).src = "/webdata/gfx/led_on.png";
450 $("volume"+i).src = "/webdata/gfx/led_off.png";
453 if (mute == "False"){
454 $("speaker").src = "/webdata/gfx/speak_on.png";
456 $("speaker").src = "/webdata/gfx/speak_off.png";
461 var bouqetsMemory = new Object();
463 function initChannelList(){
464 //debug("init ChannelList");
465 var url = url_getServices+encodeURIComponent(bouqet_tv);
466 doRequest(url, incomingTVBouquetList, true);
468 var url = url_getServices+encodeURIComponent(bouqet_radio);
469 doRequest(url, incomingRadioBouquetList, true);
471 var url = url_getServices+encodeURIComponent(bouqet_provider_tv);
472 doRequest(url, incomingProviderTVBouquetList, true);
474 var url = url_getServices+encodeURIComponent(bouqet_provider_radio);
475 doRequest(url, incomingProviderRadioBouquetList, true);
480 var servicereftoloadepgnow = "";
481 var loadedChannellist = new Object();
482 function loadBouquet(servicereference){
483 debug("loading bouquet with "+servicereference);
484 servicereftoloadepgnow = servicereference;
485 debug("loadBouquet " + typeof(loadedChannellist[servicereftoloadepgnow]));
486 if(typeof(loadedChannellist[servicereftoloadepgnow]) == "undefined") {
487 doRequest(url_getServices+servicereference, incomingChannellist, true);
489 incomingChannellist();
493 function incomingTVBouquetList(request){
494 if (request.readyState == 4) {
495 var list0 = new ServiceList(getXML(request)).getArray();
496 debug("have "+list0.length+" TV Bouquet ");
497 $('accordionMenueBouquetContentTV').innerHTML = renderBouquetTable(list0,tplBouquetListHeader,tplBouquetListItem,tplBouquetListFooter);
498 //loading first entry of TV Favorites as default for ServiceList
499 loadBouquet(list0[0].getServiceReference());
500 bouqetsMemory["bouqet_tv"] = list0;
503 function incomingRadioBouquetList(request){
504 if (request.readyState == 4) {
505 var list1 = new ServiceList(getXML(request)).getArray();
506 debug("have "+list1.length+" Radio Bouquet ");
507 $('accordionMenueBouquetContentRadio').innerHTML = renderBouquetTable(list1,tplBouquetListHeader,tplBouquetListItem,tplBouquetListFooter);
510 function incomingProviderTVBouquetList(request){
511 if (request.readyState == 4) {
512 var list2 = new ServiceList(getXML(request)).getArray();
513 debug("have "+list2.length+" TV Provider Bouquet ");
514 $('accordionMenueBouquetContentProviderTV').innerHTML = renderBouquetTable(list2,tplBouquetListHeader,tplBouquetListItem,tplBouquetListFooter);
517 function incomingProviderRadioBouquetList(request){
518 if (request.readyState == 4) {
519 var list2 = new ServiceList(getXML(request)).getArray();
520 debug("have "+list2.length+" Radio Provider Bouquet ");
521 $('accordionMenueBouquetContentProviderRadio').innerHTML = renderBouquetTable(list2,tplBouquetListHeader,tplBouquetListItem,tplBouquetListFooter);
525 function renderBouquetTable(bouquet,templateHeader,templateItem,templateFooter){
526 debug("renderBouquetTable with "+bouquet.length+" Bouqet");
527 var html = templateHeader;
528 for (var i=0; i < bouquet.length; i++){
531 'servicereference': bouquet[i].getServiceReference(),
532 'bouquetname': bouquet[i].getServiceName()
534 html += RND(templateItem, namespace);
537 html += templateFooter;
541 function incomingChannellist(request){
543 if(typeof(loadedChannellist[servicereftoloadepgnow]) != "undefined"){
544 services = loadedChannellist[servicereftoloadepgnow];
545 } else if(request.readyState == 4) {
546 services = new ServiceList(getXML(request)).getArray();
547 loadedChannellist[servicereftoloadepgnow] = services;
548 debug("got "+services.length+" Services");
550 if(services != null) {
551 var smallNamespace = {'mainServiceRef': servicereftoloadepgnow };
552 listerHtml = RND(tplServiceListHeader, smallNamespace);
553 for ( var i = 0; i < services.length ; i++){
554 var reference = services[i];
556 'servicereference': reference.getServiceReference(),
557 'servicename': reference.getServiceName()
559 listerHtml += RND(tplServiceListItem, namespace);
561 listerHtml += tplServiceListFooter;
562 $('BodyContent').innerHTML = listerHtml;
563 setBodyMainContent('BodyContent');
564 loadServiceEPGNowNext(servicereftoloadepgnow);
565 debug("incomingChannellist " + typeof(loadedChannellist[servicereftoloadepgnow]));
569 function loadMovieList(tag){
570 debug("loading movies by tag '"+tag+"'");
571 doRequest(url_movielist+tag, incomingMovieList);
574 function incomingMovieList(request){
575 if(request.readyState == 4){
576 var movies = new MovieList(getXML(request)).getArray();
577 debug("have "+movies.length+" movies");
578 listerHtml = tplMovieListHeader;
579 for ( var i = 0; i <movies.length; i++){
580 var movie = movies[i];
582 'servicereference': movie.getServiceReference(),
583 'servicename': movie.getServiceName() ,
584 'title': movie.getTitle(),
585 'description': movie.getDescription(),
586 'descriptionextended': movie.getDescriptionExtended(),
587 'filelink': String(movie.getFilename()).substr(17,movie.getFilename().length),
588 'filename': String(movie.getFilename()),
589 'tags': movie.getTags().join(', ')
591 listerHtml += RND(tplMovieListItem, namespace);
593 listerHtml += tplMovieListFooter;
594 $('BodyContent').innerHTML = listerHtml;
595 setBodyMainContent('BodyContent');
599 function delMovieFile(file,servicename,title,description) {
600 debug("delMovieFile: file("+file+"),servicename("+servicename+"),title("+title+"),description("+description+")");
602 "Selected timer:<br>"
603 +"Servicename: "+servicename+"<br>"
604 +"Title: "+title+"<br>"
605 +"Description: "+description+"<br>"
606 +"Are you sure that you want to delete the Timer?",
607 {windowParameters: {width:300, className: windowStyle},
609 buttonClass: "myButtonClass",
610 cancel: function(win) {debug("delMovieFile cancel confirm panel")},
611 ok: function(win) { debug("delMovieFile ok confirm panel"); doRequest(url_moviefiledelete+"?filename="+file, incomingDelMovieFileResult, false); return true; }
616 function incomingDelMovieFileResult(request) {
617 debug("incomingDelMovieFileResult");
618 if(request.readyState == 4){
619 var delresult = new SimpleXMLResult(getXML(request));
620 if(delresult.getState()){
623 messageBox("Deletion Error","Reason: "+delresult.getStateText());
630 function showMessageSendForm(){
631 $('BodyContent').innerHTML = tplMessageSendForm;
633 function sendMessage(messagetext,messagetype,messagetimeout){
635 messagetext = $('MessageSendFormText').value;
638 messagetimeout = $('MessageSendFormTimeout').value;
641 var index = $('MessageSendFormType').selectedIndex;
642 messagetype = $('MessageSendFormType').options[index].value;
644 doRequest(url_message+'?text='+messagetext+'&type='+messagetype+'&timeout='+messagetimeout, incomingMessageResult, false);
646 function incomingMessageResult(request){
648 if(request.readyState== 4){
649 var b = getXML(request).getElementsByTagName("e2message");
650 var result = b.item(0).getElementsByTagName('e2result').item(0).firstChild.data;
651 var resulttext = b.item(0).getElementsByTagName('e2resulttext').item(0).firstChild.data;
653 messageBox('message send','message send successfully! it appears on TV-Screen');
655 messageBox('message send failed',resulttext);
661 function showPowerStateSendForm(){
662 $('BodyContent').innerHTML = tplPowerStateSendForm;
664 function sendPowerState(newState){
665 doRequest(url_powerstate+'?newstate='+newState, incomingPowerStateResult, false);
667 function incomingPowerStateResult(request){
668 debug(request.readyState);
669 if(request.readyState == 4){
670 var b = getXML(request).getElementsByTagName("e2powerstate");
671 var result = b.item(0).getElementsByTagName('e2result').item(0).firstChild.data;
672 var resulttext = b.item(0).getElementsByTagName('e2resulttext').item(0).firstChild.data;
673 var tplPowerStateSendForm2 = '<h1>PowerState is changing to:'+resulttext+ '</h1>' + tplPowerStateSendForm;
674 $('BodyContent').innerHTML = tplPowerStateSendForm2;
676 $('BodyContent').innerHTML = "<h1>some unknown error</h1>" + tplPasswordSendForm;
680 // RemoteControl Code
681 function showRemoteControllSendForm(){
683 openWindow("Remote", tplRemoteControlForm, 220, 642, 920,0, "rcWindow");
686 function sendRemoteControlRequest(command){
687 doRequest(url_remotecontrol+'?command='+command, incomingRemoteControlResult, false);
688 if($('getScreen').checked) {
692 function openGrabPicture() {
693 if($('BodyContent').innerHTML != tplRCGrab) {
694 $('BodyContent').innerHTML = tplRCGrab;
696 debug("openGrabPicture");
697 var buffer = new Image();
700 buffer.onload = function () { debug("image zugewiesen"); $('grabPageIMG').src = buffer.src; return true;};
701 buffer.onerror = function (meldung) { debug("reload grab image failed"); return true;};
703 downloadStart = new Date().getTime();
704 buffer.src = '/grab?' + downloadStart;
705 $('grabPageIMG').height(400);
706 tplRCGrab = $('BodyContent').innerHTML;
708 function incomingRemoteControlResult(request){
709 if(request.readyState == 4){
710 var b = getXML(request).getElementsByTagName("e2remotecontrol");
711 var result = b.item(0).getElementsByTagName('e2result').item(0).firstChild.data;
712 var resulttext = b.item(0).getElementsByTagName('e2resulttext').item(0).firstChild.data;
714 $('rcWindow').innerHTML = "<h1>some unknown error</h1>" + tplRemoteControlForm;
718 function getSettings(){
719 doRequest(url_settings, incomingGetSettings, false);
722 function incomingGetSettings(request){
723 if(request.readyState == 4){
724 settings = new Settings(getXML(request)).getArray();
726 if(String(getSettingByName("config.ParentalControl.configured")) == "True") {
730 function getSettingByName(txt) {
731 debug("getSettingByName ("+txt+")");
732 for(i = 0; i < settings.length; i++) {
733 debug("("+settings[i].getSettingName()+") (" +settings[i].getSettingValue()+")");
734 if(String(settings[i].getSettingName()) == String(txt)) {
735 return settings[i].getSettingValue();
740 function getParentControl() {
741 doRequest(url_parentcontrol, incomingParentControl, false);
743 function incomingParentControl(request) {
744 if(request.readyState == 4){
745 parentControlList = new ServiceList(getXML(request)).getArray();
746 debug("parentControlList got "+parentControlList.length + " services");
749 function getParentControlByRef(txt) {
750 debug("getParentControlByRef ("+txt+")");
751 for(i = 0; i < parentControlList.length; i++) {
752 debug("("+parentControlList[i].getClearServiceReference()+")");
753 if(String(parentControlList[i].getClearServiceReference()) == String(txt)) {
754 return parentControlList[i].getClearServiceReference();
759 function ownLazyNumber(num) {
767 var subServicesInsertedList = new Object();
768 function getSubServices(servicereference) {
769 clearInterval(SubServicePoller);
770 SubServicePollerCounter = 0;
771 doRequest(url_subservices,incomingSubServiceRequest, false);
773 function incomingSubServiceRequest(request){
774 if(request.readyState == 4){
775 var services = new ServiceList(getXML(request)).getArray();
777 debug("got "+services.length+" SubServices");
778 if(services.length > 1) {
781 var mainChannellist = loadedChannellist[String($('mainServiceRef').value)];
783 var oldEntryPosition = -1;
784 for(i = 0; i < mainChannellist.length; i++) {
785 var service = mainChannellist[i];
786 if(String(service.getServiceReference()) == String(first.getServiceReference())) {
787 oldEntryPosition = i + 1;
791 if(typeof(subServicesInsertedList[String(first.getServiceReference())]) != "undefined") {
792 for ( var i = 1; i < subServicesInsertedList[String(first.getServiceReference())].length ; i++){
793 var reference = subServicesInsertedList[String(first.getServiceReference())][i];
794 $(reference.getServiceReference()+'extend').innerHTML = "";
796 for(i = oldEntryPosition; i < oldEntryPosition + subServicesInsertedList[String(first.getServiceReference())].length; i++) {
797 mainChannellist.splice(i);
800 for ( var i = 0; i < services.length ; i++){
801 var reference = services[i];
803 'servicereference': reference.getServiceReference(),
804 'servicename': reference.getServiceName()
806 listerHtml += RND(tplServiceListItem, namespace);
807 if(oldEntryPosition > -1) {
808 mainChannellist = mainChannellist.insert(oldEntryPosition++, reference);
811 $(first.getServiceReference()+'extend').innerHTML = listerHtml;
812 subServicesInsertedList[String(first.getServiceReference())] = services;
813 loadedChannellist[$('mainServiceRef').value] = mainChannellist;
817 // Array.insert( index, value ) - Insert value at index, without overwriting existing keys
818 Array.prototype.insert = function( j, v ) {
820 var a = this.slice(), b = a.splice( j );
822 return a.concat( b );
825 // Array.splice() - Remove or replace several elements and return any deleted elements
826 if( typeof Array.prototype.splice==='undefined' ) {
827 Array.prototype.splice = function( a, c ) {
828 var i = 0, e = arguments, d = this.copy(), f = a, l = this.length;
829 if( !c ) { c = l - a; }
830 for( i; i < e.length - 2; i++ ) { this[a + i] = e[i + 2]; }
831 for( a; a < l - c; a++ ) { this[a + e.length - 2] = d[a - c]; }
832 this.length -= c - e.length + 2;
833 return d.slice( f, f + c );
836 function writeTimerListNow() {
837 new Ajax.Request( url_timerlistwrite, { asynchronous: true, method: 'get' });
839 function recordingPushed() {
840 doRequest(url_timerlist, incomingRecordingPushed, false);
842 function incomingRecordingPushed(request) {
843 if(request.readyState == 4){
844 var timers = new TimerList(getXML(request)).getArray();
845 debug("have "+timers.length+" timer");
847 var aftereventReadable = new Array ('Nothing', 'Standby', 'Deepstandby/Shutdown');
848 var justplayReadable = new Array('record', 'zap');
849 var OnOff = new Array('on', 'off');
853 for ( var i = 0; i <timers.length; i++){
854 var timer = timers[i];
856 if(ownLazyNumber(timer.getDontSave()) == 1) {
857 var beginDate = new Date(Number(timer.getTimeBegin())*1000);
858 var endDate = new Date(Number(timer.getTimeEnd())*1000);
860 'servicereference': timer.getServiceReference(),
861 'servicename': timer.getServiceName() ,
862 'title': timer.getName(),
863 'description': timer.getDescription(),
864 'descriptionextended': timer.getDescriptionExtended(),
865 'begin': timer.getTimeBegin(),
866 'beginDate': beginDate.toLocaleString(),
867 'end': timer.getTimeEnd(),
868 'endDate': endDate.toLocaleString(),
869 'state': timer.getState(),
870 'duration': Math.ceil((timer.getDuration()/60)),
871 'repeated': timer.getRepeated(),
872 'repeatedReadable': repeatedReadable(timer.getRepeated()),
873 'justplay': timer.getJustplay(),
874 'justplayReadable': justplayReadable[Number(timer.getJustplay())],
875 'afterevent': timer.getAfterevent(),
876 'aftereventReadable': aftereventReadable[Number(timer.getAfterevent())],
877 'disabled': timer.getDisabled(),
878 'onOff': OnOff[Number(timer.getDisabled())],
879 'color': colorTimerListEntry( timer.getState() )
881 listerHtml += RND(tplTimerListItem, namespace);
884 openWindow("Record Now", listerHtml+tplRecordingFooter, 900, 500, "Record now window");
887 function inserteSizes() {
888 /* var screenW = 640, screenH = 480;
889 if (parseInt(navigator.appVersion)>3) {
890 screenW = screen.width;
891 screenH = screen.height;
892 } else if (navigator.appName == "Netscape"
893 && parseInt(navigator.appVersion)==3
894 && navigator.javaEnabled() ) {
895 var jToolkit = java.awt.Toolkit.getDefaultToolkit();
896 var jScreenSize = jToolkit.getScreenSize();
897 screenW = jScreenSize.width;
898 screenH = jScreenSize.height;
900 debug("screenW:"+screenW+" screenH:"+screenH);
908 $("BodyContent").style.height = '20%';
909 } else if(screenH == 1024) {
911 $("BodyContent").style.height = '760px';
914 alert("unsupported screensize");
918 function recordingPushedDecision(recordNowNothing,recordNowUndefinitely,recordNowCurrent) {
919 var recordNow = recordNowNothing;
920 recordNow = (recordNow == "") ? recordNowUndefinitely: recordNow;
921 recordNow = (recordNow == "") ? recordNowCurrent: recordNow;
922 if(recordNow != "nothing" && recordNow != "") {
923 doRequest(url_recordnow+"?recordnow="+recordNow, incomingTimerAddResult, false);
927 function ifChecked(rObj) {
934 function showAbout() {
935 doRequest(url_about, incomingAbout, false);
937 function incomingAbout(request) {
938 if(request.readyState == 4){
939 debug("incomingAbout returned");
940 var aboutEntries = getXML(request).getElementsByTagName("e2abouts").item(0).getElementsByTagName("e2about");
941 for (var c =0; c < aboutEntries.length;c++){
942 var xml = aboutEntries.item(c);
944 var fptext = "V"+xml.getElementsByTagName('e2fpversion').item(0).firstChild.data;
947 var nims = xml.getElementsByTagName('e2tunerinfo').item(0).getElementsByTagName("e2nim");
948 debug("nims: "+nims.length);
949 for(var i=0;i< nims.length;i++){
951 name = nims.item(i).getElementsByTagName("name").item(0).firstChild.data;
952 type = nims.item(i).getElementsByTagName("type").item(0).firstChild.data;
955 var ns = { 'name' : name, 'type' : type};
956 tunerinfo += RND(tplAboutTuner, ns);
960 var hdddata = xml.getElementsByTagName('e2hddinfo').item(0);
962 var hddmodel = hdddata.getElementsByTagName("model").item(0).firstChild.data;
963 var hddcapacity = hdddata.getElementsByTagName("capacity").item(0).firstChild.data;
964 var hddfree = hdddata.getElementsByTagName("free").item(0).firstChild.data;
967 'enigmaVersion': xml.getElementsByTagName('e2enigmaversion').item(0).firstChild.data
969 ,'lanDHCP': xml.getElementsByTagName('e2landhcp').item(0).firstChild.data
970 ,'lanIP': xml.getElementsByTagName('e2lanip').item(0).firstChild.data
971 ,'lanMask': xml.getElementsByTagName('e2lanmask').item(0).firstChild.data
972 ,'lanGW': xml.getElementsByTagName('e2langw').item(0).firstChild.data
973 ,'lanDNS': xml.getElementsByTagName('e2landns').item(0).firstChild.data
976 ,'webifversion': xml.getElementsByTagName('e2webifversion').item(0).firstChild.data
977 ,'tunerInfo': tunerinfo
978 ,'hddmodel': hddmodel
979 ,'hddcapacity': hddcapacity
981 ,'serviceName': xml.getElementsByTagName('e2servicename').item(0).firstChild.data
982 ,'serviceProvider': xml.getElementsByTagName('e2serviceprovider').item(0).firstChild.data
983 ,'serviceAspect': xml.getElementsByTagName('e2serviceaspect').item(0).firstChild.data
984 ,'serviceNamespace': xml.getElementsByTagName('e2servicenamespace').item(0).firstChild.data
985 ,'vPIDh': '0x'+xml.getElementsByTagName('e2vpid').item(0).firstChild.data
986 ,'vPID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2vpid').item(0).firstChild.data),16)
987 ,'aPIDh': '0x'+xml.getElementsByTagName('e2apid').item(0).firstChild.data
988 ,'aPID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2apid').item(0).firstChild.data),16)
989 ,'pcrIDh': '0x'+xml.getElementsByTagName('e2pcrid').item(0).firstChild.data
990 ,'pcrID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2pcrid').item(0).firstChild.data),16)
991 ,'pmtPIDh': '0x'+xml.getElementsByTagName('e2pmtpid').item(0).firstChild.data
992 ,'pmtPID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2pmtpid').item(0).firstChild.data),16)
993 ,'txtPIDh': '0x'+xml.getElementsByTagName('e2txtpid').item(0).firstChild.data
994 ,'txtPID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2txtpid').item(0).firstChild.data),16)
995 ,'tsIDh': '0x'+xml.getElementsByTagName('e2tsid').item(0).firstChild.data
996 ,'tsID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2tsid').item(0).firstChild.data),16)
997 ,'onIDh': '0x'+xml.getElementsByTagName('e2onid').item(0).firstChild.data
998 ,'onID': parseInt(ownLazyNumber(xml.getElementsByTagName('e2onid').item(0).firstChild.data),16)
999 ,'sidh': '0x'+xml.getElementsByTagName('e2sid').item(0).firstChild.data
1000 ,'sid': parseInt(ownLazyNumber(xml.getElementsByTagName('e2sid').item(0).firstChild.data),16)
1002 $('BodyContent').innerHTML = RND(tplAbout, namespace);
1003 setBodyMainContent('BodyContent');
1006 debug("About parsing Error" + e);
1011 function quotes2html(txt) {
1012 txt = txt.replace(/"/g, '"');
1013 return txt.replace(/'/g, "\\\'");
1016 // Spezial functions, mostly for testing purpose
1017 function openHiddenFunctions(){
1018 openWindow("Extra Hidden Functions",tplExtraHiddenFunctions,300,100,920,0);
1020 function restartUpdateStream() {
1021 clearInterval(UpdateStreamReaderPollTimer);
1022 UpdateStreamReaderRequest.abort();
1023 UpdateStreamReaderRequest = null;
1024 UpdateStreamReaderPollTimerCounter = 0;
1025 UpdateStreamReaderStart();
1027 function startDebugWindow() {
1029 debugWin = openWindow("DEBUG", "", 300, 300,920,140, "debugWindow");
1031 function restartTwisted() {
1032 new Ajax.Request( "/web/restarttwisted", { asynchronous: true, method: "get" })
1035 function loadMediaPlayer(directory){
1036 debug("loading loadMediaPlayer");
1037 doRequest(url_mediaplayerlist+directory, incomingMediaPlayer);
1039 function incomingMediaPlayer(request){
1040 if(request.readyState == 4){
1041 var files = new FileList(getXML(request)).getArray();
1042 debug("have "+files.length+" movies");
1043 listerHtml = tplMediaPlayerHeader;
1044 for ( var i = 0; i <files.length; i++){
1045 var file = files[i];
1047 var exec = 'loadMediaPlayer';
1048 var exec_description = 'change to directory' + file.getServiceReference();
1049 var color = '000000';
1050 if (file.getIsDirectory() == "False") {
1052 exec_description = 'play file';
1056 'servicereference': file.getServiceReference()
1058 ,'exec_description': exec_description
1060 ,'root': file.getRoot()
1061 ,'filename': file.getFileName()
1062 ,'fullpath': file.getFullPath()
1064 listerHtml += tplMediaPlayerItemHead;
1065 listerHtml += RND(tplMediaPlayerItemBody, namespace);
1066 if (file.getIsDirectory() == "False") {
1067 listerHtml += RND(tplMediaPlayerItemIMG, namespace);
1069 listerHtml += tplMediaPlayerItemFooter;
1071 listerHtml += tplMediaPlayerFooter;
1072 $('BodyContentChannellist').innerHTML = listerHtml;
1073 setBodyMainContent('BodyContentChannellist');
1076 function playFile(file,root) {
1077 debug("loading playFile");
1078 doRequest(url_mediaplayerplay+file+"&root="+root, incomingMediaPlayer);