3 var doRequestMemory = {};
4 var doRequestMemorySave = {};
5 var signalPanelData = {};
7 var bouquetsMemory = {};
8 var loadedChannellist = {};
11 var mediaPlayerStarted = false;
12 var popUpBlockerHinted = false;
15 var parentControlList = null;
18 var requestcounter = 0;
22 var webRemoteWin = '';
23 var signalPanelUpdatePoller = '';
24 var EPGListWindow = '';
26 var currentBouquet = bouquetsTv;
28 var updateBouquetItemsPoller = '';
29 var updateCurrentPoller = setInterval(updateItems, 7500);
35 * Set boxtype Variable for being able of determining model specific stuff correctly (like WebRemote)
37 function incomingAboutBoxtype(request){
38 debug("[incomingAboutBoxtype] returned");
39 var xml = getXML(request).getElementsByTagName("e2abouts").item(0).getElementsByTagName("e2about");
42 boxtype = xml.getElementsByTagName('e2model').item(0).firstChild.data;
43 debug("[incomingAboutBoxtype] Boxtype: " + boxtype);
47 function getBoxtype(){
48 doRequest(url_about, incomingAboutBoxtype, false);
51 function notify(text, state){
54 $('notification').style.background = "#C00";
57 $('notification').style.background = "#85C247";
60 set('notification', "<div>"+text+"</div>");
61 $('notification').appear({duration : 0.5, to: 0.9 });
62 setTimeout(hideNotifier, 3000);
65 function hideNotifier(){
66 $('notification').fade({duration : 0.5 })
69 function simpleResultHandler(simpleResult){
70 notify(simpleResult.statetext, simpleResult.state);
74 function startUpdateBouquetItemsPoller(){
75 debug("[startUpdateBouquetItemsPoller] called");
76 updateBouquetItemsPoller = setInterval(updateItemsLazy, 60000);
80 function stopUpdateBouquetItemsPoller(){
81 debug("[stopUpdateBouquetItemsPoller] called");
82 clearInterval(updateBouquetItemsPoller);
86 function ownLazyNumber(num) {
95 function dec2hex(nr, len){
97 var hex = parseInt(nr, 10).toString(16).toUpperCase();
100 while(hex.length < len){
110 function quotes2html(txt) {
111 return txt.replace(/'/g, "\\'").replace(/"/g, '"');
114 function addLeadingZero(nr){
121 function dateToString(date){
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());
135 function showhide(id){
137 o.display = (o.display!="none")? "none":"";
143 $(id).style.display = "";
150 $(id).style.display = "none";
155 function set(element, value){
156 if(element == "CurrentService") {
157 if(value.search(/^MP3 File:/) != -1) {
158 value = value.replace(/.*\//, '');
161 element = parent.$(element);
162 if(value.length > 550) {
163 value = value.substr(0,550) + "[...]";
166 element.innerHTML = value;
168 if(navigator.userAgent.indexOf("MSIE") >=0) {
170 var elementscript = $('UpdateStreamReaderIEFixIFrame').$('scriptzone');
172 elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory
180 function setComplete(element, value){
181 //debug(element+"-"+value);
182 element = parent.$(element);
184 element.innerHTML = value;
186 if(navigator.userAgent.indexOf("MSIE") >= 0) {
187 elementscript= $('UpdateStreamReaderIEFixIFrame').$('scriptzone');
189 elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory
196 * Sets the Loading Notification to the given HTML Element
197 * @param targetElement - The element the Ajax-Loader should be set in
199 function setAjaxLoad(targetElement){
200 $(targetElement).innerHTML = getAjaxLoad();
204 //Ajax Request Helpers
207 function requestIndicatorUpdate(){
208 /*debug(requestcounter+" open requests");
209 if(requestcounter>=1){
210 $('RequestIndicator').style.display = "inline";
212 $('RequestIndicator').style.display = "none";
216 function requestStarted(){
218 requestIndicatorUpdate();
221 function requestFinished(){
223 requestIndicatorUpdate();
226 //Popup And Messagebox Helpers
227 function messageBox(m){
232 function popUpBlockerHint(){
233 if(!popUpBlockerHinted){
234 messageBox("Please disable your Popup-Blocker for enigma2 WebControl to work flawlessly!");
235 popUpBlockerHinted = true;
239 function setWindowContent(window, html){
240 window.document.write(html);
241 window.document.close();
244 function openPopup(title, html, width, height, x, y){
246 var popup = window.open('about:blank',title,'scrollbars=yes, width='+width+',height='+height);
247 setWindowContent(popup, html);
256 function saveTpl(request, tplName){
257 debug("[saveTpl] saving template: " + tplName);
258 templates[tplName] = request.responseText;
262 function renderTpl(tpl, data, domElement) {
263 var result = tpl.process(data);
266 $(domElement).innerHTML = result;
268 // debug("[renderTpl] exception: " + ex);
273 function fetchTpl(tplName, callback){
274 if(typeof(templates[tplName]) == "undefined") {
275 var url = url_tpl+tplName+".htm";
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);
284 onSuccess: function(transport){
285 saveTpl(transport, tplName);
286 if(typeof(callback) == 'function'){
290 onComplete: requestFinished
293 var request = new Ajax.Request(url, options);
295 if(typeof(callback) != 'undefined'){
301 function incomingProcessTpl(request, data, domElement, callback){
302 if(request.readyState == 4){
303 renderTpl(request.responseText, data, domElement);
304 if(typeof(callback) == 'function') {
310 function processTpl(tplName, data, domElement, callback){
311 var url = url_tpl+tplName+".htm";
312 var request = new Ajax.Request(url,
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));
322 onSuccess: function(transport){
323 incomingProcessTpl(transport, data, domElement, callback);
325 onComplete: requestFinished
332 function openDebug(){
333 debugWin = openPopup("Debug", templates.tplDebug, 500, 300);
337 function loadAndOpenDebug(){
338 fetchTpl('tplDebug', openDebug);
342 function debug(text){
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;
349 } catch (Exception) {
358 // end requestindikator
359 function doRequest(url, readyFunction, save){
361 doRequestMemorySave[url] = save;
362 // debug("[doRequest] Requesting: "+url);
364 if(save == true && typeof(doRequestMemory[url]) != "undefined") {
365 readyFunction(doRequestMemory[url]);
369 var request = new Ajax.Request(url,
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;
382 if(typeof(readyFunction) != "undefined"){
383 readyFunction(transport);
386 onComplete: requestFinished
392 function getXML(request){
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;
408 function incomingParentControl(request) {
409 if(request.readyState == 4){
410 parentControlList = new ServiceList(getXML(request)).getArray();
411 debug("[incomingParentControl] Got "+parentControlList.length + " services");
415 function getParentControl() {
416 doRequest(url_parentcontrol, incomingParentControl, false);
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();
432 function parentPin(servicereference) {
433 debug ("parentPin: parentControlList");
434 servicereference = decodeURIComponent(servicereference);
435 if(parentControlList === null || String(getSettingByName("config.ParentalControl.configured")) != "true") {
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");
445 debug("[parentPin] sRef differs ");
448 debug("[parentPin] Asking for PIN");
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")) ) {
455 return parentPin(servicereference);
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();
476 function incomingGetDreamboxSettings(request){
477 if(request.readyState == 4){
478 var settings = new Settings(getXML(request)).getArray();
480 debug ("starte getParentControl " + getSettingByName("config.ParentalControl.configured"));
481 if(String(getSettingByName("config.ParentalControl.configured")) == "true") {
487 function getDreamboxSettings(){
488 doRequest(url_settings, incomingGetDreamboxSettings, false);
493 function incomingSubServiceRequest(request){
494 if(request.readyState == 4){
495 var services = new ServiceList(getXML(request)).getArray();
496 debug("[incomingSubServiceRequest] Got " + services.length + " SubServices");
498 if(services.length > 1) {
500 var first = services[0];
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];
509 'servicereference': reference.getServiceReference(),
510 'servicename': reference.getServiceName()
513 var data = { subservices : namespace };
516 var id = 'SUB'+first.getServiceReference();
518 processTpl('tplSubServices', data, id);
524 function getSubServices(bouquet) {
525 doRequest(url_subservices, incomingSubServiceRequest, false);
529 function delayedGetSubservices(){
530 setTimeout(getSubServices, 5000);
534 function zap(servicereference){
535 var request = new Ajax.Request( "/web/zap?sRef=" + servicereference,
541 delayedGetSubservices();
546 function updateSignalPanel(){
547 var html = templates.tplSignalPanel.process(signalPanelData);
549 if (!signalWin.closed && signalWin.location) {
550 setWindowContent(signalWin, html);
552 clearInterval(signalPanelUpdatePoller);
553 signalPanelUpdatePoller = '';
557 function incomingSignalPanel(request){
560 if (request.readyState == 4){
561 var xml = getXML(request).getElementsByTagName("e2frontendstatus").item(0);
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
570 signalPanelData = { signal : namespace };
571 fetchTpl('tplSignalPanel', updateSignalPanel);
574 function reloadSignalPanel(){
575 doRequest(url_signal, incomingSignalPanel, false);
578 function openSignalPanel(){
579 if (!(!signalWin.closed && signalWin.location)){
580 signalWin = openPopup('SignalPanel', '', 220, 120);
581 if(signalPanelUpdatePoller === ''){
582 signalPanelUpdatePoller = setInterval(reloadSignalPanel, 5000);
591 function showEpgList(){
592 var html = templates.tplEpgList.process(epgListData);
594 if (!EPGListWindow.closed && EPGListWindow.location) {
595 setWindowContent(EPGListWindow, html);
597 EPGListWindow = openPopup("EPG", html, 900, 500);
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){
608 for (var i=0; i < EPGItems.length; i++){
610 var item = EPGItems[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()),
624 'start': item.getTimeBegin(),
625 'end': item.getTimeEnd()
628 } catch (Exception) {
629 debug("[incomingEPGrequest] Error rendering: " + Exception);
633 epgListData = {epg : namespace};
634 fetchTpl('tplEpgList', showEpgList);
636 messageBox('No Items found!', 'Sorry but I could not find any EPG Content containing your search value');
641 function loadEPGBySearchString(string){
642 doRequest(url_epgsearch+escape(string),incomingEPGrequest, false);
645 function loadEPGByServiceReference(servicereference){
646 doRequest(url_epgservice+servicereference,incomingEPGrequest, false);
649 //function extdescriptionSmall(txt,num) {
650 // if(txt.length > 410) {
651 // var shortTxt = txt.substr(0,410);
652 // txt = txt.replace(/\'\'/g, '"');
653 // txt = txt.replace(/\\/g, '\\\\');
654 // txt = txt.replace(/\'/g, '\\\'');
655 // txt = txt.replace(/\"/g, '"');
656 // var smallNamespace = { 'txt':txt,'number':num, 'shortTxt':shortTxt};
657 // return RND(tplEPGListItemExtend, smallNamespace);
663 function buildServiceListEPGItem(epgevent, type){
665 'starttime': epgevent.getTimeStartString(),
666 'title': epgevent.getTitle(),
667 'length': Math.ceil(epgevent.duration/60)
669 var data = {epg : namespace};
670 //e.innerHTML = RND(tplServiceListEPGItem, namespace);
672 var id = type + epgevent.getServiceReference();
676 if(typeof(templates.tplServiceListEPGItem) != "undefined"){
677 renderTpl(templates.tplServiceListEPGItem, data, id, true);
679 debug("[buildServiceListEPGItem] tplServiceListEPGItem N/A");
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++){
688 var epgEvt = new EPGEvent(epgevents.item(c));
690 debug("[incomingServiceEPGNowNext]" + e);
693 if (epgEvt.getEventId() != 'None'){
694 buildServiceListEPGItem(epgEvt, type);
700 function incomingServiceEPGNow(request){
701 incomingServiceEPGNowNext(request, 'NOW');
704 function incomingServiceEPGNext(request){
705 incomingServiceEPGNowNext(request, 'NEXT');
708 function loadServiceEPGNowNext(servicereference, next){
709 var url = url_epgnow+servicereference;
711 if(typeof(next) == 'undefined'){
712 doRequest(url, incomingServiceEPGNow, false);
714 url = url_epgnext+servicereference;
715 doRequest(url, incomingServiceEPGNext, false);
720 function getBouquetEpg(){
721 loadServiceEPGNowNext(currentBouquet);
722 loadServiceEPGNowNext(currentBouquet, true);
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);
736 for (var i = 1; i <= 10; i++) {
737 if ( (newvalue/10)>=i){
738 $("volume"+i).src = "/web-data/img/led_on.png";
740 $("volume"+i).src = "/web-data/img/led_off.png";
743 if (mute == "False"){
744 $("speaker").src = "/web-data/img/speak_on.png";
746 $("speaker").src = "/web-data/img/speak_off.png";
752 function getVolume(){
753 doRequest(url_getvolume, handleVolumeRequest, false);
756 function volumeSet(val){
757 doRequest(url_setvolume+val, handleVolumeRequest, false);
761 doRequest(url_volumeup, handleVolumeRequest, false);
764 function volumeDown(){
765 doRequest(url_volumedown, handleVolumeRequest, false);
768 function volumeMute(){
769 doRequest(url_volumemute, handleVolumeRequest, false);
772 function initVolumePanel(){
776 //Channels and Bouquets
779 function incomingChannellist(request){
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");
787 if(services !== null) {
789 var cssclass = "even";
791 for ( var i = 0; i < services.length ; i++){
793 cssclass = cssclass == 'even' ? 'odd' : 'even';
795 var service = services[i];
797 'servicereference' : service.getServiceReference(),
798 'servicename' : service.getServiceName(),
799 'cssclass' : cssclass
806 processTpl('tplServiceList', data, 'contentMain', getBouquetEpg);
807 delayedGetSubservices();
809 debug("[incomingChannellist] services is null");
814 function loadBouquet(servicereference, name){
815 debug("[loadBouquet] called");
817 currentBouquet = servicereference;
820 setAjaxLoad('contentMain');
822 startUpdateBouquetItemsPoller();
824 doRequest(url_getServices+servicereference, incomingChannellist, true);
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!");
833 //loading first entry of TV Favorites as default for ServiceList
834 loadBouquet(bouquetList[0].getServiceReference(), bouquetList[0].getServiceName());
839 function renderBouquetTable(list, target){
840 debug("[renderBouquetTable] Rendering " + list.length + " Bouquets");
843 if (list.length < 1){
844 debug("[renderBouquetTable] NO BOUQUETS!");
846 for (var i=0; i < list.length; i++){
848 var bouquet = list[i];
850 'servicereference': bouquet.getServiceReference(),
851 'bouquetname': bouquet.getServiceName()
859 processTpl('tplBouquetList', data, 'contentMain');
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');
873 function initChannelList(){
874 var url = url_getServices+encodeURIComponent(bouquetsTv);
875 currentBouquet = bouquetsTv;
877 doRequest(url, incomingBouquetListInitial, true);
883 function incomingMovieList(request){
884 if(request.readyState == 4){
886 var movies = new MovieList(getXML(request)).getArray();
887 debug("[incomingMovieList] Got "+movies.length+" movies");
890 var cssclass = "even";
892 for ( var i = 0; i < movies.length; i++){
893 cssclass = cssclass == 'even' ? 'odd' : 'even';
895 var movie = movies[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()+" "+ movie.getTimeStartString(),
908 'cssclass' : cssclass
911 var data = { movies : namespace };
912 processTpl('tplMovieList', data, 'contentMain');
917 function loadMovieList(tag){
918 if(typeof(tag) == 'undefined'){
921 debug("[loadMovieList] Loading movies with tag '"+tag+"'");
922 doRequest(url_movielist+tag, incomingMovieList, false);
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());
934 notify(result.getStateText(), result.getState());
940 function delMovie(sref ,servicename, title, description) {
941 debug("[delMovie] File(" + sref + "), servicename(" + servicename + ")," +
942 "title(" + title + "), description(" + description + ")");
944 result = confirm( "Are you sure want to delete the Movie?\n" +
945 "Servicename: "+servicename+"\n" +
946 "Title: "+title+"\n" +
947 "Description: "+description+"\n");
950 debug("[delMovie] ok confirm panel");
951 doRequest(url_moviedelete+"?sRef="+sref, incomingDelMovieResult, false);
955 debug("[delMovie] cancel confirm panel");
960 //Send Messages and Receive the Answer
963 function incomingMessageResult(request){
964 if(request.readyState== 4){
965 var result = new SimpleXMLResult(getXML(request));
966 notify(result.getStateText(), result.getState());
970 function getMessageAnswer() {
971 doRequest(url_messageanswer, incomingMessageResult, false);
974 function sendMessage(messagetext, messagetype, messagetimeout){
976 messagetext = $('MessageSendFormText').value;
979 messagetimeout = $('MessageSendFormTimeout').value;
982 var index = $('MessageSendFormType').selectedIndex;
983 messagetype = $('MessageSendFormType').options[index].value;
985 if(ownLazyNumber(messagetype) === 0){
986 var request = doRequest(url_message+'?text='+messagetext+'&type='+messagetype+'&timeout='+messagetimeout);
988 setTimeout(getMessageAnswer, ownLazyNumber(messagetimeout)*1000);
990 doRequest(url_message+'?text='+messagetext+'&type='+messagetype+'&timeout='+messagetimeout, incomingMessageResult, false);
996 function getScreenShot(what) {
997 debug("[getScreenShot] called");
999 var buffer = new Image();
1003 buffer.onload = function () {
1004 debug("[getScreenShot] image assigned");
1006 data = { img : { src : buffer.src } };
1007 processTpl('tplGrab', data, 'contentMain');
1012 buffer.onerror = function (meldung) {
1013 debug("[getScreenShot] Loading image failed");
1029 downloadStart = new Date().getTime();
1030 buffer.src = '/grab?format=jpg&r=720&' + what + '&filename=/tmp/' + downloadStart;
1033 function getVideoShot() {
1037 function getOsdShot(){
1041 // RemoteControl Code
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;
1049 //TODO Some Error Handling
1053 function openWebRemote(){
1054 var template = templates.tplWebRemoteOld;
1056 if(boxtype == "dm8000"){
1057 template = templates.tplWebRemote;
1061 if (!webRemoteWin.closed && webRemoteWin.location) {
1062 setWindowContent(webRemoteWin, template);
1064 webRemoteWin = openPopup('WebRemote', template, 250, 600);
1070 function loadAndOpenWebRemote(){
1071 if(boxtype == "dm8000"){
1072 fetchTpl('tplWebRemote', openWebRemote);
1074 fetchTpl('tplWebRemoteOld', openWebRemote);
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){
1092 // Array.insert( index, value ) - Insert value at index, without overwriting existing keys
1093 Array.prototype.insert = function( j, v ) {
1095 var a = this.slice(), b = a.splice( j );
1097 return a.concat( b );
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;
1110 for( var i = 0; i < e.length - 2; i++ ) {
1111 this[a + i] = e[i + 2];
1115 for( var j = a; j < l - c; j++ ) {
1116 this[j + e.length - 2] = d[j - c];
1118 this.length -= c - e.length + 2;
1120 return d.slice( f, f + c );
1125 function incomingRecordingPushed(request) {
1126 if(request.readyState == 4){
1127 var timers = new TimerList(getXML(request)).getArray();
1128 debug("[incomingRecordingPushed] Got " + timers.length + " timers");
1130 var aftereventReadable = ['Nothing', 'Standby', 'Deepstandby/Shutdown', 'Auto'];
1131 var justplayReadable = ['record', 'zap'];
1132 var OnOff = ['on', 'off'];
1136 for ( var i = 0; i <timers.length; i++){
1137 var timer = timers[i];
1139 if(ownLazyNumber(timer.getDontSave()) == 1) {
1140 var beginDate = new Date(Number(timer.getTimeBegin())*1000);
1141 var endDate = new Date(Number(timer.getTimeEnd())*1000);
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())]
1167 var data = { recordings : namespace };
1168 openPopup("Record Now", 'tplTimerListItem', data, 900, 500, "Record now window");
1173 function recordingPushed() {
1174 doRequest(url_timerlist, incomingRecordingPushed, false);
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);
1187 function ifChecked(rObj) {
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
1202 function incomingAbout(request) {
1203 if(request.readyState == 4){
1204 debug("[incomingAbout] returned");
1205 var xml = getXML(request).getElementsByTagName("e2abouts").item(0).getElementsByTagName("e2about");
1213 var fptext = "V"+xml.getElementsByTagName('e2fpversion').item(0).firstChild.data;
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++){
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};
1229 var hdddata = xml.getElementsByTagName('e2hddinfo').item(0);
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;
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,
1246 'hddmodel': hddmodel,
1247 'hddcapacity': hddcapacity,
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,
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)
1274 debug("[incomingAbout] About parsing Error" + e);
1277 var data = { about : namespace,
1279 processTpl('tplAbout', data, 'contentMain');
1285 * Show About Information in contentMain
1287 function showAbout() {
1288 doRequest(url_about, incomingAbout, false);
1292 // Spezial functions, mostly for testing purpose
1293 function openHiddenFunctions(){
1294 openPopup("Extra Hidden Functions",tplExtraHiddenFunctions,300,100,920,0);
1298 function startDebugWindow() {
1300 debugWin = openPopup("DEBUG", "", 300, 300,920,140, "debugWindow");
1304 function restartTwisted() {
1305 var request = new Ajax.Request( "/web/restarttwisted", { asynchronous: true, method: "get" });
1310 function sendMediaPlayer(command) {
1311 debug("[playFile] loading sendMediaPlayer");
1312 var request = new Ajax.Request( url_mediaplayercmd+command, { asynchronous: true, method: 'get' });
1316 function incomingMediaPlayer(request){
1317 if(request.readyState == 4){
1318 var files = new FileList(getXML(request)).getArray();
1320 debug("[loadMediaPlayer] Got "+files.length+" entries in mediaplayer filelist");
1321 //listerHtml = tplMediaPlayerHeader;
1325 var root = files[0].getRoot();
1326 if (root != "playlist") {
1327 namespace = {'root': root};
1329 var re = new RegExp(/(.*)\/(.*)\/$/);
1331 var newroot = RegExp.$1+'/';
1332 if(newroot == '//') {
1337 'servicereference': newroot,
1338 'exec': 'loadMediaPlayer',
1339 'exec_description': 'Change to directory ../',
1347 var itemnamespace = Array();
1348 for ( var i = 0; i <files.length; i++){
1349 var file = files[i];
1350 if(file.getNameOnly() == 'None') {
1353 var exec = 'loadMediaPlayer';
1354 var exec_description = 'Change to directory' + file.getServiceReference();
1355 var color = '000000';
1358 if (file.getIsDirectory() == "False") {
1360 exec_description = 'play file';
1365 itemnamespace[i] = {
1367 'servicereference': file.getServiceReference(),
1369 'exec_description': exec_description,
1371 'root': file.getRoot(),
1372 'name': file.getNameOnly()
1377 if (root == "playlist") {
1378 listerHtml += tplMediaPlayerFooterPlaylist;
1382 var data = { mp : namespace,
1383 items: itemnamespace
1386 processTpl('tplMediaPlayer', data, 'contentMain');
1387 var sendMediaPlayerTMP = sendMediaPlayer;
1388 sendMediaPlayer = false;
1389 //setBodyMainContent('BodyContent');
1390 sendMediaPlayer = sendMediaPlayerTMP;
1395 function loadMediaPlayer(directory){
1396 debug("[loadMediaPlayer] called");
1397 doRequest(url_mediaplayerlist+directory, incomingMediaPlayer, false);
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' });
1408 function openMediaPlayerPlaylist() {
1409 debug("[playFile] loading openMediaPlayerPlaylist");
1410 doRequest(url_mediaplayerlist+"playlist", incomingMediaPlayer, false);
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' });
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
1434 function sendPowerState(newState){
1435 var request = new Ajax.Request( url_powerstate+'?newstate='+newState, { asynchronous: true, method: 'get' });
1440 function delFile(file,root) {
1441 debug("[delFile] called");
1442 doRequest(url_delfile+root+file, incomingDelFileResult, false);
1446 //Currently Running Service
1447 function incomingCurrent(request){
1448 // debug("[incomingCurrent called]");
1449 if(request.readyState == 4){
1451 var xml = getXML(request).getElementsByTagName("e2currentserviceinformation").item(0);
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
1461 data = { current : namespace };
1463 if(typeof(templates.tplCurrent) != "undefined"){
1464 renderTpl(templates.tplCurrent, data, "currentContent");
1466 debug("[incomingCurrent] tplCurrent N/A");
1475 function getCurrent(){
1476 doRequest(url_getcurrent, incomingCurrent, false);
1480 //Navigation and Content Helper Functions
1482 * Loads all Bouquets for the given enigma2 servicereference and sets the according contentHeader
1483 * @param sRef - the Servicereference for the bouquet to load
1485 function getBouquets(sRef){
1486 var url = url_getServices+encodeURIComponent(sRef);
1487 doRequest(url, incomingBouquetList, true);
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
1495 function reloadNav(template, title){
1496 setAjaxLoad('navContent');
1497 processTpl(template, null, 'navContent');
1501 function getBouquetsTv(){
1502 getBouquets(bouquetsTv);
1505 function getProviderTv(){
1506 getBouquets(providerTv);
1509 function getAllTv(){
1510 loadBouquet(allTv, "All (TV)");
1514 function getBouquetsRadio(){
1515 getBouquets(bouquetsRadio);
1518 function getProviderRadio(){
1519 getBouquets(providerRadio);
1522 function getAllRadio(){
1523 loadBouquet(allRadio, "All (Radio)");
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
1531 function loadContentDynamic(fnc, title){
1532 setAjaxLoad('contentMain');
1533 setContentHd(title);
1534 stopUpdateBouquetItemsPoller();
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
1544 function loadContentStatic(template, title){
1545 setAjaxLoad('contentMain');
1546 setContentHd(title);
1547 stopUpdateBouquetItemsPoller();
1548 processTpl(template, null, 'contentMain');
1553 * Opens the given Control
1554 * @param control - Control Page as String
1555 * Possible Values: power, about, message, screenshot, videoshot, osdshot
1557 function loadControl(control){
1560 loadContentStatic('tplPower', 'PowerControl');
1564 loadContentStatic('tplSendMessage', 'Send a Message');
1568 loadAndOpenWebRemote();
1572 loadContentDynamic(getScreenShot, 'Screenshot');
1576 loadContentDynamic(getVideoShot, 'Videoshot');
1580 loadContentDynamic(getOsdShot, 'OSDshot');
1589 * Switches Navigation Modes
1590 * @param mode - The Navigation Mode you want to switch to
1591 * Possible Values: TV, Radio, Movies, Timer, Extras
1593 function switchMode(mode){
1596 reloadNav('tplNavTv', 'TeleVision');
1600 reloadNav('tplNavRadio', 'Radio');
1604 loadContentDynamic(loadMovieList, 'Movies');
1609 reloadNav('tplNavTimer', 'Timer');
1612 loadContentDynamic(loadTimerList, 'Timer');
1616 loadContentDynamic(loadMediaPlayer, 'MediaPlayer');
1620 reloadNav('tplNavBoxControl', 'BoxControl');
1624 loadContentDynamic(showAbout, 'About');
1635 function updateItems(){
1639 function updateItemsLazy(bouquet){
1645 * Does the everything required on initial pageload
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");
1660 setAjaxLoad('navContent');
1661 setAjaxLoad('contentMain');
1663 fetchTpl('tplServiceListEPGItem');
1664 fetchTpl('tplCurrent');
1666 reloadNav('tplNavTv', 'TeleVision');