ef0021d15cce8aabb3f660720aa48c6c9e344fd1
[vuplus_dvbapp-plugin] / webinterface / src / web-data / tools.js
1 // $Header$
2
3 var doRequestMemory = {};
4 var doRequestMemorySave = {};
5 var signalPanelData = {};
6 var epgListData = {};
7 var bouquetsMemory = {};
8 var loadedChannellist = {};
9 var templates = {};
10
11 var mediaPlayerStarted = false;
12 var popUpBlockerHinted = false;
13
14 var settings = null;
15 var parentControlList = null;
16
17
18 var requestcounter = 0;
19
20 var debugWin = '';
21 var signalWin = '';
22 var webRemoteWin = '';
23 var signalPanelUpdatePoller = '';
24 var EPGListWindow = '';
25
26 var currentBouquet = bouquetsTv;
27
28 var updateBouquetItemsPoller = '';
29 var updateCurrentPoller = setInterval(updateItems, 7500);
30
31
32 var boxtype = "";
33
34 /*
35  * Set boxtype Variable for being able of determining model specific stuff correctly (like WebRemote)
36  */
37 function incomingAboutBoxtype(request){
38         debug("[incomingAboutBoxtype] returned");
39         var xml = getXML(request).getElementsByTagName("e2abouts").item(0).getElementsByTagName("e2about");
40         xml = xml.item(0);
41         
42         boxtype = xml.getElementsByTagName('e2model').item(0).firstChild.data;
43         debug("[incomingAboutBoxtype] Boxtype: " + boxtype);
44 }
45
46
47 function getBoxtype(){
48         doRequest(url_about, incomingAboutBoxtype, false);
49 }
50
51 function notify(text, state){
52         switch(state){
53                 case false:
54                         $('notification').style.background = "#C00";
55                         break;
56                 default:
57                         $('notification').style.background = "#85C247";
58         }
59                 
60         set('notification', "<div>"+text+"</div>");
61         $('notification').appear({duration : 0.5, to: 0.9 });
62         setTimeout(hideNotifier, 3000);
63 }
64
65 function hideNotifier(){
66         $('notification').fade({duration : 0.5 })
67 }
68
69 function simpleResultHandler(simpleResult){
70         notify(simpleResult.statetext, simpleResult.state);
71 }
72
73
74 function startUpdateBouquetItemsPoller(){
75         debug("[startUpdateBouquetItemsPoller] called");
76         updateBouquetItemsPoller = setInterval(updateItemsLazy, 60000);
77 }
78
79
80 function stopUpdateBouquetItemsPoller(){
81         debug("[stopUpdateBouquetItemsPoller] called");
82         clearInterval(updateBouquetItemsPoller);
83 }
84
85 //General Helpers
86 function ownLazyNumber(num) {
87         if(isNaN(num)){
88                 return 0;
89         } else {
90                 return Number(num);
91         }
92 }
93
94
95 function dec2hex(nr, len){
96
97         var hex = parseInt(nr, 10).toString(16).toUpperCase();
98         if(len > 0){
99                 try{
100                         while(hex.length < len){
101                                 hex = "0"+hex;
102                         }
103                 } 
104                 catch(e){}
105         } 
106         return hex;
107 }
108
109
110 function quotes2html(txt) {
111         return txt.replace(/'/g, "\\'").replace(/"/g, '&quot;');
112 }
113
114 function addLeadingZero(nr){
115         if(nr < 10){
116                 return '0' + nr;
117         }
118         return nr;
119 }
120
121 function dateToString(date){
122
123         var dateString = "";
124         
125         dateString += date.getFullYear();
126         dateString += "-" + addLeadingZero(date.getMonth()+1);
127         dateString += "-" + addLeadingZero(date.getDate());
128         dateString += " " + addLeadingZero(date.getHours());
129         dateString += ":" + addLeadingZero(date.getMinutes());
130                 
131         return dateString;
132 }
133
134
135 function showhide(id){
136         var o = $(id).style;
137         o.display = (o.display!="none")? "none":"";
138 }
139
140
141 function show(id){
142         try{
143                 $(id).style.display = "";
144         } catch(e) {}
145 }
146
147
148 function hide(id){
149         try{
150                 $(id).style.display = "none";
151         } catch(e) {}
152 }
153
154
155 function set(element, value){
156         if(element == "CurrentService") {
157                 if(value.search(/^MP3 File:/) != -1) {
158                         value = value.replace(/.*\//, '');
159                 }
160         }
161         element = parent.$(element);
162         if(value.length > 550) {
163                 value = value.substr(0,550) + "[...]";
164         }
165         if (element){
166                 element.innerHTML = value;
167         }
168         if(navigator.userAgent.indexOf("MSIE") >=0) {
169                 try{
170                         var elementscript = $('UpdateStreamReaderIEFixIFrame').$('scriptzone');
171                         if(elementscript){
172                                 elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory                    
173                         }
174                 }
175                 catch(e){}
176         }
177 }
178
179
180 function setComplete(element, value){
181         //debug(element+"-"+value);
182         element = parent.$(element);
183         if (element){
184                 element.innerHTML = value;
185         }
186         if(navigator.userAgent.indexOf("MSIE") >= 0) {
187                 elementscript= $('UpdateStreamReaderIEFixIFrame').$('scriptzone');
188                 if(elementscript){
189                         elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory                    
190                 }
191         }
192 }
193
194
195 /*
196  * Sets the Loading Notification to the given HTML Element
197  * @param targetElement - The element the Ajax-Loader should be set in
198  */
199 function setAjaxLoad(targetElement){
200         $(targetElement).innerHTML = getAjaxLoad();
201 }
202
203
204 //Ajax Request Helpers
205 //requestindikator
206
207 function requestIndicatorUpdate(){
208         /*debug(requestcounter+" open requests");
209         if(requestcounter>=1){
210                 $('RequestIndicator').style.display = "inline";
211         }else{
212                 $('RequestIndicator').style.display = "none";
213         }*/
214 }
215
216 function requestStarted(){
217         requestcounter +=1;
218         requestIndicatorUpdate();
219 }
220
221 function requestFinished(){
222         requestcounter -= 1;
223         requestIndicatorUpdate();
224 }
225
226 //Popup And Messagebox Helpers
227 function messageBox(m){
228         alert(m);
229 }
230
231
232 function popUpBlockerHint(){
233         if(!popUpBlockerHinted){
234                 messageBox("Please disable your Popup-Blocker for enigma2 WebControl to work flawlessly!");
235                 popUpBlockerHinted = true;
236         }
237 }
238
239 function setWindowContent(window, html){
240         window.document.write(html);
241         window.document.close();
242 }
243
244 function openPopup(title, html, width, height, x, y){
245         try {
246                 var popup = window.open('about:blank',title,'scrollbars=yes, width='+width+',height='+height);
247                 setWindowContent(popup, html);
248                 return popup;
249         } catch(e){
250                 popUpBlockerHint();
251                 return "";
252         }
253 }
254
255 //Template Helpers
256 function saveTpl(request, tplName){
257         debug("[saveTpl] saving template: " + tplName);
258         templates[tplName] = request.responseText;
259 }
260
261
262 function renderTpl(tpl, data, domElement) {     
263         var result = tpl.process(data);
264
265         try{
266                 $(domElement).innerHTML = result;
267         }catch(ex){
268 //              debug("[renderTpl] exception: " + ex);
269         }
270 }
271
272
273 function fetchTpl(tplName, callback){
274         if(typeof(templates[tplName]) == "undefined") {
275                 var url = url_tpl+tplName+".htm";
276                 var options = {
277                                 asynchronous: true,
278                                 method: 'GET',
279                                 requestHeaders: ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate', 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT'],
280                                 onException: function(o, e){ 
281                                                                 debug("[fetchTpl] exception "+ e); 
282                                                                 throw(e); 
283                                                         },                              
284                                 onSuccess: function(transport){
285                                                                 saveTpl(transport, tplName);
286                                                                 if(typeof(callback) == 'function'){
287                                                                         callback();
288                                                                 }
289                                                         },
290                                 onComplete: requestFinished 
291                         };
292                         
293                 var request = new Ajax.Request(url, options);
294         } else {
295                 if(typeof(callback) != 'undefined'){
296                         callback();
297                 }
298         }
299 }
300
301 function incomingProcessTpl(request, data, domElement, callback){
302         if(request.readyState == 4){
303                 renderTpl(request.responseText, data, domElement);
304                 if(typeof(callback) == 'function') {
305                         callback();
306                 }
307         }
308 }
309
310 function processTpl(tplName, data, domElement, callback){
311         var url = url_tpl+tplName+".htm";
312                 var request = new Ajax.Request(url,
313                         {
314                                 asynchronous: true,
315                                 method: 'GET',
316                                 requestHeaders: ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate', 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT'],
317                                 onException: function(o, e){ 
318                                                                 debug("[processTpl] exception " + e);
319                                                                 debug("[processTpl] exception " + typeof(o));
320                                                                 throw(e); 
321                                                         },                              
322                                 onSuccess: function(transport){
323                                                                 incomingProcessTpl(transport, data, domElement, callback);
324                                                         },
325                                 onComplete: requestFinished 
326                         });
327 }
328
329 //Debugging Window
330
331
332 function openDebug(){
333         debugWin = openPopup("Debug", templates.tplDebug, 500, 300);
334 }
335
336
337 function loadAndOpenDebug(){
338         fetchTpl('tplDebug', openDebug);
339 }
340
341
342 function debug(text){
343         if(DBG){
344                 try{
345                         if(!debugWin.closed && debugWin.location){
346                                 var inner = debugWin.document.getElementById('debugContent').innerHTML;
347                                 debugWin.document.getElementById('debugContent').innerHTML = new Date().toLocaleString() + ": "+text+"<br>" + inner;
348                         }
349                 } catch (Exception) {
350                         popUpBlockerHint();
351                 }
352                         
353         }
354 }
355
356
357
358 // end requestindikator
359 function doRequest(url, readyFunction, save){
360         requestStarted();
361         doRequestMemorySave[url] = save;
362 //      debug("[doRequest] Requesting: "+url);
363 /*      
364         if(save == true && typeof(doRequestMemory[url]) != "undefined") {
365                 readyFunction(doRequestMemory[url]);
366         } else {
367 */
368         try{
369                 var request = new Ajax.Request(url,
370                         {
371                                 asynchronous: true,
372                                 method: 'GET',
373                                 requestHeaders: ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate', 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT'],
374                                 onException: function(o,e){ throw(e); },                                
375                                 onSuccess: function (transport, json) {
376                                                         if(typeof(doRequestMemorySave[url]) != "undefined") {
377                                                                 if(doRequestMemorySave[url]) {
378 //                                                                      debug("[doRequest] saving request"); 
379                                                                         doRequestMemory[url] = transport;
380                                                                 }
381                                                         }
382                                                         if(typeof(readyFunction) != "undefined"){
383                                                                 readyFunction(transport);
384                                                         }
385                                                 },
386                                 onComplete: requestFinished 
387                         });
388         } catch(e) {}
389 //      }
390 }
391
392 function getXML(request){
393         var xmlDoc = "";
394         
395         if(window.ActiveXObject){ // we're on IE
396                 xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
397                 xmlDoc.async="false";
398                 xmlDoc.loadXML(request.responseText);
399         } else { //we're not on IE                      
400                 xmlDoc = request.responseXML;
401         }
402
403         return xmlDoc;
404 }
405
406
407 //Parental Control
408 function incomingParentControl(request) {
409         if(request.readyState == 4){
410                 parentControlList = new ServiceList(getXML(request)).getArray();
411                 debug("[incomingParentControl] Got "+parentControlList.length + " services");
412         }
413 }
414
415 function getParentControl() {
416         doRequest(url_parentcontrol, incomingParentControl, false);
417 }
418
419
420 function getParentControlByRef(txt) {
421         debug("[getParentControlByRef] ("+txt+")");
422         for(var i = 0; i < parentControlList.length; i++) {
423                 debug( "[getParentControlByRef] "+parentControlList[i].getClearServiceReference() );
424                 if(String(parentControlList[i].getClearServiceReference()) == String(txt)) {
425                         return parentControlList[i].getClearServiceReference();
426                 } 
427         }
428         return "";
429 }
430
431
432 function parentPin(servicereference) {
433     debug ("parentPin: parentControlList");
434         servicereference = decodeURIComponent(servicereference);
435         if(parentControlList === null || String(getSettingByName("config.ParentalControl.configured")) != "true") {
436                 return true;
437         }
438         //debug("parentPin " + parentControlList.length);
439         if(getParentControlByRef(servicereference) == servicereference) {
440                 if(String(getSettingByName("config.ParentalControl.type.value")) == "whitelist") {
441                         debug("[parentPin] Channel in whitelist");
442                         return true;
443                 }
444         } else {
445                 debug("[parentPin] sRef differs ");
446                 return true;
447         }
448         debug("[parentPin] Asking for PIN");
449
450         var userInput = prompt('Parental Control is enabled!<br> Please enter the Parental Control PIN','PIN');
451         if (userInput !== '' && userInput !== null) {
452                 if(String(userInput) == String(getSettingByName("config.ParentalControl.servicepin.0")) ) {
453                         return true;
454                 } else {
455                         return parentPin(servicereference);
456                 }
457         } else {
458                 return false;
459         }
460 }
461
462
463 //Settings
464 function getSettingByName(txt) {
465         debug("[getSettingByName] (" + txt + ")");
466         for(var i = 0; i < settings.length; i++) {
467                 debug("("+settings[i].getSettingName()+") (" +settings[i].getSettingValue()+")");
468                 if(String(settings[i].getSettingName()) == String(txt)) {
469                         return settings[i].getSettingValue().toLowerCase();
470                 } 
471         }
472         return "";
473 }
474
475
476 function incomingGetDreamboxSettings(request){
477         if(request.readyState == 4){
478                 var settings = new Settings(getXML(request)).getArray();
479         }
480         debug ("starte getParentControl " + getSettingByName("config.ParentalControl.configured"));
481         if(String(getSettingByName("config.ParentalControl.configured")) == "true") {
482                 getParentControl();
483         }
484 }
485
486
487 function getDreamboxSettings(){
488         doRequest(url_settings, incomingGetDreamboxSettings, false);
489 }
490
491
492 //Subservices
493 function incomingSubServiceRequest(request){
494         if(request.readyState == 4){
495                 var services = new ServiceList(getXML(request)).getArray();
496                 debug("[incomingSubServiceRequest] Got " + services.length + " SubServices");
497                 
498                 if(services.length > 1) {
499                         
500                         var first = services[0];
501
502                         var last = false;
503                         var namespace = [];
504                         
505                         //we already have the main service in our servicelist so we'll start with the second element
506                         for ( var i = 1; i < services.length ; i++){
507                                 var reference = services[i];
508                                 namespace[i] = {        
509                                         'servicereference': reference.getServiceReference(),
510                                         'servicename': reference.getServiceName()
511                                 };
512                         }
513                         var data = { subservices : namespace };
514                         
515                         
516                         var id = 'SUB'+first.getServiceReference();
517                         show('tr' + id);
518                         processTpl('tplSubServices', data, id);
519                 }
520         }
521 }
522
523
524 function getSubServices(bouquet) {
525         doRequest(url_subservices, incomingSubServiceRequest, false);
526 }
527
528
529 function delayedGetSubservices(){
530         setTimeout(getSubServices, 5000);
531 }
532
533 //zap zap
534 function zap(servicereference){
535         var request = new Ajax.Request( "/web/zap?sRef=" + servicereference, 
536                                                 {
537                                                         asynchronous: true,
538                                                         method: 'get'
539                                                 }
540                                         );
541         delayedGetSubservices();
542 }
543
544 //SignalPanel
545
546 function updateSignalPanel(){   
547         var html = templates.tplSignalPanel.process(signalPanelData);
548         
549         if (!signalWin.closed && signalWin.location) {
550                 setWindowContent(signalWin, html);
551         } else {
552                 clearInterval(signalPanelUpdatePoller);
553                 signalPanelUpdatePoller = '';
554         }
555 }
556
557 function incomingSignalPanel(request){
558         var namespace = {};
559         
560         if (request.readyState == 4){
561                 var xml = getXML(request).getElementsByTagName("e2frontendstatus").item(0);
562                 namespace = {
563                         snrdb : xml.getElementsByTagName('e2snrdb').item(0).firstChild.data,
564                         snr : xml.getElementsByTagName('e2snr').item(0).firstChild.data,
565                         ber : xml.getElementsByTagName('e2ber').item(0).firstChild.data,
566                         acg : xml.getElementsByTagName('e2acg').item(0).firstChild.data
567                 };
568         }
569         
570         signalPanelData = { signal : namespace };
571         fetchTpl('tplSignalPanel', updateSignalPanel);  
572 }
573
574 function reloadSignalPanel(){
575         doRequest(url_signal, incomingSignalPanel, false);
576 }
577
578 function openSignalPanel(){
579         if (!(!signalWin.closed && signalWin.location)){
580                 signalWin = openPopup('SignalPanel', '', 220, 120);
581                 if(signalPanelUpdatePoller === ''){
582                         signalPanelUpdatePoller = setInterval(reloadSignalPanel, 5000);
583                 }
584         }
585         reloadSignalPanel();
586 }
587
588 //EPG functions
589
590
591 function showEpgList(){
592         var html = templates.tplEpgList.process(epgListData);
593         
594         if (!EPGListWindow.closed && EPGListWindow.location) {
595                 setWindowContent(EPGListWindow, html);
596         } else {
597                 EPGListWindow = openPopup("EPG", html, 900, 500);
598         }
599 }
600
601 function incomingEPGrequest(request){
602         debug("[incomingEPGrequest] readyState" +request.readyState);           
603         if (request.readyState == 4){
604                 var EPGItems = new EPGList(getXML(request)).getArray(true);
605                 debug("[incomingEPGrequest] got "+EPGItems.length+" e2events");
606                 if(EPGItems.length > 0){                        
607                         var namespace = [];
608                         for (var i=0; i < EPGItems.length; i++){
609                                 try{
610                                         var item = EPGItems[i];                         
611                                         namespace[i] = {        
612                                                 'date': item.getTimeDay(),
613                                                 'eventid': item.getEventId(),
614                                                 'servicereference': item.getServiceReference(),
615                                                 'servicename': quotes2html(item.getServiceName()),
616                                                 'title': quotes2html(item.getTitle()),
617                                                 'titleESC': escape(item.getTitle()),
618                                                 'starttime': item.getTimeStartString(), 
619                                                 'duration': Math.ceil(item.getDuration()/60000), 
620                                                 'description': quotes2html(item.getDescription()),
621                                                 'endtime': item.getTimeEndString(), 
622                                                 'extdescription': quotes2html(item.getDescriptionExtended()),
623                                                 'number': String(i),
624                                                 'start': item.getTimeBegin(),
625                                                 'end': item.getTimeEnd()
626                                         };
627                                         
628                                 } catch (Exception) { 
629                                         debug("[incomingEPGrequest] Error rendering: " + Exception);    
630                                 }
631                         }
632                         
633                         epgListData = {epg : namespace};
634                         fetchTpl('tplEpgList', showEpgList);
635                 } else {
636                         messageBox('No Items found!', 'Sorry but I could not find any EPG Content containing your search value');
637                 }
638         }
639 }
640
641 function loadEPGBySearchString(string){
642         doRequest(url_epgsearch+escape(string),incomingEPGrequest, false);
643 }
644
645 function loadEPGByServiceReference(servicereference){
646         doRequest(url_epgservice+servicereference,incomingEPGrequest, false);
647 }
648
649 //function extdescriptionSmall(txt,num) {
650 //      if(txt.length > 410) {
651 //              var shortTxt = txt.substr(0,410);
652 //              txt = txt.replace(/\'\'/g, '&quot;');
653 //              txt = txt.replace(/\\/g, '\\\\');
654 //              txt = txt.replace(/\'/g, '\\\'');
655 //              txt = txt.replace(/\"/g, '&quot;');
656 //              var smallNamespace = { 'txt':txt,'number':num, 'shortTxt':shortTxt};
657 //              return RND(tplEPGListItemExtend, smallNamespace);
658 //      } else {
659 //              return txt;
660 //      }
661 //}     
662
663 function buildServiceListEPGItem(epgevent, type){
664         var namespace = {       
665                 'starttime': epgevent.getTimeStartString(), 
666                 'title': epgevent.getTitle(), 
667                 'length': Math.ceil(epgevent.duration/60) 
668         };
669         var data = {epg : namespace};
670         //e.innerHTML = RND(tplServiceListEPGItem, namespace);
671         
672         var id = type + epgevent.getServiceReference();
673         
674         show('tr' + id);
675         
676                 if(typeof(templates.tplServiceListEPGItem) != "undefined"){
677                         renderTpl(templates.tplServiceListEPGItem, data, id, true);
678                 } else {
679                         debug("[buildServiceListEPGItem] tplServiceListEPGItem N/A");
680                 }
681 }
682
683 function incomingServiceEPGNowNext(request, type){
684         if(request.readyState == 4){
685                 var epgevents = getXML(request).getElementsByTagName("e2eventlist").item(0).getElementsByTagName("e2event");
686                 for (var c = 0; c < epgevents.length; c++){
687                         try{
688                                 var epgEvt = new EPGEvent(epgevents.item(c));
689                         } catch (e){
690                                 debug("[incomingServiceEPGNowNext]" + e);
691                         }
692                         
693                         if (epgEvt.getEventId() != 'None'){
694                                 buildServiceListEPGItem(epgEvt, type);
695                         }
696                 }
697         }
698 }
699
700 function incomingServiceEPGNow(request){
701         incomingServiceEPGNowNext(request, 'NOW');
702 }
703
704 function incomingServiceEPGNext(request){
705         incomingServiceEPGNowNext(request, 'NEXT');
706 }
707
708 function loadServiceEPGNowNext(servicereference, next){
709         var url = url_epgnow+servicereference;
710         
711         if(typeof(next) == 'undefined'){
712                 doRequest(url, incomingServiceEPGNow, false);
713         } else {
714                 url = url_epgnext+servicereference;
715                 doRequest(url, incomingServiceEPGNext, false);
716         }
717 }
718
719
720 function getBouquetEpg(){
721         loadServiceEPGNowNext(currentBouquet);
722         loadServiceEPGNowNext(currentBouquet, true);
723 }
724 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
725 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
726 //++++ volume functions                            ++++
727 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
728 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
729 function handleVolumeRequest(request){
730         if (request.readyState == 4) {
731                 var b = getXML(request).getElementsByTagName("e2volume");
732                 var newvalue = b.item(0).getElementsByTagName('e2current').item(0).firstChild.data;
733                 var mute = b.item(0).getElementsByTagName('e2ismuted').item(0).firstChild.data;
734                 debug("[handleVolumeRequest] Volume " + newvalue + " | Mute: " + mute);
735                 
736                 for (var i = 1; i <= 10; i++)           {
737                         if ( (newvalue/10)>=i){
738                                 $("volume"+i).src = "/web-data/img/led_on.png";
739                         }else{
740                                 $("volume"+i).src = "/web-data/img/led_off.png";
741                         }
742                 }
743                 if (mute == "False"){
744                         $("speaker").src = "/web-data/img/speak_on.png";
745                 }else{
746                         $("speaker").src = "/web-data/img/speak_off.png";
747                 }
748         }       
749 }
750
751
752 function getVolume(){
753         doRequest(url_getvolume, handleVolumeRequest, false);
754 }
755
756 function volumeSet(val){
757         doRequest(url_setvolume+val, handleVolumeRequest, false);
758 }
759
760 function volumeUp(){
761         doRequest(url_volumeup, handleVolumeRequest, false);
762 }
763
764 function volumeDown(){
765         doRequest(url_volumedown, handleVolumeRequest, false);
766 }
767
768 function volumeMute(){
769         doRequest(url_volumemute, handleVolumeRequest, false);
770 }
771
772 function initVolumePanel(){
773         getVolume(); 
774 }
775
776 //Channels and Bouquets
777
778
779 function incomingChannellist(request){
780         var services = null;
781         if(typeof(loadedChannellist[currentBouquet]) != "undefined"){
782                 services = loadedChannellist[currentBouquet];
783         } else if(request.readyState == 4) {
784                 services = new ServiceList(getXML(request)).getArray();
785                 debug("[incomingChannellist] got "+services.length+" Services");
786         }
787         if(services !== null) {
788                 var namespace = {};
789                 var cssclass = "even";
790                 
791                 for ( var i = 0; i < services.length ; i++){
792                         
793                         cssclass = cssclass == 'even' ? 'odd' : 'even';
794                         
795                         var service = services[i];
796                         namespace[i] = {        
797                                 'servicereference' : service.getServiceReference(),
798                                 'servicename' : service.getServiceName(),
799                                 'cssclass' : cssclass
800                         };
801                 }
802                 var data = { 
803                         services : namespace 
804                 };
805                 
806                 processTpl('tplServiceList', data, 'contentMain', getBouquetEpg);
807                 delayedGetSubservices();
808         } else {
809                 debug("[incomingChannellist] services is null");
810         }
811 }
812
813
814 function loadBouquet(servicereference, name){ 
815         debug("[loadBouquet] called");
816
817         currentBouquet = servicereference;
818                 
819         setContentHd(name);
820         setAjaxLoad('contentMain');
821                 
822         startUpdateBouquetItemsPoller();
823         
824         doRequest(url_getServices+servicereference, incomingChannellist, true);
825 }
826
827
828 function incomingBouquetListInitial(request){
829         if (request.readyState == 4) {
830                 var bouquetList = new ServiceList(getXML(request)).getArray();
831                 debug("[incomingBouquetListInitial] Got " + bouquetList.length + " TV Bouquets!");      
832
833                 //loading first entry of TV Favorites as default for ServiceList
834                 loadBouquet(bouquetList[0].getServiceReference(), bouquetList[0].getServiceName());
835         }
836 }
837
838
839 function renderBouquetTable(list, target){
840         debug("[renderBouquetTable] Rendering " + list.length + " Bouquets");   
841         
842         var namespace = [];
843         if (list.length < 1){
844                 debug("[renderBouquetTable] NO BOUQUETS!");
845         }
846         for (var i=0; i < list.length; i++){
847                 try{
848                         var bouquet = list[i];
849                         namespace[i] = {
850                                 'servicereference': bouquet.getServiceReference(), 
851                                 'bouquetname': bouquet.getServiceName()
852                         };
853                 } catch (e) { }
854         }
855         var data = { 
856                 services : namespace 
857         };
858         
859         processTpl('tplBouquetList', data, 'contentMain');
860 }       
861
862
863
864 function incomingBouquetList(request){
865         if (request.readyState == 4) {
866                 var bouquetList = new ServiceList(getXML(request)).getArray();
867                 debug("[incomingBouquetList] got " + bouquetList.length + " TV Bouquets!");     
868                 renderBouquetTable(bouquetList, 'contentMain');         
869         }
870 }
871
872
873 function initChannelList(){
874         var url = url_getServices+encodeURIComponent(bouquetsTv);
875         currentBouquet = bouquetsTv;
876         
877         doRequest(url, incomingBouquetListInitial, true);
878 }
879
880
881
882 // Movies
883 function incomingMovieList(request){
884         if(request.readyState == 4){
885                 
886                 var movies = new MovieList(getXML(request)).getArray();
887                 debug("[incomingMovieList] Got "+movies.length+" movies");
888                 namespace = []; 
889                 
890                 var cssclass = "even";
891                 
892                 for ( var i = 0; i < movies.length; i++){
893                         cssclass = cssclass == 'even' ? 'odd' : 'even';
894                         
895                         var movie = movies[i];
896                         namespace[i] = {        
897                                 'servicereference': movie.getServiceReference(),
898                                 'servicename': movie.getServiceName() ,
899                                 'title': movie.getTitle(), 
900                                 'description': movie.getDescription(), 
901                                 'descriptionextended': movie.getDescriptionExtended(),
902                                 'filelink': String(movie.getFilename()).substr(17,movie.getFilename().length),
903                                 'filename': String(movie.getFilename()),
904                                 'filesize': movie.getFilesizeMB(),
905                                 'tags': movie.getTags().join(', ') ,
906                                 'length': movie.getLength() ,
907                                 'time': movie.getTimeDay()+"&nbsp;"+ movie.getTimeStartString(),
908                                 'cssclass' : cssclass
909                         };
910                 }
911                 var data = { movies : namespace };
912                 processTpl('tplMovieList', data, 'contentMain');
913         }               
914 }
915
916
917 function loadMovieList(tag){
918         if(typeof(tag) == 'undefined'){
919                 tag = '';
920         }
921         debug("[loadMovieList] Loading movies with tag '"+tag+"'");
922         doRequest(url_movielist+tag, incomingMovieList, false);
923 }
924
925
926 function incomingDelMovieResult(request) {
927         debug("[incomingDelMovieResult] called");
928         if(request.readyState == 4){
929                 var result = new SimpleXMLResult(getXML(request));
930                 if(result.getState()){
931                         notify(result.getStateText(), result.getState());
932                         loadMovieList('');
933                 }else{
934                         notify(result.getStateText(), result.getState());
935                 }
936         }               
937 }
938
939
940 function delMovie(sref ,servicename, title, description) {
941         debug("[delMovie] File(" + sref + "), servicename(" + servicename + ")," +
942                         "title(" + title + "), description(" + description + ")");
943         
944         result = confirm( "Are you sure want to delete the Movie?\n" +
945                 "Servicename: "+servicename+"\n" +
946                 "Title: "+title+"\n" + 
947                 "Description: "+description+"\n");
948
949         if(result){
950                 debug("[delMovie] ok confirm panel"); 
951                 doRequest(url_moviedelete+"?sRef="+sref, incomingDelMovieResult, false); 
952                 return true;
953         }
954         else{
955                 debug("[delMovie] cancel confirm panel");
956                 return false;
957         }
958 }
959
960 //Send Messages and Receive the Answer
961
962
963 function incomingMessageResult(request){
964         if(request.readyState== 4){
965                 var result = new SimpleXMLResult(getXML(request));
966                 notify(result.getStateText(), result.getState());
967         }
968 }
969
970 function getMessageAnswer() {
971         doRequest(url_messageanswer, incomingMessageResult, false);
972 }
973
974 function sendMessage(messagetext, messagetype, messagetimeout){
975         if(!messagetext){
976                 messagetext = $('MessageSendFormText').value;
977         }       
978         if(!messagetimeout){
979                 messagetimeout = $('MessageSendFormTimeout').value;
980         }       
981         if(!messagetype){
982                 var index = $('MessageSendFormType').selectedIndex;
983                 messagetype = $('MessageSendFormType').options[index].value;
984         }       
985         if(ownLazyNumber(messagetype) === 0){
986                 var request = doRequest(url_message+'?text='+messagetext+'&type='+messagetype+'&timeout='+messagetimeout);
987                 
988                 setTimeout(getMessageAnswer, ownLazyNumber(messagetimeout)*1000);
989         } else {
990                 doRequest(url_message+'?text='+messagetext+'&type='+messagetype+'&timeout='+messagetimeout, incomingMessageResult, false);
991         }
992 }
993
994
995 //Screenshots
996 function getScreenShot(what) {
997         debug("[getScreenShot] called");
998         
999         var buffer = new Image();
1000         var downloadStart;
1001         var data = {};
1002         
1003         buffer.onload = function () { 
1004                 debug("[getScreenShot] image assigned");
1005                 
1006                 data = { img : { src : buffer.src } };  
1007                 processTpl('tplGrab', data, 'contentMain');
1008
1009                 return true;
1010         };
1011         
1012         buffer.onerror = function (meldung) { 
1013                 debug("[getScreenShot] Loading image failed"); 
1014                 return true;
1015         };
1016         
1017         switch(what){
1018                 case "o":
1019                         what = "&o&n";
1020                         break;
1021                 case "v":
1022                         what = "&v";
1023                         break;
1024                 default:
1025                         what = "";
1026                         break;
1027         }
1028         
1029         downloadStart = new Date().getTime();
1030         buffer.src = '/grab?format=jpg&r=720&' + what + '&filename=/tmp/' + downloadStart;
1031 }
1032
1033 function getVideoShot() {
1034         getScreenShot("v");
1035 }
1036
1037 function getOsdShot(){
1038         getScreenShot("o");
1039 }
1040
1041 // RemoteControl Code
1042
1043 function incomingRemoteControlResult(request){
1044         if(request.readyState == 4){
1045                 var b = getXML(request).getElementsByTagName("e2remotecontrol");
1046                 var result = b.item(0).getElementsByTagName('e2result').item(0).firstChild.data;
1047                 var resulttext = b.item(0).getElementsByTagName('e2resulttext').item(0).firstChild.data;
1048         } //else {
1049                 //TODO Some Error Handling
1050 //      }
1051 }
1052
1053 function openWebRemote(){
1054         var template = templates.tplWebRemoteOld;
1055         
1056         if(boxtype == "dm8000"){
1057                 template = templates.tplWebRemote;
1058         }
1059         
1060         
1061         if (!webRemoteWin.closed && webRemoteWin.location) {
1062                 setWindowContent(webRemoteWin, template);
1063         } else {
1064                 webRemoteWin = openPopup('WebRemote', template, 250, 600);
1065         }
1066         
1067 }
1068
1069
1070 function loadAndOpenWebRemote(){
1071         if(boxtype == "dm8000"){
1072                 fetchTpl('tplWebRemote', openWebRemote);
1073         }
1074         fetchTpl('tplWebRemoteOld', openWebRemote);
1075 }
1076
1077
1078 function sendRemoteControlRequest(command){
1079         doRequest(url_remotecontrol+'?command='+command, incomingRemoteControlResult, false);
1080         if(webRemoteWin.document.getElementById('getScreen').checked) {
1081                 if(webRemoteWin.document.getElementById('getVideo').checked){
1082                         getScreenShot();
1083                 } else {
1084                         getScreenShot("o");
1085                 }
1086         }
1087 }
1088
1089
1090
1091
1092 // Array.insert( index, value ) - Insert value at index, without overwriting existing keys
1093 Array.prototype.insert = function( j, v ) {
1094         if( j>=0 ) {
1095                 var a = this.slice(), b = a.splice( j );
1096                 a[j] = v;
1097                 return a.concat( b );
1098         }
1099 };
1100
1101 // Array.splice() - Remove or replace several elements and return any deleted elements
1102 if( typeof Array.prototype.splice==='undefined' ) {
1103         Array.prototype.splice = function( a, c ) {
1104                 var e = arguments, d = this.copy(), f = a, l = this.length;
1105         
1106                 if( !c ) { 
1107                         c = l - a; 
1108                 }
1109                 
1110                 for( var i = 0; i < e.length - 2; i++ ) { 
1111                         this[a + i] = e[i + 2]; 
1112                 }
1113                 
1114                 
1115                 for( var j = a; j < l - c; j++ ) { 
1116                         this[j + e.length - 2] = d[j - c]; 
1117                 }
1118                 this.length -= c - e.length + 2;
1119         
1120                 return d.slice( f, f + c );
1121         };
1122 }
1123
1124 //Recording
1125 function incomingRecordingPushed(request) {
1126         if(request.readyState == 4){
1127                 var timers = new TimerList(getXML(request)).getArray();
1128                 debug("[incomingRecordingPushed] Got " + timers.length + " timers");
1129                 
1130                 var aftereventReadable = ['Nothing', 'Standby', 'Deepstandby/Shutdown', 'Auto'];
1131                 var justplayReadable = ['record', 'zap'];
1132                 var OnOff = ['on', 'off'];
1133                 
1134                 var namespace = [];
1135                 
1136                 for ( var i = 0; i <timers.length; i++){
1137                         var timer = timers[i];
1138
1139                         if(ownLazyNumber(timer.getDontSave()) == 1) {
1140                                 var beginDate = new Date(Number(timer.getTimeBegin())*1000);
1141                                 var endDate = new Date(Number(timer.getTimeEnd())*1000);
1142                                 namespace[i] = {
1143                                 'servicereference': timer.getServiceReference(),
1144                                 'servicename': timer.getServiceName() ,
1145                                 'title': timer.getName(), 
1146                                 'description': timer.getDescription(), 
1147                                 'descriptionextended': timer.getDescriptionExtended(), 
1148                                 'begin': timer.getTimeBegin(),
1149                                 'beginDate': beginDate.toLocaleString(),
1150                                 'end': timer.getTimeEnd(),
1151                                 'endDate': endDate.toLocaleString(),
1152                                 'state': timer.getState(),
1153                                 'duration': Math.ceil((timer.getDuration()/60)),
1154                                 'dirname': timer.getDirname(),
1155                                 'tags': timer.getTags(),
1156                                 'repeated': timer.getRepeated(),
1157                                 'repeatedReadable': repeatedReadable(timer.getRepeated()),
1158                                 'justplay': timer.getJustplay(),
1159                                 'justplayReadable': justplayReadable[Number(timer.getJustplay())],
1160                                 'afterevent': timer.getAfterevent(),
1161                                 'aftereventReadable': aftereventReadable[Number(timer.getAfterevent())],
1162                                 'disabled': timer.getDisabled(),
1163                                 'onOff': OnOff[Number(timer.getDisabled())]
1164                                 };
1165                         }
1166                 }
1167                 var data = { recordings : namespace };
1168                 openPopup("Record Now", 'tplTimerListItem', data, 900, 500, "Record now window");
1169         }
1170 }
1171
1172
1173 function recordingPushed() {
1174         doRequest(url_timerlist, incomingRecordingPushed, false);
1175 }
1176
1177
1178 function recordingPushedDecision(recordNowNothing,recordNowUndefinitely,recordNowCurrent) {
1179         var recordNow = recordNowNothing;
1180         recordNow = (recordNow === "") ? recordNowUndefinitely: recordNow;
1181         recordNow = (recordNow === "") ? recordNowCurrent: recordNow;
1182         if(recordNow !== "nothing" && recordNow !== "") {
1183                 doRequest(url_recordnow+"?recordnow="+recordNow, incomingTimerAddResult, false);
1184         }
1185 }
1186
1187 function ifChecked(rObj) {
1188         if(rObj.checked) {
1189                 return rObj.value;
1190         } else {
1191                 return "";
1192         }
1193 }
1194
1195 //About
1196 /*
1197  * Handles an incoming request for /web/about
1198  * Parses the Data, and calls everything needed to render the 
1199  * Template using the parsed data and set the result into contentMain
1200  * @param request - the XHR
1201  */
1202 function incomingAbout(request) {
1203         if(request.readyState == 4){
1204                 debug("[incomingAbout] returned");
1205                 var xml = getXML(request).getElementsByTagName("e2abouts").item(0).getElementsByTagName("e2about");
1206
1207                 xml = xml.item(0);
1208                 
1209                 var namespace = {};
1210                 var ns = [];
1211                 
1212                 try{
1213                         var fptext = "V"+xml.getElementsByTagName('e2fpversion').item(0).firstChild.data;
1214                         
1215                         
1216                         var nims = xml.getElementsByTagName('e2tunerinfo').item(0).getElementsByTagName("e2nim");
1217                         debug("[incomingAbout] nims: "+nims.length);
1218                         for(var i = 0; i < nims.length; i++){
1219                                 
1220                                 var name = nims.item(i).getElementsByTagName("name").item(0).firstChild.data;
1221                                 var type = nims.item(i).getElementsByTagName("type").item(0).firstChild.data;
1222                                 debug("[incomingAbout]" + name);
1223                                 debug("[incomingAbout]" + type);
1224                                 ns[i] = { 'name' : name, 'type' : type};
1225                                 
1226                         }
1227                         
1228                         
1229                         var hdddata = xml.getElementsByTagName('e2hddinfo').item(0);
1230                         
1231                         var hddmodel    = hdddata.getElementsByTagName("model").item(0).firstChild.data;
1232                         var hddcapacity = hdddata.getElementsByTagName("capacity").item(0).firstChild.data;
1233                         var hddfree             = hdddata.getElementsByTagName("free").item(0).firstChild.data;
1234
1235                         namespace = {
1236                                 'model' : xml.getElementsByTagName('e2model').item(0).firstChild.data,  
1237                                 'enigmaVersion': xml.getElementsByTagName('e2enigmaversion').item(0).firstChild.data,
1238                                 'fpVersion': fptext,
1239                                 'webifversion': xml.getElementsByTagName('e2webifversion').item(0).firstChild.data,     
1240                                 'lanMac' : xml.getElementsByTagName('e2lanmac').item(0).firstChild.data,
1241                                 'lanDHCP': xml.getElementsByTagName('e2landhcp').item(0).firstChild.data,
1242                                 'lanIP': xml.getElementsByTagName('e2lanip').item(0).firstChild.data,
1243                                 'lanNetmask': xml.getElementsByTagName('e2lanmask').item(0).firstChild.data,
1244                                 'lanGateway': xml.getElementsByTagName('e2langw').item(0).firstChild.data,
1245
1246                                 'hddmodel': hddmodel,
1247                                 'hddcapacity': hddcapacity,
1248                                 'hddfree': hddfree,
1249                                 
1250                                 'serviceName': xml.getElementsByTagName('e2servicename').item(0).firstChild.data,
1251                                 'serviceProvider': xml.getElementsByTagName('e2serviceprovider').item(0).firstChild.data,
1252                                 'serviceAspect': xml.getElementsByTagName('e2serviceaspect').item(0).firstChild.data,
1253                                 'serviceVideosize': xml.getElementsByTagName('e2servicevideosize').item(0).firstChild.data,
1254                                 'serviceNamespace': xml.getElementsByTagName('e2servicenamespace').item(0).firstChild.data,
1255                                 
1256                                 'vPidh': '0x'+dec2hex(xml.getElementsByTagName('e2vpid').item(0).firstChild.data, 4),
1257                                 'vPid': ownLazyNumber(xml.getElementsByTagName('e2vpid').item(0).firstChild.data),
1258                                 'aPidh': '0x'+dec2hex(xml.getElementsByTagName('e2apid').item(0).firstChild.data, 4),
1259                                 'aPid': ownLazyNumber(xml.getElementsByTagName('e2apid').item(0).firstChild.data),
1260                                 'pcrPidh': '0x'+dec2hex(xml.getElementsByTagName('e2pcrid').item(0).firstChild.data, 4),
1261                                 'pcrPid': ownLazyNumber(xml.getElementsByTagName('e2pcrid').item(0).firstChild.data),
1262                                 'pmtPidh': '0x'+dec2hex(xml.getElementsByTagName('e2pmtpid').item(0).firstChild.data, 4),
1263                                 'pmtPid': ownLazyNumber(xml.getElementsByTagName('e2pmtpid').item(0).firstChild.data),
1264                                 'txtPidh': '0x'+dec2hex(xml.getElementsByTagName('e2txtpid').item(0).firstChild.data, 4),
1265                                 'txtPid': ownLazyNumber(xml.getElementsByTagName('e2txtpid').item(0).firstChild.data),
1266                                 'tsidh': '0x'+dec2hex(xml.getElementsByTagName('e2tsid').item(0).firstChild.data, 4),
1267                                 'tsid': ownLazyNumber(xml.getElementsByTagName('e2tsid').item(0).firstChild.data),
1268                                 'onidh': '0x'+dec2hex(xml.getElementsByTagName('e2onid').item(0).firstChild.data, 4),
1269                                 'onid': ownLazyNumber(xml.getElementsByTagName('e2onid').item(0).firstChild.data),
1270                                 'sidh': '0x'+dec2hex(xml.getElementsByTagName('e2sid').item(0).firstChild.data, 4),
1271                                 'sid': ownLazyNumber(xml.getElementsByTagName('e2sid').item(0).firstChild.data)
1272                         };                                
1273                 } catch (e) {
1274                         debug("[incomingAbout] About parsing Error" + e);
1275                 }
1276
1277                 var data = { about : namespace,
1278                                  tuner : ns};
1279                 processTpl('tplAbout', data, 'contentMain');
1280         }
1281 }
1282
1283
1284 /*
1285  * Show About Information in contentMain
1286  */
1287 function showAbout() {
1288         doRequest(url_about, incomingAbout, false);
1289 }
1290
1291
1292 // Spezial functions, mostly for testing purpose
1293 function openHiddenFunctions(){
1294         openPopup("Extra Hidden Functions",tplExtraHiddenFunctions,300,100,920,0);
1295 }
1296
1297
1298 function startDebugWindow() {
1299         DBG = true;
1300         debugWin = openPopup("DEBUG", "", 300, 300,920,140, "debugWindow");
1301 }
1302
1303
1304 function restartTwisted() {
1305         var request = new Ajax.Request( "/web/restarttwisted", { asynchronous: true, method: "get" });
1306 }
1307
1308
1309 //MediaPlayer
1310 function sendMediaPlayer(command) {
1311         debug("[playFile] loading sendMediaPlayer");
1312         var request = new Ajax.Request( url_mediaplayercmd+command, { asynchronous: true, method: 'get' });
1313 }
1314
1315
1316 function incomingMediaPlayer(request){
1317         if(request.readyState == 4){
1318                 var files = new FileList(getXML(request)).getArray();
1319                 
1320                 debug("[loadMediaPlayer] Got "+files.length+" entries in mediaplayer filelist");
1321                 //listerHtml    = tplMediaPlayerHeader;
1322                 
1323                 var namespace = {};
1324
1325                 var root = files[0].getRoot();
1326                 if (root != "playlist") {
1327                         namespace = {'root': root};
1328                         if(root != '/') {
1329                                 var re = new RegExp(/(.*)\/(.*)\/$/);
1330                                 re.exec(root);
1331                                 var newroot = RegExp.$1+'/';
1332                                 if(newroot == '//') {
1333                                         newroot = '/';
1334                                 }
1335                                 namespace = {
1336                                                 'root': root,
1337                                                 'servicereference': newroot,
1338                                                 'exec': 'loadMediaPlayer',
1339                                                 'exec_description': 'Change to directory ../',
1340                                                 'color': '000000',
1341                                                 'newroot': newroot,
1342                                                 'name': '..'
1343                                 };      
1344                         }
1345                 }
1346                 
1347                 var itemnamespace = Array();
1348                 for ( var i = 0; i <files.length; i++){
1349                         var file = files[i];
1350                         if(file.getNameOnly() == 'None') {
1351                                 continue;
1352                         }
1353                         var exec = 'loadMediaPlayer';
1354                         var exec_description = 'Change to directory' + file.getServiceReference();
1355                         var color = '000000';                   
1356                         var isdir = 'true';
1357                         
1358                         if (file.getIsDirectory() == "False") {
1359                                 exec = 'playFile';
1360                                 exec_description = 'play file';
1361                                 color = '00BCBC';
1362                                 isdir = 'false';
1363                         }
1364                         
1365                         itemnamespace[i] = {
1366                                 'isdir' : isdir,
1367                                 'servicereference': file.getServiceReference(),
1368                                 'exec': exec,
1369                                 'exec_description': exec_description,
1370                                 'color': color,                                                 
1371                                 'root': file.getRoot(),
1372                                 'name': file.getNameOnly()
1373                         };
1374                         
1375                 }
1376                 /*
1377                 if (root == "playlist") {
1378                         listerHtml += tplMediaPlayerFooterPlaylist;
1379                 }
1380                 */
1381                 
1382                 var data = { mp : namespace,
1383                                  items: itemnamespace
1384                 };
1385                 
1386                 processTpl('tplMediaPlayer', data, 'contentMain');
1387                 var sendMediaPlayerTMP = sendMediaPlayer;
1388                 sendMediaPlayer = false;
1389                 //setBodyMainContent('BodyContent');
1390                 sendMediaPlayer = sendMediaPlayerTMP;
1391         }               
1392 }
1393
1394
1395 function loadMediaPlayer(directory){
1396         debug("[loadMediaPlayer] called");
1397         doRequest(url_mediaplayerlist+directory, incomingMediaPlayer, false);
1398 }
1399
1400
1401 function playFile(file,root) {
1402         debug("[playFile] called");
1403         mediaPlayerStarted = true;
1404         var request = new Ajax.Request( url_mediaplayerplay+file+"&root="+root, { asynchronous: true, method: 'get' });
1405 }
1406
1407
1408 function openMediaPlayerPlaylist() {
1409         debug("[playFile] loading openMediaPlayerPlaylist");
1410         doRequest(url_mediaplayerlist+"playlist", incomingMediaPlayer, false);
1411 }
1412
1413
1414 function writePlaylist() {
1415         debug("[playFile] loading writePlaylist");
1416         var filename = prompt("Please enter a name for the playlist", "");
1417         if(filename !== "") {
1418                 var request = new Ajax.Request( url_mediaplayerwrite+filename, { asynchronous: true, method: 'get' });
1419         }
1420 }
1421
1422
1423 //Powerstate
1424 /*
1425  * Sets the Powerstate
1426  * @param newState - the new Powerstate
1427  * Possible Values (also see WebComponents/Sources/PowerState.py)
1428  * #-1: get current state
1429  * # 0: toggle standby
1430  * # 1: poweroff/deepstandby
1431  * # 2: rebootdreambox
1432  * # 3: rebootenigma
1433  */
1434 function sendPowerState(newState){
1435         var request = new Ajax.Request( url_powerstate+'?newstate='+newState, { asynchronous: true, method: 'get' });
1436 }
1437
1438
1439
1440 function delFile(file,root) {
1441         debug("[delFile] called");
1442         doRequest(url_delfile+root+file, incomingDelFileResult, false);
1443 }
1444
1445
1446 //Currently Running Service
1447 function incomingCurrent(request){
1448 //      debug("[incomingCurrent called]");
1449         if(request.readyState == 4){
1450                 try{
1451                         var xml = getXML(request).getElementsByTagName("e2currentserviceinformation").item(0);
1452                         
1453                         
1454                         namespace = {
1455                                 "servicereference" : encodeURIComponent(xml.getElementsByTagName('e2servicereference').item(0).firstChild.data),
1456                                 "servicename" : xml.getElementsByTagName('e2servicename').item(0).firstChild.data,
1457                                 "eventname" : xml.getElementsByTagName('e2eventname').item(0).firstChild.data,
1458                                 "duration" : xml.getElementsByTagName('e2eventduration').item(0).firstChild.data
1459                         };
1460                         
1461                         data = { current : namespace };
1462                         
1463                         if(typeof(templates.tplCurrent) != "undefined"){
1464                                 renderTpl(templates.tplCurrent, data, "currentContent");
1465                         } else {
1466                                 debug("[incomingCurrent] tplCurrent N/A");
1467                         }
1468
1469                 } catch (e){}
1470                 
1471         }
1472 }
1473
1474
1475 function getCurrent(){
1476         doRequest(url_getcurrent, incomingCurrent, false);
1477 }
1478
1479
1480 //Navigation and Content Helper Functions
1481 /*
1482  * Loads all Bouquets for the given enigma2 servicereference and sets the according contentHeader
1483  * @param sRef - the Servicereference for the bouquet to load
1484  */
1485 function getBouquets(sRef){     
1486         var url = url_getServices+encodeURIComponent(sRef);
1487         doRequest(url, incomingBouquetList, true);
1488 }
1489
1490 /*
1491  * Loads another navigation template and sets the navigation header
1492  * @param template - The name of the template
1493  * @param title - The title to set for the navigation
1494  */
1495 function reloadNav(template, title){
1496                 setAjaxLoad('navContent');
1497                 processTpl(template, null, 'navContent');
1498                 setNavHd(title);
1499 }
1500
1501 function getBouquetsTv(){
1502         getBouquets(bouquetsTv);
1503 }
1504
1505 function getProviderTv(){
1506         getBouquets(providerTv);
1507 }
1508
1509 function getAllTv(){
1510         loadBouquet(allTv, "All (TV)");
1511 }
1512
1513
1514 function getBouquetsRadio(){
1515         getBouquets(bouquetsRadio);
1516 }
1517
1518 function getProviderRadio(){
1519         getBouquets(providerRadio);
1520 }
1521
1522 function getAllRadio(){
1523         loadBouquet(allRadio, "All (Radio)");
1524 }
1525
1526 /*
1527  * Loads dynamic content to $(contentMain) by calling a execution function
1528  * @param fnc - The function used to load the content
1529  * @param title - The Title to set on the contentpanel
1530  */
1531 function loadContentDynamic(fnc, title){
1532         setAjaxLoad('contentMain');
1533         setContentHd(title);
1534         stopUpdateBouquetItemsPoller();
1535         
1536         fnc();
1537 }
1538
1539 /*
1540  * Loads a static template to $(contentMain)
1541  * @param template - Name of the Template
1542  * @param title - The Title to set on the Content-Panel
1543  */
1544 function loadContentStatic(template, title){
1545         setAjaxLoad('contentMain');
1546         setContentHd(title);
1547         stopUpdateBouquetItemsPoller();
1548         processTpl(template, null, 'contentMain');
1549 }
1550
1551
1552 /*
1553  * Opens the given Control
1554  * @param control - Control Page as String
1555  * Possible Values: power, about, message, screenshot, videoshot, osdshot
1556  */
1557 function loadControl(control){
1558         switch(control){
1559                 case "power":
1560                         loadContentStatic('tplPower', 'PowerControl');
1561                         break;
1562                 
1563                 case "message":
1564                         loadContentStatic('tplSendMessage', 'Send a Message');
1565                         break;
1566                 
1567                 case "remote":
1568                         loadAndOpenWebRemote();
1569                         break;
1570                         
1571                 case "screenshot":
1572                         loadContentDynamic(getScreenShot, 'Screenshot');
1573                         break;
1574                         
1575                 case "videoshot":
1576                         loadContentDynamic(getVideoShot, 'Videoshot');
1577                         break;
1578                         
1579                 case "osdshot":
1580                         loadContentDynamic(getOsdShot, 'OSDshot');
1581                         break;
1582                         
1583                 default:
1584                         break;
1585         }
1586 }
1587
1588 /*
1589  * Switches Navigation Modes
1590  * @param mode - The Navigation Mode you want to switch to
1591  * Possible Values: TV, Radio, Movies, Timer, Extras
1592  */
1593 function switchMode(mode){
1594         switch(mode){
1595                 case "TV":
1596                         reloadNav('tplNavTv', 'TeleVision');
1597                         break;
1598                 
1599                 case "Radio":
1600                         reloadNav('tplNavRadio', 'Radio');
1601                         break;
1602                 
1603                 case "Movies":
1604                         loadContentDynamic(loadMovieList, 'Movies');
1605                         break;
1606                         
1607                 case "Timer":
1608                         //The Navigation
1609                         reloadNav('tplNavTimer', 'Timer');
1610                         
1611                         //The Timerlist
1612                         loadContentDynamic(loadTimerList, 'Timer');
1613                         break;
1614                 
1615                 case "MediaPlayer":
1616                         loadContentDynamic(loadMediaPlayer, 'MediaPlayer');
1617                         break;
1618                         
1619                 case "BoxControl":
1620                         reloadNav('tplNavBoxControl', 'BoxControl');
1621                         break;
1622                         
1623                 case "About":
1624                         loadContentDynamic(showAbout, 'About');
1625                         break;
1626                 
1627                 default:
1628                         break;
1629         }
1630 }
1631
1632
1633
1634
1635 function updateItems(){
1636         getCurrent();
1637 }
1638
1639 function updateItemsLazy(bouquet){
1640         getSubServices();
1641         getBouquetEpg();
1642 }
1643
1644 /*
1645  * Does the everything required on initial pageload
1646  */
1647
1648 function init(){
1649         if(DBG){
1650                 loadAndOpenDebug();
1651         }
1652         
1653         if (typeof document.body.style.maxHeight == "undefined") {
1654                 alert("Due to the tremendous amount of work needed to get everthing to " +
1655                                 "work properly, there is (for now) no support for Internet Explorer Versions below 7");
1656         }
1657         
1658         getBoxtype();
1659         
1660         setAjaxLoad('navContent');
1661         setAjaxLoad('contentMain');
1662         
1663         fetchTpl('tplServiceListEPGItem');
1664         fetchTpl('tplCurrent');
1665         
1666         reloadNav('tplNavTv', 'TeleVision');
1667         
1668         initChannelList();
1669         initVolumePanel();
1670         
1671         updateItems();
1672 }