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

Revision 5703, 16.6 KB checked in by gustavo, 12 years ago (diff)

Ticket #2529 - Correção de bugs na nova 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                                write_msg(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                        write_msg(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        var html = DataLayer.render('../prototype/modules/mail/templates/detailedfoldertree.ejs', {folders: [tree1, tree2, tree3]});
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               
83                if($(".folders_loading").length)
84                        return;
85               
86                if($(event.target).parent().is(".float-menu"))
87                        return;
88                       
89                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') )
90                        return;
91               
92                if( target.parent().find(".new_folder").length)
93                        return;
94                       
95                if( !target.attr('id') )
96                        target = target.parent();
97                if (target[0] == $(".mainfoldertree")[0]) return;
98                var uiId = target.attr('id');
99                var child = target.find('.folder');
100                 
101                if(!target.is('.mainfoldertree > .expandable-hitarea, .mainfoldertree > .collapsable-hitarea')){
102                        $('.filetree span.folder.selected').removeClass('selected');
103                        $(target).children('.folder').addClass('selected');
104                }
105                $(this).addClass("folders_loading");
106                selected = target.attr('id');
107                change_folder(target.attr('id'), child.attr('title')); 
108        }).filter('.followup-messages').click(function(event, ui){
109                search_emails("UNDELETED KEYWORD \"$Followupflagged\"");
110        }).end().end();
111       
112        folders_html.find('[id="'+selected+'"]').children().addClass("selected").end().end().find("li:first").find(".folder").not(".head_folder,.inbox,.drafts,.sent,.spam,.trash").draggable({
113                // DRAG DE PASTAS
114                start : function(){
115                        $(this).css("color", "gray");
116                },
117                stop : function(){
118                        $(this).css("color", "");
119                },
120                revert: "invalid",
121                helper: function(event){
122                        if($.trim(($(this).text().split("["))[0]).length > 18)
123                                return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]).substring(0,18) + "...", type: "folder"}));
124                        return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]), type: "folder"}));
125                },
126                refreshPositions: true,
127                scroll: true,
128                scrollSensitivity: 100,
129                scrollSpeed: 100,
130                containment: "#divAppbox"
131        }).end().droppable({
132                //DROP DE PASTAS
133                over : function(a, b){
134                        //INICIO : SE A PASTA CONTER FILHAS EXPANDE
135                        over = $(this);
136                        $(this).addClass("folder-over");
137                        if(($(this)[0] != $(this).parent().find(".head_folder")[0]))
138                                if($(this).prev()[0])
139                                        if($(this).parent().find(".expandable-hitarea")[0] == $(this).prev()[0]){
140                                                setTimeout(function(){
141                                                        if(over.hasClass("folder-over"))
142                                                                over.prev().trigger("click");
143                                                }, 500);
144                                               
145                                        }
146                        //FIM : SE A PASTA CONTER FILHAS EXPANDE
147                       
148                        //SETA BORDA EM VOLTA DA PASTA
149                },
150                out : function(){
151                        //RETIRA BORDA EM VOLTA DA PASTA
152                        $(this).removeClass("folder-over");
153                },
154                drop : function(event, ui){
155                        $(this).removeClass("folder-over");
156                        if($(this).parent().attr('id') == undefined){
157                                var folder_to = 'INBOX';
158                                var to_folder_title = get_lang("Inbox");
159                        }else{
160                                var folder_to = $(this).parent().attr('id');
161                                var to_folder_title = $(this).attr('title');
162                        }               
163                        var folder_to_move = ui.draggable.parent().attr('id');
164                        var border_id = ui.draggable.find("input[type=hidden]").attr("name");
165                        // eventnsagens : SE O DROP VIER DA LISTA DE eventNSAGENS :
166                        if(folder_to_move == "tbody_box"){
167                                move_msgs2(get_current_folder(), 'selected', 0, folder_to, to_folder_title,true);
168                                return refresh();
169                        }
170                        //SE FOR DE UMA PESQUISA RAPIDA
171                        else if(ui.draggable.parents('[id^="content_id_"]')[0]){
172                                move_search_msgs("content_id_"+border_id, folder_to, to_folder_title);
173                                return refresh();
174                        }
175                        // eventnsagens : SE O DROP VIER DE UMA ABA ABERTA
176                        else if(folder_to_move == "border_tr"){
177                                var id_msg = border_id.substring("_");
178                                folder = $("#input_folder_"+border_id+"_r")[0] ? $("#input_folder_"+border_id+"_r").val() : (openTab.imapBox[border_id] ? openTab.imapBox[border_id]:get_current_folder());
179                                move_msgs2(folder, id_msg, border_id, folder_to, to_folder_title,true);
180                                return refresh();
181                        }
182                        // SE O DROP VIER DA LISTA DE PASTAS
183                        else{
184                                var folder_to_exist = folder_to_move.split(cyrus_delimiter);   
185                                folder_to_exist = folder_to+cyrus_delimiter+folder_to_exist[folder_to_exist.length-1];
186                               
187                                //VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS
188
189                                if(valid_tabs(ui.draggable.parent().find("li"), folder_to_move)){
190                                        return;
191                                }
192                                //FIM : VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS;
193                               
194                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA PARA O eventSMO LOCAL
195                                if(folder_to_exist == folder_to_move){
196                                        return write_msg(get_lang("Thie folder is already in this place"));
197                                }
198                               
199                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA ABERTA NO momentO
200                                if(folder_to_move == get_current_folder()){
201                                        return write_msg(get_lang("It's not possible move this folder, because it is being used in the moment!"));
202                                }
203                               
204                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA FILHA DA PASTA ABERTA NO momentO
205                                if(ui.draggable.parent().find(".selected")[0]){
206                                        return write_msg(get_lang("It's not possible move this folder, because its subfolder is being used in the moment!"));
207                                }
208                               
209                                // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA PAI PARA DENTRO DE UMA FILHA
210                                if(ui.draggable.parent().find('[id="'+folder_to+'"]')[0]){
211                                        return write_msg(get_lang("It's not possible to move this folder to its subfolders!"));
212                                }                                       
213                               
214                                if($('[id="'+folder_to_exist+'"]').length){
215                                        return write_msg(get_lang("Can not move this folder to this location, because the target has already a folder with this name"));
216                                }
217                               
218                                $(this).addClass("folders_loading");
219                               
220                                $.ajax({
221                                        url : "controller.php?action=$this.imap_functions.move_folder&folder_to_move="+folder_to_move+"&folder_to="+folder_to,
222                                        success : function(data){
223                                                data = connector.unserialize(data);
224                                                if(data){
225                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
226                                                        write_msg(get_lang("The folder was successfully moved"));
227                                                }
228                                                else{
229                                                        write_msg(get_lang("ERROR moving your folder."));
230                                                }
231                                        }
232                                });
233                        }
234                }
235        }).hover(
236                function(){
237                        //CASO A LI NÃO TENHA UM eventNU FLUTUANTE AINDA, O eventNU É ADICIONADO!
238                        if(!$(this).children(":last").hasClass("float-menu") && !$(this).children(":last").hasClass("new_folder")){
239                                var folder_ = $(this);
240                                var folder_name;
241                                if(folder_.parent().attr('id')){
242                                        folder_name = folder_.parent().attr('id').split(cyrus_delimiter);
243                                        folder_name = folder_name[folder_name.length -1];
244                                }else
245                                        folder_name = "Root";
246                                DataLayer.render("../prototype/modules/mail/templates/float_folder_menu.ejs", {name_folder : folder_name}, function(html){                                             
247                                        //FUNÇÃO DO eventNU FLUTUANTE EDITAR < BEGIN
248                                        var esc = false;
249                                        $(folder_).append(html).find(".float-menu-edit").click(function(){
250                                                var folder_id = $(this).parents(".closed:first").attr('id');
251                                                var name = $.trim($(this).parents(".closed:first").find("span:first").text().split("[")[0]);
252                                                if($(this).parents(".closed:first").find("span:first").hasClass("selected"))
253                                                        return write_msg(get_lang("It's not possible rename this folder, because it is being used in the moment!"));
254                                                if($(this).parents(".closed:first").find(".selected").length)
255                                                        return write_msg(get_lang("It's not possible rename this folder, because its subfolder is being used in the moment!"));
256                                                if(valid_tabs($(this).parents("li:first").find("li"), folder_id))
257                                                        return;
258                                                $(this).parents(".closed:first").find("span:first").empty().append("<input class='new_folder folder' type='text' maxlength='100'></input>");
259                                                $(".new_folder").focus().keydown(function(event){
260                                                        event.stopPropagation();
261                                                        if(event.keyCode == 13){
262                                                                if($(this).val() != ""){
263                                                                        if($(this).val().match(/[\/\\\!\@\#\$\%\&\*\+\(\)]/gi)){
264                                                                                return write_msg(get_lang("cannot create folder. try other folder name"));
265                                                                        }
266                                                                        var new_name = folder_id.replace(/[a-zA-Z0-9á-úÁ-Ú]+$/gi, $(this).val());
267                                                                        if($('[id="'+new_name+'"]').length){
268                                                                                $(".folders_loading").removeClass("folders_loading");
269                                                                                write_msg(get_lang("Mailbox already exists"));
270                                                                                return draw_new_tree_folder();
271                                                                        }
272                                                                        $(".new_folder").parent().addClass("folders_loading");
273                                                                        $.ajax({
274                                                                                url : "controller.php?action=$this.imap_functions.ren_mailbox",
275                                                                                type : "POST",
276                                                                                data : "current="+folder_id+"&rename="+new_name,
277                                                                                success : function(){
278                                                                                        write_msg(get_lang("The folder was successfully rename"));
279                                                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
280                                                                                }
281                                                                        });
282                                                                }
283                                                        }else if( event.keyCode == 27){
284                                                                draw_new_tree_folder();
285                                                        }
286                                                }).focusout(function(){
287                                                        draw_new_tree_folder();
288                                                }).val(name);
289                                        })
290                                        //FUNÇÃO DO eventNU FLUTUANTE EDITAR < END
291                                        //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < BEGIN
292                                        .end().find(".float-menu-remove").click(function(){
293                                               
294                                                var folder_id = $(this).parents(".closed:first").attr('id');
295                                                var folder_name = "<strong>"+$.trim($(this).parents(".closed:first").find(".folder").text().split("[")[0])+"</strong>";
296                                               
297                                                if(valid_tabs($(this).parents("li:first").find("li"), folder_id))
298                                                        return;
299                                                $(this).parents(".closed:first").find(".folder").addClass("folders_loading");
300                                               
301                                                if($(this).parents(".closed:first").find("ul").length){
302                                                        $(this).parents(".closed:first").find(".folder").removeClass("folders_loading");
303                                                        return write_msg(get_lang("Delete/move subfolders first"));
304                                                }
305                                                if($(this).parents(".closed:first").find(".selected").length){
306                                                        $(this).parents(".closed:first").find(".folder").removeClass("folders_loading");
307                                                        return write_msg(get_lang("It's not possible delete this folder, because it is being used in the moment!"));
308                                                }
309                                                var folder_span = $(this);
310                                                var confirm_text = get_lang("Do you wish to exclude the folder ");
311                                                $.Zebra_Dialog(confirm_text+folder_name, {
312                                                        'type':     'question',
313                                                        'title':    'Confirmação de Exclusão',
314                                                        'buttons':  [get_lang('Yes'), get_lang('No')],
315                                                        'onClose':  function(caption) {
316                                                                if(caption == get_lang('Yes')){
317                                                                        $.ajax({
318                                                                                url : "controller.php?action=$this.imap_functions.delete_mailbox",
319                                                                                type: "POST",
320                                                                                data : "del_past="+folder_id,
321                                                                                success : function(data){
322                                                                                        data = connector.unserialize(data);
323                                                                                        if(data == "Mailbox does not exist"){
324                                                                                                $(".folders_loading").removeClass("folders_loading");
325                                                                                                return write_msg(get_lang("Mailbox does not exist"));
326                                                                                        }
327                                                                                        write_msg(get_lang("The folder %1 was successfully removed", folder_name));
328                                                                                        cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
329                                                                                }
330                                                                        });
331                                                                }else{
332                                                                        folder_span.parents(".closed:first").find(".folder").removeClass("folders_loading");
333                                                                        return;
334                                                                }
335                                                        }
336                                                });
337                                                /* if(!confirm(confirm_text + folder_name)){
338                                                        $(this).parents(".closed:first").find(".folder").removeClass("folders_loading");
339                                                        return;
340                                                } */
341                                        })
342                                        //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < END
343                                        //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < BEGIN
344                                        .end().find(".float-menu-new").click(function(){
345                                                $(this).parents(".float-menu").addClass("hidden");
346                                                var selected_li = $(this).parents(".closed:first");
347                                                if(selected_li.find("ul:first").length){
348                                                        var new_folder = $("<li><input class='new_folder folder' type='text' maxlength='100'></input></li>").appendTo(selected_li.find("ul:first"));                                                           
349                                                        if(selected_li.find(".expandable-hitarea").length){
350                                                                selected_li.find(".expandable-hitarea").trigger('click');
351                                                        }
352                                                        selected_li.find("ul:first").treeview({
353                                                                add: new_folder
354                                                        });
355                                                }else if(selected_li.length){
356                                                        var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li);                                                           
357                                                        selected_li.treeview({
358                                                                add: new_folder
359                                                        });
360                                                }else{
361                                                        selected_li = $(this).parents(".head_folder").parent();
362                                                        if($(this).parents(".head_folder").parent().find(".expandable-hitarea").length){
363                                                                $(this).parents(".head_folder").parent().find(".expandable-hitarea").trigger('click');
364                                                        }
365                                                        var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li);                                                           
366                                                        selected_li.treeview({
367                                                                add: new_folder
368                                                        });
369                                                }
370                                               
371                                                selected_li.find(".new_folder").Watermark("Nova Pasta").focus().keydown(function(event){
372                                                        event.stopPropagation();
373                                                        if(event.keyCode == 13){
374                                                                if($(this).val().match(/[\\\!\@\#\$\%\&\*\+\(\)]/gi)){
375                                                                        return write_msg(get_lang("cannot create folder. try other folder name"));
376                                                                }
377                                                                if($('[id="'+ (selected_li.attr('id')? selected_li.attr('id') : "INBOX") + cyrus_delimiter + $(this).val()+'"]').length){
378                                                                        $(".folders_loading").removeClass("folders_loading");
379                                                                        write_msg(get_lang("Mailbox already exists"));
380                                                                        return draw_new_tree_folder();
381                                                                }
382                                                                $(".new_folder").parent().addClass("folders_loading");
383                                                                $.ajax({
384                                                                        url : "controller.php?action=$this.imap_functions.create_mailbox",
385                                                                        type : "POST",
386                                                                        data : "newp="+($(this).val() != "" ? $(this).val() : get_lang("New Folder"))+"&base_path="+(selected_li.attr('id')? selected_li.attr('id') : "INBOX"),
387                                                                        success : function(data){
388                                                                                data = connector.unserialize(data);
389                                                                                if(data == "Mailbox already exists"){
390                                                                                        write_msg(get_lang("Mailbox already exists"));
391                                                                                }
392                                                                                cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu);
393                                                                        }
394                                                                });
395                                                        }else if( event.keyCode == 27){
396                                                                draw_new_tree_folder();
397                                                        }
398                                                }).focusout(function(){
399                                                        draw_new_tree_folder();
400                                                });
401                                        });
402                                        //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < END
403                                });
404                        }
405                        if(!$(".new_folder").length){
406                                if(!is_ie)
407                                        $(this).find(".float-menu:first").removeClass("hidden");
408                                else
409                                        $(this).find(".float-menu:first").show();
410                        }
411                },
412                function(){
413                        if(!is_ie)
414                                $(this).find(".float-menu:first").addClass("hidden");
415                        else
416                                $(this).find(".float-menu:first").hide();
417                }
418        );
419        $("#new_m").html($('.selected').find(".folder_unseen").html() ? $('.selected').find(".folder_unseen").html() : "0").css("color", "red");
420}
Note: See TracBrowser for help on using the repository browser.