source: trunk/prototype/modules/mail/js/foldertree.js @ 5503

Revision 5503, 16.3 KB checked in by gustavo, 12 years ago (diff)

Ticket #2484 - Melhorias na estrutura de diretórios do ExpressoMail?

  • Property svn:executable set to *
Line 
1var init_tree = 0;
2var selected;
3var over;
4
5function unorphanize(root, element) {
6        var ok = false;
7        for (var i=0; i<root.length; i++) {
8                if (root[i].id == element.parentFolder) {
9                        element.children = new Array();
10                        root[i].children.push(element);
11                        return true;
12                } else if (ok = unorphanize(root[i].children, element)) {
13                        break;
14                }
15        }
16        return ok;
17}
18
19function valid_tabs(children_of_this_folder, folder_to_move){
20        var borders_open = $("#border_tr").children();
21
22        var error = false;
23        for(var i = 1; i <= borders_open.length -2; i ++){
24                //VERIFICA A CADA FILHO DA PASTA SE ESTA eventNSAGEM E DESTA PASTA
25                $.each(children_of_this_folder, function(index, value){
26                        if($(children_of_this_folder[index]).attr('id') == openTab.imapBox[$(borders_open[i]).find("input[type=hidden]").attr("name")]){
27                                error = true;
28                                alert(get_lang("One or more messages from any sub-folder are open"));
29                                return error;
30                               
31                        }
32                });
33                if(error){
34                        return error;
35                }
36                //VERIFICA SE EXISTE NA PASTA A SER MOVIDA
37                if(openTab.imapBox[$(borders_open[i]).find("input[type=hidden]").attr("name")] == folder_to_move){
38                        error = true;
39                        alert(get_lang("One or more messages from this folder are open"));
40                        return error;
41                }
42        }
43}
44
45function draw_new_tree_folder(callback){
46        var folders = DataLayer.get("folder", true);
47        if(!selected){
48                selected = "INBOX";
49        }
50        var tree1 = new Array();
51        var tree2 = new Array();
52        var tree3 = new Array();
53        for (var i=0; i<folders.length; i++) {
54                if (/^INBOX/.test(folders[i].id)) {
55                        if (!unorphanize(tree1, folders[i])) {
56                                folders[i].children = new Array();
57                                tree1.push(folders[i]);
58                        }
59                }
60                else if (/^user/.test(folders[i].id)) {
61                        if (!unorphanize(tree2, folders[i])) {
62                                folders[i].children = new Array();
63                                tree2.push(folders[i]);
64                        }
65                }
66                else if (/^local_messages/.test(folders[i].id)) {
67                        if (!unorphanize(tree3, folders[i])) {
68                                folders[i].children = new Array();
69                                tree3.push(folders[i]);
70                        }
71                }
72        }
73        $("#content_folders").removeClass("menu-degrade").parent().removeClass("image-menu");
74        DataLayer.render('../prototype/modules/mail/templates/detailedfoldertree.ejs', {folders: [tree1, tree2, tree3]}, function(html){
75                var folders_html = $("#content_folders").html(html).find(".mainfoldertree").treeview({
76                                persist: "cookie",
77                                animated: "fast"
78                }).find(".folder").click(function(event){
79                       
80                        // MUDANÇA DE PASTAS!
81                        var target = $(this);           
82                        if( target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable-hitarea, .lastExpandable-hitarea, .treeview ,.folder_unseen,.ui-icon, .float-menu, .new_folder') )
83                                return;
84                        if( !target.attr('id') )
85                                target = target.parent();
86                        if (target[0] == $(".mainfoldertree")[0]) return;
87                        var uiId = target.attr('id');
88                        var child = target.find('.folder');
89                         
90                        if(!target.is('.mainfoldertree > .expandable-hitarea, .mainfoldertree > .collapsable-hitarea')){
91                                $('.filetree span.folder.selected').removeClass('selected');
92                                $(target).children('.folder').addClass('selected');
93                        }
94                        selected = target.attr('id');
95                        change_folder(target.attr('id'), child.attr('title'));                 
96                }).end();
97                folders_html.find('[id="'+selected+'"]').children().addClass("selected").end().end().find("li:first").find(".folder").not(".head_folder,.inbox,.drafts,.sent,.spam,.trash").draggable({
98                        // DRAG DE PASTAS
99                        start : function(){
100                                $(this).css("color", "gray");
101                        },
102                        stop : function(){
103                                $(this).css("color", "");
104                        },
105                        revert: "invalid",
106                        helper: function(event){
107                                if($.trim(($(this).text().split("["))[0]).length > 18)
108                                        return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]).substring(0,18) + "...", type: "folder"}));
109                                return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]), type: "folder"}));
110                        },
111                        refreshPositions: true,
112                        scroll: true,
113                        scrollSensitivity: 100,
114                        scrollSpeed: 100,
115                        containment: "#divAppbox"
116                }).end().droppable({
117                        //DROP DE PASTAS
118                        over : function(a, b){
119                                //INICIO : SE A PASTA CONTER FILHAS EXPANDE
120                                over = $(this);
121                                $(this).addClass("folder-over");
122                                if(($(this)[0] != $(this).parent().find(".head_folder")[0]))
123                                        if($(this).prev()[0])
124                                                if($(this).parent().find(".expandable-hitarea")[0] == $(this).prev()[0]){
125                                                        setTimeout(function(){
126                                                                if(over.hasClass("folder-over"))
127                                                                        over.prev().trigger("click");
128                                                        }, 500);
129                                                       
130                                                }
131                                //FIM : SE A PASTA CONTER FILHAS EXPANDE
132                               
133                                //SETA BORDA EM VOLTA DA PASTA
134                        },
135                        out : function(){
136                                //RETIRA BORDA EM VOLTA DA PASTA
137                                $(this).removeClass("folder-over");
138                        },
139                        drop : function(event, ui){
140                                $(this).css("border", "");
141                                if($(this).parent().attr('id') == undefined){
142                                        var folder_to = 'INBOX';
143                                        var to_folder_title = get_lang("Inbox");
144                                }else{
145                                        var folder_to = $(this).parent().attr('id');
146                                        var to_folder_title = $(this).attr('title');
147                                }               
148                                var folder_to_move = ui.draggable.parent().attr('id');
149                                var border_id = ui.draggable.find("input[type=hidden]").attr("name");
150                                // eventnsagens : SE O DROP VIER DA LISTA DE eventNSAGENS :
151                                if(folder_to_move == "tbody_box"){
152                                        move_msgs2(get_current_folder(), 'selected', 0, folder_to, to_folder_title,true);
153                                        return refresh();
154                                }
155                                //SE FOR DE UMA PESQUISA RAPIDA
156                                else if(ui.draggable.parents('[id^="content_id_"]')[0]){
157                                        move_search_msgs("content_id_"+border_id, folder_to, to_folder_title);
158                                        return refresh();
159                                }
160                                // eventnsagens : SE O DROP VIER DE UMA ABA ABERTA
161                                else if(folder_to_move == "border_tr"){
162                                        var id_msg = border_id.substring("_");
163                                        folder = $("#input_folder_"+border_id+"_r")[0] ? $("#input_folder_"+border_id+"_r").val() : (openTab.imapBox[border_id] ? openTab.imapBox[border_id]:get_current_folder());
164                                        move_msgs2(folder, id_msg, border_id, folder_to, to_folder_title,true);
165                                        return refresh();
166                                }
167                                // SE O DROP VIER DA LISTA DE PASTAS
168                                else{
169                                        var teste = folder_to_move.split(cyrus_delimiter);     
170                                        teste = folder_to+cyrus_delimiter+teste[teste.length-1];
171                                       
172                                        //VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS
173
174                                        if(valid_tabs(ui.draggable.parent().find("li"), folder_to_move)){
175                                                return;
176                                        }
177                                        //FIM : VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS;
178                                       
179                                        // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA PARA O eventSMO LOCAL
180                                        if(teste == folder_to_move){
181                                                return alert(get_lang("Thie folder is already in this place"));
182                                        }
183                                       
184                                        // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA ABERTA NO momentO
185                                        if(folder_to_move == get_current_folder()){
186                                                return alert(get_lang("It's not possible move this folder, because it is being used in the moment!"));
187                                        }
188                                       
189                                        // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA FILHA DA PASTA ABERTA NO momentO
190                                        if(ui.draggable.parent().find(".selected")[0]){
191                                                return alert(get_lang("It's not possible move this folder, because its subfolder is being used in the moment!"));
192                                        }
193                                       
194                                        // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA PAI PARA DENTRO DE UMA FILHA
195                                        if(ui.draggable.parent().find('[id="'+folder_to+'"]')[0]){
196                                                return alert(get_lang("It's not possible to move this folder to its subfolders!"));
197                                        }
198                                        //teste = teste.split(cyrus_delimiter);
199                                       
200                                        if($('[id="'+teste+'"]').length){
201                                                return alert(get_lang("Can not move this folder to this location, because the ui has already a folder with this name"));
202                                        }
203                                       
204                                        $(this).addClass("folders_loading");
205                                       
206                                        $.ajax({
207                                                url : "controller.php?action=$this.imap_functions.move_folder&folder_to_move="+folder_to_move+"&folder_to="+folder_to,
208                                                success : function(){
209                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
210                                                        write_msg(get_lang("The folder was successfully moved"));
211                                                }
212                                        });
213                                }
214                        }
215                }).hover(
216                        function(){
217                                //CASO A LI NÃO TENHA UM eventNU FLUTUANTE AINDA, O eventNU É ADICIONADO!
218                                if(!$(this).children(":last").hasClass("float-menu") && !$(this).children(":last").hasClass("new_folder")){
219                                        var folder_ = $(this);
220                                        var folder_name;
221                                        if(folder_.parent().attr('id')){
222                                                folder_name = folder_.parent().attr('id').split(cyrus_delimiter);
223                                                folder_name = folder_name[folder_name.length -1];
224                                        }else
225                                                folder_name = "Root";
226                                        DataLayer.render("../prototype/modules/mail/templates/float_folder_menu.ejs", {name_folder : folder_name}, function(html){                                             
227                                                //FUNÇÃO DO eventNU FLUTUANTE EDITAR < BEGIN
228                                                var esc = false;
229                                                $(folder_).append(html).find(".float-menu-edit").click(function(){
230                                                        var folder_id = $(this).parents(".closed:first").attr('id');
231                                                        var name = $.trim($(this).parents(".closed:first").find("span:first").text().split("[")[0]);
232                                                        if($(this).parents(".closed:first").find("span:first").hasClass("selected"))
233                                                                return alert(get_lang("It's not possible rename this folder, because it is being used in the moment!"));
234                                                        if($(this).parents(".closed:first").find(".selected").length)
235                                                                return alert(get_lang("It's not possible rename this folder, because its subfolder is being used in the moment!"));
236                                                        $(this).parents(".closed:first").find("span:first").empty().append("<input class='new_folder folder' type='text' maxlength='100'></input>")
237                                                        $(".new_folder").focus().keydown(function(event){
238                                                                event.stopPropagation();
239                                                                if(event.keyCode == 13){
240                                                                        if($(this).val() != ""){
241                                                                                if($(this).val().match(/[\/\\\!\@\#\$\%\&\*\+\(\)]/gi)){
242                                                                                        return alert(get_lang("cannot create folder. try other folder name"));
243                                                                                }
244                                                                                var new_name = folder_id.replace(/[a-zA-Z0-9á-úÁ-Ú]+$/gi, $(this).val());
245                                                                                if($('[id="'+new_name+'"]').length){
246                                                                                        $(".folders_loading").removeClass("folders_loading");
247                                                                                        write_msg(get_lang("Mailbox already exists"));
248                                                                                        return draw_new_tree_folder();
249                                                                                }
250                                                                                $(".new_folder").parent().addClass("folders_loading");
251                                                                                $.ajax({
252                                                                                        url : "controller.php?action=$this.imap_functions.ren_mailbox",
253                                                                                        type : "POST",
254                                                                                        data : "current="+folder_id+"&rename="+new_name,
255                                                                                        success : function(){
256                                                                                                write_msg(get_lang("The folder was successfully rename"));
257                                                                                                cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
258                                                                                        }
259                                                                                });
260                                                                        }
261                                                                }else if( event.keyCode == 27){
262                                                                        esc = true;
263                                                                        if(confirm(get_lang("Do you want to cancel the folder edition?")))
264                                                                                draw_new_tree_folder();
265                                                                        else{
266                                                                                $(".new_folder").focus().val(name);
267                                                                                esc = false;
268                                                                        }
269                                                                }
270                                                        }).focusout(function(){
271                                                                if(!esc){
272                                                                        if(confirm(get_lang("Do you want to cancel the folder edition?")))
273                                                                                draw_new_tree_folder();
274                                                                        else{
275                                                                                $(".new_folder").focus().val(name);
276                                                                        }
277                                                                }
278                                                        }).val(name);
279                                                })
280                                                //FUNÇÃO DO eventNU FLUTUANTE EDITAR < END
281                                                //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < BEGIN
282                                                .end().find(".float-menu-remove").click(function(){
283                                                       
284                                                        var folder_id = $(this).parents(".closed:first").find(".folder").addClass("folders_loading").end().attr('id');
285                                                        var folder_name = $.trim($(this).parents(".closed:first").find(".folder").text().split("[")[0]);
286                                                        if($(this).parents(".closed:first").find("ul").length){
287                                                                $(this).parents(".closed:first").find(".folder").removeClass("folders_loading");
288                                                                return alert(get_lang("Delete/move subfolders first"));
289                                                        }
290                                                        if($(this).parents(".closed:first").find(".selected").length){
291                                                                $(this).parents(".closed:first").find(".folder").removeClass("folders_loading");
292                                                                return alert(get_lang("It's not possible delete this folder, because it is being used in the moment!"));
293                                                        }
294                                                        var confirm_text = get_lang("Do you wish to exclude the folder ");
295                                                        if(!confirm(confirm_text + folder_name)){
296                                                                $(this).parents(".closed:first").find(".folder").removeClass("folders_loading");
297                                                                return;
298                                                        }
299                                                        $.ajax({
300                                                                url : "controller.php?action=$this.imap_functions.delete_mailbox",
301                                                                type: "POST",
302                                                                data : "del_past="+folder_id,
303                                                                success : function(data){
304                                                                        data = connector.unserialize(data);
305                                                                        if(data == "Mailbox does not exist"){
306                                                                                $(".folders_loading").removeClass("folders_loading");
307                                                                                return write_msg(get_lang("Mailbox does not exist"));
308                                                                        }
309                                                                        write_msg(get_lang("The folder %1 was successfully removed", folder_name));
310                                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
311                                                                }
312                                                        });
313                                                       
314                                                })
315                                                //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < END
316                                                //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < BEGIN
317                                                .end().find(".float-menu-new").click(function(){
318                                                        var selected_li = $(this).parents(".closed:first");
319                                                        if(selected_li.find("ul:first").length){
320                                                                var new_folder = $("<li><input class='new_folder folder' type='text' maxlength='100'></input></li>").appendTo(selected_li.find("ul:first"));                                                           
321                                                                if(selected_li.find(".expandable-hitarea").length){
322                                                                        selected_li.find(".expandable-hitarea").trigger('click');
323                                                                }
324                                                                selected_li.find("ul:first").treeview({
325                                                                        add: new_folder
326                                                                });
327                                                        }else if(selected_li.length){
328                                                                var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li);                                                           
329                                                                selected_li.treeview({
330                                                                        add: new_folder
331                                                                });
332                                                        }else{
333                                                                selected_li = $(this).parents(".head_folder").parent();
334                                                                if($(this).parents(".head_folder").parent().find(".expandable-hitarea").length){
335                                                                        $(this).parents(".head_folder").parent().find(".expandable-hitarea").trigger('click');
336                                                                }
337                                                                var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li);                                                           
338                                                                selected_li.treeview({
339                                                                        add: new_folder
340                                                                });
341                                                        }
342                                                        selected_li.find(".new_folder").Watermark("Nova Pasta").focus().keydown(function(event){
343                                                                event.stopPropagation();
344                                                                if(event.keyCode == 13){
345                                                                        if($(this).val().match(/[\\\!\@\#\$\%\&\*\+\(\)]/gi)){
346                                                                                return alert(get_lang("cannot create folder. try other folder name"));
347                                                                        }
348                                                                        $(".new_folder").parent().addClass("folders_loading");
349                                                                        $.ajax({
350                                                                                url : "controller.php?action=$this.imap_functions.create_mailbox",
351                                                                                type : "POST",
352                                                                                data : "newp="+($(this).val() != "" ? $(this).val() : get_lang("New Folder"))+"&base_path="+(selected_li.attr('id')? selected_li.attr('id') : "INBOX"),
353                                                                                success : function(data){
354                                                                                        data = connector.unserialize(data);
355                                                                                        if(data == "Mailbox already exists"){
356                                                                                                write_msg(get_lang("Mailbox already exists"));
357                                                                                        }
358                                                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
359                                                                                }
360                                                                        });
361                                                                }else if( event.keyCode == 27){
362                                                                        esc = true;
363                                                                        if(confirm(get_lang("Do you want to cancel the folder creation?")))
364                                                                                draw_new_tree_folder();
365                                                                        else{
366                                                                                $(this).focus();
367                                                                                esc = false;
368                                                                        }
369                                                                }
370                                                        }).focusout(function(){
371                                                                if(!esc){
372                                                                        if(confirm(get_lang("Do you want to cancel the folder creation?")))
373                                                                                draw_new_tree_folder();
374                                                                }
375                                                        });
376                                                });
377                                                //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < END
378                                        });
379                                }
380                                if(!$(".new_folder").length)
381                                        $(this).find(".float-menu:first").removeClass("hidden");
382                        },
383                        function(){
384                                $(this).find(".float-menu:first").addClass("hidden");
385                        }
386                );
387                $("#new_m").html($('.selected').find(".folder_unseen").html() ? $('.selected').find(".folder_unseen").html() : "0").css("color", "red");
388                if(init_tree < 2){
389                        init_tree++;
390                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
391                }
392        });
393       
394        //TODO : REMOVER VC DAQUI
395        //TO-DO : Finalizar Mouse over da barra de pastas.
396        /*$(".collapse_folders_td").mouseenter(function(){
397                if($(".collapse_folders").attr('title') == "Expandir"){
398                        $("#folderscol").removeClass( "hidden");
399                        resizeWindow();
400                        $("#folderscol").mouseleave(function(){
401                                if($(".collapse_folders").attr('title') == "Expandir"){
402                                        $("#folderscol").addClass( "hidden");
403                                        resizeWindow();
404                                }
405                        });
406                }
407               
408        });*/
409
410//}refresh();
411}
Note: See TracBrowser for help on using the repository browser.