editor.js
上传用户:wenllgg125
上传日期:2020-04-09
资源大小:7277k
文件大小:30k
源码类别:

SCSI/ASPI

开发平台:

Others

  1. var editbox = editwin = editdoc = editcss = null;
  2. var cursor = -1;
  3. var stack = new Array();
  4. var initialized = false;
  5. function newEditor(mode, initialtext) {
  6. wysiwyg = parseInt(mode);
  7. if(!(is_ie || is_moz || (is_opera >= 9))) {
  8. allowswitcheditor = wysiwyg = 0;
  9. }
  10. if(!allowswitcheditor) {
  11. $(editorid + '_switcher').style.display = 'none';
  12. }
  13. $(editorid + '_cmd_table').style.display = wysiwyg ? '' : 'none';
  14. if(wysiwyg) {
  15. if($(editorid + '_iframe')) {
  16. editbox = $(editorid + '_iframe');
  17. } else {
  18. var iframe = document.createElement('iframe');
  19. editbox = textobj.parentNode.appendChild(iframe);
  20. editbox.id = editorid + '_iframe';
  21. }
  22. editwin = editbox.contentWindow;
  23. editdoc = editwin.document;
  24. writeEditorContents(isUndefined(initialtext) ?  textobj.value : initialtext);
  25. } else {
  26. editbox = editwin = editdoc = textobj;
  27. if(!isUndefined(initialtext)) {
  28. writeEditorContents(initialtext);
  29. }
  30. addSnapshot(textobj.value);
  31. }
  32. setEditorEvents();
  33. initEditor();
  34. }
  35. function initEditor() {
  36. var buttons = $(editorid + '_controls').getElementsByTagName('a');
  37. for(var i = 0; i < buttons.length; i++) {
  38. if(buttons[i].id.indexOf(editorid + '_cmd_') != -1) {
  39. buttons[i].href = 'javascript:;';
  40. buttons[i].onclick = function(e) {discuzcode(this.id.substr(this.id.lastIndexOf('_cmd_') + 5))};
  41. } else if(buttons[i].id == editorid + '_popup_media') {
  42. buttons[i].href = 'javascript:;';
  43. buttons[i].onclick = function(e) {discuzcode('media')};
  44. } else if(buttons[i].id.indexOf(editorid + '_popup_') != -1) {
  45. buttons[i].href = 'javascript:;';
  46. buttons[i].onclick = function(e) {InFloat = InFloat_Editor;showMenu(this.id, true, 0, 2)};
  47. }
  48. }
  49. setUnselectable($(editorid + '_controls'));
  50. textobj.onkeydown = function(e) {ctlent(e ? e : event)};
  51. }
  52. function setUnselectable(obj) {
  53. if(is_ie && is_ie > 4 && typeof obj.tagName != 'undefined') {
  54. if(obj.hasChildNodes()) {
  55. for(var i = 0; i < obj.childNodes.length; i++) {
  56. setUnselectable(obj.childNodes[i]);
  57. }
  58. }
  59. obj.unselectable = 'on';
  60. }
  61. }
  62. function writeEditorContents(text) {
  63. if(wysiwyg) {
  64. if(text == '' && is_moz) {
  65. text = '<br />';
  66. }
  67. if(initialized && !(is_moz && is_moz >= 3)) {
  68. editdoc.body.innerHTML = text;
  69. } else {
  70. editdoc.designMode = 'on';
  71. editdoc = editwin.document;
  72. editdoc.open('text/html', 'replace');
  73. editdoc.write(text);
  74. editdoc.close();
  75. editdoc.body.contentEditable = true;
  76. initialized = true;
  77. }
  78. } else {
  79. textobj.value = text;
  80. }
  81. setEditorStyle();
  82. }
  83. function getEditorContents() {
  84. return wysiwyg ? editdoc.body.innerHTML : editdoc.value;
  85. }
  86. function setEditorStyle() {
  87. if(wysiwyg) {
  88. textobj.style.display = 'none';
  89. editbox.style.display = '';
  90. editbox.className = textobj.className;
  91. var headNode = editdoc.getElementsByTagName("head")[0];
  92. if(!headNode.getElementsByTagName('link').length) {
  93. editcss = editdoc.createElement('link');
  94. editcss.type = 'text/css';
  95. editcss.rel = 'stylesheet';
  96. editcss.href = editorcss;
  97. headNode.appendChild(editcss);
  98. }
  99. if(is_moz || is_opera) {
  100. editbox.style.border = '0px';
  101. } else if(is_ie) {
  102. editdoc.body.style.border = '0px';
  103. editdoc.body.addBehavior('#default#userData');
  104. }
  105. editbox.style.width = textobj.style.width;
  106. editbox.style.height = textobj.style.height;
  107. editdoc.firstChild.style.background = 'none';
  108. editdoc.body.style.backgroundColor = TABLEBG;
  109. editdoc.body.style.textAlign = 'left';
  110. editdoc.body.id = 'wysiwyg';
  111. if(is_ie) {
  112. try{$('subject').focus();} catch(e) {editwin.focus();}
  113. }
  114. } else {
  115. var iframe = textobj.parentNode.getElementsByTagName('iframe')[0];
  116. if(iframe) {
  117. textobj.style.display = '';
  118. textobj.style.width = iframe.style.width;
  119. textobj.style.height = iframe.style.height;
  120. iframe.style.display = 'none';
  121. }
  122. if(is_ie) {
  123. try{$('subject').focus();} catch(e) {textobj.focus();}
  124. }
  125. }
  126. }
  127. function setEditorEvents() {
  128. if(wysiwyg) {
  129. if(is_moz || is_opera) {
  130. editwin.addEventListener('focus', function(e) {this.hasfocus = true;}, true);
  131. editwin.addEventListener('blur', function(e) {this.hasfocus = false;}, true);
  132. editwin.addEventListener('keydown', function(e) {ctlent(e);ctltab(e);}, true);
  133. } else {
  134. if(editdoc.attachEvent) {
  135. editdoc.body.attachEvent("onkeydown", ctlent);
  136. editdoc.body.attachEvent("onkeydown", ctltab);
  137. }
  138. }
  139. }
  140. editwin.onfocus = function(e) {this.hasfocus = true;};
  141. editwin.onblur = function(e) {this.hasfocus = false;};
  142. }
  143. function wrapTags(tagname, useoption, selection) {
  144. if(isUndefined(selection)) {
  145. var selection = getSel();
  146. if(selection === false) {
  147. selection = '';
  148. } else {
  149. selection += '';
  150. }
  151. }
  152. if(useoption !== false) {
  153. var opentag = '[' + tagname + '=' + useoption + ']';
  154. } else {
  155. var opentag = '[' + tagname + ']';
  156. }
  157. var closetag = '[/' + tagname + ']';
  158. var text = opentag + selection + closetag;
  159. insertText(text, strlen(opentag), strlen(closetag), in_array(tagname, ['code', 'quote', 'free', 'hide']) ? true : false);
  160. }
  161. function applyFormat(cmd, dialog, argument) {
  162. if(wysiwyg) {
  163. editdoc.execCommand(cmd, (isUndefined(dialog) ? false : dialog), (isUndefined(argument) ? true : argument));
  164. return;
  165. }
  166. switch(cmd) {
  167. case 'bold':
  168. case 'italic':
  169. case 'underline':
  170. wrapTags(cmd.substr(0, 1), false);
  171. break;
  172. case 'justifyleft':
  173. case 'justifycenter':
  174. case 'justifyright':
  175. wrapTags('align', cmd.substr(7));
  176. break;
  177. case 'floatleft':
  178. case 'floatright':
  179. wrapTags('float', cmd.substr(5));
  180. break;
  181. case 'indent':
  182. wrapTags(cmd, false);
  183. break;
  184. case 'fontname':
  185. wrapTags('font', argument);
  186. break;
  187. case 'fontsize':
  188. wrapTags('size', argument);
  189. break;
  190. case 'forecolor':
  191. wrapTags('color', argument);
  192. break;
  193. case 'createlink':
  194. var sel = getSel();
  195. if(sel) {
  196. wrapTags('url', argument);
  197. } else {
  198. wrapTags('url', argument, argument);
  199. }
  200. break;
  201. case 'insertimage':
  202. wrapTags('img', false, argument);
  203. break;
  204. }
  205. }
  206. function getCaret() {
  207. if(wysiwyg) {
  208. var obj = editdoc.body;
  209. var s = document.selection.createRange();
  210. s.setEndPoint("StartToStart", obj.createTextRange());
  211. return s.text.replace(/r?n/g, ' ').length;
  212. } else {
  213. var obj = editbox;
  214. var wR = document.selection.createRange();
  215. obj.select();
  216. var aR = document.selection.createRange();
  217. wR.setEndPoint("StartToStart", aR);
  218. var len = wR.text.replace(/r?n/g, ' ').length;
  219. wR.collapse(false);
  220. wR.select();
  221. return len;
  222. }
  223. }
  224. function setCaret(pos) {
  225. var obj = wysiwyg ? editdoc.body : editbox;
  226. var r = obj.createTextRange();
  227. r.moveStart('character', pos);
  228. r.collapse(true);
  229. r.select();
  230. }
  231. function insertlink(cmd) {
  232. var sel;
  233. if(is_ie) {
  234. sel = wysiwyg ? editdoc.selection.createRange() : document.selection.createRange();
  235. var pos = getCaret();
  236. }
  237. var selection = sel ? (wysiwyg ? sel.htmlText : sel.text) : getSel();
  238. if(cmd == 'createlink' && is_ie && wysiwyg && selection === undefined) {
  239. applyFormat("createlink", true, null);
  240. return;
  241. }
  242. var ctrlid = editorid + '_cmd_' + cmd;
  243. var tag = cmd == 'createlink' ? 'url' : 'email';
  244. var str = (tag == 'url' ? '请输入链接的地址:' : '请输入此链接的邮箱地址:') + '<br /><input type="text" id="' + ctrlid + '_param_1" style="width: 98%" value="" class="txt" />';
  245. var div = editorMenu(ctrlid, str);
  246. $(ctrlid + '_param_1').focus();
  247. $(ctrlid + '_param_1').onkeydown = editorMenuEvent_onkeydown;
  248. $(ctrlid + '_submit').onclick = function() {
  249. checkFocus();
  250. if(is_ie) {
  251. setCaret(pos);
  252. }
  253. var input = $(ctrlid + '_param_1').value;
  254. if(input != '') {
  255. var v = selection ? selection : input;
  256. var href = tag != 'email' && /^(www.)/.test(input) ? 'http://' + input : input;
  257. var text = wysiwyg ? ('<a href="' + (tag == 'email' ? 'mailto:' : '') + href + '">' + v + '</a>') : '[' + tag + '=' + href + ']' + v + '[/' + tag + ']';
  258. var closetaglen = tag == 'email' ? 8 : 6;
  259. if(wysiwyg) insertText(text, text.length - v.length, 0, (selection ? true : false), sel);
  260. else insertText(text, text.length - v.length - closetaglen, closetaglen, (selection ? true : false), sel);
  261. }
  262. hideMenu();
  263. div.parentNode.removeChild(div);
  264. }
  265. }
  266. function insertimage() {
  267. InFloat = InFloat_Editor;
  268. if(is_ie) $(editorid + '_cmd_insertimage_param_url').pos = getCaret();
  269. showMenu(editorid + '_cmd_insertimage', true, 0, 3);
  270. }
  271. function insertimagesubmit() {
  272. checkFocus();
  273. if(is_ie) setCaret($(editorid + '_cmd_insertimage_param_url').pos);
  274. if(wysiwyg) {
  275. insertText('<img src='+$(editorid + '_cmd_insertimage_param_url').value+' border=0 /> ', false);
  276. } else {
  277. insertText('[img]'+$(editorid + '_cmd_insertimage_param_url').value+'[/img]');
  278. }
  279. hideMenu();
  280. $(editorid + '_cmd_insertimage_param_url').value = '';
  281. }
  282. function editorMenuEvent_onkeydown(e) {
  283. e = e ? e : event;
  284. try {
  285. obj = is_ie ? event.srcElement : e.target;
  286. var ctrlid = obj.id.substr(0, obj.id.lastIndexOf('_param_'));
  287. if((obj.type == 'text' && e.keyCode == 13) || (obj.type == 'textarea' && e.ctrlKey && e.keyCode == 13)) {
  288. $(ctrlid + '_submit').click();
  289. doane(e);
  290. } else if(e.keyCode == 27) {
  291. hideMenu();
  292. $(ctrlid + '_menu').parentNode.removeChild($(ctrlid + '_menu'));
  293. }
  294. } catch(e) {}
  295. }
  296. function customTags(tagname, params) {
  297. var sel;
  298. if(is_ie) {
  299. sel = wysiwyg ? editdoc.selection.createRange() : document.selection.createRange();
  300. var pos = getCaret();
  301. }
  302. var selection = sel ? (wysiwyg ? sel.htmlText : sel.text) : getSel();
  303. var opentag = '[' + tagname + ']';
  304. var closetag = '[/' + tagname + ']';
  305. var haveSel = selection == null || selection == false || in_array(trim(selection), ['', 'null', 'undefined', 'false']) ? 0 : 1;
  306. if(params == 1 && haveSel) {
  307. return insertText((opentag + selection + closetag), strlen(opentag), strlen(closetag), true, sel);
  308. }
  309. var ctrlid = editorid + '_cmd_custom' + params + '_' + tagname;
  310. var ordinal = {1 : 'first', 2 : 'second', 3 : 'third'}
  311. var promptlang;
  312. try
  313. {
  314. promptlang = custombbcodes[tagname][3];
  315. }
  316. catch (e)
  317. {
  318. promptlang = custombbcodes[tagname]['prompt'].split("t");
  319. }
  320. var defaultvalue = custombbcodes[tagname][4];
  321. var str = '';
  322. for(var i = 1; i <= params; i++) {
  323. if(i != 1 || !haveSel) {
  324. str += (promptlang[i - 1] ? promptlang[i - 1] : 'Please input the ' + ordinal[i] + ' parameter:') + '<br /><input type="text" id="' + ctrlid + '_param_' + i + '" style="width: 98%" value="' + (defaultvalue[i-1] ? defaultvalue[i-1] : '') + '"><br />';
  325. }
  326. }
  327. var div = editorMenu(ctrlid, str);
  328. if($(ctrlid + '_param_1')) {
  329. try{
  330. $(ctrlid + '_param_1').focus();
  331. }catch (e){}
  332. }
  333. for(var i = 1; i <= params; i++) {if(i != 1 || !haveSel) $(ctrlid + '_param_' + i).onkeydown = editorMenuEvent_onkeydown;}
  334. $(ctrlid + '_submit').onclick = function() {
  335. if($(ctrlid + '_param_1')) 
  336. var first = $(ctrlid + '_param_1').value;
  337. else
  338. var first = selection;
  339. if($(ctrlid + '_param_2')) 
  340. var second = $(ctrlid + '_param_2').value;
  341. if($(ctrlid + '_param_3')) 
  342. var third = $(ctrlid + '_param_3').value;
  343. checkFocus();
  344. if(is_ie) {
  345. setCaret(pos);
  346. }
  347. if((params == 1 && first) || (params == 2 && first && (haveSel || second)) || (params == 3 && first && second && (haveSel || third))) {
  348. var text;
  349. if(params == 1) {
  350. text = first;
  351. } else if(params == 2) {
  352. //text = haveSel ? selection : second;
  353. text = haveSel ? selection : first;
  354. //opentag = '[' + tagname + '=' + first + ']';
  355. opentag = '[' + tagname + '=' + second + ']';
  356. } else {
  357. //text = haveSel ? selection : third;
  358. //opentag = '[' + tagname + '=' + first + ',' + second + ']';
  359. text = haveSel ? selection : first;
  360. opentag = '[' + tagname + '=' + second + ',' + third + ']';
  361. }
  362. insertText((opentag + text + closetag), strlen(opentag), strlen(closetag), true, sel);
  363. }
  364. hideMenu();
  365. div.parentNode.removeChild(div);
  366. };
  367. }
  368. function editorMenu(ctrlid, str) {
  369. var div = document.createElement('div');
  370. div.id = ctrlid + '_menu';
  371. div.style.display = 'none';
  372. div.className = 'popupmenu_popup popupfix';
  373. div.style.width = '300px';
  374. $(editorid + '_controls').appendChild(div);
  375. div.innerHTML = '<div class="popupmenu_option" unselectable="on">' + str + '<br /><center><input type="button" id="' + ctrlid + '_submit" value="提交" /> &nbsp; <input type="button" onClick="hideMenu();try{div.parentNode.removeChild(' + div.id + ')}catch(e){}" value="取消" /></center></div>';
  376. InFloat = InFloat_Editor;
  377. showMenu(ctrlid, true, 0, 3);
  378. return div;
  379. }
  380. function discuzcode(cmd, arg) {
  381. if(cmd != 'redo') {
  382. addSnapshot(getEditorContents());
  383. }
  384. checkFocus();
  385. if(in_array(cmd, ['quote', 'code', 'free', 'hide'])) {
  386. var sel;
  387. if(is_ie) {
  388. sel = wysiwyg ? editdoc.selection.createRange() : document.selection.createRange();
  389. var pos = getCaret();
  390. }
  391. var selection = sel ? (wysiwyg ? sel.htmlText : sel.text) : getSel();
  392. var opentag = '[' + cmd + ']';
  393. var closetag = '[/' + cmd + ']';
  394. if(cmd != 'hide' && selection) {
  395. return insertText((opentag + selection + closetag), strlen(opentag), strlen(closetag), true, sel);
  396. }
  397. var ctrlid = editorid + '_cmd_' + cmd;
  398. var str = '';
  399. lang['e_quote'] = '请输入要插入的引用';
  400. lang['e_code'] = '请输入要插入的代码';
  401. lang['e_free'] = '请输入要插入的免费信息';
  402. lang['e_hide'] = '请输入要插入的隐藏内容';
  403. if(cmd != 'hide' || !selection) {
  404. str += lang['e_' + cmd] + ':<br /><textarea id="' + ctrlid + '_param_1" style="width: 98%" cols="50" rows="5"></textarea>';
  405. }
  406. str += cmd == 'hide' ? '<br /><input type="radio" name="' + ctrlid + '_radio" id="' + ctrlid + '_radio_1" class="txt" checked="checked" />只有当浏览者回复本帖时才显示<br /><input type="radio" name="' + ctrlid + '_radio" id="' + ctrlid + '_radio_2" class="txt" />只有当浏览者积分高于 <input type="text" size="3" id="' + ctrlid + '_param_2" class="txt" /> 时才显示' : '';
  407. var div = editorMenu(ctrlid, str);
  408. $(ctrlid + '_param_' + (cmd == 'hide' && selection ? 2 : 1)).focus();
  409. $(ctrlid + '_param_' + (cmd == 'hide' && selection ? 2 : 1)).onkeydown = editorMenuEvent_onkeydown;
  410. $(ctrlid + '_submit').onclick = function() {
  411. checkFocus();
  412. if(is_ie) {
  413. setCaret(pos);
  414. }
  415. if(cmd == 'hide' && $(ctrlid + '_radio_2').checked) {
  416. var mincredits = parseInt($(ctrlid + '_param_2').value);
  417. opentag = mincredits > 0 ? '[hide=' + mincredits + ']' : '[hide]';
  418. }
  419. var text = selection ? selection : $(ctrlid + '_param_1').value;
  420. if(wysiwyg) {
  421. if(cmd == 'code') {
  422. text = preg_replace(['<', '>'], ['&lt;', '&gt;'], text);
  423. }
  424. text = text.replace(/r?n/g, '<br />');
  425. }
  426. text = opentag + text + closetag;
  427. insertText(text, strlen(opentag), strlen(closetag), false, sel);
  428. hideMenu();
  429. div.parentNode.removeChild(div);
  430. }
  431. return;
  432. } else if(cmd.substr(0, 6) == 'custom') {
  433. var ret = customTags(cmd.substr(8), cmd.substr(6, 1));
  434. } else if(!wysiwyg && cmd == 'removeformat') {
  435. var simplestrip = new Array('b', 'i', 'u');
  436. var complexstrip = new Array('font', 'color', 'size');
  437. var str = getSel();
  438. if(str === false) {
  439. return;
  440. }
  441. for(var tag in simplestrip) {
  442. str = stripSimple(simplestrip[tag], str);
  443. }
  444. for(var tag in complexstrip) {
  445. str = stripComplex(complexstrip[tag], str);
  446. }
  447. insertText(str);
  448. } else if(!wysiwyg && cmd == 'undo') {
  449. addSnapshot(getEditorContents());
  450. moveCursor(-1);
  451. if((str = getSnapshot()) !== false) {
  452. editdoc.value = str;
  453. }
  454. } else if(!wysiwyg && cmd == 'redo') {
  455. moveCursor(1);
  456. if((str = getSnapshot()) !== false) {
  457. editdoc.value = str;
  458. }
  459. } else if(!wysiwyg && in_array(cmd, ['insertorderedlist', 'insertunorderedlist'])) {
  460. var listtype = cmd == 'insertorderedlist' ? '1' : '';
  461. var opentag = '[list' + (listtype ? ('=' + listtype) : '') + ']n';
  462. var closetag = '[/list]';
  463. if(txt = getSel()) {
  464. var regex = new RegExp('([rn]+|^[rn]*)(?!\[\*\]|\[\/?list)(?=[^rn])', 'gi');
  465. txt = opentag + trim(txt).replace(regex, '$1[*]') + 'n' + closetag;
  466. insertText(txt, strlen(txt), 0);
  467. } else {
  468. insertText(opentag + closetag, opentag.length, closetag.length);
  469. while(listvalue = prompt('输入一个列表项目.rn留空或者点击取消完成此列表.', '')) {
  470. if(is_opera > 8) {
  471. listvalue = 'n' + '[*]' + listvalue;
  472. insertText(listvalue, strlen(listvalue) + 1, 0);
  473. } else {
  474. listvalue = '[*]' + listvalue + 'n';
  475. insertText(listvalue, strlen(listvalue), 0);
  476. }
  477. }
  478. }
  479. } else if(!wysiwyg && cmd == 'outdent') {
  480. var sel = getSel();
  481. sel = stripSimple('indent', sel, 1);
  482. insertText(sel);
  483. } else if(cmd == 'createlink') {
  484. insertlink('createlink');
  485. } else if(!wysiwyg && cmd == 'unlink') {
  486. var sel = getSel();
  487. sel = stripSimple('url', sel);
  488. sel = stripComplex('url', sel);
  489. insertText(sel);
  490. } else if(cmd == 'email') {
  491. insertlink('email');
  492. } else if(cmd == 'insertimage') {
  493. insertimage();
  494. } else if(cmd == 'media') {
  495. insertmedia();
  496. } else if(cmd == 'table') {
  497. if(wysiwyg) {
  498. var selection = getSel();
  499. if(is_ie) {
  500. var pos = getCaret();
  501. }
  502. var ctrlid = editorid + '_cmd_table';
  503. var str = '<p>表格行数: <input type="text" id="' + ctrlid + '_param_rows" size="2" value="2" class="txt" /> &nbsp; 表格列数: <input type="text" id="' + ctrlid + '_param_columns" size="2" value="2" class="txt" /></p><p>表格宽度: <input type="text" id="' + ctrlid + '_param_width" size="2" value="" class="txt" /> &nbsp; 背景颜色: <input type="text" id="' + ctrlid + '_param_bgcolor" size="2" class="txt" /></p>';
  504. var div = editorMenu(ctrlid, str);
  505. $(ctrlid + '_param_rows').focus();
  506. var params = ['rows', 'columns', 'width', 'bgcolor'];
  507. for(var i = 0; i < 4; i++) {$(ctrlid + '_param_' + params[i]).onkeydown = editorMenuEvent_onkeydown;}
  508. $(ctrlid + '_submit').onclick = function() {
  509. checkFocus();
  510. if(is_ie) {
  511. setCaret(pos);
  512. }
  513. var rows = $(ctrlid + '_param_rows').value;
  514. var columns = $(ctrlid + '_param_columns').value;
  515. var width = $(ctrlid + '_param_width').value;
  516. var bgcolor = $(ctrlid + '_param_bgcolor').value;
  517. rows = /^[-+]?d+$/.test(rows) && rows > 0 && rows <= 30 ? rows : 2;
  518. columns = /^[-+]?d+$/.test(columns) && columns > 0 && columns <= 30 ? columns : 2;
  519. width = width.substr(width.length - 1, width.length) == '%' ? (width.substr(0, width.length - 1) <= 98 ? width : '98%') : (width <= 560 ? width : '98%');
  520. bgcolor = /[()%,#w]+/.test(bgcolor) ? bgcolor : '';
  521. var html = '<table cellspacing="0" cellpadding="0" width="' + (width ? width : '50%') + '" class="t_table"' + (bgcolor ? ' bgcolor="' + bgcolor + '"' : '') + '>';
  522. for (var row = 0; row < rows; row++) {
  523. html += '<tr>n';
  524. for (col = 0; col < columns; col++) {
  525. html += '<td>&nbsp;</td>n';
  526. }
  527. html+= '</tr>n';
  528. }
  529. html += '</table>n';
  530. insertText(html);
  531. hideMenu();
  532. div.parentNode.removeChild(div);
  533. }
  534. }
  535. return false;
  536. } else if(cmd == 'floatleft' || cmd == 'floatright') {
  537. if(wysiwyg) {
  538. var selection = getSel();
  539. if(selection) {
  540. var ret = insertText('<br style="clear: both"><span style="float: ' + cmd.substr(5) + '">' + selection + '</span>', true);
  541. }
  542. } else {
  543. var ret = applyFormat(cmd, false);
  544. }
  545. } else if(cmd == 'loadData') {
  546. loadData();hideMenu();
  547. } else if(cmd == 'saveData') {
  548. autosaveData(2);hideMenu();
  549. } else if(cmd == 'autosave') {
  550. if(getcookie('disableautosave')) {
  551. autosaveData(1);
  552. } else {
  553. autosaveData(0);
  554. }
  555. } else if(cmd == 'checklength') {
  556. checklength($('postform'));hideMenu();
  557. } else if(cmd == 'clearcontent') {
  558. clearcontent();hideMenu();
  559. } else {
  560. try {
  561. var ret = applyFormat(cmd, false, (isUndefined(arg) ? true : arg));
  562. } catch(e) {
  563. var ret = false;
  564. }
  565. }
  566. if(cmd != 'undo') {
  567. addSnapshot(getEditorContents());
  568. }
  569. if(in_array(cmd, ['bold', 'italic', 'underline', 'fontname', 'fontsize', 'forecolor', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'floatleft', 'floatright', 'removeformat', 'unlink', 'undo', 'redo'])) {
  570. hideMenu();
  571. }
  572. return ret;
  573. }
  574. function getSel() {
  575. if(wysiwyg) {
  576. if(is_moz || is_opera) {
  577. selection = editwin.getSelection();
  578. checkFocus();
  579. range = selection ? selection.getRangeAt(0) : editdoc.createRange();
  580. return readNodes(range.cloneContents(), false);
  581. } else {
  582. var range = editdoc.selection.createRange();
  583. if(range.htmlText && range.text) {
  584. return range.htmlText;
  585. } else {
  586. var htmltext = '';
  587. for(var i = 0; i < range.length; i++) {
  588. htmltext += range.item(i).outerHTML;
  589. }
  590. return htmltext;
  591. }
  592. }
  593. } else {
  594. if(!isUndefined(editdoc.selectionStart)) {
  595. return editdoc.value.substr(editdoc.selectionStart, editdoc.selectionEnd - editdoc.selectionStart);
  596. } else if(document.selection && document.selection.createRange) {
  597. return document.selection.createRange().text;
  598. } else if(window.getSelection) {
  599. return window.getSelection() + '';
  600. } else {
  601. return false;
  602. }
  603. }
  604. }
  605. function insertText(text, movestart, moveend, select, sel) {
  606. if(wysiwyg) {
  607. if(is_moz || is_opera) {
  608. applyFormat('removeformat');
  609. var fragment = editdoc.createDocumentFragment();
  610. var holder = editdoc.createElement('span');
  611. holder.innerHTML = text;
  612. while(holder.firstChild) {
  613. fragment.appendChild(holder.firstChild);
  614. }
  615. insertNodeAtSelection(fragment);
  616. } else {
  617. checkFocus();
  618. if(!isUndefined(editdoc.selection) && editdoc.selection.type != 'Text' && editdoc.selection.type != 'None') {
  619. movestart = false;
  620. editdoc.selection.clear();
  621. }
  622. if(isUndefined(sel)) {
  623. sel = editdoc.selection.createRange();
  624. }
  625. sel.pasteHTML(text);
  626. if(text.indexOf('n') == -1) {
  627. if(!isUndefined(movestart)) {
  628. sel.moveStart('character', -strlen(text) + movestart);
  629. sel.moveEnd('character', -moveend);
  630. } else if(movestart != false) {
  631. sel.moveStart('character', -strlen(text));
  632. }
  633. if(!isUndefined(select) && select) {
  634. sel.select();
  635. }
  636. }
  637. }
  638. } else {
  639. checkFocus();
  640. if(!isUndefined(editdoc.selectionStart)) {
  641. var opn = editdoc.selectionStart + 0;
  642. editdoc.value = editdoc.value.substr(0, editdoc.selectionStart) + text + editdoc.value.substr(editdoc.selectionEnd);
  643. if(!isUndefined(movestart)) {
  644. editdoc.selectionStart = opn + movestart;
  645. editdoc.selectionEnd = opn + strlen(text) - moveend;
  646. } else if(movestart !== false) {
  647. editdoc.selectionStart = opn;
  648. editdoc.selectionEnd = opn + strlen(text);
  649. }
  650. } else if(document.selection && document.selection.createRange) {
  651. if(isUndefined(sel)) {
  652. sel = document.selection.createRange();
  653. }
  654. sel.text = text.replace(/r?n/g, 'rn');
  655. if(!isUndefined(movestart)) {
  656. sel.moveStart('character', -strlen(text) +movestart);
  657. sel.moveEnd('character', -moveend);
  658. } else if(movestart !== false) {
  659. sel.moveStart('character', -strlen(text));
  660. }
  661. sel.select();
  662. } else {
  663. editdoc.value += text;
  664. }
  665. }
  666. }
  667. function stripSimple(tag, str, iterations) {
  668. var opentag = '[' + tag + ']';
  669. var closetag = '[/' + tag + ']';
  670. if(isUndefined(iterations)) {
  671. iterations = -1;
  672. }
  673. while((startindex = stripos(str, opentag)) !== false && iterations != 0) {
  674. iterations --;
  675. if((stopindex = stripos(str, closetag)) !== false) {
  676. var text = str.substr(startindex + opentag.length, stopindex - startindex - opentag.length);
  677. str = str.substr(0, startindex) + text + str.substr(stopindex + closetag.length);
  678. } else {
  679. break;
  680. }
  681. }
  682. return str;
  683. }
  684. function stripComplex(tag, str, iterations) {
  685. var opentag = '[' + tag + '=';
  686. var closetag = '[/' + tag + ']';
  687. if(isUndefined(iterations)) {
  688. iterations = -1;
  689. }
  690. while((startindex = stripos(str, opentag)) !== false && iterations != 0) {
  691. iterations --;
  692. if((stopindex = stripos(str, closetag)) !== false) {
  693. var openend = stripos(str, ']', startindex);
  694. if(openend !== false && openend > startindex && openend < stopindex) {
  695. var text = str.substr(openend + 1, stopindex - openend - 1);
  696. str = str.substr(0, startindex) + text + str.substr(stopindex + closetag.length);
  697. } else {
  698. break;
  699. }
  700. } else {
  701. break;
  702. }
  703. }
  704. return str;
  705. }
  706. function stripos(haystack, needle, offset) {
  707. if(isUndefined(offset)) {
  708. offset = 0;
  709. }
  710. var index = haystack.toLowerCase().indexOf(needle.toLowerCase(), offset);
  711. return (index == -1 ? false : index);
  712. }
  713. function switchEditor(mode) {
  714. mode = parseInt(mode);
  715. if(mode == wysiwyg || !allowswitcheditor)  {
  716. return;
  717. }
  718. if(!mode) {
  719. var controlbar = $(editorid + '_controls');
  720. var controls = new Array();
  721. var buttons = controlbar.getElementsByTagName('a');
  722. var buttonslength = buttons.length;
  723. for(var i = 0; i < buttonslength; i++) {
  724. if(buttons[i].id) {
  725. controls[controls.length] = buttons[i].id;
  726. }
  727. }
  728. var controlslength = controls.length;
  729. for(var i = 0; i < controlslength; i++) {
  730. var control = $(controls[i]);
  731. if(control.id.indexOf(editorid + '_cmd_') != -1) {
  732. control.className = control.id.indexOf(editorid + '_cmd_custom') == -1 ? '' : 'plugeditor';
  733. control.state = false;
  734. control.mode = 'normal';
  735. } else if(control.id.indexOf(editorid + '_popup_') != -1) {
  736. control.state = false;
  737. }
  738. }
  739. }
  740. cursor = -1;
  741. stack = new Array();
  742. var parsedtext = getEditorContents();
  743. parsedtext = mode ? bbcode2html(parsedtext) : html2bbcode(parsedtext);
  744. wysiwyg = mode;
  745. $(editorid + '_mode').value = mode;
  746. newEditor(mode, parsedtext);
  747. editwin.focus();
  748. setCaretAtEnd();
  749. }
  750. function insertNodeAtSelection(text) {
  751. checkFocus();
  752. var sel = editwin.getSelection();
  753. var range = sel ? sel.getRangeAt(0) : editdoc.createRange();
  754. sel.removeAllRanges();
  755. range.deleteContents();
  756. var node = range.startContainer;
  757. var pos = range.startOffset;
  758. switch(node.nodeType) {
  759. case Node.ELEMENT_NODE:
  760. if(text.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
  761. selNode = text.firstChild;
  762. } else {
  763. selNode = text;
  764. }
  765. node.insertBefore(text, node.childNodes[pos]);
  766. add_range(selNode);
  767. break;
  768. case Node.TEXT_NODE:
  769. if(text.nodeType == Node.TEXT_NODE) {
  770. var text_length = pos + text.length;
  771. node.insertData(pos, text.data);
  772. range = editdoc.createRange();
  773. range.setEnd(node, text_length);
  774. range.setStart(node, text_length);
  775. sel.addRange(range);
  776. } else {
  777. node = node.splitText(pos);
  778. var selNode;
  779. if(text.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
  780. selNode = text.firstChild;
  781. } else {
  782. selNode = text;
  783. }
  784. node.parentNode.insertBefore(text, node);
  785. add_range(selNode);
  786. }
  787. break;
  788. }
  789. }
  790. function add_range(node) {
  791. checkFocus();
  792. var sel = editwin.getSelection();
  793. var range = editdoc.createRange();
  794. range.selectNodeContents(node);
  795. sel.removeAllRanges();
  796. sel.addRange(range);
  797. }
  798. function readNodes(root, toptag) {
  799. var html = "";
  800. var moz_check = /_moz/i;
  801. switch(root.nodeType) {
  802. case Node.ELEMENT_NODE:
  803. case Node.DOCUMENT_FRAGMENT_NODE:
  804. var closed;
  805. if(toptag) {
  806. closed = !root.hasChildNodes();
  807. html = '<' + root.tagName.toLowerCase();
  808. var attr = root.attributes;
  809. for(var i = 0; i < attr.length; ++i) {
  810. var a = attr.item(i);
  811. if(!a.specified || a.name.match(moz_check) || a.value.match(moz_check)) {
  812. continue;
  813. }
  814. html += " " + a.name.toLowerCase() + '="' + a.value + '"';
  815. }
  816. html += closed ? " />" : ">";
  817. }
  818. for(var i = root.firstChild; i; i = i.nextSibling) {
  819. html += readNodes(i, true);
  820. }
  821. if(toptag && !closed) {
  822. html += "</" + root.tagName.toLowerCase() + ">";
  823. }
  824. break;
  825. case Node.TEXT_NODE:
  826. html = htmlspecialchars(root.data);
  827. break;
  828. }
  829. return html;
  830. }
  831. function moveCursor(increment) {
  832. var test = cursor + increment;
  833. if(test >= 0 && stack[test] != null && !isUndefined(stack[test])) {
  834. cursor += increment;
  835. }
  836. }
  837. function addSnapshot(str) {
  838. if(stack[cursor] == str) {
  839. return;
  840. } else {
  841. cursor++;
  842. stack[cursor] = str;
  843. if(!isUndefined(stack[cursor + 1])) {
  844. stack[cursor + 1] = null;
  845. }
  846. }
  847. }
  848. function getSnapshot() {
  849. if(!isUndefined(stack[cursor]) && stack[cursor] != null) {
  850. return stack[cursor];
  851. } else {
  852. return false;
  853. }
  854. }
  855. function insertmedia() {
  856. InFloat = InFloat_Editor;
  857. if(is_ie) $(editorid + '_mediaurl').pos = getCaret();
  858. showMenu(editorid + '_popup_media', true, 0, 2);
  859. }
  860. function setmediacode(editorid) {
  861. checkFocus();
  862. if(is_ie) setCaret($(editorid + '_mediaurl').pos);
  863. insertText('[media='+$(editorid + '_mediatype').value+
  864. ','+$(editorid + '_mediawidth').value+
  865. ','+$(editorid + '_mediaheight').value+']'+
  866. $(editorid + '_mediaurl').value+'[/media]');
  867. $(editorid + '_mediaurl').value = '';
  868. hideMenu();
  869. }
  870. function setmediatype(editorid) {
  871. var ext = $(editorid + '_mediaurl').value.lastIndexOf('.') == -1 ? '' : $(editorid + '_mediaurl').value.substr($(editorid + '_mediaurl').value.lastIndexOf('.') + 1, $(editorid + '_mediaurl').value.length).toLowerCase();
  872. if(ext == 'rmvb') {
  873. ext = 'rm';
  874. }
  875. if($(editorid + '_mediatyperadio_' + ext)) {
  876. $(editorid + '_mediatyperadio_' + ext).checked = true;
  877. $(editorid + '_mediatype').value = ext;
  878. }
  879. }
  880. function clearcontent() {
  881. if(wysiwyg) {
  882. editdoc.body.innerHTML = is_moz ? '<br />' : '';
  883. } else {
  884. textobj.value = '';
  885. }
  886. }