source: trunk/expressoMail1_2/js/rich_text_editor.js @ 7520

Revision 7520, 11.6 KB checked in by thiago, 11 years ago (diff)

Ticket #3186 - Problema ao fechar mensagem que foi editada ou que tenha uma assinatura.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1function cRichTextEditor(){
2    this.emwindow   = new Array;
3    this.editor = "body_1";
4    this.table = "";
5    this.id = "1";
6    this.saveFlag = 0;
7    this.signatures = false;
8    this.replyController = false;
9    this.newImageId = false;
10    this.plain = new Array;
11    this.editorReady = true;
12        this.hoho = '';
13}
14
15// This code was written by Tyler Akins and has been placed in the
16// public domain.  It would be nice if you left this header intact.
17// Base64 code from Tyler Akins -- http://rumkin.com
18
19var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
20
21var ua = navigator.userAgent.toLowerCase();
22if (ua.indexOf(" chrome/") >= 0 || ua.indexOf(" firefox/") >= 0 || ua.indexOf(' gecko/') >= 0) {
23    var StringMaker = function () {
24        this.str = "";
25        this.length = 0;
26        this.append = function (s) {
27            this.str += s;
28            this.length += s.length;
29        }
30        this.prepend = function (s) {
31            this.str = s + this.str;
32            this.length += s.length;
33        }
34        this.toString = function () {
35            return this.str;
36        }
37    }
38} else {
39    var StringMaker = function () {
40        this.parts = [];
41        this.length = 0;
42        this.append = function (s) {
43            this.parts.push(s);
44            this.length += s.length;
45        }
46        this.prepend = function (s) {
47            this.parts.unshift(s);
48            this.length += s.length;
49        }
50        this.toString = function () {
51            return this.parts.join('');
52        }
53    }
54}
55
56cRichTextEditor.prototype.fromJSON = function( value )
57{
58        if(!value)
59                return '';
60        return (new Function( "return " + this.decode64( value )))();
61}
62
63cRichTextEditor.prototype.decode64 = function(input) {
64        if( typeof input === "undefined" ) return '';
65
66        var output = new StringMaker();
67        var chr1, chr2, chr3;
68        var enc1, enc2, enc3, enc4;
69        var i = 0;
70
71        // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
72        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
73
74        while (i < input.length) {
75                enc1 = keyStr.indexOf(input.charAt(i++));
76                enc2 = keyStr.indexOf(input.charAt(i++));
77                enc3 = keyStr.indexOf(input.charAt(i++));
78                enc4 = keyStr.indexOf(input.charAt(i++));
79
80                chr1 = (enc1 << 2) | (enc2 >> 4);
81                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
82                chr3 = ((enc3 & 3) << 6) | enc4;
83
84                output.append(String.fromCharCode(chr1));
85
86                if (enc3 != 64) {
87                        output.append(String.fromCharCode(chr2));
88                }
89                if (enc4 != 64) {
90                        output.append(String.fromCharCode(chr3));
91                }
92        }
93
94        return output.toString();
95}
96
97
98cRichTextEditor.prototype.loadEditor = function(ID) {
99       
100        var parentDiv = document.getElementById("body_position_" + ID);
101        var pObj = "body_" + ID;
102        var textArea = document.createElement("TEXTAREA");
103        textArea.id = pObj;
104        textArea.style.width = '100%';
105        parentDiv.appendChild(textArea);
106        RichTextEditor.plain[ID] = false;
107       
108        if(preferences.plain_text_editor == 1)
109                {
110                        RichTextEditor.plain[ID] = true; 
111                        RichTextEditor.editorReady = true;
112                }
113        else
114                        RichTextEditor.active(pObj);
115}
116
117cRichTextEditor.prototype.loadEditor2 = function(ID) {     
118                var pObj = "body_" + ID;
119        RichTextEditor.plain[ID] = false;
120       
121        if(preferences.plain_text_editor == 1)
122                {
123                        RichTextEditor.plain[ID] = true; 
124                        RichTextEditor.editorReady = true;
125                }
126        else
127                        RichTextEditor.active(pObj);
128}
129
130
131cRichTextEditor.prototype.getSignaturesOptions = function() {
132       
133        if(RichTextEditor.signatures !== false)
134            return RichTextEditor.signatures;
135               
136        var signatures = this.fromJSON( preferences.signatures );
137        var signature_types = this.fromJSON( preferences.signature_types );
138
139        for( key in signatures )
140            if( !signature_types[key] )
141                signatures[key] = signatures[key].replace( /\n/g, "<br>" );
142                 
143        RichTextEditor.signatures = signatures;
144        return signatures;
145
146}
147
148cRichTextEditor.prototype.getSignatureDefault = function() {
149         
150        if(RichTextEditor.signatures === false)
151            RichTextEditor.signatures = RichTextEditor.getSignaturesOptions();
152         
153        if(!RichTextEditor.signatures || 
154           !RichTextEditor.signatures[preferences.signature_default || ""])
155        {
156          preferences.use_signature = "0"; //Desabilita o uso da assinatura
157          return '';
158        }
159       
160        return unescape(RichTextEditor.signatures[preferences.signature_default]);
161
162}
163
164
165
166cRichTextEditor.prototype.execPosInstance = function(inst) {
167     if(RichTextEditor.editorReady === false)
168     {
169        var editor =  CKEDITOR.instances[inst];
170        var id = inst.replace('body_','');
171        var content = $("#content_id_"+id)
172        editor.document.on('keydown', function(event)
173        {
174                away = false;
175                var save_link = content.find(".save");
176                save_link.unbind("click").click(function(){
177                        openTab.toPreserve[id] = true;save_msg(id);
178            $(".save").addClass("clicked");
179                });
180                save_link.button({ disabled: false });
181        });
182       
183       
184        // IM Module Enabled
185        if( window.parent.loadscript && loadscript.autoStatusIM )
186        {
187                CKEDITOR.instances[inst].document.on('keydown', function(event){
188                        loadscript.autoStatusIM;
189                });             
190        }
191
192        if (preferences.auto_save_draft == 1)
193        {
194            autoSaveControl.status[id] = true;
195            autoSaveControl.timer[id] = window.setInterval( "autoSave("+id+")" ,autosave_time); 
196
197            CKEDITOR.instances[inst].document.on('keydown', function(event){   
198                autoSaveControl.status[id] = false;
199            })
200        }
201       
202        $(".cke_editor").css("white-space", "normal");
203
204    if(typeof(preferences.font_size_editor) !== 'undefined')
205        $(editor.document.$.body).css("font-size",preferences.font_size_editor);
206    if(typeof(preferences.font_family_editor) !== 'undefined')
207        $(editor.document.$.body).css("font-family",preferences.font_family_editor);
208
209    RichTextEditor.editorReady = true;
210    }   
211}
212
213cRichTextEditor.prototype.setPlain = function (active,id){
214      RichTextEditor.plain[id] = active;
215          var content = $("#content_id_"+id);
216          var div = $("<div>").attr("display", "none");
217      if(active === true)
218      {
219            CKEDITOR.instances['body_'+id].destroy();
220            var height = document.body.scrollHeight;
221            height -= 330;
222            $('#body_'+id).height(height);
223            div.html($('#body_'+id).val());
224            /*Remove as tags html, tabulações e quebras de linha quando for utilizado o editor de texto simples*/
225            div.html($.trim(div.text().replace(/[\t]+/g, '').replace(/[\n]+/g, '\n')));
226            /*Insere o texto sem formatação no textarea*/
227            $('#body_'+id).val(div.text());
228           
229            $('#body_'+id).keydown(function(event) {
230                away = false;
231                save_link = content.find(".save")[0];
232                save_link.onclick = function onclick() {openTab.toPreserve[id] = true;save_msg(id);} ;
233                                $("#save_message_options_"+id).button({ disabled: false });
234                //save_link.className = 'message_options';
235            });
236                        $("[name=textplain_rt_checkbox_"+id+"]").button({ disabled: false });
237      }   
238      else{
239          RichTextEditor.active('body_'+id, id);
240          /*Insere somente quebras de linha para que o texto convertido não fique todo em uma linha só*/
241          div.html($('#body_'+id).val().replace(/[\n]+/g, '<br>'));
242          $('#body_'+id).val(div.html());
243      }
244}
245
246cRichTextEditor.prototype.getData = function (inst){ 
247    var id = inst.replace('body_','');
248   
249    if(RichTextEditor.plain[id] === true)
250        return $('#'+inst).val();
251    else
252        return CKEDITOR.instances[inst].getData();
253}
254cRichTextEditor.prototype.setData = function (id,data){
255   
256        if(this.plain[id.replace('body_','')] === true)
257                $('#'+id).val(data);
258    else
259        CKEDITOR.instances[id].setData(data);
260}
261cRichTextEditor.prototype.setInitData = function (id,data,reply,recursion, callback){
262        var content = $("#content_id_"+id);
263        if(recursion === undefined){
264                recursion = 1;
265        }else{
266                recursion++;   
267        }
268        if(this.plain[id] === true){               
269                data =  data.replace( new RegExp('<pre>((.\n*)*)</pre>'),'$1');
270                if($('#'+id) !== undefined){
271                        $('#'+id).val(data);
272                        if (reply === undefined){       
273                                $('#to_'+id).focus();
274                        }
275                }
276                else{
277                        setTimeout(function() {RichTextEditor.setInitData(id,data,reply,recursion); }, 500);
278                }
279        } 
280        else{
281                if( RichTextEditor.editorReady === true && CKEDITOR.instances['body_'+id] !== undefined ){
282                        var editor =   CKEDITOR.instances['body_'+id];
283                        var selection = editor.getSelection();
284                        var fontSize = '';
285                        var fontFamily = '';
286                        if(typeof(preferences.font_size_editor) !== 'undefined')
287                                fontSize = 'font-size:' + preferences.font_size_editor;
288                        if(fontSize != '')
289                                fontFamily = ';'
290                        if(typeof(preferences.font_family_editor) !== 'undefined')
291                                fontFamily += 'font-family:' + preferences.font_family_editor + ';';
292                        var divBr = '<div style="'+fontSize+fontFamily+'"><br type="_moz"></div>';
293                       
294                        if(selection !== undefined && selection !== null){
295                                var selectionRanges = selection.getRanges();
296                        }
297                        if(reply !== undefined){
298                                if(reply == 'edit')
299                                        editor.insertHtml(data);
300                                else
301                                        editor.insertHtml(divBr+data);
302                                editor.focus();
303                        }
304
305                        if(selection !== null){
306                                if(selectionRanges[selectionRanges.length-1] !== undefined){
307                                        selectionRanges[selectionRanges.length-1].setStart(selectionRanges[selectionRanges.length-1].getTouchedStartNode().getParents()[1].getChild(0), 0);
308                                        selectionRanges[selectionRanges.length-1].setEnd(selectionRanges[selectionRanges.length-1].getTouchedStartNode().getParents()[1].getChild(0), 0);
309                                }
310                                selection.selectRanges(selectionRanges);
311                        }
312                       
313                        if (is_webkit){
314                                $('#cke_contents_body_'+id+'>iframe').scrollTo(':first');
315                        }
316                        if(callback !== undefined)
317                                callback();
318                }
319                else if(recursion < 20){
320                        setTimeout(function() {RichTextEditor.setInitData(id,data,reply,recursion); }, 500);
321                }
322        }
323}
324
325cRichTextEditor.prototype.destroy = function(id)
326{
327        //Remove Instancia do editor
328        if( CKEDITOR.instances[id] !== undefined )   
329             CKEDITOR.remove(CKEDITOR.instances[id]);
330}
331cRichTextEditor.prototype.active = function(id, just_id)
332{
333   
334   //Remove Instancia do editor caso ela exista
335    if( CKEDITOR.instances[id] !== undefined )   
336         CKEDITOR.remove(CKEDITOR.instances[id]);
337     
338    var height = document.body.scrollHeight;
339     height -= 375;
340     $('#'+id).ckeditor(
341                function() {
342                        RichTextEditor.execPosInstance(id)
343                },
344                {
345                        toolbar:'mail',
346                        height: height
347                }
348        );
349        //$("[name=textplain_rt_checkbox_"+just_id+"]").button({ disabled: false });
350}
351cRichTextEditor.prototype.focus = function(id)
352{
353    if(RichTextEditor.plain[id]  === true)
354        $('#body_'+id).focus();
355    else
356        CKEDITOR.instances['body_'+id].focus();
357
358}
359//Função reseta o atributo contentEditable para resolver bug de cursor ao trocar abas
360cRichTextEditor.prototype.setEditable = function(id) {
361        if( CKEDITOR.instances['body_'+ id] === undefined ) return;   
362        var element = CKEDITOR.instances['body_'+ id].document.getBody();
363        element.removeAttribute('contentEditable');
364        element.setAttribute('contentEditable','true');
365}
366cRichTextEditor.prototype.keydown = function (id,rec){
367    if (rec === undefined) rec = 1;
368    rec++;
369    if( CKEDITOR.instances['body_'+ id] === undefined ) return;   
370    var element = CKEDITOR.instances['body_'+ id]; 
371   
372    if(element.document){
373        element.document.on('keydown',function(){
374            $("#content_id_"+currentTab+" .save").button("enable");
375        });
376    } else {
377        if (rec <= 20)
378                setTimeout(function(){RichTextEditor.keydown(id,rec)},500);
379    }
380}
381//Build the Object
382RichTextEditor = new cRichTextEditor();
Note: See TracBrowser for help on using the repository browser.