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

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