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

Revision 5530, 28.4 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correcoes de bugs e estabilizacao da troca de views

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