Small timer-location/tags fixes
[vuplus_dvbapp-plugin] / webinterface / src / web-data / timer.js
1 // $Header$
2
3 // TimerEdit variables:
4 var addTimerEditFormArray = [];
5 addTimerEditFormArray.TVListFilled = 0;
6 addTimerEditFormArray.RadioListFilled = 0;
7 addTimerEditFormArray.deleteOldOnSave = 0;
8 addTimerEditFormArray.eventID = 0;
9 addTimerEditFormArray.locationsList = [];
10 addTimerEditFormArray.tagsList = [];
11
12 days = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'];
13
14
15 function addTimerFormChangeType() {
16         selected = ($('tvradio').checked === true) ? addTimerEditFormArray.TVList: addTimerEditFormArray.RadioList;
17         
18         for (i = $('channel').options.length; i !== 0; i--) {
19                 $('channel').options[i - 1] = null;
20         }
21         
22         i = -1;
23         for(element in selected) {
24                 if(element != "extend") {
25                         i++;
26                         $('channel').options[i] = new Option(selected[element]);
27                         $('channel').options[i].value = element;
28                 }
29         }
30 }
31
32 function addTimerFormChangeLocation(newloc) {
33         
34 }
35
36 function addTimerFormPrepareTagsMenu(currtags) {
37         result = {};
38         resultsuff = {};
39         taglist = addTimerEditFormArray.tagsList;
40
41         if (currtags == "") {
42                 i = 0;
43                 result[""] = "<None>";
44                 for (i = 0; i < taglist.length; i++) {
45                         result[taglist[i]] = taglist[i];
46                 }
47         } else {
48                 result[currtags] = currtags;
49                 tags = currtags.split(" ");
50                 for (i = 0; i < taglist.length; i++) {
51                         var res = "";
52                         var found = false;
53                         for (j=0; j<tags.length; j++) {
54                                 if (tags[j] != taglist[i]) {
55                                         res += " "+tags[j];
56                                 } else {
57                                         found = true;
58                                 }
59                         }
60                         if (!found) {
61                                 res += " "+taglist[i];
62                         }
63                         if (res.length > 0) {
64                                 res = res.substring(1,res.length);
65                         }
66                         if (found) {
67                                 resultsuff[res] = "- "+taglist[i];
68                         } else {
69                                 result[res] = "+ "+taglist[i];
70                         }
71                 }
72                 if (tags.length > 1) {
73                         for (ele in resultsuff) {
74                                 result[ele] = resultsuff[ele];
75                         }
76                 }
77                 result[""] = "<None>";
78         }
79         return result;
80 }
81
82 function addTimerFormChangeTags(newtags) {
83         lst = addTimerFormPrepareTagsMenu(newtags);
84
85         for (i = $('tags').options.length; i !== 0; i--) {
86                 $('tags').options[i - 1] = null;
87         }
88         
89         for(element in lst) {
90                 $('tags').options[i] = new Option(lst[element]);
91                 $('tags').options[i].value = element;
92                 i++;
93         }
94 }
95
96
97 // Timer
98 function addTimerByID(sRef,eventID,justplay){
99         if(parentPin(sRef)) {
100                 debug("[addTimerByID] eventID: "+eventID);
101                 doRequest(url_timeraddbyeventid+"?sRef="+sRef+"&eventid="+eventID+"&justplay="+justplay, incomingTimerAddResult, false);        
102         }
103 }
104
105
106 function incomingTimerAddResult(request){
107         debug("[incomingTimerAddResult] called");
108         if(request.readyState == 4){
109                 var result = new SimpleXMLResult(getXML(request));
110                 if(result.getState()){
111                         //timer has been added
112                         notify(result.getStateText(), result.getState());
113                         loadTimerList();
114                 }else{
115                         notify(result.getStateText(), result.getState());
116                 }
117         }               
118 }
119
120
121 function loadTimerList(){
122         doRequest(url_timerlist, incomingTimerList, false);     
123 }
124
125
126 function incomingTimerList(request){
127         if(request.readyState == 4){
128                 var timers = new TimerList(getXML(request)).getArray();
129                 debug("[incomingTimerList] Got " + timers.length + " timers");
130
131                 var aftereventReadable = ['Nothing', 'Standby', 'Deepstandby/Shutdown', 'Auto'];
132                 var justplayReadable = ['record', 'zap'];
133                 
134                 var namespace = [];
135                 var cssclass = "even";
136                 
137                 for ( var i = 0; i < timers.length; i++){
138                         var timer = timers[i];
139                         var beginDate = new Date(Number(timer.getTimeBegin())*1000);
140                         var endDate = new Date(Number(timer.getTimeEnd())*1000);
141                         
142                         var enDis = timer.getToggleDisabledIMG() == "on" ? "Disable Timer" : "Enable Timer";
143                         
144                         cssclass = cssclass == 'even' ? 'odd' : 'even';
145                         
146                         namespace[i] = {        
147                                 'servicereference': timer.getServiceReference(),
148                                 'servicename': quotes2html(timer.getServiceName()),
149                                 'title': quotes2html(timer.getName()),
150                                 'description': quotes2html(timer.getDescription()),
151                                 'descriptionextended': quotes2html(timer.getDescriptionExtended()),
152                                 'begin': timer.getTimeBegin(),
153                                 'beginDate': dateToString(beginDate),
154                                 'end': timer.getTimeEnd(),
155                                 'endDate': dateToString(endDate),
156                                 'state': timer.getState(),
157                                 'duration': Math.ceil((timer.getDuration()/60)),
158                                 'repeated': timer.getRepeated(),
159                                 'repeatedReadable': repeatedReadable(timer.getRepeated()),
160                                 'justplay': timer.getJustplay(),
161                                 'justplayReadable': justplayReadable[Number(timer.getJustplay())],
162                                 'afterevent': timer.getAfterevent(),
163                                 'aftereventReadable': aftereventReadable[Number(timer.getAfterevent())],
164                                 'dirname' : timer.getDirname(),
165                                 'tags' : timer.getTags(),
166                                 'disabled': timer.getDisabled(),
167                                 'onOff': timer.getToggleDisabledIMG(),
168                                 'enDis': timer.getToggleDisabledText(),
169                                 'cssclass': cssclass
170                         };                      
171                 }
172                 data = { timer : namespace };
173                 processTpl('tplTimerList', data, 'contentMain');
174         }
175 }
176
177
178 function repeatedReadable(num) {
179         num = Number(num);
180         if(num === 0) {
181                 return "One Time";
182         }
183         
184         var retVal = "";
185         var Repeated = [];
186         Repeated["Mo-Su"] =127;
187         Repeated["Mo-Fr"] = 31;
188         Repeated["Su"] =    64;
189         Repeated["Sa"] =    32;
190         Repeated["Fr"] =    16;
191         Repeated["Th"] =     8;
192         Repeated["We"] =     4;
193         Repeated["Tu"] =     2;
194         Repeated["Mo"] =     1;
195         
196         for(rep in Repeated) {
197                 if(rep.toString() != 'extend') {
198                         var check = Number(Repeated[rep]);
199                         if(check <= num) {
200                                 num -= check;
201                                 if(retVal === '') {
202                                         retVal += rep.toString();
203                                 } else {
204                                         retVal = rep.toString()+','+retVal;
205                                 }
206                         }
207                 }
208         }
209         return retVal;
210 }
211
212
213 function delTimer(sRef, begin, end, servicename, title, description, readyFunction){
214         debug("[delTimer] sRef("+sRef+"),begin("+begin+"),end("+end+"),servicename("+servicename+"),title("+title+"),description("+description+")");
215         var result = confirm(
216                 "Selected timer:\n"     +
217                 "Channel: "+servicename+"\n" + 
218                 "Title: "+title+"\n" +
219                 "Description: "+description+"\n" +
220                 "Are you sure that you want to delete the Timer?");
221         if(result){
222                 debug("[delTimer] ok confirm panel"); 
223                 doRequest(url_timerdelete+"?sRef="+sRef+"&begin="+begin+"&end="+end, readyFunction, false);
224                 return true;
225         
226         } else {
227                 debug("[delTimer] cancel confirm panel");
228         }
229         return false;
230 }
231
232
233 function incomingTimerDelResult(request){
234         debug("[incomingTimerDelResult] called");
235         if(request.readyState == 4){
236                 var result = new SimpleXMLResult(getXML(request));
237                 notify(result.getStateText(), result.getState());
238                 debug("[incomingTimerDelResult] Loading List");
239                 loadTimerList();
240         }               
241 }
242
243
244 function loadTimerFormNow() {
245         var now = new Date();
246         addTimerEditFormArray.year = now.getFullYear();
247         addTimerEditFormArray.month = now.getMonth() + 1;
248         addTimerEditFormArray.day = now.getDate();
249         addTimerEditFormArray.shour = now.getHours();
250         addTimerEditFormArray.smin = now.getMinutes();
251
252         var     plusTwoHours = new Date(now.getTime() + ((120 *60)*1000) );
253         addTimerEditFormArray.ehour = plusTwoHours.getHours();
254         addTimerEditFormArray.emin = plusTwoHours.getMinutes();
255                 
256         addTimerEditFormArray.justplay = "0";
257         addTimerEditFormArray.channel = "";
258         addTimerEditFormArray.channelName = "";
259         addTimerEditFormArray.channelSort = "tv";
260         addTimerEditFormArray.name = "";
261         addTimerEditFormArray.description = "";
262         addTimerEditFormArray.dirname = "";
263         addTimerEditFormArray.tags = "";
264         addTimerEditFormArray.repeated = 0;
265         addTimerEditFormArray.afterEvent = "3";
266         addTimerEditFormArray.deleteOldOnSave = 0;
267         
268         addTimerEditFormArray.beginOld = 0;
269         addTimerEditFormArray.endOld = 0;
270         
271         
272         debug("[loadTimerFormNow] done");
273         loadTimerFormTags();
274 }
275
276
277 function loadTimerEditForm(justplay, begin, end, repeated, channel, channelName, name, description, dirname, tags, afterEvent, deleteOldOnSave, eit) {
278         debug('[loadTimerEditForm] justplay: ' + justplay + ',begin: ' + begin + ',end: ' + end + ',repeated: ' + repeated + ',channel: ' + channel + ',name: ' + name +',description: ' + description +',dirname: ' + dirname +',tags: ' + tags + ',afterEvent: ' + afterEvent + ',deleteOldOnSave: ' + deleteOldOnSave);
279         var start = new Date(Number(begin)*1000);
280         addTimerEditFormArray.year = start.getFullYear();
281         addTimerEditFormArray.month = start.getMonth() + 1;
282         addTimerEditFormArray.day = start.getDate();
283         addTimerEditFormArray.shour = start.getHours();
284         addTimerEditFormArray.smin = start.getMinutes();
285         
286         var     stopp = new Date(Number(end)*1000);
287         addTimerEditFormArray.ehour = stopp.getHours();
288         addTimerEditFormArray.emin = stopp.getMinutes();
289         
290         addTimerEditFormArray.justplay = String(justplay);
291         addTimerEditFormArray.channel = decodeURIComponent(String(channel));
292         addTimerEditFormArray.channelName = String(channelName);
293         addTimerEditFormArray.channelSort = "";
294         addTimerEditFormArray.name = String(name);
295         addTimerEditFormArray.description = String(description);
296         addTimerEditFormArray.dirname = String(dirname);
297         addTimerEditFormArray.tags = String(tags);
298         addTimerEditFormArray.repeated = Number(repeated);
299         addTimerEditFormArray.afterEvent = Number(afterEvent);
300         
301         debug("[loadTimerEditForm]" + justplay + "|" + begin + "|" + end + "|" + repeated + "|"+channel+"|"+name+"|"+description+"|"+dirname+"|"+tags+"|"+afterEvent);
302
303         addTimerEditFormArray.deleteOldOnSave = Number(deleteOldOnSave);
304         addTimerEditFormArray.beginOld = Number(begin);
305         addTimerEditFormArray.endOld = Number(end);
306         
307         addTimerEditFormArray.eventID = Number(eit);
308         
309         loadTimerFormTags();
310 }
311
312 function loadTimerFormTags() {
313         doRequest(url_getTags, incomingTimerFormTags, false);
314 }
315
316 function incomingTimerFormTags(request){
317         debug("[incomingTimerFormTags] called");
318         if(request.readyState == 4){
319                 var result = new SimpleXMLResult(getXML(request));
320                 addTimerEditFormArray.tagsList = (typeof(result.getStateText()) != 'undefined' ? result.getStateText().split(" ") : []);
321                 loadTimerFormLocations();
322         }               
323 }
324
325 function loadTimerFormLocations() {
326         doRequest(url_getLocations, incomingTimerFormLocations, false);
327 }
328
329 function incomingTimerFormLocations(request){
330         debug("[incomingTimerFormLocations] called");
331         if(request.readyState == 4){
332                 var result = new SimpleXMLResult(getXML(request));
333                 addTimerEditFormArray.locationsList = (typeof(result.getStateText()) != 'undefined' ? result.getStateText().split(" ") : ["/hdd/movie"]);
334                 loadTimerFormChannels();
335         }               
336 }
337
338
339 // startin to load for TV
340 function loadTimerFormChannels() {
341         if(addTimerEditFormArray.TVListFilled === 1 && addTimerEditFormArray.RadioListFilled === 1) {
342                 loadTimerForm();
343         } else if(addTimerEditFormArray.TVListFilled === 1 && addTimerEditFormArray.RadioListFilled === 0) {
344                 addTimerListFormatTV();
345         } else {
346                 var favorites = '1%3A7%3A1%3A0%3A0%3A0%3A0%3A0%3A0%3A0%3AFROM%20BOUQUET%20%22userbouquet.favourites.tv%22%20ORDER%20BY%20bouquet';
347                 doRequest(url_getServices+favorites, addTimerListFormatTV, false);
348         }
349 }
350
351
352 function addTimerListFormatTV(request) {
353         if(addTimerEditFormArray.RadioListFilled === 0) {
354                 if(request.readyState == 4){
355                         var services = new ServiceList(getXML(request)).getArray();
356                         var tv = {};
357                         for ( var i = 0; i < services.length ; i++){
358                                 var reference = services[i];
359                                 tv[reference.servicereference] = reference.servicename;
360                         }
361                         addTimerEditFormArray.TVListFilled = 1;
362                         addTimerEditFormArray.TVList = tv;
363                 }
364         }
365         if(addTimerEditFormArray.RadioListFilled == 1) {
366                 loadTimerForm();
367         } else {
368                 var favorites = '1%3A7%3A1%3A0%3A0%3A0%3A0%3A0%3A0%3A0%3AFROM%20BOUQUET%20%22userbouquet.favourites.radio%22%20ORDER%20BY%20bouquet';
369                 doRequest(url_getServices+favorites, addTimerListFormatRadio, false);
370         }
371 }
372
373
374 function addTimerListFormatRadio(request) {
375         if(request.readyState == 4){
376                 var services = new ServiceList(getXML(request)).getArray();
377                 var radio = {};
378                 for ( var i = 0; i < services.length ; i++){
379                         var reference = services[i];
380                         radio[reference.servicereference] = reference.servicename;
381                 }
382                 addTimerEditFormArray.RadioListFilled = 1;
383                 addTimerEditFormArray.RadioList = radio;
384         }
385         loadTimerForm();
386 }
387
388
389 function loadTimerForm(){
390
391         var Action = {};
392         Action["0"] = "Record";
393         Action["1"] = "Zap";
394         
395         var Repeated = [];
396         Repeated["1"] =  "mo";
397         Repeated["2"] = "tu";
398         Repeated["4"] =  "we";
399         Repeated["8"] =  "th";
400         Repeated["16"] = "fr";
401         Repeated["32"] = "sa";
402         Repeated["64"] = "su";
403         Repeated["31"] = "mf";
404         Repeated["127"] = "ms";
405         
406         var AfterEvent = {};
407         AfterEvent["0"] = "Nothing";
408         AfterEvent["1"] = "Standby";
409         AfterEvent["2"] = "Deepstandby/Shutdown";
410         AfterEvent["3"] = "Auto";
411         
412         addTimerEditFormArray.name = (typeof(addTimerEditFormArray.name) != 'undefined') ? addTimerEditFormArray.name : '';
413         addTimerEditFormArray.name = (addTimerEditFormArray.name === '') ? ' ' : addTimerEditFormArray.name;
414
415         addTimerEditFormArray.description = (typeof(addTimerEditFormArray.description) != 'undefined') ? addTimerEditFormArray.description : '';
416         addTimerEditFormArray.description = (addTimerEditFormArray.description === '') ? ' ' : addTimerEditFormArray.description;
417
418         var channelObject = addTimerEditFormArray.TVList;
419         if(     addTimerEditFormArray.channelSort === 'tv') {
420                 // already set
421         } else if( addTimerEditFormArray.channelSort === 'radio') {
422                 channelObject = addTimerEditFormArray.RadioList;
423         } else {
424                 var found = 0;
425                 for( element in addTimerEditFormArray.TVList) {
426                         if( element == addTimerEditFormArray.channel) {
427                                 found = 1;
428                                 break;
429                         }
430                 }
431                 if(found === 0) {
432                         for( element in addTimerEditFormArray.RadioList) {
433                                 if( element == addTimerEditFormArray.channel) {
434                                         channelObject = addTimerEditFormArray.RadioList;
435                                         found = 1;
436                                         break;
437                                 }
438                         }
439                 }
440                 if(found === 0) {
441                         addTimerEditFormArray.TVList[addTimerEditFormArray.channel] = addTimerEditFormArray.channelName;
442                 }
443         }
444         
445         var dashString = "------";
446         
447         channelObject[dashString] = "- Bouquets -";
448         
449         var listeNeu = new ServiceList(getXML(doRequestMemory[url_getServices+encodeURIComponent(bouquetsTv)])).getArray();
450         if(addTimerEditFormArray.channelSort == "radio") {
451                 listeNeu = new ServiceList(getXML(doRequestMemory[url_getServices+encodeURIComponent(bouquetsRadio)])).getArray();
452         }
453         
454         for (i = 1; i < listeNeu.length; i++) {
455                 element = listeNeu[i];
456                 channelObject[String(dashString+i)] = "---";
457                 channelObject[element.getServiceReference()] = element.getServiceName();
458         }
459
460         var locationsObject = {};
461         for (i = 0; i < addTimerEditFormArray.locationsList.length; i++) {
462                 str = addTimerEditFormArray.locationsList[i];
463                 locationsObject[str] = str;
464         }
465
466         var tagsObject = addTimerFormPrepareTagsMenu(addTimerEditFormArray.tags);
467
468         var namespace = {                                       
469                                 year: createOptions(2008,2015,addTimerEditFormArray.year),
470                                 month: createOptions(1,12,addTimerEditFormArray.month),
471                                 day: createOptions(1,31,addTimerEditFormArray.day),
472                                 shour: createOptions(0,23,addTimerEditFormArray.shour),
473                                 smin: createOptions(0,59,addTimerEditFormArray.smin),
474                                 ehour: createOptions(0,23,addTimerEditFormArray.ehour),
475                                 emin: createOptions(0,59,addTimerEditFormArray.emin),
476                                 action: createOptionList(Action, addTimerEditFormArray.justplay),
477                                 channel: createOptionList(channelObject, addTimerEditFormArray.channel),
478                                 afterEvent: createOptionList(AfterEvent, addTimerEditFormArray.afterEvent),
479                                 repeated: createOptionListRepeated(Repeated, addTimerEditFormArray.repeated),
480                                 dirname: createOptionList(locationsObject, addTimerEditFormArray.dirname),
481                                 tags: createOptionList(tagsObject, addTimerEditFormArray.tags),
482
483                                 timer: {
484                                         name: addTimerEditFormArray.name,
485                                         description: addTimerEditFormArray.description,
486                                         deleteOldOnSave: addTimerEditFormArray.deleteOldOnSave,
487                                         channelOld: addTimerEditFormArray.channel,
488                                         beginOld: addTimerEditFormArray.beginOld,
489                                         endOld: addTimerEditFormArray.endOld,                                   
490                                         eventID: addTimerEditFormArray.eventID
491                                 }
492                 };
493         data = namespace;
494         processTpl('tplTimerEdit', data, 'contentMain');
495         /*
496         var listerHtml = RND(tplAddTimerForm, namespace);
497         $('BodyContent').innerHTML = listerHtml;
498         */
499         
500         // Empty some stuff, but keep others to have the performance
501         var tmp1 = addTimerEditFormArray.RadioList;
502         var tmp2 = addTimerEditFormArray.TVList;
503         var tmp3 = addTimerEditFormArray.locationsList;
504         var tmp4 = addTimerEditFormArray.tagsList;
505         addTimerEditFormArray = [];
506         addTimerEditFormArray.deleteOldOnSave = 0;
507         addTimerEditFormArray.RadioList = tmp1;
508         addTimerEditFormArray.TVList = tmp2;
509         addTimerEditFormArray.locationsList = tmp3;
510         addTimerEditFormArray.tagsList = tmp4;
511         addTimerEditFormArray.TVListFilled = 1;
512         addTimerEditFormArray.RadioListFilled = 1;
513 }
514
515
516 function createOptions(start, end, number) {
517         var namespace =[];
518         
519         for(i = start; i <= end; i++) {
520                 var txt = (String(i).length == 1) ? "0" + String(i) : String(i);
521                 var selected =  (i == Number(number)) ? "selected" : " ";
522                 namespace[i] = {
523                         'value': i,
524                         'txt': txt,
525                         'selected': selected };
526         }
527         return namespace;
528 }
529
530
531 function createOptionList(object, selected) {
532         var namespace = Array();
533         var i = 0;
534         
535         for(var element in object) {            
536                 var txt = String(object[element]);
537                 var sel = " ";
538                 
539                 if(element == selected) {
540                         sel = "selected";
541                 }
542                 
543                 if(element != "extend") {
544                         namespace[i] = {
545                                 'value': element,
546                                 'txt': txt,
547                                 'selected': sel };
548                         i++;
549                 }
550         }
551
552         return namespace;
553 }
554
555
556 function createOptionListRepeated(Repeated, repeated) {
557         num = Number(repeated);
558                 
559         list = [1, 2, 4, 8, 16, 32, 64, 31, 127];
560         namespace = [];
561         
562         for(var i = 0; i < list.length; i++) {
563                 txt = String(Repeated[String(list[i])]);
564                 if( String(Repeated[String(list[i])]) == "mf") {
565                         txt = "Mo-Fr";
566                 } else if( String(Repeated[String(list[i])]) == "ms") {
567                         txt = "Mo-Su";
568                 } else {
569                         txt = txt.substr(0,1).toUpperCase() + txt.substr(1,1);
570                 }
571                 checked = " ";
572                 if (!(~num & list[i])) {
573                         checked = "checked";
574                 }
575                 namespace[i] = { 'id': Repeated[String(list[i])],
576                         'name': Repeated[String(list[i])],
577                         'value': list[i],
578                         'txt': txt,
579                         'checked': checked
580                 };
581         }
582         return namespace;
583 }
584
585
586 function sendAddTimer() {
587         debug("[sendAddTimer]" + "parentChannel:" +$('channel').value);
588         
589         if(parentPin($('channel').value)) {
590                 beginD = new Date(ownLazyNumber($('year').value), (ownLazyNumber($('month').value) - 1), ownLazyNumber($('day').value), ownLazyNumber($('shour').value), ownLazyNumber($('smin').value));
591                 begin = beginD.getTime()/1000;
592                 
593                 endD = new Date(ownLazyNumber($('year').value), (ownLazyNumber($('month').value) - 1), ownLazyNumber($('day').value), ownLazyNumber($('ehour').value), ownLazyNumber($('emin').value));
594                 end = endD.getTime()/1000;
595                 if(end<begin) {
596                         end += 86400;
597                 }
598
599                 repeated = 0;
600                 if( $('ms').checked ) {
601                         repeated = 127;
602                 } else if($('mf').checked) {
603                         repeated = 31;
604                         if($('sa').checked) {
605                                 repeated += ownLazyNumber($('sa').value);
606                         }
607                         if($('su').checked) {
608                                 repeated += ownLazyNumber($('su').value);
609                         }
610                 } else {
611                         check = ['mo', 'tu', 'we', 'th', 'fr'];
612                         for(i = 0; i < check.length; i++) {
613                                 if($(check[i]).checked) {
614                                         repeated += Number($(check[i]).value);
615                                 }
616                         }
617                 }
618         
619                 descriptionClean = ($('descr').value == " " || $('descr').value == "N/A") ? "" : $('descr').value;
620                 nameClean = ($('name').value == " " || $('name').value == "N/A") ? "" : $('name').value;
621                 
622                 neverString = "[0-9a-zA-Z\\-_\\.\\!\\(\\)&=\\+$,;\\?/:\\\\ ]*";
623                 if(descriptionClean != descriptionClean.match(neverString) ||
624                         nameClean != nameClean.match(neverString)) {
625                         alert("Please only use "+neverString+" in the name and the description field");
626                         return;
627                 }
628
629                 dirname = $('dirname').value;
630                 tags = $('tags').value;
631                 repeated = 0;
632                 if($('ms').checked) {
633                         repeated = ownLazyNumber($('ms').value);
634                 } else if($('mf').checked) {
635                         repeated = ownLazyNumber($('mf').value);
636                         if($('su').checked) {
637                                 repeated += ownLazyNumber($('su').value);
638                         }
639                         if($('sa').checked) {
640                                 repeated += ownLazyNumber($('sa').value);
641                         }
642                 } else {
643                         for(i = 0; i < days.length; i++){
644                                 if($(days[i]).checked) {
645                                         repeated += ownLazyNumber($(days[i]).value);
646                                 }
647                         }
648                 }
649                 //addTimerByID(\'%(servicereference)\',\'%(eventid)\',\'False\');
650                 doRequest(url_timerchange+"?"+"sRef="+($('channel').value).replace("&quot;", '"')+"&begin="+ begin +
651                   "&end="+end+"&name="+escape(nameClean)+"&description="+escape(descriptionClean) +
652                   "&dirname="+dirname+"&tags="+escape(tags) +
653                   "&afterevent="+$('after_event').value+"&eit=0&disabled=0" +
654                   "&justplay="+ownLazyNumber($('justplay').value)+"&repeated="+repeated +
655                   "&channelOld="+$('channelOld').value +
656                   "&beginOld="+$('beginOld').value+"&endOld="+$('endOld').value +
657                   "&eventID"+$('eventID').value +
658                   "&deleteOldOnSave="+ownLazyNumber($('deleteOldOnSave').value), incomingTimerAddResult, false);
659         }
660 }
661
662
663 function cleanTimerListNow(){
664         debug("[cleanTimerListNow] called");
665         doRequest(url_timerlist, incomingCleanTimerListNow, false);     
666 }
667
668
669 function incomingCleanTimerListNow(request) {
670         if(request.readyState == 4){
671                 var timers = new TimerList(getXML(request)).getArray();
672                 debug("[cleanTimerListNow] Got "+timers.length+" timer");
673                 for ( var i = 0; i <timers.length; i++){
674                         var timer = timers[i];
675                         debug("[cleanTimerListNow]" + timer.getState() + " " + quotes2html(timer.getName()));
676                         if(timer.getState() != "0" && timer.getState() != "2") {
677                                 delTimer(timer.getServiceReference(),timer.getTimeBegin(),timer.getTimeEnd(),
678                                         quotes2html(timer.getServiceName()),quotes2html(timer.getName()),quotes2html(timer.getDescription()),incomingJustDoNothing);
679                         }
680                 }
681                 loadTimerList();
682         }
683 }
684
685
686 function incomingJustDoNothing(request){
687         debug("[incomingJustDoNothing] called");
688 }
689
690
691 function sendToggleTimerDisable(justplay,begin,end,repeated,channel,name,description,dirname,tags,afterEvent,disabled){
692         disabled = (ownLazyNumber(disabled) === 0) ? 1 : 0;
693         
694         var descriptionClean = (description == " " || description == "N/A") ? "" : description;
695         var nameClean = (name == " " || name == "N/A") ? "" : name;
696
697         doRequest(url_timerchange+"?"+"sRef="+channel.replace("&quot;", '"')+"&begin="+begin +
698          "&end="+end+"&name="+escape(nameClean)+"&description="+escape(descriptionClean) +
699          "&dirname="+dirname+"&tags="+escape(tags) +
700          "&afterevent="+afterEvent+"&eit=0&disabled="+disabled +
701          "&justplay="+justplay+"&repeated="+repeated +
702          "&channelOld="+channel +
703          "&beginOld="+begin+"&endOld="+end +
704          "&deleteOldOnSave=1", incomingTimerAddResult, false);
705 }
706
707 function incomingWriteTimerListNow(request){
708         var result = new SimpleXMLResult(getXML(request));
709         notify(result.getStateText(), result.getState());
710 }
711
712 function writeTimerListNow() {
713         var request = doRequest(url_timerlistwrite, incomingWriteTimerListNow);
714 }