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

Revision 5341, 29.2 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2434 - Commit inicial do novo módulo de agenda do Expresso - expressoCalendar

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", "participant", "alarm"/*, "calendar", "calendarSignature"*/ ] );
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 res = $.map(evtObj, function( objEvent ){                   
440                   
441                        var existsTimezone = false;
442                        var participantInfo = {}, me = { uid: User.me.id, name: User.me.name };
443                        var timezone = '';
444                        if(objEvent.timezone){
445                                timezone = User.timezones[objEvent.timezone];
446                                existsTimezone = true;
447                        }else{
448                                var tzId = pref.timezone;
449                                timezone = User.timezones[ tzId ];
450                        }
451                       
452                    var dateEvent = function( time, allDayEnd){
453                       
454                        return new Date( parseInt(time) - ((allDayEnd) ? 86400000 : 0)  ).setTimezoneOffset(timezone).toString( User.preferences.dateFormat); }
455
456                        var timeEvent = function(time, idCalendar){
457                                var data =  new Date();
458                                data.setTime(time);
459                                return dateFormat(setDateTimezone(data, timezone, existsTimezone, idCalendar), User.preferences.hourFormat.replace(/m/g,'M'))                   
460                        }       
461                        var temp = [];
462                       
463                        var typeAlarm = function(obj){
464                                for(var i = 0; i < obj.length; i++){
465                                        if(obj[i].type == "1"){
466                                                obj[i].type = 'alert';
467                                        }else if(obj[i].type == "2"){
468                                                obj[i].type = 'mail';
469                                        }else{
470                                                obj[i].type = 'sms';
471                                        }
472                                }
473                                return obj;
474                        }
475                    return {
476                              "class": objEvent["class"],
477                              id: objEvent.id,
478                              location: objEvent.location,
479                              category: objEvent.category,
480                              calendars: Calendar.calendars,
481                              calendar: objEvent.calendar,
482                              summary: objEvent.summary,
483                              description: objEvent.description,
484                              timezone: objEvent.timezone,
485                              timezones: User.timezones,
486                              startDate: dateEvent( objEvent.startTime, false ),
487                              startHour: timeEvent(objEvent.startTime, objEvent.calendar ),
488                              endDate: dateEvent( objEvent.endTime, (!!parseInt(objEvent.allDay)) ? true : false ),
489                              endHour: timeEvent(objEvent.endTime, objEvent.calendar),
490                              allDay: !!parseInt( objEvent.allDay ),
491          //                            attachments: this.decode( "attachment:detail", form ),
492                              attendee: $.map(objEvent.participants || [], function( participant ){
493                                if(participant.indexOf('java') >= 0)
494                                        return (null);
495                                if(temp[participant])
496                                        return (null);
497                                temp[participant] = true;       
498                                       
499                                                participant = DataLayer.get( "participant", participant);
500                                       
501                                        statusParticipants[participant.status]++;
502                                        var user = DataLayer.get( "user", participant.user.id || participant.user );
503                                        var getIdUser = function(user){
504                                                if(user.owner)
505                                                        return 'external:'+user.id;
506                                                else if(user.id == User.me.id)
507                                                        return user.id;
508                                                else return 'internal:'+user.id;
509                                        };     
510                                         
511                                          var person = { uid: getIdUser(user),
512                                                         name: user.name,
513                                                                 mail: user.mail
514                                                                };
515
516                                          if( person.uid ===  me.uid )
517                                          {
518                                              participantInfo.status = participant.status;
519                                              participantInfo.alarms = typeAlarm(objEvent.alarms);
520                                          }
521                                          if( parseInt( participant.isOrganizer ) )
522                                          {
523                                              participantInfo.organizer = person;
524                                              return( null );
525                                          }
526
527                                          return( person );
528
529                                      }),
530                              organizer: participantInfo.organizer || me,
531                              alarms: participantInfo.alarms || [],
532                              status: participantInfo.status || 1,
533                              me: me
534                            };
535                });
536        res[0].isOrganizer = res[0].organizer.uid == User.me.id ? 1 : 0;
537        res[0].statusParticipants = statusObject(statusParticipants);
538        if( !notArray )
539        {
540            var dates = {};
541
542            for (var i=0; i<res.length; i++) {
543
544                    var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
545                    var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
546
547                    var counter   = startDate.clone();
548
549                    while (counter.compareTo(startDate) == 0) {
550
551                            if (!dates[counter.toString(User.preferences.dateFormat)])
552                                dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
553                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
554                                dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
555
556                            dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]);
557                            counter.addDays(-1);
558                    }
559            }
560
561            res = { events_list: dates };
562        }
563
564        return notArray ? res[0] : res;
565    }
566});
567
568
569
570DataLayer.codec( "schedulable", "detail", {
571
572    decoder: function( evtObj ){
573
574        Encoder.EncodeType = "entity";
575       
576        if( notArray = $.type(evtObj) !== "array" )
577                evtObj = [ evtObj ];
578
579        var pref = User.preferences;
580
581        var res = $.map(evtObj, function( form ){
582                        var tzId = '';
583                    if(form.timezone == ''){
584                                calendar = DataLayer.get('calendar', form.calendar);
585                                tzId = calendar.timezone || User.preferences.timezone;
586                        }else
587                                tzId = form.timezone;
588                    timezone = User.timezones[ tzId ];
589
590                    opposites = { '-':'+', '+':'-' },
591
592                    formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat;
593                       
594                    participants = [];
595
596                    if( form.idEvent )
597                        participants = DataLayer.get( "participant:detail", [ "=", "schedulable", form.idEvent ] );
598                       
599                        var spaces = function(hours){
600                                return hours.replace(/\s$/, "");
601                        };
602                       
603                        var startDate = Date.parseExact( !!form.allDay ? form.startDate+ " 00:00": form.startDate + " " + spaces(form.startHour) , formatString );
604                        startDate = getDateUTC(startDate, timezone);
605                       
606                        var endDate = Date.parseExact( !!form.allDay ? form.endDate + " 00:00": form.endDate + " " + spaces(form.endHour), formatString );
607                        endDate = getDateUTC(endDate, timezone);
608                    return {
609                              "class": form["class"],
610                                  startTime: startDate.getTime(),
611                                  endTime: !!form.allDay ? (new Date(endDate.getTime() + (86400000)).getTime()) : endDate.getTime(),
612                                  allDay: ( !!form.allDay ? 1 : 0 ),
613                              id: form.idEvent,
614                              location: form.location,
615                              category: form.category,
616                              calendar: form.calendar,
617                              summary: form.summary,
618                              description: form.description,
619                              timezone: tzId,
620                              participants: $.map( form.attendee || [], function( attendee, i ){
621
622                                        if( !attendee || attendee === "" )
623                                        return( null );
624
625                                                var participant = {};
626                                                var isCurrentParticipant = function(user, event){
627                                                        var participant =  DataLayer.get('participant', ['AND',['=', 'user', user],['=', 'schedulable', event]]);
628                                                        if(participant != '')
629                                                                return participant[0].id;
630                                                        else
631                                                                return false;
632                                                }; 
633                                               
634                                                if((attendee.indexOf('internal') >= 0) || (attendee.indexOf('external') >= 0)){
635                                                        participant.user = attendee.replace(/[a-z:]/g, ""),
636                                                        participant.isOrganizer = ( !i ? 1 : 0 );
637                                                        if(attendee.indexOf('external') >= 0)
638                                                                participant.isExternal = 1;
639                                                        var id = '';
640                                                        if(participant.user == User.me.id)
641                                                                participant.status = form.status;
642                                                        if((form.idEvent) && (id = isCurrentParticipant(participant.user, form.idEvent)))
643                                                                participant.id = id;
644                                                                return participant;
645                                                }else if(attendee.indexOf('java') >= 0){                 
646                                                        participant.user = attendee;
647                                                        participant.isOrganizer = ( !i ? 1 : 0 );
648                                                        participant.isExternal= 1;
649                                                }else{ 
650                                                        participant.user = attendee;
651                                                        participant.isOrganizer = ( !i ? 1 : 0 );
652                                                }
653                                             
654                                                if( attendee === User.me.id ){
655                                                        var obj = form.alarmTime ? form : pref;
656                                                        participant.alarms = $.map( obj.alarmTime || [], function( alarmTime, i ){
657
658                                                                if( alarmTime === "" )
659                                                                        return( null );
660
661                                                               
662                                                                if(obj.alarmId[i] === "")
663                                                                        return { type: obj.alarmType[i],unit: obj.alarmUnit[i], time: obj.alarmTime[i] };
664                                                                else
665                                                                        return { type: obj.alarmType[i], unit: obj.alarmUnit[i], time: obj.alarmTime[i], id: obj.alarmId[i] };
666                                                        });
667                                                       
668                                                        if( participants[ attendee ] ){
669                                                                participant.id = participants[ attendee ].id;
670                                                        }
671                                                        participant.status = form.status;
672                                            }
673
674                                              return( participant );
675                                          })
676                            };
677                    });
678
679        return notArray ? res[0] : res;
680    },
681
682    encoder: function( evtObj ){
683
684        var notArray = false;
685     
686        if( notArray = $.type(evtObj) !== "array" )
687            evtObj = [ evtObj ];
688
689        var pref = User.preferences;
690
691        var res = $.map(evtObj, function( objEvent ){                   
692                   
693                        var participantInfo = {}, me = { uid: User.me.id, name: User.me.name };
694
695                        var timezone = User.timezones[ (!!objEvent && !!objEvent.timezone) ? objEvent.timezone : User.preferences.timezone ];
696                       
697                    var dateEvent = function( time){
698                        return new Date( parseInt(time) ).setTimezoneOffset( User.timezones[ pref.timezone] ).toString( User.preferences.dateFormat); }
699
700                        var timeEvent = function(time){
701                                if(time){
702                                        var data =  new Date();
703                                        data.setTime(time);
704                                        data = getDateTimezone(data, timezone);
705                                        return dateFormat(data, User.preferences.hourFormat.replace(/m/g,'M'))                 
706                                }
707                        }
708                        if(!!objEvent)
709                    return {
710                              "class": objEvent["class"],
711                              id: objEvent.id,
712                              location: objEvent.location,
713                              category: objEvent.category,
714                              calendars: Calendar.calendars,
715                              calendar: objEvent.calendar,
716                              summary: objEvent.summary,
717                              description: objEvent.description,
718                              timezone: objEvent.timezone,
719                              timezones: User.timezones,
720                              startDate: dateEvent( objEvent.startTime ),
721                              startHour: timeEvent(objEvent.startTime ),
722                              endDate: dateEvent( objEvent.endTime ),
723                              endHour: timeEvent(objEvent.endTime),
724                              allDay: !!parseInt( objEvent.allDay ),
725          //                            attachments: this.decode( "attachment:detail", form ),
726                              attendee: $.map(objEvent.participants || [], function( participant ){
727
728                                          participant = DataLayer.get( "participant", participant );
729
730                                          var user = DataLayer.get( "user", participant.user.id || participant.user );
731
732                                          var person = { uid: user.id,
733                                                         name: user.name };
734
735                                          if( person.uid ===  me.uid )
736                                          {
737                                              participantInfo.status = participant.status;
738                                              participantInfo.alarms = participant.alarms;
739                                          }
740
741                                          if( parseInt( participant.isOrganizer ) )
742                                          {
743                                              participantInfo.organizer = person;
744                                              return( null );
745                                          }
746
747                                          return( person );
748
749                                      }),
750                              organizer: participantInfo.organizer || me,
751                              alarms: participantInfo.alarms || [],
752                              status: participantInfo.status || 1,
753                              me: me
754                            };
755                });
756
757        if( !notArray )
758        {
759            var dates = {};
760
761            for (var i=0; i<res.length; i++) {
762
763                    var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
764                    var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
765
766                    var counter   = startDate.clone();
767
768                    while (counter.compareTo(startDate) == 0) {
769
770                            if (!dates[counter.toString(User.preferences.dateFormat)])
771                                dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
772                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
773                                dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
774
775                            dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]);
776                            counter.addDays(-1);
777                    }
778            }
779            res = { events_list: dates,
780                                count : res.length
781                        };
782        }
783
784        return notArray ? res[0] : res;
785    }
786
787});
788
789DataLayer.codec( "participant", "detail", {
790 
791    encoder: function( participants ){
792
793          var result = {};
794     
795          for( var i = 0; i< participants.length; i++ )
796          {
797              result[ participants[i].user.id || participants[i].user ] = participants[i];
798          }
799
800          return( result );
801    }
802});
803
804DataLayer.codec( "calendar", "list", {
805 
806    encoder: function( calendars ){
807
808        var result = { my_calendars: [], others_calendars: [] };
809
810        for( var i = 0; i < calendars.length; i++ )
811        {
812            if( Calendar.signatureOf[ calendars[i].id ].isOwner )
813                result.my_calendars.push( calendars[i] );
814            else
815                result.others_calendars.push( calendars[i] );
816        }
817
818        return { agendas_usuario: result };
819
820    }
821
822});
823
824DataLayer.codec( "schedulable", "calendar", {
825
826    decoder:function( evtObj ){
827       
828        if( notArray = $.type(evtObj) !== "array" )
829            evtObj = [ evtObj ];
830       
831        var res = $.map(evtObj, function( evt ){
832
833                    return { id: evt.id,
834                             summary: evt.title,
835                             startTime: evt.start.getTime(),
836                             endTime: ( !!evt.allDay ? (( evt.end || evt.start ).getTime() + 86400000) :( evt.end || evt.start ).getTime()),
837                             allDay: ( !!evt.allDay ? 1 : 0 )
838                             /*calendar: evt.id && User.calendarOf[ evt.id ].id*/ };
839        });
840
841        return notArray ? res[0] : res;
842    },
843
844    encoder: function( evtObj, filter ){
845     
846        if( !evtObj )
847            return( false );
848
849//       if( notArray = $.type(evtObj) !== "array" )
850//        evtObj = [ evtObj ];
851//      alert( evtObj );
852        var filtered = evtObj;
853       
854        // repeat:{
855//        frequency: "weekly",
856//        endTime: Date.parse("+10 days").getTime(),
857//        interval: 3,
858//        byday: 3,
859//        bysecond: 3,
860//        byminute: 3,
861//        bymonthday: 3,
862//        byyearday: 3,
863//        byweekno: 3,
864//        bysetpos: 3,
865//        wkst: "monday"/*,
866//        duration: true*/
867//       }
868
869//      $.each(evtObj, function( index, evt ){
870
871//              alert( dump(!!evt.repeat) );
872
873//              if( evt && !!evt.repeat && (evt.startTime < filter.end || (evt.repeat.endTime || 0) > filter.start ) )
874//              {
875// //               var interval = evt.repeat.interval;
876//
877//                  var current = new Date( evt.startTime );
878//                  var begin = new Date( filter.start );
879//                  var end = new Date( filter.end );
880//                  var offset = evt.endTime - evt.startTime;
881//
882//                  var ocurrence = [];
883//
884//                  while( Date.compare( current, begin ) !== 1 )
885//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
886//
887//                  while( current.before( end ) && (ocurrence[ ocurrence.length ] = current) )
888//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
889//
890//                  for( var i = 0; i < ocurrences.length; i++ )
891//                      filtered[ filtered.length ] = { URI: evt.URI,
892//                                                      summary: evt.summary,
893//                                                      start: new Date( ocurrences[i] ),
894//                                                      end: new Date( ocurrences[i] + offset ),
895//                                                      allDay: evt.allDay };
896//
897// //               switch( evt.repeat.frequency )
898// //               {
899// //                 case "yearly":   interval *= 12;
900// //                 case "monthly":  interval *= 30; //TODO: get the month variant
901// //                 case "weekly":   interval *= 7;
902// //                 case "daily":    interval *= 24;
903// //                 case "hourly":   interval *= 60;
904// //                 case "minutely": interval *= 60;
905// //                 case "secondly": interval *= 1000;
906// //               }
907// //             
908// //               var rest = ( filter.start - evt.startTime ) % interval;
909// //
910// //               var offset = evt.endTime - evt.startTime;
911// //
912// //               if( rest < offset )
913// //               {
914// //                   var freq = Math.floor( offset - rest / interval );
915// //
916// //                   
917// //
918// //                   for( var i = 0; i < freq; i++ )
919// //                   {
920// //                        var ocurrence = filter.start + rest + ( interval * i );
921// //
922// //                       
923// //                   }
924// //
925// //                   
926// //               }
927//              }
928
929//              if( parseInt( evt.endTime ) > filter[1][0][2] || parseInt( evt.startTime ) < filter[1][1][2] )
930//                  filtered[ filtered.length ] = evt;
931//
932//      });
933
934        var grouped = {};
935
936        $.map(filtered, function( evt ){
937
938                evt.calendar = evt.calendar || "1";
939
940                if( !grouped[ evt.calendar ] )
941                    grouped[ evt.calendar ] = [];
942                       
943                var calendar = DataLayer.get('calendar', evt.calendar);
944               
945                var timesEvent = function(time, timezone){
946                        return getDateTimezone(time, User.timezones[timezone], false )
947                };
948         
949                grouped[ evt.calendar ].push( { id: evt.URI || evt.id,
950                                                title: Encoder.htmlDecode(evt.summary),
951                                                start: timesEvent(new Date( parseInt( evt.startTime )), calendar.timezone),
952                                                end: !!parseInt(evt.allDay) ? timesEvent(new Date( (parseInt( evt.endTime ) - 86400000) )) : timesEvent(new Date( parseInt( evt.endTime ) ), calendar.timezone),
953                                                allDay: !!parseInt( evt.allDay ) } );
954        });
955
956        return(/* notArray ? filtered[0] :*/ grouped );
957    },
958   
959    criteria: function( filter ){
960     
961        if( $.type(filter.start) !== 'date' )
962            filter.start = new Date( filter.start * 1000 );
963        if( $.type(filter.end) !== 'date' )
964            filter.end = new Date( filter.end * 1000 );
965
966        return { filter: ["AND",
967
968                            [ ">=", "rangeStart", filter.start.toString( "dd-MM-yyyy" ) ],
969                            [ "<=", "rangeEnd", filter.end.toString( "dd-MM-yyyy" ) ],
970                            [ "IN", "calendar", Calendar.calendarIds ]
971
972                          ],
973                 criteria: { deepness: 2 } }
974    }
975});
976
977
978DataLayer.codec( "preference", "detail", {
979 
980  decoder:function( pref ){
981       
982        var res = [];
983
984      pref.defaultAlarm = $.map( pref.alarmTime || [], function( alarmTime, i ){
985             
986            return { type: pref.alarmType[i],
987                     time: alarmTime,
988                     unit: pref.alarmUnit[i] };
989       
990      });
991
992      $.each( pref, function( i, el ){
993       
994          res[ res.length ] = { name: i, value: el };
995       
996      });
997   
998      return( res );
999     
1000  },
1001
1002  encoder:function( pref ){
1003
1004      return( pref );
1005
1006  }
1007
1008});
1009
1010DataLayer.codec( "schedulable", "export", {
1011 
1012      decoder: function(){
1013
1014         
1015
1016      },
1017     
1018      encoder: function( signatures ){
1019
1020         
1021
1022      },
1023     
1024      criteria: function( filter ){
1025       
1026          if( isCal  = filter && filter.calendar )
1027              filter = filter.calendar;
1028
1029            return {
1030
1031                      filter: filter ? [  "=", ( isCal ? "calendar" : "id" ), filter ] : false,
1032
1033                      criteria: { format: 'iCal', deepness: 2 }
1034            };
1035      }
1036
1037
1038});
1039
1040Alarms.load();
1041
1042// DataLayer.decoder( "participant", "detail", function( form ){
1043// 
1044// //     if( $.type( attObj ) !== "array" ){
1045// //   notArray = true;
1046// //   attObj = [ attObj ];
1047// //     }
1048//
1049//     
1050//
1051//     return( participants );
1052//
1053// });
1054
1055// DataLayer.decoder( "alarm", "detail", function( form ){
1056//
1057// //       if( $.type( attObj ) !== "array" ){
1058// //       notArray = true;
1059// //       attObj = [ attObj ];
1060// //     }
1061//
1062//     var alarms = [];
1063//
1064//     if( form.alarmType /*&& !form.*/ )
1065//      for( var i = 0; i < form.alarmType.length; i++ )
1066//      {
1067//          if( form.alarmTime[i] === "" )
1068//              continue;
1069//       
1070//          alarms[i] = { type: form.alarmType[i],
1071//                        unit: form.alarmUnit[i],
1072//                        time: form.alarmTime[i] };
1073//      }
1074//
1075//     return( alarms );
1076//
1077// });
1078
Note: See TracBrowser for help on using the repository browser.