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

Revision 5729, 33.2 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Suporte a alarme de eventos javascript no modulo expressoMAil1_2

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