source: trunk/prototype/modules/calendar/js/calendar.codecs.js @ 5381

Revision 5381, 27.7 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Melhorias e correcoes de bugs e limpeza de codigo

Line 
1//TODO: recuperar esses valores no init do Calendar
2User = {
3 
4    init: function(){
5     
6    this.moduleName = 'expressoCalendar';
7        this.me = DataLayer.dispatch( "me" );
8       
9        var objTime = DataLayer.dispatch( "timezones" );
10        this.timezones = objTime.timezones;
11        this.isDaylightSaving = objTime.isDaylightSaving;
12    this.lastView = 0;
13        this.load();     
14    },
15 
16    load: function(){
17
18        var defaultPreferences = { dateFormat: "dd/MM/yyyy",
19                hourFormat: "HH:mm",
20                defaultCalView: "month",
21                defaultDuration: 30,
22                backgroundColor: "36C",
23                borderColor: "36C",
24                fontColor: "fff",
25                timezone: 'America/Sao_Paulo',
26                weekStart: 'SUN'
27          };
28
29        var pref = DataLayer.get( "modulePreference:detail", ['and',[ "=", "user", this.me.id ], [ "=", "module", this.moduleName ]] );
30       
31        this.preferences = $.isEmptyObject( pref.values ) ? defaultPreferences : pref.values;
32        this.preferenceIds = pref.ids;
33    }
34}
35
36UI = {
37        dialogs: {
38                addEvent: null,
39                importCalendar: null
40        }
41}
42
43DataLayer.codec( "calendarSignature", "calendar", {
44 
45      decoder: function(){
46
47         
48
49      },
50     
51      encoder: function( signatures ){
52
53        return $.map( signatures, function( signature ){
54             
55                  return { events: function( start, end, callback ){
56                       
57                                var viewKey = start + ':' + end;
58
59                                if( Calendar.currentViewKey !== viewKey )
60                                {
61                                    Calendar.currentViewKey = viewKey;
62
63                                    Calendar.currentView = DataLayer.get( 'schedulable:calendar', { start: start, end: end } );
64                                }
65                               
66                                var view = Calendar.currentView[ signature.calendar.id ];
67                               
68                                callback( view && !view.hidden ? view : [] );
69
70                           },
71
72                           backgroundColor: '#' + signature.backgroundColor || User.preferences.backgroundColor,
73                           borderColor: '#' + signature.borderColor || User.preferences.borderColor,
74                           textColor: '#' + signature.fontColor || User.preferences.fontColor,
75                           className: 'calendar-' + signature.calendar.id,
76                           editable:  signature.isOwner }
77               });
78      }
79
80     
81});
82
83Calendar = {
84 
85      load: function(){
86
87          this.signatures  = DataLayer.get("calendarSignature", {filter: ['=', 'user', User.me.id], criteria: {deepness: 2}});
88          //this.signatures  = DataLayer.get( "calendarSignature", [ "=", "user", User.me.id ] );
89         
90          var prevSources = this.sources;
91
92          this.sources = DataLayer.encode( "calendarSignature:calendar", this.signatures );
93
94          if( prevSources )
95          {     
96              var newSources = DataLayer.diff( { 'diff': prevSources }, { 'diff': this.sources } ).diff;
97 
98               for( var i = 0; i < newSources.length; i++ )
99                  $('#calendar').fullCalendar( 'addEventSource', newSources[i] );
100           
101              var removeSources = DataLayer.diff( { 'diff': newSources }, { 'diff': prevSources } ).diff;
102
103              for( var i = 0; i < removeSources.length; i++ )
104                  $('#calendar').fullCalendar( 'removeEventSource', removeSources[i] );
105          }
106
107          this.calendarIds = [], this.signatureOf = {}, this.calendars = [];
108
109          for( var i = 0; i < this.signatures.length; i++ )
110          {
111              this.signatureOf[ this.calendarIds[i] = ( this.calendars[ this.calendars.length ] = this.signatures[i].calendar ).id ] = this.signatures[i];
112          }
113          delete Calendar.currentViewKey;
114      }
115}
116
117Alarms = {
118        load: function(){
119                var eventsDay = DataLayer.get('alarm:schedulable',['=', 'date', new Date().toString("yyyy-MM-dd")]);
120
121                for(var i = 0; i < eventsDay.length; i++){
122                        this.addAlarm( eventsDay[i] );
123                }
124        },
125       
126        addAlarm: function( eventDay ){
127                DataLayer.task( parseInt(eventDay.sendTime) , function( timestamp ){
128                        DataLayer.render('templates/alarm.ejs',{event: eventDay}, function( html ){
129                                var dlgAlarm = jQuery('#div-alarm').html( html ).find('.alarm-event.active');
130                                dlgAlarm.dialog({resizable: false, modal:true, width:400, minHeight: 100,position: 'center', close:function(){$(this).dialog('destroy');$(this).dialog('open');}});
131                        });
132                });
133        }
134}
135
136DataLayer.codec( "modulePreference", "detail", {
137        decoder: function( evtObj ){
138
139        if( notArray = $.type(evtObj) !== "array" )
140                evtObj = [ evtObj ];
141               
142                var res = $.map(evtObj, function( form ){
143                        var returns = [];
144                        var cont = 0;
145                        for (var name in form){
146                                returns[cont] = {
147                                        name: name,
148                                        user: User.me.id,
149                                        value: form[name],
150                                        module: User.moduleName
151                                };
152                                if(typeof(User.preferenceIds[ name ]) != 'undefined')
153                                        returns[cont].id = User.preferenceIds[ name ];
154                                cont++;
155                        }
156                return [returns];
157                });
158       
159        return notArray ? res[0] : res;
160        },
161
162    encoder: function( evtObj ){
163                var val = {};
164                var id = {}
165                for (var i in evtObj){
166                        val[evtObj[i].name] = evtObj[i].value;
167                        id[evtObj[i].name] = evtObj[i].id;
168                }
169                return {values: val,ids: id};
170       
171        }
172});
173
174User.init();
175Calendar.load();
176
177//DataLayer.poll( "schedulable" );
178
179DataLayer.listen( "schedulable", function( status, updateData){
180 
181    if( status === 'serverclient' ){
182                DataLayer.commit( false, false, function(){
183                        delete Calendar.currentViewKey;
184                        $('#calendar').fullCalendar( 'refetchEvents' );
185                        var calendarNotSelected = getNotSelectedCalendars();
186                        for(var i = 0; i < calendarNotSelected.length; i++)
187                                Calendar.currentView[ calendarNotSelected[i] ].hidden = true;
188                        //Necessita ser chamado novamente para atualizar os eventos na tela para o usuário
189                        //de acordo com as a agendas selecionadas
190                        $('#calendar').fullCalendar( 'refetchEvents' );
191                        //Atualiza a listagem de eventos apenas se estiver na aba de listagem
192                        if($tabs.tabs('option' ,'selected') == 1)
193                                pageselectCallback("", 0);
194                });
195    }   
196});
197
198DataLayer.listen( "calendarSignature", function( status ){
199
200    switch( status )
201    {
202      case 'serverclient':  DataLayer.commit( false, false, function( received ){
203
204          delete Calendar.currentViewKey;
205
206          Calendar.load();
207          refresh_calendars();
208      });
209      break;
210      case 'client': 
211      break;
212    }
213});
214
215DataLayer.listen( "modulePreference", function( status ){
216
217    switch( status )
218    {
219        case 'serverclient':  DataLayer.commit( false, false, function(){
220
221            User.load();
222
223        });
224        break;
225        case 'client': 
226        break;
227    }
228
229});
230
231// DataLayer.listen( "calendar", function( status ){
232//
233//     if( status === 'serverclient' )
234//     {
235//      DataLayer.commit( false, false, function(){
236//
237//        $('#calendar').fullCalendar( 'refetchEvents' );
238//
239//      });
240//     }
241//
242// });
243
244DataLayer.listen( "alarm", function( created, updated, deleted ){
245
246});
247
248DataLayer.listen( "calendar", function( status, updateData ){
249
250      if (updateData === false)
251        switch( status )
252        {
253          case 'serverclient':  DataLayer.commit( false, false, function(){
254           
255              Calendar.load();
256              refresh_calendars();
257           
258          });
259          break;
260          case 'client': 
261          break;
262    }
263});
264
265DataLayer.codec( "calendarSignature", "configure", {
266        decoder: function( evtObj ){
267                Encoder.EncodeType = "entity";
268               
269                if( notArray = $.type(evtObj) !== "array" )
270                        evtObj = [ evtObj ];
271               
272                var res = $.map(evtObj, function( form ){
273                        return{
274                                id: form.signature,
275                                user: User.me.id,       
276                                calendar: {
277                                        id: DataLayer.get('calendarSignature', form.signature).calendar,
278                                        name: Encoder.htmlEncode(form.name),
279                                        description: Encoder.htmlEncode(form.description),
280                                        timezone: form.timezone,
281                                        defaultDuration: form.duration != "" ? form.duration : 30,
282                                        location: form.location
283                                },
284                                isOwner: 1,
285                                fontColor: Encoder.htmlEncode(form.fontColor.substring(1)),
286                                backgroundColor: Encoder.htmlEncode(form.backgroundColor.substring(1)),
287                                borderColor: Encoder.htmlEncode(form.borderColor.substring(1)),
288                                msgAdd: Encoder.htmlEncode(form.msgAdd),
289                                msgCancel: Encoder.htmlEncode(form.msgCancel),
290                                msgUpdate: Encoder.htmlEncode(form.msgUpdate),
291                                msgReply: Encoder.htmlEncode(form.msgReply),
292                                msgAlarm: Encoder.htmlEncode(form.msgAlarm),
293                                calendarSignatureAlarms: $.map( form.alarmTime || [], function( alarmTime, i ){
294                                        if(form.alarmId[i] === "")
295                                                return{type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i]};
296                                        else
297                                                return{type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i]};
298                                })
299                        };
300               
301                });
302       
303        return notArray ? res[0] : res;
304        },
305
306    encoder: function( evtObj ){
307       
308        }
309});
310
311DataLayer.codec( "alarm", "schedulable", {
312
313    decoder: function( evtObj ){
314                return false;
315    },
316       
317        encoder: function (evtObjt){
318       
319                        if(notArray = typeof(evtObjt) == 'array' )
320                                evtObjt = [evtObjt];
321                       
322                        var res = $.map(evtObjt, function( objEvent ){ 
323                                var timezone = User.timezones[objEvent.schedulable.timezone];
324                                var timeEvent = function(time, idCalendar){
325                                        var data =  new Date();
326                                        data.setTime(time);
327                                        return dateFormat(setDateTimezone(data, timezone, true, idCalendar), User.preferences.hourFormat.replace(/m/g,'M'))                     
328                                }
329                               
330                                var dateEvent = function( time){
331                                        return new Date( parseInt(time) ).setTimezoneOffset(timezone).toString( User.preferences.dateFormat);
332                                }
333                               
334                                var unitTemp = function(unit, time){
335                                        switch (unit.toLowerCase()){
336                                                case 'h':
337                                                        if(parseInt(time) > 1)
338                                                                return 'horas';
339                                                        return 'hora';
340                                                case 'd':
341                                                        if(parseInt(time) > 1)
342                                                                return 'dias';
343                                                        return 'dia';
344                                                case 'm':
345                                                        if(parseInt(time) > 1)
346                                                                return 'minutos';
347                                                        return 'minuto';
348                                        }
349                                }
350                       
351                                return{
352                                        id: objEvent.id,
353                                        event_start: dateEvent(objEvent.schedulable.startTime),
354                                        sendTime: objEvent.sendTime,
355                                        schedulable: {
356                                                startTime: timeEvent(objEvent.schedulable.startTime),
357                                                id: objEvent.schedulable.id,
358                                                summary: objEvent.schedulable.summary,
359                                                time: objEvent.time,   
360                                                unit: unitTemp(objEvent.unit ,objEvent.time)
361                                        }
362                                }
363                        });
364                return notArray ? res[0] : res;
365        }
366});
367
368DataLayer.codec( "schedulable", "preview", {
369
370    decoder: function( evtObj ){
371                Encoder.EncodeType = "entity";
372       
373                if( notArray = $.type(evtObj) !== "array" )
374                        evtObj = [ evtObj ];
375
376                var pref = User.preferences;
377
378                var res = $.map(evtObj, function( form ){
379                       
380                        return {
381                                id: form.idEvent,
382                                calendar: form.calendar,
383                                participants : [{
384                                        user: User.me.id,
385                                        status: form.status,
386                                        id: form.attendee_organizer[0],
387                                        isOrganizer: 0,
388                                        alarms: typeof(form.alarmTime) != 'undefined' ?
389                                                $.map( form.alarmTime || [], function( alarmTime, i ){
390
391                                                        if( alarmTime === "" )
392                                                                return( null );
393
394                                                        if(form.alarmId[i] === "")
395                                                                return { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] };
396                                                        else
397                                                                return { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] };
398                                                }) : []
399                                        }]
400                        }
401                });
402               
403                return notArray ? res[0] : res;
404    },
405
406    encoder: function( evtObj ){
407
408        var notArray = false;
409     
410        if( notArray = $.type(evtObj) !== "array" )
411            evtObj = [ evtObj ];
412
413        var pref = User.preferences;
414        var statusParticipants = [];
415        for (var i = 1; i <= 5; i++)
416                statusParticipants[i] = 0;
417               
418        var statusObject = function(status){
419                return{
420                        accepted: status[1],
421                        tentative: status[2],
422                        cancelled: status[3],
423                        unanswered: status[4],
424                        delegated: status[5]           
425                }
426        };     
427
428        var isOrganizer = !!evtObj[0].id ? 0 : 1;
429       
430        var res = $.map(evtObj, function( objEvent ){                   
431                   
432                        var existsTimezone = false;
433                        var participantInfo = {}, me = { uid: User.me.id, name: User.me.name, mail: User.me.mail};
434                        var timezone = '';
435                        if(objEvent.timezone){
436                                timezone = User.timezones[objEvent.timezone];
437                                existsTimezone = true;
438                        }else{
439                                var tzId = pref.timezone;
440                                timezone = User.timezones[ tzId ];
441                        }
442                       
443                    var dateEvent = function( time, allDayEnd){
444                       
445                        return new Date( parseInt(time) - ((allDayEnd) ? 86400000 : 0)  ).setTimezoneOffset(timezone).toString( User.preferences.dateFormat); }
446
447                        var timeEvent = function(time, idCalendar){
448                                var data =  new Date();
449                                data.setTime(time);
450                                return dateFormat(setDateTimezone(data, timezone, existsTimezone, idCalendar), User.preferences.hourFormat.replace(/m/g,'M'))                   
451                        }                                               
452                        var alarmParticipant = function(obj){
453                                var alarms = [];
454                                for(var i = 0; i < obj.length; i++){
455                                        alarms.push(DataLayer.get('alarm', obj[i]));
456                                }
457                                return alarms;
458                        }
459                    return {
460                              "class": objEvent["class"],
461                              id: objEvent.id,
462                              location: objEvent.location,
463                              category: objEvent.category,
464                              calendars: Calendar.calendars,
465                              calendar: objEvent.calendar,
466                              summary: objEvent.summary,
467                              description: objEvent.description,
468                              timezone: objEvent.timezone,
469                              timezones: User.timezones,
470                              startDate: dateEvent( objEvent.startTime, false ),
471                              startHour: timeEvent(objEvent.startTime, objEvent.calendar ),
472                              endDate: dateEvent( objEvent.endTime, (!!parseInt(objEvent.allDay)) ? true : false ),
473                              endHour: timeEvent(objEvent.endTime, objEvent.calendar),
474                              allDay: !!parseInt( objEvent.allDay ),
475          //                            attachments: this.decode( "attachment:detail", form ),
476                              attendee: $.map(objEvent.participants || [], function( participant, i ){                                         
477                                       
478                                        var attend = DataLayer.get('participant', participant);
479                                        attend.user = DataLayer.get('user', attend.user)
480                                       
481                                        statusParticipants[attend.status]++;   
482                                         
483                                          var person = { uid: attend.id,
484                                                 name: attend.user.name != 'false' ? attend.user.name : '',
485                                                 mail: attend.user.mail,
486                                                 isExternal: attend.isExternal
487                                                };
488
489                                          if( attend.user.id ===  me.uid )
490                                          {
491                                              participantInfo.status = attend.status;
492                                              participantInfo.alarms = alarmParticipant(attend.alarms);
493                                                  me.uid = attend.id;
494                                          }
495                                          if( parseInt( attend.isOrganizer ) )
496                                          {
497                                                 isOrganizer = ((attend.user.id == User.me.id) || (!!!attend.user)) ? 1 : 0;
498                                              participantInfo.organizer = person;
499                                                  return(null);
500                                          }
501
502                                          return( person );
503
504                                      }),
505                              organizer: participantInfo.organizer || me,
506                              alarms: participantInfo.alarms || [],
507                              status: participantInfo.status || 1,
508                              me: me
509                            };
510                });
511        res[0].isOrganizer = isOrganizer;
512        res[0].statusParticipants = statusObject(statusParticipants);
513        if( !notArray )
514        {
515            var dates = {};
516
517            for (var i=0; i<res.length; i++) {
518
519                    var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
520                    var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
521
522                    var counter   = startDate.clone();
523
524                    while (counter.compareTo(startDate) == 0) {
525
526                            if (!dates[counter.toString(User.preferences.dateFormat)])
527                                dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
528                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
529                                dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
530
531                            dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]);
532                            counter.addDays(-1);
533                    }
534            }
535
536            res = { events_list: dates };
537        }
538
539        return notArray ? res[0] : res;
540    }
541});
542
543
544
545DataLayer.codec( "schedulable", "detail", {
546
547    decoder: function( evtObj ){
548
549        Encoder.EncodeType = "entity";
550       
551        if( notArray = $.type(evtObj) !== "array" )
552                evtObj = [ evtObj ];
553
554        var pref = User.preferences;
555
556        var res = $.map(evtObj, function( form ){
557                        var tzId = '';
558                    if(form.timezone == ''){
559                                calendar = DataLayer.get('calendar', form.calendar);
560                                tzId = calendar.timezone || User.preferences.timezone;
561                        }else
562                                tzId = form.timezone;
563                    timezone = User.timezones[ tzId ];
564
565                    opposites = { '-':'+', '+':'-' },
566
567                    formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat;
568                       
569                    participants = [];
570
571                    //if( form.idEvent )
572                        //      participants = DataLayer.get( "participant:detail", [ "=", "schedulable", form.idEvent ] );
573                       
574                        var spaces = function(hours){
575                                return hours.replace(/\s$/, "");
576                        };
577                       
578                        var startDate = Date.parseExact( !!form.allDay ? form.startDate+ " 00:00": form.startDate + " " + spaces(form.startHour) , formatString );
579                        startDate = getDateUTC(startDate, timezone);
580                       
581                        var endDate = Date.parseExact( !!form.allDay ? form.endDate + " 00:00": form.endDate + " " + spaces(form.endHour), formatString );
582                        endDate = getDateUTC(endDate, timezone);
583                    return {
584                              "class": form["class"],
585                                  startTime: startDate.getTime(),
586                                  endTime: !!form.allDay ? (new Date(endDate.getTime() + (86400000)).getTime()) : endDate.getTime(),
587                                  allDay: ( !!form.allDay ? 1 : 0 ),
588                              id: form.idEvent,
589                              location: form.location,
590                              category: form.category,
591                              calendar: form.calendar,
592                              summary: form.summary,
593                              description: form.description,
594                              timezone: tzId,
595                              participants: $.map( form.attendee || [], function( attendee, i ){
596
597                                                if( !attendee || attendee === "" )
598                                                        return( null );
599
600                                                var participant = {};
601                                                participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
602                                               
603                                                if( participant.user === User.me.id ){
604                                                        if(!!form.idEvent )
605                                                                participant.id = attendee;
606                                                        participant.isOrganizer = ( !i ? 1 : 0 );
607                                                        var obj = form.alarmTime ? form : pref;
608                                                        participant.alarms = $.map( obj.alarmTime || [], function( alarmTime, i ){
609
610                                                                if( alarmTime === "" )
611                                                                        return( null );
612
613                                                                if(obj.alarmId[i] === "")
614                                                                        return { type: obj.alarmType[i],unit: obj.alarmUnit[i], time: obj.alarmTime[i] };
615                                                                else
616                                                                        return { type: obj.alarmType[i], unit: obj.alarmUnit[i], time: obj.alarmTime[i], id: obj.alarmId[i] };
617                                                        });
618                                                        participant.status = form.status;
619                                                }else{
620                                                        participant.id = attendee;
621                                                        participant.isOrganizer = ( !i ? 1 : 0 );
622                                                        if(!!parseInt(form.attendeeType[i]))
623                                                                participant.isExternal= 1;
624                                                }
625                                                if( participants[ attendee ] ){
626                                                        participant.id = participants[ attendee ].id;
627                                                }
628                                                return( participant );
629                                          })
630                            };
631                    });
632
633        return notArray ? res[0] : res;
634    },
635
636    encoder: function( evtObj ){
637
638        var notArray = false;
639     
640        if( notArray = $.type(evtObj) !== "array" )
641            evtObj = [ evtObj ];
642
643        var pref = User.preferences;
644
645        var res = $.map(evtObj, function( objEvent ){                   
646                   
647                        var participantInfo = {}, me = { uid: User.me.id, name: User.me.name };
648
649                        var timezone = User.timezones[ (!!objEvent && !!objEvent.timezone) ? objEvent.timezone : User.preferences.timezone ];
650                       
651                    var dateEvent = function( time){
652                        return new Date( parseInt(time) ).setTimezoneOffset( User.timezones[ pref.timezone] ).toString( User.preferences.dateFormat); }
653
654                        var timeEvent = function(time){
655                                if(time){
656                                        var data =  new Date();
657                                        data.setTime(time);
658                                        data = getDateTimezone(data, timezone);
659                                        return dateFormat(data, User.preferences.hourFormat.replace(/m/g,'M'))                 
660                                }
661                        }
662                        if(!!objEvent)
663                    return {
664                              "class": objEvent["class"],
665                              id: objEvent.id,
666                              location: objEvent.location,
667                              category: objEvent.category,
668                              calendars: Calendar.calendars,
669                              calendar: objEvent.calendar,
670                              summary: objEvent.summary,
671                              description: objEvent.description,
672                              timezone: objEvent.timezone,
673                              timezones: User.timezones,
674                              startDate: dateEvent( objEvent.startTime ),
675                              startHour: timeEvent(objEvent.startTime ),
676                              endDate: dateEvent( objEvent.endTime ),
677                              endHour: timeEvent(objEvent.endTime),
678                              allDay: !!parseInt( objEvent.allDay ),
679          //                            attachments: this.decode( "attachment:detail", form ),
680                              attendee: $.map(objEvent.participants || [], function( participant ){
681
682                                          participant = DataLayer.get( "participant", participant );
683
684                                          var user = DataLayer.get( "user", participant.user.id || participant.user );
685
686                                          var person = { uid: user.id,
687                                                         name: user.name };
688
689                                          if( person.uid ===  me.uid )
690                                          {
691                                              participantInfo.status = participant.status;
692                                              participantInfo.alarms = participant.alarms;
693                                          }
694
695                                          if( parseInt( participant.isOrganizer ) )
696                                          {
697                                              participantInfo.organizer = person;
698                                                  return(null);
699                                          }
700
701                                          return( person );
702
703                                      }),
704                              organizer: participantInfo.organizer || me,
705                              alarms: participantInfo.alarms || [],
706                              status: participantInfo.status || 1,
707                              me: me
708                            };
709                });
710
711        if( !notArray )
712        {
713            var dates = {};
714
715            for (var i=0; i<res.length; i++) {
716
717                    var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
718                    var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
719
720                    var counter   = startDate.clone();
721
722                    while (counter.compareTo(startDate) == 0) {
723
724                            if (!dates[counter.toString(User.preferences.dateFormat)])
725                                dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
726                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
727                                dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
728
729                            dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]);
730                            counter.addDays(-1);
731                    }
732            }
733            res = { events_list: dates,
734                                count : res.length
735                        };
736        }
737
738        return notArray ? res[0] : res;
739    }
740
741});
742
743DataLayer.codec( "participant", "detail", {
744 
745    encoder: function( participants ){
746
747          var result = {};
748     
749          for( var i = 0; i< participants.length; i++ )
750          {
751              result[ participants[i].user.id || participants[i].user ] = participants[i];
752          }
753
754          return( result );
755    }
756});
757
758DataLayer.codec( "calendar", "list", {
759 
760    encoder: function( calendars ){
761
762        var result = { my_calendars: [], others_calendars: [] };
763
764        for( var i = 0; i < calendars.length; i++ )
765        {
766            if( Calendar.signatureOf[ calendars[i].id ].isOwner )
767                result.my_calendars.push( calendars[i] );
768            else
769                result.others_calendars.push( calendars[i] );
770        }
771
772        return { agendas_usuario: result };
773
774    }
775
776});
777
778DataLayer.codec( "schedulable", "calendar", {
779
780    decoder:function( evtObj ){
781       
782        if( notArray = $.type(evtObj) !== "array" )
783            evtObj = [ evtObj ];
784       
785        var res = $.map(evtObj, function( evt ){
786
787                    return { id: evt.id,
788                             summary: evt.title,
789                             startTime: evt.start.getTime(),
790                             endTime: ( !!evt.allDay ? (( evt.end || evt.start ).getTime() + 86400000) :( evt.end || evt.start ).getTime()),
791                             allDay: ( !!evt.allDay ? 1 : 0 )
792                             /*calendar: evt.id && User.calendarOf[ evt.id ].id*/ };
793        });
794
795        return notArray ? res[0] : res;
796    },
797
798    encoder: function( evtObj, filter ){
799     
800        if( !evtObj )
801            return( false );
802
803//       if( notArray = $.type(evtObj) !== "array" )
804//        evtObj = [ evtObj ];
805//      alert( evtObj );
806        var filtered = evtObj;
807       
808        // repeat:{
809//        frequency: "weekly",
810//        endTime: Date.parse("+10 days").getTime(),
811//        interval: 3,
812//        byday: 3,
813//        bysecond: 3,
814//        byminute: 3,
815//        bymonthday: 3,
816//        byyearday: 3,
817//        byweekno: 3,
818//        bysetpos: 3,
819//        wkst: "monday"/*,
820//        duration: true*/
821//       }
822
823//      $.each(evtObj, function( index, evt ){
824
825//              alert( dump(!!evt.repeat) );
826
827//              if( evt && !!evt.repeat && (evt.startTime < filter.end || (evt.repeat.endTime || 0) > filter.start ) )
828//              {
829// //               var interval = evt.repeat.interval;
830//
831//                  var current = new Date( evt.startTime );
832//                  var begin = new Date( filter.start );
833//                  var end = new Date( filter.end );
834//                  var offset = evt.endTime - evt.startTime;
835//
836//                  var ocurrence = [];
837//
838//                  while( Date.compare( current, begin ) !== 1 )
839//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
840//
841//                  while( current.before( end ) && (ocurrence[ ocurrence.length ] = current) )
842//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
843//
844//                  for( var i = 0; i < ocurrences.length; i++ )
845//                      filtered[ filtered.length ] = { URI: evt.URI,
846//                                                      summary: evt.summary,
847//                                                      start: new Date( ocurrences[i] ),
848//                                                      end: new Date( ocurrences[i] + offset ),
849//                                                      allDay: evt.allDay };
850//
851// //               switch( evt.repeat.frequency )
852// //               {
853// //                 case "yearly":   interval *= 12;
854// //                 case "monthly":  interval *= 30; //TODO: get the month variant
855// //                 case "weekly":   interval *= 7;
856// //                 case "daily":    interval *= 24;
857// //                 case "hourly":   interval *= 60;
858// //                 case "minutely": interval *= 60;
859// //                 case "secondly": interval *= 1000;
860// //               }
861// //             
862// //               var rest = ( filter.start - evt.startTime ) % interval;
863// //
864// //               var offset = evt.endTime - evt.startTime;
865// //
866// //               if( rest < offset )
867// //               {
868// //                   var freq = Math.floor( offset - rest / interval );
869// //
870// //                   
871// //
872// //                   for( var i = 0; i < freq; i++ )
873// //                   {
874// //                        var ocurrence = filter.start + rest + ( interval * i );
875// //
876// //                       
877// //                   }
878// //
879// //                   
880// //               }
881//              }
882
883//              if( parseInt( evt.endTime ) > filter[1][0][2] || parseInt( evt.startTime ) < filter[1][1][2] )
884//                  filtered[ filtered.length ] = evt;
885//
886//      });
887
888        var grouped = {};
889
890        $.map(filtered, function( evt ){
891
892                evt.calendar = evt.calendar || "1";
893
894                if( !grouped[ evt.calendar ] )
895                    grouped[ evt.calendar ] = [];
896                       
897                var calendar = DataLayer.get('calendar', evt.calendar);
898               
899                var timesEvent = function(time, timezone){
900                        return getDateTimezone(time, User.timezones[timezone], false )
901                };
902         
903                grouped[ evt.calendar ].push( { id: evt.URI || evt.id,
904                                                title: Encoder.htmlDecode(evt.summary),
905                                                start: timesEvent(new Date( parseInt( evt.startTime )), calendar.timezone),
906                                                end: !!parseInt(evt.allDay) ? timesEvent(new Date( (parseInt( evt.endTime ) - 86400000) )) : timesEvent(new Date( parseInt( evt.endTime ) ), calendar.timezone),
907                                                allDay: !!parseInt( evt.allDay ) } );
908        });
909
910        return(/* notArray ? filtered[0] :*/ grouped );
911    },
912   
913    criteria: function( filter ){
914     
915        if( $.type(filter.start) !== 'date' )
916            filter.start = new Date( filter.start * 1000 );
917        if( $.type(filter.end) !== 'date' )
918            filter.end = new Date( filter.end * 1000 );
919
920        return { filter: ["AND",
921
922                            [ ">=", "rangeStart", filter.start.toString( "dd-MM-yyyy" ) ],
923                            [ "<=", "rangeEnd", filter.end.toString( "dd-MM-yyyy" ) ],
924                            [ "IN", "calendar", Calendar.calendarIds ]
925
926                          ],
927                 criteria: { deepness: 2 } }
928    }
929});
930
931
932DataLayer.codec( "preference", "detail", {
933 
934  decoder:function( pref ){
935       
936        var res = [];
937
938      pref.defaultAlarm = $.map( pref.alarmTime || [], function( alarmTime, i ){
939             
940            return { type: pref.alarmType[i],
941                     time: alarmTime,
942                     unit: pref.alarmUnit[i] };
943       
944      });
945
946      $.each( pref, function( i, el ){
947       
948          res[ res.length ] = { name: i, value: el };
949       
950      });
951   
952      return( res );
953     
954  },
955
956  encoder:function( pref ){
957
958      return( pref );
959
960  }
961
962});
963
964DataLayer.codec( "schedulable", "export", {
965 
966      decoder: function(){
967
968         
969
970      },
971     
972      encoder: function( signatures ){
973
974         
975
976      },
977     
978      criteria: function( filter ){
979       
980          if( isCal  = filter && filter.calendar )
981              filter = filter.calendar;
982
983            return {
984
985                      filter: filter ? [  "=", ( isCal ? "calendar" : "id" ), filter ] : false,
986
987                      criteria: { format: 'iCal', deepness: 2 }
988            };
989      }
990
991
992});
993
994Alarms.load();
995
996// DataLayer.decoder( "participant", "detail", function( form ){
997// 
998// //     if( $.type( attObj ) !== "array" ){
999// //   notArray = true;
1000// //   attObj = [ attObj ];
1001// //     }
1002//
1003//     
1004//
1005//     return( participants );
1006//
1007// });
1008
1009// DataLayer.decoder( "alarm", "detail", function( form ){
1010//
1011// //       if( $.type( attObj ) !== "array" ){
1012// //       notArray = true;
1013// //       attObj = [ attObj ];
1014// //     }
1015//
1016//     var alarms = [];
1017//
1018//     if( form.alarmType /*&& !form.*/ )
1019//      for( var i = 0; i < form.alarmType.length; i++ )
1020//      {
1021//          if( form.alarmTime[i] === "" )
1022//              continue;
1023//       
1024//          alarms[i] = { type: form.alarmType[i],
1025//                        unit: form.alarmUnit[i],
1026//                        time: form.alarmTime[i] };
1027//      }
1028//
1029//     return( alarms );
1030//
1031// });
1032
Note: See TracBrowser for help on using the repository browser.