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

Revision 5732, 17.9 KB checked in by marcieli, 12 years ago (diff)

Ticket #2494 - Resolvido: exibir no. de msgs nao lidas das filhas na pasta raiz.

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