source: branches/2.4/prototype/modules/calendar/js/calendar.codecs.js @ 7598

Revision 7598, 62.3 KB checked in by douglas, 11 years ago (diff)

Ticket #3212 - Problema com criação de eventos em contas compartilhadas

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 = {
16            dateFormat: "dd/MM/yyyy",
17            hourFormat: "HH:mm",
18            defaultCalView: "month",
19            defaultDuration: 30,
20            backgroundColor: "36C",
21            borderColor: "36C",
22            fontColor: "fff",
23            timezone: 'America/Sao_Paulo',
24            weekStart: 'SUN',
25            useDesktopNotification: 0
26        };
27
28        var pref = DataLayer.get( "modulePreference:detail", ['and',[ "=", "user", this.me.id ], [ "=", "module", this.moduleName ]] );
29
30        this.preferences = DataLayer.merge( defaultPreferences, pref.values || {} );
31        this.preferenceIds = pref.ids;
32    }
33}
34
35updateActivity = false;
36
37constantsParticipant = {
38    'o' : 'organization',
39    'w' : 'write',
40    'p' : 'participationRequired',
41    'i' : 'inviteGuests',
42    'r' : 'read'
43}
44
45constantsCalendarShared = {
46    'r' : 'read',
47    'w' : 'write',
48    'd' : 'remove',
49    'b' : 'busy',
50    's' : 'shared',
51    'p' : 'required'
52}
53
54UI = {
55    dialogs: {
56        addEvent: null,
57        importCalendar: null,
58        sharedCalendar: null,
59        copyCalendar: null,
60    assingCalendar: null
61    }
62}
63
64DataLayer.codec( "calendarSignature", "calendar", {
65 
66    decoder: function(){},
67     
68    encoder: function( signatures ){
69        return $.map( signatures, function( signature ){
70            return {
71                events: function( start, end, callback ){
72                    var viewKey = start + ':' + end;
73                    if( Calendar.currentViewKey !== viewKey ){
74                        Calendar.currentViewKey = viewKey;
75                        Calendar.currentView = DataLayer.get( 'schedulable:calendar', {
76                            start: start,
77                            end: end
78                        } );
79                    }
80                    var view = Calendar.currentView[ signature.calendar.id ];
81                    callback( view && !view.hidden ? view : [] );
82                },
83
84                backgroundColor: '#' + signature.backgroundColor || User.preferences.backgroundColor,
85                borderColor: '#' + signature.borderColor || User.preferences.borderColor,
86                textColor: '#' + signature.fontColor || User.preferences.fontColor,
87            className: [],
88                editable:  signature.isOwner
89                }
90        });
91    }
92
93     
94});
95
96DataLayer.codec( "calendarToPermission", "detail", {
97    decoder: function( evtObj ){
98    /*          Encoder.EncodeType = "entity";
99               
100                if( notArray = $.type(evtObj) !== "array" )
101                        evtObj = [ evtObj ];
102               
103                var res = $.map(evtObj, function( form){
104                        return [$.map(form.user , function( user, i){
105                                return {
106                                        calendar: form.calendar,
107                                        user: user,
108                                        acl: form.attendeeAcl[i],
109                                        type: 0
110                                };
111                        })];
112                });
113       
114        return notArray ? res[0] : res;
115        */
116    },
117
118    encoder: function( evtObj ){
119       
120        if(evtObj == "")
121            return "";
122                       
123        var notArray = false;
124                 
125        if( notArray = $.type(evtObj) !== "array" )
126            evtObj = [ evtObj ];
127               
128        var constantAcl = function(acl){
129            var returns = {};
130            for (var i in constantsCalendarShared){
131                returns[constantsCalendarShared[i]] = acl.indexOf(i) >= 0 ? true : false
132            }
133            return returns;
134        };
135
136        var res = $.map(evtObj, function( objEvent ){                   
137            return {
138                id: objEvent.id,
139                type: objEvent.type,
140                calendar: objEvent.calendar,
141                user: objEvent.user,
142                acl: constantAcl(objEvent.acl)  ,
143                aclValues: objEvent.acl,
144                owner: objEvent.owner
145            };
146        });     
147        return notArray ? res[0] : res;
148    }
149});
150
151DataLayer.codec( "modulePreference", "detail", {
152    decoder: function( evtObj ){
153
154        if( notArray = $.type(evtObj) !== "array" )
155            evtObj = [ evtObj ];
156               
157        var res = $.map(evtObj, function( form ){
158
159            var returns = [];
160
161            for (var name in form)
162                returns[ returns.length ] = {
163                    name: name,
164                    user: User.me.id,
165                    value: form[name],
166                    module: User.moduleName,
167                    id: User.preferenceIds[ name ] || undefined
168                };
169
170            return [returns];
171        });
172       
173        return notArray ? res[0] : res;
174    },
175
176    encoder: function( evtObj ){
177        var val = {}, id = {};
178        for (var i in evtObj){
179                       
180            if( evtObj[i].value && evtObj[i].id )
181            {
182                val[evtObj[i].name] = evtObj[i].value;
183                id[evtObj[i].name] = evtObj[i].id;
184            }
185        }
186        return {
187            values: val,
188            ids: id
189        };
190       
191    }
192});
193
194/*Todo Melhorias serço feitas na API*/
195//DataLayer.poll( "schedulable" );
196
197DataLayer.listen( "schedulable", function( status, updateData){
198 
199    if( status === 'serverclient' ){
200        DataLayer.commit( false, false, function(){     
201            Calendar.rerenderView(true);
202            if(updateActivity)
203                refreshTaskActivity();
204        });
205    }
206});
207
208//TODO - Voltar quando tratado put de varios items de um mesmo conceito,
209/*
210DataLayer.listen( "calendarSignature", function( status ){
211
212    switch( status ){
213                case 'serverclient':  DataLayer.commit( false, false, function( received ){
214                        delete Calendar.currentViewKey;
215                        Calendar.load();
216                        refresh_calendars();
217                });
218                break;
219                case 'client': 
220                break;
221    }
222});
223*/
224
225DataLayer.listen( "modulePreference", function( status ){
226
227    switch( status ){
228        case 'serverclient':
229            DataLayer.commit( false, false, function(){
230            User.load();
231        });
232        break;
233        case 'client':
234            break;
235    }
236
237});
238
239DataLayer.listen( "alarm", function( created, updated, deleted ){
240
241    });
242
243/*DataLayer.listen( "calendar", function( status, updateData ){
244
245    if (updateData === false)
246        switch( status ){
247                case 'serverclient':  DataLayer.commit( false, false, function(){
248           
249                        Calendar.load();
250                        refresh_calendars();
251           
252                });
253                break;
254                case 'client': 
255                break;
256    }
257});*/
258
259DataLayer.codec( "calendarSignature", "configure", {
260    decoder: function( evtObj ){
261        Encoder.EncodeType = "entity";
262               
263        if( notArray = $.type(evtObj) !== "array" )
264            evtObj = [ evtObj ];
265               
266        var res = $.map(evtObj, function( form ){
267            return{
268                id: form.signature,
269                user: User.me.id,       
270                calendar: {
271                    id: !!!parseInt(form.type) ? Calendar.calendarOf[form.signature].id : Calendar.groupOf[form.signature].id,
272                    name: Encoder.htmlEncode(form.name),
273                    description: Encoder.htmlEncode(form.description),
274                    timezone: form.timezone,
275                    defaultDuration: form.duration != "" ? form.duration : 30,
276                    location: form.location
277                },
278                //      isOwner: 1,
279                fontColor: Encoder.htmlEncode(form.fontColor.substring(1)),
280                backgroundColor: Encoder.htmlEncode(form.backgroundColor.substring(1)),
281                borderColor: Encoder.htmlEncode(form.borderColor.substring(1)),
282                msgAdd: Encoder.htmlEncode(form.msgAdd),
283                msgCancel: Encoder.htmlEncode(form.msgCancel),
284                msgUpdate: Encoder.htmlEncode(form.msgUpdate),
285                msgReply: Encoder.htmlEncode(form.msgReply),
286                msgAlarm: Encoder.htmlEncode(form.msgAlarm),
287                calendarSignatureAlarms: $.map( form.alarmTime || [], function( alarmTime, i ){
288                    return (!!form.alarmId[i] ?
289                    {
290                        type: form.alarmType[i],       
291                        unit: form.alarmUnit[i],
292                        time: form.alarmTime[i],
293                        id: form.alarmId[i]
294                        } :
295{
296                        type: form.alarmType[i],       
297                        unit: form.alarmUnit[i],
298                        time: form.alarmTime[i]
299                        });
300                })
301            };
302               
303        });
304        return notArray ? res[0] : res;
305    },
306
307    encoder: function( evtObj ){}
308});
309
310DataLayer.codec( "alarm", "schedulable", {
311
312    decoder: function( evtObj ){},
313       
314    encoder: function (evtObjt){
315        if(evtObjt == '') return false;
316
317        if((notArray = typeof(evtObjt) !== 'array') && (!evtObjt.length))
318            evtObjt = [evtObjt];
319                       
320        var res = $.map(evtObjt, function( objEvent ){ 
321
322            var time = parseInt(objEvent.schedulable.startTime);
323                                                                                       
324            return{
325                id: objEvent.schedulable.id,
326                event_start: new Date( time ).setTimezoneOffset(Timezone.timezones[objEvent.schedulable.timezone]).toString( User.preferences.dateFormat),
327                sendTime: parseInt(objEvent.schedulable.sendTime) / 1000,
328                schedulable: {
329                    startTime: dateCalendar.formatDate(Timezone.getDateEvent(new Date(time), objEvent.schedulable.timezone, objEvent.schedulable.DayLigth, 'startTime'), User.preferences.hourFormat),
330                    id: objEvent.schedulable.id,
331                    summary: objEvent.schedulable.summary,
332                    time: objEvent.schedulable.time,   
333                    unit: (dateCalendar.timeunit[objEvent.schedulable.unit.toLowerCase()]) + ( parseInt(objEvent.schedulable.time) > 1 ? 's' : '' )
334                }
335            }
336        });
337        return res;
338    }
339});
340
341DataLayer.codec( "suggestion", "duration", {
342
343    decoder: function( evtObj ){
344        if( notArray = $.type(evtObj) !== "array" )
345            evtObj = [ evtObj ];
346
347
348
349        var meAttendee = function(attendees){
350            for(var i = 0; i < attendees.length; i++)
351                if(DataLayer.get('participant', attendees[i]).user == User.me.id)
352                    return attendee;
353        };
354
355        var res = $.map(evtObj, function( form ){       
356            return {
357                participant : meAttendee(form.attendee),
358                startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
359                endTime:  Date.parseExact(form.endDate + " "+$.trim(form.endHour), formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
360                allDay: ( !!form.allDay ? 1 : 0 ),
361                schedulable: form.idEvent
362            }
363        });     
364       
365
366        return notArray ? res[0] : res;
367    },
368       
369    encoder: function( evtObj ){}
370       
371});
372
373DataLayer.codec( "attachment", "detail", {
374 
375    decoder: function(evtObj){
376       
377        if( notArray = $.type(evtObj) !== "array" )
378            evtObj = [ evtObj ];
379
380        var res = $.map(evtObj, function( form){
381            return [$.map(form.files , function( files){
382                return {
383                    source: files
384                };
385            })];
386        });
387        return notArray ? res[0] : res;
388    },
389     
390    encoder: function(){}
391
392     
393});
394
395DataLayer.codec( "schedulable", "taskEdit", {
396
397    decoder: function( evtObj ){
398        Encoder.EncodeType = "entity";
399       
400        if( notArray = $.type(evtObj) !== "array" )
401            evtObj = [ evtObj ];
402
403        var pref = User.preferences;
404               
405        var res = $.map(evtObj, function( form ){
406                       
407            return DataLayer.merge({
408                id: form.idTask,
409                percentage: form.percentage,
410                type: '2',
411                status: form.taskStatus,
412                participants : $.map(form.attendee, function( attendee, i ){
413                    if(isNaN(attendee)){
414                        return{
415                            id: attendee,
416                            acl: form.attendeeAcl[i],
417                            delegatedFrom: !!form.delegatedFrom[i] ? form.delegatedFrom[i] : 0,
418                            isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
419                            isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
420                            acl: 'r'
421                        };
422                    }else{
423                        if(DataLayer.get('participant', attendee).user == User.me.id){
424                            var me = {
425                                user: User.me.id,
426                                status: form.status,
427                                id: attendee,
428                                isOrganizer: 0,
429                                receiveNotification : (!!form.receiveNotification ? 1 : 0),
430                                alarms: typeof(form.alarmTime) != 'undefined' ?
431                                $.map( form.alarmTime || [], function( alarmTime, i ){
432
433                                    if( alarmTime === "" )
434                                        return( null );
435
436                                    return !!form.alarmId[i] ?
437                                    {
438                                        type: form.alarmType[i],
439                                        unit: form.alarmUnit[i],
440                                        time: form.alarmTime[i],
441                                        id: form.alarmId[i]
442                                        } :
443{
444                                        type: form.alarmType[i],
445                                        unit: form.alarmUnit[i],
446                                        time: form.alarmTime[i]
447                                        };
448                                }) : []
449                            };
450                                                       
451                            if(form.startDate){
452                                var tzId =  DataLayer.get('schedulable', form.idEvent).timezone || User.preferences.timezone,
453                                formatString = pref.dateFormat + " " + pref.hourFormat;
454                                                               
455                                DataLayer.put('notification', {
456                                    participant: me.id,
457                                    type: 'suggestion',
458                                    startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'),
459                                    endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'),
460                                    allDay: ( !!form.allDay ? 1 : 0 ),
461                                    schedulable: form.idEvent
462                                });
463                                                       
464                            }
465                            return me;
466                        }else return(null);
467                    };
468                })
469            }, (form.group != form.lastGroup? {calendar: form.group, lastCalendar: form.lastGroup} : {}))
470        });
471        return notArray ? res[0] : res;
472    },
473
474    encoder: function( evtObj ){}
475
476});
477
478DataLayer.codec( "schedulable", "preview", {
479
480    decoder: function( evtObj ){
481        Encoder.EncodeType = "entity";
482       
483        if( notArray = $.type(evtObj) !== "array" )
484            evtObj = [ evtObj ];
485
486        var pref = User.preferences;
487               
488        var Owner = decodeOwnerCalendar(evtObj[0].calendar);   
489
490        var res = $.map(evtObj, function( form ){
491                       
492            return DataLayer.merge({
493                id: form.idEvent,
494                participants : $.map(form.attendee, function( attendee, i ){
495                    if(isNaN(attendee)){
496                        return{
497                            id: attendee,
498                            acl: form.attendeeAcl[i],
499                            delegatedFrom: !!form.delegatedFrom[i] ? form.delegatedFrom[i] : 0,
500                            isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
501                            isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
502                            acl: form.attendeeAcl[i].replace('o', '')
503                        };
504                    }else{
505                        if(DataLayer.get('participant', attendee).user == Owner.id){
506                            var me = {
507                                user: Owner.id,
508                                status: form.status,
509                                id: attendee,
510                                isOrganizer: 0,
511                                receiveNotification : (!!form.receiveNotification ? 1 : 0),
512                                alarms: typeof(form.alarmTime) != 'undefined' ?
513                                $.map( form.alarmTime || [], function( alarmTime, i ){
514
515                                    if( alarmTime === "" )
516                                        return( null );
517
518                                    return !!form.alarmId[i] ?
519                                    {
520                                        type: form.alarmType[i],
521                                        unit: form.alarmUnit[i],
522                                        time: form.alarmTime[i],
523                                        id: form.alarmId[i]
524                                        } :
525{
526                                        type: form.alarmType[i],
527                                        unit: form.alarmUnit[i],
528                                        time: form.alarmTime[i]
529                                        };
530                                }) : []
531                            };
532                                                       
533                            if(form.startDate){
534                                var tzId =  DataLayer.get('schedulable', form.idEvent).timezone || User.preferences.timezone,
535                                formatString = pref.dateFormat + " " + pref.hourFormat;
536                                                               
537                                DataLayer.put('notification', {
538                                    participant: me.id,
539                                    type: 'suggestion',
540                                    startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'),
541                                    endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'),
542                                    allDay: ( !!form.allDay ? 1 : 0 ),
543                                    schedulable: form.idEvent
544                                });
545                                                       
546                            }
547                            return me;
548                        }else return(null);
549                    };
550                })
551            }, (Owner.id == User.me.id) ? (form.calendar != form.lastCalendar ? {calendar: form.calendar, lastCalendar: form.lastCalendar} : {}) : {})
552        });
553        return notArray ? res[0] : res;
554    },
555
556    encoder: function( evtObj ){
557
558        var notArray = false;
559     
560        if( notArray = $.type(evtObj) !== "array" )
561            evtObj = [ evtObj ];
562
563        var statusParticipants = {},
564       
565        statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ];
566       
567        var delegateAttendee = {};
568
569        var myCalendar = function(){
570                for(var i in Calendar.signatures)
571                if(Calendar.signatures[i].isOwner == "1" && Calendar.signatures[i].type == "0")
572                        return Calendar.signatures[i].calendar.id;
573        }
574       
575        for( var i = 0; i < statusLabels.length; i++ )
576            statusParticipants[ statusLabels[i] ] = 0;
577       
578        var res = $.map(evtObj, function( objEvent ){                   
579                   
580            if(!(typeof(objEvent) == 'object'))
581                return (null);
582
583            var isAttendee = false;
584
585            objEvent.calendar = !!objEvent.calendar ? objEvent.calendar : (User.preferences.defaultCalendar ? User.preferences.defaultCalendar : myCalendar());
586
587            var Owner = decodeOwnerCalendar(objEvent.calendar);
588
589            var participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy( Owner );
590                       
591            var constantAcl = function(acl){
592                var returns = {};
593                for (var i in constantsParticipant){
594                    returns[constantsParticipant[i]] = acl.indexOf(i) >= 0 ? true : false
595                }
596                return returns;
597            };
598
599            var isShared = !objEvent.id ? false : (!!objEvent.calendar) && parseInt(Calendar.signatureOf[objEvent.calendar].isOwner) ? false : true;
600            var limitAttendee = false;
601
602            return {
603                "class": objEvent["class"],
604                id: objEvent.id,
605                repeat: encodeRepeat( objEvent.repeat ),
606                location: objEvent.location,
607                category: objEvent.category,
608                calendars: Calendar.calendars,
609                calendar: objEvent.calendar,
610                summary: objEvent.summary,
611        type: !!objEvent.type ? objEvent.type : 1,
612                description: objEvent.description,
613                timezone: objEvent.timezone,
614                timezones: Timezone.timezones,
615        startDate: Timezone.getDate( (objEvent.DayLigth ? objEvent.DayLigth.event.startTime : objEvent.startTime), 'start', objEvent.allDay ),
616        startHour: objEvent.DayLigth ? Timezone.getHour( objEvent.DayLigth.event.startTime) : Timezone.formateHour( objEvent.startTime ),
617        endDate: Timezone.getDate( (objEvent.DayLigth ? objEvent.DayLigth.event.endTime : objEvent.endTime), 'end', objEvent.allDay ),
618        endHour: objEvent.DayLigth ? Timezone.getHour( objEvent.DayLigth.event.endTime) : Timezone.formateHour( objEvent.endTime ),
619                allDay: !!parseInt( objEvent.allDay ),
620                dueDate: objEvent.dueDate,
621                dueTime: objEvent.dueTime,
622                priority: objEvent.priority,
623                attachments: $.map(objEvent.attachments || [], function( attachment, i ){
624                    var attach = DataLayer.get('schedulableToAttachment', attachment, false);
625                    //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o
626                    if(!attach.name) return(null);
627                   
628                    var ext = attach.name.split('.');
629                    attach.name = attach.name.length < 10 ?  attach.name : ( ext.length == 1 ? attach.name.substr(0, 10) : (attach.name.substr(0, 6) + '.' +  ext[ext.length -1]));
630                    attach.size = formatBytes(attach.size);
631                    return attach;
632                }),                                             
633                attendee: $.map(objEvent.participants || [], function( participant, i ){                                               
634
635                    if(delegateAttendee[participant])
636                        return(null);
637
638                    var attend = DataLayer.get('participant', (participant.id || participant));
639                    attend.user = DataLayer.get('user', attend.user);
640
641                    statusParticipants[ statusLabels[attend.status] ]++;       
642
643                    if(attend.user.mail == User.me.mail)
644                        isAttendee = true;
645
646                    if( attend.user.id ===  me.id ){
647                        participantInfo.user = {
648                            id: attend.id,
649                            status : attend.status,
650                            delegatedFrom: attend.delegatedFrom || '0',
651                            acl: attend.acl,
652                            receiveNotification : attend.receiveNotification,
653                            alarms : $.map(attend.alarms || [], function( alarm ){
654                                var alarm = DataLayer.get('alarm', alarm);
655                                return (alarm == "" ? (null) : alarm);
656                            })
657                        };
658                        me = attend;
659                        return(null);
660                    };
661
662                    var person = {
663                        id: attend.id,
664                        name: attend.user.name != 'false' ? attend.user.name : '',
665                        mail: attend.user.mail,
666                        status : attend.status,
667                        isExternal: attend.isExternal,
668                        acl: attend.acl,
669                        delegatedFrom: attend.delegatedFrom
670                    };
671
672                    if(!!parseInt(attend.delegatedFrom)){
673                        delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person);
674                        return(null);
675                    }
676
677                    if( !!parseInt(attend.isOrganizer )){
678                        participantInfo.organizer = DataLayer.copy(person);
679                        return(null);
680                    };                                 
681
682                    return (person);
683                }),
684                organizer: participantInfo.organizer || me,
685                alarms: !!participantInfo.user ? participantInfo.user.alarms : [],
686                status: !!participantInfo.user ? participantInfo.user.status : 1,
687                acl: constantAcl((me.acl && me.acl != '') ? me.acl : ((!objEvent.id || objEvent.id == '') ? 'row' : 'r')),
688                isShared: isShared,
689                isAttendee: (isAttendee ? true : (objEvent.id && isShared ? false : true)),
690                me: me,
691                delegatedFrom: delegatedFrom,
692                statusParticipants: (objEvent.sizeAttendees != "") ? objEvent.statusAttendees : statusParticipants,
693                sizeAttendeeLimit: (objEvent.sizeAttendees != "") ? objEvent.sizeAttendees : false
694            };
695        });
696        return (notArray ? res[0] : res);
697    }
698});
699
700DataLayer.codec( "schedulable", "task", {
701
702    decoder: function( evtObj ){
703    Encoder.EncodeType = "entity";
704   
705    if( notArray = $.type(evtObj) !== "array" )
706        evtObj = [ evtObj ];
707
708    var pref = User.preferences;
709
710    var res = $.map(evtObj, function( form ){
711   
712        var tzId =  form.timezone || Calendar.signatureOf[form.group].calendar.timezone || User.preferences.timezone,
713
714        formatString = pref.dateFormat + " " + pref.hourFormat;
715
716        return DataLayer.merge({
717        "class": form["class"],
718        startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
719        endTime: (form.dueDate == '' ) ?
720            Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00') :
721            Date.parseExact(form.dueDate + " "+$.trim(form.dueTime) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
722        due: (form.dueDate == '' ) ? 0 : Date.parseExact(form.dueDate + " "+$.trim(form.dueTime) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
723        allDay: ( form.dueDate == ''  ? 1 : 0 ),
724        status: form.taskStatus,     
725        id: form.idTask,
726        location: form.location,
727        type: !!form.type ?  form.type : 2,
728        percentage: form.percentage,
729        priority: form.priority,
730        category: form.category,
731        summary: form.summary == '' ? 'Tarefa sem título' : form.summary,
732        description: form.description,
733        timezone: tzId,
734        attachments: $.map(form.attachment || [], function( attachment, i ){
735            return {
736            attachment: attachment
737            }
738        }),
739        participants: $.map( form.attendee || [], function( attendee, i ){
740
741            if( !attendee || attendee === "" )
742            return( null );
743
744            var participant = {};
745            participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
746
747            if( participant.user === User.me.id ){
748            return DataLayer.merge({
749                id: attendee,
750                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
751                alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){
752                if( alarmTime === "" )
753                    return( null );
754                return !!form.alarmId[i] ? {
755                    type: form.alarmType[i],
756                    unit: form.alarmUnit[i],
757                    time: form.alarmTime[i],
758                    id: form.alarmId[i]
759                    }:
760
761                    {
762                    type: form.alarmType[i],
763                    unit: form.alarmUnit[i],
764                    time: form.alarmTime[i]
765                    };
766                }),
767                status: !!form.status ? form.status : 3
768            }, (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '')  ? {
769                delegatedFrom: form.delegatedFrom[i]
770                } : {});
771            }else{
772                return {
773                    id: attendee,
774                    isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
775                    isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
776                    delegatedFrom: (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '') ? form.delegatedFrom[i] : '0'
777                    };
778            };
779        })
780        }, form.lastGroup ? (( form.lastGroup == form.group ) ? {} : {calendar: form.group, lastGroup: form.lastGroup}) : {calendar: form.group});
781    });
782
783    return notArray ? res[0] : res;
784    },
785
786    encoder: function( evtObj ){
787
788    var notArray = false;
789     
790    if( notArray = $.type(evtObj) !== "array" )
791        evtObj = [ evtObj ];
792
793    var statusParticipants = {},  isAttendee = false,
794   
795    statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ],
796
797    participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy( User.me );
798   
799    var delegateAttendee = {};
800   
801    for( var i = 0; i < statusLabels.length; i++ )
802        statusParticipants[ statusLabels[i] ] = 0;
803   
804    var res = $.map(evtObj, function( objEvent ){           
805           
806        if(!(typeof(objEvent) == 'object'))
807            return (null);
808
809        var limitAttendee = false;
810
811        return {
812        "class": objEvent["class"],
813        id: objEvent.id,
814        location: objEvent.location,
815        category: objEvent.category,
816        taskStatus: objEvent.status,
817        groups: Calendar.groups,
818        group: objEvent.group ? objEvent.group : objEvent.calendar,
819        summary: objEvent.summary,
820        type: !!objEvent.type ? objEvent.type : 2,
821        description: objEvent.description,
822        timezone: objEvent.timezone,
823        timezones: Timezone.timezones,
824        percentage: (objEvent.percentage) ? objEvent.percentage : '0',
825        priority: objEvent.priority,
826        startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
827        startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
828        endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
829        endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
830        dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
831        dueTime: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.due)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
832        allDay: !!parseInt( objEvent.allDay ),
833            historic: !!objEvent.historic ? decodeHistoric(objEvent) : [] ,
834        attachments: $.map(objEvent.attachments || [], function( attachment, i ){
835            var attach = DataLayer.get('schedulableToAttachment', attachment, false);
836            //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o
837            if(!attach.name) return(null);
838           
839            var ext = attach.name.split('.');
840            attach.name = attach.name.length < 10 ?  attach.name : ( ext.length == 1 ? attach.name.substr(0, 10) : (attach.name.substr(0, 6) + '.' +  ext[ext.length -1]));
841            attach.size = formatBytes(attach.size);
842            return attach;
843        }),                     
844        attendee: $.map(objEvent.participants || [], function( participant, i ){                       
845
846            if(delegateAttendee[participant])
847                return(null);
848
849            var attend = DataLayer.get('participant', (participant.id || participant));
850            attend.user = DataLayer.get('user', attend.user);
851
852            statusParticipants[ statusLabels[attend.status] ]++;   
853
854            if(attend.user.mail == User.me.mail)
855                isAttendee = true;
856
857            if( attend.user.id ===  me.id ){
858                participantInfo.user = {
859                    id: attend.id,
860                    status : attend.status,
861                    delegatedFrom: attend.delegatedFrom || '0',
862                    acl: attend.acl,
863                    receiveNotification : attend.receiveNotification,
864                    alarms : $.map(attend.alarms || [], function( alarm ){
865                    var alarm = DataLayer.get('alarm', alarm);
866                    return (alarm == "" ? (null) : alarm);
867                    })
868                };
869                me = attend;
870                return(null);
871            };
872
873            var person = {
874                id: attend.id,
875                name: attend.user.name != 'false' ? attend.user.name : '',
876                mail: attend.user.mail,
877                status : attend.status,
878                isExternal: attend.isExternal,
879                acl: attend.acl,
880                delegatedFrom: attend.delegatedFrom,
881                isOrganizer: attend.isOrganizer
882            };
883
884            if(!!parseInt(attend.delegatedFrom)){
885                delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person);
886                if( !!parseInt(attend.isOrganizer)){
887                    participantInfo.organizer = DataLayer.copy(person);
888                }
889 
890                return null;
891            }
892
893            if( !!parseInt(attend.isOrganizer)){
894                participantInfo.organizer = DataLayer.copy(person);
895                return null;
896            };                 
897
898            return (person);
899        }),
900        organizer: participantInfo.organizer || me,
901                isOrganizer: (participantInfo.organizer || me).id == me.id,
902        alarms: !!participantInfo.user ? participantInfo.user.alarms : [],
903        status: !!participantInfo.user ? participantInfo.user.status : 1,
904        isAttendee: isAttendee,
905        me: me,
906        delegatedFrom: delegatedFrom,
907        statusParticipants: (objEvent.sizeAttendees != "") ? objEvent.statusAttendees : statusParticipants,
908        sizeAttendeeLimit: (objEvent.sizeAttendees != "") ? objEvent.sizeAttendees : false
909        };
910    });
911    return (notArray ? res[0] : res);
912    }
913});
914
915function decodeHistoric ( evt ) {
916    var historic = evt.historic;
917    var decoded = [];
918    var attributeDecoded = {
919        'startTime': 'Data de inicio',
920        'endTime' : 'Data de fim',
921        'summary' : 'Título',
922        'description': 'Descrição',
923        'status': 'Status',
924        'percentage': 'Porcentagem',
925        'priority': 'Prioridade',
926        'due' : 'Previsão de término'
927    };
928   
929    var statusDecoded = {
930        1: 'Sem ações',
931        2: 'Em processo',
932        3: 'Finalzada',
933        4: 'Cancelada'
934    };
935
936    var decodeDate = function(time){
937        return new Date( parseInt( time) ).setTimezoneOffset( Timezone.timezone( evt.timezone ) ).toString( User.preferences.dateFormat+' - '+User.preferences.hourFormat );
938    };
939
940    var decodeItem = function(historic){
941        switch(historic.attribute){
942            case 'startTime':
943            case 'endTime' :
944            case 'due':
945                return {
946                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
947                    attribute : attributeDecoded[historic.attribute],
948                    beforeValue : decodeDate(historic.beforeValue),
949                    afterValue : decodeDate(historic.afterValue),
950                    time: decodeDate(historic.time)
951                }
952            break;
953            case 'participant':
954                return{
955                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
956                    attribute : historic.beforeValue == '' ? ('Novo participante') : ('Rem. participante'),
957                    beforeValue : historic.beforeValue == '' ? '' : historic.beforeValue.mail,
958                    afterValue : historic.afterValue == '' ? '' : historic.afterValue.mail,
959                    time: decodeDate(historic.time)
960                }
961            break;
962            case 'attachment':
963                return{
964                    user : $.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
965                    attribute : historic.beforeValue == '' ? ('Novo anexo') : ('Rem. anexo'),
966                    beforeValue : historic.beforeValue,
967                    afterValue : historic.afterValue,
968                    time: decodeDate(historic.time)
969                }
970            case 'percentage':
971                    return{
972                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
973                    attribute :attributeDecoded[historic.attribute],
974                    beforeValue : historic.beforeValue+' %',
975                    afterValue : historic.afterValue+' %',
976                    time: decodeDate(historic.time)
977                }
978            case 'status':
979                    return{
980                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
981                    attribute :attributeDecoded[historic.attribute],
982                    beforeValue : statusDecoded[historic.beforeValue],
983                    afterValue : statusDecoded[historic.afterValue],
984                    time: decodeDate(historic.time)
985                }
986            break;
987            default:
988                return {
989                    user : $.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
990                    attribute : attributeDecoded[historic.attribute],
991                    beforeValue : historic.beforeValue,
992                    afterValue : historic.afterValue,
993                    time: decodeDate(historic.time)
994                }
995            break;
996
997        }
998    }
999
1000    for(var i = 0; i < historic.length; i++)
1001        decoded.push(decodeItem(historic[i]));
1002
1003    return decoded;
1004
1005}
1006
1007DataLayer.codec( "schedulable", "taskSearch", {
1008
1009    decoder: function( evtObj ){
1010
1011    },
1012
1013    encoder: function( evtObj ){
1014
1015    var notArray = false;
1016     
1017    if( notArray = $.type(evtObj) !== "array" )
1018        evtObj = [ evtObj ];
1019
1020    var res = $.map(evtObj, function( objEvent ){           
1021           
1022        if(!(typeof(objEvent) == 'object'))
1023            return (null);
1024
1025        return {
1026            id: objEvent.id,
1027            summary: objEvent.summary,
1028            description: !!objEvent.summary ? objEvent.summary : objEvent.description,
1029            startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1030            startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
1031            endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1032            endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
1033            dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1034            dueTime: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.due)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
1035            allDay: !!parseInt( objEvent.allDay ),
1036            percentage: (objEvent.percentage) ? objEvent.percentage : '0',
1037                        status: objEvent.status,
1038                        priority: objEvent.priority
1039        }
1040    });
1041    return (notArray ? res[0] : res);
1042    }
1043});
1044
1045DataLayer.codec( "schedulable", "activity", {
1046
1047    decoder: function( evtObj ){
1048    Encoder.EncodeType = "entity";
1049   
1050    if( notArray = $.type(evtObj) !== "array" )
1051        evtObj = [ evtObj ];
1052
1053    var pref = User.preferences;
1054
1055    var res = $.map(evtObj, function( form ){
1056   
1057        var tzId =  form.timezone || Calendar.signatureOf[form.group].calendar.timezone || User.preferences.timezone,
1058        formatString = pref.dateFormat + " " + pref.hourFormat;
1059
1060        var decodeParticipants = function(attend){
1061            return [DataLayer.merge(
1062                { 
1063                    user: User.me.id,
1064                    isOrganizer: 1,
1065                    acl: 'row',
1066                    alarms: $.map( form.alarmTime || [], function( alarmTime, i ){
1067                        if( alarmTime === "" )
1068                            return( null );
1069                        return !!form.alarmId[i] ? {
1070                            type: form.alarmType[i],
1071                            unit: form.alarmUnit[i],
1072                            time: form.alarmTime[i],
1073                            id: form.alarmId[i]
1074                            }:
1075
1076                            {
1077                            type: form.alarmType[i],
1078                            unit: form.alarmUnit[i],
1079                            time: form.alarmTime[i]
1080                            };
1081                    })
1082                }, attend != '0' ? {id: attend} : {})];
1083        };
1084
1085        return DataLayer.merge({
1086        "class": form["class"],
1087        startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
1088        endTime:  (form.dueDate == '' )? 0 : Date.parseExact(form.dueDate + " "+$.trim(form.dueHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
1089        due: (form.dueDate == '' )? 0 : Date.parseExact(form.dueDate + " "+$.trim(form.dueHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
1090        allDay: ( !!form.allDay ? 1 : 0 ),     
1091        status: form.activityStatus,     
1092        id: form.idActivity,
1093        type: !!form.type ?  form.type : 2,
1094        percentage: form.percentage,
1095        priority: form.priority,
1096        category: form.category,
1097        summary: form.summary == '' ? 'Atividade sem título' : form.summary,
1098        description: form.description,
1099        timezone: tzId,
1100        attachments: $.map(form.attachment || [], function( attachment, i ){
1101            return {
1102            attachment: attachment
1103            }
1104        }),
1105        participants: decodeParticipants(form.idAttendee),
1106        taskToActivity:$.map( form.idtask || [], function( task, i ){
1107
1108            return DataLayer.merge({
1109                task: task,
1110                owner: User.me.id
1111            }, form.idTaskToActivity[i] != '' ? {id: form.idTaskToActivity[i]} : {});
1112
1113        })
1114        }, form.lastGroup ? (( form.lastGroup == form.group ) ? {} : {calendar: form.group, lastGroup: form.lastGroup}) : {calendar: form.group});
1115    });
1116
1117    return notArray ? res[0] : res;
1118    },
1119
1120    encoder: function( evtObj ){
1121
1122    var notArray = false;
1123     
1124    if( notArray = $.type(evtObj) !== "array" )
1125        evtObj = [ evtObj ];
1126   
1127    var res = $.map(evtObj, function( objEvent ){           
1128           
1129        if(!(typeof(objEvent) == 'object'))
1130            return (null);
1131       
1132        var historic = [];
1133                var alarmsActivity = [];
1134        var decodeTasks = function(obj){
1135
1136            var tasks = {}, task = {};
1137
1138            for(var i =0; i < obj.taskToActivity.length; i++){
1139
1140                taskToActivity = DataLayer.get('taskToActivity', obj.taskToActivity[i]);
1141                task = taskToActivity.task;
1142
1143                if($.type(task) != 'object')
1144                    task = DataLayer.get('schedulable', task);
1145
1146                //Resolve problemas com atualização na camada Cliente
1147                if(!$.isNumeric(task.startTime)){
1148                    DataLayer.remove('schedulable', task.id, false);
1149                    task = DataLayer.get('schedulable', task.id);
1150                }
1151
1152                tasks[task.id] = {
1153                    taskToActivity: taskToActivity.id,
1154                    allDay: !!parseInt(task.allDay),
1155                    dueDate: (!task.due || task.due == '' || task.due == '0') ? '' : new Date( parseInt(task.due) ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ),
1156                    dueTime: (!task.due || task.due == '' || task.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(task.due)), task.timezone, obj.calendar, obj.DayLigth, 'startTime'), User.preferences.hourFormat),
1157                    startDate: new Date( parseInt(task.startTime) ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ),
1158                    startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(task.startTime)), task.timezone, task.calendar, obj.DayLigth, 'startTime'), User.preferences.hourFormat),
1159                    endDate: new Date( parseInt(task.endTime) - (!!parseInt(task.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ),
1160                    endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(task.endTime)),  task.timezone, obj.calendar, obj.DayLigth, 'endTime'), User.preferences.hourFormat),
1161                                        status: task.status,
1162                                        percentage: task.percentage,
1163                                        priority: task.priority,
1164                                        summary: task.summary
1165                }
1166
1167                tasks[task.id].description = tasks[task.id].startDate + ' - ' + (!!task.summary ? task.summary : task.description);
1168
1169                historic.push({'task': (!!task.summary ? task.summary : task.description) , 'historic': decodeHistoric(task)});
1170            }
1171
1172            tasks.length = obj.taskToActivity.length;
1173            return tasks;
1174
1175        };
1176
1177        return {
1178        "class": objEvent["class"],
1179        id: objEvent.id,
1180        location: objEvent.location,
1181        category: objEvent.category,
1182        status: objEvent.status,
1183        groups: Calendar.groups,
1184        group: objEvent.group ? objEvent.group : objEvent.calendar,
1185        summary: objEvent.summary,
1186        type: !!objEvent.type ? objEvent.type : 2,
1187        description: objEvent.description,
1188        timezone: objEvent.timezone,
1189        timezones: Timezone.timezones,
1190        percentage: (objEvent.percentage) ? objEvent.percentage : '0',
1191        priority: objEvent.priority,
1192        startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1193        startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
1194        endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1195        endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
1196        dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1197        dueTime: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.due)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
1198        allDay: !!parseInt( objEvent.allDay ),
1199        historic: historic,
1200        tasks: objEvent.taskToActivity ? decodeTasks(objEvent) : {},
1201        attachments: $.map(objEvent.attachments || [], function( attachment, i ){
1202            var attach = DataLayer.get('schedulableToAttachment', attachment, false);
1203            //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o
1204            if(!attach.name) return(null);
1205           
1206            var ext = attach.name.split('.');
1207            attach.name = attach.name.length < 10 ?  attach.name : ( ext.length == 1 ? attach.name.substr(0, 10) : (attach.name.substr(0, 6) + '.' +  ext[ext.length -1]));
1208            attach.size = formatBytes(attach.size);
1209            return attach;
1210        }),
1211        me : User.me,
1212        attendee: $.map(objEvent.participants || [], function( participant, i ){                       
1213
1214            var attend = DataLayer.get('participant', (participant.id || participant));
1215            attend.user = DataLayer.get('user', attend.user);
1216
1217            return {
1218                id: attend.id,
1219                alarms : $.map(attend.alarms || [], function( alarm ){
1220                    var alarm = DataLayer.get('alarm', alarm);
1221                                                        alarmsActivity.push(alarm == "" ? (null) : alarm);
1222                    return (alarm == "" ? (null) : alarm);
1223                })
1224            };
1225        }),
1226                alarms: alarmsActivity
1227        };
1228    });
1229    return (notArray ? res[0] : res);
1230    }
1231});
1232
1233function decodeOwnerCalendar(calendar){
1234    if(calendar && !parseInt(Calendar.signatureOf[calendar].isOwner)){
1235        var Owner = DataLayer.get('calendarSignature', {
1236            filter: ['AND', ['=','calendar', calendar], ['=','isOwner','1']],
1237            criteria: {
1238                deepness: 2
1239            }
1240        });
1241
1242    if($.isArray(Owner))
1243        Owner = Owner[0];
1244       
1245    return Owner.user;
1246}
1247return User.me;
1248
1249   
1250}
1251
1252function decodeRepeat ( form ) {
1253
1254    var patati = {};
1255       
1256    if( form.repeatId )
1257        patati['id'] = form.repeatId;
1258
1259    patati['frequency'] = form.frequency;
1260
1261    patati['bymonthday'] = patati['byyearday'] = patati['byday'] = '';
1262       
1263    patati['interval'] = 1 ,
1264   
1265    patati['endTime'] = patati['count'] = patati['startTime'] = 0;
1266       
1267    if( form.frequency === 'none' )
1268        return( patati );
1269       
1270    var day = [];
1271
1272    $("input[type=checkbox][name='repeatweekly[]']:checked").each(function() {
1273        day[ day.length ] = $(this).val();
1274    });
1275
1276    patati['byday'] = day.join(',');
1277
1278    var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat;
1279
1280    var date = Date.parseExact( form.startDate + " "+$.trim(form.startHour) , formatString )
1281   
1282    patati['startTime'] = date.toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00');
1283       
1284    if( !patati['byday'] )
1285        switch(form.frequency) {
1286            case 'weekly':
1287                break;
1288            case 'daily':
1289                break;
1290            case 'monthly':
1291                patati['bymonthday'] = date.getDate();
1292                break;
1293            case 'yearly':
1294                patati['byyearday'] = (1 + date.getDayOfYear());
1295                break;
1296            default :
1297                return patati;
1298        }
1299
1300    if (($(".endRepeat").val() == 'occurrences'))
1301        patati['count'] = $(".occurrencesEnd").val();
1302       
1303    if (($(".endRepeat").val() == 'customDate'))
1304        patati['endTime'] = Date.parseExact( $(".customDateEnd").val() + (" "+$.trim(form.endHour)) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00');
1305       
1306    patati['interval']  = $(".eventInterval").val();
1307
1308    /**
1309        wkst = [ 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU' ]
1310        weekno = number
1311        minute = number
1312        second = number
1313        yearday = number
1314        monthday = number
1315        setpos = number
1316        day = number
1317        hour = number
1318        interval = number
1319        frequency = [ 'monthly', 'daily', 'weekly', 'yearly', 'hourly', 'minutely', 'secondly' ]
1320        endTime = milliseconds
1321    */   
1322    return( patati );
1323     
1324}
1325
1326
1327
1328function encodeRepeat( repeat ){
1329 
1330    if( !repeat )
1331        return( false );
1332    if(typeof(repeat) == "object")
1333        return repeat;
1334
1335    return DataLayer.get( 'repeat', repeat );
1336}
1337
1338DataLayer.codec( "schedulable", "detail", {
1339
1340    decoder: function( evtObj ){
1341               
1342        Encoder.EncodeType = "entity";
1343       
1344        if( notArray = $.type(evtObj) !== "array" )
1345            evtObj = [ evtObj ];
1346
1347        var pref = User.preferences;
1348
1349        var res = $.map(evtObj, function( form ){
1350   
1351            var tzId =  form.timezone || Calendar.signatureOf[form.calendar].calendar.timezone || User.preferences.timezone,
1352
1353            formatString = pref.dateFormat + " " + pref.hourFormat;
1354
1355            var Owner = decodeOwnerCalendar(form.calendar);
1356
1357            return DataLayer.merge({
1358                "class": form["class"],
1359                startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
1360                endTime:  Date.parseExact(form.endDate + " "+$.trim(form.endHour), formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),  //+ (!!form.allDay ? 86400000 : 0) ,
1361                allDay: ( !!form.allDay ? 1 : 0 ),       
1362                id: form.idEvent,
1363                location: form.location,
1364                type: 1,
1365                category: form.category,
1366                priority: form.priority,
1367                summary: form.summary == '' ? 'Evento sem título' : form.summary,
1368                description: form.description,
1369                timezone: tzId,
1370                attachments: $.map(form.attachment || [], function( attachment, i ){
1371                    return {
1372                        attachment: attachment
1373                    }
1374                }),
1375                repeat: this.decodeRepeat( form ),
1376                participants: $.map( form.attendee || [], function( attendee, i ){
1377
1378                    if( !attendee || attendee === "" )
1379                        return( null );
1380
1381                    var participant = {};
1382                    participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
1383
1384                    if( participant.user === Owner.id ){
1385                        return DataLayer.merge({
1386                            id: attendee,
1387                            isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
1388                            acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', ''),
1389                            alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){
1390                                if( alarmTime === "" )
1391                                    return( null );
1392                                return !!form.alarmId[i] ? {
1393                                    type: form.alarmType[i],
1394                                    unit: form.alarmUnit[i],
1395                                    time: form.alarmTime[i],
1396                                    id: form.alarmId[i]
1397                                    }:
1398
1399                                    {
1400                                    type: form.alarmType[i],
1401                                    unit: form.alarmUnit[i],
1402                                    time: form.alarmTime[i]
1403                                    };
1404                            }),
1405                            status: !!form.status ? form.status : 3
1406                        }, (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '')  ? {
1407                            delegatedFrom: form.delegatedFrom[i]
1408                            } : {});
1409                    }else{
1410                        return DataLayer.merge({
1411                            id: attendee,
1412                            acl: form.attendeeAcl[i],
1413                            isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
1414                            isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
1415                            acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', '')
1416                        }, (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '') ? {
1417                            delegatedFrom: form.delegatedFrom[i]
1418                            } : {});
1419                    };
1420                })
1421            }, form.lastCalendar ? (( form.lastCalendar == form.calendar ) ? {} : {calendar: form.calendar, lastCalendar: form.lastCalendar}) : {calendar: form.calendar});
1422        });
1423
1424        return notArray ? res[0] : res;
1425    },
1426
1427
1428    encoder: function( evtObj ){
1429       
1430        if(!(!!evtObj))
1431            return undefined;
1432
1433        var notArray = false;
1434                 
1435        if( notArray = $.type(evtObj) !== "array" )
1436            evtObj = [ evtObj ];
1437
1438        var pref = User.preferences;
1439    var res = [];
1440
1441    for(var i = 0; i < evtObj.length; i++){
1442           res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i]));
1443    }
1444
1445        if( !notArray ){
1446            var dates = {};
1447            var typeRepeat = {
1448                'none': false,
1449                'daily': 'Repetição diária',
1450                'weekly': 'Repetição semanal',
1451                'monthly': 'Repetição mensal',
1452                'yearly': 'repetição anual'
1453            }
1454
1455            for (var i=0; i < res.length; i++) {
1456
1457        res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type;
1458                         
1459                var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
1460                var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
1461                         
1462                var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() );
1463               
1464                var occurrences = [ startDate.getTime() ];
1465                               
1466                if( res[i].occurrences )
1467                {
1468                    occurrences = res[i].occurrences;
1469                }
1470
1471                for( var ii = 0; ii < occurrences.length; ii++ )
1472                {
1473                    var currentDate = new Date( occurrences[ii] );
1474                    var counter = currentDate.clone();
1475                                   
1476                    var res2 = $.extend( {}, res[i], {
1477                        'startDate': currentDate.toString( User.preferences.dateFormat ),
1478                        'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat )
1479                        } );
1480
1481                    if(res[i].repeat)
1482                res2.repeat = typeRepeat[res[i].repeat.frequency];
1483                                 
1484                    while (counter.compareTo( currentDate ) == 0) {
1485
1486                        if (!dates[counter.toString(User.preferences.dateFormat)])
1487                            dates[counter.toString(User.preferences.dateFormat)] = {
1488                                startDate:false,
1489                                events:[]
1490                            };
1491                        if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
1492                            dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
1493
1494                        dates[counter.toString(User.preferences.dateFormat)].events.push(res2);
1495                        counter.addDays(-1);
1496                    }     
1497                }
1498            }
1499            res = {
1500                events_list: dates,
1501                count : res.length
1502            };
1503        }
1504
1505        return notArray ? res[0] : res;
1506    }
1507
1508});
1509
1510
1511DataLayer.codec( "schedulable", "print", {
1512
1513    decoder: function( evtObj ){
1514
1515    },
1516
1517
1518    encoder: function( evtObj ){
1519   
1520    if(!(!!evtObj))
1521        evtObj = [];
1522
1523    var notArray = false;
1524         
1525    if( notArray = $.type(evtObj) !== "array" )
1526        evtObj = [ evtObj ];
1527
1528    var pref = User.preferences;
1529    var res = [];
1530
1531    for(var i = 0; i < evtObj.length; i++){
1532       res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i]));
1533    }
1534
1535    if( !notArray ){
1536        var dates = {};
1537
1538        var typeRepeat = {
1539        'none': false,
1540        'daily': 'Repetição diária',
1541        'weekly': 'Repetição semanal',
1542        'monthly': 'Repetição mensal',
1543        'yearly': 'repetição anual'
1544        }
1545
1546        for (var i=0; i < res.length; i++) {
1547                        res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type;
1548               
1549            var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
1550            var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
1551                 
1552            var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() );
1553           
1554            var occurrences = [ startDate.getTime() ];
1555                   
1556            if( res[i].occurrences )
1557            {
1558                occurrences = res[i].occurrences;
1559            }
1560
1561            for( var ii = 0; ii < occurrences.length; ii++ )
1562            {
1563                var currentDate = new Date( occurrences[ii] );
1564                var counter = currentDate.clone();
1565                       
1566                var res2 = $.extend( {}, res[i], {
1567                    'startDate': currentDate.toString( User.preferences.dateFormat ),
1568                    'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat )
1569                });
1570
1571                if(res[i].repeat)
1572                    res2.repeat = typeRepeat[res[i].repeat.frequency];
1573                     
1574                var index = dateCalendar.dayNames[counter.getDay()] +' '+counter.toString('dd/MM');
1575
1576                if(!dates[index] || !$.isArray(dates[index].events))
1577                    dates[index] = {events:  []};                   
1578
1579                                res2['isOneDay'] = res2.startDate == res2.endDate ? true : false;
1580
1581                dates[index].events.push(res2);
1582                 
1583            }
1584        }
1585
1586        var calendarView = $('#calendar').fullCalendar('getView');
1587        var start = calendarView.start.getTime();
1588        var end = (calendarView.end.getTime() - (calendarView.name == 'month' ? 86400000 : 0 ));
1589        var next = start;
1590        var response = [];
1591        while (next){
1592            var index = dateCalendar.dayNames[new Date(next).getDay()] +' '+ new Date(next).toString('dd/MM');
1593           
1594            var event = {};
1595            event[index] = {events: dates[index] ? dates[index].events : false};
1596
1597            response[response.length] = event;
1598            next = (next + 86400000) > end ? false : (next + 86400000);
1599        }
1600        res = {events: response};
1601    }
1602
1603    return notArray ? res[0] : res;
1604    }
1605
1606});
1607
1608DataLayer.codec( "participant", "detail", {
1609 
1610    encoder: function( participants ){
1611
1612        var result = {};
1613        for( var i = 0; i< participants.length; i++ ){
1614            result[ participants[i].user.id || participants[i].user ] = participants[i];
1615        }
1616        return( result );
1617    }
1618});
1619
1620DataLayer.codec( "calendar", "list", {
1621 
1622    encoder: function( calendars ){
1623
1624        var result = {
1625            my_calendars: [],
1626            others_calendars: []
1627        };
1628
1629        for( var i = 0; i < calendars.length; i++ )
1630        {
1631            !!Calendar.signatureOf[ calendars[i].id ].isOwner ?
1632            result.my_calendars.push( calendars[i] ) :
1633            result.others_calendars.push( calendars[i] );
1634        }
1635
1636        return {
1637            agendas_usuario: result
1638        };
1639
1640    }
1641
1642});
1643
1644DataLayer.codec( "schedulable", "calendar", {
1645
1646    decoder:function( evtObj ){
1647       
1648        if( notArray = $.type(evtObj) !== "array" )
1649            evtObj = [ evtObj ];
1650       
1651        var res = $.map(evtObj, function( evt ){
1652
1653            return {
1654                id: evt.id,
1655                summary: evt.title,
1656                startTime: evt.start.getTime(),
1657                endTime: ( !!evt.allDay ? (( evt.end || evt.start ).getTime() + 86400000) :( evt.end || evt.start ).getTime()),
1658                allDay: ( !!evt.allDay ? 1 : 0 )
1659            /*calendar: evt.id && User.calendarOf[ evt.id ].id*/ };
1660        });
1661
1662        return notArray ? res[0] : res;
1663    },
1664
1665    encoder: function( evtObj, filter ){
1666     
1667        if( !evtObj )
1668            return( false );
1669
1670        var filtered = evtObj;
1671        //
1672        var grouped = {};
1673
1674        $.map(filtered, function( evt ){
1675               
1676            if(!(typeof(evt) == 'object') || (evt.id.indexOf('java') >= 0))
1677                        return (null);
1678
1679            evt.calendar = evt.calendar || "1";
1680
1681            if( !grouped[ evt.calendar ] )
1682                        grouped[ evt.calendar ] = [];
1683                       
1684            var calendar = DataLayer.get('calendar', evt.calendar);
1685               
1686                var taskEditable = function(idTask){
1687                        for(var i = 0; i < evt.participants.length; i++){
1688                                attendee = DataLayer.get('participant', evt.participants[i]);
1689                                if(attendee.user == User.me.id)
1690                                        return attendee.isOrganizer == '1' ?
1691                                        {
1692                                                editable: true,
1693                                                disableResizing: false,
1694                                                disableDragging: false,
1695                                                className: 'fullcalendar-context-menu  event-type-2 event-id-'+idTask+' calendar-id-'+calendar.id
1696                                        }
1697                                        :
1698                                        {
1699                                                editable: false,
1700                                                disableResizing: true,
1701                                                disableDragging: true,
1702                                                className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idTask
1703                                        };
1704                        }
1705                }
1706               
1707            var eventEditable = function(idEvent, isRecurrence, Recurrence){
1708                        if(Calendar.signatureOf[calendar.id].isOwner == "1"){
1709                                var attendee = {};
1710                                for(var i = 0; i < evt.participants.length; i++){
1711                                        attendee = DataLayer.get('participant', evt.participants[i]);
1712                                        if(attendee.user == User.me.id)
1713                                                return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ?
1714                                                {
1715                                                        selectable: true,
1716                                                        className: 'fullcalendar-context-menu  event-type-1 event-id-'+idEvent+' calendar-id-'+calendar.id+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '')
1717                                                } : {
1718                                                        editable: false,
1719                                                        selectable: true ,
1720                                                        className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent
1721                                                };
1722                                }
1723                                return {
1724                                        editable: false,
1725                                        className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent+' calendar-id-'+calendar.id, 
1726                                        selectable: true,
1727                                        disableDragging: isRecurrence
1728                                };
1729                        }
1730                        else{
1731                                var aclSignature = Calendar.signatureOf[calendar.id].permission;
1732                                       
1733                                var mountClass =  function(acl){
1734                                        var returns = ""
1735                                        returns += acl['write'] ? "" :  'blocked-event-permision ';
1736                                        returns += acl['busy'] ? 'fullcalendar-not-context-menu ' : (acl['read']  ?  'fullcalendar-context-menu '+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') : '');
1737                                        returns += 'event-id-'+idEvent+' calendar-id-'+calendar.id;
1738                                        return returns;
1739                                }
1740                               
1741                                return DataLayer.merge({
1742                                        editable: aclSignature.acl['write'] && !isRecurrence,
1743                                        disableResizing : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true : false),
1744                                        disableDragging  : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true: false),
1745                                        className: mountClass(aclSignature.acl)
1746                                        }, aclSignature.acl['busy'] ?
1747                                        {
1748                                                title: 'Ocupado',
1749                                                selectable: false
1750                                        } : {
1751                                                selectable: true
1752                                        }
1753                                );     
1754                        }
1755            }
1756
1757                var duration =parseInt( evt.DayLigth.calendar.endTime ) - parseInt( evt.DayLigth.calendar.startTime ), isRepeat = false;
1758
1759        var occurrences = [];
1760               
1761                if( evt.occurrences )
1762                {
1763                        isRepeat = true;
1764                        occurrences = evt.occurrences;
1765            }else
1766                        occurrences[ occurrences.length ] = evt.DayLigth.calendar.startTime;
1767
1768        //occurrences = DataLayer.unique( occurrences ).sort();
1769                var typeEvent; 
1770            for( var i = 0; i < occurrences.length; i++ )
1771                {
1772            typeEvent = (evt.type == 2 && evt.taskToActivity ? 3 : evt.type)
1773                grouped[ evt.calendar ].push( DataLayer.merge(
1774                {
1775                                id: evt.URI || evt.id+ '-' + i,
1776                                title: Encoder.htmlDecode(evt.summary),
1777                                start: Timezone.getDateObjCalendar( occurrences[i], 'start', evt.allDay),
1778                end:   Timezone.getDateObjCalendar( (parseInt( occurrences[i] ) + duration), 'end', evt.allDay),
1779                allDay: parseInt( evt.allDay ),
1780                                isRepeat: isRepeat,
1781                                occurrence: i,
1782                                type: typeEvent,
1783                                calendar: evt.calendar
1784                                }, (parseInt(typeEvent) == 1 ? eventEditable(evt.id, isRepeat, i ) : (parseInt(typeEvent) == 2 ? taskEditable(evt.id) : {editable: false, disableResizing: true, disableDragging: true}))));
1785        }
1786        });
1787
1788        return(/* notArray ? filtered[0] :*/ grouped );
1789    },
1790   
1791    criteria: function( filter ){
1792     
1793        if( $.type(filter.start) !== 'date' )
1794            filter.start = new Date( filter.start * 1000 );
1795        if( $.type(filter.end) !== 'date' )
1796            filter.end = new Date( filter.end * 1000 );
1797
1798        var timezone = {};
1799        for(var i in Calendar.signatureOf)
1800            timezone[i] = Calendar.signatureOf[i].calendar.timezone;
1801       
1802        return {
1803            filter: ['AND',
1804                        ['OR',
1805                            ['AND',
1806                                ['>=', 'rangeEnd', filter.start.getTime()],
1807                                ['<=', 'rangeEnd', filter.end.getTime()]
1808                            ],
1809                            ['AND',
1810                                ['>=', 'rangeStart', filter.start.getTime()],
1811                                ['<=', 'rangeStart', filter.end.getTime()]
1812                            ],
1813                            ['AND',
1814                                ['<=', 'rangeStart', filter.start.getTime()],
1815                                ['>=', 'rangeEnd', filter.end.getTime()]
1816                            ]
1817                        ],
1818                        ['IN', 'calendar',  $.merge( Calendar.calendarIds, Calendar.groupIds )]
1819                ],
1820            criteria: {
1821                deepness: 2,
1822                timezones: timezone
1823            }
1824        }
1825}
1826});
1827
1828
1829DataLayer.codec( "preference", "detail", {
1830 
1831    decoder:function( pref ){
1832       
1833        var res = [];
1834
1835        pref.defaultAlarm = $.map( pref.alarmTime || [], function( alarmTime, i ){
1836                 
1837            return {
1838                type: pref.alarmType[i],
1839                time: alarmTime,
1840                unit: pref.alarmUnit[i]
1841                };
1842        });
1843
1844        $.each( pref, function( i, el ){
1845
1846            res[ res.length ] = {
1847                name: i,
1848                value: el
1849            };
1850
1851        });
1852               
1853        return( res );
1854     
1855    },
1856
1857    encoder:function( pref ){
1858        return( pref );
1859    }
1860
1861});
1862
1863DataLayer.codec( "schedulable", "export", {
1864 
1865    decoder: function(){},
1866     
1867    encoder: function( signatures ){},
1868     
1869    criteria: function( filter ){
1870       
1871        if( isCal  = filter && filter.calendar )
1872            filter = filter.calendar;
1873        return {
1874            filter: filter ? [  "=", ( isCal ? "calendar" : "id" ), filter ] : false,
1875            criteria: {
1876                format: 'iCal',
1877                deepness: 2
1878            }
1879        };
1880    }
1881});
1882
1883User.init();
1884
1885// DataLayer.decoder( "participant", "detail", function( form ){
1886// 
1887// //     if( $.type( attObj ) !== "array" ){
1888// //   notArray = true;
1889// //   attObj = [ attObj ];
1890// //     }
1891//
1892//     
1893//
1894//     return( participants );
1895//
1896// });
1897
1898// DataLayer.decoder( "alarm", "detail", function( form ){
1899//
1900// //       if( $.type( attObj ) !== "array" ){
1901// //       notArray = true;
1902// //       attObj = [ attObj ];
1903// //     }
1904//
1905//     var alarms = [];
1906//
1907//     if( form.alarmType /*&& !form.*/ )
1908//      for( var i = 0; i < form.alarmType.length; i++ )
1909//      {
1910//          if( form.alarmTime[i] === "" )
1911//              continue;
1912//       
1913//          alarms[i] = { type: form.alarmType[i],
1914//                        unit: form.alarmUnit[i],
1915//                        time: form.alarmTime[i] };
1916//      }
1917//
1918//     return( alarms );
1919//
1920// });
1921
Note: See TracBrowser for help on using the repository browser.