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

Revision 5804, 33.8 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Implementada funcionalidade de criacao de agenda para contas compartilhadas e imposicao de agendas

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