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

Revision 5813, 17.7 KB checked in by marcieli, 12 years ago (diff)

Ticket #2569 - A busca é realizada na pasta e subpastas.

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