source: sandbox/newExpressoMail/prototype/modules/newMail2/js/newfoldertree.js @ 7210

Revision 7210, 20.1 KB checked in by gustavo, 12 years ago (diff)

Ticket #0000 - Criado novo modulo para o desenvolvimento do novo ExpressoMail?

  • Property svn:executable set to *
Line 
1var init_tree = 0;
2var selected;
3var over;
4var cp_tree1;
5var cp_tree2;
6function unorphanize(root, element) {
7        var ok = false;
8        var f = 0;
9        for (var i=0; i<root.length; i++) {
10                if (root[i].id == element.parentFolder) {
11                        element.children = new Array();
12                        root[i].children.push(element);
13                        return true;
14                } else if (ok = unorphanize(root[i].children, element)) {
15                        break;
16                }
17        }
18        return ok;
19}
20
21function count_unseen_children(folder){
22        if(folder.children.length){
23                for(var i=0; i< folder.children.length; i++){
24                        if(folder.children[i].children.length)
25                                folder.children[i]['children_unseen'] = (folder.children[i]['children_unseen'] ? folder.children[i]['children_unseen'] : 0) + count_unseen_children(folder.children[i]);
26                       
27                        folder['children_unseen'] = (folder['children_unseen'] ? folder['children_unseen'] : 0)+ (folder.children[i]['children_unseen'] ? folder.children[i]['children_unseen'] : 0) + parseInt(folder.children[i].messageCount.unseen);                       
28                }
29                return folder['children_unseen'];
30        }else{
31                return parseInt(folder.messageCount.unseen);
32        }
33}
34
35function valid_tabs(children_of_this_folder, folder_to_move){
36        var borders_open = $("#border_tr").children();
37
38        var error = false;
39        for(var i = 1; i <= borders_open.length -2; i ++){
40                //VERIFICA A CADA FILHO DA PASTA SE ESTA eventNSAGEM E DESTA PASTA
41                $.each(children_of_this_folder, function(index, value){
42                        if($(children_of_this_folder[index]).attr('id') == openTab.imapBox[$(borders_open[i]).find("input[type=hidden]").attr("name")]){
43                                error = true;
44                                write_msg(get_lang("One or more messages from any sub-folder are open"));
45                                return error;
46                               
47                        }
48                });
49                if(error){
50                        return error;
51                }
52                //VERIFICA SE EXISTE NA PASTA A SER MOVIDA
53                if(openTab.imapBox[$(borders_open[i]).find("input[type=hidden]").attr("name")] == folder_to_move){
54                        error = true;
55                        write_msg(get_lang("One or more messages from this folder are open"));
56                        return error;
57                }
58        }
59}
60
61function draw_new_tree_folder(callback){
62       
63        var folders = DataLayer.get("folder", true);
64       
65        if(!selected){
66                selected = "INBOX";
67        }
68        /*
69        if( folders )
70        {
71            folders = $.map( folders, function( folder ){
72                  return {
73                    id: folder.folder_id,
74                    commonName: folder.folder_name,
75                    parentFolder: folder.folder_parent === "root" ? "" : folder.folder_parent,
76                    messageCount: { total : '', unseen : '0' }
77                  };
78            });
79        }
80        else
81            folders = DataLayer.get("folder", true);
82        */
83        var tree1 = new Array();
84        var tree2 = new Array();
85        var tree3 = new Array();
86        for (var i=0; i<folders.length; i++) {
87                if (/^INBOX/.test(folders[i].id)) {
88                        if (!unorphanize(tree1, folders[i])) {
89                                folders[i].children = new Array();
90                                tree1.push(folders[i]);
91                        }
92                }
93                else if (/^user/.test(folders[i].id)) {
94                        if (!unorphanize(tree2, folders[i])) {
95                                folders[i].children = new Array();
96                                tree2.push(folders[i]);
97                        }
98                }
99                else if (/^local_messages/.test(folders[i].id)) {
100                        if (!unorphanize(tree3, folders[i])) {
101                                folders[i].children = new Array();
102                                tree3.push(folders[i]);
103                        }
104                }
105        }
106       
107        for(var i =0; i<tree1.length; i++){
108                count_unseen_children(tree1[i]);
109        }
110        for(var i =0; i<tree2.length; i++){
111                count_unseen_children(tree2[i]);
112        }
113        for(var i =0; i<tree3.length; i++){
114                count_unseen_children(tree3[i]);
115        }
116        cp_tree1 = tree1;
117        cp_tree2 = tree2;
118        var shared_acls = {};
119
120        $.each(cp_tree2, function(index, value){
121                shared_acls[value.id] = value.acl_share;
122        });
123
124        var html = DataLayer.render('templates/detailedfoldertree.ejs', {folders: [tree1, tree2, tree3]});
125        var folders_html = $(".imap-folders").html(html).find(".mainfoldertree").treeview({
126                        persist: "cookie",
127                        animated: "fast"
128        }).find(".folder").unbind("click").click(function(event){
129               
130                // MUDANÇA DE PASTAS!
131                var target = $(this);   
132               
133                if($(".folders-loading").length)
134                        return;
135               
136                if($(event.target).parent().is(".float-menu"))
137                        return;
138                       
139                if( target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable-hitarea, .lastExpandable-hitarea, .treeview ,.folder_unseen,.ui-icon, .float-menu, .new_folder, .folders-loading, .head_folder, .shared-folders') )
140                        return;
141               
142                if( target.parent().find(".new_folder").length)
143                        return;
144                       
145                if( !target.attr('id') )
146                        target = target.parent();
147                if (target[0] == $(".mainfoldertree")[0]) return;
148                var uiId = target.attr('id');
149                var child = target.find('.folder');
150                 
151                if(!target.is('.mainfoldertree > .expandable-hitarea, .mainfoldertree > .collapsable-hitarea')){
152                        $('.filetree span.folder.selected').removeClass('selected');
153                        $(target).children('.folder').addClass('selected');
154                }
155                $(this).addClass("folders-loading");
156                selected = target.attr('id');
157
158                changeFolder(target.attr('id'), child.attr('title'));   
159
160                /*$.ajax({
161                          url : "controller.php?"+ $.param( { action: "$this.imap_functions.get_folders_list", folder: target.attr('id') } ),
162                          success : function(data){
163                                  data = connector.unserialize(data);
164
165                                  if(data)
166                                    build_quota(data);
167                          }
168                });*/
169                $(".folders-loading").removeClass("folders-loading");
170
171        }).filter('.followup-messages').click(function(event, ui){
172                search_emails("UNDELETED KEYWORD \"$Followupflagged\"");
173        }).end().end();
174       
175        folders_html.find('[id="'+selected+'"]').children().addClass("selected");
176        $(".folder").not(".head_folder").not(".shared-folders").parent().find(".folder").not(".head_folder,.inbox,.drafts,.sent,.spam,.trash").draggable({
177                // DRAG DE PASTAS
178                start : function(){
179                        $(this).css("color", "gray");
180                },
181                stop : function(){
182                        $(this).css("color", "");
183                },
184                revert: "invalid",
185                helper: function(event){
186                        if($.trim(($(this).text().split("["))[0]).length > 18)
187                                return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]).substring(0,18) + "...", type: "folder"}));
188                        return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]), type: "folder"}));
189                },
190                delay: 150,
191                refreshPositions: true,
192                zIndex : 2700,
193                //scroll: true,
194                //scrollSensitivity: 100,
195                //scrollSpeed: 100,
196                containment: "#divAppbox"
197        }).end().droppable({
198                //DROP DE PASTAS
199                over : function(a, b){
200                        //INICIO : SE A PASTA CONTER FILHAS EXPANDE
201                        over = $(this);
202                        $(this).addClass("folder-over");
203                        if(($(this)[0] != $(this).parent().find(".head_folder")[0]))
204                                if($(this).prev()[0])
205                                        if($(this).parent().find(".expandable-hitarea")[0] == $(this).prev()[0]){
206                                                setTimeout(function(){
207                                                        if(over.hasClass("folder-over"))
208                                                                over.prev().trigger("click");
209                                                }, 500);
210                                               
211                                        }
212                        //FIM : SE A PASTA CONTER FILHAS EXPANDE
213                       
214                        //SETA BORDA EM VOLTA DA PASTA
215                },
216                out : function(){
217                        //RETIRA BORDA EM VOLTA DA PASTA
218                        $(this).removeClass("folder-over");
219                },
220                drop : function(event, ui){
221                        $(this).removeClass("folder-over");
222                        if($(this).parent().attr('id') == undefined){
223                                var folder_to = 'INBOX';
224                                var to_folder_title = get_lang("Inbox");
225                        }else{
226                                var folder_to = $(this).parent().attr('id');
227                                var to_folder_title = $(this).attr('title');
228                        }               
229                        var folder_to_move = ui.draggable.parent().attr('id');
230                        var border_id = ui.draggable.find("input[type=hidden]").attr("name");
231                        // eventnsagens : SE O DROP VIER DA LISTA DE eventNSAGENS :
232                        if(folder_to_move == "tbody_box"){
233                                move_msgs2(get_current_folder(), 'selected', 0, folder_to, to_folder_title,true);
234                                return refresh();
235                        }
236                        //SE FOR DE UMA PESQUISA RAPIDA
237                        else if(ui.draggable.parents('[id^="content_id_"]')[0]){
238                                move_search_msgs("content_id_"+border_id, folder_to, to_folder_title);
239                                return refresh();
240                        }
241                        // eventnsagens : SE O DROP VIER DE UMA ABA ABERTA
242                        else if(folder_to_move == "border_tr"){
243                                var id_msg = border_id.split("_")[0];
244                                folder = $("#input_folder_"+border_id+"_r")[0] ? $("#input_folder_"+border_id+"_r").val() : (openTab.imapBox[border_id] ? openTab.imapBox[border_id]:get_current_folder());
245                                alternate_border(border_id);
246                                move_msgs2(folder, id_msg, border_id, folder_to, to_folder_title,true);
247                                return refresh();
248                        }
249                        // SE O DROP VIER DA LISTA DE PASTAS
250                        else{
251                                var folder_to_exist = folder_to_move.split(imap_configs.imapDelimiter);
252                                folder_to_exist = folder_to+imap_configs.imapDelimiter+folder_to_exist[folder_to_exist.length-1];
253                               
254                                //VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS
255
256                                if(valid_tabs(ui.draggable.parent().find("li"), folder_to_move)){
257                                        return;
258                                }
259                                //FIM : VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS;
260                               
261                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA PARA O eventSMO LOCAL
262                                if(folder_to_exist == folder_to_move){
263                                        return write_msg(get_lang("Thie folder is already in this place"));
264                                }
265                               
266                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA ABERTA NO momentO
267                                if(folder_to_move == get_current_folder()){
268                                        return write_msg(get_lang("It's not possible move this folder, because it is being used in the moment!"));
269                                }
270                               
271                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA FILHA DA PASTA ABERTA NO momentO
272                                if(ui.draggable.parent().find(".selected")[0]){
273                                        return write_msg(get_lang("It's not possible move this folder, because its subfolder is being used in the moment!"));
274                                }
275                               
276                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA PAI PARA DENTRO DE UMA FILHA
277                                if(ui.draggable.parent().find('[id="'+folder_to+'"]')[0]){
278                                        return write_msg(get_lang("It's not possible to move this folder to its subfolders!"));
279                                }                                       
280                               
281                                if($('[id="'+folder_to_exist+'"]').length){
282                                        return write_msg(get_lang("Can not move this folder to this location, because the target has already a folder with this name"));
283                                }
284                               
285                                $(this).addClass("folders-loading");
286                               
287                                $.ajax({
288                                        url : "controller.php?"+ $.param( { action: "$this.imap_functions.move_folder", folder_to_move: folder_to_move, folder_to: folder_to } ),
289                                        success : function(data){
290                                                cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
291                                                data = connector.unserialize(data);
292                                                if(data == "Permission denied"){
293                                                        write_msg(get_lang("Permission denied"));
294                                                }else if(data){
295                                                        write_msg(get_lang("The folder was successfully moved"));
296                                                }
297                                                else{
298                                                        write_msg(get_lang("ERROR moving your folder."));
299                                                }
300                                        }
301                                });
302                        }
303                }
304        });
305        $(".folder").not(".shared-folders").parent().find(".folder").hover(
306                function(){
307                        //CASO A LI NÃO TENHA UM eventNU FLUTUANTE AINDA, O eventNU É ADICIONADO!
308                        if(!$(this).children(":last").hasClass("float-menu") && !$(this).children(":last").hasClass("new_folder")){
309                                var folder_ = $(this);
310                                var folder_name;
311                                var shared = {
312                                        head : false,
313                                        valid : false
314                                };
315                                if(folder_.parent().attr('id')){
316                                        folder_name = folder_.parent().attr('id').split(imap_configs.imapDelimiter);
317                                        folder_name = folder_name[folder_name.length -1];
318                                        shared.valid = folder_.parent().attr('id').search("user/") == 0 ? true : false;
319                                }else
320                                        folder_name = "Root";
321                               
322                                if(shared.valid){
323                                        shared.head = folder_.parent().attr('id').split(imap_configs.imapDelimiter).length == 2 ?  true : false;
324                                        var folder_name_parts = folder_.parent().attr('id').split(imap_configs.imapDelimiter);
325                                        var acls = shared_acls[folder_name_parts[0]+imap_configs.imapDelimiter+folder_name_parts[1]];
326
327                                }
328
329                                html = DataLayer.render("/templates/float_folder_menu.ejs", {name_folder : folder_name, flag : shared, acl : acls});                                   
330                                        //FUNÇÃO DO eventNU FLUTUANTE EDITAR < BEGIN
331                                var esc = false;
332                                $(folder_).append(html).find(".float-menu-edit").click(function(){
333                                        var folder_id = $(this).parents(".closed:first").attr('id');
334                                        var name = $.trim($(this).parents(".closed:first").find("span:first").text().split("[")[0]);
335                                        if($(this).parents(".closed:first").find("span:first").hasClass("selected"))
336                                                return write_msg(get_lang("It's not possible rename this folder, because it is being used in the moment!"));
337                                        if($(this).parents(".closed:first").find(".selected").length)
338                                                return write_msg(get_lang("It's not possible rename this folder, because its subfolder is being used in the moment!"));
339                                        if(valid_tabs($(this).parents("li:first").find("li"), folder_id))
340                                                return;
341                                        $(this).parents(".closed:first").find("span:first").empty().append("<input class='new_folder folder' type='text' maxlength='100'></input>");
342                                        $(".new_folder").focus().keydown(function(event){
343                                                event.stopPropagation();
344                                                if(event.keyCode == 13){
345                                                        if($(this).val() != ""){
346                                                                if($(this).val().match(/[\/\`\~\^\<\>\|\\\"\!\@\#\$\%\&\*\+\(\)\[\]\{\}\?;:]/gi)){
347                                                                        return write_msg(get_lang("cannot create folder. try other folder name"));
348                                                                }
349                                                                var new_name = folder_id.replace(/[a-zA-Z0-9á-úÁ-Ú^\s_-]+$/, $(this).val());
350                                                                if($('[id="'+new_name+'"]').length){
351                                                                        $(".folders-loading").removeClass("folders-loading");
352                                                                        write_msg(get_lang("Mailbox already exists"));
353                                                                        return draw_new_tree_folder();
354                                                                }
355                                                                $(".new_folder").parent().addClass("folders-loading");
356                                                                $.ajax({
357                                                                        url : "controller.php?action=$this.imap_functions.ren_mailbox",
358                                                                        type : "POST",
359                                                                        data : "current="+folder_id+"&rename="+new_name,
360                                                                        success : function(data){
361                                                                                data = connector.unserialize(data);
362                                                                                if(data == "Permission denied"){
363                                                                                        $(".folders-loading").removeClass("folders-loading");
364                                                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
365                                                                                        return write_msg(get_lang("Permission denied"));
366                                                                                }
367                                                                                write_msg(get_lang("The folder was successfully rename"));
368                                                                                cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
369                                                                        }
370                                                                });
371                                                        }
372                                                }else if( event.keyCode == 27){
373                                                        draw_new_tree_folder();
374                                                }
375                                        }).focusout(function(){
376                                                draw_new_tree_folder();
377                                        }).val(name);
378                                })
379                                //FUNÇÃO DO eventNU FLUTUANTE EDITAR < END
380                                //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < BEGIN
381                                .end().find(".float-menu-remove").click(function(){
382                                       
383                                        var folder_id = $(this).parents(".closed:first").attr('id');
384                                        var folder_name = "<strong>"+$.trim($(this).parents(".closed:first").find(".folder").text().split("[")[0])+"</strong>";
385                                       
386                                        if(valid_tabs($(this).parents("li:first").find("li"), folder_id))
387                                                return;
388                                        $(this).parents(".closed:first").find(".folder").addClass("folders-loading");
389                                       
390                                        if($(this).parents(".closed:first").find("ul").length){
391                                                $(this).parents(".closed:first").find(".folder").removeClass("folders-loading");
392                                                return write_msg(get_lang("Delete/move subfolders first"));
393                                        }
394                                        if($(this).parents(".closed:first").find(".selected").length){
395                                                $(this).parents(".closed:first").find(".folder").removeClass("folders-loading");
396                                                return write_msg(get_lang("It's not possible delete this folder, because it is being used in the moment!"));
397                                        }
398                                        var folder_span = $(this);
399                                        var confirm_text = get_lang("Do you wish to exclude the folder ");
400                                        $.Zebra_Dialog(confirm_text+folder_name, {
401                                                'type':     'question',
402                                                'overlay_opacity': '0.5',
403                                                'buttons':  [get_lang('Yes'), get_lang('No')],
404                                                'onClose':  function(caption) {
405                                                        if(caption == get_lang('Yes')){
406                                                                $.ajax({
407                                                                        url : "controller.php?action=$this.imap_functions.delete_mailbox",
408                                                                        type: "POST",
409                                                                        data : "del_past="+folder_id,
410                                                                        success : function(data){
411                                                                                data = connector.unserialize(data);
412                                                                                if(data == "Mailbox does not exist"){
413                                                                                        $(".folders-loading").removeClass("folders-loading");
414                                                                                        return write_msg(get_lang("Mailbox does not exist"));
415                                                                                }else if(data == "Permission denied"){
416                                                                                        $(".folders-loading").removeClass("folders-loading");
417                                                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
418                                                                                        return write_msg(get_lang("Permission denied"));
419                                                                                }
420                                                                                write_msg(get_lang("The folder %1 was successfully removed", folder_name));
421                                                                                cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
422                                                                        }
423                                                                });
424                                                        }else{
425                                                                folder_span.parents(".closed:first").find(".folder").removeClass("folders-loading");
426                                                                return;
427                                                        }
428                                                }
429                                        });
430                                        /* if(!confirm(confirm_text + folder_name)){
431                                                $(this).parents(".closed:first").find(".folder").removeClass("folders-loading");
432                                                return;
433                                        } */
434                                })
435                                //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < END
436                                //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < BEGIN
437                                .end().find(".float-menu-new").click(function(){
438                                        $(this).parents(".float-menu").hide();
439                                        var selected_li = $(this).parents(".closed:first");
440                                        if(selected_li.find("ul:first").length){
441                                                var new_folder = $("<li><input class='new_folder folder' type='text' maxlength='100'></input></li>").appendTo(selected_li.find("ul:first"));                                                           
442                                                if(selected_li.find(".expandable-hitarea").length){
443                                                        selected_li.find(".expandable-hitarea").trigger('click');
444                                                }
445                                                selected_li.find("ul:first").treeview({
446                                                        add: new_folder
447                                                });
448                                        }else if(selected_li.length){
449                                                var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li);                                                           
450                                                selected_li.treeview({
451                                                        add: new_folder
452                                                });
453                                        }else{
454                                                selected_li = $(this).parents(".head_folder").parent();
455                                                if($(this).parents(".head_folder").parent().find(".expandable-hitarea").length){
456                                                        $(this).parents(".head_folder").parent().find(".expandable-hitarea").trigger('click');
457                                                }
458                                                var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li);                                                           
459                                                selected_li.treeview({
460                                                        add: new_folder
461                                                });
462                                        }
463                                       
464                                        selected_li.find(".new_folder").Watermark("Nova Pasta").focus().keydown(function(event){
465                                                event.stopPropagation();
466                                                if(event.keyCode == 13){
467                                                        if($(this).val().match(/[\`\~\^\<\>\|\\\"\!\@\#\$\%\&\*\+\(\)\[\]\{\}\?;:]/gi)){
468                                                                return write_msg(get_lang("cannot create folder. try other folder name"));
469                                                        }
470                                                        if($('[id="'+ (selected_li.attr('id')? selected_li.attr('id') : "INBOX") + imap_configs.imapDelimiter + $(this).val()+'"]').length){
471                                                                $(".folders-loading").removeClass("folders-loading");
472                                                                write_msg(get_lang("Mailbox already exists"));
473                                                                return draw_new_tree_folder();
474                                                        }
475                                                        $(".new_folder").parent().addClass("folders-loading");
476                                                        create_new_folder(($(this).val() != "" ? $(this).val() : get_lang("New Folder")), (selected_li.attr('id')? selected_li.attr('id') : "INBOX"));
477                                                }else if( event.keyCode == 27){
478                                                        draw_new_tree_folder();
479                                                }
480                                        }).focusout(function(){
481                                                draw_new_tree_folder();
482                                        });
483                                }).end().find(".float-menu-export").click(function(){
484                                        //proxy_mensagens.export_all_messages($(this).parents("li:first").attr("id"))
485
486                                        var name_box = $(this).parents("li:first").attr("id");
487                                        var name_folder = name_box.split(imap_configs.imapDelimiter)[name_box.split(imap_configs.imapDelimiter).length-1];
488
489                                        var hand_export = function(data){
490                                                if(!data){
491                                                        write_msg(get_lang('Error compressing messages (ZIP). Contact the administrator.'))
492                                                }else if(data["empty_folder"]){
493                                                        write_msg(get_lang("The selected folder is empty."));
494                                                }else
495                                                  download_attachments(null, null, data, null,null, name_folder +'.zip');
496                                        }
497                                        cExecute("$this.exporteml.export_all",hand_export,"folder="+name_box); 
498                                        write_msg(get_lang('You must wait while the messages will be exported...'));           
499                                });
500                                //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < END
501                        }
502                        if(!$(".new_folder").length){
503                                $(this).find(".float-menu:first").css("display", "");
504                        }
505                },
506                function(){
507                        $(this).find(".float-menu:first").hide();
508                }
509        );
510}
511
Note: See TracBrowser for help on using the repository browser.