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

Revision 7164, 61.8 KB checked in by acoutinho, 12 years ago (diff)

Ticket #3062 - Incluir o uid do dono de uma agenda ao pesquisa-la

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    console.log(evtObj);
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: form.attendeeAcl[i].replace('o', '')
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        for( var i = 0; i < statusLabels.length; i++ )
570            statusParticipants[ statusLabels[i] ] = 0;
571       
572        var res = $.map(evtObj, function( objEvent ){                   
573                   
574            if(!(typeof(objEvent) == 'object'))
575                return (null);
576
577            var isAttendee = false;
578            var Owner = decodeOwnerCalendar(objEvent.calendar);
579
580            var participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy( Owner );
581                       
582            var constantAcl = function(acl){
583                var returns = {};
584                for (var i in constantsParticipant){
585                    returns[constantsParticipant[i]] = acl.indexOf(i) >= 0 ? true : false
586                }
587                return returns;
588            };
589
590            var isShared = !objEvent.id ? false : (!!objEvent.calendar) && parseInt(Calendar.signatureOf[objEvent.calendar].isOwner) ? false : true;
591            var limitAttendee = false;
592
593            return {
594                "class": objEvent["class"],
595                id: objEvent.id,
596                repeat: encodeRepeat( objEvent.repeat ),
597                location: objEvent.location,
598                category: objEvent.category,
599                calendars: Calendar.calendars,
600                calendar: objEvent.calendar,
601                summary: objEvent.summary,
602        type: !!objEvent.type ? objEvent.type : 1,
603                description: objEvent.description,
604                timezone: objEvent.timezone,
605                timezones: Timezone.timezones,
606                startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
607                startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
608                endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
609                endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
610                allDay: !!parseInt( objEvent.allDay ),
611                dueDate: objEvent.dueDate,
612                dueTime: objEvent.dueTime,
613                priority: objEvent.priority,
614                attachments: $.map(objEvent.attachments || [], function( attachment, i ){
615                    var attach = DataLayer.get('schedulableToAttachment', attachment, false);
616                    //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o
617                    if(!attach.name) return(null);
618                   
619                    var ext = attach.name.split('.');
620                    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]));
621                    attach.size = formatBytes(attach.size);
622                    return attach;
623                }),                                             
624                attendee: $.map(objEvent.participants || [], function( participant, i ){                                               
625
626                    if(delegateAttendee[participant])
627                        return(null);
628
629                    var attend = DataLayer.get('participant', (participant.id || participant));
630                    attend.user = DataLayer.get('user', attend.user);
631
632                    statusParticipants[ statusLabels[attend.status] ]++;       
633
634                    if(attend.user.mail == User.me.mail)
635                        isAttendee = true;
636
637                    if( attend.user.id ===  me.id ){
638                        participantInfo.user = {
639                            id: attend.id,
640                            status : attend.status,
641                            delegatedFrom: attend.delegatedFrom || '0',
642                            acl: attend.acl,
643                            receiveNotification : attend.receiveNotification,
644                            alarms : $.map(attend.alarms || [], function( alarm ){
645                                var alarm = DataLayer.get('alarm', alarm);
646                                return (alarm == "" ? (null) : alarm);
647                            })
648                        };
649                        me = attend;
650                        return(null);
651                    };
652
653                    var person = {
654                        id: attend.id,
655                        name: attend.user.name != 'false' ? attend.user.name : '',
656                        mail: attend.user.mail,
657                        status : attend.status,
658                        isExternal: attend.isExternal,
659                        acl: attend.acl,
660                        delegatedFrom: attend.delegatedFrom
661                    };
662
663                    if(!!parseInt(attend.delegatedFrom)){
664                        delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person);
665                        return(null);
666                    }
667
668                    if( !!parseInt(attend.isOrganizer )){
669                        participantInfo.organizer = DataLayer.copy(person);
670                        return(null);
671                    };                                 
672
673                    return (person);
674                }),
675                organizer: participantInfo.organizer || me,
676                alarms: !!participantInfo.user ? participantInfo.user.alarms : [],
677                status: !!participantInfo.user ? participantInfo.user.status : 1,
678                acl: constantAcl(me.acl || 'roiw'),
679                isShared: isShared,
680                isAttendee: (isAttendee ? true : (objEvent.id && isShared ? false : true)),
681                me: me,
682                delegatedFrom: delegatedFrom,
683                statusParticipants: (objEvent.sizeAttendees != "") ? objEvent.statusAttendees : statusParticipants,
684                sizeAttendeeLimit: (objEvent.sizeAttendees != "") ? objEvent.sizeAttendees : false
685            };
686        });
687        return (notArray ? res[0] : res);
688    }
689});
690
691DataLayer.codec( "schedulable", "task", {
692
693    decoder: function( evtObj ){
694    Encoder.EncodeType = "entity";
695   
696    if( notArray = $.type(evtObj) !== "array" )
697        evtObj = [ evtObj ];
698
699    var pref = User.preferences;
700
701    var res = $.map(evtObj, function( form ){
702   
703        var tzId =  form.timezone || Calendar.signatureOf[form.group].calendar.timezone || User.preferences.timezone,
704
705        formatString = pref.dateFormat + " " + pref.hourFormat;
706
707        return DataLayer.merge({
708        "class": form["class"],
709        startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
710        endTime: (form.dueDate == '' ) ?
711            Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00') :
712            Date.parseExact(form.dueDate + " "+$.trim(form.dueTime) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
713        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'),
714        allDay: ( form.dueDate == ''  ? 1 : 0 ),
715        status: form.taskStatus,     
716        id: form.idTask,
717        location: form.location,
718        type: !!form.type ?  form.type : 2,
719        percentage: form.percentage,
720        priority: form.priority,
721        category: form.category,
722        summary: form.summary == '' ? 'Tarefa sem tï¿œtulo' : form.summary,
723        description: form.description,
724        timezone: tzId,
725        attachments: $.map(form.attachment || [], function( attachment, i ){
726            return {
727            attachment: attachment
728            }
729        }),
730        participants: $.map( form.attendee || [], function( attendee, i ){
731
732            if( !attendee || attendee === "" )
733            return( null );
734
735            var participant = {};
736            participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
737
738            if( participant.user === User.me.id ){
739            return DataLayer.merge({
740                id: attendee,
741                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
742                alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){
743                if( alarmTime === "" )
744                    return( null );
745                return !!form.alarmId[i] ? {
746                    type: form.alarmType[i],
747                    unit: form.alarmUnit[i],
748                    time: form.alarmTime[i],
749                    id: form.alarmId[i]
750                    }:
751
752                    {
753                    type: form.alarmType[i],
754                    unit: form.alarmUnit[i],
755                    time: form.alarmTime[i]
756                    };
757                }),
758                status: !!form.status ? form.status : 3
759            }, (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '')  ? {
760                delegatedFrom: form.delegatedFrom[i]
761                } : {});
762            }else{
763                return {
764                    id: attendee,
765                    isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
766                    isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0
767                    };
768            };
769        })
770        }, form.lastGroup ? (( form.lastGroup == form.group ) ? {} : {calendar: form.group, lastGroup: form.lastGroup}) : {calendar: form.group});
771    });
772
773    return notArray ? res[0] : res;
774    },
775
776    encoder: function( evtObj ){
777
778    var notArray = false;
779     
780    if( notArray = $.type(evtObj) !== "array" )
781        evtObj = [ evtObj ];
782
783    var statusParticipants = {},  isAttendee = false,
784   
785    statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ],
786
787    participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy( User.me );
788   
789    var delegateAttendee = {};
790   
791    for( var i = 0; i < statusLabels.length; i++ )
792        statusParticipants[ statusLabels[i] ] = 0;
793   
794    var res = $.map(evtObj, function( objEvent ){           
795           
796        if(!(typeof(objEvent) == 'object'))
797            return (null);
798
799        var limitAttendee = false;
800
801        return {
802        "class": objEvent["class"],
803        id: objEvent.id,
804        location: objEvent.location,
805        category: objEvent.category,
806        taskStatus: objEvent.status,
807        groups: Calendar.groups,
808        group: objEvent.group ? objEvent.group : objEvent.calendar,
809        summary: objEvent.summary,
810        type: !!objEvent.type ? objEvent.type : 2,
811        description: objEvent.description,
812        timezone: objEvent.timezone,
813        timezones: Timezone.timezones,
814        percentage: (objEvent.percentage) ? objEvent.percentage : '0',
815        priority: objEvent.priority,
816        startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
817        startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
818        endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
819        endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
820        dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
821        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),
822        allDay: !!parseInt( objEvent.allDay ),
823            historic: !!objEvent.historic ? decodeHistoric(objEvent) : [] ,
824        attachments: $.map(objEvent.attachments || [], function( attachment, i ){
825            var attach = DataLayer.get('schedulableToAttachment', attachment, false);
826            //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o
827            if(!attach.name) return(null);
828           
829            var ext = attach.name.split('.');
830            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]));
831            attach.size = formatBytes(attach.size);
832            return attach;
833        }),                     
834        attendee: $.map(objEvent.participants || [], function( participant, i ){                       
835
836            if(delegateAttendee[participant])
837                return(null);
838
839            var attend = DataLayer.get('participant', (participant.id || participant));
840            attend.user = DataLayer.get('user', attend.user);
841
842            statusParticipants[ statusLabels[attend.status] ]++;   
843
844            if(attend.user.mail == User.me.mail)
845                isAttendee = true;
846
847            if( attend.user.id ===  me.id ){
848                participantInfo.user = {
849                    id: attend.id,
850                    status : attend.status,
851                    delegatedFrom: attend.delegatedFrom || '0',
852                    acl: attend.acl,
853                    receiveNotification : attend.receiveNotification,
854                    alarms : $.map(attend.alarms || [], function( alarm ){
855                    var alarm = DataLayer.get('alarm', alarm);
856                    return (alarm == "" ? (null) : alarm);
857                    })
858                };
859                me = attend;
860                return(null);
861            };
862
863            var person = {
864                id: attend.id,
865                name: attend.user.name != 'false' ? attend.user.name : '',
866                mail: attend.user.mail,
867                status : attend.status,
868                isExternal: attend.isExternal,
869                acl: attend.acl,
870                delegatedFrom: attend.delegatedFrom
871            };
872
873            if(!!parseInt(attend.delegatedFrom)){
874                delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person);
875                return(null);
876            }
877
878            if( !!parseInt(attend.isOrganizer)){
879                participantInfo.organizer = DataLayer.copy(person);
880                return(null);
881            };                 
882
883            return (person);
884        }),
885        organizer: participantInfo.organizer || me,
886                isOrganizer: (participantInfo.organizer || me).id == me.id,
887        alarms: !!participantInfo.user ? participantInfo.user.alarms : [],
888        status: !!participantInfo.user ? participantInfo.user.status : 1,
889        isAttendee: isAttendee,
890        me: me,
891        delegatedFrom: delegatedFrom,
892        statusParticipants: (objEvent.sizeAttendees != "") ? objEvent.statusAttendees : statusParticipants,
893        sizeAttendeeLimit: (objEvent.sizeAttendees != "") ? objEvent.sizeAttendees : false
894        };
895    });
896    return (notArray ? res[0] : res);
897    }
898});
899
900function decodeHistoric ( evt ) {
901    var historic = evt.historic;
902    var decoded = [];
903    var attributeDecoded = {
904        'startTime': 'Data de inicio',
905        'endTime' : 'Data de fim',
906        'summary' : 'Tï¿œtulo',
907        'description': 'Descriᅵᅵo',
908        'status': 'Status',
909        'percentage': 'Porcentagem',
910        'priority': 'Prioridade',
911        'due' : 'Previsï¿œo de tï¿œrmino'
912    };
913   
914    var statusDecoded = {
915        1: 'Sem aᅵᅵes',
916        2: 'Em processo',
917        3: 'Finalzada',
918        4: 'Cancelada'
919    };
920
921    var decodeDate = function(time){
922        return new Date( parseInt( time) ).setTimezoneOffset( Timezone.timezone( evt.timezone ) ).toString( User.preferences.dateFormat+' - '+User.preferences.hourFormat );
923    };
924
925    var decodeItem = function(historic){
926        switch(historic.attribute){
927            case 'startTime':
928            case 'endTime' :
929            case 'due':
930                return {
931                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
932                    attribute : attributeDecoded[historic.attribute],
933                    beforeValue : decodeDate(historic.beforeValue),
934                    afterValue : decodeDate(historic.afterValue),
935                    time: decodeDate(historic.time)
936                }
937            break;
938            case 'participant':
939                return{
940                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
941                    attribute : historic.beforeValue == '' ? ('Novo participante') : ('Rem. participante'),
942                    beforeValue : historic.beforeValue == '' ? '' : historic.beforeValue.mail,
943                    afterValue : historic.afterValue == '' ? '' : historic.afterValue.mail,
944                    time: decodeDate(historic.time)
945                }
946            break;
947            case 'attachment':
948                return{
949                    user : $.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
950                    attribute : historic.beforeValue == '' ? ('Novo anexo') : ('Rem. anexo'),
951                    beforeValue : historic.beforeValue,
952                    afterValue : historic.afterValue,
953                    time: decodeDate(historic.time)
954                }
955            case 'percentage':
956                    return{
957                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
958                    attribute :attributeDecoded[historic.attribute],
959                    beforeValue : historic.beforeValue+' %',
960                    afterValue : historic.afterValue+' %',
961                    time: decodeDate(historic.time)
962                }
963            case 'status':
964                    return{
965                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
966                    attribute :attributeDecoded[historic.attribute],
967                    beforeValue : statusDecoded[historic.beforeValue],
968                    afterValue : statusDecoded[historic.afterValue],
969                    time: decodeDate(historic.time)
970                }
971            break;
972            default:
973                return {
974                    user : $.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user),
975                    attribute : attributeDecoded[historic.attribute],
976                    beforeValue : historic.beforeValue,
977                    afterValue : historic.afterValue,
978                    time: decodeDate(historic.time)
979                }
980            break;
981
982        }
983    }
984
985    for(var i = 0; i < historic.length; i++)
986        decoded.push(decodeItem(historic[i]));
987
988    return decoded;
989
990}
991
992DataLayer.codec( "schedulable", "taskSearch", {
993
994    decoder: function( evtObj ){
995
996    },
997
998    encoder: function( evtObj ){
999
1000    var notArray = false;
1001     
1002    if( notArray = $.type(evtObj) !== "array" )
1003        evtObj = [ evtObj ];
1004
1005    var res = $.map(evtObj, function( objEvent ){           
1006           
1007        if(!(typeof(objEvent) == 'object'))
1008            return (null);
1009
1010        return {
1011            id: objEvent.id,
1012            summary: objEvent.summary,
1013            description: !!objEvent.summary ? objEvent.summary : objEvent.description,
1014            startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1015            startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
1016            endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1017            endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
1018            dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1019            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),
1020            allDay: !!parseInt( objEvent.allDay ),
1021            percentage: (objEvent.percentage) ? objEvent.percentage : '0',
1022                        status: objEvent.status,
1023                        priority: objEvent.priority
1024        }
1025    });
1026    return (notArray ? res[0] : res);
1027    }
1028});
1029
1030DataLayer.codec( "schedulable", "activity", {
1031
1032    decoder: function( evtObj ){
1033    Encoder.EncodeType = "entity";
1034   
1035    if( notArray = $.type(evtObj) !== "array" )
1036        evtObj = [ evtObj ];
1037
1038    var pref = User.preferences;
1039
1040    var res = $.map(evtObj, function( form ){
1041   
1042        var tzId =  form.timezone || Calendar.signatureOf[form.group].calendar.timezone || User.preferences.timezone,
1043        formatString = pref.dateFormat + " " + pref.hourFormat;
1044
1045        var decodeParticipants = function(attend){
1046            return [DataLayer.merge(
1047                { 
1048                    user: User.me.id,
1049                    isOrganizer: 1,
1050                    acl: 'row',
1051                    alarms: $.map( form.alarmTime || [], function( alarmTime, i ){
1052                        if( alarmTime === "" )
1053                            return( null );
1054                        return !!form.alarmId[i] ? {
1055                            type: form.alarmType[i],
1056                            unit: form.alarmUnit[i],
1057                            time: form.alarmTime[i],
1058                            id: form.alarmId[i]
1059                            }:
1060
1061                            {
1062                            type: form.alarmType[i],
1063                            unit: form.alarmUnit[i],
1064                            time: form.alarmTime[i]
1065                            };
1066                    })
1067                }, attend != '0' ? {id: attend} : {})];
1068        };
1069
1070        return DataLayer.merge({
1071        "class": form["class"],
1072        startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
1073        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'),
1074        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'),
1075        allDay: ( !!form.allDay ? 1 : 0 ),     
1076        status: form.activityStatus,     
1077        id: form.idActivity,
1078        type: !!form.type ?  form.type : 2,
1079        percentage: form.percentage,
1080        priority: form.priority,
1081        category: form.category,
1082        summary: form.summary == '' ? 'Atividade sem tï¿œtulo' : form.summary,
1083        description: form.description,
1084        timezone: tzId,
1085        attachments: $.map(form.attachment || [], function( attachment, i ){
1086            return {
1087            attachment: attachment
1088            }
1089        }),
1090        participants: decodeParticipants(form.idAttendee),
1091        taskToActivity:$.map( form.idtask || [], function( task, i ){
1092
1093            return DataLayer.merge({
1094                task: task,
1095                owner: User.me.id
1096            }, form.idTaskToActivity[i] != '' ? {id: form.idTaskToActivity[i]} : {});
1097
1098        })
1099        }, form.lastGroup ? (( form.lastGroup == form.group ) ? {} : {calendar: form.group, lastGroup: form.lastGroup}) : {calendar: form.group});
1100    });
1101
1102    return notArray ? res[0] : res;
1103    },
1104
1105    encoder: function( evtObj ){
1106
1107    var notArray = false;
1108     
1109    if( notArray = $.type(evtObj) !== "array" )
1110        evtObj = [ evtObj ];
1111   
1112    var res = $.map(evtObj, function( objEvent ){           
1113           
1114        if(!(typeof(objEvent) == 'object'))
1115            return (null);
1116       
1117        var historic = [];
1118
1119        var decodeTasks = function(obj){
1120
1121            var tasks = {}, task = {};
1122
1123            for(var i =0; i < obj.taskToActivity.length; i++){
1124
1125                taskToActivity = DataLayer.get('taskToActivity', obj.taskToActivity[i]);
1126                task = taskToActivity.task;
1127
1128                if($.type(task) != 'object')
1129                    task = DataLayer.get('schedulable', task);
1130
1131                //Resolve problemas com atualizaᅵᅵo na camada Cliente
1132                if(!$.isNumeric(task.startTime)){
1133                    DataLayer.remove('schedulable', task.id, false);
1134                    task = DataLayer.get('schedulable', task.id);
1135                }
1136
1137                tasks[task.id] = {
1138                    taskToActivity: taskToActivity.id,
1139                    allDay: !!parseInt(task.allDay),
1140                    dueDate: (!task.due || task.due == '' || task.due == '0') ? '' : new Date( parseInt(task.due) ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ),
1141                    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),
1142                    startDate: new Date( parseInt(task.startTime) ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ),
1143                    startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(task.startTime)), task.timezone, task.calendar, obj.DayLigth, 'startTime'), User.preferences.hourFormat),
1144                    endDate: new Date( parseInt(task.endTime) - (!!parseInt(task.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ),
1145                    endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(task.endTime)),  task.timezone, obj.calendar, obj.DayLigth, 'endTime'), User.preferences.hourFormat),
1146                                        status: task.status,
1147                                        percentage: task.percentage,
1148                                        priority: task.priority,
1149                                        summary: task.summary
1150                }
1151
1152                tasks[task.id].description = tasks[task.id].startDate + ' - ' + (!!task.summary ? task.summary : task.description);
1153
1154                historic.push({'task': (!!task.summary ? task.summary : task.description) , 'historic': decodeHistoric(task)});
1155            }
1156
1157            tasks.length = obj.taskToActivity.length;
1158            return tasks;
1159
1160        };
1161
1162        return {
1163        "class": objEvent["class"],
1164        id: objEvent.id,
1165        location: objEvent.location,
1166        category: objEvent.category,
1167        activityStatus: objEvent.status,
1168        groups: Calendar.groups,
1169        group: objEvent.group ? objEvent.group : objEvent.calendar,
1170        summary: objEvent.summary,
1171        type: !!objEvent.type ? objEvent.type : 2,
1172        description: objEvent.description,
1173        timezone: objEvent.timezone,
1174        timezones: Timezone.timezones,
1175        percentage: (objEvent.percentage) ? objEvent.percentage : '0',
1176        priority: objEvent.priority,
1177        startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1178        startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat),
1179        endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1180        endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat),
1181        dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ),
1182        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),
1183        allDay: !!parseInt( objEvent.allDay ),
1184        historic: historic,
1185        tasks: objEvent.taskToActivity ? decodeTasks(objEvent) : {},
1186        attachments: $.map(objEvent.attachments || [], function( attachment, i ){
1187            var attach = DataLayer.get('schedulableToAttachment', attachment, false);
1188            //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o
1189            if(!attach.name) return(null);
1190           
1191            var ext = attach.name.split('.');
1192            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]));
1193            attach.size = formatBytes(attach.size);
1194            return attach;
1195        }),
1196        me : User.me,
1197        attendee: $.map(objEvent.participants || [], function( participant, i ){                       
1198
1199            var attend = DataLayer.get('participant', (participant.id || participant));
1200            attend.user = DataLayer.get('user', attend.user);
1201
1202            return {
1203                id: attend.id,
1204                alarms : $.map(attend.alarms || [], function( alarm ){
1205                    var alarm = DataLayer.get('alarm', alarm);
1206                    return (alarm == "" ? (null) : alarm);
1207                })
1208            };
1209        })
1210
1211        };
1212    });
1213    return (notArray ? res[0] : res);
1214    }
1215});
1216
1217function decodeOwnerCalendar(calendar){
1218    if(calendar && !parseInt(Calendar.signatureOf[calendar].isOwner)){
1219        var Owner = DataLayer.get('calendarSignature', {
1220            filter: ['AND', ['=','calendar', calendar], ['=','isOwner','1']],
1221            criteria: {
1222                deepness: 2
1223            }
1224        });
1225
1226    if($.isArray(Owner))
1227        Owner = Owner[0];
1228       
1229    return Owner.user;
1230}
1231return User.me;
1232
1233   
1234}
1235
1236function decodeRepeat ( form ) {
1237
1238    var patati = {};
1239       
1240    if( form.repeatId )
1241        patati['id'] = form.repeatId;
1242
1243    patati['frequency'] = form.frequency;
1244
1245    patati['bymonthday'] = patati['byyearday'] = patati['byday'] = '';
1246       
1247    patati['interval'] = 1 ,
1248   
1249    patati['endTime'] = patati['count'] = patati['startTime'] = 0;
1250       
1251    if( form.frequency === 'none' )
1252        return( patati );
1253       
1254    var day = [];
1255
1256    $("input[type=checkbox][name='repeatweekly[]']:checked").each(function() {
1257        day[ day.length ] = $(this).val();
1258    });
1259
1260    patati['byday'] = day.join(',');
1261
1262    var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat;
1263
1264    var date = Date.parseExact( form.startDate + " "+$.trim(form.startHour) , formatString )
1265   
1266    patati['startTime'] = date.toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00');
1267       
1268    if( !patati['byday'] )
1269        switch(form.frequency) {
1270            case 'weekly':
1271                break;
1272            case 'daily':
1273                break;
1274            case 'monthly':
1275                patati['bymonthday'] = date.getDate();
1276                break;
1277            case 'yearly':
1278                patati['byyearday'] = (1 + date.getDayOfYear());
1279                break;
1280            default :
1281                return patati;
1282        }
1283
1284    if (($(".endRepeat").val() == 'occurrences'))
1285        patati['count'] = $(".occurrencesEnd").val();
1286       
1287    if (($(".endRepeat").val() == 'customDate'))
1288        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');
1289       
1290    patati['interval']  = $(".eventInterval").val();
1291
1292    /**
1293        wkst = [ 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU' ]
1294        weekno = number
1295        minute = number
1296        second = number
1297        yearday = number
1298        monthday = number
1299        setpos = number
1300        day = number
1301        hour = number
1302        interval = number
1303        frequency = [ 'monthly', 'daily', 'weekly', 'yearly', 'hourly', 'minutely', 'secondly' ]
1304        endTime = milliseconds
1305    */   
1306    return( patati );
1307     
1308}
1309
1310
1311
1312function encodeRepeat( repeat ){
1313 
1314    if( !repeat )
1315        return( false );
1316    if(typeof(repeat) == "object")
1317        return repeat;
1318
1319    return DataLayer.get( 'repeat', repeat );
1320}
1321
1322DataLayer.codec( "schedulable", "detail", {
1323
1324    decoder: function( evtObj ){
1325               
1326        Encoder.EncodeType = "entity";
1327       
1328        if( notArray = $.type(evtObj) !== "array" )
1329            evtObj = [ evtObj ];
1330
1331        var pref = User.preferences;
1332
1333        var res = $.map(evtObj, function( form ){
1334   
1335            var tzId =  form.timezone || Calendar.signatureOf[form.calendar].calendar.timezone || User.preferences.timezone,
1336
1337            formatString = pref.dateFormat + " " + pref.hourFormat;
1338
1339            var Owner = decodeOwnerCalendar(form.calendar);
1340
1341            return DataLayer.merge({
1342                "class": form["class"],
1343                startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),
1344                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) ,
1345                allDay: ( !!form.allDay ? 1 : 0 ),       
1346                id: form.idEvent,
1347                location: form.location,
1348                type: 1,
1349                category: form.category,
1350                priority: form.priority,
1351                summary: form.summary == '' ? 'Evento sem tï¿œtulo' : form.summary,
1352                description: form.description,
1353                timezone: tzId,
1354                attachments: $.map(form.attachment || [], function( attachment, i ){
1355                    return {
1356                        attachment: attachment
1357                    }
1358                }),
1359                repeat: this.decodeRepeat( form ),
1360                participants: $.map( form.attendee || [], function( attendee, i ){
1361
1362                    if( !attendee || attendee === "" )
1363                        return( null );
1364
1365                    var participant = {};
1366                    participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ;
1367
1368                    if( participant.user === Owner.id ){
1369                        return DataLayer.merge({
1370                            id: attendee,
1371                            isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
1372                            acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', ''),
1373                            alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){
1374                                if( alarmTime === "" )
1375                                    return( null );
1376                                return !!form.alarmId[i] ? {
1377                                    type: form.alarmType[i],
1378                                    unit: form.alarmUnit[i],
1379                                    time: form.alarmTime[i],
1380                                    id: form.alarmId[i]
1381                                    }:
1382
1383                                    {
1384                                    type: form.alarmType[i],
1385                                    unit: form.alarmUnit[i],
1386                                    time: form.alarmTime[i]
1387                                    };
1388                            }),
1389                            status: !!form.status ? form.status : 3
1390                        }, (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '')  ? {
1391                            delegatedFrom: form.delegatedFrom[i]
1392                            } : {});
1393                    }else{
1394                        return DataLayer.merge({
1395                            id: attendee,
1396                            acl: form.attendeeAcl[i],
1397                            isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ),
1398                            isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0,
1399                            acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', '')
1400                        }, form.delegatedFrom[i] != '0' ? {
1401                            delegatedFrom: form.delegatedFrom[i]
1402                            } : {});
1403                    };
1404                })
1405            }, form.lastCalendar ? (( form.lastCalendar == form.calendar ) ? {} : {calendar: form.calendar, lastCalendar: form.lastCalendar}) : {calendar: form.calendar});
1406        });
1407
1408        return notArray ? res[0] : res;
1409    },
1410
1411
1412    encoder: function( evtObj ){
1413       
1414        if(!(!!evtObj))
1415            return undefined;
1416
1417        var notArray = false;
1418                 
1419        if( notArray = $.type(evtObj) !== "array" )
1420            evtObj = [ evtObj ];
1421
1422        var pref = User.preferences;
1423    var res = [];
1424
1425    for(var i = 0; i < evtObj.length; i++){
1426           res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i]));
1427    }
1428
1429        if( !notArray ){
1430            var dates = {};
1431            var typeRepeat = {
1432                'none': false,
1433                'daily': 'Repetiᅵᅵo diï¿œria',
1434                'weekly': 'Repetiᅵᅵo semanal',
1435                'monthly': 'Repetiᅵᅵo mensal',
1436                'yearly': 'repetiᅵᅵo anual'
1437            }
1438
1439            for (var i=0; i < res.length; i++) {
1440
1441        res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type;
1442                         
1443                var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
1444                var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
1445                         
1446                var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() );
1447               
1448                var occurrences = [ startDate.getTime() ];
1449                               
1450                if( res[i].occurrences )
1451                {
1452                    occurrences = res[i].occurrences;
1453                }
1454
1455                for( var ii = 0; ii < occurrences.length; ii++ )
1456                {
1457                    var currentDate = new Date( occurrences[ii] );
1458                    var counter = currentDate.clone();
1459                                   
1460                    var res2 = $.extend( {}, res[i], {
1461                        'startDate': currentDate.toString( User.preferences.dateFormat ),
1462                        'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat )
1463                        } );
1464
1465                    if(res[i].repeat)
1466                res2.repeat = typeRepeat[res[i].repeat.frequency];
1467                                 
1468                    while (counter.compareTo( currentDate ) == 0) {
1469
1470                        if (!dates[counter.toString(User.preferences.dateFormat)])
1471                            dates[counter.toString(User.preferences.dateFormat)] = {
1472                                startDate:false,
1473                                events:[]
1474                            };
1475                        if (!dates[counter.toString(User.preferences.dateFormat)].startDate)
1476                            dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat);
1477
1478                        dates[counter.toString(User.preferences.dateFormat)].events.push(res2);
1479                        counter.addDays(-1);
1480                    }     
1481                }
1482            }
1483            res = {
1484                events_list: dates,
1485                count : res.length
1486            };
1487        }
1488
1489        return notArray ? res[0] : res;
1490    }
1491
1492});
1493
1494
1495DataLayer.codec( "schedulable", "print", {
1496
1497    decoder: function( evtObj ){
1498
1499    },
1500
1501
1502    encoder: function( evtObj ){
1503   
1504    if(!(!!evtObj))
1505        evtObj = [];
1506
1507    var notArray = false;
1508         
1509    if( notArray = $.type(evtObj) !== "array" )
1510        evtObj = [ evtObj ];
1511
1512    var pref = User.preferences;
1513    var res = [];
1514
1515    for(var i = 0; i < evtObj.length; i++){
1516       res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i]));
1517    }
1518
1519    if( !notArray ){
1520        var dates = {};
1521
1522        var typeRepeat = {
1523        'none': false,
1524        'daily': 'Repetiᅵᅵo diï¿œria',
1525        'weekly': 'Repetiᅵᅵo semanal',
1526        'monthly': 'Repetiᅵᅵo mensal',
1527        'yearly': 'repetiᅵᅵo anual'
1528        }
1529
1530        for (var i=0; i < res.length; i++) {
1531                        res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type;
1532               
1533            var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat );
1534            var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat );
1535                 
1536            var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() );
1537           
1538            var occurrences = [ startDate.getTime() ];
1539                   
1540            if( res[i].occurrences )
1541            {
1542                occurrences = res[i].occurrences;
1543            }
1544
1545            for( var ii = 0; ii < occurrences.length; ii++ )
1546            {
1547                var currentDate = new Date( occurrences[ii] );
1548                var counter = currentDate.clone();
1549                       
1550                var res2 = $.extend( {}, res[i], {
1551                    'startDate': currentDate.toString( User.preferences.dateFormat ),
1552                    'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat )
1553                });
1554
1555                if(res[i].repeat)
1556                    res2.repeat = typeRepeat[res[i].repeat.frequency];
1557                     
1558                var index = dateCalendar.dayNames[counter.getDay()] +' '+counter.toString('dd/MM');
1559
1560                if(!dates[index] || !$.isArray(dates[index].events))
1561                    dates[index] = {events:  []};                   
1562
1563                                res2['isOneDay'] = res2.startDate == res2.endDate ? true : false;
1564
1565                dates[index].events.push(res2);
1566                 
1567            }
1568        }
1569
1570        var calendarView = $('#calendar').fullCalendar('getView');
1571        var start = calendarView.start.getTime();
1572        var end = (calendarView.end.getTime() - (calendarView.name == 'month' ? 86400000 : 0 ));
1573        var next = start;
1574        var response = [];
1575        while (next){
1576            var index = dateCalendar.dayNames[new Date(next).getDay()] +' '+ new Date(next).toString('dd/MM');
1577           
1578            var event = {};
1579            event[index] = {events: dates[index] ? dates[index].events : false};
1580
1581            response[response.length] = event;
1582            next = (next + 86400000) > end ? false : (next + 86400000);
1583        }
1584        res = {events: response};
1585    }
1586
1587    return notArray ? res[0] : res;
1588    }
1589
1590});
1591
1592DataLayer.codec( "participant", "detail", {
1593 
1594    encoder: function( participants ){
1595
1596        var result = {};
1597        for( var i = 0; i< participants.length; i++ ){
1598            result[ participants[i].user.id || participants[i].user ] = participants[i];
1599        }
1600        return( result );
1601    }
1602});
1603
1604DataLayer.codec( "calendar", "list", {
1605 
1606    encoder: function( calendars ){
1607
1608        var result = {
1609            my_calendars: [],
1610            others_calendars: []
1611        };
1612
1613        for( var i = 0; i < calendars.length; i++ )
1614        {
1615            !!Calendar.signatureOf[ calendars[i].id ].isOwner ?
1616            result.my_calendars.push( calendars[i] ) :
1617            result.others_calendars.push( calendars[i] );
1618        }
1619
1620        return {
1621            agendas_usuario: result
1622        };
1623
1624    }
1625
1626});
1627
1628DataLayer.codec( "schedulable", "calendar", {
1629
1630    decoder:function( evtObj ){
1631       
1632        if( notArray = $.type(evtObj) !== "array" )
1633            evtObj = [ evtObj ];
1634       
1635        var res = $.map(evtObj, function( evt ){
1636
1637            return {
1638                id: evt.id,
1639                summary: evt.title,
1640                startTime: evt.start.getTime(),
1641                endTime: ( !!evt.allDay ? (( evt.end || evt.start ).getTime() + 86400000) :( evt.end || evt.start ).getTime()),
1642                allDay: ( !!evt.allDay ? 1 : 0 )
1643            /*calendar: evt.id && User.calendarOf[ evt.id ].id*/ };
1644        });
1645
1646        return notArray ? res[0] : res;
1647    },
1648
1649    encoder: function( evtObj, filter ){
1650     
1651        if( !evtObj )
1652            return( false );
1653
1654        var filtered = evtObj;
1655        //
1656        var grouped = {};
1657
1658        $.map(filtered, function( evt ){
1659               
1660            if(!(typeof(evt) == 'object') || (evt.id.indexOf('java') >= 0))
1661                        return (null);
1662
1663            evt.calendar = evt.calendar || "1";
1664
1665            if( !grouped[ evt.calendar ] )
1666                        grouped[ evt.calendar ] = [];
1667                       
1668            var calendar = DataLayer.get('calendar', evt.calendar);
1669               
1670                var taskEditable = function(idTask){
1671                        for(var i = 0; i < evt.participants.length; i++){
1672                                attendee = DataLayer.get('participant', evt.participants[i]);
1673                                if(attendee.user == User.me.id)
1674                                        return attendee.isOrganizer == '1' ?
1675                                        {
1676                                                editable: true,
1677                                                disableResizing: false,
1678                                                disableDragging: false,
1679                                                className: 'fullcalendar-context-menu  event-type-2 event-id-'+idTask+' calendar-id-'+calendar.id
1680                                        }
1681                                        :
1682                                        {
1683                                                editable: false,
1684                                                disableResizing: true,
1685                                                disableDragging: true,
1686                                                className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idTask
1687                                        };
1688                        }
1689                }
1690               
1691            var eventEditable = function(idEvent, isRecurrence, Recurrence){
1692                        if(Calendar.signatureOf[calendar.id].isOwner == "1"){
1693                                var attendee = {};
1694                                for(var i = 0; i < evt.participants.length; i++){
1695                                        attendee = DataLayer.get('participant', evt.participants[i]);
1696                                        if(attendee.user == User.me.id)
1697                                                return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ?
1698                                                {
1699                                                        selectable: true,
1700                                                        className: 'fullcalendar-context-menu  event-type-1 event-id-'+idEvent+' calendar-id-'+calendar.id+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '')
1701                                                } : {
1702                                                        editable: false,
1703                                                        selectable: true ,
1704                                                        className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent
1705                                                };
1706                                }
1707                                return {
1708                                        editable: false,
1709                                        className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent+' calendar-id-'+calendar.id, 
1710                                        selectable: true,
1711                                        disableDragging: isRecurrence
1712                                };
1713                        }
1714                        else{
1715                                var aclSignature = Calendar.signatureOf[calendar.id].permission;
1716                                       
1717                                var mountClass =  function(acl){
1718                                        var returns = ""
1719                                        returns += acl['write'] ? "" :  'blocked-event-permision ';
1720                                        returns += acl['busy'] ? 'fullcalendar-not-context-menu ' : (acl['read']  ?  'fullcalendar-context-menu '+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') : '');
1721                                        returns += 'event-id-'+idEvent+' calendar-id-'+calendar.id;
1722                                        return returns;
1723                                }
1724                               
1725                                return DataLayer.merge({
1726                                        editable: aclSignature.acl['write'] && !isRecurrence,
1727                                        disableResizing : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true : false),
1728                                        disableDragging  : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true: false),
1729                                        className: mountClass(aclSignature.acl)
1730                                        }, aclSignature.acl['busy'] ?
1731                                        {
1732                                                title: 'Ocupado',
1733                                                selectable: false
1734                                        } : {
1735                                                selectable: true
1736                                        }
1737                                );     
1738                        }
1739            }
1740
1741                var duration = parseInt( evt.endTime ) - parseInt( evt.startTime ), isRepeat = false;
1742
1743                var occurrences = [];
1744               
1745                if( evt.occurrences )
1746                {
1747                        isRepeat = true;
1748                        occurrences = evt.occurrences;
1749            }else
1750                        occurrences[ occurrences.length ] = evt.startTime;
1751
1752            //occurrences = DataLayer.unique( occurrences ).sort();
1753                var typeEvent; 
1754            for( var i = 0; i < occurrences.length; i++ )
1755                {
1756            typeEvent = (evt.type == 2 && evt.taskToActivity ? 3 : evt.type)
1757                grouped[ evt.calendar ].push( DataLayer.merge(
1758                {
1759                                id: evt.URI || evt.id+ '-' + i,
1760                                title: Encoder.htmlDecode(evt.summary),
1761                                start: Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) ), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving),
1762                                end:   Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) + duration - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving),
1763                                allDay: parseInt( evt.allDay ),
1764                                isRepeat: isRepeat,
1765                                occurrence: i,
1766                                type: typeEvent,
1767                                calendar: evt.calendar
1768                                }, (parseInt(typeEvent) == 1 ? eventEditable(evt.id, isRepeat, i ) : (parseInt(typeEvent) == 2 ? taskEditable(evt.id) : {editable: false, disableResizing: true, disableDragging: true}))));
1769        }
1770        });
1771
1772        return(/* notArray ? filtered[0] :*/ grouped );
1773    },
1774   
1775    criteria: function( filter ){
1776     
1777        if( $.type(filter.start) !== 'date' )
1778            filter.start = new Date( filter.start * 1000 );
1779        if( $.type(filter.end) !== 'date' )
1780            filter.end = new Date( filter.end * 1000 );
1781
1782        var timezone = {};
1783        for(var i in Calendar.signatureOf)
1784            timezone[i] = Calendar.signatureOf[i].calendar.timezone;
1785       
1786        return {
1787            filter: ['AND',
1788                        ['OR',
1789                            ['AND',
1790                                ['>=', 'rangeEnd', filter.start.getTime()],
1791                                ['<=', 'rangeEnd', filter.end.getTime()]
1792                            ],
1793                            ['AND',
1794                                ['>=', 'rangeStart', filter.start.getTime()],
1795                                ['<=', 'rangeStart', filter.end.getTime()]
1796                            ],
1797                            ['AND',
1798                                ['<=', 'rangeStart', filter.start.getTime()],
1799                                ['>=', 'rangeEnd', filter.end.getTime()]
1800                            ]
1801                        ],
1802                        ['IN', 'calendar',  $.merge( Calendar.calendarIds, Calendar.groupIds )]
1803                ],
1804            criteria: {
1805                deepness: 2,
1806                timezones: timezone
1807            }
1808        }
1809}
1810});
1811
1812
1813DataLayer.codec( "preference", "detail", {
1814 
1815    decoder:function( pref ){
1816       
1817        var res = [];
1818
1819        pref.defaultAlarm = $.map( pref.alarmTime || [], function( alarmTime, i ){
1820                 
1821            return {
1822                type: pref.alarmType[i],
1823                time: alarmTime,
1824                unit: pref.alarmUnit[i]
1825                };
1826        });
1827
1828        $.each( pref, function( i, el ){
1829
1830            res[ res.length ] = {
1831                name: i,
1832                value: el
1833            };
1834
1835        });
1836               
1837        return( res );
1838     
1839    },
1840
1841    encoder:function( pref ){
1842        return( pref );
1843    }
1844
1845});
1846
1847DataLayer.codec( "schedulable", "export", {
1848 
1849    decoder: function(){},
1850     
1851    encoder: function( signatures ){},
1852     
1853    criteria: function( filter ){
1854       
1855        if( isCal  = filter && filter.calendar )
1856            filter = filter.calendar;
1857        return {
1858            filter: filter ? [  "=", ( isCal ? "calendar" : "id" ), filter ] : false,
1859            criteria: {
1860                format: 'iCal',
1861                deepness: 2
1862            }
1863        };
1864    }
1865});
1866
1867User.init();
1868
1869// DataLayer.decoder( "participant", "detail", function( form ){
1870// 
1871// //     if( $.type( attObj ) !== "array" ){
1872// //   notArray = true;
1873// //   attObj = [ attObj ];
1874// //     }
1875//
1876//     
1877//
1878//     return( participants );
1879//
1880// });
1881
1882// DataLayer.decoder( "alarm", "detail", function( form ){
1883//
1884// //       if( $.type( attObj ) !== "array" ){
1885// //       notArray = true;
1886// //       attObj = [ attObj ];
1887// //     }
1888//
1889//     var alarms = [];
1890//
1891//     if( form.alarmType /*&& !form.*/ )
1892//      for( var i = 0; i < form.alarmType.length; i++ )
1893//      {
1894//          if( form.alarmTime[i] === "" )
1895//              continue;
1896//       
1897//          alarms[i] = { type: form.alarmType[i],
1898//                        unit: form.alarmUnit[i],
1899//                        time: form.alarmTime[i] };
1900//      }
1901//
1902//     return( alarms );
1903//
1904// });
1905
Note: See TracBrowser for help on using the repository browser.