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

Revision 5365, 28.5 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Malhoria no tratamento de duplicacao de participantes

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