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

Revision 5752, 33.6 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correcao na edicao de repeticao com n repeticoes

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