Add location and tags to the timer dialog in the web interface
authorAnders Holst <aholst@users.schwerkraft.elitedvb.net>
Tue, 3 Feb 2009 10:00:48 +0000 (10:00 +0000)
committerAnders Holst <aholst@users.schwerkraft.elitedvb.net>
Tue, 3 Feb 2009 10:00:48 +0000 (10:00 +0000)
15 files changed:
webinterface/src/WebComponents/Sources/LocationsAndTags.py [new file with mode: 0644]
webinterface/src/WebComponents/Sources/Timer.py
webinterface/src/web-data/config.js
webinterface/src/web-data/objects.js
webinterface/src/web-data/timer.js
webinterface/src/web-data/tools.js
webinterface/src/web-data/tpl/default/tplTimerEdit.htm
webinterface/src/web-data/tpl/default/tplTimerList.htm
webinterface/src/web/getlocations.xml [new file with mode: 0644]
webinterface/src/web/gettags.xml [new file with mode: 0644]
webinterface/src/web/timeradd.xml
webinterface/src/web/timerchange.xml
webinterface/src/web/timerlist.xml
webinterface/src/web/tvbrowser.xml
webinterface/src/webif.py

diff --git a/webinterface/src/WebComponents/Sources/LocationsAndTags.py b/webinterface/src/WebComponents/Sources/LocationsAndTags.py
new file mode 100644 (file)
index 0000000..58d17bd
--- /dev/null
@@ -0,0 +1,49 @@
+from Components.Sources.Source import Source
+from Components.config import config
+
+class LocationsAndTags(Source):
+    LOCATIONS = 0
+    TAGS = 1
+    
+    def __init__(self, session, func):
+        self.func = func
+        Source.__init__(self)        
+        self.session = session
+        self.result = False,"one two three four unknown command"
+
+    def handleCommand(self, cmd):
+        if self.func is self.LOCATIONS:
+            self.result = True,self.getLocations()
+        elif self.func is self.TAGS:
+            self.result = True,self.getTags()
+        else:
+            self.result = False,"unknown command"
+
+    def getLocations(self):
+        return " ".join(config.movielist.videodirs.value)
+
+    def getTags(self):
+        try:
+            file = open("/etc/enigma2/movietags")
+            tags = [x.rstrip() for x in file.readlines()]
+            while "" in tags:
+                tags.remove("")
+            file.close()
+        except IOError, ioe:
+            tags = []
+        return " ".join(tags)
+
+    def getText(self):
+        self.handleCommand("")
+        print self.result
+        (result,text) = self.result
+        xml  = "<e2simplexmlresult>\n"
+        if result:
+            xml += "<e2state>True</e2state>\n"
+        else:
+            xml += "<e2state>False</e2state>\n"            
+        xml += "<e2statetext>%s</e2statetext>\n" % text
+        xml += "</e2simplexmlresult>\n"
+        return xml
+    
+    text = property(getText)
index 1c67232..52fe3a9 100644 (file)
@@ -92,24 +92,25 @@ class Timer( Source):
             http://dreambox/web/tvbrowser? +
             
         To add something:
-            &command=add&&syear={start_year}&smonth={start_month}&sday={start_day}&shour={start_hour}&smin={start_minute}&eyear={end_year}&emonth={end_month}&eday={end_day}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
+            &command=add&&year={year}&month={month}&day={day}&shour={start_hour}&smin={start_minute}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(descr, "utf8")}&dirname={dirname}&tags={urlencode("tag1 tag2...", "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
         
         to zap for some time:
-            &command=add&&syear={start_year}&smonth={start_month}&sday={start_day}&shour={start_hour}&smin={start_minute}&eyear={end_year}&emonth={end_month}&eday={end_day}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, afterevent=0&eit=&disabled=0&justplay=1&repeated=0
+            &command=add&&year={year}&month={month}&day={day}&shour={start_hour}&smin={start_minute}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(descr, "utf8")}&dirname={dirname}&tags={urlencode("tag1 tag2...", "utf8")}&afterevent=0&eit=&disabled=0&justplay=1&repeated=0
         
         to delete something:
-            &command=del&&syear={start_year}&smonth={start_month}&sday={start_day}&shour={start_hour}&smin={start_minute}&eyear={end_year}&emonth={end_month}&eday={end_day}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}&name={urlencode(title, "utf8")}&description={urlencode(title, "utf8")}&afterevent=0&eit=&disabled=0&justplay=0&repeated=0
+            &command=del&&year={year}&month={month}&day={day}&shour={start_hour}&smin={start_minute}&ehour={end_hour}&emin={end_minute}&sRef={urlencode(channel_name_external, "utf8")}
         """
         
-        listDate = ['syear','smonth','sday','shour','smin','eyear','emonth','eday','ehour','emin']
+        listDate = ['year','month','day','shour','smin','ehour','emin']
         for element in listDate:
             if param[element] is None:
                 return False,"%s missing"%element
             else:
                 param[element] = int(param[element])
-        param['begin'] = int( strftime("%s",  localtime(mktime( (param['syear'], param['smonth'], param['sday'], param['shour'], param['smin'], 0, 0, 0, -1) ) ) ) )
-        param['end']   = int( strftime("%s",  localtime(mktime( (param['eyear'], param['emonth'], param['eday'], param['ehour'], param['emin'], 0, 0, 0, -1) ) ) ) )
-        
+        param['begin'] = int(mktime( (param['year'], param['month'], param['day'], param['shour'], param['smin'], 0, 0, 0, -1) ) )
+        param['end']   = int(mktime( (param['year'], param['month'], param['day'], param['ehour'], param['emin'], 0, 0, 0, -1) ) )
+        if param['end'] < param['begin']:
+            param['end'] += 86400
         for element in listDate:
             del param[element]
         
@@ -185,7 +186,8 @@ class Timer( Source):
             if limitEvent:
                 return False, "No event found, started infinite recording"
 
-        timer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0)
+        location = config.movielist.last_videodir.value
+        timer = RecordTimerEntry(serviceref, begin, end, name, description, eventid, False, False, 0, dirname = location)
         timer.dontSave = True
         self.recordtimer.record(timer)
 
@@ -262,6 +264,14 @@ class Timer( Source):
             if ( param['afterevent'] == "0") or (param['afterevent'] == "1") or (param['afterevent'] == "2"):
                 afterEvent = int(param['afterevent'])
 
+        dirname = None
+        if param.has_key('dirname'):
+            dirname = param['dirname']
+
+        tags = None
+        if param.has_key('tags'):
+            tags = unescape(param['tags']).split(' ')
+
         #Try to edit an existing Timer
         if param.has_key('channelOld'):
             print "ChannelOld: %s" %param['channelOld']
@@ -298,6 +308,8 @@ class Timer( Source):
                                     timer.justplay = justplay
                                     timer.afterEvent = afterEvent
                                     timer.repeated = repeated
+                                    timer.dirname = dirname
+                                    timer.tags = tags
                                     
                                     #send the changed timer back to enigma2 and hope it's good
                                     self.session.nav.RecordTimer.timeChanged(timer)
@@ -313,7 +325,7 @@ class Timer( Source):
 
         try:
             #Create a new instance of recordtimerentry
-            timer = RecordTimerEntry(service_ref, begin, end, name, description, 0, disabled, justplay, afterEvent)
+            timer = RecordTimerEntry(service_ref, begin, end, name, description, 0, disabled, justplay, afterEvent, dirname = dirname, tags = tags)
             timer.repeated = repeated
             #add the new timer
             self.recordtimer.record(timer)
@@ -384,7 +396,6 @@ class Timer( Source):
             timer.append(item.eit)
             timer.append(item.name)
             timer.append(item.description)
-            timer.append(item.dirname)
 
             if item.disabled is True:
                 timer.append("1")
@@ -403,6 +414,9 @@ class Timer( Source):
 
             timer.append(item.afterEvent)
             
+            timer.append(item.dirname)
+            timer.append(" ".join(item.tags))
+
             timer.append(item.log_entries)
             
             try:
@@ -456,24 +470,25 @@ class Timer( Source):
                "EIT":2,
                "Name":3,
                "Description":4,
-               "Directory":5,
-               "Disabled":6,
-               "TimeBegin":7,
-               "TimeEnd":8,
-               "Duration":9,
-               "startPrepare":10,
-               "justPlay":11,
-               "afterEvent":12,
-               "LogEntries":13,
-               "Filename":14,
-               "Backoff":15,
-               "nextActivation":16,
-               "firstTryPrepare":17,
-               "State":18,
-               "Repeated":19,
-               "dontSave":20,
-               "Cancled":21,
-               "DescriptionExtended":22,
-               "toggleDisabled":23,
-               "toggleDisabledIMG":24,
-           }
\ No newline at end of file
+               "Disabled":5,
+               "TimeBegin":6,
+               "TimeEnd":7,
+               "Duration":8,
+               "startPrepare":9,
+               "justPlay":10,
+               "afterEvent":11,
+               "Location":12,
+               "Tags":13,
+               "LogEntries":14,
+               "Filename":15,
+               "Backoff":16,
+               "nextActivation":17,
+               "firstTryPrepare":18,
+               "State":19,
+               "Repeated":20,
+               "dontSave":21,
+               "Cancled":22,
+               "DescriptionExtended":23,
+               "toggleDisabled":24,
+               "toggleDisabledIMG":25,
+           }
index a8b0ac8..45947f0 100644 (file)
@@ -42,12 +42,15 @@ var url_filelist = "/web/mediaplayerlist?path="; // plus full qualified path
 
 var url_timerlist= "/web/timerlist";
 var url_recordnow= "/web/recordnow";
-var url_timeradd= "/web/timeradd"; // plus serviceref,begin,end,name,description,eit,disabled,justplay,afterevent
-var url_timerchange= "/web/timerchange"; // plus serviceref,begin,end,name,description,eit,disabled,justplay,afterevent
+var url_timeradd= "/web/timeradd"; // plus serviceref,begin,end,name,description,dirname,tags,eit,disabled,justplay,afterevent
+var url_timerchange= "/web/timerchange"; // plus serviceref,begin,end,name,description,dirname,tags,eit,disabled,justplay,afterevent
 var url_timeraddbyeventid= "/web/timeraddbyeventid"; // plus serviceref,eventid
-var url_timerdelete= "/web/timerdelete"; // plus serviceref,bedin,end
+var url_timerdelete= "/web/timerdelete"; // plus serviceref,begin,end
 var url_timerlistwrite="/web/timerlistwrite?write=saveWriteNow";
 
+var url_getLocations="/web/getlocations";
+var url_getTags="/web/gettags";
+
 var url_message = "/web/message"; // plus text,type,timeout
 var url_messageanswer = "/web/messageanswer?getanswer=now"; 
 
index 23ff91f..470e7a1 100644 (file)
@@ -409,6 +409,16 @@ function Timer(xml){
                this.afterevent = "0";
        }
        try{
+               this.dirname = xml.getElementsByTagName('e2dirname').item(0).firstChild.data;
+       } catch (e) {
+               this.dirname = "/hdd/movie/";
+       }
+       try{
+               this.tags = xml.getElementsByTagName('e2tags').item(0).firstChild.data;
+       } catch (e) {
+               this.tags = "";
+       }
+       try{
                this.logentries = xml.getElementsByTagName('e2logentries').item(0).firstChild.data;
        } catch (e) {
                this.logentries = "N/A";
@@ -538,6 +548,14 @@ function Timer(xml){
                return this.afterevent;
        };
        
+       this.getDirname = function(){
+               return this.dirname;
+       };
+
+       this.getTags = function(){
+               return this.tags;
+       };
+
        this.getLogentries = function(){
                return this.logentries;
        };
index d6e5d1b..5d365c6 100644 (file)
@@ -6,29 +6,12 @@ addTimerEditFormArray.TVListFilled = 0;
 addTimerEditFormArray.RadioListFilled = 0;
 addTimerEditFormArray.deleteOldOnSave = 0;
 addTimerEditFormArray.eventID = 0;
+addTimerEditFormArray.locationsList = [];
+addTimerEditFormArray.tagsList = [];
 
 days = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'];
 
 
-function addTimerFormChangeTime(which) {
-       var start = new Date( $('syear').value, ($('smonth').value -1), $('sday').value, $('shour').value, $('smin').value, 0);
-       var end = new Date($('eyear').value, ($('emonth').value -1), $('eday').value, $('ehour').value, $('emin').value, 0);
-//     debug("("+start+")(" + end+")");
-
-       if(start.getTime() > end.getTime()) {
-               opponent = (which.substr(0,1) == 's') ? 'e' +  which.substr(1, which.length -1) : 's' +  which.substr(1, which.length -1) ;
-               $(opponent).value = $(which).value;
-       }
-       var all = ['year','month','day','hour','min'];
-       for(i=0; i < all.length; i++) {
-               if(which.substr(1, which.length -1) == all[i]) {
-                       addTimerFormChangeTime(which.substr(0,1) + all[i+1] );
-                       break;
-               }
-       }
-}
-
-
 function addTimerFormChangeType() {
        selected = ($('tvradio').checked === true) ? addTimerEditFormArray.TVList: addTimerEditFormArray.RadioList;
        
@@ -46,6 +29,70 @@ function addTimerFormChangeType() {
        }
 }
 
+function addTimerFormChangeLocation(newloc) {
+        
+}
+
+function addTimerFormPrepareTagsMenu(currtags) {
+       result = {};
+        resultsuff = {};
+       taglist = addTimerEditFormArray.tagsList;
+
+        if (currtags == "") {
+               i = 0;
+                result[""] = "<None>";
+                for (i = 0; i < taglist.length; i++) {
+                       result[taglist[i]] = taglist[i];
+               }
+        } else {
+               result[currtags] = currtags;
+                tags = currtags.split(" ");
+                       for (i = 0; i < taglist.length; i++) {
+                        var res = "";
+                        var found = false;
+                        for (j=0; j<tags.length; j++) {
+                               if (tags[j] != taglist[i]) {
+                                               res += " "+tags[j];
+                               } else {
+                                       found = true;
+                                }
+                        }
+                        if (!found) {
+                               res += " "+taglist[i];
+                        }
+                        if (res.length > 0) {
+                                res = res.substring(1,res.length);
+                        }
+                        if (found) {
+                               resultsuff[res] = "- "+taglist[i];
+                        } else {
+                               result[res] = "+ "+taglist[i];
+                        }
+                }
+                if (tags.length > 1) {
+                       for (ele in resultsuff) {
+                               result[ele] = resultsuff[ele];
+                        }
+                }
+                result[""] = "<None>";
+        }
+        return result;
+}
+
+function addTimerFormChangeTags(newtags) {
+       lst = addTimerFormPrepareTagsMenu(newtags);
+
+       for (i = $('tags').options.length; i !== 0; i--) {
+               $('tags').options[i - 1] = null;
+       }
+       
+        for(element in lst) {
+                       $('tags').options[i] = new Option(lst[element]);
+                       $('tags').options[i].value = element;
+                       i++;
+        }
+}
+
 
 // Timer
 function addTimerByID(sRef,eventID,justplay){
@@ -114,6 +161,8 @@ function incomingTimerList(request){
                                'justplayReadable': justplayReadable[Number(timer.getJustplay())],
                                'afterevent': timer.getAfterevent(),
                                'aftereventReadable': aftereventReadable[Number(timer.getAfterevent())],
+                               'dirname' : timer.getDirname(),
+                               'tags' : timer.getTags(),
                                'disabled': timer.getDisabled(),
                                'onOff': timer.getToggleDisabledIMG(),
                                'enDis': timer.getToggleDisabledText(),
@@ -194,16 +243,13 @@ function incomingTimerDelResult(request){
 
 function loadTimerFormNow() {
        var now = new Date();
-       addTimerEditFormArray.syear = now.getFullYear();
-       addTimerEditFormArray.smonth = now.getMonth() + 1;
-       addTimerEditFormArray.sday = now.getDate();
+       addTimerEditFormArray.year = now.getFullYear();
+       addTimerEditFormArray.month = now.getMonth() + 1;
+       addTimerEditFormArray.day = now.getDate();
        addTimerEditFormArray.shour = now.getHours();
        addTimerEditFormArray.smin = now.getMinutes();
 
        var     plusTwoHours = new Date(now.getTime() + ((120 *60)*1000) );
-       addTimerEditFormArray.eyear = plusTwoHours.getFullYear();
-       addTimerEditFormArray.emonth = plusTwoHours.getMonth() + 1;
-       addTimerEditFormArray.eday = plusTwoHours.getDate();
        addTimerEditFormArray.ehour = plusTwoHours.getHours();
        addTimerEditFormArray.emin = plusTwoHours.getMinutes();
                
@@ -213,6 +259,8 @@ function loadTimerFormNow() {
        addTimerEditFormArray.channelSort = "tv";
        addTimerEditFormArray.name = "";
        addTimerEditFormArray.description = "";
+       addTimerEditFormArray.dirname = "/hdd/movie";
+       addTimerEditFormArray.tags = "";
        addTimerEditFormArray.repeated = 0;
        addTimerEditFormArray.afterEvent = "3";
        addTimerEditFormArray.deleteOldOnSave = 0;
@@ -222,23 +270,20 @@ function loadTimerFormNow() {
        
        
        debug("[loadTimerFormNow] done");
-       loadTimerFormChannels();
+       loadTimerFormTags();
 }
 
 
-function loadTimerEditForm(justplay, begin, end, repeated, channel, channelName, name, description, afterEvent, deleteOldOnSave, eit) {
-       debug('[loadTimerEditForm] justplay: ' + justplay + ',begin: ' + begin + ',end: ' + end + ',repeated: ' + repeated + ',channel: ' + channel + ',name: ' + name +',description: ' + description + ',afterEvent: ' + afterEvent + ',deleteOldOnSave: ' + deleteOldOnSave);
+function loadTimerEditForm(justplay, begin, end, repeated, channel, channelName, name, description, dirname, tags, afterEvent, deleteOldOnSave, eit) {
+       debug('[loadTimerEditForm] justplay: ' + justplay + ',begin: ' + begin + ',end: ' + end + ',repeated: ' + repeated + ',channel: ' + channel + ',name: ' + name +',description: ' + description +',dirname: ' + dirname +',tags: ' + tags + ',afterEvent: ' + afterEvent + ',deleteOldOnSave: ' + deleteOldOnSave);
        var start = new Date(Number(begin)*1000);
-       addTimerEditFormArray.syear = start.getFullYear();
-       addTimerEditFormArray.smonth = start.getMonth() + 1;
-       addTimerEditFormArray.sday = start.getDate();
+       addTimerEditFormArray.year = start.getFullYear();
+       addTimerEditFormArray.month = start.getMonth() + 1;
+       addTimerEditFormArray.day = start.getDate();
        addTimerEditFormArray.shour = start.getHours();
        addTimerEditFormArray.smin = start.getMinutes();
        
        var     stopp = new Date(Number(end)*1000);
-       addTimerEditFormArray.eyear = stopp.getFullYear();
-       addTimerEditFormArray.emonth = stopp.getMonth() + 1;
-       addTimerEditFormArray.eday = stopp.getDate();
        addTimerEditFormArray.ehour = stopp.getHours();
        addTimerEditFormArray.emin = stopp.getMinutes();
        
@@ -248,10 +293,12 @@ function loadTimerEditForm(justplay, begin, end, repeated, channel, channelName,
        addTimerEditFormArray.channelSort = "";
        addTimerEditFormArray.name = String(name);
        addTimerEditFormArray.description = String(description);
+       addTimerEditFormArray.dirname = String(dirname);
+       addTimerEditFormArray.tags = String(tags);
        addTimerEditFormArray.repeated = Number(repeated);
        addTimerEditFormArray.afterEvent = Number(afterEvent);
        
-       debug("[loadTimerEditForm]" + justplay + "|" + begin + "|" + end + "|" + repeated + "|"+channel+"|"+name+"|"+description+"|"+afterEvent);
+       debug("[loadTimerEditForm]" + justplay + "|" + begin + "|" + end + "|" + repeated + "|"+channel+"|"+name+"|"+description+"|"+dirname+"|"+tags+"|"+afterEvent);
 
        addTimerEditFormArray.deleteOldOnSave = Number(deleteOldOnSave);
        addTimerEditFormArray.beginOld = Number(begin);
@@ -259,7 +306,33 @@ function loadTimerEditForm(justplay, begin, end, repeated, channel, channelName,
        
        addTimerEditFormArray.eventID = Number(eit);
        
-       loadTimerFormChannels();
+       loadTimerFormTags();
+}
+
+function loadTimerFormTags() {
+       doRequest(url_getTags, incomingTimerFormTags, false);
+}
+
+function incomingTimerFormTags(request){
+       debug("[incomingTimerFormTags] called");
+       if(request.readyState == 4){
+               var result = new SimpleXMLResult(getXML(request));
+               addTimerEditFormArray.tagsList = result.getStateText().split(" ");
+               loadTimerFormLocations();
+       }               
+}
+
+function loadTimerFormLocations() {
+       doRequest(url_getLocations, incomingTimerFormLocations, false);
+}
+
+function incomingTimerFormLocations(request){
+       debug("[incomingTimerFormLocations] called");
+       if(request.readyState == 4){
+               var result = new SimpleXMLResult(getXML(request));
+               addTimerEditFormArray.locationsList = result.getStateText().split(" ");
+               loadTimerFormChannels();
+       }               
 }
 
 
@@ -384,21 +457,28 @@ function loadTimerForm(){
                channelObject[element.getServiceReference()] = element.getServiceName();
        }
 
+       var locationsObject = {};
+       for (i = 0; i < addTimerEditFormArray.locationsList.length; i++) {
+               str = addTimerEditFormArray.locationsList[i];
+               locationsObject[str] = str;
+        }
+
+       var tagsObject = addTimerFormPrepareTagsMenu(addTimerEditFormArray.tags);
+
        var namespace = {                                       
-                               syear: createOptions(2008,2015,addTimerEditFormArray.syear),
-                               smonth: createOptions(1,12,addTimerEditFormArray.smonth),
-                               sday: createOptions(1,31,addTimerEditFormArray.sday),
+                               year: createOptions(2008,2015,addTimerEditFormArray.year),
+                               month: createOptions(1,12,addTimerEditFormArray.month),
+                               day: createOptions(1,31,addTimerEditFormArray.day),
                                shour: createOptions(0,23,addTimerEditFormArray.shour),
                                smin: createOptions(0,59,addTimerEditFormArray.smin),
-                               eyear: createOptions(2008,2015,addTimerEditFormArray.eyear),
-                               emonth: createOptions(1,12,addTimerEditFormArray.emonth),
-                               eday: createOptions(1,31,addTimerEditFormArray.eday),
                                ehour: createOptions(0,23,addTimerEditFormArray.ehour),
                                emin: createOptions(0,59,addTimerEditFormArray.emin),
                                action: createOptionList(Action, addTimerEditFormArray.justplay),
                                channel: createOptionList(channelObject, addTimerEditFormArray.channel),
                                afterEvent: createOptionList(AfterEvent, addTimerEditFormArray.afterEvent),
                                repeated: createOptionListRepeated(Repeated, addTimerEditFormArray.repeated),
+                               dirname: createOptionList(locationsObject, addTimerEditFormArray.dirname),
+                               tags: createOptionList(tagsObject, addTimerEditFormArray.tags),
 
                                timer: {
                                        name: addTimerEditFormArray.name,
@@ -420,10 +500,14 @@ function loadTimerForm(){
        // Empty some stuff, but keep others to have the performance
        var tmp1 = addTimerEditFormArray.RadioList;
        var tmp2 = addTimerEditFormArray.TVList;
+       var tmp3 = addTimerEditFormArray.locationsList;
+       var tmp4 = addTimerEditFormArray.tagsList;
        addTimerEditFormArray = [];
        addTimerEditFormArray.deleteOldOnSave = 0;
        addTimerEditFormArray.RadioList = tmp1;
        addTimerEditFormArray.TVList = tmp2;
+       addTimerEditFormArray.locationsList = tmp3;
+       addTimerEditFormArray.tagsList = tmp4;
        addTimerEditFormArray.TVListFilled = 1;
        addTimerEditFormArray.RadioListFilled = 1;
 }
@@ -485,16 +569,14 @@ function createOptionListRepeated(Repeated, repeated) {
                        txt = txt.substr(0,1).toUpperCase() + txt.substr(1,1);
                }
                checked = " ";
-               if(num >= list[i]) {
-                       num -= list[i];
+               if (!(~num & list[i])) {
                        checked = "checked";
                }
-               
                namespace[i] = { 'id': Repeated[String(list[i])],
                        'name': Repeated[String(list[i])],
                        'value': list[i],
                        'txt': txt,
-                       'checked': checked 
+                       'checked': checked
                };
        }
        return namespace;
@@ -505,11 +587,14 @@ function sendAddTimer() {
        debug("[sendAddTimer]" + "parentChannel:" +$('channel').value);
        
        if(parentPin($('channel').value)) {
-               beginD = new Date(ownLazyNumber($('syear').value), (ownLazyNumber($('smonth').value) - 1), ownLazyNumber($('sday').value), ownLazyNumber($('shour').value), ownLazyNumber($('smin').value));
+               beginD = new Date(ownLazyNumber($('year').value), (ownLazyNumber($('month').value) - 1), ownLazyNumber($('day').value), ownLazyNumber($('shour').value), ownLazyNumber($('smin').value));
                begin = beginD.getTime()/1000;
                
-               endD = new Date(ownLazyNumber($('eyear').value), (ownLazyNumber($('emonth').value) - 1), ownLazyNumber($('eday').value), ownLazyNumber($('ehour').value), ownLazyNumber($('emin').value));
+               endD = new Date(ownLazyNumber($('year').value), (ownLazyNumber($('month').value) - 1), ownLazyNumber($('day').value), ownLazyNumber($('ehour').value), ownLazyNumber($('emin').value));
                end = endD.getTime()/1000;
+               if(end<begin) {
+                       end += 86400;
+               }
 
                repeated = 0;
                if( $('ms').checked ) {
@@ -541,6 +626,8 @@ function sendAddTimer() {
                        return;
                }
 
+               dirname = $('dirname').value;
+               tags = $('tags').value;
                repeated = 0;
                if($('ms').checked) {
                        repeated = ownLazyNumber($('ms').value);
@@ -562,6 +649,7 @@ function sendAddTimer() {
                //addTimerByID(\'%(servicereference)\',\'%(eventid)\',\'False\');
                doRequest(url_timerchange+"?"+"sRef="+($('channel').value).replace("&quot;", '"')+"&begin="+ begin +
                  "&end="+end+"&name="+escape(nameClean)+"&description="+escape(descriptionClean) +
+                 "&dirname="+dirname+"&tags="+escape(tags) +
                  "&afterevent="+$('after_event').value+"&eit=0&disabled=0" +
                  "&justplay="+ownLazyNumber($('justplay').value)+"&repeated="+repeated +
                  "&channelOld="+$('channelOld').value +
@@ -600,7 +688,7 @@ function incomingJustDoNothing(request){
 }
 
 
-function sendToggleTimerDisable(justplay,begin,end,repeated,channel,name,description,afterEvent,disabled){
+function sendToggleTimerDisable(justplay,begin,end,repeated,channel,name,description,dirname,tags,afterEvent,disabled){
        disabled = (ownLazyNumber(disabled) === 0) ? 1 : 0;
        
        var descriptionClean = (description == " " || description == "N/A") ? "" : description;
@@ -608,6 +696,7 @@ function sendToggleTimerDisable(justplay,begin,end,repeated,channel,name,descrip
 
        doRequest(url_timerchange+"?"+"sRef="+channel.replace("&quot;", '"')+"&begin="+begin +
         "&end="+end+"&name="+escape(nameClean)+"&description="+escape(descriptionClean) +
+        "&dirname="+dirname+"&tags="+escape(tags) +
         "&afterevent="+afterEvent+"&eit=0&disabled="+disabled +
         "&justplay="+justplay+"&repeated="+repeated +
         "&channelOld="+channel +
index 5375ec4..ef0021d 100644 (file)
@@ -778,7 +778,9 @@ function initVolumePanel(){
 
 function incomingChannellist(request){
        var services = null;
-       if(request.readyState == 4) {
+       if(typeof(loadedChannellist[currentBouquet]) != "undefined"){
+               services = loadedChannellist[currentBouquet];
+       } else if(request.readyState == 4) {
                services = new ServiceList(getXML(request)).getArray();
                debug("[incomingChannellist] got "+services.length+" Services");
        }
@@ -1149,6 +1151,8 @@ function incomingRecordingPushed(request) {
                                'endDate': endDate.toLocaleString(),
                                'state': timer.getState(),
                                'duration': Math.ceil((timer.getDuration()/60)),
+                               'dirname': timer.getDirname(),
+                               'tags': timer.getTags(),
                                'repeated': timer.getRepeated(),
                                'repeatedReadable': repeatedReadable(timer.getRepeated()),
                                'justplay': timer.getJustplay(),
index b809941..0653dd7 100644 (file)
                                                                                </tr>
                                                                                <tr>
                                                                                        <td colspan="3">&nbsp;</td>
-                                                                                       <td colspan="3">Note: For recurring events start/end day/month are not required.</td>
+                                                                                       <td colspan="3">Note: For recurring events date is not required.</td>
                                                                                </tr>
                                                                                <tr>
-                                                                                       <td colspan="3">Start:</td>
+                                                                                       <td colspan="3">Date:</td>
                                                                                        <td colspan="3">
-                                                                                               <select name="syear" size="1" id="syear" onchange="javascript:addTimerFormChangeTime('syear');">
-                                                                                                       {for year in syear}
-                                                                                                       <option value="${year.value}" ${year.selected}>${year.txt}</option>
+                                                                                               <select name="year" size="1" id="year">
+                                                                                                       {for y in year}
+                                                                                                       <option value="${y.value}" ${y.selected}>${y.txt}</option>
                                                                                                        {/for}
                                                                                                </select>
                                                                                                . 
-                                                                                               <select name="smonth" id="smonth" size="1" onchange="javascript:addTimerFormChangeTime('smonth');">
-                                                                                                       {for month in smonth}
-                                                                                                       <option value="${month.value}" ${month.selected}>${month.txt}</option>
+                                                                                               <select name="month" id="month" size="1">
+                                                                                                       {for m in month}
+                                                                                                       <option value="${m.value}" ${m.selected}>${m.txt}</option>
                                                                                                        {/for}
                                                                                                </select>
                                                                                                .
-                                                                                               <select name="sday" id="sday" size="1" onchange="javascript:addTimerFormChangeTime('sday');">
-                                                                                                       {for day in sday}
-                                                                                                       <option value="${day.value}" ${day.selected}>${day.txt}</option>
+                                                                                               <select name="day" id="day" size="1">
+                                                                                                       {for d in day}
+                                                                                                       <option value="${d.value}" ${d.selected}>${d.txt}</option>
                                                                                                        {/for}
                                                                                                </select>
-                                                                                               &nbsp;-&nbsp;
-                                                                                               <select name="shour" id="shour" size="1" onchange="javascript:addTimerFormChangeTime('shour');">
+                                                                                       </td>
+                                                                               </tr>
+                                                                               <tr>
+                                                                                       <td colspan="3">Start:</td>
+                                                                                       <td colspan="3">
+                                                                                               <select name="shour" id="shour" size="1">
                                                                                                        {for hour in shour}
                                                                                                        <option value="${hour.value}" ${hour.selected}>${hour.txt}</option>
                                                                                                        {/for}
                                                                                                </select>
                                                                                                :
-                                                                                               <select name="smin" id="smin" size="1" onchange="javascript:addTimerFormChangeTime('smin');">
+                                                                                               <select name="smin" id="smin" size="1">
                                                                                                        {for min in smin}
                                                                                                        <option value="${min.value}" ${min.selected}>${min.txt}</option>
                                                                                                        {/for}
                                                                                <tr>
                                                                                        <td colspan="3">End:</td>
                                                                                        <td colspan="3">
-                                                                                               <select name="eyear" id="eyear" size="1" onchange="javascript:addTimerFormChangeTime('eyear');">
-                                                                                                       {for year in eyear}
-                                                                                                       <option value="${year.value}" ${year.selected}>${year.txt}</option>
-                                                                                                       {/for}
-                                                                                               </select>
-                                                                                               .
-                                                                                               <select name="emonth" id="emonth" size="1" onchange="javascript:addTimerFormChangeTime('emonth');">
-                                                                                                       {for month in emonth}
-                                                                                                       <option value="${month.value}" ${month.selected}>${month.txt}</option>
-                                                                                                       {/for}
-                                                                                               </select>
-                                                                                               .
-                                                                                               <select name="eday" id="eday" size="1" onchange="javascript:addTimerFormChangeTime('eday');">
-                                                                                                       {for day in eday}
-                                                                                                       <option value="${day.value}" ${day.selected}>${day.txt}</option>
-                                                                                                       {/for}
-                                                                                               </select>
-                                                                                               &nbsp;-&nbsp;
-                                                                                               <select name="ehour" id="ehour" size="1" onchange="javascript:addTimerFormChangeTime('ehour');">
+                                                                                               <select name="ehour" id="ehour" size="1">
                                                                                                        {for hour in ehour}
                                                                                                        <option value="${hour.value}" ${hour.selected}>${hour.txt}</option>
                                                                                                        {/for}
                                                                                                </select>
                                                                                                :
-                                                                                               <select name="emin" id="emin" size="1" onchange="javascript:addTimerFormChangeTime('emin');">
+                                                                                               <select name="emin" id="emin" size="1">
                                                                                                        {for min in emin}
                                                                                                        <option value="${min.value}" ${min.selected}>${min.txt}</option>
                                                                                                        {/for}
                                                                                                <p><input type="radio" name="tvradio" value="radio" onchange="javascript:addTimerFormChangeType();">Radio</p>
                                                                                        <td>
                                                                                                <p>Channel:</p>
-                                                                                               <select name="channel" id="channel" size="1" onchange="timerFormExtendChannellist($('channel').options[$('channel').selectedIndex].value)">
+                                                                                               <select name="channel" id="channel" size="1" onchange="javascript:timerFormExtendChannellist($('channel').options[$('channel').selectedIndex].value)">
                                                                                                        {for c in channel}
                                                                                                        <option value="${c.value}" ${c.selected}>${c.txt}</option>
                                                                                                        {/for}  
                                                                                <tr>
                                                                                        <td colspan="3">Name:</td>
                                                                                        <td colspan="3">
-                                                                                               <input name="name" id="name" type="text" size="100" maxlength="100" style="color: #000000;" value="${timer.name}">
+                                                                                               <input name="name" id="name" type="text" size="80" maxlength="80" style="color: #000000;" value="${timer.name}">
                                                                                        </td>
                                                                                </tr>
                                                                                <tr>
                                                                                        <td colspan="3">Description:</td>
                                                                                        <td colspan="3">
-                                                                                               <input name="descr" id="descr" type="text" size="100" maxlength="100" style="color: #000000;" value="${timer.description}">
+                                                                                               <input name="descr" id="descr" type="text" size="80" maxlength="80" style="color: #000000;" value="${timer.description}">
+                                                                                       </td>
+                                                                               </tr>
+                                                                               <tr>
+                                                                                       <td colspan="3">Location:</td>
+                                                                                       <td colspan="3">
+                                                                                               <select id="dirname" name="dirname" size="1" onchange="javascript:addTimerFormChangeLocation($('dirname').options[$('dirname').selectedIndex].value)">
+                                                                                                       {for d in dirname}
+                                                                                                       <option value="${d.value}" ${d.selected}>${d.txt}</option>
+                                                                                                       {/for}
+                                                                                               </select>
+                                                                                       </td>
+                                                                               </tr>
+                                                                               <tr>
+                                                                                       <td colspan="3">Tags:</td>
+                                                                                       <td colspan="3">
+                                                                                               <select id="tags" name="tags" size="1" onchange="javascript:addTimerFormChangeTags($('tags').options[$('tags').selectedIndex].value)">
+                                                                                                       {for t in tags}
+                                                                                                       <option value="${t.value}" ${t.selected}>${t.txt}</option>
+                                                                                                       {/for}
+                                                                                               </select>
                                                                                        </td>
                                                                                </tr>
                                                                                <tr>
index f0d2285..ef986cf 100644 (file)
                                                                                                        <img src="/web-data/img/delete.png" title="Delete timer ${t.title}" border="0" onclick="delTimer('${t.servicereference}','${t.begin}','${t.end}','${t.servicename}','${t.title}','${t.description}',incomingTimerDelResult);">
                                                                                                </a>
                                                                                                <a href="#">
-                                                                                                       <img src="/web-data/img/${t.onOff}.png" title="${t.enDis} ${t.title}" border="0" onclick="sendToggleTimerDisable('${t.justplay}','${t.begin}','${t.end}','${t.repeated}','${t.servicereference}','${t.title}','${t.description}','${t.afterevent}','${t.disabled}' );">
+                                                                                                       <img src="/web-data/img/${t.onOff}.png" title="${t.enDis} ${t.title}" border="0" onclick="sendToggleTimerDisable('${t.justplay}','${t.begin}','${t.end}','${t.repeated}','${t.servicereference}','${t.title}','${t.description}','${t.dirname}','${t.tags}','${t.afterevent}','${t.disabled}' );">
                                                                                                </a>
                                                                                                <a href="#">
-                                                                                                       <img src="/web-data/img/edit.png" title="Edit timer ${t.title}" border="0" onclick="loadTimerEditForm('${t.justplay}','${t.begin}','${t.end}','${t.repeated}','${t.servicereference}','${t.servicename}','${t.title}','${t.description}','${t.afterevent}',1);">
+                                                                                                       <img src="/web-data/img/edit.png" title="Edit timer ${t.title}" border="0" onclick="loadTimerEditForm('${t.justplay}','${t.begin}','${t.end}','${t.repeated}','${t.servicereference}','${t.servicename}','${t.title}','${t.description}','${t.dirname}','${t.tags}','${t.afterevent}',1);">
                                                                                                </a>
                                                                                        </td>   
                                                                                </tr>
diff --git a/webinterface/src/web/getlocations.xml b/webinterface/src/web/getlocations.xml
new file mode 100644 (file)
index 0000000..2402d13
--- /dev/null
@@ -0,0 +1,5 @@
+<e2:screen name="LocationsAndTagsWebScreen">&lt;?xml version="1.0" encoding="UTF-8"?>
+       <e2:element source="Locations">
+               <e2:convert type="web:TextToHTML" />
+       </e2:element>
+</e2:screen>
\ No newline at end of file
diff --git a/webinterface/src/web/gettags.xml b/webinterface/src/web/gettags.xml
new file mode 100644 (file)
index 0000000..6762923
--- /dev/null
@@ -0,0 +1,5 @@
+<e2:screen name="LocationsAndTagsWebScreen">&lt;?xml version="1.0" encoding="UTF-8"?>
+       <e2:element source="Tags">
+               <e2:convert type="web:TextToHTML" />
+       </e2:element>
+</e2:screen>
\ No newline at end of file
index 332cd94..c3761e7 100644 (file)
@@ -1,5 +1,5 @@
 <e2:screen name="TimerWebScreen">&lt;?xml version="1.0" encoding="UTF-8"?>
-       <e2:element source="TimerAdd" id="sRef,begin,end,name,description,eit,disabled,justplay,afterevent">
+       <e2:element source="TimerAdd" id="sRef,begin,end,name,description,dirname,tags,eit,disabled,justplay,afterevent">
                <e2:convert type="web:TextToHTML" />
        </e2:element>
 </e2:screen>
\ No newline at end of file
index fdd07cf..5f61f42 100644 (file)
@@ -1,5 +1,5 @@
 <e2:screen name="TimerWebScreen">&lt;?xml version="1.0" encoding="UTF-8"?>
-       <e2:element source="TimerChange" id="sRef,begin,end,name,description,eit,disabled,justplay,afterevent,repeated,channelOld,beginOld,endOld,deleteOldOnSave">
+       <e2:element source="TimerChange" id="sRef,begin,end,name,description,dirname,tags,eit,disabled,justplay,afterevent,repeated,channelOld,beginOld,endOld,deleteOldOnSave">
                <e2:convert type="web:TextToHTML" />
        </e2:element>
 </e2:screen>
\ No newline at end of file
index 0a85e3c..2a89d21 100644 (file)
@@ -7,7 +7,6 @@
                &lt;e2name><e2:item name="Name" filter="xml"/>&lt;/e2name>
                &lt;e2description><e2:item name="Description" filter="xml"/>&lt;/e2description>
                &lt;e2descriptionextended><e2:item name="DescriptionExtended" filter="xml"/>&lt;/e2descriptionextended>
-               &lt;e2directory><e2:item name="Directory" filter="xml"/>&lt;/e2directory>
                &lt;e2disabled><e2:item name="Disabled" />&lt;/e2disabled>
                &lt;e2timebegin><e2:item name="TimeBegin" />&lt;/e2timebegin>
                &lt;e2timeend><e2:item name="TimeEnd" />&lt;/e2timeend>
@@ -15,7 +14,9 @@
                &lt;e2startprepare><e2:item name="startPrepare" />&lt;/e2startprepare>
                &lt;e2justplay><e2:item name="justPlay" />&lt;/e2justplay>
                &lt;e2afterevent><e2:item name="afterEvent" />&lt;/e2afterevent>
-               &lt;e2logentries><e2:item name="LogEntries" />&lt;/e2logentries>
+               &lt;e2dirname><e2:item name="Location" />&lt;/e2dirname>
+               &lt;e2tags><e2:item name="Tags" filter="xml"/>&lt;/e2tags>
+               &lt;e2logentries><e2:item name="LogEntries" filter="xml"/>&lt;/e2logentries>
                &lt;e2filename><e2:item name="Filename" filter="xml"/>&lt;/e2filename>
                &lt;e2backoff><e2:item name="Backoff" />&lt;/e2backoff>
                &lt;e2nextactivation><e2:item name="nextActivation" />&lt;/e2nextactivation>
index 27457b2..67fc457 100644 (file)
@@ -1,5 +1,5 @@
 <e2:screen name="TimerWebScreen">&lt;?xml version="1.0" encoding="UTF-8"?>
-       <e2:element source="TVBrowser" id="sRef,name,description,eit,disabled,justplay,afterevent,command,syear,smonth,sday,shour,smin,eyear,emonth,eday,ehour,emin,repeated">
+       <e2:element source="TVBrowser" id="sRef,name,description,dirname,tags,eit,disabled,justplay,afterevent,command,year,month,day,shour,smin,ehour,emin,repeated">
                <e2:convert type="web:TextToHTML" />
        </e2:element>
 </e2:screen>
\ No newline at end of file
index 7604ad6..6e7677e 100644 (file)
@@ -39,6 +39,7 @@ from WebComponents.Sources.MP import MP
 from WebComponents.Sources.ServiceListReload import ServiceListReload
 from WebComponents.Sources.AT import AT
 from WebComponents.Sources.CurrentService import CurrentService
+from WebComponents.Sources.LocationsAndTags import LocationsAndTags
 
 from Components.Sources.FrontendStatus import FrontendStatus
 
@@ -135,6 +136,12 @@ class ServiceWebScreen(WebScreen):
                ugly, but necessary :(
                """
 
+class LocationsAndTagsWebScreen(WebScreen):
+       def __init__(self, session, request):
+               WebScreen.__init__(self, session, request)
+               self["Locations"] = LocationsAndTags(session,LocationsAndTags.LOCATIONS)
+               self["Tags"] = LocationsAndTags(session,LocationsAndTags.TAGS)
+
 class EPGWebScreen(WebScreen):
        def __init__(self, session, request):
                WebScreen.__init__(self, session, request)
@@ -203,15 +210,11 @@ class ParentControlWebScreen(WebScreen):
 class WAPWebScreen(WebScreen):
        def __init__(self, session, request):
                WebScreen.__init__(self, session, request)
-               self["WAPFillOptionListSyear"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-               self["WAPFillOptionListSday"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-               self["WAPFillOptionListSmonth"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
+               self["WAPFillOptionListYear"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
+               self["WAPFillOptionListDay"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
+               self["WAPFillOptionListMonth"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
                self["WAPFillOptionListShour"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
                self["WAPFillOptionListSmin"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-
-               self["WAPFillOptionListEyear"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-               self["WAPFillOptionListEday"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-               self["WAPFillOptionListEmonth"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
                self["WAPFillOptionListEhour"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
                self["WAPFillOptionListEmin"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
 
@@ -220,6 +223,8 @@ class WAPWebScreen(WebScreen):
 
                self["WAPFillValueName"] = WAPfunctions(session,func = WAPfunctions.FILLVALUE)
                self["WAPFillValueDescr"] = WAPfunctions(session,func = WAPfunctions.FILLVALUE)
+               self["WAPFillLocation"] = WAPfunctions(session,func = WAPfunctions.LOCATIONLIST)
+               self["WAPFillTags"] = WAPfunctions(session,func = WAPfunctions.TAGLIST)
 
                self["WAPFillOptionListRepeated"] = WAPfunctions(session,func = WAPfunctions.REPEATED)
                self["WAPServiceList"] = WAPfunctions(session, func = WAPfunctions.SERVICELIST)