~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/common/edit_area/edit_area.js

  • Committer: William Grant
  • Date: 2008-07-07 01:45:11 UTC
  • mfrom: (unknown (missing))
  • Revision ID: wgrant@ugrad.unimelb.edu.au-20080707014511-xyy43p6y8jiqrsh9
Merge killall-editarea branch. We now use CodePress instead, which is
somewhat less slothful.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/******
2
 
 *
3
 
 *      EditArea 
4
 
 *      Developped by Christophe Dolivet
5
 
 *      Released under LGPL license
6
 
 *
7
 
******/
8
 
 
9
 
        function EditArea(){
10
 
                this.error= false;      // to know if load is interrrupt
11
 
                
12
 
                this.inlinePopup= new Array({popup_id: "area_search_replace", icon_id: "search"},
13
 
                                                                        {popup_id: "edit_area_help", icon_id: "help"});
14
 
                this.plugins= new Object();
15
 
        
16
 
                this.line_number=0;
17
 
                
18
 
                this.nav=parent.editAreaLoader.nav;     // navigator identification
19
 
                
20
 
                this.last_selection=new Object();               
21
 
                this.last_text_to_highlight="";
22
 
                this.last_hightlighted_text= "";
23
 
                this.syntax_list= new Array();
24
 
                this.allready_used_syntax= new Object();
25
 
                
26
 
                this.textareaFocused= false;
27
 
                this.previous= new Array();
28
 
                this.next= new Array();
29
 
                this.last_undo="";
30
 
                this.files= new Object();
31
 
                this.filesIdAssoc= new Object();
32
 
                this.curr_file= '';
33
 
                //this.loaded= false;
34
 
                this.assocBracket=new Object();
35
 
                this.revertAssocBracket= new Object();          
36
 
                // bracket selection init 
37
 
                this.assocBracket["("]=")";
38
 
                this.assocBracket["{"]="}";
39
 
                this.assocBracket["["]="]";             
40
 
                for(var index in this.assocBracket){
41
 
                        this.revertAssocBracket[this.assocBracket[index]]=index;
42
 
                }
43
 
                
44
 
                
45
 
                
46
 
                /*this.textarea="";     
47
 
                
48
 
                this.state="declare";
49
 
                this.code = new Array(); // store highlight syntax for languagues*/
50
 
                // font datas
51
 
                this.lineHeight= 16;
52
 
                /*this.default_font_family= "monospace";
53
 
                this.default_font_size= 10;*/
54
 
                this.tab_nb_char= 8;    //nb of white spaces corresponding to a tabulation
55
 
                if(this.nav['isOpera'])
56
 
                        this.tab_nb_char= 6;
57
 
 
58
 
                this.is_tabbing= false;
59
 
                
60
 
                this.fullscreen= {'isFull': false};
61
 
                
62
 
                this.isResizing=false;  // resize var
63
 
                
64
 
                // init with settings and ID
65
 
                this.id= area_id;
66
 
                this.settings= editAreas[this.id]["settings"];
67
 
                
68
 
                if((""+this.settings['replace_tab_by_spaces']).match(/^[0-9]+$/))
69
 
                {
70
 
                        this.tab_nb_char= this.settings['replace_tab_by_spaces'];
71
 
                        this.tabulation="";
72
 
                        for(var i=0; i<this.tab_nb_char; i++)
73
 
                                this.tabulation+=" ";
74
 
                }else{
75
 
                        this.tabulation="\t";
76
 
                }
77
 
                        
78
 
                // retrieve the init parameter for syntax
79
 
                if(this.settings["syntax_selection_allow"] && this.settings["syntax_selection_allow"].length>0)
80
 
                        this.syntax_list= this.settings["syntax_selection_allow"].replace(/ /g,"").split(",");
81
 
                
82
 
                if(this.settings['syntax'])
83
 
                        this.allready_used_syntax[this.settings['syntax']]=true;
84
 
        };
85
 
        
86
 
        
87
 
        //called by the toggle_on
88
 
        EditArea.prototype.update_size= function(){
89
 
                
90
 
                if(editAreas[editArea.id] && editAreas[editArea.id]["displayed"]==true){
91
 
                        if(editArea.fullscreen['isFull']){      
92
 
                                parent.document.getElementById("frame_"+editArea.id).style.width= parent.document.getElementsByTagName("html")[0].clientWidth + "px";
93
 
                                parent.document.getElementById("frame_"+editArea.id).style.height= parent.document.getElementsByTagName("html")[0].clientHeight + "px";
94
 
                        }
95
 
                
96
 
                        if(editArea.tab_browsing_area.style.display=='block' && !editArea.nav['isIE'])
97
 
                        {
98
 
                                editArea.tab_browsing_area.style.height= "0px";
99
 
                                editArea.tab_browsing_area.style.height= (editArea.result.offsetTop - editArea.tab_browsing_area.offsetTop -1)+"px";
100
 
                        }
101
 
                        
102
 
                        var height= document.body.offsetHeight - editArea.get_all_toolbar_height() - 4;
103
 
                        editArea.result.style.height= height +"px";
104
 
                        
105
 
                        var width=document.body.offsetWidth -2;
106
 
                        editArea.result.style.width= width+"px";
107
 
                        //alert("result h: "+ height+" w: "+width+"\ntoolbar h: "+this.get_all_toolbar_height()+"\nbody_h: "+document.body.offsetHeight);
108
 
                        
109
 
                        // check that the popups don't get out of the screen
110
 
                        for(var i=0; i<editArea.inlinePopup.length; i++){
111
 
                                var popup= document.getElementById(editArea.inlinePopup[i]["popup_id"]);
112
 
                                var max_left= document.body.offsetWidth- popup.offsetWidth;
113
 
                                var max_top= document.body.offsetHeight- popup.offsetHeight;
114
 
                                if(popup.offsetTop>max_top)
115
 
                                        popup.style.top= max_top+"px";
116
 
                                if(popup.offsetLeft>max_left)
117
 
                                        popup.style.left= max_left+"px";
118
 
                        }
119
 
                }               
120
 
        };
121
 
 
122
 
        EditArea.prototype.init= function(){
123
 
                this.textarea= document.getElementById("textarea");
124
 
                this.container= document.getElementById("container");
125
 
                this.result= document.getElementById("result");
126
 
                this.content_highlight= document.getElementById("content_highlight");
127
 
                this.selection_field= document.getElementById("selection_field");
128
 
                this.processing_screen= document.getElementById("processing");
129
 
                this.editor_area= document.getElementById("editor");
130
 
                this.tab_browsing_area= document.getElementById("tab_browsing_area");
131
 
                
132
 
                if(syntax_selec= document.getElementById("syntax_selection"))
133
 
                {
134
 
                        // set up syntax selection lsit in the toolbar
135
 
                        for(var i=0; i<this.syntax_list.length; i++) {
136
 
                                var syntax= this.syntax_list[i];
137
 
                                var option= document.createElement("option");
138
 
                                option.value= syntax;
139
 
                                if(syntax==this.settings['syntax'])
140
 
                                        option.selected= "selected";
141
 
                                option.innerHTML= this.get_translation("syntax_" + syntax, "word");
142
 
                                syntax_selec.appendChild(option);
143
 
                        }
144
 
                }
145
 
                
146
 
                // add plugins buttons in the toolbar
147
 
                spans= parent.getChildren(document.getElementById("toolbar_1"), "span", "", "", "all", -1);
148
 
                
149
 
                for(var i=0; i<spans.length; i++){
150
 
                
151
 
                        id=spans[i].id.replace(/tmp_tool_(.*)/, "$1");
152
 
                        if(id!= spans[i].id){
153
 
                                for(var j in this.plugins){
154
 
                                        if(typeof(this.plugins[j].get_control_html)=="function" ){
155
 
                                                html=this.plugins[j].get_control_html(id);
156
 
                                                if(html!=false){
157
 
                                                        html= this.get_translation(html, "template");
158
 
                                                        var new_span= document.createElement("span");
159
 
                                                        new_span.innerHTML= html;                               
160
 
                                                        var father= spans[i].parentNode;
161
 
                                                        spans[i].parentNode.replaceChild(new_span, spans[i]);   
162
 
                                                        break; // exit the for loop                                     
163
 
                                                }
164
 
                                        }
165
 
                                }
166
 
                        }
167
 
                }
168
 
                
169
 
                
170
 
                
171
 
                // init datas
172
 
                this.textarea.value=editAreas[this.id]["textarea"].value;
173
 
                if(this.settings["debug"])
174
 
                        this.debug=parent.document.getElementById("edit_area_debug_"+this.id);
175
 
                
176
 
                // init size            
177
 
                //this.update_size();
178
 
                
179
 
                if(document.getElementById("redo") != null)
180
 
                        this.switchClassSticky(document.getElementById("redo"), 'editAreaButtonDisabled', true);
181
 
                
182
 
                
183
 
                // insert css rules for highlight mode          
184
 
                if(typeof(parent.editAreaLoader.syntax[this.settings["syntax"]])!="undefined"){
185
 
                        for(var i in parent.editAreaLoader.syntax){
186
 
                                this.add_style(parent.editAreaLoader.syntax[i]["styles"]);
187
 
                        }
188
 
                }
189
 
                // init key events
190
 
                if(this.nav['isOpera'])
191
 
                        document.getElementById("editor").onkeypress= keyDown;
192
 
                else
193
 
                        document.getElementById("editor").onkeydown= keyDown;
194
 
        /*      if(this.nav['isIE'] || this.nav['isFirefox'])
195
 
                        this.textarea.onkeydown= keyDown;
196
 
                else if
197
 
                        this.textarea.onkeypress= keyDown;*/
198
 
                for(var i=0; i<this.inlinePopup.length; i++){
199
 
                        if(this.nav['isIE'] || this.nav['isFirefox'])
200
 
                                document.getElementById(this.inlinePopup[i]["popup_id"]).onkeydown= keyDown;
201
 
                        else
202
 
                                document.getElementById(this.inlinePopup[i]["popup_id"]).onkeypress= keyDown;
203
 
                }
204
 
                
205
 
                if(this.settings["allow_resize"]=="both" || this.settings["allow_resize"]=="x" || this.settings["allow_resize"]=="y")
206
 
                        this.allow_resize(true);
207
 
                
208
 
                parent.editAreaLoader.toggle(this.id, "on");
209
 
                //this.textarea.focus();
210
 
                // line selection init
211
 
                this.change_smooth_selection_mode(editArea.smooth_selection);
212
 
                // highlight
213
 
                this.execCommand("change_highlight", this.settings["start_highlight"]);
214
 
                
215
 
                // get font size datas          
216
 
                this.set_font(editArea.settings["font_family"], editArea.settings["font_size"]);
217
 
                
218
 
                // set unselectable text
219
 
                children= parent.getChildren(document.body, "", "selec", "none", "all", -1);
220
 
                for(var i=0; i<children.length; i++){
221
 
                        if(this.nav['isIE'])
222
 
                                children[i].unselectable = true; // IE
223
 
                        else
224
 
                                children[i].onmousedown= function(){return false};
225
 
                /*      children[i].style.MozUserSelect = "none"; // Moz
226
 
                        children[i].style.KhtmlUserSelect = "none";  // Konqueror/Safari*/
227
 
                }
228
 
                
229
 
                if(this.nav['isGecko']){
230
 
                        this.textarea.spellcheck= this.settings["gecko_spellcheck"];
231
 
                }
232
 
                
233
 
                if(this.nav['isOpera']){
234
 
                        this.editor_area.style.position= "absolute";
235
 
                        this.selection_field.style.marginTop= "-1pt";                   
236
 
                        this.selection_field.style.paddingTop= "1pt";
237
 
                        document.getElementById("cursor_pos").style.marginTop= "-1pt";
238
 
                        document.getElementById("end_bracket").style.marginTop= "-1pt";
239
 
                        this.content_highlight.style.marginTop= "-1pt";
240
 
                        /*document.getElementById("end_bracket").style.marginTop="1px";*/
241
 
                }
242
 
                
243
 
                if(this.nav['isSafari']){
244
 
                        this.editor_area.style.position= "absolute";
245
 
                        this.selection_field.style.marginTop= "-1pt";                   
246
 
                        this.selection_field.style.paddingTop= "1pt";
247
 
                        this.selection_field.style.marginLeft= "3px";                   
248
 
                        this.content_highlight.style.marginTop= "-1pt";
249
 
                        this.content_highlight.style.marginLeft= "3px";
250
 
                        document.getElementById("cursor_pos").style.marginLeft= "3px";  
251
 
                        document.getElementById("end_bracket").style.marginLeft= "3px"; 
252
 
                        
253
 
                }
254
 
                
255
 
                // si le textarea n'est pas grand, un click sous le textarea doit provoquer un focus sur le textarea
256
 
                parent.editAreaLoader.add_event(this.result, "click", function(e){ if((e.target || e.srcElement)==editArea.result) { editArea.area_select(editArea.textarea.value.length, 0);}  });
257
 
                
258
 
                if(this.settings['is_multi_files']!=false)
259
 
                        this.open_file({'id': this.curr_file, 'text': ''});
260
 
        
261
 
                
262
 
                setTimeout("editArea.focus();editArea.manage_size();editArea.execCommand('EA_load');", 10);             
263
 
                //start checkup routine
264
 
                this.check_undo();
265
 
                this.check_line_selection(true);
266
 
                this.scroll_to_view();
267
 
                
268
 
                for(var i in this.plugins){
269
 
                        if(typeof(this.plugins[i].onload)=="function")
270
 
                                this.plugins[i].onload();
271
 
                }
272
 
                if(this.settings['fullscreen']==true)
273
 
                        this.toggle_full_screen(true);
274
 
        
275
 
                parent.editAreaLoader.add_event(window, "resize", editArea.update_size);
276
 
                parent.editAreaLoader.add_event(parent.window, "resize", editArea.update_size);
277
 
                parent.editAreaLoader.add_event(top.window, "resize", editArea.update_size);
278
 
                parent.editAreaLoader.add_event(window, "unload", function(){if(editAreas[editArea.id] && editAreas[editArea.id]["displayed"]) editArea.execCommand("EA_unload");});
279
 
                
280
 
                /*date= new Date();
281
 
                alert(date.getTime()- parent.editAreaLoader.start_time);*/
282
 
        };
283
 
        
284
 
        
285
 
        EditArea.prototype.manage_size= function(onlyOneTime){
286
 
                if(!editAreas[this.id])
287
 
                        return false;
288
 
                if(editAreas[this.id]["displayed"]==true && this.textareaFocused)
289
 
                {
290
 
                        var resized= false;
291
 
                        
292
 
                        //1) Manage display width
293
 
                        //1.1) Calc the new width to use for display
294
 
                        var area_width= this.textarea.scrollWidth;
295
 
                        var area_height= this.textarea.scrollHeight;
296
 
                        if(this.nav['isOpera']){
297
 
                                area_height= this.last_selection['nb_line']*this.lineHeight;
298
 
                                area_width=10000; /* TODO: find a better way to fix the width problem */                                                                
299
 
                        }
300
 
                        
301
 
                        if(this.nav['isIE']>=7)
302
 
                                area_width-=45;
303
 
        
304
 
                        if(this.nav['isGecko'] && this.smooth_selection && this.last_selection["nb_line"])
305
 
                                area_height= this.last_selection["nb_line"]*this.lineHeight;
306
 
                        
307
 
                        //1.2) the width is not the same, we must resize elements
308
 
                        if(this.textarea.previous_scrollWidth!=area_width)
309
 
                        {       
310
 
                                if(!this.nav['isOpera'] && this.textarea.style.width && (this.textarea.style.width.replace("px","") < area_width))
311
 
                                        area_width+=50;
312
 
                        
313
 
                                if(this.nav['isGecko'] || this.nav['isOpera'])
314
 
                                        this.container.style.width= (area_width+45)+"px";
315
 
                                else
316
 
                                        this.container.style.width= area_width+"px";
317
 
                                this.textarea.style.width= area_width+"px";
318
 
                                this.content_highlight.style.width= area_width+"px";    
319
 
                                this.textarea.previous_scrollWidth=area_width;
320
 
                                resized=true;
321
 
                        }       
322
 
                        
323
 
                        
324
 
                        //2) Manage display height
325
 
                        //2.1) Calc the new height to use for display
326
 
                        var area_height = this.textarea.scrollHeight;
327
 
                        if(this.nav['isOpera']){
328
 
                                area_height= this.last_selection['nb_line']*this.lineHeight;
329
 
                        }
330
 
                        
331
 
                        if(this.nav['isGecko'] && this.smooth_selection && this.last_selection["nb_line"])
332
 
                                area_height= this.last_selection["nb_line"]*this.lineHeight;
333
 
                        //2.2) the width is not the same, we must resize elements 
334
 
                        if(this.textarea.previous_scrollHeight!=area_height)    
335
 
                        {       
336
 
                                this.container.style.height= (area_height+2)+"px";
337
 
                                this.textarea.style.height= area_height+"px";
338
 
                                this.content_highlight.style.height= area_height+"px";  
339
 
                                this.textarea.previous_scrollHeight= area_height;
340
 
                                resized=true;
341
 
                        }
342
 
                
343
 
                        //3) if there is new lines, we add new line numbers in the line numeration area
344
 
                        if(this.last_selection["nb_line"] >= this.line_number)
345
 
                        {
346
 
                                var div_line_number="";
347
 
                                for(i=this.line_number+1; i<this.last_selection["nb_line"]+100; i++)
348
 
                                {
349
 
                                        div_line_number+=i+"<br />";
350
 
                                        this.line_number++;
351
 
                                }
352
 
                                var span= document.createElement("span");
353
 
                                if(this.nav['isIE'])
354
 
                                        span.unselectable=true;
355
 
                                span.innerHTML=div_line_number;         
356
 
                                document.getElementById("line_number").appendChild(span);       
357
 
                        }
358
 
                
359
 
                        //4) be sure the text is well displayed
360
 
                        this.textarea.scrollTop="0px";
361
 
                        this.textarea.scrollLeft="0px";
362
 
                        if(resized==true){
363
 
                                this.scroll_to_view();
364
 
                        }
365
 
                }
366
 
                if(!onlyOneTime)
367
 
                        setTimeout("editArea.manage_size();", 100);
368
 
        };
369
 
        
370
 
        EditArea.prototype.add_event = function(obj, name, handler) {
371
 
                if (this.nav['isIE']) {
372
 
                        obj.attachEvent("on" + name, handler);
373
 
                } else{
374
 
                        obj.addEventListener(name, handler, false);
375
 
                }
376
 
        };
377
 
        
378
 
        EditArea.prototype.execCommand= function(cmd, param){
379
 
                
380
 
                for(var i in this.plugins){
381
 
                        if(typeof(this.plugins[i].execCommand)=="function"){
382
 
                                if(!this.plugins[i].execCommand(cmd, param))
383
 
                                        return;
384
 
                        }
385
 
                }
386
 
                switch(cmd){
387
 
                        case "save":
388
 
                                if(this.settings["save_callback"].length>0)
389
 
                                        eval("parent."+this.settings["save_callback"]+"('"+ this.id +"', editArea.textarea.value);");
390
 
                                break;
391
 
                        case "load":
392
 
                                if(this.settings["load_callback"].length>0)
393
 
                                        eval("parent."+this.settings["load_callback"]+"('"+ this.id +"');");
394
 
                                break;
395
 
                        case "onchange":
396
 
                                if(this.settings["change_callback"].length>0)
397
 
                                        eval("parent."+this.settings["change_callback"]+"('"+ this.id +"');");
398
 
                                break;          
399
 
                        case "EA_load":
400
 
                                if(this.settings["EA_load_callback"].length>0)
401
 
                                        eval("parent."+this.settings["EA_load_callback"]+"('"+ this.id +"');");
402
 
                                break;
403
 
                        case "EA_unload":
404
 
                                if(this.settings["EA_unload_callback"].length>0)
405
 
                                        eval("parent."+this.settings["EA_unload_callback"]+"('"+ this.id +"');");
406
 
                                break;
407
 
                        case "toggle_on":
408
 
                                if(this.settings["EA_toggle_on_callback"].length>0)
409
 
                                        eval("parent."+this.settings["EA_toggle_on_callback"]+"('"+ this.id +"');");
410
 
                                break;
411
 
                        case "toggle_off":
412
 
                                if(this.settings["EA_toggle_off_callback"].length>0)
413
 
                                        eval("parent."+this.settings["EA_toggle_off_callback"]+"('"+ this.id +"');");
414
 
                                break;
415
 
                        case "re_sync":
416
 
                                if(!this.do_highlight)
417
 
                                        break;
418
 
                        case "file_switch_on":
419
 
                                if(this.settings["EA_file_switch_on_callback"].length>0)
420
 
                                        eval("parent."+this.settings["EA_file_switch_on_callback"]+"(param);");
421
 
                                break;
422
 
                        case "file_switch_off":
423
 
                                if(this.settings["EA_file_switch_off_callback"].length>0)
424
 
                                        eval("parent."+this.settings["EA_file_switch_off_callback"]+"(param);");
425
 
                                break;
426
 
                        case "file_close":
427
 
                                if(this.settings["EA_file_close_callback"].length>0)
428
 
                                        return eval("parent."+this.settings["EA_file_close_callback"]+"(param);");
429
 
                                break;
430
 
                        
431
 
                        default:
432
 
                                if(typeof(eval("editArea."+cmd))=="function")
433
 
                                {
434
 
                                        if(this.settings["debug"])
435
 
                                                eval("editArea."+ cmd +"(param);");
436
 
                                        else
437
 
                                                try{eval("editArea."+ cmd +"(param);");}catch(e){};
438
 
                                }
439
 
                }
440
 
        };
441
 
        
442
 
        EditArea.prototype.get_translation= function(word, mode){
443
 
                if(mode=="template")
444
 
                        return parent.editAreaLoader.translate(word, this.settings["language"], mode);
445
 
                else
446
 
                        return parent.editAreaLoader.get_word_translation(word, this.settings["language"]);
447
 
        };
448
 
        
449
 
        EditArea.prototype.add_plugin= function(plug_name, plug_obj){
450
 
                for(var i=0; i<this.settings["plugins"].length; i++){
451
 
                        if(this.settings["plugins"][i]==plug_name){
452
 
                                this.plugins[plug_name]=plug_obj;
453
 
                                plug_obj.baseURL=parent.editAreaLoader.baseURL + "plugins/" + plug_name + "/";
454
 
                                if( typeof(plug_obj.init)=="function" )
455
 
                                        plug_obj.init();
456
 
                        }
457
 
                }
458
 
        };
459
 
        
460
 
        EditArea.prototype.load_css= function(url){
461
 
                try{
462
 
                        link = document.createElement("link");
463
 
                        link.type = "text/css";
464
 
                        link.rel= "stylesheet";
465
 
                        link.media="all";
466
 
                        link.href = url;
467
 
                        head = document.getElementsByTagName("head");
468
 
                        head[0].appendChild(link);
469
 
                }catch(e){
470
 
                        document.write("<link href='"+ url +"' rel='stylesheet' type='text/css' />");
471
 
                }
472
 
        };
473
 
        
474
 
        EditArea.prototype.load_script= function(url){
475
 
                try{
476
 
                        script = document.createElement("script");
477
 
                        script.type = "text/javascript";
478
 
                        script.src  = url;
479
 
                        head = document.getElementsByTagName("head");
480
 
                        head[0].appendChild(script);
481
 
                }catch(e){
482
 
                        document.write("<script type='text/javascript' src='" + url + "'><"+"/script>");
483
 
                }
484
 
        };
485
 
        
486
 
        // add plugin translation to language translation array
487
 
        EditArea.prototype.add_lang= function(language, values){
488
 
                if(!parent.editAreaLoader.lang[language])
489
 
                        parent.editAreaLoader.lang[language]=new Object();
490
 
                for(var i in values)
491
 
                        parent.editAreaLoader.lang[language][i]= values[i];
492
 
        };
493
 
 
494
 
        var editArea = new EditArea();  
495
 
        editArea.add_event(window, "load", init);
496
 
        
497
 
        function init(){                
498
 
                setTimeout("editArea.init();  ", 10);
499
 
        };