channellist and subchannellist is now hold in memory.
authorJulian Dittrich <jjbig@users.schwerkraft.elitedvb.net>
Mon, 19 Feb 2007 20:34:53 +0000 (20:34 +0000)
committerJulian Dittrich <jjbig@users.schwerkraft.elitedvb.net>
Mon, 19 Feb 2007 20:34:53 +0000 (20:34 +0000)
update.html.xml is now send as text/html.
extended EPG-Info is shorter and extandable
few other adjustmenst

webinterface/src/plugin.py
webinterface/src/web-data/objects.js
webinterface/src/web-data/templates.js
webinterface/src/web-data/tools.js
webinterface/src/webif.py

index a483388..58e6695 100644 (file)
@@ -24,6 +24,7 @@ sessions = [ ]
        all files not listed here will get an Content-Type: application/xhtml+xml charset: UTF-8
 """
 AppTextHeaderFiles = ['stream.m3u.xml',] 
+TextHtmlHeaderFiles = ['updates.html.xml',] 
 
 """
        define all files in /web to send no  XML-HTTP-Headers here
@@ -94,6 +95,8 @@ def startWebserver():
                                webif.renderPage(s, self.path, req, sessions[0])  # login?
                                if self.path.split("/")[-1] in AppTextHeaderFiles:
                                        return http.Response(responsecode.OK,{'Content-type': http_headers.MimeType('application', 'text', (('charset', 'UTF-8'),))},stream=s)
+                               elif self.path.split("/")[-1] in TextHtmlHeaderFiles:
+                                       return http.Response(responsecode.OK,{'Content-type': http_headers.MimeType('text', 'html', (('charset', 'UTF-8'),))},stream=s)
                                elif self.path.split("/")[-1] in NoExplicitHeaderFiles:
                                        return http.Response(responsecode.OK,stream=s)
                                else:
index 48eff5a..69f685d 100644 (file)
@@ -148,7 +148,14 @@ function ServiceReference(xml){
                
        this.getServiceName = function(){
                return this.servicename.replace('&quot;', '"');
-       }       
+       }
+       this.setServiceReference = function(toInsert){
+               this.servicereference = toInsert;
+       }
+               
+       this.setServiceName = function(toInsert){
+               this.servicename = toInsert.replace('&quot;', '"');
+       }
 }      
 //END class Service
 
index 2d30962..e91b663 100644 (file)
@@ -16,7 +16,7 @@ var tplEPGListItem  = '<tr style="background-color: #DDDDDD;">';
        
        tplEPGListItem += '<tr style="background-color: #DDDDDD;">';
        tplEPGListItem += '<td valign="top">%(endtime)</td>';
-       tplEPGListItem += '<td colspan="2"rowspan="2">%(extdescription)</td>';
+       tplEPGListItem += '<td colspan="2"rowspan="2" id="extdescription%(number)">%(extdescriptionSmall)</td>';
        tplEPGListItem += '</tr>';
        
        tplEPGListItem +='<tr style="background-color: #DDDDDD;"><td>';
@@ -29,6 +29,8 @@ var tplEPGListItem  = '<tr style="background-color: #DDDDDD;">';
        tplEPGListItem += '<tr style="background-color: #AAAAAA;">';
        tplEPGListItem += '<td colspan="3">&nbsp;</td>';
        tplEPGListItem += '</tr>';
+
+var tplEPGListItemExtend  = '%(shortTxt) ...<a href="#" onclick="setComplete(\'extdescription%(number)\',\'%(txt)\');">more</a>';
        
 var tplEPGListFooter = "</table>";
        
@@ -45,6 +47,7 @@ var tplServiceListHeader  = '<table border="0" cellpadding="0" cellspacing="0" c
        tplServiceListHeader += '</tr>\n';
        tplServiceListHeader += '</thead>\n';
        tplServiceListHeader += '<tbody class="scrollContent">\n';
+       tplServiceListHeader += '<input type="hidden" id="mainServiceRef" name="mainServiceRef" value="%(mainServiceRef)">\n';
 
 var tplServiceListItem  = '<tr id="%(servicereference)extend">\n';
        tplServiceListItem += '<td style="border-top: 2px solid #AAA;" ><div class="sListSName"><a id="%(servicereference)" onclick="zap(this.id); getSubServices(this.id);" class="sListSLink">%(servicename)</a></div>';
index dd63ae1..414633b 100644 (file)
@@ -196,6 +196,22 @@ function showhide(id){
 function set(what, value){
        //debug(what+"-"+value);
        element = parent.document.getElementById(what);
+       if(value.length > 550) {
+               value = value.substr(0,550) + "[...]";
+       }
+       if (element){
+               element.innerHTML = value;
+       }
+       if(navigator.userAgent.indexOf("MSIE") >=0) {
+               elementscript= $('UpdateStreamReaderIEFixIFrame').document.getElementById('scriptzone');
+               if(elementscript){
+                       elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory                    
+               }
+       }
+}
+function setComplete(what, value){
+       //debug(what+"-"+value);
+       element = parent.document.getElementById(what);
        if (element){
                element.innerHTML = value;
        }
@@ -298,7 +314,7 @@ function incomingEPGrequest(request){
                                try{
                                        var item = EPGItems[i];                         
                                        //Create JSON Object for Template
-                                       var namespace = {       
+                                       var namespace = {       
                                                        'date': item.getTimeDay(), 
                                                        'eventid': item.getEventId(), 
                                                        'servicereference': item.getServiceReference(), 
@@ -309,7 +325,9 @@ function incomingEPGrequest(request){
                                                        'duration': Math.ceil(item.getDuration()/60000), 
                                                        'description': item.getDescription(), 
                                                        'endtime': item.getTimeEndString(), 
-                                                       'extdescription': item.getDescriptionExtended()
+                                                       'extdescription': item.getDescriptionExtended(),
+                                                       'number': String(i),
+                                                       'extdescriptionSmall': extdescriptionSmall(item.getDescriptionExtended(),String(i))
                                                };
                                        //Fill template with data and add id to our result
                                        html += RND(tplEPGListItem, namespace);
@@ -322,7 +340,19 @@ function incomingEPGrequest(request){
                }
        }
 }
-       
+function extdescriptionSmall(txt,num) {
+       if(txt.length > 410) {
+               var shortTxt = txt.substr(0,410);
+               txt = txt.replace(/\'\'/g, '&quot;');
+               txt = txt.replace(/\\/g, '\\\\');
+               txt = txt.replace(/\'/g, '\\\'');
+               txt = txt.replace(/\"/g, '&quot;');
+               var smallNamespace = { 'txt':txt,'number':num, 'shortTxt':shortTxt};
+               return RND(tplEPGListItemExtend, smallNamespace);
+       } else {
+               return txt;
+       }
+}      
 
 /////////////////////////
 
@@ -452,10 +482,16 @@ function initChannelList(){
 }
 
 var servicereftoloadepgnow="";
+var loadedChannellist = new Object();
 function loadBouquet(servicereference){ 
        debug("loading bouquet with "+servicereference);
        servicereftoloadepgnow = servicereference;
-       doRequest(url_fetchchannels+servicereference, incomingChannellist);
+       debug("loadBouquet " + typeof(loadedChannellist[servicereftoloadepgnow]));
+       if(typeof(loadedChannellist[servicereftoloadepgnow]) == "undefined") {
+               doRequest(url_fetchchannels+servicereference, incomingChannellist);
+       } else {
+               incomingChannellist();
+       }
 }
 
 function incomingTVBouquetList(request){
@@ -506,10 +542,17 @@ function renderBouquetTable(bouquet,templateHeader,templateItem,templateFooter){
 }      
 
 function incomingChannellist(request){
-       if(request.readyState == 4){
-               var services = new ServiceList(getXML(request)).getArray();
-               listerHtml      = tplServiceListHeader;         
+       var services = null;
+       if(typeof(loadedChannellist[servicereftoloadepgnow]) != "undefined"){
+               services = loadedChannellist[servicereftoloadepgnow];
+       } else if(request.readyState == 4) {
+               services = new ServiceList(getXML(request)).getArray();
+               loadedChannellist[servicereftoloadepgnow] = services;
                debug("got "+services.length+" Services");
+       }
+       if(services != null) {
+               var smallNamespace = {'mainServiceRef': servicereftoloadepgnow };
+               listerHtml = RND(tplServiceListHeader, smallNamespace);
                for ( var i = 0; i < services.length ; i++){
                        var reference = services[i];
                        var namespace = {       
@@ -522,6 +565,7 @@ function incomingChannellist(request){
                document.getElementById('BodyContentChannellist').innerHTML = listerHtml;
                setBodyMainContent('BodyContentChannellist');
                loadServiceEPGNowNext(servicereftoloadepgnow);
+               debug("incomingChannellist " + typeof(loadedChannellist[servicereftoloadepgnow]));
        }
 }
 // Movies
@@ -1171,20 +1215,30 @@ function incomingSubServiceRequest(request){
        if(request.readyState == 4){
                var services = new ServiceList(getXML(request)).getArray();
                listerHtml      = '';           
-               debug("got "+services.length+" Services");
+               debug("got "+services.length+" SubServices");
                if(services.length > 1) {
 
                        first = services[0];
-
+                       var mainChannellist = loadedChannellist[String($('mainServiceRef').value)];
+                       
+                       var oldEntryPosition = -1;
+                       for(i = 0; i < mainChannellist.length; i++) {
+                               var service = mainChannellist[i];
+                               if(String(service.getServiceReference()) == String(first.getServiceReference())) {
+                                       oldEntryPosition = i + 1;
+                                       break;
+                               }
+                       }
                        if(typeof(subServicesInsertedList[String(first.getServiceReference())]) != "undefined") {
                                for ( var i = 1; i < subServicesInsertedList[String(first.getServiceReference())].length ; i++){
                                        var reference = subServicesInsertedList[String(first.getServiceReference())][i];
                                        document.getElementById(reference.getServiceReference()+'extend').innerHTML = "";
                                }
-                               debug("getSubServices deleted old entries");
+                               for(i = oldEntryPosition; i < oldEntryPosition + subServicesInsertedList[String(first.getServiceReference())].length; i++) {
+                                       mainChannellist.splice(i);
+                               }
                        }
 
-                       debug("getSubServices creating html");
                        for ( var i = 0; i < services.length ; i++){
                                var reference = services[i];
                                var namespace = {       
@@ -1192,10 +1246,33 @@ function incomingSubServiceRequest(request){
                                        'servicename': reference.getServiceName()
                                };
                                listerHtml += RND(tplServiceListItem, namespace);
+                               if(oldEntryPosition > -1) {
+                                       mainChannellist = mainChannellist.insert(oldEntryPosition++, reference);
+                               }
                        }
 
                        document.getElementById(first.getServiceReference()+'extend').innerHTML = listerHtml;
                        subServicesInsertedList[String(first.getServiceReference())] = services;
+                       loadedChannellist[$('mainServiceRef').value] = mainChannellist;
                }
        }
+}
+// Array.insert( index, value ) - Insert value at index, without overwriting existing keys
+Array.prototype.insert = function( j, v ) {
+ if( j>=0 ) {
+  var a = this.slice(), b = a.splice( j );
+  a[j] = v;
+  return a.concat( b );
+ }
+}
+// Array.splice() - Remove or replace several elements and return any deleted elements
+if( typeof Array.prototype.splice==='undefined' ) {
+ Array.prototype.splice = function( a, c ) {
+  var i = 0, e = arguments, d = this.copy(), f = a, l = this.length;
+  if( !c ) { c = l - a; }
+  for( i; i < e.length - 2; i++ ) { this[a + i] = e[i + 2]; }
+  for( a; a < l - c; a++ ) { this[a + e.length - 2] = d[a - c]; }
+  this.length -= c - e.length + 2;
+  return d.slice( f, f + c );
+ };
 }
\ No newline at end of file
index d8a3d0c..6383c0a 100644 (file)
@@ -392,7 +392,11 @@ def renderPage(stream, path, req, session):
                from twisted.internet import reactor
                s.write("\n");
                reactor.callLater(3, ping, s)
-
+       
+       # A few test from jjbig:
+       #stream, path, req, session
+       print "renderPage stream(%s) path(%s) req(%s) session(%s)" % (stream,path,req,session)
+       
        # if we met a "StreamingElement", there is at least one
        # element which wants to output data more than once,
        # i.e. on host-originated changes.