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

Revision 5529, 28.2 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correcoes de bugs e atualizicao do fullcalendar

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