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

Revision 5468, 23.4 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correção de bugs no expresso email

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