PageRenderTime 66ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/editarea/edit_area_full_with_plugins.js

http://avecms.googlecode.com/
JavaScript | 1943 lines | 1651 code | 172 blank | 120 comment | 205 complexity | bc74ae1f90f83e22a207a4a162f833e0 MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, BSD-2-Clause, Apache-2.0, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. /* USE PHP COMPRESSION
  2. javascript size: based files: 257973 => PHP COMPRESSION => 199571 , reduced by 23%
  3. compression time: 0.899299860001
  4. 'edit_area_loader.js' loaded
  5. 'elements_functions.js' loaded
  6. 'resize_area.js' loaded
  7. 'reg_syntax.js' loaded
  8. 'edit_area.js' loaded
  9. 'manage_area.js' loaded
  10. 'edit_area_functions.js' loaded
  11. 'keyboard.js' loaded
  12. 'search_replace.js' loaded
  13. 'highlight.js' loaded
  14. 'regexp.js' loaded
  15. 'plugins/charmap/charmap.js' loaded
  16. 'plugins/test/test.js' loaded
  17. 'template.html' loaded
  18. 'edit_area.css' loaded
  19. */
  20. /******
  21. *
  22. * EditArea
  23. * Developped by Christophe Dolivet
  24. * Released under LGPL, Apache and BSD licenses (use the one you want)
  25. *
  26. ******/
  27. function EAL(){
  28. var t=this;
  29. t.version= "0.8.2";
  30. date= new Date();
  31. t.start_time=date.getTime();
  32. t.win= "loading"; // window loading state
  33. t.error= false; // to know if load is interrrupt
  34. t.baseURL="";
  35. //t.suffix="";
  36. t.template="";
  37. t.lang= {}; // array of loaded speech language
  38. t.load_syntax= {}; // array of loaded syntax language for highlight mode
  39. t.syntax= {}; // array of initilized syntax language for highlight mode
  40. t.loadedFiles= [];
  41. t.waiting_loading= {}; // files that must be loaded in order to allow the script to really start
  42. // scripts that must be loaded in the iframe
  43. t.scripts_to_load= [];
  44. t.sub_scripts_to_load= [];
  45. t.syntax_display_name= { 'basic':'Basic','brainfuck':'Brainfuck','c':'C','coldfusion':'Coldfusion','cpp':'CPP','css':'CSS','html':'HTML','java':'Java','js':'Javascript','pas':'Pascal','perl':'Perl','php':'Php','python':'Python','robotstxt':'Robots txt','ruby':'Ruby','sql':'SQL','tsql':'T-SQL','vb':'Visual Basic','xml':'XML' };
  46. t.resize= []; // contain resizing datas
  47. t.hidden= {}; // store datas of the hidden textareas
  48. t.default_settings= {
  49. //id: "src" // id of the textarea to transform
  50. debug: false
  51. ,smooth_selection: true
  52. ,font_size: "10" // not for IE
  53. ,font_family: "monospace" // can be "verdana,monospace". Allow non monospace font but Firefox get smaller tabulation with non monospace fonts. IE doesn't change the tabulation width and Opera doesn't take this option into account...
  54. ,start_highlight: false // if start with highlight
  55. ,toolbar: "search, go_to_line, fullscreen, |, undo, redo, |, select_font,|, change_smooth_selection, highlight, reset_highlight, word_wrap, |, help"
  56. ,begin_toolbar: "" // "new_document, save, load, |"
  57. ,end_toolbar: "" // or end_toolbar
  58. ,is_multi_files: false // enable the multi file mode (the textarea content is ignored)
  59. ,allow_resize: "both" // possible values: "no", "both", "x", "y"
  60. ,show_line_colors: false // if the highlight is disabled for the line currently beeing edited (if enabled => heavy CPU use)
  61. ,min_width: 400
  62. ,min_height: 125
  63. ,replace_tab_by_spaces: false
  64. ,allow_toggle: true // true or false
  65. ,language: "en"
  66. ,syntax: ""
  67. ,syntax_selection_allow: "basic,brainfuck,c,coldfusion,cpp,css,html,java,js,pas,perl,php,python,ruby,robotstxt,sql,tsql,vb,xml"
  68. ,display: "onload" // onload or later
  69. ,max_undo: 30
  70. ,browsers: "known" // all or known
  71. ,plugins: "" // comma separated plugin list
  72. ,gecko_spellcheck: false // enable/disable by default the gecko_spellcheck
  73. ,fullscreen: false
  74. ,is_editable: true
  75. ,cursor_position: "begin"
  76. ,word_wrap: false // define if the text is wrapped of not in the textarea
  77. ,autocompletion: false // NOT IMPLEMENTED
  78. ,load_callback: "" // click on load button (function name)
  79. ,save_callback: "" // click on save button (function name)
  80. ,change_callback: "" // textarea onchange trigger (function name)
  81. ,submit_callback: "" // form submited (function name)
  82. ,EA_init_callback: "" // EditArea initiliazed (function name)
  83. ,EA_delete_callback: "" // EditArea deleted (function name)
  84. ,EA_load_callback: "" // EditArea fully loaded and displayed (function name)
  85. ,EA_unload_callback: "" // EditArea delete while being displayed (function name)
  86. ,EA_toggle_on_callback: "" // EditArea toggled on (function name)
  87. ,EA_toggle_off_callback: "" // EditArea toggled off (function name)
  88. ,EA_file_switch_on_callback: "" // a new tab is selected (called for the newly selected file)
  89. ,EA_file_switch_off_callback: "" // a new tab is selected (called for the previously selected file)
  90. ,EA_file_close_callback: "" // close a tab
  91. };
  92. t.advanced_buttons = [
  93. // id, button img, command (it will try to find the translation of "id"), is_file_specific
  94. ['new_document', 'newdocument.gif', 'new_document', false],
  95. ['search', 'search.gif', 'show_search', false],
  96. ['go_to_line', 'go_to_line.gif', 'go_to_line', false],
  97. ['undo', 'undo.gif', 'undo', true],
  98. ['redo', 'redo.gif', 'redo', true],
  99. ['change_smooth_selection', 'smooth_selection.gif', 'change_smooth_selection_mode', true],
  100. ['reset_highlight', 'reset_highlight.gif', 'resync_highlight', true],
  101. ['highlight', 'highlight.gif','change_highlight', true],
  102. ['help', 'help.gif', 'show_help', false],
  103. ['save', 'save.gif', 'save', false],
  104. ['load', 'load.gif', 'load', false],
  105. ['fullscreen', 'fullscreen.gif', 'toggle_full_screen', false],
  106. ['word_wrap', 'word_wrap.gif', 'toggle_word_wrap', true],
  107. ['autocompletion', 'autocompletion.gif', 'toggle_autocompletion', true]
  108. ];
  109. // navigator identification
  110. t.set_browser_infos(t);
  111. if(t.isIE>=6 || t.isGecko || ( t.isWebKit && !t.isSafari<3 ) || t.isOpera>=9 || t.isCamino )
  112. t.isValidBrowser=true;
  113. else
  114. t.isValidBrowser=false;
  115. t.set_base_url();
  116. for(var i=0; i<t.scripts_to_load.length; i++){
  117. setTimeout("eAL.load_script('"+t.baseURL + t.scripts_to_load[i]+ ".js');", 1); // let the time to Object eAL to be created before loading additionnal scripts
  118. t.waiting_loading[t.scripts_to_load[i]+ ".js"]= false;
  119. }
  120. t.add_event(window, "load", EAL.prototype.window_loaded);
  121. };
  122. EAL.prototype ={
  123. has_error : function(){
  124. this.error= true;
  125. // set to empty all EAL functions
  126. for(var i in EAL.prototype){
  127. EAL.prototype[i]=function(){};
  128. }
  129. },
  130. // add browser informations to the object passed in parameter
  131. set_browser_infos : function(o){
  132. ua= navigator.userAgent;
  133. // general detection
  134. o.isWebKit = /WebKit/.test(ua);
  135. o.isGecko = !o.isWebKit && /Gecko/.test(ua);
  136. o.isMac = /Mac/.test(ua);
  137. o.isIE = (navigator.appName == "Microsoft Internet Explorer");
  138. if(o.isIE){
  139. o.isIE = ua.replace(/^.*?MSIE\s+([0-9\.]+).*$/, "$1");
  140. if(o.isIE<6)
  141. o.has_error();
  142. }
  143. if(o.isOpera = (ua.indexOf('Opera') != -1)){
  144. o.isOpera= ua.replace(/^.*?Opera.*?([0-9\.]+).*$/i, "$1");
  145. if(o.isOpera<9)
  146. o.has_error();
  147. o.isIE=false;
  148. }
  149. if(o.isFirefox =(ua.indexOf('Firefox') != -1))
  150. o.isFirefox = ua.replace(/^.*?Firefox.*?([0-9\.]+).*$/i, "$1");
  151. // Firefox clones
  152. if( ua.indexOf('Iceweasel') != -1 )
  153. o.isFirefox = ua.replace(/^.*?Iceweasel.*?([0-9\.]+).*$/i, "$1");
  154. if( ua.indexOf('GranParadiso') != -1 )
  155. o.isFirefox = ua.replace(/^.*?GranParadiso.*?([0-9\.]+).*$/i, "$1");
  156. if( ua.indexOf('BonEcho') != -1 )
  157. o.isFirefox = ua.replace(/^.*?BonEcho.*?([0-9\.]+).*$/i, "$1");
  158. if( ua.indexOf('SeaMonkey') != -1)
  159. o.isFirefox = (ua.replace(/^.*?SeaMonkey.*?([0-9\.]+).*$/i, "$1") ) + 1;
  160. if(o.isCamino =(ua.indexOf('Camino') != -1))
  161. o.isCamino = ua.replace(/^.*?Camino.*?([0-9\.]+).*$/i, "$1");
  162. if(o.isSafari =(ua.indexOf('Safari') != -1))
  163. o.isSafari= ua.replace(/^.*?Version\/([0-9]+\.[0-9]+).*$/i, "$1");
  164. if(o.isChrome =(ua.indexOf('Chrome') != -1)) {
  165. o.isChrome = ua.replace(/^.*?Chrome.*?([0-9\.]+).*$/i, "$1");
  166. o.isSafari = false;
  167. }
  168. },
  169. window_loaded : function(){
  170. eAL.win="loaded";
  171. // add events on forms
  172. if (document.forms) {
  173. for (var i=0; i<document.forms.length; i++) {
  174. var form = document.forms[i];
  175. form.edit_area_replaced_submit=null;
  176. try {
  177. form.edit_area_replaced_submit = form.onsubmit;
  178. form.onsubmit="";
  179. } catch (e) {// Do nothing
  180. }
  181. eAL.add_event(form, "submit", EAL.prototype.submit);
  182. eAL.add_event(form, "reset", EAL.prototype.reset);
  183. }
  184. }
  185. eAL.add_event(window, "unload", function(){for(var i in eAs){eAL.delete_instance(i);}}); // ini callback
  186. },
  187. // init the checkup of the selection of the IE textarea
  188. init_ie_textarea : function(id){
  189. var a=document.getElementById(id);
  190. try{
  191. if(a && typeof(a.focused)=="undefined"){
  192. a.focus();
  193. a.focused=true;
  194. a.selectionStart= a.selectionEnd= 0;
  195. get_IE_selection(a);
  196. eAL.add_event(a, "focus", IE_textarea_focus);
  197. eAL.add_event(a, "blur", IE_textarea_blur);
  198. }
  199. }catch(ex){}
  200. },
  201. init : function(settings){
  202. var t=this,s=settings,i;
  203. if(!s["id"])
  204. t.has_error();
  205. if(t.error)
  206. return;
  207. // if an instance of the editor already exists for this textarea => delete the previous one
  208. if(eAs[s["id"]])
  209. t.delete_instance(s["id"]);
  210. // init settings
  211. for(i in t.default_settings){
  212. if(typeof(s[i])=="undefined")
  213. s[i]=t.default_settings[i];
  214. }
  215. if(s["browsers"]=="known" && t.isValidBrowser==false){
  216. return;
  217. }
  218. if(s["begin_toolbar"].length>0)
  219. s["toolbar"]= s["begin_toolbar"] +","+ s["toolbar"];
  220. if(s["end_toolbar"].length>0)
  221. s["toolbar"]= s["toolbar"] +","+ s["end_toolbar"];
  222. s["tab_toolbar"]= s["toolbar"].replace(/ /g,"").split(",");
  223. s["plugins"]= s["plugins"].replace(/ /g,"").split(",");
  224. for(i=0; i<s["plugins"].length; i++){
  225. if(s["plugins"][i].length==0)
  226. s["plugins"].splice(i,1);
  227. }
  228. // alert(settings["plugins"].length+": "+ settings["plugins"].join(","));
  229. t.get_template();
  230. t.load_script(t.baseURL + "langs/"+ s["language"] + ".js");
  231. if(s["syntax"].length>0){
  232. s["syntax"]=s["syntax"].toLowerCase();
  233. t.load_script(t.baseURL + "reg_syntax/"+ s["syntax"] + ".js");
  234. }
  235. //alert(this.template);
  236. eAs[s["id"]]= {"settings": s};
  237. eAs[s["id"]]["displayed"]=false;
  238. eAs[s["id"]]["hidden"]=false;
  239. //if(settings["display"]=="onload")
  240. t.start(s["id"]);
  241. },
  242. // delete an instance of an EditArea
  243. delete_instance : function(id){
  244. var d=document,fs=window.frames,span,iframe;
  245. eAL.execCommand(id, "EA_delete");
  246. if(fs["frame_"+id] && fs["frame_"+id].editArea)
  247. {
  248. if(eAs[id]["displayed"])
  249. eAL.toggle(id, "off");
  250. fs["frame_"+id].editArea.execCommand("EA_unload");
  251. }
  252. // remove toggle infos and debug textarea
  253. span= d.getElementById("EditAreaArroundInfos_"+id);
  254. if(span)
  255. span.parentNode.removeChild(span);
  256. // remove the iframe
  257. iframe= d.getElementById("frame_"+id);
  258. if(iframe){
  259. iframe.parentNode.removeChild(iframe);
  260. //delete iframe;
  261. try {
  262. delete fs["frame_"+id];
  263. } catch (e) {// Do nothing
  264. }
  265. }
  266. delete eAs[id];
  267. },
  268. start : function(id){
  269. var t=this,d=document,f,span,father,next,html='',html_toolbar_content='',template,content,i;
  270. // check that the window is loaded
  271. if(t.win!="loaded"){
  272. setTimeout("eAL.start('"+id+"');", 50);
  273. return;
  274. }
  275. // check that all needed scripts are loaded
  276. for( i in t.waiting_loading){
  277. if(t.waiting_loading[i]!="loaded" && typeof(t.waiting_loading[i])!="function"){
  278. setTimeout("eAL.start('"+id+"');", 50);
  279. return;
  280. }
  281. }
  282. // wait until language and syntax files are loaded
  283. if(!t.lang[eAs[id]["settings"]["language"]] || (eAs[id]["settings"]["syntax"].length>0 && !t.load_syntax[eAs[id]["settings"]["syntax"]]) ){
  284. setTimeout("eAL.start('"+id+"');", 50);
  285. return;
  286. }
  287. // init the regexp for syntax highlight
  288. if(eAs[id]["settings"]["syntax"].length>0)
  289. t.init_syntax_regexp();
  290. // display toggle option and debug area
  291. if(!d.getElementById("EditAreaArroundInfos_"+id) && (eAs[id]["settings"]["debug"] || eAs[id]["settings"]["allow_toggle"]))
  292. {
  293. span= d.createElement("span");
  294. span.id= "EditAreaArroundInfos_"+id;
  295. if(eAs[id]["settings"]["allow_toggle"]){
  296. checked=(eAs[id]["settings"]["display"]=="onload")?"checked='checked'":"";
  297. html+="<div id='edit_area_toggle_"+i+"'>";
  298. html+="<input id='edit_area_toggle_checkbox_"+ id +"' class='toggle_"+ id +"' type='checkbox' onclick='eAL.toggle(\""+ id +"\");' accesskey='e' "+checked+" />";
  299. html+="<label for='edit_area_toggle_checkbox_"+ id +"'>{$toggle}</label></div>";
  300. }
  301. if(eAs[id]["settings"]["debug"])
  302. html+="<textarea id='edit_area_debug_"+ id +"' spellcheck='off' style='z-index: 20; width: 100%; height: 120px;overflow: auto; border: solid black 1px;'></textarea><br />";
  303. html= t.translate(html, eAs[id]["settings"]["language"]);
  304. span.innerHTML= html;
  305. father= d.getElementById(id).parentNode;
  306. next= d.getElementById(id).nextSibling;
  307. if(next==null)
  308. father.appendChild(span);
  309. else
  310. father.insertBefore(span, next);
  311. }
  312. if(!eAs[id]["initialized"])
  313. {
  314. t.execCommand(id, "EA_init"); // ini callback
  315. if(eAs[id]["settings"]["display"]=="later"){
  316. eAs[id]["initialized"]= true;
  317. return;
  318. }
  319. }
  320. if(t.isIE){ // launch IE selection checkup
  321. t.init_ie_textarea(id);
  322. }
  323. // get toolbar content
  324. var area=eAs[id];
  325. for(i=0; i<area["settings"]["tab_toolbar"].length; i++){
  326. // alert(this.tab_toolbar[i]+"\n"+ this.get_control_html(this.tab_toolbar[i]));
  327. html_toolbar_content+= t.get_control_html(area["settings"]["tab_toolbar"][i], area["settings"]["language"]);
  328. }
  329. // translate toolbar text here for chrome 2
  330. html_toolbar_content = t.translate(html_toolbar_content, area["settings"]["language"], "template");
  331. // create javascript import rules for the iframe if the javascript has not been already loaded by the compressor
  332. if(!t.iframe_script){
  333. t.iframe_script="";
  334. for(i=0; i<t.sub_scripts_to_load.length; i++)
  335. t.iframe_script+='<script language="javascript" type="text/javascript" src="'+ t.baseURL + t.sub_scripts_to_load[i] +'.js"></script>';
  336. }
  337. // add plugins scripts if not already loaded by the compressor (but need to load language in all the case)
  338. for(i=0; i<area["settings"]["plugins"].length; i++){
  339. //if(typeof(area["settings"]["plugins"][i])=="function") continue;
  340. if(!t.all_plugins_loaded)
  341. t.iframe_script+='<script language="javascript" type="text/javascript" src="'+ t.baseURL + 'plugins/' + area["settings"]["plugins"][i] + '/' + area["settings"]["plugins"][i] +'.js"></script>';
  342. t.iframe_script+='<script language="javascript" type="text/javascript" src="'+ t.baseURL + 'plugins/' + area["settings"]["plugins"][i] + '/langs/' + area["settings"]["language"] +'.js"></script>';
  343. }
  344. // create css link for the iframe if the whole css text has not been already loaded by the compressor
  345. if(!t.iframe_css){
  346. t.iframe_css="<link href='"+ t.baseURL +"edit_area.css' rel='stylesheet' type='text/css' />";
  347. }
  348. // create template
  349. template= t.template.replace(/\[__BASEURL__\]/g, t.baseURL);
  350. template= template.replace("[__TOOLBAR__]",html_toolbar_content);
  351. // fill template with good language sentences
  352. template= t.translate(template, area["settings"]["language"], "template");
  353. // add css_code
  354. template= template.replace("[__CSSRULES__]", t.iframe_css);
  355. // add js_code
  356. template= template.replace("[__JSCODE__]", t.iframe_script);
  357. // add version_code
  358. template= template.replace("[__EA_VERSION__]", t.version);
  359. //template=template.replace(/\{\$([^\}]+)\}/gm, this.traduc_template);
  360. //eAs[area["settings"]["id"]]["template"]= template;
  361. area.textarea=d.getElementById(area["settings"]["id"]);
  362. eAs[area["settings"]["id"]]["textarea"]=area.textarea;
  363. // if removing previous instances from DOM before (fix from Marcin)
  364. if(typeof(window.frames["frame_"+area["settings"]["id"]])!='undefined')
  365. delete window.frames["frame_"+area["settings"]["id"]];
  366. // insert template in the document after the textarea
  367. father= area.textarea.parentNode;
  368. /* var container= document.createElement("div");
  369. container.id= "EditArea_frame_container_"+area["settings"]["id"];
  370. */
  371. content= d.createElement("iframe");
  372. content.name= "frame_"+area["settings"]["id"];
  373. content.id= "frame_"+area["settings"]["id"];
  374. content.style.borderWidth= "0px";
  375. setAttribute(content, "frameBorder", "0"); // IE
  376. content.style.overflow="hidden";
  377. content.style.display="none";
  378. next= area.textarea.nextSibling;
  379. if(next==null)
  380. father.appendChild(content);
  381. else
  382. father.insertBefore(content, next) ;
  383. f=window.frames["frame_"+area["settings"]["id"]];
  384. f.document.open();
  385. f.eAs=eAs;
  386. f.area_id= area["settings"]["id"];
  387. f.document.area_id= area["settings"]["id"];
  388. f.document.write(template);
  389. f.document.close();
  390. // frame.eAL=this;
  391. //eAs[area["settings"]["id"]]["displayed"]=true;
  392. },
  393. toggle : function(id, toggle_to){
  394. /* if((eAs[id]["displayed"]==true && toggle_to!="on") || toggle_to=="off"){
  395. this.toggle_off(id);
  396. }else if((eAs[id]["displayed"]==false && toggle_to!="off") || toggle_to=="on"){
  397. this.toggle_on(id);
  398. }*/
  399. if(!toggle_to)
  400. toggle_to= (eAs[id]["displayed"]==true)?"off":"on";
  401. if(eAs[id]["displayed"]==true && toggle_to=="off"){
  402. this.toggle_off(id);
  403. }else if(eAs[id]["displayed"]==false && toggle_to=="on"){
  404. this.toggle_on(id);
  405. }
  406. return false;
  407. },
  408. // static function
  409. toggle_off : function(id){
  410. var fs=window.frames,f,t,parNod,nxtSib,selStart,selEnd,scrollTop,scrollLeft;
  411. if(fs["frame_"+id])
  412. {
  413. f = fs["frame_"+id];
  414. t = eAs[id]["textarea"];
  415. if(f.editArea.fullscreen['isFull'])
  416. f.editArea.toggle_full_screen(false);
  417. eAs[id]["displayed"]=false;
  418. // set wrap to off to keep same display mode (some browser get problem with this, so it need more complex operation
  419. t.wrap = "off"; // for IE
  420. setAttribute(t, "wrap", "off"); // for Firefox
  421. parNod = t.parentNode;
  422. nxtSib = t.nextSibling;
  423. parNod.removeChild(t);
  424. parNod.insertBefore(t, nxtSib);
  425. // restore values
  426. t.value= f.editArea.textarea.value;
  427. selStart = f.editArea.last_selection["selectionStart"];
  428. selEnd = f.editArea.last_selection["selectionEnd"];
  429. scrollTop = f.document.getElementById("result").scrollTop;
  430. scrollLeft = f.document.getElementById("result").scrollLeft;
  431. document.getElementById("frame_"+id).style.display='none';
  432. t.style.display="inline";
  433. try{ // IE will give an error when trying to focus an invisible or disabled textarea
  434. t.focus();
  435. } catch(e){};
  436. if(this.isIE){
  437. t.selectionStart= selStart;
  438. t.selectionEnd = selEnd;
  439. t.focused = true;
  440. set_IE_selection(t);
  441. }else{
  442. if(this.isOpera && this.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end
  443. t.setSelectionRange(0, 0);
  444. }
  445. try{
  446. t.setSelectionRange(selStart, selEnd);
  447. } catch(e) {};
  448. }
  449. t.scrollTop= scrollTop;
  450. t.scrollLeft= scrollLeft;
  451. f.editArea.execCommand("toggle_off");
  452. }
  453. },
  454. // static function
  455. toggle_on : function(id){
  456. var fs=window.frames,f,t,selStart=0,selEnd=0,scrollTop=0,scrollLeft=0,curPos,elem;
  457. if(fs["frame_"+id])
  458. {
  459. f = fs["frame_"+id];
  460. t = eAs[id]["textarea"];
  461. area= f.editArea;
  462. area.textarea.value= t.value;
  463. // store display values;
  464. curPos = eAs[id]["settings"]["cursor_position"];
  465. if(t.use_last==true)
  466. {
  467. selStart = t.last_selectionStart;
  468. selEnd = t.last_selectionEnd;
  469. scrollTop = t.last_scrollTop;
  470. scrollLeft = t.last_scrollLeft;
  471. t.use_last=false;
  472. }
  473. else if( curPos == "auto" )
  474. {
  475. try{
  476. selStart = t.selectionStart;
  477. selEnd = t.selectionEnd;
  478. scrollTop = t.scrollTop;
  479. scrollLeft = t.scrollLeft;
  480. //alert(scrollTop);
  481. }catch(ex){}
  482. }
  483. // set to good size
  484. this.set_editarea_size_from_textarea(id, document.getElementById("frame_"+id));
  485. t.style.display="none";
  486. document.getElementById("frame_"+id).style.display="inline";
  487. area.execCommand("focus"); // without this focus opera doesn't manage well the iframe body height
  488. // restore display values
  489. eAs[id]["displayed"]=true;
  490. area.execCommand("update_size");
  491. f.document.getElementById("result").scrollTop= scrollTop;
  492. f.document.getElementById("result").scrollLeft= scrollLeft;
  493. area.area_select(selStart, selEnd-selStart);
  494. area.execCommand("toggle_on");
  495. }
  496. else
  497. {
  498. /* if(this.isIE)
  499. get_IE_selection(document.getElementById(id)); */
  500. elem= document.getElementById(id);
  501. elem.last_selectionStart= elem.selectionStart;
  502. elem.last_selectionEnd= elem.selectionEnd;
  503. elem.last_scrollTop= elem.scrollTop;
  504. elem.last_scrollLeft= elem.scrollLeft;
  505. elem.use_last=true;
  506. eAL.start(id);
  507. }
  508. },
  509. set_editarea_size_from_textarea : function(id, frame){
  510. var elem,width,height;
  511. elem = document.getElementById(id);
  512. width = Math.max(eAs[id]["settings"]["min_width"], elem.offsetWidth)+"px";
  513. height = Math.max(eAs[id]["settings"]["min_height"], elem.offsetHeight)+"px";
  514. if(elem.style.width.indexOf("%")!=-1)
  515. width = elem.style.width;
  516. if(elem.style.height.indexOf("%")!=-1)
  517. height = elem.style.height;
  518. //alert("h: "+height+" w: "+width);
  519. frame.style.width= width;
  520. frame.style.height= height;
  521. },
  522. set_base_url : function(){
  523. var t=this,elems,i,docBasePath;
  524. if( !this.baseURL ){
  525. elems = document.getElementsByTagName('script');
  526. for( i=0; i<elems.length; i++ ){
  527. if (elems[i].src && elems[i].src.match(/edit_area_[^\\\/]*$/i) ) {
  528. var src = unescape( elems[i].src ); // use unescape for utf-8 encoded urls
  529. src = src.substring(0, src.lastIndexOf('/'));
  530. this.baseURL = src;
  531. this.file_name= elems[i].src.substr(elems[i].src.lastIndexOf("/")+1);
  532. break;
  533. }
  534. }
  535. }
  536. docBasePath = document.location.href;
  537. if (docBasePath.indexOf('?') != -1)
  538. docBasePath = docBasePath.substring(0, docBasePath.indexOf('?'));
  539. docBasePath = docBasePath.substring(0, docBasePath.lastIndexOf('/'));
  540. // If not HTTP absolute
  541. if (t.baseURL.indexOf('://') == -1 && t.baseURL.charAt(0) != '/') {
  542. // If site absolute
  543. t.baseURL = docBasePath + "/" + t.baseURL;
  544. }
  545. t.baseURL +="/";
  546. },
  547. get_button_html : function(id, img, exec, isFileSpecific, baseURL) {
  548. var cmd,html;
  549. if(!baseURL)
  550. baseURL= this.baseURL;
  551. cmd = 'editArea.execCommand(\'' + exec + '\')';
  552. html = '<a id="a_'+ id +'" href="javascript:' + cmd + '" onclick="' + cmd + ';return false;" onmousedown="return false;" target="_self" fileSpecific="'+ (isFileSpecific?'yes':'no') +'">';
  553. html += '<img id="' + id + '" src="'+ baseURL +'images/' + img + '" title="{$' + id + '}" width="20" height="20" class="editAreaButtonNormal" onmouseover="editArea.switchClass(this,\'editAreaButtonOver\');" onmouseout="editArea.restoreClass(this);" onmousedown="editArea.restoreAndSwitchClass(this,\'editAreaButtonDown\');" /></a>';
  554. return html;
  555. },
  556. get_control_html : function(button_name, lang) {
  557. var t=this,i,but,html,si;
  558. for (i=0; i<t.advanced_buttons.length; i++)
  559. {
  560. but = t.advanced_buttons[i];
  561. if (but[0] == button_name)
  562. {
  563. return t.get_button_html(but[0], but[1], but[2], but[3]);
  564. }
  565. }
  566. switch (button_name){
  567. case "*":
  568. case "return":
  569. return "<br />";
  570. case "|":
  571. case "separator":
  572. return '<img src="'+ t.baseURL +'images/spacer.gif" width="1" height="15" class="editAreaSeparatorLine">';
  573. case "select_font":
  574. html= "<select id='area_font_size' onchange='javascript:editArea.execCommand(\"change_font_size\")' fileSpecific='yes'>";
  575. html+="<option value='-1'>{$font_size}</option>";
  576. si=[8,9,10,11,12,14];
  577. for( i=0;i<si.length;i++){
  578. html+="<option value='"+si[i]+"'>"+si[i]+" pt</option>";
  579. }
  580. html+="</select>";
  581. return html;
  582. case "syntax_selection":
  583. html= "<select id='syntax_selection' onchange='javascript:editArea.execCommand(\"change_syntax\", this.value)' fileSpecific='yes'>";
  584. html+="<option value='-1'>{$syntax_selection}</option>";
  585. html+="</select>";
  586. return html;
  587. }
  588. return "<span id='tmp_tool_"+button_name+"'>["+button_name+"]</span>";
  589. },
  590. get_template : function(){
  591. if(this.template=="")
  592. {
  593. var xhr_object = null;
  594. if(window.XMLHttpRequest) // Firefox
  595. xhr_object = new XMLHttpRequest();
  596. else if(window.ActiveXObject) // Internet Explorer
  597. xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  598. else { // XMLHttpRequest not supported
  599. alert("XMLHTTPRequest not supported. EditArea not loaded");
  600. return;
  601. }
  602. xhr_object.open("GET", this.baseURL+"template.html", false);
  603. xhr_object.send(null);
  604. if(xhr_object.readyState == 4)
  605. this.template=xhr_object.responseText;
  606. else
  607. this.has_error();
  608. }
  609. },
  610. // translate text
  611. translate : function(text, lang, mode){
  612. if(mode=="word")
  613. text=eAL.get_word_translation(text, lang);
  614. else if(mode="template"){
  615. eAL.current_language= lang;
  616. text=text.replace(/\{\$([^\}]+)\}/gm, eAL.translate_template);
  617. }
  618. return text;
  619. },
  620. translate_template : function(){
  621. return eAL.get_word_translation(EAL.prototype.translate_template.arguments[1], eAL.current_language);
  622. },
  623. get_word_translation : function(val, lang){
  624. var i;
  625. for( i in eAL.lang[lang]){
  626. if(i == val)
  627. return eAL.lang[lang][i];
  628. }
  629. return "_"+val;
  630. },
  631. load_script : function(url){
  632. var t=this,d=document,script,head;
  633. if( t.loadedFiles[url] )
  634. return;
  635. //alert("load: "+url);
  636. try{
  637. script= d.createElement("script");
  638. script.type= "text/javascript";
  639. script.src= url;
  640. script.charset= "UTF-8";
  641. d.getElementsByTagName("head")[0].appendChild(script);
  642. }catch(e){
  643. d.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '" charset="UTF-8"></sc'+'ript>');
  644. }
  645. t.loadedFiles[url] = true;
  646. },
  647. add_event : function(obj, name, handler) {
  648. try{
  649. if (obj.attachEvent) {
  650. obj.attachEvent("on" + name, handler);
  651. } else{
  652. obj.addEventListener(name, handler, false);
  653. }
  654. }catch(e){}
  655. },
  656. remove_event : function(obj, name, handler){
  657. try{
  658. if (obj.detachEvent)
  659. obj.detachEvent("on" + name, handler);
  660. else
  661. obj.removeEventListener(name, handler, false);
  662. }catch(e){}
  663. },
  664. // reset all the editareas in the form that have been reseted
  665. reset : function(e){
  666. var formObj,is_child,i,x;
  667. formObj = eAL.isIE ? window.event.srcElement : e.target;
  668. if(formObj.tagName!='FORM')
  669. formObj= formObj.form;
  670. for( i in eAs ){
  671. is_child= false;
  672. for( x=0;x<formObj.elements.length;x++ ) {
  673. if(formObj.elements[x].id == i)
  674. is_child=true;
  675. }
  676. if(window.frames["frame_"+i] && is_child && eAs[i]["displayed"]==true){
  677. var exec= 'window.frames["frame_'+ i +'"].editArea.textarea.value= document.getElementById("'+ i +'").value;';
  678. exec+= 'window.frames["frame_'+ i +'"].editArea.execCommand("focus");';
  679. exec+= 'window.frames["frame_'+ i +'"].editArea.check_line_selection();';
  680. exec+= 'window.frames["frame_'+ i +'"].editArea.execCommand("reset");';
  681. window.setTimeout(exec, 10);
  682. }
  683. }
  684. return;
  685. },
  686. // prepare all the textarea replaced by an editarea to be submited
  687. submit : function(e){
  688. var formObj,is_child,fs=window.frames,i,x;
  689. formObj = eAL.isIE ? window.event.srcElement : e.target;
  690. if(formObj.tagName!='FORM')
  691. formObj= formObj.form;
  692. for( i in eAs){
  693. is_child= false;
  694. for( x=0;x<formObj.elements.length;x++ ) {
  695. if(formObj.elements[x].id == i)
  696. is_child=true;
  697. }
  698. if(is_child)
  699. {
  700. if(fs["frame_"+i] && eAs[i]["displayed"]==true)
  701. document.getElementById(i).value= fs["frame_"+ i].editArea.textarea.value;
  702. eAL.execCommand(i,"EA_submit");
  703. }
  704. }
  705. if( typeof(formObj.edit_area_replaced_submit) == "function" ){
  706. res= formObj.edit_area_replaced_submit();
  707. if(res==false){
  708. if(eAL.isIE)
  709. return false;
  710. else
  711. e.preventDefault();
  712. }
  713. }
  714. return;
  715. },
  716. // allow to get the value of the editarea
  717. getValue : function(id){
  718. if(window.frames["frame_"+id] && eAs[id]["displayed"]==true){
  719. return window.frames["frame_"+ id].editArea.textarea.value;
  720. }else if(elem=document.getElementById(id)){
  721. return elem.value;
  722. }
  723. return false;
  724. },
  725. // allow to set the value of the editarea
  726. setValue : function(id, new_val){
  727. var fs=window.frames;
  728. if( ( f=fs["frame_"+id] ) && eAs[id]["displayed"]==true){
  729. f.editArea.textarea.value= new_val;
  730. f.editArea.execCommand("focus");
  731. f.editArea.check_line_selection(false);
  732. f.editArea.execCommand("onchange");
  733. }else if(elem=document.getElementById(id)){
  734. elem.value= new_val;
  735. }
  736. },
  737. // allow to get infos on the selection: array(start, end)
  738. getSelectionRange : function(id){
  739. var sel,eA,fs=window.frames;
  740. sel= {"start": 0, "end": 0};
  741. if(fs["frame_"+id] && eAs[id]["displayed"]==true){
  742. eA= fs["frame_"+ id].editArea;
  743. sel["start"] = eA.textarea.selectionStart;
  744. sel["end"] = eA.textarea.selectionEnd;
  745. }else if( elem=document.getElementById(id) ){
  746. sel= getSelectionRange(elem);
  747. }
  748. return sel;
  749. },
  750. // allow to set the selection with the given start and end positions
  751. setSelectionRange : function(id, new_start, new_end){
  752. var fs=window.frames;
  753. if(fs["frame_"+id] && eAs[id]["displayed"]==true){
  754. fs["frame_"+ id].editArea.area_select(new_start, new_end-new_start);
  755. // make an auto-scroll to the selection
  756. if(!this.isIE){
  757. fs["frame_"+ id].editArea.check_line_selection(false);
  758. fs["frame_"+ id].editArea.scroll_to_view();
  759. }
  760. }else if(elem=document.getElementById(id)){
  761. setSelectionRange(elem, new_start, new_end);
  762. }
  763. },
  764. getSelectedText : function(id){
  765. var sel= this.getSelectionRange(id);
  766. return this.getValue(id).substring(sel["start"], sel["end"]);
  767. },
  768. setSelectedText : function(id, new_val){
  769. var fs=window.frames,d=document,sel,text,scrollTop,scrollLeft,new_sel_end;
  770. new_val = new_val.replace(/\r/g, "");
  771. sel = this.getSelectionRange(id);
  772. text = this.getValue(id);
  773. if(fs["frame_"+id] && eAs[id]["displayed"]==true){
  774. scrollTop = fs["frame_"+ id].document.getElementById("result").scrollTop;
  775. scrollLeft = fs["frame_"+ id].document.getElementById("result").scrollLeft;
  776. }else{
  777. scrollTop = d.getElementById(id).scrollTop;
  778. scrollLeft = d.getElementById(id).scrollLeft;
  779. }
  780. text = text.substring(0, sel["start"])+ new_val +text.substring(sel["end"]);
  781. this.setValue(id, text);
  782. new_sel_end = sel["start"]+ new_val.length;
  783. this.setSelectionRange(id, sel["start"], new_sel_end);
  784. // fix \r problem for selection length count on IE & Opera
  785. if(new_val != this.getSelectedText(id).replace(/\r/g, "")){
  786. this.setSelectionRange(id, sel["start"], new_sel_end+ new_val.split("\n").length -1);
  787. }
  788. // restore scrolling position
  789. if(fs["frame_"+id] && eAs[id]["displayed"]==true){
  790. fs["frame_"+ id].document.getElementById("result").scrollTop= scrollTop;
  791. fs["frame_"+ id].document.getElementById("result").scrollLeft= scrollLeft;
  792. fs["frame_"+ id].editArea.execCommand("onchange");
  793. }else{
  794. d.getElementById(id).scrollTop= scrollTop;
  795. d.getElementById(id).scrollLeft= scrollLeft;
  796. }
  797. },
  798. insertTags : function(id, open_tag, close_tag){
  799. var old_sel,new_sel;
  800. old_sel = this.getSelectionRange(id);
  801. text = open_tag + this.getSelectedText(id) + close_tag;
  802. eAL.setSelectedText(id, text);
  803. new_sel = this.getSelectionRange(id);
  804. if(old_sel["end"] > old_sel["start"]) // if text was selected, cursor at the end
  805. this.setSelectionRange(id, new_sel["end"], new_sel["end"]);
  806. else // cursor in the middle
  807. this.setSelectionRange(id, old_sel["start"]+open_tag.length, old_sel["start"]+open_tag.length);
  808. },
  809. // hide both EditArea and normal textarea
  810. hide : function(id){
  811. var fs= window.frames,d=document,t=this,scrollTop,scrollLeft,span;
  812. if(d.getElementById(id) && !t.hidden[id])
  813. {
  814. t.hidden[id]= {};
  815. t.hidden[id]["selectionRange"]= t.getSelectionRange(id);
  816. if(d.getElementById(id).style.display!="none")
  817. {
  818. t.hidden[id]["scrollTop"]= d.getElementById(id).scrollTop;
  819. t.hidden[id]["scrollLeft"]= d.getElementById(id).scrollLeft;
  820. }
  821. if(fs["frame_"+id])
  822. {
  823. t.hidden[id]["toggle"]= eAs[id]["displayed"];
  824. if(fs["frame_"+id] && eAs[id]["displayed"]==true){
  825. scrollTop = fs["frame_"+ id].document.getElementById("result").scrollTop;
  826. scrollLeft = fs["frame_"+ id].document.getElementById("result").scrollLeft;
  827. }else{
  828. scrollTop = d.getElementById(id).scrollTop;
  829. scrollLeft = d.getElementById(id).scrollLeft;
  830. }
  831. t.hidden[id]["scrollTop"]= scrollTop;
  832. t.hidden[id]["scrollLeft"]= scrollLeft;
  833. if(eAs[id]["displayed"]==true)
  834. eAL.toggle_off(id);
  835. }
  836. // hide toggle button and debug box
  837. span= d.getElementById("EditAreaArroundInfos_"+id);
  838. if(span){
  839. span.style.display='none';
  840. }
  841. // hide textarea
  842. d.getElementById(id).style.display= "none";
  843. }
  844. },
  845. // restore hidden EditArea and normal textarea
  846. show : function(id){
  847. var fs= window.frames,d=document,t=this,span;
  848. if((elem=d.getElementById(id)) && t.hidden[id])
  849. {
  850. elem.style.display= "inline";
  851. elem.scrollTop= t.hidden[id]["scrollTop"];
  852. elem.scrollLeft= t.hidden[id]["scrollLeft"];
  853. span= d.getElementById("EditAreaArroundInfos_"+id);
  854. if(span){
  855. span.style.display='inline';
  856. }
  857. if(fs["frame_"+id])
  858. {
  859. // restore toggle button and debug box
  860. // restore textarea
  861. elem.style.display= "inline";
  862. // restore EditArea
  863. if(t.hidden[id]["toggle"]==true)
  864. eAL.toggle_on(id);
  865. scrollTop = t.hidden[id]["scrollTop"];
  866. scrollLeft = t.hidden[id]["scrollLeft"];
  867. if(fs["frame_"+id] && eAs[id]["displayed"]==true){
  868. fs["frame_"+ id].document.getElementById("result").scrollTop = scrollTop;
  869. fs["frame_"+ id].document.getElementById("result").scrollLeft = scrollLeft;
  870. }else{
  871. elem.scrollTop = scrollTop;
  872. elem.scrollLeft = scrollLeft;
  873. }
  874. }
  875. // restore selection
  876. sel = t.hidden[id]["selectionRange"];
  877. t.setSelectionRange(id, sel["start"], sel["end"]);
  878. delete t.hidden[id];
  879. }
  880. },
  881. // get the current file datas (for multi file editing mode)
  882. getCurrentFile : function(id){
  883. return this.execCommand(id, 'get_file', this.execCommand(id, 'curr_file'));
  884. },
  885. // get the given file datas (for multi file editing mode)
  886. getFile : function(id, file_id){
  887. return this.execCommand(id, 'get_file', file_id);
  888. },
  889. // get all the openned files datas (for multi file editing mode)
  890. getAllFiles : function(id){
  891. return this.execCommand(id, 'get_all_files()');
  892. },
  893. // open a file (for multi file editing mode)
  894. openFile : function(id, file_infos){
  895. return this.execCommand(id, 'open_file', file_infos);
  896. },
  897. // close the given file (for multi file editing mode)
  898. closeFile : function(id, file_id){
  899. return this.execCommand(id, 'close_file', file_id);
  900. },
  901. // close the given file (for multi file editing mode)
  902. setFileEditedMode : function(id, file_id, to){
  903. var reg1,reg2;
  904. reg1 = new RegExp('\\\\', 'g');
  905. reg2 = new RegExp('"', 'g');
  906. return this.execCommand(id, 'set_file_edited_mode("'+ file_id.replace(reg1, '\\\\').replace(reg2, '\\"') +'", '+ to +')');
  907. },
  908. // allow to access to editarea functions and datas (for advanced users only)
  909. execCommand : function(id, cmd, fct_param){
  910. switch(cmd){
  911. case "EA_init":
  912. if(eAs[id]['settings']["EA_init_callback"].length>0)
  913. eval(eAs[id]['settings']["EA_init_callback"]+"('"+ id +"');");
  914. break;
  915. case "EA_delete":
  916. if(eAs[id]['settings']["EA_delete_callback"].length>0)
  917. eval(eAs[id]['settings']["EA_delete_callback"]+"('"+ id +"');");
  918. break;
  919. case "EA_submit":
  920. if(eAs[id]['settings']["submit_callback"].length>0)
  921. eval(eAs[id]['settings']["submit_callback"]+"('"+ id +"');");
  922. break;
  923. }
  924. if(window.frames["frame_"+id] && window.frames["frame_"+ id].editArea){
  925. if(fct_param!=undefined)
  926. return eval('window.frames["frame_'+ id +'"].editArea.'+ cmd +'(fct_param);');
  927. else
  928. return eval('window.frames["frame_'+ id +'"].editArea.'+ cmd +';');
  929. }
  930. return false;
  931. }
  932. };
  933. var eAL= new EAL();
  934. var eAs= {};
  935. /****
  936. * This page contains some general usefull functions for javascript
  937. *
  938. ****/
  939. // need to redefine this functiondue to IE problem
  940. function getAttribute( elm, aName ) {
  941. var aValue,taName,i;
  942. try{
  943. aValue = elm.getAttribute( aName );
  944. }catch(exept){}
  945. if( ! aValue ){
  946. for( i = 0; i < elm.attributes.length; i ++ ) {
  947. taName = elm.attributes[i] .name.toLowerCase();
  948. if( taName == aName ) {
  949. aValue = elm.attributes[i] .value;
  950. return aValue;
  951. }
  952. }
  953. }
  954. return aValue;
  955. };
  956. // need to redefine this function due to IE problem
  957. function setAttribute( elm, attr, val ) {
  958. if(attr=="class"){
  959. elm.setAttribute("className", val);
  960. elm.setAttribute("class", val);
  961. }else{
  962. elm.setAttribute(attr, val);
  963. }
  964. };
  965. /* return a child element
  966. elem: element we are searching in
  967. elem_type: type of the eleemnt we are searching (DIV, A, etc...)
  968. elem_attribute: attribute of the searched element that must match
  969. elem_attribute_match: value that elem_attribute must match
  970. option: "all" if must return an array of all children, otherwise return the first match element
  971. depth: depth of search (-1 or no set => unlimited)
  972. */
  973. function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth)
  974. {
  975. if(!option)
  976. var option="single";
  977. if(!depth)
  978. var depth=-1;
  979. if(elem){
  980. var children= elem.childNodes;
  981. var result=null;
  982. var results= [];
  983. for (var x=0;x<children.length;x++) {
  984. strTagName = new String(children[x].tagName);
  985. children_class="?";
  986. if(strTagName!= "undefined"){
  987. child_attribute= getAttribute(children[x],elem_attribute);
  988. if((strTagName.toLowerCase()==elem_type.toLowerCase() || elem_type=="") && (elem_attribute=="" || child_attribute==elem_attribute_match)){
  989. if(option=="all"){
  990. results.push(children[x]);
  991. }else{
  992. return children[x];
  993. }
  994. }
  995. if(depth!=0){
  996. result=getChildren(children[x], elem_type, elem_attribute, elem_attribute_match, option, depth-1);
  997. if(option=="all"){
  998. if(result.length>0){
  999. results= results.concat(result);
  1000. }
  1001. }else if(result!=null){
  1002. return result;
  1003. }
  1004. }
  1005. }
  1006. }
  1007. if(option=="all")
  1008. return results;
  1009. }
  1010. return null;
  1011. };
  1012. function isChildOf(elem, parent){
  1013. if(elem){
  1014. if(elem==parent)
  1015. return true;
  1016. while(elem.parentNode != 'undefined'){
  1017. return isChildOf(elem.parentNode, parent);
  1018. }
  1019. }
  1020. return false;
  1021. };
  1022. function getMouseX(e){
  1023. if(e!=null && typeof(e.pageX)!="undefined"){
  1024. return e.pageX;
  1025. }else{
  1026. return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;
  1027. }
  1028. };
  1029. function getMouseY(e){
  1030. if(e!=null && typeof(e.pageY)!="undefined"){
  1031. return e.pageY;
  1032. }else{
  1033. return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;
  1034. }
  1035. };
  1036. function calculeOffsetLeft(r){
  1037. return calculeOffset(r,"offsetLeft")
  1038. };
  1039. function calculeOffsetTop(r){
  1040. return calculeOffset(r,"offsetTop")
  1041. };
  1042. function calculeOffset(element,attr){
  1043. var offset=0;
  1044. while(element){
  1045. offset+=element[attr];
  1046. element=element.offsetParent
  1047. }
  1048. return offset;
  1049. };
  1050. /** return the computed style
  1051. * @param: elem: the reference to the element
  1052. * @param: prop: the name of the css property
  1053. */
  1054. function get_css_property(elem, prop)
  1055. {
  1056. if(document.defaultView)
  1057. {
  1058. return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);
  1059. }
  1060. else if(elem.currentStyle)
  1061. {
  1062. var prop = prop.replace(/-\D/gi, function(sMatch)
  1063. {
  1064. return sMatch.charAt(sMatch.length - 1).toUpperCase();
  1065. });
  1066. return elem.currentStyle[prop];
  1067. }
  1068. else return null;
  1069. }
  1070. /****
  1071. * Moving an element
  1072. ***/
  1073. var _mCE; // currently moving element
  1074. /* allow to move an element in a window
  1075. e: the event
  1076. id: the id of the element
  1077. frame: the frame of the element
  1078. ex of use:
  1079. in html: <img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["this_frame_id"]);' .../>
  1080. or
  1081. in javascript: document.getElementById("my_div").onmousedown= start_move_element
  1082. */
  1083. function start_move_element(e, id, frame){
  1084. var elem_id=(e.target || e.srcElement).id;
  1085. if(id)
  1086. elem_id=id;
  1087. if(!frame)
  1088. frame=window;
  1089. if(frame.event)
  1090. e=frame.event;
  1091. _mCE= frame.document.getElementById(elem_id);
  1092. _mCE.frame=frame;
  1093. frame.document.onmousemove= move_element;
  1094. frame.document.onmouseup= end_move_element;
  1095. /*_mCE.onmousemove= move_element;
  1096. _mCE.onmouseup= end_move_element;*/
  1097. //alert(_mCE.frame.document.body.offsetHeight);
  1098. mouse_x= getMouseX(e);
  1099. mouse_y= getMouseY(e);
  1100. //window.status=frame+ " elem: "+elem_id+" elem: "+ _mCE + " mouse_x: "+mouse_x;
  1101. _mCE.start_pos_x = mouse_x - (_mCE.style.left.replace("px","") || calculeOffsetLeft(_mCE));
  1102. _mCE.start_pos_y = mouse_y - (_mCE.style.top.replace("px","") || calculeOffsetTop(_mCE));
  1103. return false;
  1104. };
  1105. function end_move_element(e){
  1106. _mCE.frame.document.onmousemove= "";
  1107. _mCE.frame.document.onmouseup= "";
  1108. _mCE=null;
  1109. };
  1110. function move_element(e){
  1111. var newTop,newLeft,maxLeft;
  1112. if( _mCE.frame && _mCE.frame.event )
  1113. e=_mCE.frame.event;
  1114. newTop = getMouseY(e) - _mCE.start_pos_y;
  1115. newLeft = getMouseX(e) - _mCE.start_pos_x;
  1116. maxLeft = _mCE.frame.document.body.offsetWidth- _mCE.offsetWidth;
  1117. max_top = _mCE.frame.document.body.offsetHeight- _mCE.offsetHeight;
  1118. newTop = Math.min(Math.max(0, newTop), max_top);
  1119. newLeft = Math.min(Math.max(0, newLeft), maxLeft);
  1120. _mCE.style.top = newTop+"px";
  1121. _mCE.style.left = newLeft+"px";
  1122. return false;
  1123. };
  1124. /***
  1125. * Managing a textarea (this part need the navigator infos from eAL
  1126. ***/
  1127. var nav= eAL.nav;
  1128. // allow to get infos on the selection: array(start, end)
  1129. function getSelectionRange(textarea){
  1130. return {"start": textarea.selectionStart, "end": textarea.selectionEnd};
  1131. };
  1132. // allow to set the selection
  1133. function setSelectionRange(t, start, end){
  1134. t.focus();
  1135. start = Math.max(0, Math.min(t.value.length, start));
  1136. end = Math.max(start, Math.min(t.value.length, end));
  1137. if( nav.isOpera && nav.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end
  1138. t.selectionEnd = 1;
  1139. t.selectionStart = 0;
  1140. t.selectionEnd = 1;
  1141. t.selectionStart = 0;
  1142. }
  1143. t.selectionStart = start;
  1144. t.selectionEnd = end;
  1145. //textarea.setSelectionRange(start, end);
  1146. if(nav.isIE)
  1147. set_IE_selection(t);
  1148. };
  1149. // set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task
  1150. function get_IE_selection(t){
  1151. var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;
  1152. if(t && t.focused)
  1153. {
  1154. if(!t.ea_line_height)
  1155. { // calculate the lineHeight
  1156. div= d.createElement("div");
  1157. div.style.fontFamily= get_css_property(t, "font-family");
  1158. div.style.fontSize= get_css_property(t, "font-size");
  1159. div.style.visibility= "hidden";
  1160. div.innerHTML="0";
  1161. d.body.appendChild(div);
  1162. t.ea_line_height= div.offsetHeight;
  1163. d.body.removeChild(div);
  1164. }
  1165. //t.focus();
  1166. range = d.selection.createRange();
  1167. try
  1168. {
  1169. stored_range = range.duplicate();
  1170. stored_range.moveToElementText( t );
  1171. stored_range.setEndPoint( 'EndToEnd', range );
  1172. if(stored_range.parentElement() == t){
  1173. // the range don't take care of empty lines in the end of the selection
  1174. elem = t;
  1175. scrollTop = 0;
  1176. while(elem.parentNode){
  1177. scrollTop+= elem.scrollTop;
  1178. elem = elem.parentNode;
  1179. }
  1180. // var scrollTop= t.scrollTop + document.body.scrollTop;
  1181. // var relative_top= range.offsetTop - calculeOffsetTop(t) + scrollTop;
  1182. relative_top= range.offsetTop - calculeOffsetTop(t)+ scrollTop;
  1183. // alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(t) +"\nrelativeTop: "+ relative_top);
  1184. line_start = Math.round((relative_top / t.ea_line_height) +1);
  1185. line_nb = Math.round(range.boundingHeight / t.ea_line_height);
  1186. range_start = stored_range.text.length - range.text.length;
  1187. tab = t.value.substr(0, range_start).split("\n");
  1188. range_start += (line_start - tab.length)*2; // add missing empty lines to the selection
  1189. t.selectionStart = range_start;
  1190. range_end = t.selectionStart + range.text.length;
  1191. tab = t.value.substr(0, range_start + range.text.length).split("\n");
  1192. range_end += (line_start + line_nb - 1 - tab.length)*2;
  1193. t.selectionEnd = range_end;
  1194. }
  1195. }
  1196. catch(e){}
  1197. }
  1198. if( t && t.id )
  1199. {
  1200. setTimeout("get_IE_selection(document.getElementById('"+ t.id +"'));", 50);
  1201. }
  1202. };
  1203. function IE_textarea_focus(){
  1204. event.srcElement.focused= true;
  1205. }
  1206. function IE_textarea_blur(){
  1207. event.srcElement.focused= false;
  1208. }
  1209. // select the text for IE (take into account the \r difference)
  1210. function set_IE_selection( t ){
  1211. var nbLineStart,nbLineStart,nbLineEnd,range;
  1212. if(!window.closed){
  1213. nbLineStart=t.value.substr(0, t.selectionStart).split("\n").length - 1;
  1214. nbLineEnd=t.value.substr(0, t.selectionEnd).split("\n").length - 1;
  1215. try
  1216. {
  1217. range = document.selection.createRange();
  1218. range.moveToElementText( t );
  1219. range.setEndPoint( 'EndToStart', range );
  1220. range.moveStart('character', t.selectionStart - nbLineStart);
  1221. range.moveEnd('character', t.selectionEnd - nbLineEnd - (t.selectionStart - nbLineStart) );
  1222. range.select();
  1223. }
  1224. catch(e){}
  1225. }
  1226. };
  1227. eAL.waiting_loading["elements_functions.js"]= "loaded";
  1228. EAL.prototype.start_resize_area= function(){
  1229. var d=document,a,div,width,height,father;
  1230. d.onmouseup= eAL.end_resize_area;
  1231. d.onmousemove= eAL.resize_area;
  1232. eAL.toggle(eAL.resize["id"]);
  1233. a = eAs[eAL.resize["id"]]["textarea"];
  1234. div = d.getElementById("edit_area_resize");
  1235. if(!div){
  1236. div= d.createElement("div");
  1237. div.id="edit_area_resize";
  1238. div.style.border="dashed #888888 1px";
  1239. }
  1240. width = a.offsetWidth -2;
  1241. height = a.offsetHeight -2;
  1242. div.style.display = "block";
  1243. div.style.width = width+"px";
  1244. div.style.height = height+"px";
  1245. father= a.parentNode;
  1246. father.insertBefore(div, a);
  1247. a.style.display="none";
  1248. eAL.resize["start_top"]= calculeOffsetTop(div);
  1249. eAL.resize["start_left"]= calculeOffsetLeft(div);
  1250. };
  1251. EAL.prototype.end_resize_area= function(e){
  1252. var d=document,div,a,width,height;
  1253. d.onmouseup="";
  1254. d.onmousemove="";
  1255. div = d.getElementById("edit_area_resize");
  1256. a= eAs[eAL.resize["id"]]["textarea"];
  1257. width = Math.max(eAs[eAL.resize["id"]]["settings"]["min_width"], div.offsetWidth-4);
  1258. height = Math.max(eAs[eAL.resize["id"]]["settings"]["min_height"], div.offsetHeight-4);
  1259. if(eAL.isIE==6){
  1260. width-=2;
  1261. height-=2;
  1262. }
  1263. a.style.width = width+"px";
  1264. a.style.height = height+"px";
  1265. div.style.display = "none";
  1266. a.style.display = "inline";
  1267. a.selectionStart = eAL.resize["selectionStart"];
  1268. a.selectionEnd = eAL.resize["selectionEnd"];
  1269. eAL.toggle(eAL.resize["id"]);
  1270. return false;
  1271. };
  1272. EAL.prototype.resize_area= function(e){
  1273. var allow,newHeight,newWidth;
  1274. allow = eAs[eAL.resize["id"]]["settings"]["allow_resize"];
  1275. if(allow=="both" || allow=="y")
  1276. {
  1277. newHeight = Math.max(20, getMouseY(e)- eAL.resize["start_top"]);
  1278. document.getElementById("edit_area_resize").style.height= newHeight+"px";
  1279. }
  1280. if(allow=="both" || allow=="x")
  1281. {
  1282. newWidth= Math.max(20, getMouseX(e)- eAL.resize["start_left"]);
  1283. document.getElementById("edit_area_resize").style.width= newWidth+"px";
  1284. }
  1285. return false;
  1286. };
  1287. eAL.waiting_loading["resize_area.js"]= "loaded";
  1288. EAL.prototype.get_regexp= function(text_array){
  1289. //res="( |=|\\n|\\r|\\[|\\(|ľ|)(";
  1290. res="(\\b)(";
  1291. for(i=0; i<text_array.length; i++){
  1292. if(i>0)
  1293. res+="|";
  1294. //res+="("+ tab_text[i] +")";
  1295. //res+=tab_text[i].replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\{|\})/g, "\\$1");
  1296. res+=this.get_escaped_regexp(text_array[i]);
  1297. }
  1298. //res+=")( |\\.|:|\\{|\\(|\\)|\\[|\\]|\'|\"|\\r|\\n|\\t|$)";
  1299. res+=")(\\b)";
  1300. reg= new RegExp(res);
  1301. return res;
  1302. };
  1303. EAL.prototype.get_escaped_regexp= function(str){
  1304. return str.toStrin

Large files files are truncated, but you can click here to view the full file