by click on icon, an Event will now be added to the Timerlist
[enigma2-plugins.git] / webinterface / src / web-data / tools.js
1 var url_getvolume = '/web/vol?set=state'; 
2 var url_setvolume = '/web/vol?set=set'; // plus new value eq. set=set15
3 var url_volumeup = '/web/vol?set=up';
4 var url_volumedown = '/web/vol?set=down';
5 var url_volumemute = '/web/vol?set=mute';
6
7 var url_epgservice = "/web/epgservice?ref="; // plus serviceRev
8 var url_epgsearch = "/web/epgsearch?search="; // plus serviceRev
9 var url_epgnow = "/web/epgnow?bref="; // plus bouqetRev
10
11 var url_fetchchannels = "/web/fetchchannels?ServiceListBrowse="; // plus encoded serviceref
12
13 var url_updates= "/web/updates";
14
15 var url_movielist= "/web/movielist";
16
17 var url_timerlist= "/web/timerlist";
18 var url_timeradd= "/web/timeradd"; // plus serviceref,begin,end,name,description,eit,disabled,justplay,afterevent
19 var url_timeraddbyeventid= "/web/timeraddbyeventid"; // plus serviceref,eventid
20
21 var windowStyle = "alphacube";
22 var DBG = false;
23
24 /**
25 *
26 *  UTF-8 data encode / decode
27 *  http://www.webtoolkit.info/
28 *
29 **/
30
31 var Utf8 = {
32
33     // public method for url encoding
34     encode : function (string) {
35         string = string.replace(/\r\n/g,"\n");
36         var utftext = "";
37
38         for (var n = 0; n < string.length; n++) {
39
40             var c = string.charCodeAt(n);
41
42             if (c < 128) {
43                 utftext += String.fromCharCode(c);
44             }
45             else if((c > 127) && (c < 2048)) {
46                 utftext += String.fromCharCode((c >> 6) | 192);
47                 utftext += String.fromCharCode((c & 63) | 128);
48             }
49             else {
50                 utftext += String.fromCharCode((c >> 12) | 224);
51                 utftext += String.fromCharCode(((c >> 6) & 63) | 128);
52                 utftext += String.fromCharCode((c & 63) | 128);
53             }
54
55         }
56
57         return utftext;
58     },
59
60     // public method for url decoding
61     decode : function (utftext) {
62         var string = "";
63         var i = 0;
64         var c = c1 = c2 = 0;
65
66         while ( i < utftext.length ) {
67
68             c = utftext.charCodeAt(i);
69
70             if (c < 128) {
71                 string += String.fromCharCode(c);
72                 i++;
73             }
74             else if((c > 191) && (c < 224)) {
75                 c2 = utftext.charCodeAt(i+1);
76                 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
77                 i += 2;
78             }
79             else {
80                 c2 = utftext.charCodeAt(i+1);
81                 c3 = utftext.charCodeAt(i+2);
82                 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
83                 i += 3;
84             }
85
86         }
87
88         return string;
89     }
90
91 }
92
93 // UpdateStreamReader
94 var UpdateStreamReaderNextReadPos = 0;
95 var UpdateStreamReaderPollTimer;
96 UpdateStreamReaderRequest = null;
97 function UpdateStreamReaderStart(){
98         var ua = navigator.userAgent;
99         if(navigator.userAgent.indexOf("MSIE") >=0) {
100                 debug("UpdateStreamReader IE Fix *IE sucks*");
101                 $('UpdateStreamReaderIEFixPanel').innerHTML = '<iframe id="UpdateStreamReaderIEFixIFrame" src="'+url_updates+'" height="0" width="0" scrolling="none" frameborder="0">no iframe support!</iframe>';
102         }else {
103                 debug("UpdateStreamReader Start");
104                 UpdateStreamReaderNextReadPos = 0;
105                 allMessages = "";
106                 UpdateStreamReaderRequest =new XMLHttpRequest();
107                 UpdateStreamReaderRequest.onload = UpdateStreamReaderOnLoad;
108                 UpdateStreamReaderRequest.onerror = UpdateStreamReaderOnError;
109                 UpdateStreamReaderRequest.open("GET", url_updates, true);
110                 UpdateStreamReaderRequest.send(null);
111                 UpdateStreamReaderPollTimer = setInterval(UpdateStreamReaderLatestResponse, 500);
112         }
113 }
114   
115 function UpdateStreamReaderLatestResponse() {
116         var allMessages = UpdateStreamReaderRequest.responseText;
117     do {
118       var unprocessed = allMessages.substring(UpdateStreamReaderNextReadPos);
119       var messageXMLEndIndex = unprocessed.indexOf("\n");
120       if (messageXMLEndIndex!=-1) {
121         var endOfFirstMessageIndex = messageXMLEndIndex + "\n".length;
122         var anUpdate = unprocessed.substring(0, endOfFirstMessageIndex);
123                 anUpdate = anUpdate.replace(/<div id="scriptzone"\/>/,'');
124                 anUpdate = anUpdate.replace(/<script>parent./, '');
125         anUpdate = anUpdate.replace(/<\/script>\n/, '');
126                 anUpdate = Utf8.decode(anUpdate);
127         eval(anUpdate);
128         UpdateStreamReaderNextReadPos += endOfFirstMessageIndex;
129       }
130     } while (messageXMLEndIndex != -1);
131 }
132
133 function UpdateStreamReaderOnLoad(){
134         window.clearInterval(UpdateStreamReaderPollTimer);
135         debug("UpdateStreamReaderOnLoad");
136         Dialog.confirm(
137                 "Live Update Stream ends!<br><br>You will not receive any Update from Enigma2.<br>Should I reconnect?",
138                  {windowParameters: {width:300, className: windowStyle},
139                         okLabel: "reconnect",
140                         buttonClass: "myButtonClass",
141                         cancel: function(win) {debug("cancel confirm panel")},
142                         ok: function(win) {UpdateStreamReaderStart(); return true;}
143                         }
144                 );
145 }
146 function UpdateStreamReaderOnError(){
147         // TODO: change this, because it will be called on 'PageUnload' while the request is still running
148         debug("UpdateStreamReaderOnError");
149         window.clearInterval(UpdateStreamReaderPollTimer);
150         Dialog.confirm(
151                 "Live Update Stream has an Error!<br><br>You will not receive any Update from Enigma2.<br>Should I try to reconnect?",
152                  {windowParameters: {width:300, className: windowStyle},
153                          okLabel: "reconnect",
154                          buttonClass: "myButtonClass",
155                          cancel: function(win) {debug("cancel confirm panel")},
156                          ok: function(win) {UpdateStreamReaderStart(); return true;}
157                         }
158                 );
159 }
160
161 //end UpdateStreamReader
162
163 function openWindow(title, inner, width, height, id){
164                         if(id == null) id = new Date().toUTCString();
165                         
166                         //debug(id);
167                         var win = new Window(id, {className: windowStyle, title: title, width: width, height: height});
168                         win.getContent().innerHTML = inner;
169                         win.setDestroyOnClose();
170                         win.showCenter();
171                         debug("opening Window: "+title);
172                         return win;
173 }
174
175 function messageBox(t, m){
176         Dialog.alert(m, {windowParameters: {title: t, className: windowStyle, width:200}, okLabel: "Close"});
177 }
178
179 function getHTTPObject( ){
180     var xmlHttp = false;
181             
182     // try to create a new instance of the xmlhttprequest object        
183     try{
184         // Internet Explorer
185         if( window.ActiveXObject ){
186             for( var i = 5; i; i-- ){
187                 try{
188                     // loading of a newer version of msxml dll (msxml3 - msxml5) failed
189                     // use fallback solution
190                     // old style msxml version independent, deprecated
191                     if( i == 2 ){
192                         xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );    
193                     }
194                     // try to use the latest msxml dll
195                     else{
196                         
197                         xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
198                     }
199                     break;
200                 }
201                 catch( excNotLoadable ){                        
202                     xmlHttp = false;
203                 }
204             }
205         }
206         // Mozilla, Opera und Safari
207         else if( window.XMLHttpRequest ){
208             xmlHttp = new XMLHttpRequest();
209         }
210     }
211     // loading of xmlhttp object failed
212     catch( excNotLoadable ){
213         xmlHttp = false;
214     }
215     return xmlHttp ;
216 }
217
218 //RND Template Function
219 function RND(tmpl, ns) {
220         var fn = function(w, g) {
221           g = g.split("|");
222           var cnt = ns[g[0]];
223
224           //Support for filter functions
225           for(var i=1; i < g.length; i++) {
226                 cnt = eval(g[i])(cnt);
227           }
228           return cnt || w;
229         };
230         return tmpl.replace(/%\(([A-Za-z0-9_|.]*)\)/g, fn);
231 }
232
233 function debug(text){
234         if(DBG){
235                 try{
236                         debugWin.getContent().innerHTML += "DEBUG: "+text+"<br>";
237                 } catch (windowNotPresent) {}
238         }
239 }
240
241 function showhide(id){
242         o = document.getElementById(id).style;
243         o.display = (o.display!="none")? "none":"";
244 }
245
246 function set(what, value){
247         //debug(what+"-"+value);
248         element = parent.document.getElementById(what);
249         if (element){
250                 element.innerHTML = value;
251         }
252         if(navigator.userAgent.indexOf("MSIE") >=0) {
253                 elementscript= $('UpdateStreamReaderIEFixIFrame').document.getElementById('scriptzone');
254                 if(elementscript){
255                         elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory                    
256                 }
257         }
258 }
259 // requestindikator
260 var requestcounter = 0;
261
262 function requestIndicatorUpdate(){
263         //debug(requestcounter+" open requests");
264         if(requestcounter>=1){
265                 $('RequestIndicator').style.display = "inline";
266         }else{
267                 $('RequestIndicator').style.display = "none";
268         }
269 }
270 function requestStarted(){
271         requestcounter +=1;
272         requestIndicatorUpdate();
273 }
274 function requestFinished(){
275         requestcounter -=1;
276         requestIndicatorUpdate();
277 }
278 // end requestindikator
279
280 function doRequest(url, readyFunction){
281         requestStarted();
282         new Ajax.Request(url,
283                 {
284                         method: 'get',
285                         requestHeaders: ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate', 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT'],
286                         onSuccess: readyFunction,
287                         onComplete: requestFinished 
288                 });
289 }
290
291 function getXML(request){
292         if (document.implementation && document.implementation.createDocument){
293                 debug("using responseXML");
294                 var xmlDoc = request.responseXML
295         }
296         else if (window.ActiveXObject){
297                 debug("Creating XML for IE");
298                 var xmlInsert = document.createElement('xml');
299
300                 xmlInsert.setAttribute('innerHTML',request.responseText);
301                 xmlInsert.setAttribute('id','_MakeAUniqueID');
302                 document.body.appendChild(xmlInsert);
303                 xmlDoc = document.getElementById('_MakeAUniqueID');
304                 document.body.removeChild(document.getElementById('_MakeAUniqueID'));
305         } else {
306                 debug("Your Browser Sucks!");
307         }
308         return xmlDoc;
309 }
310
311 function zap(servicereference){
312         var url = "/web/zap?ZapTo=" + servicereference;
313         debug("requesting "+url);
314         new Ajax.Request( url,
315                 {
316                         method: 'get'                           
317                 });
318 }
319 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
320 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
321 //++++       SignalPanel                           ++++
322 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
323 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
324
325 function initSignalPanel(){
326         $('SignalPanel').innerHTML = tplSignalPanelButton;
327 }
328 function openSignalDialog(){
329         openWindow("Signal Info",tplSignalPanel, 215, 75);
330 }
331
332 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
333 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
334 //++++ EPG functions                               ++++
335 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
336 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
337 var EPGList = Class.create();
338 EPGList.prototype = {
339         //contructor
340         initialize: function(){
341                 debug("init class EPGList");
342         },
343         getBySearchString: function(string){
344                 debug("requesting "+ url_epgsearch+string);
345                 doRequest(url_epgsearch+string,this.incomingEPGrequest);
346                 
347         },
348         getByServiceReference: function(servicereference){
349                 doRequest(url_epgservice+servicereference,this.incomingEPGrequest);
350         },
351         renderTable: function(epglist){
352                 debug("rendering Table with "+epglist.length+" events");
353                 var html = tplEPGListHeader;
354                 for (var i=0; i < epglist.length; i++){
355                         try{
356                                 var item = epglist[i];                          
357                                 //Create JSON Object for Template
358                                 var namespace = {       'date': item.getTimeDay(), 
359                                                                         'eventid': item.getEventId(), 
360                                                                         'servicereference': item.getServiceReference(), 
361                                                                         'servicename': item.getServiceName(), 
362                                                                         'title': item.getTitle(),
363                                                                         'titleESC': escape(item.getTitle()),
364                                                                         'starttime': item.getTimeStartString(), 
365                                                                         'duration': (item.getDuration()/60000), 
366                                                                         'description': item.getDescription(), 
367                                                                         'endtime': item.getTimeEndString(), 
368                                                                         'extdescription': item.getDescriptionExtended()
369                                                                 };
370                                 //Fill template with data and add id to our result
371                                 html += RND(tplEPGListItem, namespace);
372                         } catch (blubb) {
373                                 //debug("Error rendering: "+blubb);
374                         }
375                 }               
376                 html += tplEPGListFooter;
377                 openWindow("Electronic Program Guide", html, 900, 500);
378                 
379         },
380         incomingEPGrequest: function(request){
381                 debug("incoming request" +request.readyState);          
382                 if (request.readyState == 4)
383                 {
384                         var EPGItems = getXML(request).getElementsByTagName("e2eventlist").item(0).getElementsByTagName("e2event");                     
385                         debug("have "+EPGItems.length+" e2events");
386                         if(EPGItems.length > 0){                        
387                                 epglist = new Array();
388                                 for(var i=0; i < EPGItems.length; i++){         
389                                         epglist.push(new EPGEvent(EPGItems.item(i)));
390                                 }
391                                 debug("Calling prototype.renderTable(epglist)");
392                                 EPGList.prototype.renderTable(epglist);
393                                 
394                         } else {
395                                 messageBox('No Items found!', 'Sorry but i could not find any EPG Content containing your search value');
396                         }
397                         
398                 }
399         }
400         
401 }
402 /////////////////////////
403
404 function loadServiceEPGNowNext(servicereference){
405         var url = url_epgnow+servicereference;
406         doRequest(url, incomingServiceEPGNowNext);      
407 }
408
409 function incomingServiceEPGNowNext(request){
410         if(request.readyState == 4){
411                 var epgevents = getXML(request).getElementsByTagName("e2eventlist").item(0).getElementsByTagName("e2event");
412                 for (var c =0; c < epgevents.length;c++){
413                         var eventnow = new EPGEvent(epgevents.item(c));
414                         
415                         if (eventnow.getEventId() != 'None'){
416                                 buildServiceListEPGItem(eventnow,"NOW");
417                         }
418                 }
419         }
420 }
421 function buildServiceListEPGItem(epgevent,nownext){
422         var e = $(epgevent.getServiceReference()+'EPG'+nownext);
423                 try{
424                         var namespace = {       'starttime': epgevent.getTimeStartString(), 
425                                                                 'title': epgevent.getTitle(), 
426                                                                 'length': (epgevent.duration/60) 
427                                                         };
428                         e.innerHTML = RND(tplServiceListEPGItem, namespace);
429                 } catch (blubb) {
430                         debug("Error rendering: "+blubb);
431                 }       
432 }
433 ///////////////////
434
435
436 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
437 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
438 //++++ GUI functions                               ++++
439 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
440 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
441
442 var currentBodyMainElement = null
443
444 function setBodyMainContent(newelementname){
445         newelement =document.getElementById(newelementname);
446         if(currentBodyMainElement != null){
447                 currentBodyMainElement.style.display = "none";
448                 
449         }
450         newelement.style.display = "";
451         currentBodyMainElement = newelement;
452 }
453
454 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
455 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
456 //++++ volume functions                            ++++
457 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
458 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
459
460 function initVolumePanel(){
461         document.getElementById('VolumePanel').innerHTML = tplVolumePanel;
462         getVolume(); 
463 }
464 function getVolume()
465 {
466         doRequest(url_getvolume,handleVolumeRequest);
467 }
468 function volumeSet(newvalue)
469 {
470         doRequest(url_setvolume+newvalue,handleVolumeRequest);
471 }
472 function volumeUp()
473 {
474         doRequest(url_volumeup,handleVolumeRequest);
475 }
476 function volumeDown()
477 {
478         doRequest(url_volumedown,handleVolumeRequest);  
479 }
480 function volumeMute()
481 {
482         doRequest(url_volumemute,handleVolumeRequest);
483 }
484 function handleVolumeRequest(request){
485         if (request.readyState == 4) {
486                 var b = getXML(request).getElementsByTagName("e2volume");
487                 var newvalue = b.item(0).getElementsByTagName('e2current').item(0).firstChild.data;
488                 var mute = b.item(0).getElementsByTagName('e2ismuted').item(0).firstChild.data;
489                 debug("volume"+newvalue+";"+mute);
490                 
491                 for (var i = 1; i <= 10; i++)
492                 {
493                         if ( (newvalue/10)>=i){
494                                 $("volume"+i).src = "/webdata/gfx/led_on.png";
495                         }else{
496                                 $("volume"+i).src = "/webdata/gfx/led_off.png";
497                         }
498                 }
499                 if (mute == "False"){
500                         $("speaker").src = "/webdata/gfx/speak_on.png";
501                 }else{
502                         $("speaker").src = "/webdata/gfx/speak_off.png";
503                 }
504         }       
505 }
506 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
507 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
508 //++++ bouquet managing functions                  ++++
509 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
510 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
511 function initChannelList(){
512         //debug("init ChannelList");    
513         
514         var url = url_fetchchannels+encodeURIComponent('1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)FROM BOUQUET "bouquets.tv" ORDER BY bouquet');
515         doRequest(url, incomingTVBouquetList);
516
517         var url = url_fetchchannels+encodeURIComponent('1:7:2:0:0:0:0:0:0:0:(type == 2)FROM BOUQUET "bouquets.radio" ORDER BY bouquet');
518         doRequest(url, incomingRadioBouquetList);
519
520         var url = url_fetchchannels+encodeURIComponent('1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) FROM PROVIDERS ORDER BY name');
521         doRequest(url, incomingProviderTVBouquetList);
522
523         var url = url_fetchchannels+encodeURIComponent('1:7:2:0:0:0:0:0:0:0:(type == 2) FROM PROVIDERS ORDER BY name');
524         doRequest(url, incomingProviderRadioBouquetList);
525 }
526 var servicereftoloadepgnow="";
527 function loadBouquet(servicereference){ 
528         debug("loading bouquet with "+servicereference);
529         //$('ServiceListBouqetReference').innerHTML =
530         servicereftoloadepgnow = servicereference;
531         doRequest(url_fetchchannels+servicereference, incomingChannellist);
532 }
533
534 function incomingTVBouquetList(request){
535         if (request.readyState == 4) {
536                 var list0 = new ServiceList(getXML(request)).getArray();
537                 debug("have "+list0.length+" TV Bouquet ");     
538                 $('accordionMenueBouquetContentTV').innerHTML = renderBouquetTable(list0,tplBouquetListItem);
539                 //loading first entry of TV Favorites as default for ServiceList
540                 loadBouquet(list0[0].getServiceReference());
541         }
542 }
543 function incomingRadioBouquetList(request){
544         if (request.readyState == 4) {
545                 var list1 = new ServiceList(getXML(request)).getArray();
546                 debug("have "+list1.length+" Radio Bouquet ");  
547                 $('accordionMenueBouquetContentRadio').innerHTML = renderBouquetTable(list1,tplBouquetListItem);
548         }       
549 }
550 function incomingProviderTVBouquetList(request){
551         if (request.readyState == 4) {
552                 var list2 = new ServiceList(getXML(request)).getArray();
553                 debug("have "+list2.length+" TV Provider Bouquet ");    
554                 $('accordionMenueBouquetContentProviderTV').innerHTML = renderBouquetTable(list2,tplBouquetListItem);
555         }       
556 }
557 function incomingProviderRadioBouquetList(request){
558         if (request.readyState == 4) {
559                 var list2 = new ServiceList(getXML(request)).getArray();
560                 debug("have "+list2.length+" Radio Provider Bouquet "); 
561                 $('accordionMenueBouquetContentProviderRadio').innerHTML = renderBouquetTable(list2,tplBouquetListItem);
562         }       
563 }
564
565 function renderBouquetTable(bouquet,template){
566         debug("renderBouquetTable with "+bouquet.length+" Bouqet");     
567         var html = tplBouquetListHeader;
568         for (var i=0; i < bouquet.length; i++){
569                 try{
570                         var namespace = {
571                                 'servicereference': bouquet[i].getServiceReference(), 
572                                 'bouquetname': bouquet[i].getServiceName()
573                                 };
574                         html += RND(template, namespace);
575                 } catch (blubb) {}
576         }
577         html += tplBouquetListFooter;
578         return html;
579 }       
580
581 function incomingChannellist(request){
582         if(request.readyState == 4){
583                 var services = new ServiceList(getXML(request)).getArray();
584                 listerHtml      = tplServiceListHeader;         
585                 debug("got "+services.length+" Services");
586                 for ( var i = 0; i < services.length ; i++){
587                         var reference = services[i];
588                         var namespace = {       'servicereference': reference.getServiceReference(),
589                                                                 'servicename': reference.getServiceName() 
590                                                         };
591                         listerHtml += RND(tplServiceListItem, namespace);
592                 }               
593                 listerHtml += tplServiceListFooter;
594                 document.getElementById('BodyContentChannellist').innerHTML = listerHtml;
595                 setBodyMainContent('BodyContentChannellist');
596                 //loadServiceEPGNowNext($('ServiceListBouqetReference').innerHTML);
597                 loadServiceEPGNowNext(servicereftoloadepgnow);
598         }
599 }
600 // Movies
601 function loadMovieList(){
602         debug("loading movies");
603         doRequest(url_movielist, incomingMovieList);    
604 }
605
606 function incomingMovieList(request){
607         if(request.readyState == 4){
608                 var movies = new MovieList(getXML(request)).getArray();
609                 debug("have "+movies.length+" movies");
610                 listerHtml      = tplMovieListHeader;           
611                 for ( var i = 0; i <movies.length; i++){
612                         var movie = movies[i];
613                         var namespace = {       'servicereference': movie.getServiceReference(),
614                                                                 'servicename': movie.getServiceName() ,
615                                                                 'title': movie.getTitle(), 
616                                                                 'description': movie.getDescription(), 
617                                                                 'tags': movie.getTags().join(', ') 
618                                                         };
619                         listerHtml += RND(tplMovieListItem, namespace);
620                 }
621                 listerHtml += tplMovieListFooter;
622                 document.getElementById('BodyContentChannellist').innerHTML = listerHtml;
623                 setBodyMainContent('BodyContentChannellist');
624                 
625         }               
626 }
627
628 // Timer
629 function addTimerByID(serviceRef,eventID){
630         debug("adding timer by eventid="+eventID+" for "+serviceRef);
631         doRequest(url_timeraddbyeventid+"?serviceref="+serviceRef+"&eventid="+eventID, onTimerAdded);   
632 }
633 function onTimerAdded(request){
634         debug("onTimerAdded");  
635 }