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

Revision 5617, 31.8 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Adicionado no setup da expressoCalendar as atualizacoes ao banco

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