editarea-rails 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. data/LICENSE.txt +22 -0
  2. data/README.md +31 -0
  3. data/lib/editarea-rails.rb +8 -0
  4. data/lib/editarea-rails/version.rb +5 -0
  5. data/vendor/assets/images/autocompletion.gif +0 -0
  6. data/vendor/assets/images/close.gif +0 -0
  7. data/vendor/assets/images/fullscreen.gif +0 -0
  8. data/vendor/assets/images/go_to_line.gif +0 -0
  9. data/vendor/assets/images/help.gif +0 -0
  10. data/vendor/assets/images/highlight.gif +0 -0
  11. data/vendor/assets/images/load.gif +0 -0
  12. data/vendor/assets/images/move.gif +0 -0
  13. data/vendor/assets/images/newdocument.gif +0 -0
  14. data/vendor/assets/images/opacity.png +0 -0
  15. data/vendor/assets/images/plugins/charmap/charmap.gif +0 -0
  16. data/vendor/assets/images/plugins/test/css/test.css +3 -0
  17. data/vendor/assets/images/plugins/test/images/Thumbs.db +0 -0
  18. data/vendor/assets/images/plugins/test/images/test.gif +0 -0
  19. data/vendor/assets/images/plugins/test/langs/bg.js +10 -0
  20. data/vendor/assets/images/plugins/test/langs/cs.js +4 -0
  21. data/vendor/assets/images/plugins/test/langs/de.js +4 -0
  22. data/vendor/assets/images/plugins/test/langs/dk.js +4 -0
  23. data/vendor/assets/images/plugins/test/langs/en.js +4 -0
  24. data/vendor/assets/images/plugins/test/langs/eo.js +4 -0
  25. data/vendor/assets/images/plugins/test/langs/es.js +4 -0
  26. data/vendor/assets/images/plugins/test/langs/fr.js +4 -0
  27. data/vendor/assets/images/plugins/test/langs/hr.js +4 -0
  28. data/vendor/assets/images/plugins/test/langs/it.js +4 -0
  29. data/vendor/assets/images/plugins/test/langs/ja.js +4 -0
  30. data/vendor/assets/images/plugins/test/langs/mk.js +4 -0
  31. data/vendor/assets/images/plugins/test/langs/nl.js +4 -0
  32. data/vendor/assets/images/plugins/test/langs/pl.js +4 -0
  33. data/vendor/assets/images/plugins/test/langs/pt.js +4 -0
  34. data/vendor/assets/images/plugins/test/langs/ru.js +4 -0
  35. data/vendor/assets/images/plugins/test/langs/sk.js +4 -0
  36. data/vendor/assets/images/plugins/test/langs/zh.js +4 -0
  37. data/vendor/assets/images/plugins/test/test.js +110 -0
  38. data/vendor/assets/images/plugins/test/test2.js +1 -0
  39. data/vendor/assets/images/processing.gif +0 -0
  40. data/vendor/assets/images/redo.gif +0 -0
  41. data/vendor/assets/images/reset_highlight.gif +0 -0
  42. data/vendor/assets/images/save.gif +0 -0
  43. data/vendor/assets/images/search.gif +0 -0
  44. data/vendor/assets/images/smooth_selection.gif +0 -0
  45. data/vendor/assets/images/spacer.gif +0 -0
  46. data/vendor/assets/images/statusbar_resize.gif +0 -0
  47. data/vendor/assets/images/undo.gif +0 -0
  48. data/vendor/assets/images/word_wrap.gif +0 -0
  49. data/vendor/assets/javascripts/autocompletion.js +491 -0
  50. data/vendor/assets/javascripts/edit_area.js +527 -0
  51. data/vendor/assets/javascripts/edit_area_full.js +38 -0
  52. data/vendor/assets/javascripts/edit_area_functions.js +1202 -0
  53. data/vendor/assets/javascripts/edit_area_loader.js +1081 -0
  54. data/vendor/assets/javascripts/elements_functions.js +336 -0
  55. data/vendor/assets/javascripts/highlight.js +407 -0
  56. data/vendor/assets/javascripts/keyboard.js +145 -0
  57. data/vendor/assets/javascripts/langs/bg.js +54 -0
  58. data/vendor/assets/javascripts/langs/cs.js +48 -0
  59. data/vendor/assets/javascripts/langs/de.js +48 -0
  60. data/vendor/assets/javascripts/langs/dk.js +48 -0
  61. data/vendor/assets/javascripts/langs/en.js +48 -0
  62. data/vendor/assets/javascripts/langs/eo.js +48 -0
  63. data/vendor/assets/javascripts/langs/es.js +48 -0
  64. data/vendor/assets/javascripts/langs/fi.js +48 -0
  65. data/vendor/assets/javascripts/langs/fr.js +48 -0
  66. data/vendor/assets/javascripts/langs/hr.js +48 -0
  67. data/vendor/assets/javascripts/langs/it.js +48 -0
  68. data/vendor/assets/javascripts/langs/ja.js +48 -0
  69. data/vendor/assets/javascripts/langs/mk.js +48 -0
  70. data/vendor/assets/javascripts/langs/nl.js +48 -0
  71. data/vendor/assets/javascripts/langs/pl.js +48 -0
  72. data/vendor/assets/javascripts/langs/pt.js +48 -0
  73. data/vendor/assets/javascripts/langs/ru.js +48 -0
  74. data/vendor/assets/javascripts/langs/sk.js +48 -0
  75. data/vendor/assets/javascripts/langs/zh.js +48 -0
  76. data/vendor/assets/javascripts/manage_area.js +623 -0
  77. data/vendor/assets/javascripts/plugins/charmap/charmap.js +90 -0
  78. data/vendor/assets/javascripts/plugins/charmap/jscripts/map.js +373 -0
  79. data/vendor/assets/javascripts/plugins/charmap/langs/bg.js +12 -0
  80. data/vendor/assets/javascripts/plugins/charmap/langs/cs.js +6 -0
  81. data/vendor/assets/javascripts/plugins/charmap/langs/de.js +6 -0
  82. data/vendor/assets/javascripts/plugins/charmap/langs/dk.js +6 -0
  83. data/vendor/assets/javascripts/plugins/charmap/langs/en.js +6 -0
  84. data/vendor/assets/javascripts/plugins/charmap/langs/eo.js +6 -0
  85. data/vendor/assets/javascripts/plugins/charmap/langs/es.js +6 -0
  86. data/vendor/assets/javascripts/plugins/charmap/langs/fr.js +6 -0
  87. data/vendor/assets/javascripts/plugins/charmap/langs/hr.js +6 -0
  88. data/vendor/assets/javascripts/plugins/charmap/langs/it.js +6 -0
  89. data/vendor/assets/javascripts/plugins/charmap/langs/ja.js +6 -0
  90. data/vendor/assets/javascripts/plugins/charmap/langs/mk.js +6 -0
  91. data/vendor/assets/javascripts/plugins/charmap/langs/nl.js +6 -0
  92. data/vendor/assets/javascripts/plugins/charmap/langs/pl.js +6 -0
  93. data/vendor/assets/javascripts/plugins/charmap/langs/pt.js +6 -0
  94. data/vendor/assets/javascripts/plugins/charmap/langs/ru.js +6 -0
  95. data/vendor/assets/javascripts/plugins/charmap/langs/sk.js +6 -0
  96. data/vendor/assets/javascripts/plugins/charmap/langs/zh.js +6 -0
  97. data/vendor/assets/javascripts/plugins/charmap/popup.html +24 -0
  98. data/vendor/assets/javascripts/plugins/test/langs/bg.js +10 -0
  99. data/vendor/assets/javascripts/plugins/test/langs/cs.js +4 -0
  100. data/vendor/assets/javascripts/plugins/test/langs/de.js +4 -0
  101. data/vendor/assets/javascripts/plugins/test/langs/dk.js +4 -0
  102. data/vendor/assets/javascripts/plugins/test/langs/en.js +4 -0
  103. data/vendor/assets/javascripts/plugins/test/langs/eo.js +4 -0
  104. data/vendor/assets/javascripts/plugins/test/langs/es.js +4 -0
  105. data/vendor/assets/javascripts/plugins/test/langs/fr.js +4 -0
  106. data/vendor/assets/javascripts/plugins/test/langs/hr.js +4 -0
  107. data/vendor/assets/javascripts/plugins/test/langs/it.js +4 -0
  108. data/vendor/assets/javascripts/plugins/test/langs/ja.js +4 -0
  109. data/vendor/assets/javascripts/plugins/test/langs/mk.js +4 -0
  110. data/vendor/assets/javascripts/plugins/test/langs/nl.js +4 -0
  111. data/vendor/assets/javascripts/plugins/test/langs/pl.js +4 -0
  112. data/vendor/assets/javascripts/plugins/test/langs/pt.js +4 -0
  113. data/vendor/assets/javascripts/plugins/test/langs/ru.js +4 -0
  114. data/vendor/assets/javascripts/plugins/test/langs/sk.js +4 -0
  115. data/vendor/assets/javascripts/plugins/test/langs/zh.js +4 -0
  116. data/vendor/assets/javascripts/plugins/test/test.js +110 -0
  117. data/vendor/assets/javascripts/plugins/test/test2.js +1 -0
  118. data/vendor/assets/javascripts/reg_syntax.js +166 -0
  119. data/vendor/assets/javascripts/reg_syntax/basic.js +70 -0
  120. data/vendor/assets/javascripts/reg_syntax/brainfuck.js +45 -0
  121. data/vendor/assets/javascripts/reg_syntax/c.js +63 -0
  122. data/vendor/assets/javascripts/reg_syntax/coldfusion.js +120 -0
  123. data/vendor/assets/javascripts/reg_syntax/cpp.js +66 -0
  124. data/vendor/assets/javascripts/reg_syntax/css.js +85 -0
  125. data/vendor/assets/javascripts/reg_syntax/html.js +51 -0
  126. data/vendor/assets/javascripts/reg_syntax/java.js +57 -0
  127. data/vendor/assets/javascripts/reg_syntax/js.js +94 -0
  128. data/vendor/assets/javascripts/reg_syntax/pas.js +83 -0
  129. data/vendor/assets/javascripts/reg_syntax/perl.js +88 -0
  130. data/vendor/assets/javascripts/reg_syntax/php.js +157 -0
  131. data/vendor/assets/javascripts/reg_syntax/python.js +145 -0
  132. data/vendor/assets/javascripts/reg_syntax/robotstxt.js +25 -0
  133. data/vendor/assets/javascripts/reg_syntax/ruby.js +68 -0
  134. data/vendor/assets/javascripts/reg_syntax/sql.js +56 -0
  135. data/vendor/assets/javascripts/reg_syntax/tsql.js +88 -0
  136. data/vendor/assets/javascripts/reg_syntax/vb.js +53 -0
  137. data/vendor/assets/javascripts/reg_syntax/xml.js +57 -0
  138. data/vendor/assets/javascripts/regexp.js +139 -0
  139. data/vendor/assets/javascripts/resize_area.js +73 -0
  140. data/vendor/assets/javascripts/search_replace.js +174 -0
  141. data/vendor/assets/stylesheets/edit_area.css +530 -0
  142. data/vendor/assets/stylesheets/plugins/charmap/css/charmap.css +64 -0
  143. data/vendor/assets/stylesheets/plugins/test/css/test.css +3 -0
  144. metadata +210 -0
@@ -0,0 +1,48 @@
1
+ editAreaLoader.lang["ru"]={
2
+ new_document: "новый пустой документ",
3
+ search_button: "поиск и замена",
4
+ search_command: "искать следующий / открыть панель поиска",
5
+ search: "поиск",
6
+ replace: "замена",
7
+ replace_command: "заменить / открыть панель поиска",
8
+ find_next: "найти следующее",
9
+ replace_all: "заменить все",
10
+ reg_exp: "регулярное выражение",
11
+ match_case: "учитывать регистр",
12
+ not_found: "не найдено.",
13
+ occurrence_replaced: "вхождение заменено.",
14
+ search_field_empty: "Поле поиска пустое",
15
+ restart_search_at_begin: "Достигнут конец документа. Начинаю с начала.",
16
+ move_popup: "переместить окно поиска",
17
+ font_size: "--Размер шрифта--",
18
+ go_to_line: "перейти к строке",
19
+ go_to_line_prompt: "перейти к строке номер:",
20
+ undo: "отменить",
21
+ redo: "вернуть",
22
+ change_smooth_selection: "включить/отключить некоторые функции просмотра (более красиво, но больше использует процессор)",
23
+ highlight: "переключить подсветку синтаксиса включена/выключена",
24
+ reset_highlight: "восстановить подсветку (если разсинхронизирована от текста)",
25
+ word_wrap: "toggle word wrapping mode",
26
+ help: "о программе",
27
+ save: "сохранить",
28
+ load: "загрузить",
29
+ line_abbr: "Стр",
30
+ char_abbr: "Стлб",
31
+ position: "Позиция",
32
+ total: "Всего",
33
+ close_popup: "закрыть всплывающее окно",
34
+ shortcuts: "Горячие клавиши",
35
+ add_tab: "добавить табуляцию в текст",
36
+ remove_tab: "убрать табуляцию из текста",
37
+ about_notice: "Внимание: функция подсветки синтаксиса только для небольших текстов",
38
+ toggle: "Переключить редактор",
39
+ accesskey: "Горячая клавиша",
40
+ tab: "Tab",
41
+ shift: "Shift",
42
+ ctrl: "Ctrl",
43
+ esc: "Esc",
44
+ processing: "Обработка...",
45
+ fullscreen: "полный экран",
46
+ syntax_selection: "--Синтакс--",
47
+ close_tab: "Закрыть файл"
48
+ };
@@ -0,0 +1,48 @@
1
+ editAreaLoader.lang["sk"]={
2
+ new_document: "nový prázdy dokument",
3
+ search_button: "vyhľadaj a nahraď",
4
+ search_command: "hľadaj ďalsšie / otvor vyhľadávacie pole",
5
+ search: "hľadaj",
6
+ replace: "nahraď",
7
+ replace_command: "nahraď / otvor vyhľadávacie pole",
8
+ find_next: "nájdi ďalšie",
9
+ replace_all: "nahraď všetko",
10
+ reg_exp: "platné výrazy",
11
+ match_case: "zhodujúce sa výrazy",
12
+ not_found: "nenájdené.",
13
+ occurrence_replaced: "výskyty nahradené.",
14
+ search_field_empty: "Pole vyhľadávanie je prádzne",
15
+ restart_search_at_begin: "End of area reached. Restart at begin.",
16
+ move_popup: "presuň vyhľadávacie okno",
17
+ font_size: "--Veľkosť textu--",
18
+ go_to_line: "prejdi na riadok",
19
+ go_to_line_prompt: "prejdi na riadok:",
20
+ undo: "krok späť",
21
+ redo: "prepracovať",
22
+ change_smooth_selection: "povoliť/zamietnúť niektoré zo zobrazených funkcií (účelnejšie zobrazenie vyžaduje väčšie zaťaženie procesora CPU)",
23
+ highlight: "prepnúť zvýrazňovanie syntaxe zap/vyp",
24
+ reset_highlight: "zrušiť zvýrazňovanie (ak je nesynchronizované s textom)",
25
+ word_wrap: "toggle word wrapping mode",
26
+ help: "o programe",
27
+ save: "uložiť",
28
+ load: "načítať",
29
+ line_abbr: "Ln",
30
+ char_abbr: "Ch",
31
+ position: "Pozícia",
32
+ total: "Spolu",
33
+ close_popup: "zavrieť okno",
34
+ shortcuts: "Skratky",
35
+ add_tab: "pridať tabulovanie textu",
36
+ remove_tab: "odstrániť tabulovanie textu",
37
+ about_notice: "Upozornenie: funkcia zvýrazňovania syntaxe je dostupná iba pre malý text",
38
+ toggle: "Prepnúť editor",
39
+ accesskey: "Accesskey",
40
+ tab: "Záložka",
41
+ shift: "Shift",
42
+ ctrl: "Ctrl",
43
+ esc: "Esc",
44
+ processing: "Spracúvam...",
45
+ fullscreen: "cel=a obrazovka",
46
+ syntax_selection: "--Vyber Syntax--",
47
+ close_tab: "Close file"
48
+ };
@@ -0,0 +1,48 @@
1
+ editAreaLoader.lang["zh"]={
2
+ new_document: "新建空白文档",
3
+ search_button: "查找与替换",
4
+ search_command: "查找下一个 / 打开查找框",
5
+ search: "查找",
6
+ replace: "替换",
7
+ replace_command: "替换 / 打开查找框",
8
+ find_next: "查找下一个",
9
+ replace_all: "全部替换",
10
+ reg_exp: "正则表达式",
11
+ match_case: "匹配大小写",
12
+ not_found: "未找到.",
13
+ occurrence_replaced: "处被替换.",
14
+ search_field_empty: "查找框没有内容",
15
+ restart_search_at_begin: "已到到文档末尾. 从头重新查找.",
16
+ move_popup: "移动查找对话框",
17
+ font_size: "--字体大小--",
18
+ go_to_line: "转到行",
19
+ go_to_line_prompt: "转到行:",
20
+ undo: "恢复",
21
+ redo: "重做",
22
+ change_smooth_selection: "启用/禁止一些显示特性(更好看但更耗费资源)",
23
+ highlight: "启用/禁止语法高亮",
24
+ reset_highlight: "重置语法高亮(当文本显示不同步时)",
25
+ word_wrap: "toggle word wrapping mode",
26
+ help: "关于",
27
+ save: "保存",
28
+ load: "加载",
29
+ line_abbr: "行",
30
+ char_abbr: "字符",
31
+ position: "位置",
32
+ total: "总计",
33
+ close_popup: "关闭对话框",
34
+ shortcuts: "快捷键",
35
+ add_tab: "添加制表符(Tab)",
36
+ remove_tab: "移除制表符(Tab)",
37
+ about_notice: "注意:语法高亮功能仅用于较少内容的文本(文件内容太大会导致浏览器反应慢)",
38
+ toggle: "切换编辑器",
39
+ accesskey: "快捷键",
40
+ tab: "Tab",
41
+ shift: "Shift",
42
+ ctrl: "Ctrl",
43
+ esc: "Esc",
44
+ processing: "正在处理中...",
45
+ fullscreen: "全屏编辑",
46
+ syntax_selection: "--语法--",
47
+ close_tab: "关闭文件"
48
+ };
@@ -0,0 +1,623 @@
1
+ EditArea.prototype.focus = function() {
2
+ this.textarea.focus();
3
+ this.textareaFocused=true;
4
+ };
5
+
6
+
7
+ EditArea.prototype.check_line_selection= function(timer_checkup){
8
+ var changes, infos, new_top, new_width,i;
9
+
10
+ var t1=t2=t2_1=t3=tLines=tend= new Date().getTime();
11
+ // l'editeur n'existe plus => on quitte
12
+ if(!editAreas[this.id])
13
+ return false;
14
+
15
+ if(!this.smooth_selection && !this.do_highlight)
16
+ {
17
+ //do nothing
18
+ }
19
+ else if(this.textareaFocused && editAreas[this.id]["displayed"]==true && this.isResizing==false)
20
+ {
21
+ infos = this.get_selection_infos();
22
+ changes = this.checkTextEvolution( typeof( this.last_selection['full_text'] ) == 'undefined' ? '' : this.last_selection['full_text'], infos['full_text'] );
23
+
24
+ t2= new Date().getTime();
25
+
26
+ // if selection change
27
+ if(this.last_selection["line_start"] != infos["line_start"] || this.last_selection["line_nb"] != infos["line_nb"] || infos["full_text"] != this.last_selection["full_text"] || this.reload_highlight || this.last_selection["selectionStart"] != infos["selectionStart"] || this.last_selection["selectionEnd"] != infos["selectionEnd"] || !timer_checkup )
28
+ {
29
+ // move and adjust text selection elements
30
+ new_top = this.getLinePosTop( infos["line_start"] );
31
+ new_width = Math.max(this.textarea.scrollWidth, this.container.clientWidth -50);
32
+ this.selection_field.style.top=this.selection_field_text.style.top=new_top+"px";
33
+ if(!this.settings['word_wrap']){
34
+ this.selection_field.style.width=this.selection_field_text.style.width=this.test_font_size.style.width=new_width+"px";
35
+ }
36
+
37
+ // usefull? => _$("cursor_pos").style.top=new_top+"px";
38
+
39
+ if(this.do_highlight==true)
40
+ {
41
+ // fill selection elements
42
+ var curr_text = infos["full_text"].split("\n");
43
+ var content = "";
44
+ //alert("length: "+curr_text.length+ " i: "+ Math.max(0,infos["line_start"]-1)+ " end: "+Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1)+ " line: "+infos["line_start"]+" [0]: "+curr_text[0]+" [1]: "+curr_text[1]);
45
+ var start = Math.max(0,infos["line_start"]-1);
46
+ var end = Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1);
47
+
48
+ //curr_text[start]= curr_text[start].substr(0,infos["curr_pos"]-1) +"¤_overline_¤"+ curr_text[start].substr(infos["curr_pos"]-1);
49
+ for(i=start; i< end; i++){
50
+ content+= curr_text[i]+"\n";
51
+ }
52
+
53
+ // add special chars arround selected characters
54
+ selLength = infos['selectionEnd'] - infos['selectionStart'];
55
+ content = content.substr( 0, infos["curr_pos"] - 1 ) + "\r\r" + content.substr( infos["curr_pos"] - 1, selLength ) + "\r\r" + content.substr( infos["curr_pos"] - 1 + selLength );
56
+ content = '<span>'+ content.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace("\r\r", '</span><strong>').replace("\r\r", '</strong><span>') +'</span>';
57
+
58
+ if( this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) {
59
+ this.selection_field.innerHTML= "<pre>" + content.replace(/^\r?\n/, "<br>") + "</pre>";
60
+ } else {
61
+ this.selection_field.innerHTML= content;
62
+ }
63
+ this.selection_field_text.innerHTML = this.selection_field.innerHTML;
64
+ t2_1 = new Date().getTime();
65
+ // check if we need to update the highlighted background
66
+ if(this.reload_highlight || (infos["full_text"] != this.last_text_to_highlight && (this.last_selection["line_start"]!=infos["line_start"] || this.show_line_colors || this.settings['word_wrap'] || this.last_selection["line_nb"]!=infos["line_nb"] || this.last_selection["nb_line"]!=infos["nb_line"]) ) )
67
+ {
68
+ this.maj_highlight(infos);
69
+ }
70
+ }
71
+ }
72
+ t3= new Date().getTime();
73
+
74
+ // manage line heights
75
+ if( this.settings['word_wrap'] && infos["full_text"] != this.last_selection["full_text"])
76
+ {
77
+ // refresh only 1 line if text change concern only one line and that the total line number has not changed
78
+ if( changes.newText.split("\n").length == 1 && this.last_selection['nb_line'] && infos['nb_line'] == this.last_selection['nb_line'] )
79
+ {
80
+ this.fixLinesHeight( infos['full_text'], changes.lineStart, changes.lineStart );
81
+ }
82
+ else
83
+ {
84
+ this.fixLinesHeight( infos['full_text'], changes.lineStart, -1 );
85
+ }
86
+ }
87
+
88
+ tLines= new Date().getTime();
89
+ // manage bracket finding
90
+ if( infos["line_start"] != this.last_selection["line_start"] || infos["curr_pos"] != this.last_selection["curr_pos"] || infos["full_text"].length!=this.last_selection["full_text"].length || this.reload_highlight || !timer_checkup )
91
+ {
92
+ // move _cursor_pos
93
+ var selec_char= infos["curr_line"].charAt(infos["curr_pos"]-1);
94
+ var no_real_move=true;
95
+ if(infos["line_nb"]==1 && (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]) ){
96
+
97
+ no_real_move=false;
98
+ //findEndBracket(infos["line_start"], infos["curr_pos"], selec_char);
99
+ if(this.findEndBracket(infos, selec_char) === true){
100
+ _$("end_bracket").style.visibility ="visible";
101
+ _$("cursor_pos").style.visibility ="visible";
102
+ _$("cursor_pos").innerHTML = selec_char;
103
+ _$("end_bracket").innerHTML = (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]);
104
+ }else{
105
+ _$("end_bracket").style.visibility ="hidden";
106
+ _$("cursor_pos").style.visibility ="hidden";
107
+ }
108
+ }else{
109
+ _$("cursor_pos").style.visibility ="hidden";
110
+ _$("end_bracket").style.visibility ="hidden";
111
+ }
112
+ //alert("move cursor");
113
+ this.displayToCursorPosition("cursor_pos", infos["line_start"], infos["curr_pos"]-1, infos["curr_line"], no_real_move);
114
+ if(infos["line_nb"]==1 && infos["line_start"]!=this.last_selection["line_start"])
115
+ this.scroll_to_view();
116
+ }
117
+ this.last_selection=infos;
118
+ }
119
+
120
+ tend= new Date().getTime();
121
+ //if( (tend-t1) > 7 )
122
+ // console.log( "tps total: "+ (tend-t1) + " tps get_infos: "+ (t2-t1)+ " tps selec: "+ (t2_1-t2)+ " tps highlight: "+ (t3-t2_1) +" tps lines: "+ (tLines-t3) +" tps cursor+lines: "+ (tend-tLines)+" \n" );
123
+
124
+
125
+ if(timer_checkup){
126
+ setTimeout("editArea.check_line_selection(true)", this.check_line_selection_timer);
127
+ }
128
+ };
129
+
130
+
131
+ EditArea.prototype.get_selection_infos= function(){
132
+ var sel={}, start, end, len, str;
133
+
134
+ this.getIESelection();
135
+ start = this.textarea.selectionStart;
136
+ end = this.textarea.selectionEnd;
137
+
138
+ if( this.last_selection["selectionStart"] == start && this.last_selection["selectionEnd"] == end && this.last_selection["full_text"] == this.textarea.value )
139
+ {
140
+ return this.last_selection;
141
+ }
142
+
143
+ if(this.tabulation!="\t" && this.textarea.value.indexOf("\t")!=-1)
144
+ { // can append only after copy/paste
145
+ len = this.textarea.value.length;
146
+ this.textarea.value = this.replace_tab(this.textarea.value);
147
+ start = end = start+(this.textarea.value.length-len);
148
+ this.area_select( start, 0 );
149
+ }
150
+
151
+ sel["selectionStart"] = start;
152
+ sel["selectionEnd"] = end;
153
+ sel["full_text"] = this.textarea.value;
154
+ sel["line_start"] = 1;
155
+ sel["line_nb"] = 1;
156
+ sel["curr_pos"] = 0;
157
+ sel["curr_line"] = "";
158
+ sel["indexOfCursor"] = 0;
159
+ sel["selec_direction"] = this.last_selection["selec_direction"];
160
+
161
+ //return sel;
162
+ var splitTab= sel["full_text"].split("\n");
163
+ var nbLine = Math.max(0, splitTab.length);
164
+ var nbChar = Math.max(0, sel["full_text"].length - (nbLine - 1)); // (remove \n caracters from the count)
165
+ if( sel["full_text"].indexOf("\r") != -1 )
166
+ nbChar = nbChar - ( nbLine - 1 ); // (remove \r caracters from the count)
167
+ sel["nb_line"] = nbLine;
168
+ sel["nb_char"] = nbChar;
169
+
170
+ if(start>0){
171
+ str = sel["full_text"].substr(0,start);
172
+ sel["curr_pos"] = start - str.lastIndexOf("\n");
173
+ sel["line_start"] = Math.max(1, str.split("\n").length);
174
+ }else{
175
+ sel["curr_pos"]=1;
176
+ }
177
+ if(end>start){
178
+ sel["line_nb"]=sel["full_text"].substring(start,end).split("\n").length;
179
+ }
180
+ sel["indexOfCursor"]=start;
181
+ sel["curr_line"]=splitTab[Math.max(0,sel["line_start"]-1)];
182
+
183
+ // determine in which direction the selection grow
184
+ if(sel["selectionStart"] == this.last_selection["selectionStart"]){
185
+ if(sel["selectionEnd"]>this.last_selection["selectionEnd"])
186
+ sel["selec_direction"]= "down";
187
+ else if(sel["selectionEnd"] == this.last_selection["selectionStart"])
188
+ sel["selec_direction"]= this.last_selection["selec_direction"];
189
+ }else if(sel["selectionStart"] == this.last_selection["selectionEnd"] && sel["selectionEnd"]>this.last_selection["selectionEnd"]){
190
+ sel["selec_direction"]= "down";
191
+ }else{
192
+ sel["selec_direction"]= "up";
193
+ }
194
+
195
+ _$("nbLine").innerHTML = nbLine;
196
+ _$("nbChar").innerHTML = nbChar;
197
+ _$("linePos").innerHTML = sel["line_start"];
198
+ _$("currPos").innerHTML = sel["curr_pos"];
199
+
200
+ return sel;
201
+ };
202
+
203
+ // set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd)
204
+ EditArea.prototype.getIESelection= function(){
205
+ var selectionStart, selectionEnd, range, stored_range;
206
+
207
+ if( !this.isIE )
208
+ return false;
209
+
210
+ // make it work as nowrap mode (easier for range manipulation with lineHeight)
211
+ if( this.settings['word_wrap'] )
212
+ this.textarea.wrap='off';
213
+
214
+ try{
215
+ range = document.selection.createRange();
216
+ stored_range = range.duplicate();
217
+ stored_range.moveToElementText( this.textarea );
218
+ stored_range.setEndPoint( 'EndToEnd', range );
219
+ if( stored_range.parentElement() != this.textarea )
220
+ throw "invalid focus";
221
+
222
+ // the range don't take care of empty lines in the end of the selection
223
+ var scrollTop = this.result.scrollTop + document.body.scrollTop;
224
+ var relative_top= range.offsetTop - parent.calculeOffsetTop(this.textarea) + scrollTop;
225
+ var line_start = Math.round((relative_top / this.lineHeight) +1);
226
+ var line_nb = Math.round( range.boundingHeight / this.lineHeight );
227
+
228
+ selectionStart = stored_range.text.length - range.text.length;
229
+ selectionStart += ( line_start - this.textarea.value.substr(0, selectionStart).split("\n").length)*2; // count missing empty \r to the selection
230
+ selectionStart -= ( line_start - this.textarea.value.substr(0, selectionStart).split("\n").length ) * 2;
231
+
232
+ selectionEnd = selectionStart + range.text.length;
233
+ selectionEnd += (line_start + line_nb - 1 - this.textarea.value.substr(0, selectionEnd ).split("\n").length)*2;
234
+
235
+ this.textarea.selectionStart = selectionStart;
236
+ this.textarea.selectionEnd = selectionEnd;
237
+ }
238
+ catch(e){}
239
+
240
+ // restore wrap mode
241
+ if( this.settings['word_wrap'] )
242
+ this.textarea.wrap='soft';
243
+ };
244
+
245
+ // select the text for IE (and take care of \r caracters)
246
+ EditArea.prototype.setIESelection= function(){
247
+ var a = this.textarea, nbLineStart, nbLineEnd, range;
248
+
249
+ if( !this.isIE )
250
+ return false;
251
+
252
+ nbLineStart = a.value.substr(0, a.selectionStart).split("\n").length - 1;
253
+ nbLineEnd = a.value.substr(0, a.selectionEnd).split("\n").length - 1;
254
+ range = document.selection.createRange();
255
+ range.moveToElementText( a );
256
+ range.setEndPoint( 'EndToStart', range );
257
+
258
+ range.moveStart('character', a.selectionStart - nbLineStart);
259
+ range.moveEnd('character', a.selectionEnd - nbLineEnd - (a.selectionStart - nbLineStart) );
260
+ range.select();
261
+ };
262
+
263
+
264
+
265
+ EditArea.prototype.checkTextEvolution=function(lastText,newText){
266
+ // ch will contain changes datas
267
+ var ch={},baseStep=200, cpt=0, end, step,tStart=new Date().getTime();
268
+
269
+ end = Math.min(newText.length, lastText.length);
270
+ step = baseStep;
271
+ // find how many chars are similar at the begin of the text
272
+ while( cpt<end && step>=1 ){
273
+ if(lastText.substr(cpt, step) == newText.substr(cpt, step)){
274
+ cpt+= step;
275
+ }else{
276
+ step= Math.floor(step/2);
277
+ }
278
+ }
279
+
280
+ ch.posStart = cpt;
281
+ ch.lineStart= newText.substr(0, ch.posStart).split("\n").length -1;
282
+
283
+ cpt_last = lastText.length;
284
+ cpt = newText.length;
285
+ step = baseStep;
286
+ // find how many chars are similar at the end of the text
287
+ while( cpt>=0 && cpt_last>=0 && step>=1 ){
288
+ if(lastText.substr(cpt_last-step, step) == newText.substr(cpt-step, step)){
289
+ cpt-= step;
290
+ cpt_last-= step;
291
+ }else{
292
+ step= Math.floor(step/2);
293
+ }
294
+ }
295
+
296
+ ch.posNewEnd = cpt;
297
+ ch.posLastEnd = cpt_last;
298
+ if(ch.posNewEnd<=ch.posStart){
299
+ if(lastText.length < newText.length){
300
+ ch.posNewEnd= ch.posStart + newText.length - lastText.length;
301
+ ch.posLastEnd= ch.posStart;
302
+ }else{
303
+ ch.posLastEnd= ch.posStart + lastText.length - newText.length;
304
+ ch.posNewEnd= ch.posStart;
305
+ }
306
+ }
307
+ ch.newText = newText.substring(ch.posStart, ch.posNewEnd);
308
+ ch.lastText = lastText.substring(ch.posStart, ch.posLastEnd);
309
+
310
+ ch.lineNewEnd = newText.substr(0, ch.posNewEnd).split("\n").length -1;
311
+ ch.lineLastEnd = lastText.substr(0, ch.posLastEnd).split("\n").length -1;
312
+
313
+ ch.newTextLine = newText.split("\n").slice(ch.lineStart, ch.lineNewEnd+1).join("\n");
314
+ ch.lastTextLine = lastText.split("\n").slice(ch.lineStart, ch.lineLastEnd+1).join("\n");
315
+ //console.log( ch );
316
+ return ch;
317
+ };
318
+
319
+ EditArea.prototype.tab_selection= function(){
320
+ if(this.is_tabbing)
321
+ return;
322
+ this.is_tabbing=true;
323
+ //infos=getSelectionInfos();
324
+ //if( document.selection ){
325
+ this.getIESelection();
326
+ /* Insertion du code de formatage */
327
+ var start = this.textarea.selectionStart;
328
+ var end = this.textarea.selectionEnd;
329
+ var insText = this.textarea.value.substring(start, end);
330
+
331
+ /* Insert tabulation and ajust cursor position */
332
+ var pos_start=start;
333
+ var pos_end=end;
334
+ if (insText.length == 0) {
335
+ // if only one line selected
336
+ this.textarea.value = this.textarea.value.substr(0, start) + this.tabulation + this.textarea.value.substr(end);
337
+ pos_start = start + this.tabulation.length;
338
+ pos_end=pos_start;
339
+ } else {
340
+ start= Math.max(0, this.textarea.value.substr(0, start).lastIndexOf("\n")+1);
341
+ endText=this.textarea.value.substr(end);
342
+ startText=this.textarea.value.substr(0, start);
343
+ tmp= this.textarea.value.substring(start, end).split("\n");
344
+ insText= this.tabulation+tmp.join("\n"+this.tabulation);
345
+ this.textarea.value = startText + insText + endText;
346
+ pos_start = start;
347
+ pos_end= this.textarea.value.indexOf("\n", startText.length + insText.length);
348
+ if(pos_end==-1)
349
+ pos_end=this.textarea.value.length;
350
+ //pos = start + repdeb.length + insText.length + ;
351
+ }
352
+ this.textarea.selectionStart = pos_start;
353
+ this.textarea.selectionEnd = pos_end;
354
+
355
+ //if( document.selection ){
356
+ if(this.isIE)
357
+ {
358
+ this.setIESelection();
359
+ setTimeout("editArea.is_tabbing=false;", 100); // IE can't accept to make 2 tabulation without a little break between both
360
+ }
361
+ else
362
+ {
363
+ this.is_tabbing=false;
364
+ }
365
+
366
+ };
367
+
368
+ EditArea.prototype.invert_tab_selection= function(){
369
+ var t=this, a=this.textarea;
370
+ if(t.is_tabbing)
371
+ return;
372
+ t.is_tabbing=true;
373
+ //infos=getSelectionInfos();
374
+ //if( document.selection ){
375
+ t.getIESelection();
376
+
377
+ var start = a.selectionStart;
378
+ var end = a.selectionEnd;
379
+ var insText = a.value.substring(start, end);
380
+
381
+ /* Tab remove and cursor seleciton adjust */
382
+ var pos_start=start;
383
+ var pos_end=end;
384
+ if (insText.length == 0) {
385
+ if(a.value.substring(start-t.tabulation.length, start)==t.tabulation)
386
+ {
387
+ a.value = a.value.substr(0, start-t.tabulation.length) + a.value.substr(end);
388
+ pos_start = Math.max(0, start-t.tabulation.length);
389
+ pos_end = pos_start;
390
+ }
391
+ /*
392
+ a.value = a.value.substr(0, start) + t.tabulation + insText + a.value.substr(end);
393
+ pos_start = start + t.tabulation.length;
394
+ pos_end=pos_start;*/
395
+ } else {
396
+ start = a.value.substr(0, start).lastIndexOf("\n")+1;
397
+ endText = a.value.substr(end);
398
+ startText = a.value.substr(0, start);
399
+ tmp = a.value.substring(start, end).split("\n");
400
+ insText = "";
401
+ for(i=0; i<tmp.length; i++){
402
+ for(j=0; j<t.tab_nb_char; j++){
403
+ if(tmp[i].charAt(0)=="\t"){
404
+ tmp[i]=tmp[i].substr(1);
405
+ j=t.tab_nb_char;
406
+ }else if(tmp[i].charAt(0)==" ")
407
+ tmp[i]=tmp[i].substr(1);
408
+ }
409
+ insText+=tmp[i];
410
+ if(i<tmp.length-1)
411
+ insText+="\n";
412
+ }
413
+ //insText+="_";
414
+ a.value = startText + insText + endText;
415
+ pos_start = start;
416
+ pos_end = a.value.indexOf("\n", startText.length + insText.length);
417
+ if(pos_end==-1)
418
+ pos_end=a.value.length;
419
+ //pos = start + repdeb.length + insText.length + ;
420
+ }
421
+ a.selectionStart = pos_start;
422
+ a.selectionEnd = pos_end;
423
+
424
+ //if( document.selection ){
425
+ if(t.isIE){
426
+ // select the text for IE
427
+ t.setIESelection();
428
+ setTimeout("editArea.is_tabbing=false;", 100); // IE can accept to make 2 tabulation without a little break between both
429
+ }else
430
+ t.is_tabbing=false;
431
+ };
432
+
433
+ EditArea.prototype.press_enter= function(){
434
+ if(!this.smooth_selection)
435
+ return false;
436
+ this.getIESelection();
437
+ var scrollTop= this.result.scrollTop;
438
+ var scrollLeft= this.result.scrollLeft;
439
+ var start=this.textarea.selectionStart;
440
+ var end= this.textarea.selectionEnd;
441
+ var start_last_line= Math.max(0 , this.textarea.value.substring(0, start).lastIndexOf("\n") + 1 );
442
+ var begin_line= this.textarea.value.substring(start_last_line, start).replace(/^([ \t]*).*/gm, "$1");
443
+ var lineStart = this.textarea.value.substring(0, start).split("\n").length;
444
+ if(begin_line=="\n" || begin_line=="\r" || begin_line.length==0)
445
+ {
446
+ return false;
447
+ }
448
+
449
+ if(this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ){
450
+ begin_line="\r\n"+ begin_line;
451
+ }else{
452
+ begin_line="\n"+ begin_line;
453
+ }
454
+ //alert(start_last_line+" strat: "+start +"\n"+this.textarea.value.substring(start_last_line, start)+"\n_"+begin_line+"_")
455
+ this.textarea.value= this.textarea.value.substring(0, start) + begin_line + this.textarea.value.substring(end);
456
+
457
+ this.area_select(start+ begin_line.length ,0);
458
+ // during this process IE scroll back to the top of the textarea
459
+ if(this.isIE){
460
+ this.result.scrollTop = scrollTop;
461
+ this.result.scrollLeft = scrollLeft;
462
+ }
463
+ return true;
464
+
465
+ };
466
+
467
+ EditArea.prototype.findEndBracket= function(infos, bracket){
468
+
469
+ var start=infos["indexOfCursor"];
470
+ var normal_order=true;
471
+ //curr_text=infos["full_text"].split("\n");
472
+ if(this.assocBracket[bracket])
473
+ endBracket=this.assocBracket[bracket];
474
+ else if(this.revertAssocBracket[bracket]){
475
+ endBracket=this.revertAssocBracket[bracket];
476
+ normal_order=false;
477
+ }
478
+ var end=-1;
479
+ var nbBracketOpen=0;
480
+
481
+ for(var i=start; i<infos["full_text"].length && i>=0; ){
482
+ if(infos["full_text"].charAt(i)==endBracket){
483
+ nbBracketOpen--;
484
+ if(nbBracketOpen<=0){
485
+ //i=infos["full_text"].length;
486
+ end=i;
487
+ break;
488
+ }
489
+ }else if(infos["full_text"].charAt(i)==bracket)
490
+ nbBracketOpen++;
491
+ if(normal_order)
492
+ i++;
493
+ else
494
+ i--;
495
+ }
496
+
497
+ //end=infos["full_text"].indexOf("}", start);
498
+ if(end==-1)
499
+ return false;
500
+ var endLastLine=infos["full_text"].substr(0, end).lastIndexOf("\n");
501
+ if(endLastLine==-1)
502
+ line=1;
503
+ else
504
+ line= infos["full_text"].substr(0, endLastLine).split("\n").length + 1;
505
+
506
+ var curPos= end - endLastLine - 1;
507
+ var endLineLength = infos["full_text"].substring(end).split("\n")[0].length;
508
+ this.displayToCursorPosition("end_bracket", line, curPos, infos["full_text"].substring(endLastLine +1, end + endLineLength));
509
+ return true;
510
+ };
511
+
512
+ EditArea.prototype.displayToCursorPosition= function(id, start_line, cur_pos, lineContent, no_real_move){
513
+ var elem,dest,content,posLeft=0,posTop,fixPadding,topOffset,endElem;
514
+
515
+ elem = this.test_font_size;
516
+ dest = _$(id);
517
+ content = "<span id='test_font_size_inner'>"+lineContent.substr(0, cur_pos).replace(/&/g,"&amp;").replace(/</g,"&lt;")+"</span><span id='endTestFont'>"+lineContent.substr(cur_pos).replace(/&/g,"&amp;").replace(/</g,"&lt;")+"</span>";
518
+ if( this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) {
519
+ elem.innerHTML= "<pre>" + content.replace(/^\r?\n/, "<br>") + "</pre>";
520
+ } else {
521
+ elem.innerHTML= content;
522
+ }
523
+
524
+
525
+ endElem = _$('endTestFont');
526
+ topOffset = endElem.offsetTop;
527
+ fixPadding = parseInt( this.content_highlight.style.paddingLeft.replace("px", "") );
528
+ posLeft = 45 + endElem.offsetLeft + ( !isNaN( fixPadding ) && topOffset > 0 ? fixPadding : 0 );
529
+ posTop = this.getLinePosTop( start_line ) + topOffset;// + Math.floor( ( endElem.offsetHeight - 1 ) / this.lineHeight ) * this.lineHeight;
530
+
531
+ // detect the case where the span start on a line but has no display on it
532
+ if( this.isIE && cur_pos > 0 && endElem.offsetLeft == 0 )
533
+ {
534
+ posTop += this.lineHeight;
535
+ }
536
+ if(no_real_move!=true){ // when the cursor is hidden no need to move him
537
+ dest.style.top=posTop+"px";
538
+ dest.style.left=posLeft+"px";
539
+ }
540
+ // usefull for smarter scroll
541
+ dest.cursor_top=posTop;
542
+ dest.cursor_left=posLeft;
543
+ // _$(id).style.marginLeft=posLeft+"px";
544
+ };
545
+
546
+ EditArea.prototype.getLinePosTop= function(start_line){
547
+ var elem= _$('line_'+ start_line), posTop=0;
548
+ if( elem )
549
+ posTop = elem.offsetTop;
550
+ else
551
+ posTop = this.lineHeight * (start_line-1);
552
+ return posTop;
553
+ };
554
+
555
+
556
+ // return the dislpayed height of a text (take word-wrap into account)
557
+ EditArea.prototype.getTextHeight= function(text){
558
+ var t=this,elem,height;
559
+ elem = t.test_font_size;
560
+ content = text.replace(/&/g,"&amp;").replace(/</g,"&lt;");
561
+ if( t.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) {
562
+ elem.innerHTML= "<pre>" + content.replace(/^\r?\n/, "<br>") + "</pre>";
563
+ } else {
564
+ elem.innerHTML= content;
565
+ }
566
+ height = elem.offsetHeight;
567
+ height = Math.max( 1, Math.floor( elem.offsetHeight / this.lineHeight ) ) * this.lineHeight;
568
+ return height;
569
+ };
570
+
571
+ /**
572
+ * Fix line height for the given lines
573
+ * @param Integer linestart
574
+ * @param Integer lineEnd End line or -1 to cover all lines
575
+ */
576
+ EditArea.prototype.fixLinesHeight= function( textValue, lineStart,lineEnd ){
577
+ var aText = textValue.split("\n");
578
+ if( lineEnd == -1 )
579
+ lineEnd = aText.length-1;
580
+ for( var i = Math.max(0, lineStart); i <= lineEnd; i++ )
581
+ {
582
+ if( elem = _$('line_'+ ( i+1 ) ) )
583
+ {
584
+ elem.style.height= typeof( aText[i] ) != "undefined" ? this.getTextHeight( aText[i] )+"px" : this.lineHeight;
585
+ }
586
+ }
587
+ };
588
+
589
+ EditArea.prototype.area_select= function(start, length){
590
+ this.textarea.focus();
591
+
592
+ start = Math.max(0, Math.min(this.textarea.value.length, start));
593
+ end = Math.max(start, Math.min(this.textarea.value.length, start+length));
594
+
595
+ if(this.isIE)
596
+ {
597
+ this.textarea.selectionStart = start;
598
+ this.textarea.selectionEnd = end;
599
+ this.setIESelection();
600
+ }
601
+ else
602
+ {
603
+ // Opera bug when moving selection start and selection end
604
+ if(this.isOpera && this.isOpera < 9.6 )
605
+ {
606
+ this.textarea.setSelectionRange(0, 0);
607
+ }
608
+ this.textarea.setSelectionRange(start, end);
609
+ }
610
+ this.check_line_selection();
611
+ };
612
+
613
+
614
+ EditArea.prototype.area_get_selection= function(){
615
+ var text="";
616
+ if( document.selection ){
617
+ var range = document.selection.createRange();
618
+ text=range.text;
619
+ }else{
620
+ text= this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd);
621
+ }
622
+ return text;
623
+ };