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';
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
11 var url_fetchchannels = "/web/fetchchannels?ServiceListBrowse="; // plus encoded serviceref
13 var url_updates= "/web/updates";
15 var url_movielist= "/web/movielist";
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
21 var windowStyle = "alphacube";
26 * UTF-8 data encode / decode
27 * http://www.webtoolkit.info/
33 // public method for url encoding
34 encode : function (string) {
35 string = string.replace(/\r\n/g,"\n");
38 for (var n = 0; n < string.length; n++) {
40 var c = string.charCodeAt(n);
43 utftext += String.fromCharCode(c);
45 else if((c > 127) && (c < 2048)) {
46 utftext += String.fromCharCode((c >> 6) | 192);
47 utftext += String.fromCharCode((c & 63) | 128);
50 utftext += String.fromCharCode((c >> 12) | 224);
51 utftext += String.fromCharCode(((c >> 6) & 63) | 128);
52 utftext += String.fromCharCode((c & 63) | 128);
60 // public method for url decoding
61 decode : function (utftext) {
66 while ( i < utftext.length ) {
68 c = utftext.charCodeAt(i);
71 string += String.fromCharCode(c);
74 else if((c > 191) && (c < 224)) {
75 c2 = utftext.charCodeAt(i+1);
76 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
80 c2 = utftext.charCodeAt(i+1);
81 c3 = utftext.charCodeAt(i+2);
82 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
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>';
103 debug("UpdateStreamReader Start");
104 UpdateStreamReaderNextReadPos = 0;
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);
115 function UpdateStreamReaderLatestResponse() {
116 var allMessages = UpdateStreamReaderRequest.responseText;
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);
128 UpdateStreamReaderNextReadPos += endOfFirstMessageIndex;
130 } while (messageXMLEndIndex != -1);
133 function UpdateStreamReaderOnLoad(){
134 window.clearInterval(UpdateStreamReaderPollTimer);
135 debug("UpdateStreamReaderOnLoad");
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;}
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);
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;}
161 //end UpdateStreamReader
163 function openWindow(title, inner, width, height, id){
164 if(id == null) id = new Date().toUTCString();
167 var win = new Window(id, {className: windowStyle, title: title, width: width, height: height});
168 win.getContent().innerHTML = inner;
169 win.setDestroyOnClose();
171 debug("opening Window: "+title);
175 function messageBox(t, m){
176 Dialog.alert(m, {windowParameters: {title: t, className: windowStyle, width:200}, okLabel: "Close"});
179 function getHTTPObject( ){
182 // try to create a new instance of the xmlhttprequest object
185 if( window.ActiveXObject ){
186 for( var i = 5; i; i-- ){
188 // loading of a newer version of msxml dll (msxml3 - msxml5) failed
189 // use fallback solution
190 // old style msxml version independent, deprecated
192 xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );
194 // try to use the latest msxml dll
197 xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
201 catch( excNotLoadable ){
206 // Mozilla, Opera und Safari
207 else if( window.XMLHttpRequest ){
208 xmlHttp = new XMLHttpRequest();
211 // loading of xmlhttp object failed
212 catch( excNotLoadable ){
218 //RND Template Function
219 function RND(tmpl, ns) {
220 var fn = function(w, g) {
224 //Support for filter functions
225 for(var i=1; i < g.length; i++) {
226 cnt = eval(g[i])(cnt);
230 return tmpl.replace(/%\(([A-Za-z0-9_|.]*)\)/g, fn);
233 function debug(text){
236 debugWin.getContent().innerHTML += "DEBUG: "+text+"<br>";
237 } catch (windowNotPresent) {}
241 function showhide(id){
242 o = document.getElementById(id).style;
243 o.display = (o.display!="none")? "none":"";
246 function set(what, value){
247 //debug(what+"-"+value);
248 element = parent.document.getElementById(what);
250 element.innerHTML = value;
252 if(navigator.userAgent.indexOf("MSIE") >=0) {
253 elementscript= $('UpdateStreamReaderIEFixIFrame').document.getElementById('scriptzone');
255 elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory
260 var requestcounter = 0;
262 function requestIndicatorUpdate(){
263 //debug(requestcounter+" open requests");
264 if(requestcounter>=1){
265 $('RequestIndicator').style.display = "inline";
267 $('RequestIndicator').style.display = "none";
270 function requestStarted(){
272 requestIndicatorUpdate();
274 function requestFinished(){
276 requestIndicatorUpdate();
278 // end requestindikator
280 function doRequest(url, readyFunction){
282 new Ajax.Request(url,
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
291 function getXML(request){
292 if (document.implementation && document.implementation.createDocument){
293 debug("using responseXML");
294 var xmlDoc = request.responseXML
296 else if (window.ActiveXObject){
297 debug("Creating XML for IE");
298 var xmlInsert = document.createElement('xml');
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'));
306 debug("Your Browser Sucks!");
311 function zap(servicereference){
312 var url = "/web/zap?ZapTo=" + servicereference;
313 debug("requesting "+url);
314 new Ajax.Request( url,
319 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
320 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
321 //++++ SignalPanel ++++
322 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
323 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
325 function initSignalPanel(){
326 $('SignalPanel').innerHTML = tplSignalPanelButton;
328 function openSignalDialog(){
329 openWindow("Signal Info",tplSignalPanel, 215, 75);
332 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
333 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
334 //++++ EPG functions ++++
335 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
336 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
337 var EPGList = Class.create();
338 EPGList.prototype = {
340 initialize: function(){
341 debug("init class EPGList");
343 getBySearchString: function(string){
344 debug("requesting "+ url_epgsearch+string);
345 doRequest(url_epgsearch+string,this.incomingEPGrequest);
348 getByServiceReference: function(servicereference){
349 doRequest(url_epgservice+servicereference,this.incomingEPGrequest);
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++){
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()
370 //Fill template with data and add id to our result
371 html += RND(tplEPGListItem, namespace);
373 //debug("Error rendering: "+blubb);
376 html += tplEPGListFooter;
377 openWindow("Electronic Program Guide", html, 900, 500);
380 incomingEPGrequest: function(request){
381 debug("incoming request" +request.readyState);
382 if (request.readyState == 4)
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)));
391 debug("Calling prototype.renderTable(epglist)");
392 EPGList.prototype.renderTable(epglist);
395 messageBox('No Items found!', 'Sorry but i could not find any EPG Content containing your search value');
402 /////////////////////////
404 function loadServiceEPGNowNext(servicereference){
405 var url = url_epgnow+servicereference;
406 doRequest(url, incomingServiceEPGNowNext);
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));
415 if (eventnow.getEventId() != 'None'){
416 buildServiceListEPGItem(eventnow,"NOW");
421 function buildServiceListEPGItem(epgevent,nownext){
422 var e = $(epgevent.getServiceReference()+'EPG'+nownext);
424 var namespace = { 'starttime': epgevent.getTimeStartString(),
425 'title': epgevent.getTitle(),
426 'length': (epgevent.duration/60)
428 e.innerHTML = RND(tplServiceListEPGItem, namespace);
430 debug("Error rendering: "+blubb);
436 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
437 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
438 //++++ GUI functions ++++
439 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
440 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
442 var currentBodyMainElement = null
444 function setBodyMainContent(newelementname){
445 newelement =document.getElementById(newelementname);
446 if(currentBodyMainElement != null){
447 currentBodyMainElement.style.display = "none";
450 newelement.style.display = "";
451 currentBodyMainElement = newelement;
454 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
455 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
456 //++++ volume functions ++++
457 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
458 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
460 function initVolumePanel(){
461 document.getElementById('VolumePanel').innerHTML = tplVolumePanel;
466 doRequest(url_getvolume,handleVolumeRequest);
468 function volumeSet(newvalue)
470 doRequest(url_setvolume+newvalue,handleVolumeRequest);
474 doRequest(url_volumeup,handleVolumeRequest);
476 function volumeDown()
478 doRequest(url_volumedown,handleVolumeRequest);
480 function volumeMute()
482 doRequest(url_volumemute,handleVolumeRequest);
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);
491 for (var i = 1; i <= 10; i++)
493 if ( (newvalue/10)>=i){
494 $("volume"+i).src = "/webdata/gfx/led_on.png";
496 $("volume"+i).src = "/webdata/gfx/led_off.png";
499 if (mute == "False"){
500 $("speaker").src = "/webdata/gfx/speak_on.png";
502 $("speaker").src = "/webdata/gfx/speak_off.png";
506 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
507 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
508 //++++ bouquet managing functions ++++
509 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
510 //+++++++++++++++++++++++++++++++++++++++++++++++++++++
511 function initChannelList(){
512 //debug("init ChannelList");
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);
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);
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);
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);
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);
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());
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);
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);
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);
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++){
571 'servicereference': bouquet[i].getServiceReference(),
572 'bouquetname': bouquet[i].getServiceName()
574 html += RND(template, namespace);
577 html += tplBouquetListFooter;
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()
591 listerHtml += RND(tplServiceListItem, namespace);
593 listerHtml += tplServiceListFooter;
594 document.getElementById('BodyContentChannellist').innerHTML = listerHtml;
595 setBodyMainContent('BodyContentChannellist');
596 //loadServiceEPGNowNext($('ServiceListBouqetReference').innerHTML);
597 loadServiceEPGNowNext(servicereftoloadepgnow);
601 function loadMovieList(){
602 debug("loading movies");
603 doRequest(url_movielist, incomingMovieList);
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(', ')
619 listerHtml += RND(tplMovieListItem, namespace);
621 listerHtml += tplMovieListFooter;
622 document.getElementById('BodyContentChannellist').innerHTML = listerHtml;
623 setBodyMainContent('BodyContentChannellist');
629 function addTimerByID(serviceRef,eventID){
630 debug("adding timer by eventid="+eventID+" for "+serviceRef);
631 doRequest(url_timeraddbyeventid+"?serviceref="+serviceRef+"&eventid="+eventID, onTimerAdded);
633 function onTimerAdded(request){
634 debug("onTimerAdded");