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

Revision 6216, 17.3 KB checked in by natan, 12 years ago (diff)

Ticket #2752 - Criando pastas acentuadas no Expresso Mail - Corrigido

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