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

Revision 5911, 10.4 KB checked in by gustavo, 12 years ago (diff)

Ticket #2611 - Refatorar interface de criação de nova mensagem

  • 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 = this.fromJSON( preferences.signatures );
136        var signature_types = 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}
146
147cRichTextEditor.prototype.getSignatureDefault = function() {
148         
149        if(RichTextEditor.signatures === false)
150            RichTextEditor.signatures = RichTextEditor.getSignaturesOptions();
151         
152        if(!RichTextEditor.signatures || 
153           !RichTextEditor.signatures[preferences.signature_default || ""])
154        {
155          preferences.use_signature = "0"; //Desabilita o uso da assinatura
156          return '';
157        }
158       
159        return unescape(RichTextEditor.signatures[preferences.signature_default]);
160
161}
162
163
164
165cRichTextEditor.prototype.execPosInstance = function(inst) {
166     if(RichTextEditor.editorReady === false)
167     {
168        var editor =  CKEDITOR.instances[inst];
169        var id = inst.replace('body_','');
170        var content = $("#content_id_"+id)
171        editor.document.on('keydown', function(event)
172        {
173                away = false;
174                var save_link = content.find(".save");
175                save_link.click(function(){
176                        openTab.toPreserve[id] = true;save_msg(id);
177                });
178                save_link.button({ disabled: false });
179        });
180       
181       
182        // IM Module Enabled
183        if( window.parent.loadscript && loadscript.autoStatusIM )
184        {
185                CKEDITOR.instances[inst].document.on('keydown', function(event){
186                        loadscript.autoStatusIM;
187                });             
188        }
189
190        if (preferences.auto_save_draft == 1)
191        {
192            autoSaveControl.status[id] = true;
193            autoSaveControl.timer[id] = window.setInterval( "autoSave("+id+")" ,autosave_time); 
194
195            CKEDITOR.instances[inst].document.on('keydown', function(event){   
196                autoSaveControl.status[id] = false;
197            })
198        }
199       
200        $(".cke_editor").css("white-space", "normal");
201        RichTextEditor.editorReady = true;
202     } 
203}
204
205cRichTextEditor.prototype.setPlain = function (active,id){
206      RichTextEditor.plain[id] = active;
207          var content = $("#content_id_"+id);
208      if(active === true)
209      {
210            CKEDITOR.instances['body_'+id].destroy();
211            var height = document.body.scrollHeight;
212            height -= 330;
213            $('#body_'+id).height(height);
214            $('#body_'+id).keydown(function(event) {
215                away = false;
216                save_link = content.find(".save")[0];
217                save_link.onclick = function onclick() {openTab.toPreserve[id] = true;save_msg(id);} ;
218                                $("#save_message_options_"+id).button({ disabled: false });
219                //save_link.className = 'message_options';
220            });
221                        $("[name=textplain_rt_checkbox_"+id+"]").button({ disabled: false });
222      }   
223      else
224          RichTextEditor.active('body_'+id, id);
225}
226
227cRichTextEditor.prototype.getData = function (inst){ 
228    var id = inst.replace('body_','');
229   
230    if(RichTextEditor.plain[id] === true)
231        return $('#'+inst).val();
232    else
233        return CKEDITOR.instances[inst].getData();
234}
235cRichTextEditor.prototype.setData = function (id,data){
236   
237     if(this.plain[id] === true)
238        $('#'+id).val(data);
239     else
240        CKEDITOR.instances[id].setData(data)
241}
242cRichTextEditor.prototype.setInitData = function (id,data,reply,recursion){
243   
244    if(recursion === undefined) recursion = 1;
245    else recursion++;   
246   
247     if(this.plain[id] === true)
248     {               
249                data =  data.replace( new RegExp('<pre>((.\n*)*)</pre>'),'$1');
250               
251                if($('#'+id) !== undefined){
252                        $('#'+id).val(data);
253                 if (reply === undefined)       
254                        $('#to_'+id).focus();
255         }
256         else
257                          setTimeout(function() {RichTextEditor.setInitData(id,data,reply,recursion); }, 500);
258         } 
259     else
260     {
261       if( RichTextEditor.editorReady === true && CKEDITOR.instances['body_'+id] !== undefined )   
262       {
263           var editor =   CKEDITOR.instances['body_'+id];   
264           editor.insertHtml('');
265           var selection = editor.getSelection();
266           if(selection !== undefined && selection !== null) var selectionRanges = selection.getRanges();
267
268           var fontSize = '';
269           var fontFamily = '';
270           
271           if(typeof(preferences.font_size_editor) !== 'undefined')
272               fontSize = 'font-size:' + preferences.font_size_editor;
273               
274           if(fontSize != '')
275               fontFamily = ';'
276           
277           if(typeof(preferences.font_family_editor) !== 'undefined')
278               fontFamily += 'font-family:' + preferences.font_family_editor + ';';
279           
280           var divBr = '<div style="'+fontSize+fontFamily+'"><br type="_moz"></div>';
281         
282                    if(reply === undefined){
283                                editor.on('insertHtml',function setFocus(e){
284                                                        setTimeout("$('#to_"+id+"').focus()",100);
285                                                        editor.removeListener('insertHtml', setFocus);
286                                                }
287                                );
288                                editor.insertHtml(divBr+divBr+data);
289                        }
290                        else if(reply == 'edit')
291                                editor.insertHtml(data);
292                        else
293                                editor.insertHtml(divBr+data);
294           
295           if(selection !== null) selection.selectRanges(selectionRanges);
296                   
297                   //Coloca o scroll do editor no inicio
298                   if (is_webkit){
299                                $('#cke_contents_body_'+id+'>iframe').scrollTo(':first');
300                   }
301          //Caso não for uma resposta votla o foco para o input to
302          //if(reply === undefined)   
303            //      setTimeout("$('#to_"+id+"').focus()",100);
304 
305       }
306       else if(recursion < 20)
307           setTimeout(function() {RichTextEditor.setInitData(id,data,reply,recursion); }, 500);
308     }
309}
310
311cRichTextEditor.prototype.destroy = function(id)
312{
313        //Remove Instancia do editor
314        if( CKEDITOR.instances[id] !== undefined )   
315             CKEDITOR.remove(CKEDITOR.instances[id]);
316}
317cRichTextEditor.prototype.active = function(id, just_id)
318{
319   
320   //Remove Instancia do editor caso ela exista
321    if( CKEDITOR.instances[id] !== undefined )   
322         CKEDITOR.remove(CKEDITOR.instances[id]);
323     
324    var height = document.body.scrollHeight;
325     height -= 375;
326     $('#'+id).ckeditor(
327                function() {
328                        RichTextEditor.execPosInstance(id)
329                },
330                {
331                        toolbar:'mail',
332                        height: height
333                }
334        );
335        //$("[name=textplain_rt_checkbox_"+just_id+"]").button({ disabled: false });
336}
337cRichTextEditor.prototype.focus = function(id)
338{
339    if(RichTextEditor.plain[id]  === true)
340        $('#body_'+id).focus();
341    else
342        CKEDITOR.instances['body_'+id].focus();
343
344}
345//Função reseta o atributo contentEditable para resolver bug de cursor ao trocar abas
346cRichTextEditor.prototype.setEditable = function(id) {
347        if( CKEDITOR.instances['body_'+ id] === undefined ) return;   
348        var element = CKEDITOR.instances['body_'+ id].document.getBody();
349        element.removeAttribute('contentEditable');
350        element.setAttribute('contentEditable','true');
351}
352//Build the Object
353RichTextEditor = new cRichTextEditor();
Note: See TracBrowser for help on using the repository browser.