source: sandbox/2.4.2-expresso1/prototype/modules/calendar/js/helpers.js @ 6894

Revision 6894, 99.5 KB checked in by thiago, 12 years ago (diff)

Ticket #2966 - Implementação da impressao do 'month' no calendar.

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