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

RevLine 
[5341]1User = {
2 
3    init: function(){
[5409]4                this.moduleName = 'expressoCalendar';
5                this.me = DataLayer.dispatch( "me" );
6               
[5468]7               
8                this.timezones = Timezone.timezones;
9                this.isDaylightSaving = Timezone.daylightSaving;
[5409]10                this.load();     
[5341]11    },
12 
13    load: function(){
14
[5409]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                  };
[5341]25
[5409]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;
[5341]30    }
31}
32
33UI = {
34        dialogs: {
35                addEvent: null,
36                importCalendar: null
37        }
38}
39
40DataLayer.codec( "calendarSignature", "calendar", {
41 
[5409]42        decoder: function(){},
[5341]43     
[5409]44        encoder: function( signatures ){
[5341]45
[5409]46                return $.map( signatures, function( signature ){
47                        return { events: function( start, end, callback ){
[5341]48                                var viewKey = start + ':' + end;
[5409]49                                if( Calendar.currentViewKey !== viewKey ){
[5341]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 
[5409]70        load: function(){
71                this.lastView = 0;
72                this.signatures  = DataLayer.get("calendarSignature", {filter: ['=', 'user', User.me.id], criteria: {deepness: 2}});
[5341]73         
[5409]74                var prevSources = this.sources;
[5341]75
[5409]76                this.sources = DataLayer.encode( "calendarSignature:calendar", this.signatures );
[5341]77
[5409]78                if( prevSources ){     
79                        var newSources = DataLayer.diff( { 'diff': prevSources }, { 'diff': this.sources } ).diff;
[5341]80
[5409]81                        for( var i = 0; i < newSources.length; i++ )
82                                $('#calendar').fullCalendar( 'addEventSource', newSources[i] );
[5341]83
[5409]84                        var removeSources = DataLayer.diff( { 'diff': newSources }, { 'diff': prevSources } ).diff;
[5341]85
[5409]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++ ){
[5437]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];
[5409]94                }
95
[5384]96                delete Calendar.currentViewKey;
[5409]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 );
[5384]107                for(var i = 0; i < calendarNotSelected.length; i++)
108                        if(!!Calendar.currentView[ calendarNotSelected[i] ])
109                                Calendar.currentView[ calendarNotSelected[i] ].hidden = true;
[5409]110
[5384]111                $('#calendar').fullCalendar( 'refetchEvents' );
[5409]112        }
[5341]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 ){
[5409]140
[5341]141                        var returns = [];
[5409]142
143                        for (var name in form)
144                                returns[ returns.length ] = {
[5341]145                                        name: name,
146                                        user: User.me.id,
147                                        value: form[name],
[5409]148                                        module: User.moduleName,
149                                        id: User.preferenceIds[ name ] || undefined
[5341]150                                };
[5409]151
152                        return [returns];
[5341]153                });
154       
155        return notArray ? res[0] : res;
156        },
157
158    encoder: function( evtObj ){
[5409]159                var val = {}, id = {};
[5341]160                for (var i in evtObj){
[5409]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                        }
[5341]167                }
168                return {values: val,ids: id};
169       
170        }
171});
172
173User.init();
174Calendar.load();
175
[5384]176/* Todo será implementado funcionalidades ajax no calback de importacao de eventos */
177isValidCalback = false;
178
[5409]179/*Todo Melhorias serão feitas na API*/
[5376]180//DataLayer.poll( "schedulable" );
[5341]181
[5381]182DataLayer.listen( "schedulable", function( status, updateData){
[5341]183 
184    if( status === 'serverclient' ){
[5384]185                DataLayer.commit( false, false, function(){     
[5409]186                        if(!!$('#calendar').fullCalendar)
187                                Calendar.rerenderView(true);
[5341]188                        //Atualiza a listagem de eventos apenas se estiver na aba de listagem
[5409]189                        if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') != 0)
190                                pageselectCallback($('.events-list-win.active [name=keyword]').val(), 0);
191                       
[5341]192                });
[5384]193    }
[5341]194});
195
[5384]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
[5341]215DataLayer.listen( "calendarSignature", function( status ){
216
[5409]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;
[5341]226    }
227});
228
229DataLayer.listen( "modulePreference", function( status ){
230
[5409]231    switch( status ){
232                case 'serverclient':  DataLayer.commit( false, false, function(){
233                        User.load();
234                });
235                break;
236                case 'client': 
237                break;
[5341]238    }
239
240});
241
242DataLayer.listen( "alarm", function( created, updated, deleted ){
243
244});
245
[5409]246/*DataLayer.listen( "calendar", function( status, updateData ){
[5341]247
[5409]248    if (updateData === false)
249        switch( status ){
250                case 'serverclient':  DataLayer.commit( false, false, function(){
[5341]251           
[5409]252                        Calendar.load();
253                        refresh_calendars();
[5341]254           
[5409]255                });
256                break;
257                case 'client': 
258                break;
[5341]259    }
[5409]260});*/
[5341]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: {
[5437]274                                        id: Calendar.calendarOf[form.signature].id,
[5341]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 ){
[5409]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]});
[5341]294                                })
295                        };
296               
297                });
298       
299        return notArray ? res[0] : res;
300        },
301
[5409]302    encoder: function( evtObj ){}
[5341]303});
304
305DataLayer.codec( "alarm", "schedulable", {
306
[5409]307    decoder: function( evtObj ){},
[5341]308       
309        encoder: function (evtObjt){
[5376]310       
311                        if(notArray = typeof(evtObjt) == 'array' )
312                                evtObjt = [evtObjt];
313                       
[5341]314                        var res = $.map(evtObjt, function( objEvent ){ 
[5409]315
316                                var time = parseInt(objEvent.schedulable.startTime);
317                                                                                       
[5341]318                                return{
319                                        id: objEvent.id,
[5409]320                                        event_start: new Date( time ).setTimezoneOffset(Timezone.timezones[objEvent.schedulable.timezone]).toString( User.preferences.dateFormat),
[5341]321                                        sendTime: objEvent.sendTime,
322                                        schedulable: {
[5409]323                                                startTime: dateCalendar.formatDate(Timezone.setDateTimezone(new Date(time), objEvent.schedulable.timezone, true), User.preferences.hourFormat),
[5341]324                                                id: objEvent.schedulable.id,
325                                                summary: objEvent.schedulable.summary,
326                                                time: objEvent.time,   
[5409]327                                                unit: dateCalendar.timeunit[objEvent.unit.toLowerCase()] + ( parseInt(objEvent.time) > 1 ? 's' : '' )
[5341]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                       
[5376]347                        return {
348                                id: form.idEvent,
349                                calendar: form.calendar,
350                                participants : [{
351                                        user: User.me.id,
352                                        status: form.status,
[5437]353                                        id: form.meId,
[5376]354                                        isOrganizer: 0,
355                                        alarms: typeof(form.alarmTime) != 'undefined' ?
356                                                $.map( form.alarmTime || [], function( alarmTime, i ){
[5341]357
[5376]358                                                        if( alarmTime === "" )
359                                                                return( null );
[5341]360
[5409]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] };
[5376]364                                                }) : []
365                                        }]
[5341]366                        }
367                });
[5376]368               
369                return notArray ? res[0] : res;
[5341]370    },
371
372    encoder: function( evtObj ){
373
374        var notArray = false;
375     
376        if( notArray = $.type(evtObj) !== "array" )
377            evtObj = [ evtObj ];
378
[5409]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;
[5341]385
[5409]386        var isOrganizer = 1;
[5358]387       
[5341]388        var res = $.map(evtObj, function( objEvent ){                   
389                   
[5409]390                        var participantInfo = {}, me = DataLayer.copy(User.me);
391                                               
[5341]392                    return {
[5409]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 ),
[5341]408          //                            attachments: this.decode( "attachment:detail", form ),
[5409]409                            attendee: $.map(objEvent.participants || [], function( participant, i ){                                           
[5376]410                                       
[5358]411                                        var attend = DataLayer.get('participant', participant);
[5409]412                                        attend.user = DataLayer.get('user', attend.user);
[5341]413                                       
[5409]414                                        statusParticipants[ statusLabels[attend.status] ]++;   
415                                       
416                                        if( attend.user.id ===  me.id ){
[5415]417                                            participantInfo.user = {
[5409]418                                                        status : attend.status,
419                                                        alarms : $.map(attend.alarms || [], function( alarm ){
420                                                                return DataLayer.get('alarm', alarm);
421                                                        })
[5358]422                                                };
[5409]423                                                me.id = attend.id;
[5415]424                                                return(null);
[5409]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;
[5415]436                                            participantInfo.organizer = DataLayer.copy(person);
[5409]437                                                return(null);
438                                        };                                     
439                                       
440                                        return (person);
441                                }),
442                            organizer: participantInfo.organizer || me,
[5415]443                            alarms: !!participantInfo.user ?  participantInfo.user.alarms : [],
444                            status: !!participantInfo.user ? participantInfo.user.status :  1,
[5409]445                            me: me,
446                                isOrganizer: isOrganizer,
447                                statusParticipants: statusParticipants
448                        };
[5341]449                });
450
451        return notArray ? res[0] : res;
452    }
453});
454
455
456
457DataLayer.codec( "schedulable", "detail", {
458
459    decoder: function( evtObj ){
[5409]460               
[5341]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 ){
[5409]469   
[5437]470                    var tzId =  form.timezone || Calendar.signatureOf[form.calendar].calendar.timezone || User.preferences.timezone,
[5341]471
[5409]472                    formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat,
[5341]473                       
474                    participants = [];
475                    return {
476                              "class": form["class"],
[5409]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) ,
[5341]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
[5358]489                                                if( !attendee || attendee === "" )
490                                                        return( null );
[5341]491
492                                                var participant = {};
[5358]493                                                participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
[5341]494                                               
[5358]495                                                if( participant.user === User.me.id ){
[5409]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});                                                 
[5358]506                                                }else{
[5409]507                                                        return {
508                                                                id: attendee,
509                                                                isOrganizer: ( !i ? 1 : 0 ),
510                                                                isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0
511                                                        };
512                                                };
[5341]513                                          })
514                            };
515                    });
516
517        return notArray ? res[0] : res;
518    },
519
520    encoder: function( evtObj ){
[5409]521       
522        if(!(!!evtObj))
523                return undefined;
[5341]524
525        var notArray = false;
526     
527        if( notArray = $.type(evtObj) !== "array" )
528            evtObj = [ evtObj ];
529
530        var pref = User.preferences;
531
[5409]532        var res =  DataLayer.encode('schedulable:preview', evtObj);
[5341]533
[5409]534        if( !notArray ){
[5341]535            var dates = {};
536
[5409]537            for (var i=0; i < res.length; i++) {
[5341]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)])
[5409]547                                        dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] };
[5341]548                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
[5409]549                                        dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
[5341]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
[5409]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 );
[5341]574    }
575});
576
577DataLayer.codec( "calendar", "list", {
578 
579    encoder: function( calendars ){
580
[5409]581                var result = { my_calendars: [], others_calendars: [] };
[5341]582
[5409]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                }
[5341]589
[5409]590                return { agendas_usuario: result };
[5341]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);
[5442]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                }
[5409]728                 
[5442]729                grouped[ evt.calendar ].push( DataLayer.merge({ id: evt.URI || evt.id,
[5341]730                                                title: Encoder.htmlDecode(evt.summary),
[5409]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 ),
[5442]733                                                allDay: parseInt( evt.allDay ) }, eventEditable() ? {} : {editable: false, className: 'blocked-event-permision'}) );
[5341]734        });
735
736        return(/* notArray ? filtered[0] :*/ grouped );
737    },
738   
739    criteria: function( filter ){
740     
[5409]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 );
[5341]745
[5409]746                return { filter: ["AND",
[5341]747
[5409]748                                        [ ">=", "rangeStart", filter.start.toString( "dd-MM-yyyy" ) ],
749                                        [ "<=", "rangeEnd", filter.end.toString( "dd-MM-yyyy" ) ],
750                                        [ "IN", "calendar", Calendar.calendarIds ]
[5341]751
[5409]752                                  ],
[5341]753                 criteria: { deepness: 2 } }
754    }
755});
756
757
758DataLayer.codec( "preference", "detail", {
759 
[5409]760        decoder:function( pref ){
[5341]761       
[5409]762                var res = [];
[5341]763
[5409]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                        });
[5341]770
[5409]771                $.each( pref, function( i, el ){
[5341]772
[5409]773                        res[ res.length ] = { name: i, value: el };
[5341]774
[5409]775                });
776               
777                return( res );
778     
779        },
[5341]780
[5409]781        encoder:function( pref ){
782                return( pref );
783        }
[5341]784
785});
786
787DataLayer.codec( "schedulable", "export", {
788 
[5409]789        decoder: function(){},
[5341]790     
[5409]791    encoder: function( signatures ){},
[5341]792     
[5409]793    criteria: function( filter ){
[5341]794       
[5409]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                }
[5341]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.