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

Revision 5514, 28.1 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Implementacao anexos, acls e delegacao de participantes

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