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

Revision 5384, 28.4 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Melhorias e correcoes de bugs na nova agenda

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