source: sandbox/newExpressoMail/prototype/modules/newMail/js/newfoldertree.js @ 7265

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