editor.js
上传用户:shjujing
上传日期:2022-07-28
资源大小:11244k
文件大小:33k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // Images Dir Path
  2. var imagesDir = "editor/icons/";
  3. // fonts setting
  4. var Fonts = new Array("宋体","黑体","仿宋_gb2312","幼圆","楷体_gb2312","Arial","Sans Serif","Tahoma","Verdana","Courier New","Georgia","Times New Roman","Impact","Comic Sans MS");
  5. // use this buttons
  6. var buttonNameGroup = new Array
  7. (
  8.   ["ForeColor","BackColor","Bold", "Italic", "Underline","StrikeThrough","Subscript","Superscript","RemoveFormat"],
  9. ["JustifyLeft", "JustifyCenter", "JustifyRight"],
  10. ["InsertUnorderedList","InsertOrderedList","Outdent","Indent","Help"],
  11. ["CreateLink","Unlink"], 
  12. ["InsertTable","InsertRow","DeleteRow","InsertColumn","DeleteColumn"],
  13. ["InsertImage","InsertFlash","InsertVideo"],
  14. ["Undo", "Redo"],
  15. ["SelectAll","Cut", "Copy", "Paste","PasteText"],
  16. ["InsertHorizontalRule","specialchar","Quote","Code","replace"]
  17. );
  18. // all buttons can be used
  19. var ToolbarList = {
  20. //Name            buttonTitle buttonImage HTML Code
  21. "Bold":           ['粗体', imagesDir + 'bold.gif', '<strong>*</strong>'],
  22. "Italic":         ['斜体', imagesDir + 'italics.gif', '<em>*</em>'],
  23. "Underline":      ['下划线', imagesDir + 'underline.gif', '<u>*</u>'],
  24. "StrikeThrough":  ['删除线', imagesDir + 'strikethrough.gif', '<strike>*</strike>'],
  25. "Seperator":      ['', imagesDir + 'seperator.gif', ''],
  26. "Subscript":      ['上标', imagesDir + 'subscript.gif', '<sub>*</sub>'],
  27. "Superscript":    ['下标', imagesDir + 'superscript.gif', '<sup>*</sup>'],
  28. "JustifyLeft":    ['左对齐', imagesDir + 'justify_left.gif', '<div align="left">*</div>'],
  29. "JustifyCenter":  ['居中对齐', imagesDir + 'justify_center.gif', '<div align="center">*</div>'],
  30. "JustifyRight":   ['右对齐', imagesDir + 'justify_right.gif', '<div align="right">*</div>'],
  31. "InsertUnorderedList":['非排序列表', imagesDir + 'list_unordered.gif', ''],
  32. "InsertOrderedList":['排序列表', imagesDir + 'list_ordered.gif', ''],
  33. "Outdent":        ['减少缩进', imagesDir + 'outdent.gif', false],
  34. "Indent":         ['增加缩进', imagesDir + 'indent.gif', '<blockquote>*</blockquote>'],
  35. "RemoveFormat":   ['清除格式', imagesDir + 'removeformat.gif', ''],
  36. "Cut":            ['剪切', imagesDir + 'cut.gif', true],
  37. "Copy":           ['复制', imagesDir + 'copy.gif', true],
  38. "Paste":          ['粘贴', imagesDir + 'paste.gif', true],
  39. "PasteText":      ['纯文本粘贴', imagesDir + 'pasteText.gif', true],
  40. "ForeColor":      ['颜色', imagesDir + 'forecolor.gif', ''],
  41. "BackColor":      ['背景色', imagesDir + 'backcolor.gif', ''],
  42. "Undo":           ['撤消', imagesDir + 'undo.gif', true],
  43. "Redo":           ['重做', imagesDir + 'redo.gif', true],
  44. "InsertTable":   ['插入表格', imagesDir + 'table.gif', ''],
  45. "InsertRow":   ['插入行', imagesDir + 'InsertRow.gif', ''],
  46. "DeleteRow":   ['删除行', imagesDir + 'DeleteRow.gif', ''],
  47. "InsertColumn":   ['插入列', imagesDir + 'InsertColumn.gif', ''],
  48. "DeleteColumn":   ['删除列', imagesDir + 'DeleteColumn.gif', ''],
  49. "InsertImage":    ['插入图片', imagesDir + 'insert_picture.gif', ''],
  50. "InsertFlash":    ['插入Flash', imagesDir + 'insert_flash.gif', ''],
  51. "InsertVideo":    ['插入视频', imagesDir + 'insert_video.gif', ''],
  52. "CreateLink":     ['链接', imagesDir + 'insert_hyperlink.gif', ''],
  53. "Unlink":   ['取消链接', imagesDir + 'unlink.gif', ''],
  54. "SelectFont":     ['选择字体', imagesDir + 'select_font.gif', ''],
  55. "SelectSize":     ['选择大小', imagesDir + 'select_size.gif', ''],
  56. "InsertHorizontalRule":['插入水平线', imagesDir + 'hr.gif', '*<hr>'],
  57. "SelectAll":   ['全选', imagesDir + 'SelectAll.gif', true],
  58. "specialchar":   ['插入特殊符号', imagesDir + 'specialchar.gif', ''],
  59. "Quote":   ['插入引用', imagesDir + 'quote.gif', '<div class="Quote">*</div>'],
  60. "Code":   ['插入代码', imagesDir + 'code.gif', '<div class="Code">*</div>'],
  61. "replace":   ['替换', imagesDir + 'replace.gif', ''] ,
  62. "Help":   ['帮助', imagesDir + 'help.gif', '']
  63. };
  64. document.write('<link href="'+imagesDir+'editorstyle.css" rel="stylesheet" type="text/css">');
  65. var viewSourceMode = new Array();
  66. var isIE = document.all;
  67. var dropdownID = null;
  68. function oo(ID){
  69. return document.getElementById(ID);
  70. }
  71. String.prototype.trim=function(){return this.replace(/(^s*)|(s*$)/g,"");}
  72. function createEditor(n,outPutObject,_myeditor_Width,_myeditor_Height) {
  73. viewSourceMode[n] = 0;
  74. var toolbar = '<table cellpadding="1" cellspacing="0" border="0" width="100%" id="toolBar_'+n+'" unselectable="on" style="width:' + _myeditor_Width + ';"><tr><td unselectable="on" class="editor_toolbar">';
  75. for(var i=0; i<buttonNameGroup.length;i++) {
  76. if(buttonNameGroup[i]==='') {
  77. toolbar += '<div class="toolbarnewline"></div>';
  78. continue;
  79. }
  80. toolbar += '<div class="toolbarblock"><table cellpadding="0" cellspacing="0" border="0"><tr><td><img src="' +ToolbarList["Seperator"][1]+ '" border=0></td>';
  81. if(i==0){
  82. toolbar += '<td><span id="FontSelect' + n + '" class="editor_select_off"></span></td>';
  83. toolbar += '<td><span id="FontSizes'  + n + '" class="editor_select_off"></span></td>';
  84. }
  85. var buttonName = buttonNameGroup[i];
  86.      for(var j=0; j<buttonName.length; j++){
  87. var buttonID = buttonName[j];
  88.      var buttonObj  = ToolbarList[buttonID];
  89.       var buttonTitle         = buttonObj[0];
  90.         var buttonImage         = buttonObj[1];
  91.      toolbar += '<td width=22><span id="' + n + '_' + buttonID + '_exp" class="button" nowClassName="button" onClick="formatText(''+buttonID+'','' + n + '');" onmouseover="this.className='buttonOver'; " onmouseout="this.className=this.nowClassName;"><img src="' +buttonImage+ '" border=0 title="' +buttonTitle+ '" id="' + n + '_' + buttonID+ '" width="20" height="20"></span></td>';
  92. }
  93. toolbar += "</tr></table></div>";
  94. }
  95. toolbar += '</td></tr></table>';
  96. var iframe = '<table cellpadding="0" cellspacing="0" border="0" class="editor_content"><tr><td valign="top" id="_parent_of_'+n+'" style="width:' + _myeditor_Width + '; height:' + _myeditor_Height + ';">n'
  97.    + '<iframe frameborder="0"  id="_myeditor_' + n + '" onmouseout="autoGetHTML(''+outPutObject+'',''+n+'')" scrolling="auto" style="width:100%; height:' + _myeditor_Height + '; margin:1px;"></iframe>n'
  98.    + '<textarea name="' + n + '" id="' + n + '" onmouseout="autoGetSourceHTML(''+outPutObject+'',''+n+'')"  style="width:100%; height:' + _myeditor_Height + ';display:none; border:0px; margin:0px; font-size:12px; font-family:Courier New,verdana; background-color:#F9F9F9"></textarea>'
  99. + '</td></tr></table>n';
  100. var modebuttons = '<table cellpadding="0" cellspacing="0" border="0"><tr><td valign="top" style="width:' + _myeditor_Width + ';">n'
  101. + '<div class="modebutton modebutton_on" id="HTMLMode_'+n+'" unselectable="on" onclick="viewHTML(''+n+'')"><img src="'+imagesDir+'mode_design.gif" align="absmiddle" /> 所见即所得模式</div>'
  102. + '<div class="modebutton modebutton_off" id="SourceMode_'+n+'" unselectable="on" onclick="viewSource(''+n+'')"><img src="'+imagesDir+'mode_source.gif" align="absmiddle" />HTML代码模式</div>'
  103. + '<div class="modebutton modebutton_off" unselectable="on" onclick="preview_content(''+n+'')"><img src="'+imagesDir+'preview.gif" align="absmiddle" /> 预览</div>'
  104. + '<img src="'+imagesDir+'content_expand.gif" alt="扩展编辑框" onClick="editor_resize(''+n+'',+100)" class="expand_button">'
  105. + '<img src="'+imagesDir+'content_contract.gif" alt="收缩编辑框" onClick="editor_resize(''+n+'',-100)" class="expand_button">'
  106. + '</td></tr></table>n';
  107.    document.write('<table cellpadding="0" cellspacing="0" border="0"><tr><td class="editor_table">' + toolbar + iframe + modebuttons + '</td></tr></table>');
  108. outputFontSelect(n);
  109. outputFontSizes(n); 
  110. outputColor('ForeColor',n); 
  111. outputColor('BackColor',n); 
  112. var doc = oo("_myeditor_" + n).contentWindow.document;
  113. doc.open();
  114. doc.write("<HTML><head><link href='"+imagesDir+"editorinit.css' rel='stylesheet' type='text/css' /></head><BODY bgcolor='#FFFFFF'>"+document.getElementById(outPutObject).value+"</BODY></HTML>");
  115. doc.close();
  116. //
  117. if (isIE){
  118. doc.body.contentEditable = true ;
  119. for (var idx=0; idx < document.forms.length; idx++){
  120.    document.forms[idx].attachEvent('onsubmit', function() { updateValues(n); });
  121. }
  122. document.attachEvent('onmouseup', function() { if(dropdownID && ((event.srcElement.tagName!='IMG'&&event.srcElement.tagName!='BUTTON')||!oo('toolBar_'+n).contains(event.srcElement))){oo(dropdownID).style.display='none'; }  });
  123. doc.attachEvent('onmouseup', function() { editor_buttons_on(n); });
  124. }else{
  125. doc.designMode = 'on';
  126. for (var idx=0; idx < document.forms.length; idx++){
  127. document.forms[idx].addEventListener('submit', function OnSubmit() {updateValues(n);}, true);
  128. }
  129. }
  130. doc.execCommand('LiveResize', false, true);
  131. };
  132. //获取编辑状态下的源代码
  133. function autoGetHTML(n,b)
  134. {
  135.    document.getElementById(n).value=oo('_myeditor_'+b).contentWindow.document.body.innerHTML;
  136. }
  137. //获取源代码模式下的源代码
  138. function autoGetSourceHTML(n,b)
  139. {
  140.    document.getElementById(n).value=oo(b).value;
  141. }
  142. function editor_buttons_on(n){
  143. if(dropdownID) oo(dropdownID).style.display = 'none';
  144. if(!isIE) return false;
  145. var buttonOnIDs = ["Bold","Italic","Underline","Strikethrough","JustifyLeft","JustifyCenter","JustifyRight","InsertUnorderedList","InsertOrderedList"];
  146. try{
  147. for(var i=0;i<buttonOnIDs.length;i++){
  148. var id = buttonOnIDs[i];
  149. if(oo(n+'_'+id)){
  150. if(oo("_myeditor_" + n).contentWindow.document.queryCommandValue(id)==true){
  151. oo(n+'_'+id+'_exp').className = oo(n+'_'+id+'_exp').nowClassName = "buttonOn";
  152. }else{
  153. oo(n+'_'+id+'_exp').className = oo(n+'_'+id+'_exp').nowClassName = "button";
  154. }
  155. }
  156. }
  157. }catch(e){}
  158. }
  159. function formatText(id, n, s) {
  160. if(id=='Help'){
  161. openModalWindow(imagesDir+"help.htm",300,200,n);
  162. return true;
  163. }
  164. if (viewSourceMode[n] == 1) {
  165. return SourceformatText(id,n,s)
  166. }
  167. var w = oo("_myeditor_" + n).contentWindow;
  168. w.focus();
  169. if(!s && (id=='ForeColor'||id=='BackColor')){
  170. return showColor(id,n);
  171. }
  172. else if(id == "PasteText"){
  173. if (window.clipboardData) {
  174. var txt = window.clipboardData.getData("Text").replace( /n/g, '<br />' );
  175. insertHTML( txt ,n);
  176. }else {
  177. openModalWindow(imagesDir+"paste_text.htm",350,200,n);
  178. }
  179. return false;
  180. }
  181. else if (id == "InsertImage") {
  182. var input = window.prompt("请输入图片地址:","");
  183. if(input==null) return;
  184. insertHTML('<img src="'+input+'" />',n);
  185. }
  186. else if(id == "InsertFlash"){
  187. if(!s){
  188. var input = openModalWindow(imagesDir+"insert_flash.htm",350,200,n);
  189. if(input==null) return;
  190. }else input = s;
  191. insertHTML( '<img src="'+imagesDir+'spacer.gif" width="'+input[1]+'" height="'+input[2]+'" alt="'+input[0]+'" class="editor_flash" />',n);
  192. }
  193. else if(id == "InsertVideo"){
  194. if(!s){
  195. var input = openModalWindow(imagesDir+"insert_video.htm",350,250,n);
  196. if(input==null) return;
  197. }else input = s;
  198. insertHTML( '<img src="'+imagesDir+'spacer.gif" width="'+input[1]+'" height="'+input[2]+'" autoplay="'+input[3]+'" alt="'+input[0]+'" class="editor_video_'+input[4]+'" />',n );
  199. }else if(id == "specialchar"){
  200. if(!s){
  201. var input = openModalWindow(imagesDir+"insert_specialchars.htm",400,250,n);
  202. if(input==null) return;
  203. }else input = s;
  204. insertHTML( input,n );
  205. }
  206. else if(id == "InsertTable"){
  207. if(!s){
  208. var input = openModalWindow(imagesDir+"insert_table.htm?n="+n,350,300,n);
  209. if(input==null) return;
  210. }else input = s;
  211. insertHTML( input,n );
  212. }else if( id=='InsertRow' || id=='InsertColumn' || id=='DeleteRow' || id=='DeleteColumn' ){
  213. eval(id+'("'+n+'")');
  214. }
  215. else if(id=="Quote"||id=="Code"){
  216. var type = w.document.selection.type;
  217. if(type=="Text" || type=='None'){
  218. s = '<DIV class="'+id+'">'+w.document.selection.createRange().htmlText+'</DIV>';
  219. insertHTML(s,n);
  220. }else{
  221. alert('请选择相应内容!');
  222. }
  223. }
  224. else if(id=="replace"){
  225. if(!s){
  226. var input = openModalWindow(imagesDir+"replace.htm",250,200,n);
  227. if(input==null) return;
  228. }else input = s;
  229. var cr = w.document.selection.createRange();
  230. cr.expand('textedit');
  231. var k=0;
  232. while(cr.findText(input[0],0,input[2]) ){
  233. cr.select();
  234. insertHTML(input[1],n);
  235. cr.expand('textedit');
  236. k++;
  237. }
  238. if(k) alert("找到并替换 "+k+" 个结果.");
  239. else alert("没找到相关内容.");
  240. }
  241. else{
  242. if(!isIE) w.document.execCommand( 'useCSS', false, true ) ;
  243. w.document.execCommand(id, false, s);
  244. }
  245. editor_buttons_on(n);
  246. };
  247. function SourceformatText(id,n,s){
  248. if(s && s.indexOf('*')!=-1) return;
  249. oo(n).focus();
  250. var sourceCode = '';
  251. if(id == "PasteText") id = 'Paste';
  252. if(id=='FontName'){
  253. sourceCode = '<font face="'+s+'">*</font>';
  254. }
  255. else if(id=='ForeColor'){
  256. //the color window will get the focus ... 
  257. if(isIE) var cr = document.selection.createRange();
  258. else var cr = 1;
  259. if(!s) return showColor(id,n,cr);
  260. cr = showColor(id,n,null);
  261. insertSource('<font color="'+s+'">','</font>',n,cr);
  262. return true;
  263. }
  264. else if(id=='BackColor'){
  265. //the color window will get the focus ... 
  266. if(isIE) var cr = document.selection.createRange();
  267. else var cr = 1;
  268. if(!s) return showColor(id,n,cr);
  269. cr = showColor(id,n,null);
  270. insertSource('<font style="background-color:'+s+'">','</font>',n,cr);
  271. return true;
  272. }
  273. else if(id=='FontSize'){
  274. sourceCode = '<font size="'+s+'">*</font>';
  275. }
  276. else if(id=='CreateLink'){
  277. s = window.prompt("请输入链接地址:","http://");
  278. if(s==null || s.indexOf('*')!=-1 || s=='http://') return;
  279. if( docGetSelection(n) ) sourceCode = '<a href="'+s+'" target=_blank>*</a>';
  280. else{
  281. str = '<a href="'+s+'" target=_blank>'+s+'</a>';
  282. insertSource('',str,n);
  283. return true;
  284. }
  285. }
  286. else if(id=='InsertImage'){
  287. s = window.prompt("请输入图片地址","http://");
  288. if(s==null || s.indexOf('*')!=-1 || s=='http://') return;
  289. str = '<img src="'+s+'">';
  290. insertSource('',str,n);
  291. return true;
  292. }else if(id=='InsertUnorderedList'||id=='InsertOrderedList'){
  293. var str = (id=='InsertUnorderedList'?'<ul>':'<ol>');
  294. var sel = docGetSelection(n);
  295. if( sel ){
  296. strs = sel.split('n');
  297. for(var i=0;i<strs.length;i++){
  298. if(strs[i].trim()) str += 'n<li>'+strs[i].trim()+'</li>';
  299. }
  300. str += 'n'+(id=='InsertUnorderedList'?'</ul>':'</ol>');
  301. }else{
  302. var i=0;
  303. while(s = window.prompt("请输入一个列表项目,留空或取消完成该列表:","")){
  304. str += "n<li>" + s + "</li>";
  305. i++;
  306. }
  307. if(i==0) return false;
  308. str += 'n'+(id=='InsertUnorderedList'?'</ul>':'</ol>');
  309. }
  310. insertSource('',str,n);
  311. return true;
  312. }
  313. else if(id == "InsertFlash"){
  314. if(!s){
  315. var input = openModalWindow(imagesDir+"insert_flash.htm",350,200,n);
  316. if(input==null) return;
  317. }else input = s;
  318. var str = '[flash='+input[1]+','+input[2]+']'+input[0]+'[/flash]'; 
  319. insertSource('',str,n);
  320. return true;
  321. }
  322. else if(id == "InsertVideo"){
  323. if(!s){
  324. var input = openModalWindow(imagesDir+"insert_video.htm",350,250,n);
  325. if(input==null) return;
  326. }else input = s;
  327. var str = '['+input[4]+'='+input[1]+','+input[2]+','+input[3]+']'+input[0]+'[/'+input[4]+']';
  328. insertSource('',str,n);
  329. return true;
  330. }
  331.  if(id=="replace"){
  332. if(!s){
  333. var input = openModalWindow(imagesDir+"replace.htm",250,200,n);
  334. if(input==null) return;
  335. }else input = s;
  336. var str = oo(n).value;
  337. input[0] = input[0].replace(/(W)/mig,"\$1");
  338. var patten = new RegExp(input[0],(input[2]==4?'g':'gi'));
  339. str = str.replace(patten,input[1]);
  340. oo(n).value = str;
  341. return true;
  342. }
  343. else if(id=='Unlink'){
  344. var str = docGetSelection(n).replace(/(</?)(a[^>]*)(>)/mig,'');
  345. insertSource('',str,n);
  346. return true;
  347. }
  348. else if(id=='RemoveFormat'){
  349. //keep img ,use '<*img>' for special string
  350. str = docGetSelection(n).replace(/(<)(imgs[^>]*)(>)/mig,'$1*$2$3');
  351. str = str.replace(/(</?)([^*][^>]*)(>)/mig,'');
  352. str = str.replace(/(<)(*)(imgs[^>]*)(>)/mig,'$1$3$4');
  353. insertSource('',str,n);
  354. return true;
  355. }
  356. else{
  357. sourceCode = ToolbarList[id][2];
  358. if(sourceCode===true){
  359. try{
  360. document.execCommand(id, false, s)
  361. }catch(e){}
  362. }
  363. }
  364. if(sourceCode){
  365. var adds = sourceCode.split('*',2);
  366. insertSource( adds[0],adds[1],n);
  367. }
  368. if(dropdownID) oo(dropdownID).style.display = 'none';
  369. return true;
  370. }
  371. function insertSource(b,e,n,cr){
  372. var textarea = oo(n);
  373. textarea.focus();
  374. if (document.selection) {
  375. var range = cr?cr:document.selection.createRange();
  376. if(b==''){
  377. range.text = e;
  378. range.moveStart('character',0-e.length);
  379. }else{
  380. var len = range.text.length;
  381. range.text = b + range.text + e;
  382. range.moveStart('character',0-e.length-len);
  383. range.moveEnd('character',0-e.length);
  384. }
  385. range.select();
  386. }
  387. else if(window.getSelection&&textarea.selectionStart>-1){
  388. var st = textarea.selectionStart; 
  389. var ed = textarea.selectionEnd; 
  390. var selText = b?textarea.value.substring(st,ed):'';
  391. textarea.value = textarea.value.substring(0,st) + b + selText + e + textarea.value.slice(ed);
  392. textarea.selectionStart = st + b.length;
  393. textarea.selectionEnd = st + b.length + (b?selText.length:e.length);
  394. }
  395. else {
  396. textarea.value += b+e;
  397. }
  398. }
  399. function docGetSelection(n){
  400. var textarea = oo(n);
  401. if (!isIE){
  402. if (textarea.selectionStart!=undefined) {
  403. return textarea.value.substring(textarea.selectionStart, textarea.selectionEnd);
  404. }
  405. }else{
  406. if(window.getSelection) return window.getSelection();
  407. else if (document.getSelection)return document.getSelection();
  408. else if (document.selection)return document.selection.createRange().text;
  409. }
  410. }
  411. function openModalWindow(url,width,height,n){
  412. if(isIE){
  413. return window.showModalDialog(url,window,"dialogWidth: "+width+"px; dialogHeight:"+height+"px; edge: Raised; center: Yes; help: No; resizable: No; status: No;");
  414. }else{
  415. window.open(url,n,"modal=yes,width="+width+"px,height="+height+"px,resizable=no,scrollbars=no");
  416. return null;
  417. }
  418. }
  419. function insertHTML(html, n) {
  420. oo("_myeditor_" + n).contentWindow.focus();
  421. if (isIE) {   
  422. var cr = oo('_myeditor_' + n).contentWindow.document.selection.createRange()
  423. cr.pasteHTML(html);
  424. cr.select();
  425. }else {
  426. oo('_myeditor_' + n).contentWindow.document.execCommand('insertHTML',false, html);
  427. }
  428. }
  429. function outputFontSelect(n) {
  430. var FontSelectObj        = ToolbarList['SelectFont'];
  431. var FontSelect           = FontSelectObj[1];
  432. var FontSelectOn         = imagesDir + 'select_font_on.gif';
  433. var FontSelectDropDown = '<table border="0" cellpadding="0" cellspacing="0"><tr><td onMouseOver="oo('selectFont' + n + '').src='' + FontSelectOn + '';" onMouseOut="oo('selectFont' + n + '').src='' + FontSelect + '';"><img src="' + FontSelect + '" id="selectFont' + n + '" width="85" height="20" onClick="showFonts('' + n + '');"><br>';
  434. FontSelectDropDown += '<span id="Fonts' + n + '" class="dropdown" style="width: 145px; display:none;">';
  435. for (var i = 0; i <= Fonts.length;) {
  436. if (Fonts[i]) {
  437. FontSelectDropDown += '<button type="button" onClick="formatText('FontName','' + n + '','' + Fonts[i] + '');" onMouseOver="this.className='mouseOver'" onMouseOut="this.className='mouseOut'" class="mouseOut" style="width: 120px;"><table cellpadding="0" cellspacing="0" border="0"><tr><td align="left" style="font-family:' + Fonts[i] + '; font-size: 12px;">' + Fonts[i] + '</td></tr></table></button><br>';
  438. }  
  439. i++;
  440. }
  441. FontSelectDropDown += '</span></td></tr></table>';
  442. oo('FontSelect' + n).innerHTML = FontSelectDropDown;
  443. };
  444. function outputFontSizes(n) {
  445. var FontSizeObj        = ToolbarList['SelectSize'];
  446. var FontSize           = FontSizeObj[1];
  447. var FontSizeOn         = imagesDir + 'select_size_on.gif';
  448. var FontSizesDropDown = '<table border="0" cellpadding="0" cellspacing="0"><tr><td onMouseOver="oo('selectSize' + n + '').src='' + FontSizeOn + '';" onMouseOut="oo('selectSize' + n + '').src='' + FontSize + '';"><img src="' + FontSize + '" id="selectSize' + n + '" width="49" height="20" onClick="showFontSizes('' + n + '');"><br>';
  449. FontSizesDropDown += '<span id="Sizes' + n + '" class="dropdown" style="width:80px; display:none;">';
  450. for (var i = 1; i <= 7;i++) {
  451. FontSizesDropDown += '<button type="button" onClick="formatText('FontSize','' + n + '','' + i + '');" onMouseOver="this.className='mouseOver'" onMouseOut="this.className='mouseOut'" class="mouseOut" style="width: 100%; font-family:arial"><font size="'+i+'">' + (i) + '</font></button><br>';
  452. }
  453. FontSizesDropDown += '</span></td></tr></table>';
  454. oo('FontSizes' + n).innerHTML = FontSizesDropDown;
  455. };
  456. function outputColor(c,n){
  457. if(!oo(n+'_'+c+'_exp')) return false;
  458. var string = '<br><span id="' + c + n + '" class="dropdown" style="width: 200px;overflow:hidden;display:none;">';
  459. string += '<iframe name="'+c+'_win" src="'+imagesDir+'select_color.htm?color=000000&command='+c+'&_myeditor_=' + n +'" width="100%" height="140px" frameborder="0" scrolling="no" unselectable="on"></iframe></span>';
  460. oo(n+'_'+c+'_exp').innerHTML += string;
  461. }
  462. function showFonts(n) { 
  463. if (oo('Fonts' + n).style.display == 'block') {
  464. oo('Fonts' + n).style.display = 'none';
  465. }
  466. else {
  467. oo('Fonts' + n).style.display = 'block';
  468. if(dropdownID&&dropdownID!='Fonts' + n) oo(dropdownID).style.display = 'none';
  469. dropdownID = 'Fonts' + n;
  470. }
  471. };
  472. function showFontSizes(n) { 
  473. if (oo('Sizes' + n).style.display == 'block') {
  474. oo('Sizes' + n).style.display = 'none';
  475. }
  476. else {
  477. oo('Sizes' + n).style.display = 'block'; 
  478. if(dropdownID&&dropdownID!='Sizes' + n) oo(dropdownID).style.display = 'none';
  479. dropdownID = 'Sizes' + n;
  480. }
  481. };
  482. function showColor(c,n,cr) {
  483. if (oo(c + n).style.display == 'block') {
  484. oo(c + n).style.display = 'none';
  485. }
  486. else {
  487. oo(c + n).style.display = 'block'; 
  488. if(dropdownID&&dropdownID!=c+n) oo(dropdownID).style.display = 'none';
  489. dropdownID = c + n;
  490. }
  491. if(cr) oo(c + n).cr = cr;
  492. if(oo(c + n).cr) return oo(c + n).cr;
  493. };
  494. function updateValues(n){
  495. if(viewSourceMode[n]){
  496. var doc = oo("_myeditor_" + n).contentWindow.document;
  497. doc.body.innerHTML = source_html( oo(n).value );
  498. }
  499. else{
  500. var doc = oo("_myeditor_" + n).contentWindow.document;
  501. oo(n).value = html_source( n );
  502. }
  503. }
  504. function editor_resize(n,size){
  505. var obj=oo('_parent_of_'+n);
  506. if(size<0 && obj.offsetHeight<0-size*2) return false;
  507. oo(n).style.height = oo('_myeditor_' + n).style.height = obj.style.height = obj.offsetHeight + size;
  508. }
  509. function viewSource(n) {
  510. updateValues(n);
  511. if(viewSourceMode[n]) return;
  512. oo("_myeditor_" + n).style.display = 'none'; 
  513. oo(n).style.display = 'block';
  514. var c = oo('SourceMode_' + n).className;
  515. oo('SourceMode_' + n).className = oo('HTMLMode_' + n).className;
  516. oo('HTMLMode_' + n).className = c;
  517. oo(n).focus();
  518. viewSourceMode[n] = 1;
  519. editor_buttons_on(n);
  520. };
  521. function viewHTML(n) { 
  522. updateValues(n);
  523. if(!viewSourceMode[n]) return;
  524. oo("_myeditor_" + n).style.display = 'block'; 
  525. oo(n).style.display = 'none';
  526. var c = oo('SourceMode_' + n).className;
  527. oo('SourceMode_' + n).className = oo('HTMLMode_' + n).className;
  528. oo('HTMLMode_' + n).className = c;
  529. oo("_myeditor_" + n).focus();
  530. viewSourceMode[n] = 0;
  531. editor_buttons_on(n);
  532. };
  533. function html_source(n){
  534. //the special images ...
  535. var doc = oo("_myeditor_" + n).contentWindow.document;
  536. var images = doc.getElementsByTagName("IMG");
  537. for(var i=images.length-1;i>=0;i--){
  538. if(images[i].className=='editor_flash')
  539. images[i].outerHTML = '[flash='+parseInt(images[i].style.width?images[i].style.width:images[i].width)+','+parseInt(images[i].style.height?images[i].style.height:images[i].height)+']'+images[i].alt+'[/flash]';
  540. else if(images[i].className=='editor_video_rm')
  541. images[i].outerHTML = '[rm='+parseInt(images[i].style.width?images[i].style.width:images[i].width)+','+parseInt(images[i].style.height?images[i].style.height:images[i].height)+','+images[i].autoplay+']'+images[i].alt+'[/rm]';
  542. else if(images[i].className=='editor_video_mp')
  543. images[i].outerHTML = '[mp='+parseInt(images[i].style.width?images[i].style.width:images[i].width)+','+parseInt(images[i].style.height?images[i].style.height:images[i].height)+','+images[i].autoplay+']'+images[i].alt+'[/mp]';
  544. }
  545. var links = doc.getElementsByTagName("A");
  546. for(i=links.length-1;i>=0;i--){
  547. if(links[i].href && !links[i].target)
  548. links[i].target='_blank';
  549. }
  550. var code = doc.body.innerHTML.trim();
  551. return code;
  552. }
  553. function source_html(code){
  554. var specialUbbCodes = { '[flash=*,*]*[/flash]' : '<img src="'+imagesDir+'spacer.gif" width="$1" height="$2" alt="$3" class="editor_flash" />',
  555.  '[mp=*,*,*]*[/mp]' : '<img src="'+imagesDir+'spacer.gif" width="$1" height="$2" autoplay="$3" alt="$4" class="editor_video_mp" />',
  556.  '[rm=*,*,*]*[/rm]' : '<img src="'+imagesDir+'spacer.gif" width="$1" height="$2" autoplay="$3" alt="$4" class="editor_video_rm" />'
  557.  }
  558. for(var pattern in specialUbbCodes){
  559. var newpat = pattern.replace(/([[]/])/g,'\$1').replace(/(*)/g,"([^\]]+)");
  560. code = code.replace(new RegExp(newpat,'ig'),specialUbbCodes[pattern]);
  561. }
  562. return code;
  563. }
  564. // preview functions
  565. function preview_content(n){
  566. var win = window.open("","_blank","width=400px,height=300px,resizable=yes,scrollbars=auto");
  567. if(!viewSourceMode[n]) var code = html_source( n );
  568. else var code = oo(n).value;
  569. var specialUbbCodes = { '[flash=*,*]*[/flash]' : '<embed src="$3" width="$1" height="$2" type="application/x-shockwave-flash" play="true" loop="true" menu="true"></embed>',
  570.  '[mp=*,*,*]*[/mp]' : '<object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="$1" height="$2"><param name="SRC" value="$4"><param name="AUTOSTART" value="$3"></object>',
  571.  '[rm=*,*,*]*[/rm]' : '<embed type="application/x-oleobject" flename="mp" src="$4" width="$1" height="$2"></embed>'
  572.  }
  573. for(var pattern in specialUbbCodes){
  574. var newpat = pattern.replace(/([[]/])/g,'\$1').replace(/(*)/g,"([^\]]+)");
  575. code = code.replace(new RegExp(newpat,'ig'),specialUbbCodes[pattern]);
  576. }
  577. win.document.write("<HTML><head><title>Preview</title><link href='"+imagesDir+"editorinit.css' rel='stylesheet' type='text/css' /></head><BODY>"+code+"</BODY></HTML>");
  578. }
  579. // table functions ... 
  580. function GetRangeReference(editor)
  581. {
  582. editor.focus();
  583. var objReference = null;
  584. var RangeType = editor.document.selection.type;
  585. var selectedRange = editor.document.selection.createRange();
  586. switch(RangeType)
  587. {
  588. case 'Control' :
  589. if (selectedRange.length > 0 ) 
  590. {
  591. objReference = selectedRange.item(0);
  592. }
  593. break;
  594. case 'None' :
  595. objReference = selectedRange.parentElement();
  596. break;
  597. case 'Text' :
  598. objReference = selectedRange.parentElement();
  599. break;
  600. }
  601. return objReference
  602. }
  603. function CheckTag(myitem,tagName){
  604. if (myitem.tagName.search(tagName)!= -1)
  605. {
  606. return myitem;
  607. }
  608. if (myitem.tagName == 'BODY')
  609. {
  610. return false;
  611. }
  612. myitem=myitem.parentElement;
  613. return Dvbbs_CheckTag(myitem,tagName);
  614. }
  615. function InsertRow( n ){
  616. editor = oo("_myeditor_" + n).contentWindow;
  617. objReference = GetRangeReference(editor);
  618. objReference = CheckTag(objReference,'/^(TABLE)|^(TR)|^(TD)|^(TBODY)/');
  619. switch(objReference.tagName)
  620. {
  621. case 'TABLE' :
  622. var newTable = objReference.cloneNode(true);
  623. var newRow = newTable.insertRow();
  624. for(x = 0; x<newTable.rows[0].cells.length; x++)
  625. {
  626. var newCell = newRow.insertCell();
  627. }
  628. objReference.outerHTML = newTable.outerHTML;
  629. break;
  630. case 'TBODY' :
  631. var newTable = objReference.cloneNode(true);
  632. var newRow = newTable.insertRow();
  633. for(x = 0; x<newTable.rows[0].cells.length; x++)
  634. {
  635. var newCell = newRow.insertCell();
  636. }
  637. objReference.outerHTML=newTable.outerHTML;
  638. break;
  639. case 'TR' :
  640. var rowIndex = objReference.rowIndex;
  641. var parentTable = objReference.parentElement.parentElement;
  642. var newTable = parentTable.cloneNode(true);
  643. var newRow = newTable.insertRow(rowIndex+1);
  644. for(x = 0; x< newTable.rows[0].cells.length; x++)
  645. {
  646. var newCell = newRow.insertCell();
  647. }
  648. parentTable.outerHTML = newTable.outerHTML;
  649. break;
  650. case 'TD' :
  651. var parentRow = objReference.parentElement;
  652. var rowIndex = parentRow.rowIndex;
  653. var cellIndex = objReference.cellIndex;
  654. var parentTable = objReference.parentElement.parentElement.parentElement;
  655. var newTable = parentTable.cloneNode(true);
  656. var newRow = newTable.insertRow(rowIndex+1);
  657. for(x = 0; x< newTable.rows[0].cells.length; x++)
  658. {
  659. var newCell = newRow.insertCell();
  660. if (x == cellIndex)newCell.id='ura';
  661. }
  662. parentTable.outerHTML = newTable.outerHTML;
  663. var r = editor.document.body.createTextRange();
  664. var item = editor.document.getElementById('ura');
  665. item.id = '';
  666. r.moveToElementText(item);
  667. r.moveStart('character',r.text.length);
  668. r.select();
  669. break;
  670. default :
  671. return;
  672. }
  673. }
  674. function DeleteRow( n )
  675. {
  676. editor=oo("_myeditor_" + n).contentWindow;
  677. objReference=GetRangeReference(editor);
  678. objReference=CheckTag(objReference,'/^(TABLE)|^(TR)|^(TD)|^(TBODY)/');
  679. switch(objReference.tagName)
  680. {
  681. case 'TR' :var rowIndex = objReference.rowIndex;//Get rowIndex
  682. var parentTable=objReference.parentElement.parentElement;
  683. parentTable.deleteRow(rowIndex);
  684. break;
  685. case 'TD' :var cellIndex=objReference.cellIndex;
  686. var parentRow=objReference.parentElement;//Get Parent Row
  687. var rowIndex = parentRow.rowIndex;//Get rowIndex
  688. var parentTable=objReference.parentElement.parentElement.parentElement;
  689. parentTable.deleteRow(rowIndex);
  690. if (rowIndex>=parentTable.rows.length)
  691. {
  692. rowIndex=parentTable.rows.length-1;
  693. }
  694. if (rowIndex>=0)
  695. {
  696. var r = editor.document.body.createTextRange();
  697. r.moveToElementText(parentTable.rows[rowIndex].cells[cellIndex]);
  698. r.moveStart('character',r.text.length);
  699. r.select();
  700. }
  701. else
  702. {
  703. parentTable.removeNode(true);
  704. }
  705. break;
  706. default :return;
  707. }
  708. }
  709. function InsertColumn( n )
  710. {
  711. editor = oo("_myeditor_" + n).contentWindow;
  712. objReference= GetRangeReference(editor);
  713. objReference=CheckTag(objReference,'/^(TABLE)|^(TR)|^(TD)|^(TBODY)/');
  714. switch(objReference.tagName)
  715. {
  716. case 'TABLE' :// IF a table is selected, it adds a new column on the right hand side of the table.
  717. var newTable=objReference.cloneNode(true);
  718. for(x=0; x<newTable.rows.length; x++)
  719. {
  720. var newCell = newTable.rows[x].insertCell();
  721. }
  722. newCell.focus();
  723. objReference.outerHTML=newTable.outerHTML;
  724. break;
  725. case 'TBODY' :// IF a table is selected, it adds a new column on the right hand side of the table.
  726. var newTable=objReference.cloneNode(true);
  727. for(x=0; x<newTable.rows.length; x++)
  728. {
  729. var newCell = newTable.rows[x].insertCell();
  730. }
  731. objReference.outerHTML=newTable.outerHTML;
  732. break;
  733. case 'TR' :// IF a table is selected, it adds a new column on the right hand side of the table.
  734. objReference=objReference.parentElement.parentElement;
  735. var newTable=objReference.cloneNode(true);
  736. for(x=0; x<newTable.rows.length; x++)
  737. {
  738. var newCell = newTable.rows[x].insertCell();
  739. }
  740. objReference.outerHTML=newTable.outerHTML;
  741. break;
  742. case 'TD' :// IF the cursor is in a cell, or a cell is selected, it adds a new column to the right of that cell.
  743. var cellIndex = objReference.cellIndex;//Get cellIndex
  744. var rowIndex=objReference.parentElement.rowIndex;
  745. var parentTable=objReference.parentElement.parentElement.parentElement;
  746. var newTable=parentTable.cloneNode(true);
  747. for(x=0; x<newTable.rows.length; x++)
  748. {
  749. var newCell = newTable.rows[x].insertCell(cellIndex+1);
  750. if (x==rowIndex)newCell.id='ura';
  751. }
  752. parentTable.outerHTML=newTable.outerHTML;
  753. var r = editor.document.body.createTextRange();
  754. var myitem=editor.document.getElementById('ura');
  755. myitem.id='';
  756. r.moveToElementText(myitem);
  757. r.moveStart('character',r.text.length);
  758. r.select();
  759. break;
  760. default :
  761. return;
  762. }
  763. }
  764. function DeleteColumn( n )
  765. {
  766. editor = oo("_myeditor_" + n).contentWindow;
  767. objReference=GetRangeReference(editor);
  768. objReference=CheckTag(objReference,'/^(TABLE)|^(TR)|^(TD)|^(TBODY)/');
  769. switch(objReference.tagName)
  770. {
  771. case 'TD' :var rowIndex=objReference.parentElement.rowIndex;
  772. var cellIndex = objReference.cellIndex;//Get cellIndex
  773. var parentTable=objReference.parentElement.parentElement.parentElement;
  774. var newTable=parentTable.cloneNode(true);
  775. if (newTable.rows[0].cells.length==1)
  776. {
  777. parentTable.removeNode(true);
  778. return;
  779. }
  780. for(x=0; x<newTable.rows.length; x++)
  781. {
  782. if (newTable.rows[x].cells[cellIndex]=='[object]')
  783. {
  784. newTable.rows[x].deleteCell(cellIndex);
  785. }
  786. }
  787. if (cellIndex>=newTable.rows[0].cells.length)
  788. {
  789. cellIndex=newTable.rows[0].cells.length-1;
  790. }
  791. if (cellIndex>=0)  newTable.rows[rowIndex].cells[cellIndex].id='ura';
  792. parentTable.outerHTML=newTable.outerHTML;
  793. if (cellIndex>=0){
  794. var r = editor.document.body.createTextRange();
  795. var myitem=editor.document.getElementById('ura');
  796. myitem.id='';
  797. r.moveToElementText(myitem);
  798. r.moveStart('character',r.text.length);
  799. r.select();
  800. }
  801. break;
  802. default :return;
  803. }
  804. }
  805. //Emote ...
  806. function Emote(image,n)
  807. {
  808. image='<img src="' + image + '">';
  809. var obj=oo(n);
  810. if (obj==null)
  811. {
  812. n=n.replace(/(_ctl)/g,"ctl0");
  813. n=n.replace(/(:)/g,"$");
  814. }
  815. if(viewSourceMode[n]) insertSource('',image,n);
  816. else insertHTML( image ,n);
  817. }