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

Revision 5409, 22.9 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Limpeza, melhorias e correcoes na camada javascript do novo modulo

Line 
1User = {
2 
3    init: function(){
4                this.moduleName = 'expressoCalendar';
5                this.me = DataLayer.dispatch( "me" );
6               
7                var objTime = DataLayer.dispatch( "timezones" );
8                this.timezones = objTime.timezones;
9                this.isDaylightSaving = objTime.isDaylightSaving;
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.calendarOf[ this.calendarIds[i] = ( this.calendars[ this.calendars.length ] = this.signatures[i].calendar ).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.signatureOf[form.signature].calendar.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.attendee_organizer[0],
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 = {
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                                        };
425                                       
426                                        var person = {
427                                                id: attend.id,
428                                                name: attend.user.name != 'false' ? attend.user.name : '',
429                                                mail: attend.user.mail,
430                                                isExternal: attend.isExternal
431                                        };
432                                       
433                                        if( !!parseInt(attend.isOrganizer )){
434                                                isOrganizer = ((attend.user.id == User.me.id) || (!!!attend.user)) ? 1 : 0;
435                                            participantInfo.organizer = person;
436                                                return(null);
437                                        };                                     
438                                       
439                                        return (person);
440                                }),
441                            organizer: participantInfo.organizer || me,
442                            alarms: participantInfo.alarms || [],
443                            status: participantInfo.status || 1,
444                            me: me,
445                                isOrganizer: isOrganizer,
446                                statusParticipants: statusParticipants
447                        };
448                });
449
450        return notArray ? res[0] : res;
451    }
452});
453
454
455
456DataLayer.codec( "schedulable", "detail", {
457
458    decoder: function( evtObj ){
459               
460        Encoder.EncodeType = "entity";
461       
462        if( notArray = $.type(evtObj) !== "array" )
463                evtObj = [ evtObj ];
464
465        var pref = User.preferences;
466
467        var res = $.map(evtObj, function( form ){
468   
469                    var tzId =  form.timezone || Calendar.calendarOf[form.calendar].timezone || User.preferences.timezone,
470
471                    formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat,
472                       
473                    participants = [];
474                    return {
475                              "class": form["class"],
476                                  startTime: Timezone.getDateUTC(Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ), tzId).getTime(),
477                                  endTime:  parseInt(Timezone.getDateUTC(Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ), tzId).getTime()) + (!!form.allDay ? 86400000 : 0) ,
478                                  allDay: ( !!form.allDay ? 1 : 0 ),
479                              id: form.idEvent,
480                              location: form.location,
481                              category: form.category,
482                              calendar: form.calendar,
483                              summary: form.summary,
484                              description: form.description,
485                              timezone: tzId,
486                              participants: $.map( form.attendee || [], function( attendee, i ){
487
488                                                if( !attendee || attendee === "" )
489                                                        return( null );
490
491                                                var participant = {};
492                                                participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
493                                               
494                                                if( participant.user === User.me.id ){
495                                                        return DataLayer.merge({
496                                                                isOrganizer: ( !i ? 1 : 0 ),
497                                                                alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){
498                                                                                if( alarmTime === "" )
499                                                                                        return( null );
500                                                                                 return !!form.alarmId[i] ? { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] }:
501                                                                                                                                        { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] };
502                                                                        }),
503                                                                status: form.status
504                                                        }, !!form.idEvent ? {id: attendee} : {user: participant.user});                                                 
505                                                }else{
506                                                        return {
507                                                                id: attendee,
508                                                                isOrganizer: ( !i ? 1 : 0 ),
509                                                                isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0
510                                                        };
511                                                };
512                                          })
513                            };
514                    });
515
516        return notArray ? res[0] : res;
517    },
518
519    encoder: function( evtObj ){
520       
521        if(!(!!evtObj))
522                return undefined;
523
524        var notArray = false;
525     
526        if( notArray = $.type(evtObj) !== "array" )
527            evtObj = [ evtObj ];
528
529        var pref = User.preferences;
530
531        var res =  DataLayer.encode('schedulable:preview', evtObj);
532
533        if( !notArray ){
534            var dates = {};
535
536            for (var i=0; i < res.length; i++) {
537
538                    var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
539                    var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
540
541                    var counter   = startDate.clone();
542
543                    while (counter.compareTo(startDate) == 0) {
544
545                            if (!dates[counter.toString(User.preferences.dateFormat)])
546                                        dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
547                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
548                                        dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
549
550                            dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]);
551                            counter.addDays(-1);
552                    }
553            }
554            res = { events_list: dates,
555                                count : res.length
556                        };
557        }
558
559        return notArray ? res[0] : res;
560    }
561
562});
563
564DataLayer.codec( "participant", "detail", {
565 
566    encoder: function( participants ){
567
568                var result = {};
569                for( var i = 0; i< participants.length; i++ ){
570                        result[ participants[i].user.id || participants[i].user ] = participants[i];
571                }
572                return( result );
573    }
574});
575
576DataLayer.codec( "calendar", "list", {
577 
578    encoder: function( calendars ){
579
580                var result = { my_calendars: [], others_calendars: [] };
581
582                for( var i = 0; i < calendars.length; i++ )
583                {
584                        !!Calendar.signatureOf[ calendars[i].id ].isOwner ?
585                                result.my_calendars.push( calendars[i] ) :
586                                result.others_calendars.push( calendars[i] );
587                }
588
589                return { agendas_usuario: result };
590
591    }
592
593});
594
595DataLayer.codec( "schedulable", "calendar", {
596
597    decoder:function( evtObj ){
598       
599        if( notArray = $.type(evtObj) !== "array" )
600            evtObj = [ evtObj ];
601       
602        var res = $.map(evtObj, function( evt ){
603
604                    return { id: evt.id,
605                             summary: evt.title,
606                             startTime: evt.start.getTime(),
607                             endTime: ( !!evt.allDay ? (( evt.end || evt.start ).getTime() + 86400000) :( evt.end || evt.start ).getTime()),
608                             allDay: ( !!evt.allDay ? 1 : 0 )
609                             /*calendar: evt.id && User.calendarOf[ evt.id ].id*/ };
610        });
611
612        return notArray ? res[0] : res;
613    },
614
615    encoder: function( evtObj, filter ){
616     
617        if( !evtObj )
618            return( false );
619
620//       if( notArray = $.type(evtObj) !== "array" )
621//        evtObj = [ evtObj ];
622//      alert( evtObj );
623        var filtered = evtObj;
624       
625        // repeat:{
626//        frequency: "weekly",
627//        endTime: Date.parse("+10 days").getTime(),
628//        interval: 3,
629//        byday: 3,
630//        bysecond: 3,
631//        byminute: 3,
632//        bymonthday: 3,
633//        byyearday: 3,
634//        byweekno: 3,
635//        bysetpos: 3,
636//        wkst: "monday"/*,
637//        duration: true*/
638//       }
639
640//      $.each(evtObj, function( index, evt ){
641
642//              alert( dump(!!evt.repeat) );
643
644//              if( evt && !!evt.repeat && (evt.startTime < filter.end || (evt.repeat.endTime || 0) > filter.start ) )
645//              {
646// //               var interval = evt.repeat.interval;
647//
648//                  var current = new Date( evt.startTime );
649//                  var begin = new Date( filter.start );
650//                  var end = new Date( filter.end );
651//                  var offset = evt.endTime - evt.startTime;
652//
653//                  var ocurrence = [];
654//
655//                  while( Date.compare( current, begin ) !== 1 )
656//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
657//
658//                  while( current.before( end ) && (ocurrence[ ocurrence.length ] = current) )
659//                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" );
660//
661//                  for( var i = 0; i < ocurrences.length; i++ )
662//                      filtered[ filtered.length ] = { URI: evt.URI,
663//                                                      summary: evt.summary,
664//                                                      start: new Date( ocurrences[i] ),
665//                                                      end: new Date( ocurrences[i] + offset ),
666//                                                      allDay: evt.allDay };
667//
668// //               switch( evt.repeat.frequency )
669// //               {
670// //                 case "yearly":   interval *= 12;
671// //                 case "monthly":  interval *= 30; //TODO: get the month variant
672// //                 case "weekly":   interval *= 7;
673// //                 case "daily":    interval *= 24;
674// //                 case "hourly":   interval *= 60;
675// //                 case "minutely": interval *= 60;
676// //                 case "secondly": interval *= 1000;
677// //               }
678// //             
679// //               var rest = ( filter.start - evt.startTime ) % interval;
680// //
681// //               var offset = evt.endTime - evt.startTime;
682// //
683// //               if( rest < offset )
684// //               {
685// //                   var freq = Math.floor( offset - rest / interval );
686// //
687// //                   
688// //
689// //                   for( var i = 0; i < freq; i++ )
690// //                   {
691// //                        var ocurrence = filter.start + rest + ( interval * i );
692// //
693// //                       
694// //                   }
695// //
696// //                   
697// //               }
698//              }
699
700//              if( parseInt( evt.endTime ) > filter[1][0][2] || parseInt( evt.startTime ) < filter[1][1][2] )
701//                  filtered[ filtered.length ] = evt;
702//
703//      });
704
705        var grouped = {};
706
707        $.map(filtered, function( evt ){
708
709                evt.calendar = evt.calendar || "1";
710
711                if( !grouped[ evt.calendar ] )
712                    grouped[ evt.calendar ] = [];
713                       
714                var calendar = DataLayer.get('calendar', evt.calendar);
715                 
716                grouped[ evt.calendar ].push( { id: evt.URI || evt.id,
717                                                title: Encoder.htmlDecode(evt.summary),
718                                                start: Timezone.getDateTimezone(new Date(parseInt( evt.startTime )), calendar.timezone, false),
719                                                end:   Timezone.getDateTimezone(new Date(parseInt( evt.endTime ) - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, false ),
720                                                allDay: parseInt( evt.allDay ) } );
721        });
722
723        return(/* notArray ? filtered[0] :*/ grouped );
724    },
725   
726    criteria: function( filter ){
727     
728                if( $.type(filter.start) !== 'date' )
729                        filter.start = new Date( filter.start * 1000 );
730                if( $.type(filter.end) !== 'date' )
731                        filter.end = new Date( filter.end * 1000 );
732
733                return { filter: ["AND",
734
735                                        [ ">=", "rangeStart", filter.start.toString( "dd-MM-yyyy" ) ],
736                                        [ "<=", "rangeEnd", filter.end.toString( "dd-MM-yyyy" ) ],
737                                        [ "IN", "calendar", Calendar.calendarIds ]
738
739                                  ],
740                 criteria: { deepness: 2 } }
741    }
742});
743
744
745DataLayer.codec( "preference", "detail", {
746 
747        decoder:function( pref ){
748       
749                var res = [];
750
751                pref.defaultAlarm = $.map( pref.alarmTime || [], function( alarmTime, i ){
752                 
753                        return { type: pref.alarmType[i],
754                                time: alarmTime,
755                                unit: pref.alarmUnit[i] };
756                        });
757
758                $.each( pref, function( i, el ){
759
760                        res[ res.length ] = { name: i, value: el };
761
762                });
763               
764                return( res );
765     
766        },
767
768        encoder:function( pref ){
769                return( pref );
770        }
771
772});
773
774DataLayer.codec( "schedulable", "export", {
775 
776        decoder: function(){},
777     
778    encoder: function( signatures ){},
779     
780    criteria: function( filter ){
781       
782                if( isCal  = filter && filter.calendar )
783                        filter = filter.calendar;
784                        return {
785                                filter: filter ? [  "=", ( isCal ? "calendar" : "id" ), filter ] : false,
786                                criteria: { format: 'iCal', deepness: 2 }
787                        };
788                }
789});
790
791Alarms.load();
792
793// DataLayer.decoder( "participant", "detail", function( form ){
794// 
795// //     if( $.type( attObj ) !== "array" ){
796// //   notArray = true;
797// //   attObj = [ attObj ];
798// //     }
799//
800//     
801//
802//     return( participants );
803//
804// });
805
806// DataLayer.decoder( "alarm", "detail", function( form ){
807//
808// //       if( $.type( attObj ) !== "array" ){
809// //       notArray = true;
810// //       attObj = [ attObj ];
811// //     }
812//
813//     var alarms = [];
814//
815//     if( form.alarmType /*&& !form.*/ )
816//      for( var i = 0; i < form.alarmType.length; i++ )
817//      {
818//          if( form.alarmTime[i] === "" )
819//              continue;
820//       
821//          alarms[i] = { type: form.alarmType[i],
822//                        unit: form.alarmUnit[i],
823//                        time: form.alarmTime[i] };
824//      }
825//
826//     return( alarms );
827//
828// });
829
Note: See TracBrowser for help on using the repository browser.