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

Revision 8249, 13.5 KB checked in by angelo, 10 years ago (diff)

Ticket #3493 - Atualizar bibioteca CKEditor do Expresso

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