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

Revision 5652, 31.9 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correcao na criacao e exibicao de alarmes

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((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') == 0){
266                                Calendar.rerenderView(true);
267                                contentMenu();
268                        }else if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') != 0)
269                                pageselectCallback($('.events-list-win.active [name=keyword]').val(), 0);
270                });
271    }
272});
273
274DataLayer.listen( "calendarToSchedulable", function( status, updateData){
275 
276    if( status === 'client' ){
277                if(updateData && isValidCalback){
278                        isValidCalback = false;
279                        $.Zebra_Dialog('Evento(s) importados com sucesso!', {
280                                'overlay_opacity': '0.5',
281                                'onClose':  function(clicked) {                         
282                                        Calendar.rerenderView();
283                                }
284                        });
285                }else if(updateData == false){
286                        $.Zebra_Dialog('Erro ao importar evento(s)!', {
287                                'overlay_opacity': '0.5'       
288                        });
289                }
290    }; 
291});
292
293//TODO - Voltar quando tratado put de varios items de um mesmo conceito,
294/*
295DataLayer.listen( "calendarSignature", function( status ){
296
297    switch( status ){
298                case 'serverclient':  DataLayer.commit( false, false, function( received ){
299                        delete Calendar.currentViewKey;
300                        Calendar.load();
301                        refresh_calendars();
302                });
303                break;
304                case 'client': 
305                break;
306    }
307});
308*/
309
310DataLayer.listen( "modulePreference", function( status ){
311
312    switch( status ){
313                case 'serverclient':  DataLayer.commit( false, false, function(){
314                        User.load();
315                });
316                break;
317                case 'client': 
318                break;
319    }
320
321});
322
323DataLayer.listen( "alarm", function( created, updated, deleted ){
324
325});
326
327/*DataLayer.listen( "calendar", function( status, updateData ){
328
329    if (updateData === false)
330        switch( status ){
331                case 'serverclient':  DataLayer.commit( false, false, function(){
332           
333                        Calendar.load();
334                        refresh_calendars();
335           
336                });
337                break;
338                case 'client': 
339                break;
340    }
341});*/
342
343DataLayer.codec( "calendarSignature", "configure", {
344        decoder: function( evtObj ){
345                Encoder.EncodeType = "entity";
346               
347                if( notArray = $.type(evtObj) !== "array" )
348                        evtObj = [ evtObj ];
349               
350                var res = $.map(evtObj, function( form ){
351                        return{
352                                id: form.signature,
353                                user: User.me.id,       
354                                calendar: {
355                                        id: Calendar.calendarOf[form.signature].id,
356                                        name: Encoder.htmlEncode(form.name),
357                                        description: Encoder.htmlEncode(form.description),
358                                        timezone: form.timezone,
359                                        defaultDuration: form.duration != "" ? form.duration : 30,
360                                        location: form.location
361                                },
362                        //      isOwner: 1,
363                                fontColor: Encoder.htmlEncode(form.fontColor.substring(1)),
364                                backgroundColor: Encoder.htmlEncode(form.backgroundColor.substring(1)),
365                                borderColor: Encoder.htmlEncode(form.borderColor.substring(1)),
366                                msgAdd: Encoder.htmlEncode(form.msgAdd),
367                                msgCancel: Encoder.htmlEncode(form.msgCancel),
368                                msgUpdate: Encoder.htmlEncode(form.msgUpdate),
369                                msgReply: Encoder.htmlEncode(form.msgReply),
370                                msgAlarm: Encoder.htmlEncode(form.msgAlarm),
371                                calendarSignatureAlarms: $.map( form.alarmTime || [], function( alarmTime, i ){
372                                        return (!!form.alarmId[i] ?
373                                                        {type: form.alarmType[i],       unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i]} :
374                                                        {type: form.alarmType[i],       unit: form.alarmUnit[i], time: form.alarmTime[i]});
375                                })
376                        };
377               
378                });
379       
380        return notArray ? res[0] : res;
381        },
382
383    encoder: function( evtObj ){}
384});
385
386DataLayer.codec( "alarm", "schedulable", {
387
388    decoder: function( evtObj ){},
389       
390        encoder: function (evtObjt){
391       
392                        if(notArray = typeof(evtObjt) == 'array' )
393                                evtObjt = [evtObjt];
394                       
395                        var res = $.map(evtObjt, function( objEvent ){ 
396
397                                var time = parseInt(objEvent.schedulable.startTime);
398                                                                                       
399                                return{
400                                        id: objEvent.id,
401                                        event_start: new Date( time ).setTimezoneOffset(Timezone.timezones[objEvent.schedulable.timezone]).toString( User.preferences.dateFormat),
402                                        sendTime: objEvent.sendTime,
403                                        schedulable: {
404                                                startTime: dateCalendar.formatDate(Timezone.getDateEvent(new Date(time), objEvent.schedulable.timezone, objEvent.schedulable.DayLigth, 'startTime'), User.preferences.hourFormat),
405                                                id: objEvent.schedulable.id,
406                                                summary: objEvent.schedulable.summary,
407                                                time: objEvent.time,   
408                                                unit: dateCalendar.timeunit[objEvent.unit.toLowerCase()] + ( parseInt(objEvent.time) > 1 ? 's' : '' )
409                                        }
410                                }
411                        });
412                return notArray ? res[0] : res;
413        }
414});
415
416DataLayer.codec( "suggestion", "duration", {
417
418    decoder: function( evtObj ){
419                if( notArray = $.type(evtObj) !== "array" )
420                        evtObj = [ evtObj ];
421
422
423
424                var meAttendee = function(attendees){
425                        for(var i = 0; i < attendees.length; i++)
426                                if(DataLayer.get('participant', attendees[i]).user == User.me.id)
427                                        return attendee;
428                };
429
430                var res = $.map(evtObj, function( form ){       
431                        return {
432                                participant : meAttendee(form.attendee),
433                                startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'),
434                                endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'),
435                                allDay: ( !!form.allDay ? 1 : 0 ),
436                                schedulable: form.idEvent
437                        }
438                });     
439       
440
441        return notArray ? res[0] : res;
442        },
443       
444        encoder: function( evtObj ){}
445       
446});
447
448DataLayer.codec( "attachment", "detail", {
449 
450        decoder: function(evtObj){
451       
452                if( notArray = $.type(evtObj) !== "array" )
453                        evtObj = [ evtObj ];
454
455                var res = $.map(evtObj, function( form){
456                        return [$.map(form.files , function( files){
457                                        return { source: files };
458                                })];
459                });
460        return notArray ? res[0] : res;
461        },
462     
463        encoder: function(){}
464
465     
466});
467
468DataLayer.codec( "schedulable", "preview", {
469
470    decoder: function( evtObj ){
471                Encoder.EncodeType = "entity";
472       
473                if( notArray = $.type(evtObj) !== "array" )
474                        evtObj = [ evtObj ];
475
476                var pref = User.preferences;
477
478                var res = $.map(evtObj, function( form ){
479                       
480                        return {
481                                id: form.idEvent,
482                                calendar: form.calendar,
483                                participants : $.map(form.attendee, function( attendee, i ){
484                                        if(isNaN(attendee)){
485                                                return{
486                                                        id: attendee,
487                                                        acl: form.attendeeAcl[i],
488                                                        delegatedFrom: !!form.delegatedFrom[i] ? form.delegatedFrom[i] : 0,
489                                                        isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
490                                                        isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
491                                                        acl: form.attendeeAcl[i].replace('o', '')
492                                                };
493                                        }else{
494                                                if(DataLayer.get('participant', attendee).user == User.me.id){
495                                                        var me = {
496                                                                user: User.me.id,
497                                                                status: form.status,
498                                                                id: attendee,
499                                                                isOrganizer: 0,
500                                                                receiveNotification : (!!form.receiveNotification ? 1 : 0),
501                                                                alarms: typeof(form.alarmTime) != 'undefined' ?
502                                                                        $.map( form.alarmTime || [], function( alarmTime, i ){
503
504                                                                                if( alarmTime === "" )
505                                                                                        return( null );
506
507                                                                                return !!form.alarmId[i] ?
508                                                                                        { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] } :
509                                                                                        { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] };
510                                                                        }) : []
511                                                        };
512                                                       
513                                                        if(form.startDate){
514                                                                var tzId =  DataLayer.get('schedulable', form.idEvent).timezone || User.preferences.timezone,
515                                                                formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat;
516                                                               
517                                                                DataLayer.put('notification', {
518                                                                        participant: me.id,
519                                                                        type: 'suggestion',
520                                                                        startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'),
521                                                                        endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'),
522                                                                        allDay: ( !!form.allDay ? 1 : 0 ),
523                                                                        schedulable: form.idEvent
524                                                                });
525                                                       
526                                                        }
527                                                        return me;
528                                                }else return(null);
529                                        };
530                                })
531                        }
532                });
533                return notArray ? res[0] : res;
534    },
535
536    encoder: function( evtObj ){
537
538        var notArray = false;
539     
540        if( notArray = $.type(evtObj) !== "array" )
541            evtObj = [ evtObj ];
542
543        var statusParticipants = {},
544       
545        statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ];
546       
547        var delegateAttendee = {};
548       
549        for( var i = 0; i < statusLabels.length; i++ )
550                statusParticipants[ statusLabels[i] ] = 0;
551       
552        var res = $.map(evtObj, function( objEvent ){                   
553                   
554                        if(!(typeof(objEvent) == 'object'))
555                                return (null);
556                       
557                        var participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy(User.me);
558                       
559                        var constantAcl = function(acl){
560                                var returns = {};
561                                for (var i in constantsParticipant){
562                                        returns[constantsParticipant[i]] = acl.indexOf(i) >= 0 ? true : false
563                                }
564                                return returns;
565                        };
566                                               
567                    return {
568                            "class": objEvent["class"],
569                            id: objEvent.id,
570                            location: objEvent.location,
571                            category: objEvent.category,
572                            calendars: Calendar.calendars,
573                            calendar: objEvent.calendar,
574                            summary: objEvent.summary,
575                            description: objEvent.description,
576                            timezone: objEvent.timezone,
577                            timezones: Timezone.timezones,
578                            startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
579                            startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
580                            endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
581                            endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
582                            allDay: !!parseInt( objEvent.allDay ),
583                                attachments: $.map(objEvent.attachments || [], function( attachment, i ){
584                                        var attach = DataLayer.get('schedulableToAttachment', attachment, false);
585                                        attach.name = attach.name.length < 10 ?  attach.name : ( attach.name.substr(0, 6) + attach.name.substr( attach.name.length-4, attach.name.length));
586                                        attach.size = formatBytes(attach.size);
587                                        return attach;
588                                }),                                             
589                            attendee: $.map(objEvent.participants || [], function( participant, i ){                                           
590                                       
591                                        if(delegateAttendee[participant])
592                                                return(null);
593                                       
594                                        var attend = DataLayer.get('participant', participant);
595                                        attend.user = DataLayer.get('user', attend.user);
596                                       
597                                        statusParticipants[ statusLabels[attend.status] ]++;   
598                                       
599                                        if( attend.user.id ===  me.id ){
600                                            participantInfo.user = {
601                                                        id: attend.id,
602                                                        status : attend.status,
603                                                        delegatedFrom: attend.delegatedFrom,
604                                                        acl: attend.acl,
605                                                        receiveNotification : attend.receiveNotification,
606                                                        alarms : $.map(attend.alarms || [], function( alarm ){
607                                                                //TODO - Atualizar cach cliente em conceito aninhados de camada 2
608                                                                var alarmEvent = DataLayer.get('alarm', alarm)
609                                                                return !!alarmEvent ? alarmEvent: (null);
610                                                        })
611                                                };
612                                                me.id = attend.id;
613                                                return(null);
614                                        };
615                                       
616                                        var person = {
617                                                id: attend.id,
618                                                name: attend.user.name != 'false' ? attend.user.name : '',
619                                                mail: attend.user.mail,
620                                                status : attend.status,
621                                                isExternal: attend.isExternal,
622                                                acl: attend.acl,
623                                                delegatedFrom: attend.delegatedFrom
624                                        };
625                                       
626                                        if(!!parseInt(attend.delegatedFrom)){
627                                                delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person);
628                                                return(null);
629                                        }
630                                       
631                                        if( !!parseInt(attend.isOrganizer )){
632                                            participantInfo.organizer = DataLayer.copy(person);
633                                                return(null);
634                                        };                                     
635                                       
636                                        return (person);
637                                }),
638                            organizer: participantInfo.organizer || me,
639                            alarms: !!participantInfo.user ? participantInfo.user.alarms : [],
640                            status: !!participantInfo.user ? participantInfo.user.status : 1,
641                                acl: !!participantInfo.user ? constantAcl(participantInfo.user.acl) : constantAcl( 'rowi' ),
642                                isShared: !this.id ? false : (!!objEvent.calendar) && parseInt(Calendar.signatureOf[objEvent.calendar].isOwner) ? false : true,
643                            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}),
644                                delegatedFrom: delegatedFrom,
645                                statusParticipants: statusParticipants
646                        };
647                });     
648        return notArray ? res[0] : res;
649    }
650});
651
652
653
654DataLayer.codec( "schedulable", "detail", {
655
656    decoder: function( evtObj ){
657               
658        Encoder.EncodeType = "entity";
659       
660        if( notArray = $.type(evtObj) !== "array" )
661                evtObj = [ evtObj ];
662
663        var pref = User.preferences;
664
665        var res = $.map(evtObj, function( form ){
666   
667                    var tzId =  form.timezone || Calendar.signatureOf[form.calendar].calendar.timezone || User.preferences.timezone,
668
669                    formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat,
670                       
671                    participants = [];
672                    return {
673                              "class": form["class"],
674                                  startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'),
675                                  endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'),  //+ (!!form.allDay ? 86400000 : 0) ,
676                                  allDay: ( !!form.allDay ? 1 : 0 ),
677                              id: form.idEvent,
678                              location: form.location,
679                              category: form.category,
680                              calendar: form.calendar,
681                              summary: form.summary,
682                              description: form.description,
683                              timezone: tzId,
684                                  attachments: $.map(form.attachment || [], function( attachment, i ){
685                                                return {attachment: attachment}
686                                  }),
687                              participants: $.map( form.attendee || [], function( attendee, i ){
688
689                                                if( !attendee || attendee === "" )
690                                                        return( null );
691
692                                                var participant = {};
693                                                participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
694                                               
695                                                if( participant.user === User.me.id ){
696                                                        return DataLayer.merge({
697                                                                id: attendee,
698                                                                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
699                                                                acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', ''),
700                                                                alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){
701                                                                                if( alarmTime === "" )
702                                                                                        return( null );
703                                                                                 return !!form.alarmId[i] ? { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] }:
704                                                                                                                                        { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] };
705                                                                        }),
706                                                                status: !!form.status ? form.status : 3
707                                                                }, form.delegatedFrom[i] != '0' ? {delegatedFrom: form.delegatedFrom[i]} : {});                                                 
708                                                }else{
709                                                        return DataLayer.merge({
710                                                                id: attendee,
711                                                                acl: form.attendeeAcl[i],
712                                                                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
713                                                                isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
714                                                                acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', '')
715                                                        }, form.delegatedFrom[i] != '0' ? {delegatedFrom: form.delegatedFrom[i]} : {});
716                                                };
717                                          })
718                            };
719                    });
720
721        return notArray ? res[0] : res;
722    },
723
724    encoder: function( evtObj ){
725       
726        if(!(!!evtObj))
727                return undefined;
728
729        var notArray = false;
730     
731        if( notArray = $.type(evtObj) !== "array" )
732            evtObj = [ evtObj ];
733
734        var pref = User.preferences;
735
736        var res =  DataLayer.encode('schedulable:preview', evtObj);
737
738        if( !notArray ){
739            var dates = {};
740
741            for (var i=0; i < res.length; i++) {
742
743                    var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
744                    var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
745
746                    var counter   = startDate.clone();
747
748                    while (counter.compareTo(startDate) == 0) {
749
750                            if (!dates[counter.toString(User.preferences.dateFormat)])
751                                        dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
752                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
753                                        dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
754
755                            dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]);
756                            counter.addDays(-1);
757                    }
758            }
759            res = { events_list: dates,
760                                count : res.length
761                        };
762        }
763
764        return notArray ? res[0] : res;
765    }
766
767});
768
769DataLayer.codec( "participant", "detail", {
770 
771    encoder: function( participants ){
772
773                var result = {};
774                for( var i = 0; i< participants.length; i++ ){
775                        result[ participants[i].user.id || participants[i].user ] = participants[i];
776                }
777                return( result );
778    }
779});
780
781DataLayer.codec( "calendar", "list", {
782 
783    encoder: function( calendars ){
784
785                var result = { my_calendars: [], others_calendars: [] };
786
787                for( var i = 0; i < calendars.length; i++ )
788                {
789                        !!Calendar.signatureOf[ calendars[i].id ].isOwner ?
790                                result.my_calendars.push( calendars[i] ) :
791                                result.others_calendars.push( calendars[i] );
792                }
793
794                return { agendas_usuario: result };
795
796    }
797
798});
799
800DataLayer.codec( "schedulable", "calendar", {
801
802    decoder:function( evtObj ){
803       
804        if( notArray = $.type(evtObj) !== "array" )
805            evtObj = [ evtObj ];
806       
807        var res = $.map(evtObj, function( evt ){
808
809                    return { id: evt.id,
810                             summary: evt.title,
811                             startTime: evt.start.getTime(),
812                             endTime: ( !!evt.allDay ? (( evt.end || evt.start ).getTime() + 86400000) :( evt.end || evt.start ).getTime()),
813                             allDay: ( !!evt.allDay ? 1 : 0 )
814                             /*calendar: evt.id && User.calendarOf[ evt.id ].id*/ };
815        });
816
817        return notArray ? res[0] : res;
818    },
819
820    encoder: function( evtObj, filter ){
821     
822        if( !evtObj )
823            return( false );
824
825//       if( notArray = $.type(evtObj) !== "array" )
826//        evtObj = [ evtObj ];
827//      alert( evtObj );
828        var filtered = evtObj;
829       
830        // repeat:{
831//        frequency: "weekly",
832//        endTime: Date.parse("+10 days").getTime(),
833//        interval: 3,
834//        byday: 3,
835//        bysecond: 3,
836//        byminute: 3,
837//        bymonthday: 3,
838//        byyearday: 3,
839//        byweekno: 3,
840//        bysetpos: 3,
841//        wkst: "monday"/*,
842//        duration: true*/
843//       }
844
845//      $.each(evtObj, function( index, evt ){
846
847//              alert( dump(!!evt.repeat) );
848
849//              if( evt && !!evt.repeat && (evt.startTime < filter.end || (evt.repeat.endTime || 0) > filter.start ) )
850//              {
851// //               var interval = evt.repeat.interval;
852//
853//                  var current = new Date( evt.startTime );
854//                  var begin = new Date( filter.start );
855//                  var end = new Date( filter.end );
856//                  var offset = evt.endTime - evt.startTime;
857//
858//                  var ocurrence = [];
859//
860//                  while( Date.compare( current, begin ) !== 1 )
861//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
862//
863//                  while( current.before( end ) && (ocurrence[ ocurrence.length ] = current) )
864//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
865//
866//                  for( var i = 0; i < ocurrences.length; i++ )
867//                      filtered[ filtered.length ] = { URI: evt.URI,
868//                                                      summary: evt.summary,
869//                                                      start: new Date( ocurrences[i] ),
870//                                                      end: new Date( ocurrences[i] + offset ),
871//                                                      allDay: evt.allDay };
872//
873// //               switch( evt.repeat.frequency )
874// //               {
875// //                 case "yearly":   interval *= 12;
876// //                 case "monthly":  interval *= 30; //TODO: get the month variant
877// //                 case "weekly":   interval *= 7;
878// //                 case "daily":    interval *= 24;
879// //                 case "hourly":   interval *= 60;
880// //                 case "minutely": interval *= 60;
881// //                 case "secondly": interval *= 1000;
882// //               }
883// //             
884// //               var rest = ( filter.start - evt.startTime ) % interval;
885// //
886// //               var offset = evt.endTime - evt.startTime;
887// //
888// //               if( rest < offset )
889// //               {
890// //                   var freq = Math.floor( offset - rest / interval );
891// //
892// //                   
893// //
894// //                   for( var i = 0; i < freq; i++ )
895// //                   {
896// //                        var ocurrence = filter.start + rest + ( interval * i );
897// //
898// //                       
899// //                   }
900// //
901// //                   
902// //               }
903//              }
904
905//              if( parseInt( evt.endTime ) > filter[1][0][2] || parseInt( evt.startTime ) < filter[1][1][2] )
906//                  filtered[ filtered.length ] = evt;
907//
908//      });
909
910        var grouped = {};
911
912        $.map(filtered, function( evt ){
913               
914                if(!(typeof(evt) == 'object') || (evt.id.indexOf('java') >= 0))
915                        return (null);
916
917                evt.calendar = evt.calendar || "1";
918
919                if( !grouped[ evt.calendar ] )
920                    grouped[ evt.calendar ] = [];
921                       
922                var calendar = DataLayer.get('calendar', evt.calendar);
923               
924                var eventEditable = function(idEvent){
925                        if(Calendar.signatureOf[calendar.id].isOwner == "1"){
926                                var attendee = {};
927                                for(var i = 0; i < evt.participants.length; i++){
928                                        attendee = DataLayer.get('participant', evt.participants[i]);
929                                                if(attendee.user == User.me.id)
930                                                        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};
931                                }
932                                return {editable: false, className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent,  selectable: true};
933                        }
934                        else{
935                                var aclSignature = Calendar.signatureOf[calendar.id].permission;
936                               
937                                var mountClass =  function(acl){
938                                        var returns = ""
939                                        returns += acl['write'] ? "" :  'blocked-event-permision ';
940                                        returns += acl['busy'] ? 'fullcalendar-not-context-menu ' : (acl['read']  ?  'fullcalendar-context-menu ' : '');
941                                        returns += 'event-id-'+idEvent;
942                                        return returns;
943                                }                               
944                                return DataLayer.merge({
945                                        editable: aclSignature.acl['write'],
946                                        disableResizing : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true : false),
947                                        disableDragging  : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true: false),
948                                        className: mountClass(aclSignature.acl)
949                                }, aclSignature.acl['busy'] ? {title: 'Ocupado', selectable: false } : {selectable: true});
950                        }
951                       
952                }
953                 
954                grouped[ evt.calendar ].push( DataLayer.merge({ id: evt.URI || evt.id,
955                                                title: Encoder.htmlDecode(evt.summary),
956                                                start: Timezone.getDateCalendar(new Date(parseInt( evt.startTime )), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving),
957                                                end:   Timezone.getDateCalendar(new Date(parseInt( evt.endTime ) - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving),
958                                                allDay: parseInt( evt.allDay ) }, eventEditable(evt.id) ) );
959        });
960
961        return(/* notArray ? filtered[0] :*/ grouped );
962    },
963   
964    criteria: function( filter ){
965     
966                if( $.type(filter.start) !== 'date' )
967                        filter.start = new Date( filter.start * 1000 );
968                if( $.type(filter.end) !== 'date' )
969                        filter.end = new Date( filter.end * 1000 );
970
971                var timezone = {};
972                for(var i in Calendar.signatureOf)
973                        timezone[i] = Calendar.signatureOf[i].calendar.timezone;
974               
975                return { filter: ["AND",
976
977                                        [ ">=", "rangeStart", filter.start.getTime() ],
978                                        [ "<=", "rangeEnd", filter.end.getTime() ],
979                                        [ "IN", "calendar", Calendar.calendarIds ]
980
981                                  ],
982                 criteria: { deepness: 2, timezones: timezone } }
983    }
984});
985
986
987DataLayer.codec( "preference", "detail", {
988 
989        decoder:function( pref ){
990       
991                var res = [];
992
993                pref.defaultAlarm = $.map( pref.alarmTime || [], function( alarmTime, i ){
994                 
995                        return { type: pref.alarmType[i],
996                                time: alarmTime,
997                                unit: pref.alarmUnit[i] };
998                        });
999
1000                $.each( pref, function( i, el ){
1001
1002                        res[ res.length ] = { name: i, value: el };
1003
1004                });
1005               
1006                return( res );
1007     
1008        },
1009
1010        encoder:function( pref ){
1011                return( pref );
1012        }
1013
1014});
1015
1016DataLayer.codec( "schedulable", "export", {
1017 
1018        decoder: function(){},
1019     
1020    encoder: function( signatures ){},
1021     
1022    criteria: function( filter ){
1023       
1024                if( isCal  = filter && filter.calendar )
1025                        filter = filter.calendar;
1026                        return {
1027                                filter: filter ? [  "=", ( isCal ? "calendar" : "id" ), filter ] : false,
1028                                criteria: { format: 'iCal', deepness: 2 }
1029                        };
1030                }
1031});
1032
1033Alarms.load();
1034
1035// DataLayer.decoder( "participant", "detail", function( form ){
1036// 
1037// //     if( $.type( attObj ) !== "array" ){
1038// //   notArray = true;
1039// //   attObj = [ attObj ];
1040// //     }
1041//
1042//     
1043//
1044//     return( participants );
1045//
1046// });
1047
1048// DataLayer.decoder( "alarm", "detail", function( form ){
1049//
1050// //       if( $.type( attObj ) !== "array" ){
1051// //       notArray = true;
1052// //       attObj = [ attObj ];
1053// //     }
1054//
1055//     var alarms = [];
1056//
1057//     if( form.alarmType /*&& !form.*/ )
1058//      for( var i = 0; i < form.alarmType.length; i++ )
1059//      {
1060//          if( form.alarmTime[i] === "" )
1061//              continue;
1062//       
1063//          alarms[i] = { type: form.alarmType[i],
1064//                        unit: form.alarmUnit[i],
1065//                        time: form.alarmTime[i] };
1066//      }
1067//
1068//     return( alarms );
1069//
1070// });
1071
Note: See TracBrowser for help on using the repository browser.