source: branches/2.5/prototype/modules/calendar/js/helpers.js @ 8050

Revision 8050, 114.4 KB checked in by douglas, 11 years ago (diff)

Ticket #3398 - Melhoria na exibicao de dados dos eventos criados na agenda

Line 
1function formatBytes(bytes) {
2    if (bytes >= 1000000000) {
3        return (bytes / 1000000000).toFixed(2) + ' GB';
4    }
5    if (bytes >= 1000000) {
6        return (bytes / 1000000).toFixed(2) + ' MB';
7    }
8    if (bytes >= 1000) {
9        return (bytes / 1000).toFixed(2) + ' KB';
10    }
11    return bytes + ' B';
12};
13
14function validDateEvent(){
15       
16        var errors = {
17                'emptyInitData': 'Por favor, informe uma data inicial',
18                'emptyEndData': 'Por favor, informe uma data final',
19                'emptyInitHour': 'Por favor, informe uma hora inicial',
20                'emptyEndHour': 'Por favor, informe uma hora final',
21               
22                'invalidInitData' : 'Data inicial inválida',
23                'invalidEndData' : 'Data final inválida',
24               
25                'equalData' : 'Hora inicial igual a final',
26                'theirData' : 'Data final menor que a inicial',         
27                'theirHour' : 'Hora final menor que a inicial',
28               
29                'emptyOcurrence' : 'Por favor, informe o número de ocorrências',
30                'invalidOcurrence' : 'Por favor, informe um valor válido para a quantidade de ocorrências',
31               
32                'emptyInterval' : 'Por favor, informe o intervalo',
33                'invalidInterval' : 'Por favor informe um valor válido para o intervalo'
34        };
35
36    var start_date = $(".new-event-win.active .start-date").val();
37    var end_date   = $(".new-event-win.active .end-date").val();
38    var start_time = $(".new-event-win.active .start-time").val();
39    var end_time   = $(".new-event-win.active .end-time").val();
40    var isAllDay   = $('.new-event-win.active input[name="allDay"]').is(':checked');
41    var customDate = $(".endRepeat").val() == "customDate";
42    var occurrences = $(".endRepeat").val() == "occurrences";
43    var eventInterval = $('.eventInterval').val();
44   
45    if(start_date == "")
46                return errors['emptyInitData'];
47    else if(end_date == "")
48                return errors['emptyEndData'];
49    else if(!isAllDay && start_time == "")
50                return errors['emptyInitHour'];
51    else if(!isAllDay && end_time == "")
52                return errors['emptyEndHour'];
53       
54    var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat;
55               
56    var startDate = Date.parseExact( start_date + " " + $.trim(start_time) , formatString );
57    var endDate = Date.parseExact( end_date + " " + $.trim(end_time) , formatString );
58
59    if(startDate == null || startDate.getTime() < 0 )
60                return errors['invalidInitData'];
61    if(endDate == null || endDate.getTime() < 0)
62                return errors['invalidEndData'];
63       
64        if(isAllDay){
65                startDate.clearTime();
66                endDate.clearTime();
67                if(endDate.compareTo(startDate) == -1)
68                        return errors['theirData'];
69        }else{
70                var condition = endDate.compareTo(startDate);
71                if(condition != 1){
72                        if(condition < 0){
73                                startDate.clearTime();
74                                endDate.clearTime();
75                                condition = endDate.compareTo(startDate);                               
76                                return (errors[ condition == 0 ? 'theirHour' : 'theirData'] );
77                        }
78                        else
79                                return errors['equalData'];
80                }
81        }
82   
83    if (customDate)   
84                if ( !($('.new-event-win.active .customDateEnd').val().length) )
85                   return errors['emptyEndData'];
86
87    if (occurrences){
88                if ( !($('.occurrencesEnd').val().length) )
89                   return errors['emptyOcurrence'];
90                else if (parseInt($('.occurrencesEnd').val(),10) <= 0 || parseInt($('.occurrencesEnd').val(),10).toString() == "NaN")
91                   return errors['invalidOcurrence'];
92        }
93
94    if (!($('.new-event-win.active p.input-group.finish_event.repeat-in').hasClass('hidden'))){
95        if (!eventInterval.length)
96            return errors['emptyInterval'];
97        else if (parseInt(eventInterval,10) < 1 || parseInt(eventInterval,10).toString() == "NaN")
98            return errors['invalidInterval'];
99    }   
100    return false;
101}
102
103function printNow(){
104        if($("#calendar").fullCalendar('getView').name == "agendaWeek" || $("#calendar").fullCalendar('getView').name == "basicWeek" || $("#calendar").fullCalendar('getView').name == "year")
105                alert('A tela de impressão será melhor visualizada com a preferência "Paisagem" do seu browser selecionada.');
106               
107        var window_print = window.open('','ExpressoCalendar','width=800,height=600,scrollbars=yes');       
108        window_print.document.open();
109
110        var start = $("#calendar").fullCalendar('getView').visStart.getTime()/1000;
111        var end = $("#calendar").fullCalendar('getView').visEnd.getTime()/1000;
112        var criteria = DataLayer.criteria("schedulable:calendar", {'start':start, 'end':end} );
113 
114    var data = DataLayer.encode('schedulable:print', DataLayer.dispatch('modules/calendar/schedules', criteria )  );
115
116        if($("#calendar").fullCalendar('getView').name == "month"){                             
117                window_print.document.write(DataLayer.render('templates/calendar_month_print.ejs', {
118                        'InfoPage' : $("#calendar").fullCalendar('getView').title,
119                        'days' : data
120                } ));
121        }
122        if($("#calendar").fullCalendar('getView').name == "agendaDay" || $("#calendar").fullCalendar('getView').name == "basicDay"){                           
123                window_print.document.write(DataLayer.render('templates/calendar_day_print.ejs', {
124                        'InfoPage' : $("#calendar").fullCalendar('getView').title,
125                        'days' : data
126                } ));
127        }
128        if($("#calendar").fullCalendar('getView').name == "agendaWeek" || $("#calendar").fullCalendar('getView').name == "basicWeek"){
129                window_print.document.write(DataLayer.render('templates/calendar_week_print.ejs', {
130                        'InfoPage' : $("#calendar").fullCalendar('getView').title,
131                        'days' : data
132                }));
133               
134                var aux = 0;
135                setTimeout(function(){$(window_print.document).find(".all-day").each(function(){
136                        if($(this).height() > aux)
137                                aux = $(this).height();
138                });
139                $(window_print.document).find(".all-day").each(function(){
140                        $(this).height(aux);
141                });
142                $(window_print.document).find(".all-day-line .write").height(aux);
143                aux = 0;
144                },20);
145        }
146        if($("#calendar").fullCalendar('getView').name == "year"){     
147                window_print.document.write(DataLayer.render('templates/calendar_year_print.ejs', {
148                        'html' : $('#calendar .fc-content').html(),
149                        'header': $('#calendar').find('.fc-header-center h2').text()
150                } ));
151        }               
152        window_print.document.close();
153        window_print.print();
154}
155
156function printEvents(){
157        //var html = DataLayer.render( path + 'templates/attendee_permissions.ejs', {} );
158        var print = $('.fc-header-right').find('.fc-button.fc-button-year').clone();
159
160        $('.fc-header-right').find('.fc-button-year').toggleClass('fc-corner-right');
161        print.addClass('fc-corner-right');
162        print.addClass('fc-button-print');
163        print.removeClass('fc-button-year');
164        print.removeClass('fc-corner-left');
165        print.removeClass('fc-state-active');
166        print.find('.fc-button-content').html('Imprimir');
167        $('.fc-header-right').append(print);
168        $('.fc-button-print').click(function(){
169            printNow();
170        });
171}
172
173/*
174 * TODO - repeat foi adicionado pois melhorias devem ser feitas no rollback do
175 *DataLayer, repeat somente é usado quando se trata da criação de um evento
176 *pela edição de uma ocorrência.
177 */
178
179function eventDetails( objEvent, decoded, path, isMail, repeat)
180{
181
182    $('.qtip.qtip-blue').remove();
183
184    attendees = {};
185 
186    if(!!objEvent.participants)
187    {
188        $.each(objEvent.participants ,function(index, value) {
189
190            var part = DataLayer.get('participant' , value );
191            var user = DataLayer.get('user' , part.user );
192 
193            attendees[part.user] = user.name;
194        });
195    }
196 
197    if(path == undefined)
198        path = "";
199         
200         
201    if( !decoded )
202        objEvent = DataLayer.decode("schedulable:calendar", objEvent );
203 
204        var dtstamp = objEvent.dtstamp; 
205    if(!isMail)
206                objEvent = DataLayer.encode( "schedulable:preview", objEvent );
207        if (!dtstamp)
208                var date = new Date();
209        else
210                var date = new Date(parseInt(dtstamp));
211        objEvent.creationDate = [];
212        objEvent.creationDate[0] = dateFormat(parseInt(dtstamp),'dd/mm/yyyy');
213        objEvent.creationDate[1] = date.getHours();
214        objEvent.creationDate[2] = date.getMinutes();   
215     
216    if(typeof(objEvent.id) == 'undefined'){
217        objEvent.alarms = Calendar.signatureOf[User.preferences.defaultCalendar || Calendar.calendarIds[0]].defaultAlarms || false;
218        objEvent.useAlarmDefault = 1;
219    }
220       
221    /**
222         * canDiscardEventDialog deve ser true se não houver alterações no evento
223         */
224    canDiscardEventDialog = true;
225    /**
226         * zebraDiscardEventDialog é uma flag indicando que uma janela de confirmação (Zebra_Dialog)
227         * já está aberta na tela, uma vez que não é possivel acessar o evento ESC utilizado para fechá-la
228         */
229    zebraDiscardEventDialog = false;
230       
231    /**
232                ACLs do participant
233        */
234    acl_names = {
235        'w': 'acl-white',
236        'i': 'acl-invite-guests',
237        'p': 'acl-participation-required'
238    };
239
240    var dependsDelegate = function(reference, inverse){
241        if(inverse){
242            if(reference.find('input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
243                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
244        }else{
245            if(blkAddAtendee.find('.me input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
246                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(reference.find('input[name="attendee[]"]').val());
247        }
248       
249    };
250   
251    var removeOthers = function(){
252        var other = blkAddAtendee.find('.delegate.attendee-permissions-change-button');
253        if(other.lenght){
254            dependsDelegate(other.parents('li'), true);
255        }
256        blkAddAtendee.find('.delegate').removeClass('attendee-permissions-change-button');
257        blkAddAtendee.find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change');
258       
259    };
260
261    var callbackAttendee = function(){
262        //Cria qtip de permissões pelo click do checkbox
263        var checked = false;
264        blkAddAtendee.find("li.not-attendee").addClass('hidden');
265       
266        blkAddAtendee.find("li .button").filter(".close.new").button({
267            icons: {
268                primary: "ui-icon-close"
269            },
270            text: false
271        }).click(function () {
272        var participant = DataLayer.get('participant' , $(this).parents('li').find('[type=checkbox]').val());
273            DataLayer.remove('participant', participant.id);
274            if($(this).parent().find('.button.delegate').hasClass('attendee-permissions-change-button')){
275                removeOthers();
276                blkAddAtendee.find('.request-update').addClass('hidden');
277                blkAddAtendee.find('.status option').toggleClass('hidden');
278                               
279                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
280            }
281            $(this).parents('li').remove();
282                       
283            if(blkAddAtendee.find(".attendee-list li").length == 1)
284                blkAddAtendee.find("li.not-attendee").removeClass('hidden');
285        delete attendees[participant.user];
286        })
287        .addClass('tiny disable ui-button-disabled ui-state-disabled')
288        .removeClass('new').end()
289       
290        .filter(".delegate.new").button({
291            icons: {
292                primary: "ui-icon-transferthick-e-w"
293            },
294            text: false
295        }).click(function () {
296            var me = $(this).parents('li');
297            if($(this).hasClass('attendee-permissions-change-button')){
298                $(this).removeClass('attendee-permissions-change-button')   
299                    .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
300               
301                me.find('input[name="delegatedFrom[]"]').val('');
302                dependsDelegate(me, true);
303                               
304                blkAddAtendee.find('.request-update').addClass('hidden');
305                blkAddAtendee.find('.status option').toggleClass('hidden');
306
307                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
308                               
309            }else{
310                removeOthers();
311                       
312                $(this).addClass('attendee-permissions-change-button')   
313                .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
314               
315                me.find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
316               
317                dependsDelegate(me, false);
318                       
319                blkAddAtendee.find('.request-update').removeClass('hidden');
320                if(blkAddAtendee.find('.status option.hidden').length == 1)
321                    blkAddAtendee.find('.status option').toggleClass('hidden');
322                       
323                blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change');
324            }
325        })
326        .addClass('tiny disable ui-button-disabled ui-state-disabled')
327        .removeClass('new').end()
328               
329        .filter(".edit.new").button({
330            icons: {
331                primary: "ui-icon-key"
332            },
333            text: false
334        }).click(function() {
335                       
336            if(!!!checked)
337                $(this).parents('li').find('[type=checkbox]').attr('checked', (!$(this).parent().find('[type=checkbox]').is(':checked'))).end();
338                       
339            var aclsParticipant =  $(this).parents('li').find('input[name="attendeeAcl[]"]').val();
340            checked = false;
341                       
342            if( $('.qtip.qtip-blue.qtip-active').val() !== ''){
343                blkAddAtendee.find('dd.attendee-list').qtip({
344                    show: {
345                    ready: true,
346            solo: true,
347            when: {
348                    event: 'click'
349                    }
350                },
351                hide: false,
352                content: {
353                text: $('<div></div>').html( DataLayer.render( path + 'templates/attendee_permissions.ejs', {} ) ),
354                title: {
355                text:'Permissões',
356                button: '<a class="button close" href="#">close</a>'
357                }
358                },
359                style: {
360                name: 'blue',
361            tip: {
362                corner: 'leftMiddle'
363                },
364            border: {
365                width: 4,
366            radius: 8
367                },
368            width: {
369                min: 230,
370            max:230
371                }
372            },
373            position: {
374            corner: {
375            target: 'rightMiddle',
376            tooltip: 'leftMiddle'
377            },
378            adjust: {
379            x:0,
380            y:0
381            }
382            }
383            })
384        .qtip("api").onShow = function(arg0) {
385            $('.qtip-active .button.close').button({
386                icons: {
387                    primary: "ui-icon-close"
388                },
389                text: false
390            })
391            .click(function(){
392                blkAddAtendee.find('dd.attendee-list').qtip('destroy');
393            });
394                                       
395            $('.qtip-active .button.save').button().click(function(){
396                                               
397                var acl = '';
398                $('.qtip-active').find('[type=checkbox]:checked').each(function(i, obj) {
399                    acl+= obj.value;
400                });
401
402                blkAddAtendee.find('dd.attendee-list [type=checkbox]:checked').siblings('input[name="attendeeAcl[]"]').each(function(i, obj) {
403                    obj.value = 'r'+acl;
404                }).parents('li').find('.button.edit').addClass('attendee-permissions-change-button')   
405                .find('.ui-icon-key').addClass('attendee-permissions-change');               
406                                               
407                blkAddAtendee.find('dd.attendee-list [type=checkbox]').attr('checked', false);
408                                               
409                blkAddAtendee.find('dd.attendee-list').qtip('destroy');
410                                       
411            });
412            $('.qtip-active .button.cancel').button().click(function(){
413                blkAddAtendee.find('dd.attendee-list [type=checkbox]').attr('checked', false);
414                blkAddAtendee.find('dd.attendee-list').qtip('destroy');
415            });
416                                       
417            if(aclsParticipant)
418                for(var i = 1; i < aclsParticipant.length; i++){
419                    $('.qtip-active').find('input[name="'+acl_names[aclsParticipant.charAt(i)]+'"]').attr('checked', true);
420                }
421                                                       
422            $('.qtip .button').button();
423                                       
424        };
425        }else{
426            if(!$('.new-event-win dd.attendee-list').find('[type=checkbox]:checked').length){
427                blkAddAtendee.find('dd.attendee-list').qtip('destroy');
428            }else{
429                $('.qtip-active .button.save .ui-button-text').html('Aplicar a todos')
430            }
431                       
432        };                     
433    })
434.addClass('tiny disable ui-button-disabled ui-state-disabled')
435.removeClass('new').end()
436               
437.filter(".open-delegate.new").click(function(){
438    if($(this).hasClass('ui-icon-triangle-1-e')){
439        $(this).removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
440        $(this).parents('li').find('.list-delegates').removeClass('hidden');
441    }else{
442        $(this).removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
443        $(this).parents('li').find('.list-delegates').addClass('hidden');
444    }
445               
446}).removeClass('new');
447       
448       
449blkAddAtendee.find("li input[type=checkbox].new").click(function(){
450    if(!$('.new-event-win dd.attendee-list').find('[type=checkbox]:checked').length){
451        blkAddAtendee.find('dd.attendee-list').qtip('destroy');
452    }else{
453        checked = true;
454        $(this).parents('li').find('.button.edit').click();
455    }
456}).removeClass('new');
457       
458UI.dialogs.addEvent.find('.attendees-list li').hover(
459    function () {
460        $(this).addClass("hover-attendee");
461        $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
462        .find('.attendee-options').addClass('hover-attendee');
463    },
464    function () {
465        $(this).removeClass("hover-attendee");
466        $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
467        .find('.attendee-options').removeClass('hover-attendee');;
468    }
469    );
470}
471
472var html = DataLayer.render( path+'templates/event_add.ejs', {
473    event:objEvent
474});     
475               
476if (!UI.dialogs.addEvent) {
477    UI.dialogs.addEvent = jQuery('#sandbox').append('<div title="Criar Evento" class="new-event-win active"> <div>').find('.new-event-win.active').html(html).dialog({
478        resizable: false,
479        modal:true,
480        autoOpen: false,
481        width:"auto",
482        position: 'center',
483        close: function(event, ui) {
484                /**
485                 * Remove tooltip possivelmente existente
486                 */
487                if ($('.qtip.qtip-blue.qtip-active').length)
488                        $('.qtip.qtip-blue.qtip-active').qtip('destroy');                                               
489                attendees  = {};
490        },
491        beforeClose: function(event, ui) {
492
493            if (!canDiscardEventDialog && !zebraDiscardEventDialog) {
494                zebraDiscardEventDialog = true;
495                window.setTimeout(function() {
496                    $.Zebra_Dialog('Suas alterações no evento não foram salvas. Deseja descartar as alterações?', {
497                        'type':     'question',
498                        'overlay_opacity': '0.5',
499                        'buttons':  ['Descartar alterações', 'Continuar editando'],
500                        'onClose':  function(clicked) {
501                            if(clicked == 'Descartar alterações') {
502                                canDiscardEventDialog = true;
503                                /**
504                                *Remoção dos anexos do eventos caso seja cancelado a edição
505                                */
506                                DataLayer.rollback();
507
508                                var ids = false;
509                                $.each($('.attachment-list input'), function (i, input) {
510                                    DataLayer.put('attachment', {id: ''+input.value});
511                                    DataLayer.remove('attachment', ''+input.value);
512                                        ids = true;
513                                });
514                                if(ids)
515                                        DataLayer.commit();
516                       
517                               
518                                                                               
519                                UI.dialogs.addEvent.dialog('close');
520                            }else{
521                                zebraDiscardEventDialog = false;
522                            }
523                                                                       
524                            /**
525                            * Uma vez aberta uma janela de confirmação (Zebra_Dialog), ao fechá-la
526                            * com ESC, para que o evento ESC não seja propagado para fechamento da
527                            * janela de edição de eventos, deve ser setada uma flag indicando que
528                            * já existe uma janela de confirmação aberta.
529                            */
530                            if (!clicked) {
531                                window.setTimeout(function() {
532                                    zebraDiscardEventDialog = false;
533                                }, 200);
534                            }
535                        }
536                    });
537                                                       
538                }, 300);
539
540            }
541            //DataLayer.rollback();
542            return canDiscardEventDialog;
543        },
544        dragStart: function(event, ui) {
545                if ($('.qtip.qtip-blue.qtip-active').length)
546                        $('.qtip.qtip-blue.qtip-active').qtip('destroy');
547        }
548    });
549                       
550} else {
551    UI.dialogs.addEvent.html(html);
552}
553               
554var tabs = UI.dialogs.addEvent.children('.content').tabs({
555        select: function(event, ui) {
556                if ($('.qtip.qtip-blue.qtip-active').length)
557                        $('.qtip.qtip-blue.qtip-active').qtip('destroy');
558        }       
559        });
560var calendar = DataLayer.get('calendar', objEvent.calendar);
561                               
562if ( (calendar.timezone != objEvent.timezone) && objEvent.id){
563    UI.dialogs.addEvent.find('.calendar-addevent-details-txt-timezone').find('option[value="'+objEvent.timezone+'"]').attr('selected','selected').trigger('change');
564    UI.dialogs.addEvent.find('.calendar_addevent_details_lnk_timezone').addClass('hidden');
565    $('.calendar-addevent-details-txt-timezone').removeClass('hidden');
566                       
567}
568
569 
570dateSameValue = function(){
571    UI.dialogs.addEvent.find('input.start-date').datepicker({
572        dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'),
573        onSelect : function (selectedDate){
574            endDate = $(".end-date").val();
575            storeSelectedDate = selectedDate;
576 
577            if ( User.preferences.dateFormat == "dd/MM/yyyy" || User.preferences.dateFormat == "dd-MM-yyyy" ) {
578                if ( User.preferences.dateFormat == "dd/MM/yyyy" ) {
579                    selectedDate = selectedDate.split("/");
580                    endDate = endDate.split("/");
581                } else if( User.preferences.dateFormat == "dd-MM-yyyy" ){
582                    selectedDate = selectedDate.split("-");
583                    endDate = endDate.split("-");
584                }
585 
586                newDt = new Date(selectedDate[2],selectedDate[1], selectedDate[0]);
587                endDate = new Date(endDate[2],endDate[1], endDate[0]);
588 
589            } else if ( User.preferences.dateFormat == "MM/dd/yyyy" ) {
590                selectedDate = selectedDate.split("/");
591                endDate = endDate.split("/");
592 
593                newDt = new Date(selectedDate[2],selectedDate[0], selectedDate[1]);
594                endDate = new Date(endDate[2],endDate[0], endDate[1]);
595            }
596 
597            if( newDt > endDate )
598                $(".end-date").val(storeSelectedDate);
599        },
600        onClose: function(){
601                UI.dialogs.addEvent.find(".end-date").val(UI.dialogs.addEvent.find(".start-date").val());
602        }
603    });
604}
605 
606DataLayer.render( path+'templates/event_repeat.ejs', {
607    event:objEvent
608}, function( repeatHtml ){
609
610    UI.dialogs.addEvent.find('#calendar_addevent_details3').html(repeatHtml);
611 
612    dateSameValue();
613    $(".date").datepicker({
614                dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy')
615        });
616 
617 
618    if(objEvent.repeat)
619    {
620        if( objEvent.repeat['id'] )
621        {
622            $("[name='repeatId']:last").val( objEvent.repeat['id'] );
623        }
624
625        if( objEvent.repeat['frequency'] !== 'none' )
626        {
627            if( objEvent.repeat['startTime'] && objEvent.repeat['startTime'] !== "0" )
628            {
629                $("[name='startOptions'] [value='customDate']:last").attr( 'selected', 'selected' );
630                $("[name='start']:last").val(new Date( parseInt(objEvent.repeat['startTime']) ).toString( User.preferences.dateFormat ) );
631            }
632            else
633            {
634                $("[name='start']:last").val($("[name='startDate']:last").val());     
635                $("[name='start']:last").readOnly=true;
636                $("[name='start']:last").datepicker("disable");
637            }
638                             
639            $(".finish_event").removeClass("hidden");
640
641            if(objEvent.repeat['endTime'] && objEvent.repeat['endTime'] !== "0" )
642            {
643                //$("[name='occurrences']").addClass("hidden");
644                $(".customDateEnd").removeClass("hidden");
645                $(".endRepeat option[value='customDate']").attr('selected', 'selected')                                         
646                $(".customDateEnd").val( new Date( parseInt(objEvent.repeat['endTime']) )/*.setTimezoneOffset( Timezone.timezone( objEvent.timezone ) )*/.toString( User.preferences.dateFormat ) ); 
647            }
648            else if (objEvent.repeat['count'] && objEvent.repeat['count'] !== "0" ) {
649                $(".endRepeat option[value='occurrences']").attr('selected', 'selected');                                               
650                $(".occurrencesEnd").removeClass("hidden");
651                $(".occurrencesEnd").val(objEvent.repeat['count']);                                             
652            }
653                             
654            switch ( objEvent.repeat['frequency'] )
655            {
656                case "daily":
657                    $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Dia(s)")
658                    .end().find(".eventInterval").val( objEvent.repeat['interval'] || "1" );
659                    $(".frequency option[value='daily']").attr('selected', 'selected');
660                    break;
661                case "weekly":
662                    $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Semana(s)")
663                    .end().find(".eventInterval").val( objEvent.repeat['interval'] || "1" );
664                   
665                    $(".frequency option[value='weekly']").attr('selected', 'selected');
666                                           
667                    $(".event-repeat-weekly").removeClass("hidden");
668                                           
669                    var day = [];
670                                           
671                    if( objEvent.repeat.byday )
672                        day = objEvent.repeat.byday.split(',');
673                                           
674                    for(i=0; i<day.length; i++)
675                        $(".event-repeat-weekly [value='" + day[i] + "']").attr("checked","checked");
676                                           
677                    break;
678                case "monthly":
679                    $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Mes(s)")
680                    .end().find(".eventInterval").val( objEvent.repeat['interval'] || "1" );
681                   
682                    $(".frequency option[value='monthly']").attr('selected', 'selected')
683                   
684                    $(".event-repeat-monthly:last").removeClass("hidden").find("input[type=radio][name=repeatmonthyType]").click(function(){
685                                if($("input[type=radio][name=repeatmonthyType]:checked").val() == "1")
686                                    $(".event-repeat-weekly:last").removeClass("hidden");
687                                else
688                                    $(".event-repeat-weekly:last").addClass("hidden");
689                    });
690                   
691                                           
692                        if( objEvent.repeat && objEvent.repeat.bymonthday != ''){
693
694                                $("input[type=radio][name=repeatmonthyType][value=0]").attr('checked', 'checked');
695
696                        }else if(objEvent.repeat){
697
698                                $("input[type=radio][name=repeatmonthyType][value=1]").attr('checked', 'checked');
699
700                                var days = objEvent.repeat.byday.split(',');
701
702                                $.each(days, function(i, e){
703                                        $(".event-repeat-weekly:last").find('input[name="repeatweekly[]"][value="'+e+'"]').attr('checked', 'checked');
704                                });
705
706                        }
707
708
709                    if($("input[type=radio][name=repeatmonthyType]:checked").val() == "1")
710                                $(".event-repeat-weekly:last").removeClass("hidden");
711                    else
712                                $(".event-repeat-weekly:last").addClass("hidden");
713                    break;
714                case "yearly":
715                    $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Ano(s)")
716                    .end().find(".eventInterval").val( objEvent.repeat['interval'] || "1" );
717                    $(".frequency option[value='yearly']").attr('selected', 'selected')
718                    break;     
719            }
720        }
721    }
722    else {
723        $(".endRepeat option[value='never']").attr('selected', 'selected');
724    }
725
726
727    $(".event-repeat-container:last").find(".repeat-in").find("[name=startOptions]").change(function(){                                       
728
729        if($(this).find("option:selected").val() == "Today"){
730            $("[name='start']:last").val($("[name='startDate']:last").val());
731            $("[name='start']:last").readOnly=true;
732            $("[name='start']:last").datepicker("disable");
733        }
734        else{
735            $("[name='start']:last").readOnly=false;
736            $("[name='start']:last").datepicker("enable");
737        }
738    });
739    $(".event-repeat-container:last").find(".repeat-in").find("[name=endOptions]").change(function(){                                       
740        if($(this).find("option:selected").val() == "never"){
741            $("[name='occurrences']").addClass("hidden");
742            $("[name='end']:last").addClass("hidden");
743        }
744        else if($(this).find("option:selected").val() == "customDate"){
745            $("[name='occurrences']").addClass("hidden");
746            $("[name='end']:last").removeClass("hidden");   
747        }
748        else{
749            $("[name='end']:last").addClass("hidden");
750            $("[name='occurrences']").removeClass("hidden");                                       
751        }
752    });
753                       
754    $("[name='frequency']:last").change(function () {
755        $(".frequency-option").addClass("hidden");
756        if($(this).val() == "none"){
757            $(".repeat-in").addClass("hidden");
758            return;
759        }else{
760            $(".repeat-in").removeClass("hidden");
761            $("[name='start']:last").val($("[name='startDate']:last").val());
762        }
763                 
764                                 
765        switch($(this).val()){
766            case "daily":
767                $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Dia(s)");
768                break;
769            case "weekly":
770                $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Semana(s)");
771                $(".event-repeat-weekly:last").removeClass("hidden");
772                break;
773            case "monthly":
774                $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Mes(s)");
775                $(".event-repeat-monthly:last").removeClass("hidden").find("input[type=radio][name=repeatmonthyType]").click(function(){
776                    if($("input[type=radio][name=repeatmonthyType]:checked").val() == "1")
777                        $(".event-repeat-weekly:last").removeClass("hidden");
778                    else
779                        $(".event-repeat-weekly:last").addClass("hidden");
780                });
781                if($("input[type=radio][name=repeatmonthyType]:checked").val() == "1")
782                    $(".event-repeat-weekly:last").removeClass("hidden");
783                else
784                    $(".event-repeat-weekly:last").addClass("hidden");
785                break;
786            default:
787                $(".event-repeat-container:last").find(".repeat-in").find(".interval").html("Ano(s)");
788                break;
789        }
790                               
791    });
792});
793
794UI.dialogs.addEvent.find('.calendar_addevent_details_lnk_timezone').click(function(e){
795    $(this).addClass('hidden');
796    $('.calendar-addevent-details-txt-timezone').removeClass('hidden');
797    e.preventDefault();
798});
799               
800UI.dialogs.addEvent.find('.button.remove').button({
801    text:false,
802    icons:{
803        primary:'ui-icon-close'
804    }
805}).click(function(el){
806    var id;
807    if( id = $(this).parent().find('input[name="alarmId[]"]').val())
808        DataLayer.remove('alarm', id);
809    $(this).parent().remove().find('li').is(':empty');
810});
811
812var myCalendar = function(){
813        for(var i in Calendar.signatures)
814            if(Calendar.signatures[i].isOwner == "1")
815                return Calendar.signatures[i].calendar.id;
816}
817
818/*Seleciona a agenda padrão para visualização/edição de um evento*/
819if(objEvent.id)
820    UI.dialogs.addEvent.find('option[value="'+objEvent.calendar+'"]').attr('selected','selected').trigger('change');
821
822/*Adicionar alarms padrões, quando alterado a agenda do usuário*/               
823UI.dialogs.addEvent.find('select[name="calendar"]').change(function(){
824    if((typeof($('input[name = "idEvent"]').val()) == 'undefined') || (!!!$('input[name = "idEvent"]').val())) {
825        $('input[name = "isDefaultAlarm[]"]').parent().remove();
826        UI.dialogs.addEvent.find('input[name="defaultAlarm"]').parent().removeClass('hidden');
827        var calendarSelected = Calendar.signatureOf[$(this).val()];
828        calendarSelected.useAlarmDefault = 1;
829        if(calendarSelected.defaultAlarms != ""){
830            var li_attach = DataLayer.render(path+'templates/alarms_add_itemlist.ejs', {
831                alarm:calendarSelected
832            });
833            jQuery('.event-alarms-list').append(li_attach).find('.button.remove').button({
834                text:false,
835                icons:{
836                    primary:'ui-icon-close'
837                }
838            }).click(function(el) {
839            $(this).parent().remove().find('li').is(':empty');
840        });
841
842    }else{
843        UI.dialogs.addEvent.find('input[name="defaultAlarm"]').parent().addClass('hidden');
844    }
845}
846
847    var participant =  UI.dialogs.addEvent.find('dd.me input[name="attendee[]"]').val();
848    var calendar = $(this).val();
849   
850    if( !parseInt(Calendar.signatureOf[calendar].isOwner) ){
851        var signature = Calendar.signatureOf[calendar];
852        var organizer = DataLayer.get('calendarSignature', {
853            filter: ['AND', ['=','calendar',signature.calendar.id], ['=','isOwner','1']],
854            criteria: {
855                deepness: 2
856            }
857        });
858                           
859    if($.isArray(organizer))
860        organizer = organizer[0];
861    DataLayer.put('participant', {
862        id: participant,
863        user: organizer.user.id,
864        mail: organizer.user.mail
865        });
866                           
867    UI.dialogs.addEvent.find('dt.me').html(organizer.user.name);
868    UI.dialogs.addEvent.find('li.organizer input[name="attendee_organizer"]').val(participant);
869    UI.dialogs.addEvent.find('li.organizer label').filter('.name').html(organizer.user.name).end()
870    .filter('.mail').html(organizer.user.mail).attr('title',organizer.user.mail);
871
872}else{
873    UI.dialogs.addEvent.find('dt.me').html(User.me.name);
874    DataLayer.put('participant', {
875        id: participant,
876        user: User.me.id,
877        mail: User.me.mail
878        });
879    UI.dialogs.addEvent.find('li.organizer input[name="attendee_organizer"]').val(participant);
880    UI.dialogs.addEvent.find('li.organizer label').filter('.name').html(User.me.name).end()
881    .filter('.mail').html(User.me.mail).attr('title',User.me.mail);
882}
883
884});
885
886/*Checkbox adicionar alarms padrões*/
887UI.dialogs.addEvent.find('input[name="defaultAlarm"]').click(function(){
888    if($(this).attr("checked")){
889        $('input[name="isDefaultAlarm[]"]').parent().remove();
890        var calendarSelected = Calendar.signatureOf[$('select[name="calendar"]').val()];
891        calendarSelected.useAlarmDefault = 1;
892        if(calendarSelected.defaultAlarms != ""){
893            var li_attach = DataLayer.render(path+'templates/alarms_add_itemlist.ejs', {
894                alarm:calendarSelected
895            });
896            jQuery('.event-alarms-list').append(li_attach).find('.button.remove').button({
897                text:false,
898                icons:{
899                    primary:'ui-icon-close'
900                }
901            }).click(function(el) {
902            var id;
903            if( id = $(this).parent().find('input[name="alarmId[]"]').val())
904                DataLayer.remove('alarm', id);
905            $(this).parent().remove().find('li').is(':empty')
906        });
907    }
908} else {
909    $('input[name="isDefaultAlarm[]"]').parent().remove();
910}
911});
912/* Checkbox allday */
913UI.dialogs.addEvent.find('input[name="allDay"]').click(function(){
914    $(this).attr("checked") ?
915    UI.dialogs.addEvent.find('.start-time, .end-time').addClass('hidden') :
916    UI.dialogs.addEvent.find('.start-time, .end-time').removeClass('hidden');
917    updateMap(true);
918});
919
920UI.dialogs.addEvent.find('.button').button();
921UI.dialogs.addEvent.find('.button.add').button({
922    icons: {
923        secondary: "ui-icon-plus"
924    }
925});
926
927// ==== validation events ====
928UI.dialogs.addEvent.find(".input-group .h1").Watermark("Evento sem título");
929if(User.preferences.hourFormat.length == 5) {
930    UI.dialogs.addEvent.find(".end-time, .start-time").mask("99:99", {
931        completed: function(){
932            updateMap();
933        }
934    });
935} else {
936    $.mask.definitions['{']='[ap]';
937    $.mask.definitions['}']='[m]';
938    UI.dialogs.addEvent.find(".end-time, .start-time").mask("99:99 {}", {
939        completed:function(){
940            $(this).val(date.Calendar.defaultToAmPm($(this).val()));
941            $(this).timepicker("refresh");
942            $(this).val($(this).val().replace(/[\.]/gi, ""));
943            updateMap();
944        }
945    });
946}
947UI.dialogs.addEvent.find(".number").numeric();
948User.preferences.dateFormat.indexOf('-') > 0 ?
949UI.dialogs.addEvent.find(".date").mask("99-99-9999", {
950    completed:function(){
951        updateMap();
952    }
953}) :
954UI.dialogs.addEvent.find(".date").mask("99/99/9999", {
955    completed:function(){
956        updateMap();
957    }
958});
959
960UI.dialogs.addEvent.find(".menu-addevent")
961.children(".delete").click(function(){
962    $.Zebra_Dialog('Tem certeza que deseja excluir o evento?', {
963        'type':     'question',
964        'overlay_opacity': '0.5',
965        'buttons':  ['Sim', 'Não'],
966        'onClose':  function(clicked) {
967            if(clicked == 'Sim'){
968                canDiscardEventDialog = true;
969                /* Remove por filtro */
970                DataLayer.removeFilter('schedulable', {filter: ['AND', ['=', 'id', objEvent.id], ['=', 'calendar', objEvent.calendar], ['=','user',(objEvent.me.user ? objEvent.me.user.id : objEvent.me.id)]]});
971                Calendar.rerenderView(true);
972                /********************/
973                UI.dialogs.addEvent.dialog("close");
974            }
975        }
976    });
977}).end()
978           
979.children(".cancel").click(function(){
980    UI.dialogs.addEvent.dialog("close");
981}).end()
982           
983.children(".save").click(function(){
984    /* Validação */
985    var msg = false;                   
986    if(msg = validDateEvent()){
987        $(".new-event-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg);
988        return false;
989    }
990                       
991    canDiscardEventDialog = true;
992                       
993    var exit = function(event){
994        if(event)
995            DataLayer.remove('schedulable', event, false);
996
997        UI.dialogs.addEvent.children().find('form.form-addevent').submit();
998        UI.dialogs.addEvent.dialog("close");
999    }
1000                       
1001    if(repeat){
1002        DataLayer.remove('repeat', false);
1003        DataLayer.put('repeat', repeat);
1004        DataLayer.commit('repeat', false, exit(repeat.schedulable));
1005    }else
1006        exit();
1007}).end()
1008               
1009.children(".export").click(function(){
1010    UI.dialogs.addEvent.children().find(".form-export").submit();
1011});
1012
1013dateSameValue();
1014 
1015var fixHour = function(){
1016    currentTimeStart = UI.dialogs.addEvent.find("input.start-time").val();
1017    UI.dialogs.addEvent.find("input.start-time").val(currentTimeStart.replace(".","").replace(".",""));
1018}   
1019 
1020var setTime = function( selectedDateTime ) {
1021    if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __'))
1022          selectedDateTime.value = "";
1023    if(!(User.preferences.hourFormat.length == 5))
1024        $(this).val(selectedDateTime.replace(/[\.]/gi, ""));                                 
1025    updateMap();
1026 
1027    if( Date.parse(selectedDateTime) < Date.parse(oldTime) ) return true;
1028 
1029    var time = selectedDateTime.split(":");
1030 
1031    var hh = time[0];
1032    var mm = time[1].substring(0, 2);
1033   
1034     
1035    dt = new Date();
1036    dt.setHours(hh, mm);
1037    var startHours = dt.getHours();
1038    add = parseInt(User.preferences.defaultDuration) + parseInt($("input.end-time").val().split(":")[1].substring(0,2));
1039    dt.addMinutes(add);
1040     
1041 
1042    var minutes = dt.getMinutes().toString();
1043    var hours = dt.getHours();
1044UI.dialogs.addEvent.find("input.start-time").val(selectedDateTime.replace(".","").replace(".",""));
1045     
1046     
1047    if (time[1].indexOf("p.m.") != -1 ) {
1048        var startHours = startHours == 12 ? 12 : startHours;
1049        var startHours = startHours == 1 ? 13 : startHours;
1050        var startHours = startHours == 2 ? 14 : startHours;
1051        var startHours = startHours == 3 ? 15 : startHours;
1052        var startHours = startHours == 4 ? 16 : startHours;
1053        var startHours = startHours == 5 ? 17 : startHours;
1054        var startHours = startHours == 6 ? 18 : startHours;
1055        var startHours = startHours == 7 ? 19 : startHours;
1056        var startHours = startHours == 8 ? 20 : startHours;
1057        var startHours = startHours == 9 ? 21 : startHours;
1058        var startHours = startHours == 10 ? 22 : startHours;
1059        var startHours = startHours == 11 ? 23 : startHours;
1060    } else if (time[1].indexOf("a.m.") ) {
1061        var startHours = startHours == 12 ? 00 : startHours;
1062    }
1063 
1064 
1065    dtFormat = (time[1].indexOf("p.m.") != -1 || time[1].indexOf("a.m.") != -1) ? ((((User.preferences.defaultDuration / 60) + startHours) >= 12 && (startHours + (User.preferences.defaultDuration / 60)) < 24) ? " pm" : " am") : "";
1066       
1067    var newHours = "";
1068    if(dtFormat){
1069        hours = hours == 13 ? 01 : hours;
1070        hours = hours == 14 ? 02 : hours;
1071        hours = hours == 15 ? 03 : hours;
1072        hours = hours == 16 ? 04 : hours;
1073        hours = hours == 17 ? 05 : hours;
1074        hours = hours == 18 ? 06 : hours;
1075        hours = hours == 19 ? 07 : hours;
1076        hours = hours == 20 ? 08 : hours;
1077        hours = hours == 21 ? 09 : hours;
1078        hours = hours == 22 ? 10 : hours;
1079        hours = hours == 23 ? 11 : hours;
1080        hours = hours == 24 ? 12 : hours;
1081    } else {
1082        newHours = hours <= 9 ? "0" : "";
1083    }
1084 
1085    minutes = minutes.length == 1 ? "0"+minutes+dtFormat : minutes+dtFormat;
1086    newHours +=  hours.toString() + ":" +minutes;
1087    UI.dialogs.addEvent.find("input.end-time").val(newHours);
1088 
1089}
1090 
1091    UI.dialogs.addEvent.find(".start-date").focusout(function(data){ 
1092        UI.dialogs.addEvent.find(".end-date").val($(this).val());
1093    });
1094
1095    var oldTime = UI.dialogs.addEvent.find('input.start-time').val();
1096    $(".start-time").focusout(function(data){
1097        if($("#calendar").fullCalendar('getView').name == "month"){
1098            setTime( $(this).val() );
1099        }
1100    });
1101 
1102    UI.dialogs.addEvent.find('input.start-time').timepicker({
1103        ampm : ((User.preferences.hourFormat.length > 5) ? true: false),
1104        timeFormat: "hh:mm tt",
1105        onSelect: function( selectedDateTime ){
1106            if($("#calendar").fullCalendar('getView').name == "month"){
1107                if ( selectedDateTime.indexOf("p.m.") == -1 || !selectedDateTime.indexOf("a.m.") == -1 ) {
1108                    var selectedTime = selectedDateTime.split(":");
1109                    var endTime = UI.dialogs.addEvent.find(".end-time").val();
1110                    endTime = endTime.split(":");
1111 
1112                    var t1 = new Date(false,false,false,selectedTime[0],selectedTime[1],false);
1113                    var t2 = new Date(false,false,false,endTime[0],endTime[1],false);
1114 
1115                    if (t1 < t2) return true;
1116                }
1117 
1118                setTime( selectedDateTime );
1119            }
1120        },
1121        onClose : function (selectedDateTime){
1122            fixHour();
1123        }
1124 
1125    });
1126 
1127
1128 
1129UI.dialogs.addEvent.find('input.end-time').timepicker({
1130    closeText: 'Ok',
1131    hourGrid: 4,
1132    minuteGrid: 10,
1133    ampm : ((User.preferences.hourFormat.length > 5) ? true: false),
1134    timeFormat: "hh:mm tt",
1135    onSelect: function (selectedDateTime){
1136        if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __'))
1137                          selectedDateTime.value = "";
1138                if(!(User.preferences.hourFormat.length == 5))
1139                $(this).val(selectedDateTime.replace(/[\.]/gi, ""));                                                           
1140                updateMap();
1141 
1142        if ( selectedDateTime.indexOf("p.m.") == -1 || !selectedDateTime.indexOf("a.m.") == -1 ) {
1143            var startT = UI.dialogs.addEvent.find('input.start-time');
1144 
1145            var lessZeroTime = function( sTime ) {
1146                sTime = sTime.split(":");
1147                sTime = new Date(false,false,false,sTime[0],sTime[1],false);
1148                sTimeReady = parseInt(sTime.getHours() - (User.preferences.defaultDuration / 60));
1149 
1150                if( sTimeReady < 0 )
1151                    return false; // If the value is less than 0, return false.
1152                     
1153                return sTimeReady.toString().length == 1 ? "0"+sTimeReady+":00" : sTimeReady+":00";
1154            }
1155 
1156            var hEnd = new Date(false,false,false,selectedDateTime.split(":")[0],selectedDateTime.split(":")[1],false);
1157            var hStart = new Date(false,false,false,startT.val().split(":")[0],startT.val().split(":")[1],false);
1158             
1159            if ( hEnd <= hStart ){
1160                var lessTime = lessZeroTime( selectedDateTime );
1161                if ( !lessTime ){
1162                    startT.val( "00:00" );
1163                    return true;
1164                }
1165                startT.val( lessTime );
1166            }
1167        }
1168    },
1169    onClose : function (selectedDateTime){
1170        if(!(User.preferences.hourFormat.length == 5))
1171            $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
1172    fixHour();
1173    },
1174    beforeShow: function (selectedDateTime) {
1175                if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __'))
1176                        selectedDateTime.value = "";
1177    }
1178});
1179//}
1180
1181UI.dialogs.addEvent.find('.button-add-alarms').click(function(){
1182    var li_attach = DataLayer.render(path+'templates/alarms_add_itemlist.ejs', {});
1183
1184    jQuery('.event-alarms-list').append(li_attach).find('.button.remove').button({
1185        text:false,
1186        icons:{
1187            primary:'ui-icon-close'
1188        }
1189    }).click(function(el) {
1190    $(this).parent().remove().find('li').is(':empty')
1191});
1192// valicacao de campos numericos
1193$('.number').numeric();
1194});
1195           
1196                 
1197UI.dialogs.addEvent.find('.button.suggestion-hours').button({
1198    icons: {
1199        primary: "ui-icon-clock"
1200    },
1201    text: 'Sugerir horário'
1202}).click(function () {
1203    $(this).siblings('input').removeAttr('disabled')
1204    .end().parents().find('input[name="allDay"]').removeAttr('disabled');               
1205});
1206
1207
1208if(!repeat)
1209    if(objEvent.me.id == User.me.id){
1210        objEvent.me.id = DataLayer.put('participant', {
1211            user: objEvent.me.id,
1212            mail: objEvent.me.mail
1213            });
1214        objEvent.organizer.id = objEvent.me.id;
1215    }
1216
1217var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {
1218    event:objEvent
1219});
1220       
1221// load template of attendees
1222var blkAddAtendee = UI.dialogs.addEvent.find('#calendar_addevent_details6').append(attendeeHtml);
1223if(objEvent.attendee.length)
1224                callbackAttendee();
1225/**
1226Opções de delegação do participante/organizer
1227*/             
1228blkAddAtendee.find(".button.participant-delegate").button({
1229    icons: {
1230        primary: "ui-icon-transferthick-e-w"
1231    },
1232    text: false
1233}).click(function () {
1234    if($(this).hasClass('attendee-permissions-change-button')){
1235        if(!$(this).hasClass('disable')){
1236            $(this).removeClass('attendee-permissions-change-button')   
1237            .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
1238            blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
1239            blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
1240        }
1241    }else{                                                                     
1242        $(this).addClass('attendee-permissions-change-button')   
1243        .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
1244        blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para');
1245        blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden');
1246        blkAddAtendee.find('.block-add-attendee.search input.search').focus();
1247    }
1248})
1249.addClass('tiny');             
1250                       
1251//show or hidden permissions attendees
1252//blkAddAtendee.find('.block-attendee-list #attendees-users li').click(show_permissions_attendees);
1253
1254UI.dialogs.addEvent.find(".attendee-list-add .add-attendee-input input").Watermark("digite um email para convidar");
1255/*
1256 * Trata a edição de um novo participante adicionado
1257 */
1258var hasNewAttendee = false;
1259                       
1260blkAddAtendee.find('.attendee-list-add .add-attendee-input span').click(function(data){
1261    blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown();
1262});
1263                       
1264blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown(function(event) {
1265    if (event.keyCode == '13' && $(this).val() != '' || (event.keyCode == undefined && $(this).val() != '')) {
1266        Encoder.EncodeType = "entity";
1267        $(this).val(Encoder.htmlEncode($(this).val()));
1268                                       
1269        newAttendeeEmail = false;
1270        newAttendeeName  = false;
1271        skipAddNewLine   = false;
1272
1273        var info = $(this).val();
1274
1275        /**
1276        * email válido?
1277        */
1278        info.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/) ?
1279        newAttendeeEmail = info : newAttendeeName = info;
1280
1281        /**
1282        * 1) busca no banco para saber se o usuário já existe
1283        *               1.1) se existe, atualiza as info na lista de participantes e nao abre o tooltip
1284        *               1.2) se não existe
1285        *                       a) salva como novo usuario externo no banco (apenas com email)
1286        *                       b) exibe tooltip pedindo o nome
1287        *                       c) se o usuário preenche tooltip e salva, atualiza com o nome o usuário recém criado
1288        *                       d) se o usuário cancela o tooltip, fica o usuário salvo apenas com email e sem nome
1289        */
1290
1291        var user = DataLayer.get('user', ["=", "mail", $(this).val()]);
1292        if(!!user && user[0].id)
1293            attendees[user[0].id] = {
1294                name: user[0].name
1295                };
1296                                       
1297        /**
1298        * guarda o último tooltip aberto referente à lista de participantes
1299        */
1300        lastEditAttendeeToolTip = [];
1301
1302        /**
1303        * Valida email e salva um participante externo
1304        */
1305        var saveContact = function() {
1306            Encoder.EncodeType = "entity";
1307
1308            var currentTip = $('.qtip-active');
1309            newAttendeeName  = currentTip.find('input[name="name"]').val();
1310            newAttendeeEmail = currentTip.find('input[name="mail"]').val();
1311
1312            if (!(!!newAttendeeEmail.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/))) {
1313                currentTip.find('.messages').removeClass('hidden').find('.message label').html('Email inválido.');
1314                return false;
1315            }
1316
1317            DataLayer.put('user', {
1318                id:userId,
1319                name:newAttendeeName,
1320                mail:newAttendeeEmail,
1321                isExternal:isExternal
1322            });
1323
1324            lastEditAttendeeToolTip.find('label')
1325            .filter('.name').html(Encoder.htmlEncode(newAttendeeName)).attr('title', Encoder.htmlEncode(newAttendeeName)).end()
1326            .filter('.mail').html(Encoder.htmlEncode(newAttendeeEmail)).attr('title', Encoder.htmlEncode(newAttendeeEmail));
1327
1328            blkAddAtendee.find('.attendee-list-add .add-attendee-input input').val('');
1329            return true;
1330        }
1331                                               
1332        /**
1333                                         * Formata e adequa um tootip abert para edição de um participante na lista
1334                                         */
1335        var onShowToolTip = function(arg0) {
1336            $('.qtip-active .button.close').button({
1337                icons: {
1338                    primary: "ui-icon-close"
1339                },
1340                text: false
1341            });
1342            $('.qtip-active .button').button()
1343            .filter('.save').click(function(event, ui) {
1344                if(saveContact())
1345                    lastEditAttendeeToolTip.qtip("destroy");
1346                else
1347                    return false;
1348            }).end()
1349            .filter('.cancel').click(function(event, ui) {
1350                lastEditAttendeeToolTip.qtip("destroy");
1351            })
1352
1353            /**
1354                                                 * Trata o ENTER no campo da tooltip, equivalente a salvar
1355                                                 * o novo convidado.
1356                                                 */
1357            $('.qtip-active input').keydown(function(event) {
1358                if (event.keyCode == '13') {                                           
1359                    if (saveContact())                                         
1360                        lastEditAttendeeToolTip.qtip("destroy");
1361                       
1362                    lastEditAttendeeToolTip.qtip("destroy");
1363                    event.preventDefault();
1364                }
1365            })
1366            .filter('[name="name"]').Watermark("informe o nome do contato").end()
1367            .filter('[name="mail"]').Watermark("informe o email do contato");
1368        }
1369                                       
1370        /**
1371                                         * Se o email digitado já foi adicionado na lista,
1372                                         * o usuário deve ser avisado e um botão de edição deve ser exibido
1373                                         */
1374        if(blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').length) {
1375            hasNewAttendee  = false;
1376            newAttendeeName = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li').find('label.name').attr('title');
1377
1378            blkAddAtendee.find('.email-validation').removeClass('hidden')
1379            .find('.message label').html("O usuário acima já foi adicionado! <a class=\"small button\">Editar</a>")
1380            .find(".button").button().click(function () {
1381                /**
1382                                                         * Se o usuário optar por editar o participante anteriormente adicionado,
1383                                                         * uma tooltip deve ser aberta para este participante, viabilizando a edição
1384                                                         */
1385                blkAddAtendee.find("ul.attendee-list").scrollTo('label.mail[title="' + newAttendeeEmail + '"]');
1386                /**
1387                                                         * Remove tooltip possivelmente existente
1388                                                         */
1389                if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
1390                    lastEditAttendeeToolTip.qtip('destroy');
1391                                       
1392                lastEditAttendeeToolTip = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li');
1393                lastEditAttendeeToolTip.qtip({
1394                    show: {
1395                        ready: true,
1396                        solo: true,
1397                        when: {
1398                            event: 'click'
1399                        }
1400                    },
1401                hide: false,
1402                content: {
1403                    text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
1404                        attendee:{
1405                            name:newAttendeeName,
1406                            mail:newAttendeeEmail
1407                        }
1408                    } ) ),
1409                title: {
1410                    text:'Detalhes do participante',
1411                    button: '<a class="button close" href="#">close</a>'
1412                }
1413                },
1414                style: {
1415                    name: 'blue',
1416                    tip: {
1417                        corner: 'leftMiddle'
1418                    },
1419                    border: {
1420                        width: 4,
1421                        radius: 8
1422                    },
1423                    width: {
1424                        min: 230,
1425                        max:230
1426                    }
1427                },
1428            position: {
1429                corner: {
1430                    target: 'rightMiddle',
1431                    tooltip: 'leftMiddle'
1432                },
1433                adjust: {
1434                    x:0,
1435                    y:0
1436                }
1437            }
1438            });
1439        lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
1440    });
1441skipAddNewLine = true;
1442} else {
1443    hasNewAttendee  = true;
1444    blkAddAtendee.find('.email-validation').addClass('hidden');
1445}
1446                                       
1447                                       
1448var isExternal = (!!user && !(!!user.isExternal)) ? 0 : 1;
1449
1450/**
1451                                         * Remove tooltip possivelmente existente
1452                                         */
1453if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
1454    lastEditAttendeeToolTip.qtip('destroy');
1455
1456userId = '';
1457var newAttendeeId = '';
1458
1459if (user){
1460    if (!skipAddNewLine) {
1461        user[0].id =  DataLayer.put('participant', {
1462            user: user[0].id,
1463            isExternal: isExternal,
1464            acl: 'r'
1465        });
1466        user[0].acl = objEvent.acl;
1467        user[0].isDirty = !!!objEvent.id;
1468        user[0].isDelegate = (objEvent.id && (objEvent.me.status == '5'));
1469
1470        blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
1471            DataLayer.render(path+'templates/participants_add_itemlist.ejs', user)
1472            )
1473        .scrollTo('max');
1474        callbackAttendee();
1475    }
1476                                               
1477    $(this).val('');
1478
1479} else if (!skipAddNewLine) {
1480    /**
1481     * a) salva como novo usuario externo no banco (apenas com email) e...
1482     * adiciona novo contato externo à lista de convidados
1483     */
1484
1485    userId = DataLayer.put('user', {
1486        name: newAttendeeName,
1487        mail: newAttendeeEmail,
1488        isExternal: isExternal
1489    });
1490    newAttendeeId = DataLayer.put('participant', {
1491        user: userId,
1492        isExternal: isExternal
1493    });
1494
1495                                                 
1496    blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
1497        DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{
1498            id:newAttendeeId,
1499            name: newAttendeeName,
1500            mail: newAttendeeEmail,
1501            isExternal: 1,
1502            acl: objEvent.acl,
1503            isDirty: !!!objEvent.id,
1504        isDelegate: (objEvent.id && (objEvent.me.status == '5'))
1505            }])
1506        ).scrollTo('max');
1507    callbackAttendee();
1508
1509    /**
1510                                                 * Adiciona tootip para atualização dos dados do contato externo
1511                                                 * recém adicionado.
1512                                                 */
1513    lastEditAttendeeToolTip = blkAddAtendee.find('dd.attendee-list li:last');
1514    lastEditAttendeeToolTip.qtip({
1515        show: {
1516            ready: true,
1517            solo: true,
1518            when: {
1519                event: 'click'
1520            }
1521        },
1522    hide: false,
1523    content: {
1524        text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
1525            attendee:{
1526                name:newAttendeeName,
1527                mail:newAttendeeEmail
1528            }
1529        } ) ),
1530    title: {
1531        text:'Detalhes do participante',
1532        button: '<a class="button close" href="#">close</a>'
1533    }
1534    },
1535    style: {
1536        name: 'blue',
1537        tip: {
1538            corner: 'leftMiddle'
1539        },
1540        border: {
1541            width: 4,
1542            radius: 8
1543        },
1544        width: {
1545            min: 230,
1546            max:230
1547        }
1548    },
1549position: {
1550    corner: {
1551        target: 'rightMiddle',
1552        tooltip: 'leftMiddle'
1553    },
1554    adjust: {
1555        x:0,
1556        y:0
1557    }
1558}
1559});
1560                       
1561lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
1562
1563$(this).val('');
1564
1565                                               
1566}
1567event.preventDefault();
1568}
1569                               
1570});
1571
1572/**
1573* Trata a busca de usuários para adição de participantes
1574*/
1575blkAddAtendee.find('.add-attendee-search .ui-icon-search').click(function(event) {
1576    blkAddAtendee.find('.add-attendee-search input').keydown();
1577});
1578                       
1579                       
1580blkAddAtendee.find('.add-attendee-search input').keydown(function(event) {
1581
1582    if(event.keyCode == '13' || typeof(event.keyCode) == 'undefined') {                 
1583        var result = DataLayer.get('user', ["*", "name", $(this).val()], true);
1584
1585        /**
1586        * TODO: trocar por template
1587        */
1588        blkAddAtendee.find('ul.search-result-list').empty().css('overflow', 'hidden');
1589        if (!result) {
1590            blkAddAtendee.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
1591        }
1592
1593        for(i=0; i<result.length; i++)
1594            result[i].enabled = (blkAddAtendee.find('dd.attendee-list ul.attendee-list label.mail[title="' +  result[i].mail + '"]').length) ? false : true;
1595                                                                                       
1596        blkAddAtendee.find('ul.search-result-list').append(DataLayer.render( path+'templates/participants_search_itemlist.ejs', result));
1597
1598        blkAddAtendee.find('ul.search-result-list li').click(function(event, ui){
1599            if ($(event.target).is('input')) {
1600                old_item = $(event.target).parents('li');
1601                newAttendeeId = DataLayer.put('participant', {
1602                    user: old_item.find('.id').html(),
1603                    isExternal: old_item.find('.isExternal').html()
1604                });
1605                                                       
1606                attendees[old_item.find('.id').html()] = old_item.find('.name').html();
1607                                                       
1608                blkAddAtendee.find('dd.attendee-list ul.attendee-list')
1609                .append(DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{
1610                    id: newAttendeeId,
1611                    name: old_item.find('.name').html(),
1612                    mail: old_item.find('.mail').html(),
1613                    isExternal: old_item.find('.isExternal').html(),
1614                    acl: objEvent.acl,
1615                    isDirty: !!!objEvent.id,
1616            isDelegate: (objEvent.id && (objEvent.me.status == '5'))
1617                    }]))
1618                .scrollTo('max');
1619                /**
1620                                                        * Delegação de participação de um participante com permissão apenas de leitura
1621                                                        *
1622                                                        */
1623                if(!objEvent.acl.organization && !objEvent.acl.write && !objEvent.acl.inviteGuests && objEvent.acl.read ){
1624                                                               
1625                    blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
1626                    blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
1627                                                               
1628                    blkAddAtendee.find('.status option').toggleClass('hidden');
1629                    blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change');
1630                    blkAddAtendee.find('.request-update').removeClass('hidden');
1631
1632                    blkAddAtendee.find('dd.attendee-list ul.attendee-list li .button.close').parents('li').find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
1633                                                               
1634                    blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled');
1635                    blkAddAtendee.find(".button.close").button({
1636                        icons: {
1637                            primary: "ui-icon-close"
1638                        },
1639                        text: false
1640                    }).click(function () {
1641                                                                       
1642                        $(this).parents('li').find('input[name="delegatedFrom[]"]').val('');
1643                        blkAddAtendee.find('.request-update').addClass('hidden');
1644                        blkAddAtendee.find('.status option').toggleClass('hidden');
1645                        blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');                   
1646                        blkAddAtendee.find('.me .participant-delegate').removeClass('disable ui-button-disabled ui-state-disabled attendee-permissions-change-button')
1647                        .find('.ui-icon-person').removeClass('attendee-permissions-change').end();                     
1648                                                                       
1649                        DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
1650                        $(this).parents('li').remove();
1651                    })
1652                    .addClass('tiny');
1653                }else{
1654                    callbackAttendee();
1655                    old_item.remove();
1656                }
1657            }
1658        });
1659
1660        event.preventDefault();
1661    }
1662});
1663
1664//$('.block-add-attendee .search-result-list').selectable();
1665
1666UI.dialogs.addEvent.find('.row.fileupload-buttonbar .button').filter('.delete').button({
1667    icons: {
1668        primary: "ui-icon-close"
1669    },
1670    text: 'Excluir'
1671}).click(function () {
1672    $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', {
1673        'type':     'question',
1674        'overlay_opacity': '0.5',
1675        'buttons':  ['Sim', 'Não'],
1676        'onClose':  function(clicked) {
1677            if(clicked == 'Sim'){
1678               
1679                var ids = [];
1680                $.each($('.attachment-list input'), function (i, input) {
1681                     DataLayer.remove('schedulableToAttachment', {
1682                        filter: ['=', 'id', ''+input.value]
1683                        });
1684                });
1685                $('div.new-event-win .attachment-list input').remove();
1686                $('div.new-event-win .row.fileupload-buttonbar .attachments-list p').remove();
1687                $('div.new-event-win .btn-danger.delete').addClass('hidden');
1688            }
1689        }});
1690}).end()
1691.filter('.close').button({
1692    icons: {
1693        primary: "ui-icon-close"
1694    },
1695    text: false
1696}).click(function () {
1697    DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val());
1698    $(this).parents('p').remove();
1699}).end()
1700.filter('.downlaod-archive').button({
1701    icons: {
1702        primary: "ui-icon-arrowthickstop-1-s"
1703    },
1704    text: false
1705});
1706
1707extendsFileupload('event', path);
1708       
1709if(objEvent.isShared){
1710               
1711    var acls = Calendar.signatureOf[objEvent.calendar].permission.acl;
1712               
1713    if(!acls.write){
1714        UI.dialogs.addEvent.find(':input').attr('disabled', 'disabled');
1715        UI.dialogs.addEvent.find('.button').hide();
1716    }
1717               
1718    if(acls.remove)
1719        UI.dialogs.addEvent.find('.button.remove').show();
1720   
1721    UI.dialogs.addEvent.find('.button.cancel').show(); 
1722}
1723
1724disponibily(objEvent, path, attendees, 'event');
1725
1726/*Seleciona a agenda padrão para criação de um evento*/
1727if(!objEvent.id){
1728    var selectedCalendar = (objEvent.calendar != undefined) ? objEvent.calendar : (User.preferences.defaultCalendar ? User.preferences.defaultCalendar : myCalendar());
1729    UI.dialogs.addEvent.find('option[value="'+selectedCalendar+'"]').attr('selected','selected').trigger('change');
1730}
1731UI.dialogs.addEvent.find(':input').change(function(event){
1732    if (event.keyCode != '27' && event.keyCode != '13')
1733        canDiscardEventDialog = false;
1734}).keydown(function(event){
1735    if (event.keyCode != '27' && event.keyCode != '13')
1736        canDiscardEventDialog = false;
1737});     
1738
1739UI.dialogs.addEvent.dialog('open');
1740
1741}
1742
1743
1744
1745function add_tab_preferences()
1746{
1747    if(!(document.getElementById('preference_tab')))
1748    {
1749        var tab_title = "Preferencias";
1750        $tabs.tabs( "add", "#preference_tab", tab_title );
1751               
1752        /*
1753                DataLayer.render( 'templates/timezone_list.ejs', {}, function( timezones_options ){
1754                        tabPrefCalendar.find('select[name="timezone"]').html(timezones_options).find('option[value="'+User.preferences.timezone+'"]').attr('selected','selected').trigger('change');
1755                });
1756                */
1757        DataLayer.render( 'templates/preferences_calendar.ejs', {
1758            preferences:User.preferences,
1759            calendars: Calendar.calendars,
1760        signatureOf : Calendar.signatureOf
1761            }, function( template ){
1762            var tabPrefCalendar = jQuery('#preference_tab').html( template ).find('.preferences-win');
1763               
1764            tabPrefCalendar.find('select[name="defaultCalendar"] option[value="'+User.preferences.defaultCalendar+'"]').attr('selected','selected').trigger('change');
1765        tabPrefCalendar.find('select[name="dafaultImportCalendar"] option[value="'+User.preferences.dafaultImportCalendar+'"]').attr('selected','selected').trigger('change');
1766 
1767        DataLayer.render( 'templates/timezone_list.ejs', {}, function( timezones_options ){
1768
1769                tabPrefCalendar.find('select[name="timezone"]').html(timezones_options).find('option[value="'+User.preferences.timezone+'"]').attr('selected','selected').trigger('change');
1770            });
1771               
1772            tabPrefCalendar.find('.button').button()
1773            .filter('.save').click(function(evt){
1774                tabPrefCalendar.find('form').submit();
1775                $('#calendar').fullCalendar('render');
1776                $('.block-vertical-toolbox .mini-calendar').datepicker( "refresh" );
1777                $tabs.tabs( "remove", "#preference_tab");
1778            }).end().filter('.cancel').click(function(evt){
1779                $tabs.tabs( "remove", "#preference_tab");
1780            });
1781                       
1782            tabPrefCalendar.find('.number').numeric();
1783                       
1784            tabPrefCalendar.find('input.time').timepicker({
1785                closeText: 'Ok',
1786                hourGrid: 4,
1787                minuteGrid: 10,
1788                ampm : (parseInt($("select[name=hourFormat] option:selected").val().length) > 5 ? true : false), //((User.preferences.hourFormat.length > 5) ? true: false),
1789                timeFormat: "hh:mm tt",
1790                onSelect: function (selectedDateTime){
1791                    if(!(User.preferences.hourFormat.length == 5)) {
1792                        $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
1793                    }
1794                },
1795                onClose : function (selectedDateTime){
1796                    if(!(User.preferences.hourFormat.length == 5)) {
1797                        $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
1798                    }
1799                }
1800            });
1801                       
1802            $.mask.definitions['{']='[ap]';
1803            $.mask.definitions['}']='[m]';
1804            tabPrefCalendar.find("input.time").mask( ((User.preferences.hourFormat.length > 5) ? "99:99 {}" : "99:99"), {
1805                completed:function(){
1806                    $(this).val(dateCalendar.defaultToAmPm($(this).val()));
1807                    $(this).timepicker("refresh");
1808                    $(this).val($(this).val().replace(/[\.]/gi, ""));                                   
1809                }
1810            });
1811                                                           
1812            tabPrefCalendar.find("select[name=hourFormat]").change( function() { // evento ao selecionar formato de hora
1813               
1814                tabPrefCalendar.find("input.time").timepicker("destroy");
1815
1816                tabPrefCalendar.find('input.time').timepicker({
1817                    closeText: 'Ok',
1818                    hourGrid: 4,
1819                    minuteGrid: 10,
1820                    ampm : (parseInt($("select[name=hourFormat] option:selected").val().length) > 5 ? true : false),
1821                    timeFormat: "hh:mm tt",
1822                    onSelect: function (selectedDateTime){
1823                        if(!(User.preferences.hourFormat.length == 5)) {
1824                            $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
1825                        }                                                       
1826                    },
1827                    onClose : function (selectedDateTime){
1828                        if(!(User.preferences.hourFormat.length == 5)) {
1829                            $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
1830                        }
1831                    }
1832                });
1833                               
1834                var defaultStartHour = tabPrefCalendar.find("input[name=defaultStartHour]").val().trim();
1835                var defaultEndHour = tabPrefCalendar.find("input[name=defaultEndHour]").val().trim();
1836               
1837                tabPrefCalendar.find("input.time").mask( (($("select[name=hourFormat] option:selected").val().trim().length > 5) ? "99:99 {}" : "99:99") );
1838               
1839                if (parseInt($("select[name=hourFormat] option:selected").val().length) > 5) { // am/pm
1840                    tabPrefCalendar.find("input[name=defaultStartHour]").val(dateCalendar.defaultToAmPm(defaultStartHour));
1841                    tabPrefCalendar.find("input[name=defaultEndHour]").val(dateCalendar.defaultToAmPm(defaultEndHour))
1842                                       
1843                } else { //24h
1844                    tabPrefCalendar.find("input[name=defaultStartHour]").val(dateCalendar.AmPmTo24(defaultStartHour));
1845                    tabPrefCalendar.find("input[name=defaultEndHour]").val(dateCalendar.AmPmTo24(defaultEndHour));
1846                }
1847            });                 
1848                       
1849                       
1850                       
1851        });             
1852    } else {
1853        $tabs.tabs("select", "#preference_tab");
1854               
1855        return true;
1856    }
1857}
1858
1859
1860function add_tab_configure_calendar(calendar, type)
1861{
1862    $('.qtip.qtip-blue').remove();
1863
1864    var calendars = [];
1865    var signatures = [];
1866    var previewActiveCalendarConf = 0;
1867        var calendarAlarms = [];
1868       
1869        for (var i=0; i<Calendar.signatures.length; i++) {
1870                if(parseInt(Calendar.signatures[i].calendar.type) == type){
1871                   calendars.push(Calendar.signatures[i].calendar);
1872                   signatures.push(Calendar.signatures[i]);
1873                   length = signatures.length - 1;
1874                   signatures[length].numberDefaultAlarm = signatures[length].defaultAlarms != '' ?  signatures[length].defaultAlarms.length: 0;
1875                   if (calendar && calendars[length].id == calendar)
1876                           previewActiveCalendarConf = length;
1877                }
1878   }
1879        var tab_selector = ['configure_tab', 'configure_tab_group'];   
1880    if(!(document.getElementById(tab_selector[type])))
1881    {
1882        $('.positionHelper').css('display', 'none');
1883        $('.cal-list-options-btn').removeClass('fg-menu-open ui-state-active');
1884        if(type == 0){
1885                var tab_title = "Configurações de agendas";
1886        }else{
1887                var tab_title = "Configurações de Grupos";
1888        }
1889        $tabs.tabs( "add", "#"+tab_selector[type], tab_title );
1890               
1891        var dataColorPicker = {
1892            colorsSuggestions: colors_suggestions()
1893        };
1894               
1895               
1896               
1897        var populateAccordionOnActive = function(event, ui) {
1898            var nowActive = (typeof(event) == 'number') ? event : $(event.target).accordion( "option", "active" );
1899            if (nowActive === false)
1900                        return;
1901            dataColorPicker.colorsDefined = {
1902                border: '#'+signatures[nowActive].borderColor,
1903                font:'#'+signatures[nowActive].fontColor,
1904                background:'#'+signatures[nowActive].backgroundColor
1905            };
1906            if (!jQuery('.accordion-user-calendars .ui-accordion-content').eq(nowActive).has('form')) {
1907                return true;
1908            }
1909
1910            DataLayer.render( 'templates/configure_calendars_itemlist.ejs', {
1911                user:User,
1912                type:0,
1913                calendar:calendars[nowActive],
1914                signature:signatures[nowActive]
1915                }, function( form_template ){
1916                var form_content = jQuery('#'+tab_selector[type]+' .accordion-user-calendars .ui-accordion-content').eq(nowActive).html( form_template ).find('form');
1917                form_content.find('.preferences-alarms-list .button').button({
1918                    text:false,
1919                    icons:{
1920                        primary:'ui-icon-close'
1921                    }
1922                });
1923            form_content.find('.button').button();
1924            jQuery('.preferences-alarms-list').find('.button.remove').click(function(el){
1925                        calendarAlarms[calendarAlarms.length] = $(this).parent('li').find('input[name="alarmId[]"]').val();
1926                        $(this).parent().remove();
1927                });
1928       
1929                DataLayer.render( 'templates/timezone_list.ejs', {}, function( timezones_options ){
1930                    var valueTimeZone = calendars[nowActive].timezone;
1931                    form_content.find('select[name="timezone"]').html(timezones_options).find('option[value="'+valueTimeZone+'"]').attr('selected','selected').trigger('change');
1932                });
1933
1934                form_content.find('.button-add-alarms').click(function(){
1935                    DataLayer.render( 'templates/alarms_add_itemlist.ejs', {type: (parseInt(type) == 1 ? '4' : type) }, function( template ){
1936                        jQuery('.preferences-alarms-list').append(template)
1937                        .find('li:last label:eq(0)').remove().end()
1938                        .find('.number').numeric().end()
1939                        .find('.button.remove').button({
1940                            text:false,
1941                            icons:{
1942                                primary:'ui-icon-close'
1943                            }
1944                        }).click(function(el) {
1945                        $(this).parent().remove();
1946                    });   
1947                    });
1948                });
1949
1950
1951            /**
1952                                 * Set color picker
1953                                 */
1954            DataLayer.render( 'templates/calendar_colorpicker.ejs', dataColorPicker, function( template ){
1955                form_content.find('.calendar-colorpicker').html( template );
1956
1957                var f = $.farbtastic(form_content.find('.colorpicker'), colorpickerPreviewChange);
1958                var selected;
1959                var colorpicker = form_content.find('.calendar-colorpicker');
1960                                       
1961                var colorpickerPreviewChange = function(color) {
1962                    var pickedup = form_content.find('.colorwell-selected').val(color).css('background-color', color);
1963
1964                    var colorpicker = form_content.find('.calendar-colorpicker');
1965
1966                    if (pickedup.is('input[name="backgroundColor"]')) {
1967                        colorpicker.find('.fc-event-skin').css('background-color',color);
1968                    } else if (pickedup.is('input[name="fontColor"]')) {
1969                        colorpicker.find('.fc-event-skin').css('color',color);
1970                    } else if (pickedup.is('input[name="borderColor"]')) {
1971                        colorpicker.find('.fc-event-skin').css('border-color',color);
1972                    }
1973                }
1974                                       
1975                form_content.find('.colorwell').each(function () {
1976                    f.linkTo(this);
1977
1978                    if ($(this).is('input[name="backgroundColor"]')) {
1979                        colorpicker.find('.fc-event-skin').css('background-color', $(this).val());
1980                    } else if ($(this).is('input[name="fontColor"]')) {
1981                        colorpicker.find('.fc-event-skin').css('color', $(this).val());
1982                    } else if ($(this).is('input[name="borderColor"]')) {
1983                        colorpicker.find('.fc-event-skin').css('border-color', $(this).val());
1984                    }
1985                })
1986                .focus(function() {
1987                    if (selected) {
1988                        $(selected).removeClass('colorwell-selected');
1989                    }
1990
1991                    $(selected = this).addClass('colorwell-selected');
1992                    f.linkTo(this, colorpickerPreviewChange);
1993                    f.linkTo(colorpickerPreviewChange);
1994
1995                });
1996
1997                form_content.find('select.color-suggestions').change(function() {
1998                    var colors;
1999
2000                    if(colors = dataColorPicker.colorsSuggestions[$(this).val()]) {     
2001                        colorpicker
2002                        .find('input[name="fontColor"]').val(colors.font).focus().end()
2003                        .find('input[name="backgroundColor"]').val(colors.background).focus().end()
2004                        .find('input[name="borderColor"]').val(colors.border).focus().end()
2005
2006                        .find('.fc-event-skin').css({
2007                            'background-color':dataColorPicker.colorsSuggestions[$(this).val()].background,
2008                            'border-color':dataColorPicker.colorsSuggestions[$(this).val()].border,
2009                            'color':dataColorPicker.colorsSuggestions[$(this).val()].font
2010                        });
2011                    }
2012                });
2013
2014                /**
2015                                         * Trata a mudança dos valores dos campos de cores.
2016                                         * Se mudar um conjunto de cores sugerido,
2017                                         * este vira um conjunto de cores personalizado.
2018                                         */
2019                form_content.find('.colorwell').change(function (element, ui) {
2020                    if (true) {
2021                        form_content.find('select.color-suggestions')
2022                        .find('option:selected').removeAttr('selected').end()
2023                        .find('option[value="custom"]').attr('selected', 'selected').trigger('change');
2024                    }
2025                });
2026            }); //END set colorpicker
2027
2028            form_content.find('.phone').mask("+99 (99) 9999-9999");
2029            form_content.find('.number').numeric();
2030
2031        }); //END DataLayer.render( 'templates/configure_calendars_itemlist.ejs' ...
2032
2033// === validations preferences ====
2034
2035                       
2036} //END populateAccordionOnActive(event, ui)
2037               
2038
2039DataLayer.render( 'templates/configure_calendars.ejs', {
2040    user:User,
2041        type: type,
2042    calendars:calendars,
2043    signatures:signatures
2044}, function( template ){
2045    var template_content = jQuery('#'+tab_selector[type]).html( template ).find('.configure-calendars-win');
2046    template_content.find('.button').button().filter('.save').click(function(evt){
2047        if(calendarAlarms.length)
2048                DataLayer.removeFilter('calendarSignatureAlarm', {filter: ['IN','id', calendarAlarms]});       
2049        template_content.find('form').submit();
2050        $tabs.tabs( "remove", "#"+tab_selector[type]);
2051        DataLayer.commit( false, false, function( received ){
2052            delete Calendar.currentViewKey;
2053            Calendar.load();
2054            refresh_calendars();
2055        });
2056        if(calendarAlarms.length)
2057                Calendar.load();
2058    }).end().filter('.cancel').click(function(evt){
2059        $tabs.tabs( "remove", "#"+tab_selector[type]);
2060    });
2061
2062    /**
2063                         * Muda a estrutura do template para a aplicação do plugin accordion
2064                         */
2065    template_content.find('.header-menu-container').after('<div class="accordion-user-calendars"></div>').end().find('.accordion-user-calendars')
2066    .append(template_content.children('fieldset'));
2067                       
2068    template_content.find('.accordion-user-calendars').children('fieldset').each(function(index) {
2069        $(this).before($('<h3></h3>').html($(this).children('legend')));
2070    });
2071                       
2072    template_content.find('.accordion-user-calendars').accordion({
2073        autoHeight: false,
2074        collapsible: true,
2075        clearStyle: true,
2076        active: previewActiveCalendarConf,
2077        changestart: populateAccordionOnActive
2078    });
2079    populateAccordionOnActive(previewActiveCalendarConf);
2080});
2081
2082} else {
2083        $('.positionHelper').css('display','none');
2084    $('.cal-list-options-btn').removeClass('fg-menu-open ui-state-active');
2085    $tabs.tabs("select", "#"+tab_selector[type]);
2086    $('.accordion-user-calendars').accordion( "activate" , previewActiveCalendarConf );
2087               
2088    return true;
2089}
2090
2091}
2092
2093function getSelectedCalendars( reverse, type ){
2094    var selector = !!type ? "div.my-groups-task .calendar-view" : "div.my-calendars .calendar-view, div.signed-calendars .calendar-view";
2095    var returns = [];
2096 
2097    $.each( $(selector), function(i , c){
2098 
2099        if( reverse ? !c.checked : c.checked )
2100            returns.push( c.value );
2101 
2102    });
2103 
2104    if (!returns.length)
2105            return false;
2106 
2107    return returns;
2108}
2109
2110/**
2111 * TODO - transformar em preferência do módulo e criar telas de adição e exclusão de conjunto de cores
2112 */
2113function colors_suggestions(){
2114    return [
2115    {
2116        name:'Padrão',
2117        border:'#3366cc',
2118        font:'#ffffff',
2119        background:'#3366cc'
2120    },
2121
2122    {
2123        name:'Coala',
2124        border:'#123456',
2125        font:'#ffffff',
2126        background:'#385c80'
2127    },
2128
2129    {
2130        name:'Tomate',
2131        border:'#d5130b',
2132        font:'#111111',
2133        background:'#e36d76'
2134    },
2135
2136    {
2137        name:'Limão',
2138        border:'#32ed21',
2139        font:'#1f3f1c',
2140        background:'#b2f1ac'
2141    },
2142
2143    {
2144        name:'Alto contraste',
2145        border:'#000000',
2146        font:'#ffffff',
2147        background:'#222222'
2148    }
2149    ]           
2150}
2151
2152function remove_event(eventId, idCalendar, type){
2153    $.Zebra_Dialog('Tem certeza que deseja excluir?', {
2154        'type':     'question',
2155        'overlay_opacity': '0.5',
2156        'buttons':  ['Sim', 'Não'],
2157        'onClose':  function(clicked) {
2158            if(clicked == 'Sim'){
2159
2160                var schedulable = getSchedulable( eventId, '');
2161                schedulable.calendar = ''+idCalendar;
2162                var schudableDecode = DataLayer.encode( "schedulable:preview", schedulable);
2163                var me = schudableDecode.me.user ? schudableDecode.me.user.id : schudableDecode.me.id;
2164
2165        var filter = {filter: ['AND', ['=','id',eventId], ['=','calendar',idCalendar], ['=','user', me]]};
2166
2167        if(type)
2168            filter.filter.push(['=','type',type]);
2169
2170                DataLayer.removeFilter('schedulable', filter);
2171                Calendar.rerenderView(true);
2172            }
2173        }
2174    });
2175}
2176
2177function mount_exception(eventID, exception){
2178
2179    getSchedulable( eventID.toString() , '');
2180    var schedulable = DataLayer.get('schedulable', eventID.toString() )
2181    var edit = { repeat: (DataLayer.get('repeat', schedulable.repeat)) };
2182
2183    edit.repeat.startTime = new Date(parseInt(edit.repeat.startTime)).toString('yyyy-MM-dd HH:mm:00');
2184    edit.repeat.endTime = parseInt(edit.repeat.count) > 0 ? '0' : new Date(parseInt(edit.repeat.endTime)).toString('yyyy-MM-dd HH:mm:00');
2185   
2186    edit.repeat.exceptions = ( exception );
2187   
2188    return edit.repeat;
2189}
2190
2191function remove_ocurrence(eventId, idRecurrence){
2192    $.Zebra_Dialog('Tem certeza que deseja excluir esta ocorrência?', {
2193        'type':     'question',
2194        'overlay_opacity': '0.5',
2195        'buttons':  ['Sim', 'Não'],
2196        'onClose':  function(clicked) {
2197            if(clicked == 'Sim'){
2198                var repeat = mount_exception(eventId, idRecurrence);
2199                DataLayer.remove('repeat', false);
2200                DataLayer.put('repeat', repeat);
2201                DataLayer.commit(false, false, function(data){
2202                    Calendar.rerenderView(true);
2203                });
2204            }
2205        }
2206    });
2207}
2208
2209
2210function remove_calendar(type){
2211    /* Pode ser assim $('.cal-list-options-btn.ui-state-active').attr('class').replace(/[a-zA-Z-]+/g, ''); */
2212        if(!!parseInt(type))
2213                var title = 'Todas as tarefas deste grupo serão removidas. Deseja prosseguir com a operação?';
2214        else
2215                var title = 'Todos os eventos desta agenda serão removidos. Deseja prosseguir com a operação?';
2216    $.Zebra_Dialog(title, {
2217        'type':     'question',
2218        'overlay_opacity': '0.5',
2219        'buttons':  ['Sim', 'Não'],
2220        'onClose':  function(clicked) {
2221            if(clicked == 'Sim'){
2222                var idCalendar =  $('.cal-list-options-btn.ui-state-active').attr('class').match(/[0-9]+/g);
2223                               
2224                DataLayer.remove('calendarSignature', Calendar.signatureOf[idCalendar[0]].id );
2225                               
2226                if(idCalendar == User.preferences.defaultCalendar)
2227                    DataLayer.remove( 'modulePreference', User.preferenceIds['defaultCalendar']);
2228                       
2229                DataLayer.commit( false, false, function( received ){
2230                    delete Calendar.currentViewKey;
2231                    Calendar.load();
2232                    refresh_calendars(type);
2233                });
2234            }
2235            $('.positionHelper').css('display', 'none');
2236       
2237        }
2238    });
2239}
2240
2241function refresh_calendars(type){
2242
2243    var colorsSuggestions = colors_suggestions();
2244    var buttons_colors = "";
2245    for(var i = 0; i < colorsSuggestions.length; i++){
2246        buttons_colors += "<a class=\"cal-colors-options-btn ui-icon ui-button-icon-primary signed-cal-colors-options-btn-"+i+"\"  style=\"background-color:"+colorsSuggestions[i]['background']+"; border-color:"+colorsSuggestions[i]['border']+"; color:"+colorsSuggestions[i]['font']+"\">&bull;</a>";
2247    }
2248
2249    //DataLayer.render( 'templates/calendar_list.ejs', 'calendar:list', ["IN", "id", Calendar.calendarIds], function( html ){
2250    DataLayer.render( 'templates/calendar_list.ejs', Calendar, function( html ){
2251       
2252        var meu_container = $(".calendars-list").html( html );
2253       
2254        var doMenu = function(){
2255                $('ul.list-calendars .cal-list-options-btn').each(function(){
2256                        $(this).menu({   
2257                        content: $(this).next().html(),
2258                        width: '120',
2259                        positionOpts: {
2260                                posX: 'left', 
2261                                posY: 'bottom',
2262                                offsetX: 0,
2263                                offsetY: 0,
2264                                directionH: 'right',
2265                                directionV: 'down', 
2266                                detectH: true, // do horizontal collision detection   
2267                                detectV: true, // do vertical collision detection
2268                                linkToFront: false
2269                        },
2270                        flyOut: true,
2271                        showSpeed: 100,
2272                        crumbDefaultText: '>'
2273                        });
2274                });
2275        }
2276       
2277        doMenu();
2278        var currentToolTip = null;
2279        $('#divAppbox').on('scroll',function(){
2280                if ($('.cal-list-options-btn.fg-menu-open.ui-state-active')){                   
2281                        var offset = $('.cal-list-options-btn.fg-menu-open.ui-state-active').offset();
2282                        if (offset)
2283                            $('.positionHelper').css('top',offset.top);
2284                }
2285
2286                if ($('.button.config-menu.fg-menu-open')){
2287                        var offset = $('.button.config-menu.fg-menu-open').offset();
2288                        if (offset)
2289                            $('.positionHelper').css('top',offset.top);
2290                }               
2291
2292               
2293                if ($(".new-group.qtip-active").length || $(".new-calendar.qtip-active").length)                       
2294                    $('.qtip-active').css('top',currentToolTip.offset().top - 50);
2295               
2296        });
2297 
2298     $('ul.list-calendars .cal-list-options-btn').on('click',function(){doMenu();});         
2299       
2300
2301    /***************************************New Calendar***************************************/
2302        meu_container.find(".button.new-calendar").button({
2303            icons: {
2304                primary: "ui-icon-plus"
2305            },
2306            text: false
2307        }).click(function () {
2308                currentToolTip = $(this);
2309        var typeCalendar = !!parseInt($(this).attr('class').match(/[0-9]+/g)) ?
2310            {type: 'new-group', title: 'Novo Grupo', typeValue: 1, prompt: 'Nome do grupo'} :
2311            {type: 'new-calendar', title: 'Nova Agenda', typeValue: 0, prompt: 'Nome da agenda'}
2312               
2313            if(!$('.qtip.qtip-blue.qtip-active.'+typeCalendar.type).length){
2314
2315            $('.qtip.qtip-blue').remove();
2316
2317                $(this).qtip({
2318                                show: {
2319                       ready: true,
2320                   solo: true,
2321                   when: {
2322                          event: 'click'
2323                       }
2324                    },
2325                  hide: false,
2326                  content: {
2327                          text: $('<div></div>').html( DataLayer.render( 'templates/calendar_quick_add.ejs', {} ) ),
2328                          title: {
2329                              text: typeCalendar.title,
2330                              button: '<a class="button close" href="#">close</a>'
2331                          }
2332                        },
2333                  style: {
2334                          name: 'blue',
2335                      tip: {
2336                              corner: 'leftMiddle'
2337                          },
2338                   border: {
2339                           width: 4,
2340                           radius: 8
2341                          },
2342                      width: {
2343                              min: 230,
2344                          max:230
2345                          }
2346                    },
2347               position: {
2348                       corner: {
2349                           target: 'rightMiddle',
2350                           tooltip: 'leftMiddle'
2351                       },
2352                       adjust: {
2353                            x:0,
2354                            y: -12
2355                                               
2356                       }
2357                    }
2358            })
2359                .qtip("api").onShow = function(arg0) {
2360                               
2361                    $('.qtip-active .button.close').button({
2362                          icons: { primary: "ui-icon-close" },
2363                          text: false
2364                    })
2365                    .click(function(){
2366                                $('.qtip.qtip-blue').remove();
2367                    });
2368                   
2369                $('.qtip-active').addClass(typeCalendar.type);
2370
2371                    $('.qtip-active .button.cancel').button().click(function(){
2372                                $('.qtip.qtip-blue').remove();
2373                    });
2374                               
2375
2376                    $('.qtip-active .button.save').button().click(function(){
2377                    if(!typeCalendar.typeValue)
2378                                for(var i = 0; i < Calendar.calendars.length; i++){
2379                                    if(Calendar.calendars[i].location == ( User.me.uid + '/' + $('.qtip-active input').val())){
2380                                        $.Zebra_Dialog('O nome desta agenda já está sendo utilizada em uma Url de outra agenda. Por favor, informe outro nome para agenda.',{
2381                                            'overlay_opacity': '0.5',
2382                                            'type': 'warning'
2383                                        });
2384                                        $('.qtip.qtip-blue').remove();
2385                                        return;
2386                                    }
2387                                }
2388                                       
2389                        var selected;
2390                        var color = $('.cal-colors-options-btn').each(function(index){
2391                            if ($(this).is('.color-selected'))
2392                                 selected = index;
2393                        });
2394                        DataLayer.put( "calendarSignature", {
2395                            user: User.me.id,
2396                            calendar: {
2397                                name: Encoder.htmlEncode($('.qtip-active input').val()),
2398                                timezone: User.preferences.timezone,
2399                        type: typeCalendar.typeValue                   
2400                            },
2401                            isOwner: 1,
2402                            fontColor: colorsSuggestions[selected]['font'].substring(1) ,
2403                            backgroundColor: colorsSuggestions[selected]['background'].substring(1) ,
2404                            borderColor: colorsSuggestions[selected]['border'].substring(1)
2405                        });
2406                        DataLayer.commit( false, false, function( received ){
2407                            delete Calendar.currentViewKey;
2408                            Calendar.load();
2409                            refresh_calendars();
2410                        });
2411                        $('.qtip.qtip-blue').remove();
2412                    });
2413       
2414                    $(".qtip-active input").Watermark(typeCalendar.prompt);
2415                               
2416                    $('.qtip-active').keydown(function(event) {
2417                            if (event.keyCode == '27')
2418                              meu_container.find(".button.new").qtip('destroy');
2419                    });
2420                               
2421                    $('.colors-options').prepend(buttons_colors);
2422                    $('.colors-options .signed-cal-colors-options-btn-0').addClass('color-selected');
2423                                               
2424                    var buttons = $('.cal-colors-options-btn').button();
2425                               
2426                    buttons.click(function(){
2427                        buttons.removeClass('color-selected');
2428                        $(this).addClass('color-selected');
2429                    });
2430                }                               
2431           }
2432    });
2433
2434    $("img.cal-list-img").click(function(evt) {
2435           $(".cal-list-options_1").toggleClass( "hidden" );
2436    });
2437
2438    $(".my-groups-task a.title-my-calendars").click(function() {
2439        $(".my-groups-task ul.my-list-calendars").toggleClass("hidden")
2440        $('.my-groups-task .status-list').toggleClass("ui-icon-triangle-1-s");
2441        $('.my-groups-task .status-list').toggleClass("ui-icon-triangle-1-e");
2442    });
2443
2444    $(".my-calendars a.title-my-calendars").click(function() {
2445        $(".my-calendars ul.my-list-calendars").toggleClass("hidden")
2446        $('.my-calendars .status-list').toggleClass("ui-icon-triangle-1-s");
2447        $('.my-calendars .status-list').toggleClass("ui-icon-triangle-1-e");
2448    });
2449               
2450    $(".signed-calendars a.title-signed-calendars").click(function() {
2451           $(".signed-calendars ul.signed-list-calendars").toggleClass( "hidden");
2452    });
2453
2454    $("ul li.list-calendars-item").click(function(evt) {
2455       
2456        });   
2457
2458    $("ul li.list-calendars-item .ui-corner-all").click(function(evt) {
2459        //alert('teste');
2460        });   
2461       
2462    meu_container.find(".button.new-calendar-shared").button({
2463        icons: {
2464            primary: "ui-icon-plus"
2465        },
2466        text: false
2467    }).click(function (event) {
2468        show_modal_search_shared();
2469    });
2470       
2471       
2472    meu_container.find('.title-signed-calendars').click(function(evt){
2473        var status = $(this).parent().find('.status-list-shared');
2474                       
2475        if(status.hasClass('ui-icon-triangle-1-s'))
2476            status.removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
2477        else
2478            status.removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
2479    });
2480               
2481    $('.calendar-view').click(function(evt){
2482 
2483        var checkBox = $(this);
2484        var calendarId = $(this).val();
2485 
2486        Calendar.signatureOf[ calendarId ].hidden =  (checkBox.is(':checked') ? 0 : 1 );
2487 
2488        DataLayer.put('calendarSignature', {id: Calendar.signatureOf[ calendarId ].id , hidden: Calendar.signatureOf[ calendarId ].hidden }  );
2489        DataLayer.commit();
2490 
2491 
2492         if($tabs.tabs('option' ,'selected') == 0){
2493 
2494             if(Calendar.currentView && !!Calendar.currentView[ calendarId ]){
2495 
2496                 Calendar.currentView[ calendarId ].hidden = !checkBox.is(':checked');
2497                 $('#calendar').fullCalendar( 'refetchEvents' );
2498             }
2499 
2500         }else{
2501             type = $tabs.tabs('option' ,'selected');
2502             type = type > 2 ? 2 : (type - 1)
2503 
2504             pageselectCallback('', 0, false, type);
2505         }
2506    });
2507});
2508}
2509
2510function add_events_list(keyword, type)
2511{
2512    if ($.trim(keyword) == "") return;
2513    var tab_title = "";
2514    if (keyword){
2515                type = 2;
2516                if(keyword.length < 10)
2517                        tab_title = keyword;
2518                else
2519                        tab_title = keyword.substr(0,10) + '..."';
2520    }else{
2521                if(type){
2522                        if(!!parseInt(type))
2523                                tab_title = "Lista de tarefas";
2524                        else
2525                                tab_title = "Lista de eventos";
2526                }
2527    }
2528        var tab_selector = ['tab_events_list_', 'tab_tasks_list_', 'tab_all_list_'];
2529    keyword = ( keyword || '' ).replace( /\s+/g, "_" );
2530       
2531    if(!(document.getElementById(tab_selector[type] + (Base64.encode(keyword)).replace(/[^\w\s]/gi, "") )))     
2532    {
2533        Encoder.EncodeType = "entity";
2534        $tabs.tabs( "add", "#"+tab_selector[type] + (Base64.encode(keyword)).replace(/[^\w\s]/gi, ""), Encoder.htmlEncode(tab_title) );
2535    }
2536    else /* Tab already opened */
2537    {
2538                //$tabs.tabs("option", "selected", 2);
2539        }
2540       
2541    pageselectCallback(keyword, 0, false, type); // load page 1 and insert data on event_list.ejs
2542       
2543    $('.preferences-win.active .button.save, .preferences-win.active .button.cancel, .preferences-win.active .button.import, .preferences-win.active .button.export').button();
2544}
2545
2546function paginatorSearch(currentView){
2547    $(currentView+' .header-paginator .fc-header-left .fc-button').hover(
2548        function(){
2549            $(this).addClass('fc-state-hover');
2550        },
2551        function(){
2552            $(this).removeClass('fc-state-hover');
2553        }).mousedown(function(){
2554        $(this).addClass('fc-state-down');
2555    }).mouseup(function(){
2556        $(this).removeClass('fc-state-down');
2557        $('.events-list.events-list-win.active').removeClass('active');
2558        var paginator = $(this).attr('class');
2559        if(paginator.indexOf('next') > 0){
2560            if(parseInt($(currentView+' [name = results]').val()) > 25)
2561                pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) +1), false,  2);
2562        }else{
2563            if(parseInt($(currentView+' [name = page_index]').val()) > 0)
2564                pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) -1), false, 2);
2565        }
2566    });
2567}
2568
2569function mountTitleList(page_index ,view){
2570    switch (view){
2571        case 'agendaDay':
2572        case 'basicDay':
2573            var date = new Date().add({
2574                days: page_index
2575            });
2576            return (dateCalendar.dayNames[date.getDay()])+", "+(date.toString('dd MMM yyyy'));
2577        case 'agendaWeek':
2578            var dateStart = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]);
2579            dateStart.add({
2580                days: (7 * page_index)
2581                });
2582            var dateEnd = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]);
2583            dateEnd.add({
2584                days: (page_index * 7)+7
2585                });
2586            if(dateStart.toString('MM') != dateEnd.toString('MM'))
2587                return dateStart.toString('dd')+' de '+dateCalendar.monthNamesShort[dateStart.getMonth()]+' a '+dateEnd.toString('dd')+' de '+dateCalendar.monthNames[dateEnd.getMonth()]+' - '+dateEnd.toString('yyyy');
2588            return +dateStart.toString("dd")+" a "+dateEnd.toString("dd")+" de "+dateCalendar.monthNames[dateEnd.getMonth()]+" - "+dateEnd.toString('yyyy');
2589        case 'month':
2590            var date = new Date().add({
2591                months: page_index
2592            })
2593            return dateCalendar.monthNames[date.getMonth()]+" "+date.toString("yyyy");
2594        case 'year':
2595            var date = new Date().add({
2596                years: page_index
2597            });
2598            return date.toString("yyyy");
2599    }
2600}
2601
2602function paginatorList(currentView, view, type){
2603    $(currentView+' .events-list.events-list-win.active .list-events-paginator .fc-header-title').html('<h2>'+mountTitleList( parseInt($(currentView+' [name = page_index]').val()),view)+'</h2>');
2604    $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right .fc-button').removeClass('fc-state-active')
2605    if(view == 'basicDay')
2606        $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right .fc-button-agendaDay').addClass('fc-state-active');
2607    else
2608        $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right .fc-button-'+view).addClass('fc-state-active');
2609    $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right').addClass('list-right');
2610               
2611    $(currentView+' .header-paginator .fc-header-right .fc-button').hover(
2612        function(){
2613            $(this).addClass('fc-state-hover');
2614        },
2615 
2616        function(){
2617            $(this).removeClass('fc-state-hover');
2618        }).mousedown(function(){
2619        $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right .fc-button').removeClass('fc-state-active')
2620        $(this).addClass('fc-state-active');
2621    }).mouseup(function(){
2622        var goView = $(this).attr('class');
2623        if(goView.indexOf('agendaDay') > 0)
2624            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'agendaDay', type);
2625        else if(goView.indexOf('month') > 0)
2626            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'month', type);
2627        else if(goView.indexOf('year') > 0)
2628            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'year', type);
2629        else if(goView.indexOf('agendaWeek') > 0)
2630            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'agendaWeek', type);
2631
2632    });
2633
2634    $(currentView+' .header-paginator .fc-header-left .fc-button').hover(
2635        function(){
2636            $(this).addClass('fc-state-hover');
2637        },
2638        function(){
2639            $(this).removeClass('fc-state-hover');
2640        }).mousedown(function(){
2641        $(this).addClass('fc-state-down');
2642    }).mouseup(function(){
2643        $(this).removeClass('fc-state-down');
2644        var paginator = $(this).attr('class');
2645        if(paginator.indexOf('next') > 0)
2646            pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) +1), view, type);
2647        else
2648            pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) -1), view, type);
2649    });
2650    if (currentView == "#tab_events_list_" || currentView == "#tab_tasks_list_")
2651        $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-left').find('span.fc-button-agendaWeek, span.fc-button-agendaDay').remove();
2652}
2653
2654function printEventList(view){
2655        $('.fc-button-print.print-list-events').click(function(){
2656                var window_print = window.open('','ExpressoCalendar','width=800,height=600,scrollbars=yes');
2657                var listEvents = $(view).clone();
2658                listEvents.find('.fc-button').remove();
2659                listEvents.find('.details-event-list').remove();
2660                listEvents.find('.list-events-paginator').remove();
2661                listEvents = listEvents.html();
2662                type = $(this).parents('.ui-tabs-panel').attr("id").split("_")[1];
2663
2664                var data = {
2665                        type : type == "tasks" ? "task-list" : ( type == "events" ? "event-list" : "search"),
2666                        html : listEvents,
2667                        InfoPage : $(this).parents('table.header-paginator').find( '.fc-header-title' ).text()
2668                }
2669                window_print.document.open();           
2670                window_print.document.write(DataLayer.render('templates/calendar_list_print.ejs', data));
2671                window_print.document.close();
2672                window_print.print();
2673        });
2674}
2675
2676function paginatorListEvent(currentView, typeView, view, type){
2677    if(!!$(currentView).find('.fc-calendar').length)
2678        return;
2679    $(currentView+' .events-list.events-list-win.active').prepend($('.fc-header:first').clone());
2680    //Remove contudo nao utilizado
2681    $(currentView+' .events-list.events-list-win.active .fc-header .fc-button-today').remove();
2682    $(currentView+' .events-list.events-list-win.active .fc-header .fc-button-basicWeek').remove();
2683    $(currentView+' .events-list.events-list-win.active .fc-header .fc-button-basicDay').removeClass("fc-button-basicDay").addClass('fc-button-agendaDay');                     
2684               
2685    //Adiciona e remove as classes para esta visualizacao
2686    $(currentView+' .events-list.events-list-win.active .fc-header .fc-header-center').addClass('list-events-paginator');
2687    $(currentView+' .events-list.events-list-win.active .fc-header .list-events-paginator').removeClass('fc-header-center');           
2688               
2689    //Adicionar class no header padronizar com a tela principal
2690        $(currentView+' .events-list.events-list-win.active .fc-header .fc-button-print').addClass('print-list-events');               
2691        $(currentView+' .events-list.events-list-win.active .fc-header').addClass('header-paginator');
2692    $(currentView+' .events-list.events-list-win.active .header-paginator').removeClass('fc-header');   
2693       
2694        printEventList(currentView);
2695       
2696    if(typeView == 'search'){
2697        $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right span.fc-button:not(.fc-button-print)').remove();
2698        $(currentView+' .events-list.events-list-win.active .list-events-paginator .fc-header-title').html('<h2>Resultados para: '+$(currentView+' [name = keyword]').val()+'</h2>');
2699        if((parseInt($(currentView+' [name = page_index]').val()) == 0) && (parseInt($(currentView+' [name = results]').val()) <= 25))
2700            return;
2701        paginatorSearch(currentView);
2702    }else
2703        paginatorList(currentView, view, type);
2704}
2705
2706function mountCriteriaList(view, page_index, calerdars_selecteds){
2707    var rangeStart , rangeEnd;
2708    switch (view){
2709        case 'basicDay':
2710        case 'agendaDay':
2711            rangeStart = new Date.today().add({ days: page_index }).getTime();
2712            rangeEnd = rangeStart + 86400000;
2713            break;
2714        case 'agendaWeek':
2715            var dateStart = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]);
2716            var dateEnd = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]);
2717            dateEnd.setHours(0,0,0);
2718            dateStart.setHours(0,0,0); 
2719            rangeStart = dateStart.add({ days: (7 * page_index) }).getTime();
2720            rangeEnd = dateEnd.add({ days: (7 * page_index)+7 }).getTime();
2721            break;
2722        case 'month':
2723            var date = Date.today().add({ months: page_index })
2724            rangeStart = date.moveToFirstDayOfMonth().getTime();
2725            rangeEnd = date.moveToLastDayOfMonth().getTime() + 86400000;
2726            break;
2727        case 'year':
2728            var dateStart = new Date().add({ years: page_index });
2729            var dateEnd = new Date().add({ years: page_index });
2730            dateEnd.setHours(0,0,0);
2731            dateStart.setHours(0,0,0);
2732            if(dateStart.getMonth() != 0)
2733                    dateStart.moveToMonth(0, -1)
2734            if(dateEnd.getMonth() != 11)
2735            dateEnd.moveToMonth(11)
2736
2737        rangeStart = dateStart.moveToFirstDayOfMonth().getTime();
2738        rangeEnd = dateEnd.moveToLastDayOfMonth().getTime() + 86400000;
2739            break; 
2740    }
2741                       
2742    var timezone = {};
2743    for(var i in Calendar.signatureOf)
2744            timezone[i] = Calendar.signatureOf[i].calendar.timezone;
2745       
2746    return  {
2747        rangeStart: rangeStart,
2748        rangeEnd: rangeEnd,
2749            order: 'startTime',
2750            timezones: timezone,
2751        calendar: calerdars_selecteds
2752        };
2753}
2754
2755function pageselectCallback(keyword, page_index, view, type){
2756    $('.qtip.qtip-blue').remove();
2757        var tab_selector = ['tab_events_list_', 'tab_tasks_list_', 'tab_all_list_'];
2758        var tab_title = ['Lista de eventos', 'Lista de tarefas'];
2759        var label_noselect_calendar = ['Por favor selecione ao menos uma agenda.', 'Por favor selecione ao menos um grupo.', 'Por favor selecione ao menos uma agenda ou grupo.'];
2760        var label_nofound_search = ['Não foi encontrado nenhum evento correspondente à sua pesquisa.', 'Não foi encontrado nenhuma tarefa ou atividade correspondente à sua pesquisa.', 'Não foi encontrado nenhum evento ou tarefa ou atividade correspondente à sua pesquisa.'];
2761        var label_nofound = ['Não foram encontrados eventos neste intervalo.', 'Não foram encontradas tarefas ou atividades neste intervalo.', 'Não foram encontrados eventos ou tarefas ou atividades neste intervalo.'];
2762        var selecteds = getSelectedCalendars(false, type);
2763   
2764        if(!selecteds && (keyword != '' && keyword != null)){   
2765        jQuery('#'+tab_selector[type] + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "")|| '')).html(
2766            '<div title="'+tab_title[type]+'" class="events-list events-list-win active empty">' +
2767            '<label>'+label_noselect_calendar[type]+'</label>' +
2768            '</div>'
2769        );
2770    }else{
2771        var criteria = null;
2772        if(keyword == '' || keyword == null){
2773
2774            criteria = mountCriteriaList(!!view ? view : User.preferences.defaultCalView, page_index, selecteds);
2775
2776        }else{
2777
2778            var timezone = {};
2779            for(var i in Calendar.signatureOf)
2780                timezone[i] = Calendar.signatureOf[i].calendar.timezone;
2781
2782            criteria =  {
2783
2784                searchEvent: true,
2785                order: 'startTime',
2786                offset: (25 * page_index),
2787                limit: (((25 * page_index) + 25) + 1),
2788                summary: keyword,
2789                description: keyword,
2790                calendar: selecteds,
2791                timezones: timezone
2792
2793            };
2794        }
2795         
2796        var results = DataLayer.encode('schedulable:list', DataLayer.dispatch('modules/calendar/schedules', criteria));
2797        //var results = DataLayer.get('schedulable:detail', criteria);
2798        keyword = ( keyword || '' ).replace( /\s+/g, "_" );
2799        }
2800// não há resultados   
2801
2802var currentView = '#'+tab_selector[type] + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "") || '');
2803
2804if ((((typeof(results) == 'undefined') || (!results.events_list )) && selecteds) &&(keyword != '' && keyword != null)) {
2805    $(currentView).html(
2806                '<div title="'+title+'" class="events-list events-list-win active empty">' +
2807                '<label>'+label_nofound_search[type]+'</label>' +
2808                '</div>'
2809        );
2810// há resultados e Agendas Selecionadas
2811} else{
2812    if(typeof(results) != 'undefined'){
2813                results['page_index'] = page_index;
2814                results['keyword'] = keyword;
2815                results['tab_title'] = tab_title[type];
2816                DataLayer.render( 'templates/event_list.ejs', results, function( html ){
2817                       
2818                        $(currentView).html( html );
2819                        $('.events-list-win .menu-container .button').button();
2820                                                                                                                       
2821                        $(".event-details-item").parent().click(function(event){
2822                        event.stopImmediatePropagation();
2823            var container = $(this).siblings("div.details-event-list");
2824
2825
2826            //lazy data
2827            if( container.hasClass('hidden') ){
2828
2829                //only first click
2830                if(!container.find('fieldset').length){
2831
2832                   $(this).append( '<span style="width: 20px;" class="load-event-detail"><img style="width: 20px;" src="'+DataLayer.dispatchPath+'/modules/calendar/img/loading.gif"></img></span>');
2833
2834                    var schedulable = container.find('input[name="eventid"]').val();
2835                    schedulable = DataLayer.encode('schedulable:detail', [getSchedulable( schedulable, '' )]);
2836
2837                    schedulable = $.isArray( schedulable ) ? schedulable[0] : schedulable;
2838
2839                    container.prepend( DataLayer.render( 'templates/event_detail_list.ejs', {'_event': schedulable}));
2840
2841                    $(this).find('span.load-event-detail').remove();
2842                }
2843            }
2844
2845            container.toggleClass("hidden")
2846                        .find('.button.delete').click(function(event){
2847                                var eventId = $(this).siblings('[name="eventid"]').val();
2848                                var calendarId = $(this).siblings('[name="calendarid"]').val();
2849                                remove_event(eventId, calendarId, 2);
2850                                event.stopImmediatePropagation()
2851                        })
2852                        .end().find('.button.edit').click(function(event){
2853
2854                var schedulable = $(this).siblings('[name="eventid"]').val();
2855                switch($(this).siblings('[name="eventtype"]').val()){
2856
2857                    case '1':
2858                        eventDetails( getSchedulable( schedulable, '' ), true );
2859                    break;
2860                    case '2':
2861                        taskDetails( getSchedulable( schedulable, '' ), true );
2862                    break;
2863                    case '3':
2864                        activityDetails( getSchedulable( schedulable, '' ), true );
2865                    break;
2866                }
2867                                event.stopImmediatePropagation()
2868                        })
2869                        .end().find('.button.print').click(function(event){     
2870                                var window_print = window.open('','ExpressoCalendar','width=800,height=600,scrollbars=yes');
2871                                var html = $(this).parents("td:first").clone();
2872                                html.find(".menu-container.footer-container").remove();
2873                                html.find(".fc-header-title").remove();
2874                                var html = html.html();
2875                                var data = {
2876                                        type : $(this).parents('.details-event-list').hasClass("details-event") ? "event-detail" : "task-detail",
2877                                        html : html,
2878                                        InfoPage : 'Detalhes: '+$(this).parents('tr.start-date').find('td span a').text()
2879                                }
2880                                window_print.document.open();           
2881                                window_print.document.write(DataLayer.render('templates/calendar_list_print.ejs', data));
2882                                window_print.document.close();
2883                                window_print.print();
2884                               
2885                                event.stopImmediatePropagation()
2886                        });
2887
2888                        });
2889                        paginatorListEvent(currentView, (keyword == '' || keyword == null) ? 'list' : 'search',  !!view ? view : User.preferences.defaultCalView, type);
2890                });
2891    }else{
2892                $(currentView).html(
2893                        '<div title="'+title+'" class="events-list events-list-win active empty">' +
2894                        '<input type="hidden" name="page_index" value="'+page_index+'"></inpunt>'+
2895                        '<input type="hidden" name="keyword" value="'+keyword+'"></inpunt>'+
2896                        '<label class="empty-result">'+label_nofound[type]+'</label>' +
2897                        '</div>'
2898                        );
2899                paginatorListEvent(currentView, 'list', !!view ? view : User.preferences.defaultCalView, type);
2900    }
2901}
2902        if(currentView != '#'+tab_selector[type])
2903            $tabs.tabs("select", currentView);
2904}
2905
2906function show_modal_import_export(tab, calendarId, typeView){
2907    $('.qtip.qtip-blue').remove();
2908    DataLayer.render( 'templates/import_export.ejs', {
2909        calendars: typeView == 0 ? Calendar.calendars : Calendar.groups,
2910        owner: User.me.id,
2911        typeView: typeView
2912        }, function( html ){
2913
2914        if (!UI.dialogs.importCalendar) {
2915            UI.dialogs.importCalendar = jQuery('#div-import-export-calendar')
2916            .append('<div title="Importar e Exportar "' + (typeView == 0 ? 'Eventos' : 'Tarefas') + '" class="import-export import-export-win active"> <div>')
2917            .find('.import-export-win.active').html(html).dialog({
2918                resizable: false,
2919                modal:true,
2920                width:500,
2921                position: 'center'
2922            });
2923                       
2924        } else {
2925            UI.dialogs.importCalendar.html(html);
2926        }
2927               
2928        var tabsImportExport = UI.dialogs.importCalendar.find(".tabs-import-export").tabs({
2929            selected: tab
2930        });
2931       
2932        UI.dialogs.importCalendar.find('.button').button();
2933
2934        tabsImportExport.find('option[value="'+calendarId+'"]').attr('selected','selected').trigger('change');
2935               
2936        var form = false;
2937        $('.import-event-form').fileupload({
2938            sequentialUploads: true,
2939            add: function (e, data) {
2940            form = data
2941            var name = form.files[0].name;
2942            $('.import-event-form').find('input[type="file"]').hide();
2943            $('.import-event-form').find('span.file-add').removeClass('hidden');
2944            $('.import-event-form').find('span.file-add').append('<span>'+ name +'</span><a class="button remove-attachment tiny"></a>');
2945            $('.import-event-form').find('.button.remove-attachment').button({
2946                icons: {
2947                primary: "ui-icon-close"
2948                },
2949                text: false
2950            }).click(function (event){
2951                $('.import-event-form').find('input[type="file"]').show();
2952                $('.import-event-form').find('span.file-add').addClass('hidden').html('');
2953                form = false;
2954            });
2955
2956            },
2957        submit:function(e, data){
2958
2959            $('div.import-export').find('a.button').button('option', 'disabled', true)
2960            $('.import-event-form').find('span.file-add').append('<img src="../prototype/modules/calendar/img/ajax-loader.gif">');
2961
2962        },
2963            done: function(e, data){
2964            var msg = '';
2965            var type = '';
2966
2967            if(!!data.result && data.result == '[][""]' || data.result.indexOf('Error') >= 0 ){
2968                msg = 'Erro ao realizar a importação, por favor verifique o arquivo .ics';
2969                type = 'warning';
2970
2971                $('div.import-export').find('a.button').button('option', 'disabled', false)
2972                $('.import-event-form').find('span.file-add img ').remove();
2973
2974            }else{
2975
2976                if(data.result.indexOf('schedulable') >= 0){
2977                    msg = 'Importação realizada com sucesso!';
2978                    type = 'confirmation';
2979                    Calendar.rerenderView(true);
2980                }else{
2981                    var res = JSON.parse(data.result);
2982                    var asData = false;
2983
2984                    for(var i = 0; i < res.length; i++)
2985                        if(res[i].length > 0)
2986                            asData = true;
2987
2988                    if(asData){
2989                        msg = 'Importação realizada com sucesso!';
2990                        type = 'confirmation';
2991                        Calendar.rerenderView(true);
2992                    }else{
2993                        msg = 'Não foram encontrados novos eventos na importação!';
2994                        type = 'information';
2995                    }
2996                }
2997
2998                UI.dialogs.importCalendar.dialog("close");
2999            }
3000
3001            $.Zebra_Dialog(msg, {
3002                'type':     type,
3003                'overlay_opacity': '0.5',
3004                'buttons':  ['Fechar']
3005            });
3006            }
3007        });
3008
3009        UI.dialogs.importCalendar.find(".menu-import-event")       
3010            .children(".import").click(function(data){
3011            $('.import-event-form fieldset.import-calendar', UI.dialogs.importCalendar).append(
3012                '<input type="hidden" name="params[calendar_timezone]" value="'+
3013                Calendar.signatureOf[$('.import-event-form option:selected').val()].calendar.timezone
3014                +'"/>')
3015            if(form)
3016                form.submit();
3017        });
3018           
3019        UI.dialogs.importCalendar.find(".menu-export-event")       
3020        .children(".export").click(function(){
3021             
3022            $('.export-event-form', UI.dialogs.importCalendar).submit();
3023            UI.dialogs.importCalendar.dialog("close");
3024        /**
3025                         * TODO - implementar ação de exportação
3026                         */
3027        });
3028       
3029        UI.dialogs.importCalendar.find(".menu-container")
3030        .children(".cancel").click(function(){
3031            UI.dialogs.importCalendar.dialog("close");
3032        });   
3033               
3034        UI.dialogs.importCalendar.dialog("open");
3035    });
3036}
3037
3038function copyAndMoveTo(calendar, event, idRecurrence, type, evt ){
3039    /*
3040     * Types
3041     * 0 = Move
3042     * 1 = Copy Event end Repet
3043     * 2 = Copy Ocurrence
3044     * 3 = Copy to edit ocurrence
3045     *
3046     **/
3047    if(!type)
3048        type = $('.calendar-copy-move input[name="typeEvent"]').val();
3049
3050    getSchedulable(event,'');
3051    var schedulable = DataLayer.get('schedulable', event.toString());
3052    schedulable['class'] = '1';
3053       
3054    calendar = !!calendar ? calendar : schedulable.calendar;
3055
3056    owner = decodeOwnerCalendar(calendar);
3057       
3058    if(typeof(schedulable) == "array")
3059        schedulable = schedulable[0];
3060       
3061    //Move eventos entre agendas
3062    if(parseInt(type) == 0){
3063               
3064        schedulable.lastCalendar = schedulable.calendar;
3065    schedulable.calendar = calendar;
3066        DataLayer.put('schedulable', schedulable);
3067       
3068        DataLayer.commit();
3069    //copia eventos entre agendas
3070    }else{
3071       
3072        var newSchedulable = schedulable;
3073       
3074        delete newSchedulable.id;
3075        delete newSchedulable.uid;
3076        delete newSchedulable.sequence;
3077        delete newSchedulable.dtstamp;
3078               
3079        delete schedulable.DayLigth;
3080        delete schedulable.rangeStart
3081        delete schedulable.rangeEnd;
3082        delete schedulable.lastUpdate;
3083               
3084        delete schedulable.calendar;
3085               
3086        if(schedulable.repeat && type == "1" ){
3087            var repeat = DataLayer.get('repeat', schedulable.repeat);
3088            delete repeat.schedulable;
3089            delete repeat.id;
3090            repeat.startTime = repeat.startTime == '' ? '' : new Date(parseInt(repeat.startTime)).toString('yyyy-MM-dd HH:mm:00');
3091            repeat.endTime = repeat.endTime == '' ? '' : new Date(parseInt(repeat.endTime)).toString('yyyy-MM-dd HH:mm:00');
3092                   
3093            var exceptions = DataLayer.get('repeatOccurrence', {
3094                filter: ['AND', ['=','repeat', schedulable.repeat], ['=','exception','1']]
3095                }, true);
3096            if(exceptions){
3097                repeat.exceptions = '';
3098                for(var i in exceptions )
3099                    repeat.exceptions += exceptions[i].occurrence + ((exceptions.length -1) == parseInt(i) ? '' : ',');
3100                           
3101            }
3102                   
3103                   
3104            schedulable.repeat = repeat;
3105        }else{
3106            if(!!idRecurrence){
3107                newSchedulable.endTime = parseInt(schedulable.occurrences[idRecurrence]) + (parseInt(newSchedulable.endTime) - parseInt(newSchedulable.startTime));
3108                newSchedulable.startTime = schedulable.occurrences[idRecurrence];
3109            }
3110            delete schedulable.repeat;
3111        }
3112        delete schedulable.occurrences;
3113               
3114        schedulable.calendar = DataLayer.copy(calendar);
3115               
3116        var participants = DataLayer.copy(schedulable.participants);
3117        delete schedulable.participants;
3118
3119    if(schedulable['type'] == '2')
3120        delete schedulable['historic'];
3121
3122        schedulable.participants =  $.map( participants, function( attendee, i ){
3123 
3124            var participant = DataLayer.get('participant', attendee, false);
3125 
3126            if(typeof(participant) == 'array')
3127                participant = participant[0];
3128 
3129            if(owner.id != participant.user)
3130                delete participant.status;
3131 
3132            delete participant.delegatedFrom;
3133            delete participant.id;
3134            delete participant.schedulable;
3135 
3136            participant.id = DataLayer.put('participant', participant);
3137 
3138            return  (parseInt(type) == 3) ? participant.id : participant ;
3139        });
3140 
3141        //Edit ocurrence
3142        if(parseInt(type) == 3){
3143            newSchedulable.endTime = !!evt.end  ? evt.end.getTime() :  ((evt.start).getTime() + 86400000);
3144            newSchedulable.startTime = evt.start.getTime();
3145                   
3146            return newSchedulable;
3147        }
3148        newSchedulable.endTime = new Date(parseInt(newSchedulable.endTime) - (parseInt(newSchedulable.allDay) ? 86400000 : 0)).toString('yyyy-MM-dd HH:mm:00');
3149        newSchedulable.startTime = new Date(parseInt(newSchedulable.startTime)).toString('yyyy-MM-dd HH:mm:00');
3150       
3151        DataLayer.put('schedulable', newSchedulable);
3152
3153    }
3154}
3155
3156function messageHelper(msg, isShow){
3157    if(isShow)
3158        new $.Zebra_Dialog('<span style="width: 50px; height: 50px;">'+
3159                            '<img src="'+DataLayer.dispatchPath+'/modules/calendar/img/loading.gif"></img>'+
3160                        '</span><label class="messagesHelpers"> '+ msg +' </label>' , {
3161                        'buttons':  false,
3162                        'modal': true,
3163                        'overlay_opacity': '0.5',
3164                        'keyboard': false,
3165                        'overlay_close': false,
3166                        'type': false,
3167                        'custom_class': 'messagesHelpersExpressoCalendar'
3168                        }
3169                    );
3170    else{
3171        $('.messagesHelpersExpressoCalendar').remove();
3172        $('.ZebraDialogOverlay').remove();
3173    }
3174}
3175
3176function extendsFileupload(view, path){
3177    var viewName = 'div.new-'+view+'-win';
3178   
3179    path = !!path ? path : '';
3180   
3181    var maxSizeFile = 2000000;
3182    $('#fileupload'+view).fileupload({
3183        sequentialUploads: true,
3184        add: function (e, data) {
3185            if(data.files[0].size < maxSizeFile)
3186                data.submit();
3187        },
3188        change: function (e, data) {
3189            $.each(data.files, function (index, file) {
3190                var attach = {};
3191                attach.fileName = file.name;
3192                var ext = file.name.split('.');
3193                if(file.name.length > 10)
3194                    attach.fileName = ext.length == 1 ? file.name.substr(0, 10) :  file.name.substr(0, 6) + '.' + ext[ext.length -1];
3195                attach.fileSize = formatBytes(file.size);
3196                if(file.size > maxSizeFile)
3197                    attach.error = 'Tamanho de arquivo nao permitido!!'
3198                               
3199                $(viewName+' .attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', {
3200                    file : attach
3201                }));
3202                               
3203                if(file.size < maxSizeFile){
3204                    $(viewName+' .fileinput-button.new').append(data.fileInput[0]).removeClass('new');
3205                    $(viewName+' .attachments-list').find('[type=file]').addClass('hidden');
3206                                       
3207                }else
3208                    $(viewName+' .fileinput-button.new').removeClass('new');
3209                               
3210                               
3211                $(viewName+' .attachments-list').find('.button.close').button({
3212                    icons: {
3213                        primary: "ui-icon-close"
3214                    },
3215                    text: false
3216                }).click(function(){
3217                    var idAttach = $(this).parent().find('input[name="fileId[]"]').val();
3218                    $(viewName+' .attachment-list').find('input[value="'+idAttach+'"]').remove();
3219                    $(this).parent().remove();
3220               
3221                    if(!$(viewName+' .attachment-list input').length)
3222                        $(viewName+' .btn-danger.delete').addClass('hidden');
3223               
3224                });     
3225                               
3226            })
3227        },
3228        done: function(e, data){
3229            var currentUpload = $(viewName+' .progress.after-upload:first').removeClass('after-upload').addClass('on-complete').hide();
3230
3231            if(!!data.result && data.result != "[]"){
3232                $(viewName+' .btn-danger.delete').removeClass('hidden');
3233                var newAttach = (attch = jQuery.parseJSON(data.result)) ? attch : jQuery.parseJSON(data.result[0].activeElement.childNodes[0].data);
3234                $(viewName+' .attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>');
3235                currentUpload.removeClass('on-complete').parents('p')
3236                .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>')
3237                .find('.status-upload').addClass('ui-icon ui-icon-check');
3238            }else
3239                currentUpload.removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel');
3240        }
3241    });
3242    $('.attachments-list .button').button();   
3243
3244    if(!!window.FormData)                       
3245        $('#fileupload'+view).bind('fileuploadstart', function () {
3246            var widget = $(this),
3247            progressElement = $('#fileupload-progress-'+view).fadeIn(),
3248            interval = 500,
3249            total = 0,
3250            loaded = 0,
3251            loadedBefore = 0,
3252            progressTimer,
3253            progressHandler = function (e, data) {
3254                loaded = data.loaded;
3255                total = data.total;
3256            },
3257            stopHandler = function () {
3258                widget
3259                .unbind('fileuploadprogressall', progressHandler)
3260                .unbind('fileuploadstop', stopHandler);
3261                window.clearInterval(progressTimer);
3262                progressElement.fadeOut(function () {
3263                    progressElement.html('');
3264                });
3265            },
3266            formatTime = function (seconds) {
3267                var date = new Date(seconds * 1000);
3268                return ('0' + date.getUTCHours()).slice(-2) + ':' +
3269                ('0' + date.getUTCMinutes()).slice(-2) + ':' +
3270                ('0' + date.getUTCSeconds()).slice(-2);
3271            },
3272            /* formatBytes = function (bytes) {
3273            if (bytes >= 1000000000) {
3274                return (bytes / 1000000000).toFixed(2) + ' GB';
3275            }
3276            if (bytes >= 1000000) {
3277                return (bytes / 1000000).toFixed(2) + ' MB';
3278            }
3279            if (bytes >= 1000) {
3280                return (bytes / 1000).toFixed(2) + ' KB';
3281            }
3282            return bytes + ' B';
3283        },*/
3284            formatPercentage = function (floatValue) {
3285                return (floatValue * 100).toFixed(2) + ' %';
3286            },
3287            updateProgressElement = function (loaded, total, bps) {
3288                progressElement.html(
3289                    formatBytes(bps) + 'ps | ' +
3290                    formatTime((total - loaded) / bps) + ' | ' +
3291                    formatPercentage(loaded / total) + ' | ' +
3292                    formatBytes(loaded) + ' / ' + formatBytes(total)
3293                    );
3294            },
3295            intervalHandler = function () {
3296                var diff = loaded - loadedBefore;
3297                if (!diff) {
3298                    return;
3299                }
3300                loadedBefore = loaded;
3301                updateProgressElement(
3302                    loaded,
3303                    total,
3304                    diff * (1000 / interval)
3305                    );
3306            };
3307            widget
3308            .bind('fileuploadprogressall', progressHandler)
3309            .bind('fileuploadstop', stopHandler);
3310            progressTimer = window.setInterval(intervalHandler, interval);
3311        });
3312   
3313}
Note: See TracBrowser for help on using the repository browser.