source: trunk/prototype/modules/calendar/js/task.helpers.js @ 7102

Revision 7102, 37.2 KB checked in by fernando, 12 years ago (diff)

Ticket #3067 - Problema para setar o horário na criação de uma tarefa

  • Property svn:executable set to *
Line 
1function validDateTask(){
2       
3        var errors = {
4                'emptyInitData': 'Por favor, informe uma data inicial',
5                'emptyInitHour': 'Por favor, informe uma hora inicial',
6               
7                'invalidInitData' : 'Data inicial inválida',
8
9                'equalData' : 'Hora inicial igual a final',
10                'theirData' : 'Data final menor que a inicial',         
11                'theirHour' : 'Hora final menor que a inicial',
12               
13                'dueInitDate' : 'Previsão de término menor que a data inicial',
14                'dueEndDate'  : 'Previsão de término menor que a data final',
15                'dueTime'         : 'Deve ser definido a hora da Previsão de Término',
16                'dueDate'         : 'Deve ser definido a Previsão de Término',
17                'invalidDueData' : 'Data de Previsão de Término inválida'
18        };
19
20    var start_date = $(".new-task-win.active .start-date").val();
21    var start_time = $(".new-task-win.active .start-time").val();
22        var due_date   = $(".new-task-win.active .date-prevision").val();
23        var due_time   =  $.trim($(".new-task-win.active .time-prevision").val());
24
25    if(start_date == "")
26                return errors['emptyInitData'];
27        else if(due_date != "" && due_time == "")
28                return errors['dueTime'];
29        else if(due_date == "" && due_time != "")
30                return errors['dueDate'];
31
32    var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat;
33    var startDate = Date.parseExact( start_date + " " + $.trim(start_time) , formatString );
34
35    if(startDate == null || startDate.getTime() < 0 )
36                return errors['invalidInitData'];
37
38    if(due_date != '' && due_time != '')
39    {
40        var dueDate = Date.parseExact( due_date + " " + $.trim(due_time) , formatString );
41
42        if(dueDate.compareTo(startDate) == -1)
43            return errors['dueInitDate'];
44    }
45
46    return false;
47}
48
49function todoStatus(view, status){
50        if (status == "1"){
51                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('noAction');
52        }else if (status == "2"){
53                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('inProcess');
54        }else if (status == "3"){
55                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('finished');
56        }else if (status == "4"){
57                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('canceled');
58        }
59}
60
61function taskDetails(objTask, decoded, path, isMail, repeat, isActivityView) {
62
63    $('.qtip.qtip-blue').remove();
64
65    attendees = {};
66
67    if (path == undefined) path = "";
68
69    if (!decoded) objTask = DataLayer.decode("task:calendar", objTask);
70
71    if (!isMail) objTask = DataLayer.encode("schedulable:task", objTask);
72
73    if (typeof (objTask.id) == 'undefined') {
74        objTask.alarms = Calendar.signatureOf[User.preferences.defaultCalendar || Calendar.groupIds[0]].defaultAlarms || false;
75        objTask.useAlarmDefault = 1;
76    }
77
78
79    if(objTask.me.id == User.me.id){
80        objTask.me.id = DataLayer.put('participant', {
81            user: objTask.me.id,
82            mail: objTask.me.mail
83        });
84        objTask.organizer.id = objTask.me.id;
85    }
86
87    var dependsDelegate = function(reference, inverse){
88        if(inverse){
89            if(reference.find('input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
90                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
91        }else{
92            if(blkAddAtendee.find('.me input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
93                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(reference.find('input[name="attendee[]"]').val());
94        }
95    };
96
97    var removeOthers = function(){
98        var other = blkAddAtendee.find('.delegate.attendee-permissions-change-button');
99        if(other.lenght)
100            dependsDelegate(other.parents('li'), true);
101
102        blkAddAtendee.find('.delegate').removeClass('attendee-permissions-change-button');
103        blkAddAtendee.find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change');
104   
105    };
106
107    var callbackAttendee = function(){
108        var checked = false;
109        blkAddAtendee.find("li.not-attendee").addClass('hidden');
110       
111        blkAddAtendee.find("li .button").filter(".close.new").button({
112            icons: {
113            primary: "ui-icon-close"
114            },
115            text: false
116        }).click(function () {
117            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
118            if($(this).parent().find('.button.delegate').hasClass('attendee-permissions-change-button')){
119                removeOthers();
120                blkAddAtendee.find('.request-update').addClass('hidden');
121                blkAddAtendee.find('.status option').toggleClass('hidden');
122                       
123                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
124            }
125               
126            $(this).parents('li').remove();
127               
128            if(blkAddAtendee.find(".attendee-list li").length == 1)
129                blkAddAtendee.find("li.not-attendee").removeClass('hidden');
130        })
131        .addClass('tiny disable ui-button-disabled ui-state-disabled')
132        .removeClass('new').end()
133       
134        .filter(".delegate.new").button({
135            icons: {
136                primary: "ui-icon-transferthick-e-w"
137            },
138            text: false
139        }).click(function () {
140            var me = $(this).parents('li');
141            if($(this).hasClass('attendee-permissions-change-button')){
142                $(this).removeClass('attendee-permissions-change-button')   
143                .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
144           
145                me.find('input[name="delegatedFrom[]"]').val('');
146                dependsDelegate(me, true);
147                       
148                blkAddAtendee.find('.request-update').addClass('hidden');
149                blkAddAtendee.find('.status option').toggleClass('hidden');
150
151                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
152                   
153            }else{
154                removeOthers();
155               
156                $(this).addClass('attendee-permissions-change-button')   
157                .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
158               
159                me.find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
160               
161                dependsDelegate(me, false);
162                   
163                blkAddAtendee.find('.request-update').removeClass('hidden');
164                if(blkAddAtendee.find('.status option.hidden').length == 1)
165                    blkAddAtendee.find('.status option').toggleClass('hidden');
166                   
167                blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change');
168            }
169        })
170        .addClass('tiny disable ui-button-disabled ui-state-disabled')
171        .removeClass('new').end()           
172           
173        .filter(".open-delegate.new").click(function(){
174            if($(this).hasClass('ui-icon-triangle-1-e')){
175                $(this).removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
176                $(this).parents('li').find('.list-delegates').removeClass('hidden');
177            }else{
178                $(this).removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
179                $(this).parents('li').find('.list-delegates').addClass('hidden');
180            }
181           
182        }).removeClass('new');
183
184        UI.dialogs.addTask.find('.attendees-list li').hover(
185            function () {
186                $(this).addClass("hover-attendee");
187                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
188                .find('.attendee-options').addClass('hover-attendee');
189            },
190            function () {
191                $(this).removeClass("hover-attendee");
192                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
193                .find('.attendee-options').removeClass('hover-attendee');
194            }
195        );       
196    }
197
198    /**
199     * canDiscardTaskDialog deve ser true se não houver alterações no task
200     */
201    canDiscardTaskDialog = true;
202    /**
203     * zebraDiscardTaskDialog é uma flag indicando que uma janela de confirmação (Zebra_Dialog)
204     * já estão aberta na tela, uma vez que não é possivel acessar o task ESC utilizado para fechá-la
205     */
206    zebraDiscardTaskDialog = false;
207
208    var html = DataLayer.render(path + 'templates/task_add.ejs', {
209        task: objTask
210    });
211
212    if (!UI.dialogs.addTask) {
213
214        UI.dialogs.addTask = jQuery('#sandbox').append('<div title="Criar Tarefa" class="new-task-win active"> <div>').find('.new-task-win.active').html(html).dialog({
215            resizable: false,
216            modal: true,
217            autoOpen: false,
218            width: 775,
219            position: 'center',
220            close: function (event, ui) {
221                /**
222                 * Remove tooltip possivelmente existente
223                 */
224                if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
225                attendees = {};
226            },
227            beforeClose: function (event, ui) {
228
229                if (!canDiscardTaskDialog && !zebraDiscardTaskDialog) {
230                    zebraDiscardTaskDialog = true;
231                    window.setTimeout(function () {
232                        $.Zebra_Dialog('Suas alterações na tarefa não foram salvas. Deseja descartar as alterações?', {
233                            'type': 'question',
234                            'overlay_opacity': '0.5',
235                            'buttons': ['Descartar alterações', 'Continuar editando'],
236                            'onClose': function (clicked) {
237                                if (clicked == 'Descartar alterações') {
238                                    canDiscardTaskDialog = true;
239                                    /**
240                                     *Remoção dos anexos da task caso seja cancelado a edição
241                                     */
242                                    DataLayer.rollback();
243
244                                    var ids = false;
245                                    $.each($('.attachment-list input'), function (i, input) {
246                                        DataLayer.put('attachment', {
247                                            id: '' + input.value
248                                        });
249                                        DataLayer.remove('attachment', '' + input.value);
250                                        ids = true;
251                                    });
252                                    if (ids) DataLayer.commit();
253
254                                    UI.dialogs.addTask.dialog('close');
255                                } else {
256                                    zebraDiscardTaskDialog = false;
257                                }
258
259                                /**
260                                 * Uma vez aberta uma janela de confirmação (Zebra_Dialog), ao fechá-la
261                                 * com ESC, para que o task ESC nÃo seja propagado para fechamento da
262                                 * janela de edição de tasks, deve ser setada uma flag indicando que
263                                 * já existe uma janela de confirmação aberta.
264                                 */
265                                if (!clicked) {
266                                    window.setTimeout(function () {
267                                        zebraDiscardTaskDialog = false;
268                                    }, 200);
269                                }
270                            }
271                        });
272
273                    }, 300);
274
275                }
276                //DataLayer.rollback();
277                return canDiscardTaskDialog;
278            },
279            dragStart: function (task, ui) {
280                if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
281            }
282        });
283
284    } else {
285        UI.dialogs.addTask.html(html);
286    }
287
288    var tabs = UI.dialogs.addTask.children('.content').tabs({
289        select: function (task, ui) {
290            if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
291        }
292    });
293    var group = DataLayer.get('calendar', objTask.group);
294
295    if (group.timezone != objTask.timezone) {
296        UI.dialogs.addTask.find('.calendar-addtask-details-txt-timezone').find('option[value="' + objTask.timezone + '"]').attr('selected', 'selected').trigger('change');
297        UI.dialogs.addTask.find('.calendar_addtask_details_lnk_timezone').addClass('hidden');
298        $('.calendar-addtask-details-txt-timezone').removeClass('hidden');
299
300    }
301
302    UI.dialogs.addTask.find('.calendar_addtask_details_lnk_timezone').click(function (e) {
303        $(this).addClass('hidden');
304        $('.calendar-addtask-details-txt-timezone').removeClass('hidden');
305        e.prtaskDefault();
306    });
307
308    UI.dialogs.addTask.find('.button.remove').button({
309    text:false,
310    icons:{
311        primary:'ui-icon-close'
312    }
313    }).click(function(el){
314        var id;
315        if( id = $(this).parent().find('input[name="alarmId[]"]').val())
316        DataLayer.remove('alarm', id);
317        $(this).parent().remove().find('li').is(':empty');
318    });
319
320    /*Seleciona a agenda padrão para visualização edição de um task*/
321    if (objTask.id) UI.dialogs.addTask.find('select[name="group"] option[value="' + objTask.group + '"]').attr('selected', 'selected').trigger('change');
322       
323        UI.dialogs.addTask.find(':input').change(function(event){
324    if (event.keyCode != '27' && event.keyCode != '13')
325        canDiscardTaskDialog = false;
326        }).keydown(function(event){
327                if (event.keyCode != '27' && event.keyCode != '13')
328                canDiscardTaskDialog = false;
329        });
330
331    /* Checkbox allday */
332    UI.dialogs.addTask.find('input[name="allDay"]').click(function () {
333        $(this).attr("checked") ? UI.dialogs.addTask.find('.start-time, .end-time').addClass('hidden') : UI.dialogs.addTask.find('.start-time, .end-time').removeClass('hidden');
334        updateMap(true);
335    });
336       
337        todoStatus('addTask', (objTask.taskStatus  != undefined) ? objTask.taskStatus  : 1);
338       
339        //Conclusão das Tarefas
340        var conclusionTask = function(e){
341                var percentageTask = UI.dialogs.addTask.find('input[name="percentage"]');
342                if( percentageTask.val() == "")
343                        percentageTask.val(0);
344                percentageTask.blur().focus();
345               
346                var percentageValue = parseInt(percentageTask.val());
347                var statusTask = UI.dialogs.addTask.find('select[name=taskStatus]');
348               
349                if(percentageValue <= 0){
350                        statusTask.find('option.taskStatus-noAction').attr('selected', 'selected');
351                        todoStatus('addTask', 1);               
352                }else if(percentageValue == 100){
353                        statusTask.find('option.taskStatus-finished').attr('selected', 'selected');
354                        todoStatus('addTask', 3);
355                }else{
356                        statusTask.find('option.taskStatus-inProcess').attr('selected', 'selected');
357                        todoStatus('addTask', 2);
358                }               
359                setTimeout(function(){
360                        percentageTask[0].selectionStart = percentageTask.val().length;
361                        percentageTask[0].selectionEnd = percentageTask.val().length;
362                }, 10)
363        }
364        UI.dialogs.addTask.find('input[name="percentage"]').spinner({ min: 0, max: 100 }).keyup(conclusionTask).next().find(".ui-spinner-button").click(conclusionTask);       
365
366        //Status das Tarefas
367        UI.dialogs.addTask.find('select[name=taskStatus]').change(function(){
368                var statusSelected = $('select[name=taskStatus] option:selected').val();
369                var percentageTask = UI.dialogs.addTask.find('input[name="percentage"]');
370               
371                if (statusSelected == "1"){
372                        percentageTask.val(0);
373                }else if(statusSelected == "2"){
374                        percentageTask.val(percentageTask.val() != 0 ? (percentageTask.val() == 100 ? 99: percentageTask.val()) : 1);
375                }else if(statusSelected == "3"){
376                        percentageTask.val(100);
377                }else if(statusSelected == "4"){
378                        percentageTask.val(percentageTask.val() != 100 ? percentageTask.val() : 99);
379                }
380                todoStatus('addTask', statusSelected);
381        });
382       
383    UI.dialogs.addTask.find('.button').button();
384    UI.dialogs.addTask.find('.button.add').button({
385        icons: {
386            secondary: "ui-icon-plus"
387        }
388    });
389
390    // ==== validation tasks ====
391    UI.dialogs.addTask.find(".input-group .h1").Watermark("Tarefa sem título");
392    if (User.preferences.hourFormat.length == 5) {
393        UI.dialogs.addTask.find(".end-time, .start-time, .time-prevision").mask("99:99", {
394            completed: function () {
395                updateMap();
396            }
397        });
398    } else {
399        $.mask.definitions['{'] = '[ap]';
400        $.mask.definitions['}'] = '[m]';
401        UI.dialogs.addTask.find(".end-time, .start-time, .time-prevision").mask("99:99 {}", {
402            completed: function () {
403                $(this).val(date.Calendar.defaultToAmPm($(this).val()));
404                $(this).timepicker("refresh");
405                $(this).val($(this).val().replace(/[\.]/gi, ""));
406                updateMap();
407            }
408        });
409    }
410    UI.dialogs.addTask.find(".number").numeric();
411    User.preferences.dateFormat.indexOf('-') > 0 ? UI.dialogs.addTask.find(".date").mask("99-99-9999", {
412        completed: function () {
413            updateMap();
414        }
415    }) : UI.dialogs.addTask.find(".date").mask("99/99/9999", {
416        completed: function () {
417            updateMap();
418        }
419    });
420
421    UI.dialogs.addTask.find(".menu-addtask").children(".delete").click(function () {
422        $.Zebra_Dialog('Tem certeza que deseja excluir esta tarefa?', {
423            'type': 'question',
424            'overlay_opacity': '0.5',
425            'buttons': ['Sim', 'Não'],
426            'onClose': function (clicked) {
427                if (clicked == 'Sim') {
428                    canDiscardTaskDialog = true; /* Remove por filtro */
429                    DataLayer.removeFilter('schedulable', {
430                        filter: ['AND', ['=', 'id', objTask.id],
431                            ['=', 'calendar', objTask.group],
432                            ['=', 'user', (objTask.me.user ? objTask.me.user.id : objTask.me.id)]
433                        ]
434                    });
435                    Calendar.rerenderView(true); /********************/
436                    UI.dialogs.addTask.dialog("close");
437                }
438            }
439        });
440    }).end()
441
442    .children(".cancel").click(function () {
443        UI.dialogs.addTask.dialog("close");
444    }).end()
445
446    .children(".save").click(function () { /* Validação */
447        UI.dialogs.addTask.find('input[name="summary"]').focus();
448               
449        if (msg = validDateTask()) {
450            $(".new-task-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg);
451            return false;
452        }
453        canDiscardTaskDialog = true;
454       
455        if(isActivityView)
456            updateActivity = true;
457
458        UI.dialogs.addTask.children().find('form.form-addtask').submit();
459        UI.dialogs.addTask.dialog("close");
460
461    }).end()
462
463    .children(".export").click(function () {
464        UI.dialogs.addTask.children().find(".form-export").submit();
465    });
466
467    var attendeeHtml = DataLayer.render(path + 'templates/attendees_task.ejs', {
468        task: objTask
469    });
470
471    // load template of attendees
472    var blkAddAtendee = UI.dialogs.addTask.find('#calendar_addtask_details6').append(attendeeHtml);
473
474    if(objTask.attendee.length)
475        callbackAttendee();
476
477    /*
478     *   Opções de delegação do participante/organizer
479     */     
480    blkAddAtendee.find(".button.participant-delegate").button({
481        icons: {
482        primary: "ui-icon-transferthick-e-w"
483        },
484        text: false
485    }).click(function () {
486        if($(this).hasClass('attendee-permissions-change-button')){
487        if(!$(this).hasClass('disable')){
488            $(this).removeClass('attendee-permissions-change-button')   
489            .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
490            blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
491            blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
492        }
493        }else{                                 
494        $(this).addClass('attendee-permissions-change-button')   
495        .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
496        blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para');
497        blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden');
498        blkAddAtendee.find('.block-add-attendee.search input.search').focus();
499        }
500    })
501    .addClass('tiny');
502
503    var dates = UI.dialogs.addTask.find('input.date').datepicker({
504        dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'),
505        onSelect: function (selectedDate) {
506            updateMap();
507        }
508    });
509
510    UI.dialogs.addTask.find('input.time').timepicker({
511        closeText: 'Ok',
512        hourGrid: 4,
513        minuteGrid: 10,
514        ampm: ((User.preferences.hourFormat.length > 5) ? true : false),
515        timeFormat: "hh:mm tt",
516        onSelect: function (selectedDateTime) {
517                if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __'))
518                                selectedDateTime.value = "";
519                         
520            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
521            updateMap();
522        },
523        onClose: function (selectedDateTime) {
524            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
525        },
526        beforeShow: function (selectedDateTime) {
527                        if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __'))
528                                selectedDateTime.value = "";
529        }
530    });
531   
532    UI.dialogs.addTask.find(".attendee-list-add .add-attendee-input input").Watermark("digite um email para convidar");
533    /*
534    * Trata a edição de um novo participante adicionado
535    */
536    var hasNewAttendee = false;
537
538    blkAddAtendee.find('.attendee-list-add .add-attendee-input span').click(function(data){
539        blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown();
540    });
541
542    blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown(function(event) {
543        if (event.keyCode == '13' && $(this).val() != '' || (event.keyCode == undefined && $(this).val() != '')) {
544            Encoder.EncodeType = "entity";
545            $(this).val(Encoder.htmlEncode($(this).val()));
546
547            newAttendeeEmail = false;
548            newAttendeeName  = false;
549            skipAddNewLine   = false;
550
551            var info = $(this).val();
552
553            /**
554            * email válido?
555            */
556            info.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/) ?
557            newAttendeeEmail = info : newAttendeeName = info;
558
559            /**
560            * 1) busca no banco para saber se o usuário já existe
561            *           1.1) se existe, atualiza as info na lista de participantes e nao abre o tooltip
562            *           1.2) se não existe
563            *                   a) salva como novo usuario externo no banco (apenas com email)
564            *                   b) exibe tooltip pedindo o nome
565            *                   c) se o usuário preenche tooltip e salva, atualiza com o nome o usuário recém criado
566            *                   d) se o usuário cancela o tooltip, fica o usuário salvo apenas com email e sem nome
567            */
568
569            var user = DataLayer.get('user', ["=", "mail", $(this).val()]);
570            if(!!user && user[0].id)
571                attendees[user[0].id] = {
572                    name: user[0].name
573                    };
574
575            /**
576            * guarda o último tooltip aberto referente à lista de participantes
577            */
578            lastEditAttendeeToolTip = [];
579
580            /**
581            * Valida email e salva um participante externo
582            */
583            var saveContact = function() {
584                Encoder.EncodeType = "entity";
585
586                var currentTip = $('.qtip-active');
587                newAttendeeName  = currentTip.find('input[name="name"]').val();
588                newAttendeeEmail = currentTip.find('input[name="mail"]').val();
589
590                if (!(!!newAttendeeEmail.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/))) {
591                    currentTip.find('.messages').removeClass('hidden').find('.message label').html('Email inválido.');
592                    return false;
593                }
594
595                DataLayer.put('user', {
596                    id:userId,
597                    name:newAttendeeName,
598                    mail:newAttendeeEmail,
599                    isExternal:isExternal
600                });
601
602                lastEditAttendeeToolTip.find('label')
603                .filter('.name').html(Encoder.htmlEncode(newAttendeeName)).attr('title', Encoder.htmlEncode(newAttendeeName)).end()
604                .filter('.mail').html(Encoder.htmlEncode(newAttendeeEmail)).attr('title', Encoder.htmlEncode(newAttendeeEmail));
605
606                blkAddAtendee.find('.attendee-list-add .add-attendee-input input').val('');
607                return true;
608            }
609
610            /**
611            * Formata e adequa um tootip abert para edição de um participante na lista
612            */
613            var onShowToolTip = function(arg0) {
614                $('.qtip-active .button.close').button({
615                    icons: {
616                        primary: "ui-icon-close"
617                    },
618                    text: false
619                });
620                $('.qtip-active .button').button()
621                .filter('.save').click(function(event, ui) {
622                    if(saveContact())
623                        lastEditAttendeeToolTip.qtip("destroy");
624                    else
625                        return false;
626                }).end()
627                .filter('.cancel').click(function(event, ui) {
628                    lastEditAttendeeToolTip.qtip("destroy");
629                })
630
631                /**
632                * Trata o ENTER no campo da tooltip, equivalente a salvar
633                * o novo convidado.
634                */
635                $('.qtip-active input').keydown(function(event) {
636                    if (event.keyCode == '13') {                                               
637                        if (saveContact())                                             
638                            lastEditAttendeeToolTip.qtip("destroy");
639
640                        lastEditAttendeeToolTip.qtip("destroy");
641                        event.preventDefault();
642                    }
643                })
644                .filter('[name="name"]').Watermark("informe o nome do contato").end()
645                .filter('[name="mail"]').Watermark("informe o email do contato");
646            }
647
648            /**
649            * Se o email digitado já foi adicionado na lista,
650            * o usuário deve ser avisado e um botão de edição deve ser exibido
651            */
652            if(blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').length) {
653                hasNewAttendee  = false;
654                newAttendeeName = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li').find('label.name').attr('title');
655
656                blkAddAtendee.find('.email-validation').removeClass('hidden')
657                .find('.message label').html("O usuário acima já foi adicionado! <a class=\"small button\">Editar</a>")
658                .find(".button").button().click(function () {
659                    /**
660                    * Se o usuário optar por editar o participante anteriormente adicionado,
661                    * uma tooltip deve ser aberta para este participante, viabilizando a edição
662                    */
663                    blkAddAtendee.find("ul.attendee-list").scrollTo('label.mail[title="' + newAttendeeEmail + '"]');
664                    /**
665                    * Remove tooltip possivelmente existente
666                    */
667                    if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
668                        lastEditAttendeeToolTip.qtip('destroy');
669
670                    lastEditAttendeeToolTip = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li');
671                    lastEditAttendeeToolTip.qtip({
672                        show: {
673                            ready: true,
674                            solo: true,
675                            when: {
676                                event: 'click'
677                            }
678                        },
679                    hide: false,
680                    content: {
681                        text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
682                            attendee:{
683                                name:newAttendeeName,
684                                mail:newAttendeeEmail
685                            }
686                        } ) ),
687                    title: {
688                        text:'Detalhes do participante',
689                        button: '<a class="button close" href="#">close</a>'
690                    }
691                    },
692                    style: {
693                        name: 'blue',
694                        tip: {
695                            corner: 'leftMiddle'
696                        },
697                        border: {
698                            width: 4,
699                            radius: 8
700                        },
701                        width: {
702                            min: 230,
703                            max:230
704                        }
705                    },
706                position: {
707                    corner: {
708                        target: 'rightMiddle',
709                        tooltip: 'leftMiddle'
710                    },
711                    adjust: {
712                        x:0,
713                        y:0
714                    }
715                }
716                });
717            lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
718        });
719    skipAddNewLine = true;
720    } else {
721        hasNewAttendee  = true;
722        blkAddAtendee.find('.email-validation').addClass('hidden');
723    }
724
725
726    var isExternal = (!!user && !(!!user.isExternal)) ? 0 : 1;
727
728    /**
729    * Remove tooltip possivelmente existente
730    */
731    if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
732        lastEditAttendeeToolTip.qtip('destroy');
733
734    userId = '';
735    var newAttendeeId = '';
736
737    if (user){
738        if (!skipAddNewLine) {
739            user[0].id =  DataLayer.put('participant', {
740                user: user[0].id,
741                isExternal: isExternal,
742                acl: 'r'
743            });
744            user[0].acl = 'r';
745            user[0].isDirty = !!!objTask.id;
746
747            blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
748                DataLayer.render(path+'templates/participants_add_itemlist.ejs', user)
749                )
750            .scrollTo('max');
751            callbackAttendee();
752        }
753
754        $(this).val('');
755
756    } else if (!skipAddNewLine) {
757        /**
758        * a) salva como novo usuario externo no banco (apenas com email) e...
759        * adiciona novo contato externo à lista de convidados
760        */
761
762        userId = DataLayer.put('user', {
763            name: newAttendeeName,
764            mail: newAttendeeEmail,
765            isExternal: isExternal
766        });
767        newAttendeeId = DataLayer.put('participant', {
768            user: userId,
769            isExternal: isExternal
770        });
771
772
773        blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
774            DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{
775                id:newAttendeeId,
776                name: newAttendeeName,
777                mail: newAttendeeEmail,
778                isExternal: 1,
779                isDirty: !!!objTask.id
780                }])
781            ).scrollTo('max');
782        callbackAttendee();
783
784        /**
785        * Adiciona tootip para atualização dos dados do contato externo
786        * recém adicionado.
787        */
788        lastEditAttendeeToolTip = blkAddAtendee.find('dd.attendee-list li:last');
789        lastEditAttendeeToolTip.qtip({
790            show: {
791                ready: true,
792                solo: true,
793                when: {
794                    event: 'click'
795                }
796            },
797        hide: false,
798        content: {
799            text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
800                attendee:{
801                    name:newAttendeeName,
802                    mail:newAttendeeEmail
803                }
804            } ) ),
805        title: {
806            text:'Detalhes do participante',
807            button: '<a class="button close" href="#">close</a>'
808        }
809        },
810        style: {
811            name: 'blue',
812            tip: {
813                corner: 'leftMiddle'
814            },
815            border: {
816                width: 4,
817                radius: 8
818            },
819            width: {
820                min: 230,
821                max:230
822            }
823        },
824    position: {
825        corner: {
826            target: 'rightMiddle',
827            tooltip: 'leftMiddle'
828        },
829        adjust: {
830            x:0,
831            y:0
832        }
833    }
834    });
835
836    lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
837
838    $(this).val('');
839
840
841    }
842    event.preventDefault();
843    }
844
845    });
846
847    blkAddAtendee.find('.add-attendee-search .ui-icon-search').click(function (task) {
848        blkAddAtendee.find('.add-attendee-search input').keydown();
849    });
850
851    blkAddAtendee.find('.add-attendee-search input').keydown(function (task) {
852
853        if (task.keyCode == '13' || typeof (task.keyCode) == 'undefined') {
854            var result = DataLayer.get('user', ["*", "name", $(this).val()], true);
855
856            /**
857             * TODO: trocar por template
858             */
859            blkAddAtendee.find('ul.search-result-list').empty().css('overflow', 'hidden');
860            if (!result) {
861                blkAddAtendee.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
862            }
863
864            for (i = 0; i < result.length; i++)
865            result[i].enabled = (blkAddAtendee.find('dd.attendee-list ul.attendee-list label.mail[title="' + result[i].mail + '"]').length) ? false : true;
866
867            blkAddAtendee.find('ul.search-result-list').append(DataLayer.render(path + 'templates/participants_search_itemlist.ejs', result));
868
869            blkAddAtendee.find('ul.search-result-list li').click(function (task, ui) {
870                if ($(task.target).is('input')) {
871                    old_item = $(task.target).parents('li');
872                    newAttendeeId = DataLayer.put('participant', {
873                        user: old_item.find('.id').html(),
874                        isExternal: old_item.find('.isExternal').html()
875                    });
876
877                    attendees[old_item.find('.id').html()] = old_item.find('.name').html();
878
879                    blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(DataLayer.render(path + 'templates/participants_add_itemlist.ejs', [{
880                        id: newAttendeeId,
881                        name: old_item.find('.name').html(),
882                        mail: old_item.find('.mail').html(),
883                        isExternal: old_item.find('.isExternal').html(),
884                        notEvent: true,
885                        isDirty: !! !objTask.id,
886                                                isDelegate: !!(objTask.me.id != objTask.organizer.id)
887                    }])).scrollTo('max');
888                    /**
889                     * Delegação de participação de um participante com permissão apenas de leitura
890                     *
891                     */
892                    if (objTask.me.id != objTask.organizer.id) {
893
894                        blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
895                        blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
896
897                        blkAddAtendee.find('.status option').toggleClass('hidden');
898                        blkAddAtendee.find('option[value=5]').attr('selected', 'selected').trigger('change');
899                        blkAddAtendee.find('.request-update').removeClass('hidden');
900
901                        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());
902
903                        blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled');
904                        blkAddAtendee.find(".button.close").button({
905                            icons: {
906                                primary: "ui-icon-close"
907                            },
908                            text: false
909                        }).click(function () {
910
911                            $(this).parents('li').find('input[name="delegatedFrom[]"]').val('');
912                            blkAddAtendee.find('.request-update').addClass('hidden');
913                            blkAddAtendee.find('.status option').toggleClass('hidden');
914                            blkAddAtendee.find('option[value=1]').attr('selected', 'selected').trigger('change');
915                            blkAddAtendee.find('.me .participant-delegate').removeClass('disable ui-button-disabled ui-state-disabled attendee-permissions-change-button').find('.ui-icon-person').removeClass('attendee-permissions-change').end();
916
917                            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
918                            $(this).parents('li').remove();
919                        }).addClass('tiny');
920                    } else {
921                        callbackAttendee();
922                        old_item.remove();
923                    }
924                }
925            });
926
927            event.preventDefault();
928        }
929    });
930
931    UI.dialogs.addTask.find('.row.fileupload-buttonbar-task .button').filter('.delete').button({
932        icons: {
933            primary: "ui-icon-close"
934        },
935        text: 'Excluir'
936    }).click(function () {
937        $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', {
938            'type': 'question',
939            'overlay_opacity': '0.5',
940            'buttons': ['Sim', 'Não'],
941            'onClose': function (clicked) {
942                if (clicked == 'Sim') {
943
944                    var ids = [];
945                    $.each($('.attachment-list input'), function (i, input) {
946                        DataLayer.remove('schedulableToAttachment', {
947                            filter: ['=', 'id', '' + input.value]
948                        });
949                    });
950                    $('div.new-task-win .attachment-list input').remove();
951                    $('div.new-task-win .row.fileupload-buttonbar .attachments-list p').remove();
952                    $('div.new-task-win .btn-danger.delete').addClass('hidden');
953                }
954            }
955        });
956    }).end().filter('.close').button({
957        icons: {
958            primary: "ui-icon-close"
959        },
960        text: false
961    }).click(function () {
962        DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val());
963        $(this).parents('p').remove();
964    }).end().filter('.downlaod-archive').button({
965        icons: {
966            primary: "ui-icon-arrowthickstop-1-s"
967        },
968        text: false
969    });
970
971    extendsFileupload('task', path);
972
973    disponibily(objTask, path, attendees, 'task');
974
975    UI.dialogs.addTask.find('.button-add-alarms').click(function () {
976        var li_attach = DataLayer.render(path + 'templates/alarms_add_itemlist.ejs', {
977            type: 1
978        });
979
980        jQuery('.task-alarms-list').append(li_attach).find('.button.remove').button({
981            text: false,
982            icons: {
983                primary: 'ui-icon-close'
984            }
985        }).click(function (el) {
986            $(this).parent().remove().find('li').is(':empty')
987        });
988        // valicacao de campos numericos
989        $('.number').numeric();
990    });
991
992    UI.dialogs.addTask.find(':input').change(function(event){
993        if (event.keyCode != '27' && event.keyCode != '13')
994            canDiscardTaskDialog = false;
995    }).keydown(function(event){
996        if (event.keyCode != '27' && event.keyCode != '13')
997            canDiscardTaskDialog = false;
998    });
999
1000    UI.dialogs.addTask.dialog('open');
1001}
Note: See TracBrowser for help on using the repository browser.