source: trunk/prototype/modules/calendar/js/helpers.js @ 8046

Revision 8046, 114.0 KB checked in by thiago, 11 years ago (diff)

Ticket #3383 - Correção da aplicação da data, e do horario na semana.

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