editor.js 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780
  1. /*
  2. [Discuz!] (C)2001-2099 Comsenz Inc.
  3. This is NOT a freeware, use is subject to license terms
  4. $Id: editor.js 34614 2014-06-12 02:48:35Z nemohou $
  5. */
  6. var editorcurrentheight = 400, editorminheight = 400, savedataInterval = 30, editbox = null, editwin = null, editdoc = null, editcss = null, savedatat = null, savedatac = 0, autosave = 1, framemObj = null, cursor = -1, stack = [], initialized = false, postSubmited = false, editorcontroltop = false, editorcontrolwidth = false, editorcontrolheight = false, editorisfull = 0, fulloldheight = 0, savesimplodemode = null;
  7. EXTRAFUNC['keydown'] = [];
  8. EXTRAFUNC['keyup'] = [];
  9. EXTRAFUNC['mouseup'] = [];
  10. EXTRAFUNC['showEditorMenu'] = [];
  11. var EXTRASELECTION = '', EXTRASEL = null;
  12. function newEditor(mode, initialtext) {
  13. wysiwyg = parseInt(mode);
  14. if(!(BROWSER.ie || BROWSER.firefox || (BROWSER.opera >= 9 || BROWSER.rv))) {
  15. allowswitcheditor = wysiwyg = 0;
  16. }
  17. if(!allowswitcheditor) {
  18. $(editorid + '_switcher').style.display = 'none';
  19. }
  20. if(wysiwyg) {
  21. if($(editorid + '_iframe')) {
  22. editbox = $(editorid + '_iframe');
  23. } else {
  24. var iframe = document.createElement('iframe');
  25. iframe.frameBorder = '0';
  26. iframe.tabIndex = 2;
  27. iframe.hideFocus = true;
  28. iframe.style.display = 'none';
  29. editbox = textobj.parentNode.appendChild(iframe);
  30. editbox.id = editorid + '_iframe';
  31. }
  32. editwin = editbox.contentWindow;
  33. editdoc = editwin.document;
  34. writeEditorContents(isUndefined(initialtext) ? textobj.value : initialtext);
  35. } else {
  36. editbox = editwin = editdoc = textobj;
  37. if(!isUndefined(initialtext)) {
  38. writeEditorContents(initialtext);
  39. }
  40. addSnapshot(textobj.value);
  41. }
  42. setEditorEvents();
  43. initEditor();
  44. }
  45. function setEditorTip(s) {
  46. $(editorid + '_tip').innerHTML = ' ' + s;
  47. }
  48. function initEditor() {
  49. if(BROWSER.other) {
  50. $(editorid + '_controls').style.display = 'none';
  51. return;
  52. }
  53. var buttons = $(editorid + '_controls').getElementsByTagName('a');
  54. initesbar();
  55. for(var i = 0; i < buttons.length; i++) {
  56. if(buttons[i].id.indexOf(editorid + '_') != -1) {
  57. buttons[i].href = 'javascript:;';
  58. if(buttons[i].id.substr(buttons[i].id.indexOf('_') + 1) == 'fullswitcher') {
  59. buttons[i].innerHTML = !editorisfull ? '全屏' : '返回';
  60. buttons[i].onmouseover = function(e) {setEditorTip(editorisfull ? '恢复编辑器大小' : '全屏方式编辑');};
  61. buttons[i].onclick = function(e) {editorfull();doane();}
  62. } else if(buttons[i].id.substr(buttons[i].id.indexOf('_') + 1) == 'simple') {
  63. buttons[i].innerHTML = !simplodemode ? '常用' : '高级';
  64. buttons[i].onclick = function(e) {editorsimple();doane();}
  65. } else {
  66. _attachEvent(buttons[i], 'mouseover', function(e) {setEditorTip(BROWSER.ie ? window.event.srcElement.title : e.target.title);});
  67. if(buttons[i].id.substr(buttons[i].id.indexOf('_') + 1) == 'url') {
  68. buttons[i].onclick = function(e) {discuzcode('unlink');discuzcode('url');doane();};
  69. } else {
  70. if(!buttons[i].getAttribute('init')) {
  71. buttons[i].onclick = function(e) {discuzcode(this.id.substr(this.id.indexOf('_') + 1));doane();};
  72. }
  73. }
  74. }
  75. buttons[i].onmouseout = function(e) {setEditorTip('');};
  76. }
  77. }
  78. setUnselectable($(editorid + '_controls'));
  79. if(editorcontroltop === false && (BROWSER.ie && BROWSER.ie > 6 || !BROWSER.ie)) {
  80. seteditorcontrolpos();
  81. var obj = wysiwyg ? editwin.document.body.parentNode : $(editorid + '_textarea');
  82. editorcontrolwidth = $(editorid + '_controls').clientWidth - 8;
  83. ctrlmObj = document.createElement('div');
  84. ctrlmObj.style.display = 'none';
  85. ctrlmObj.style.height = $(editorid + '_controls').clientHeight + 'px';
  86. ctrlmObj.id = editorid + '_controls_mask';
  87. $(editorid + '_controls').parentNode.insertBefore(ctrlmObj, $(editorid + '_controls'));
  88. _attachEvent(window, 'scroll', function () { editorcontrolpos(); }, document);
  89. }
  90. if($(editorid + '_fullswitcher') && BROWSER.ie && BROWSER.ie < 7) {
  91. $(editorid + '_fullswitcher').onclick = function () {
  92. showDialog('您的浏览器不支持此功能,请升级浏览器版本', 'notice', '友情提示');
  93. };
  94. $(editorid + '_fullswitcher').className = 'xg1';
  95. }
  96. if($(editorid + '_svdsecond') && savedatat === null) {
  97. savedatac = savedataInterval;
  98. autosave = !getcookie('editorautosave_' + editorid) || getcookie('editorautosave_' + editorid) == 1 ? 1 : 0;
  99. savedataTime();
  100. savedatat = setInterval("savedataTime()", 10000);
  101. }
  102. checkFocus();
  103. }
  104. function initesbar() {
  105. if(!$(editorid + '_adv_s3')) {
  106. return;
  107. }
  108. var buttons = $(editorid + '_adv_s3').getElementsByTagName('A');
  109. var s = '';
  110. for(i = 0;i < buttons.length;i++) {
  111. if(i/2 == parseInt(i/2)) {
  112. s += '<p>';
  113. }
  114. s += buttons[i].outerHTML;
  115. }
  116. $(editorid + '_adv_s3').innerHTML = s;
  117. for(var i = 0; i < buttons.length; i++) {
  118. if(buttons[i].id.indexOf(editorid + '_') != -1) {
  119. buttons[i].href = 'javascript:;';
  120. if(buttons[i].id.substr(buttons[i].id.indexOf('_') + 1) == 'fullswitcher') {
  121. } else if(buttons[i].id.substr(buttons[i].id.indexOf('_') + 1) == 'simple') {
  122. } else {
  123. _attachEvent(buttons[i], 'mouseover', function(e) {setEditorTip(BROWSER.ie ? window.event.srcElement.title : e.target.title);});
  124. if(buttons[i].id.substr(buttons[i].id.indexOf('_') + 1) == 'url') {
  125. buttons[i].onclick = function(e) {discuzcode('unlink');discuzcode('url');doane();};
  126. } else {
  127. if(!buttons[i].getAttribute('init')) {
  128. buttons[i].onclick = function(e) {discuzcode(this.id.substr(this.id.indexOf('_') + 1));doane();};
  129. }
  130. }
  131. }
  132. buttons[i].onmouseout = function(e) {setEditorTip('');};
  133. }
  134. }
  135. }
  136. function savedataTime() {
  137. if(!autosave) {
  138. $(editorid + '_svdsecond').innerHTML = '<a title="点击开启自动保存" href="javascript:;" onclick="setAutosave()">开启自动保存</a> ';
  139. return;
  140. }
  141. if(!savedatac) {
  142. savedatac = savedataInterval;
  143. saveData();
  144. d = new Date();
  145. var h = d.getHours();
  146. var m = d.getMinutes();
  147. h = h < 10 ? '0' + h : h;
  148. m = m < 10 ? '0' + m : m;
  149. setEditorTip('数据已于 ' + h + ':' + m + ' 保存');
  150. }
  151. $(editorid + '_svdsecond').innerHTML = '<a title="点击关闭自动保存" href="javascript:;" onclick="setAutosave()">' + savedatac + ' 秒后保存</a> ';
  152. savedatac -= 10;
  153. }
  154. function setAutosave() {
  155. autosave = !autosave;
  156. setEditorTip(autosave ? '数据自动保存已开启' : '数据自动保存已关闭');
  157. setcookie('editorautosave_' + editorid, autosave ? 1 : -1, 2592000);
  158. savedataTime();
  159. }
  160. function unloadAutoSave() {
  161. if(autosave) {
  162. saveData();
  163. }
  164. }
  165. function seteditorcontrolpos() {
  166. var objpos = fetchOffset($(editorid + '_controls'));
  167. editorcontroltop = objpos['top'];
  168. }
  169. function editorcontrolpos() {
  170. if(editorisfull) {
  171. return;
  172. }
  173. var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
  174. if(scrollTop > editorcontroltop && editorcurrentheight > editorminheight) {
  175. $(editorid + '_controls').style.position = 'fixed';
  176. $(editorid + '_controls').style.top = '0px';
  177. $(editorid + '_controls').style.width = editorcontrolwidth + 'px';
  178. $(editorid + '_controls_mask').style.display = '';
  179. } else {
  180. $(editorid + '_controls').style.position = $(editorid + '_controls').style.top = $(editorid + '_controls').style.width = '';
  181. $(editorid + '_controls_mask').style.display = 'none';
  182. }
  183. }
  184. function editorsize(op, v) {
  185. var obj = wysiwyg ? editwin.document.body.parentNode : $(editorid + '_textarea');
  186. var editorheight = obj.clientHeight;
  187. if(!v) {
  188. if(op == '+') {
  189. editorheight += 200;
  190. } else{
  191. editorheight -= 200;
  192. }
  193. } else {
  194. editorheight = v;
  195. }
  196. editorcurrentheight = editorheight > editorminheight ? editorheight : editorminheight;
  197. if($(editorid + '_iframe')) {
  198. $(editorid + '_iframe').style.height = $(editorid + '_iframe').contentWindow.document.body.style.height = editorcurrentheight + 'px';
  199. }
  200. if(framemObj) {
  201. framemObj.style.height = editorcurrentheight + 'px';
  202. }
  203. $(editorid + '_textarea').style.height = editorcurrentheight + 'px';
  204. }
  205. var editorsizepos = [];
  206. function editorresize(e, op) {
  207. op = !op ? 1 : op;
  208. e = e ? e : window.event;
  209. if(op == 1) {
  210. if(wysiwyg) {
  211. var objpos = fetchOffset($(editorid + '_iframe'));
  212. framemObj = document.createElement('div');
  213. framemObj.style.width = $(editorid + '_iframe').clientWidth + 'px';
  214. framemObj.style.height = $(editorid + '_iframe').clientHeight + 'px';
  215. framemObj.style.position = 'absolute';
  216. framemObj.style.left = objpos['left'] + 'px';
  217. framemObj.style.top = objpos['top'] + 'px';
  218. $('append_parent').appendChild(framemObj);
  219. } else {
  220. framemObj = null;
  221. }
  222. editorsizepos = [e.clientY, editorcurrentheight, framemObj];
  223. document.onmousemove = function(e) {try{editorresize(e, 2);}catch(err){}};
  224. document.onmouseup = function(e) {try{editorresize(e, 3);}catch(err){}};
  225. doane(e);
  226. }else if(op == 2 && editorsizepos !== []) {
  227. var dragnow = e.clientY;
  228. editorsize('', editorsizepos[1] + dragnow - editorsizepos[0]);
  229. doane(e);
  230. }else if(op == 3) {
  231. if(wysiwyg) {
  232. $('append_parent').removeChild(editorsizepos[2]);
  233. }
  234. editorsizepos = [];
  235. document.onmousemove = null;
  236. document.onmouseup = null;
  237. }
  238. }
  239. function editorfull(op) {
  240. var op = !op ? 0 : op, control = $(editorid + '_controls'), area = $(editorid + '_textarea').parentNode, bbar = $(editorid + '_bbar'), iswysiwyg = wysiwyg;
  241. if(op) {
  242. var editorheight = document.documentElement.clientHeight - control.offsetHeight - bbar.offsetHeight - parseInt(getCurrentStyle(area, 'paddingTop', 'padding-top')) - parseInt(getCurrentStyle(area, 'paddingBottom', 'padding-bottom'));
  243. area.style.position = 'fixed';
  244. area.style.top = control.offsetHeight + 'px';
  245. area.style.height = editorheight + 'px';
  246. editorsize('', editorheight);
  247. bbar.style.position = 'fixed';
  248. bbar.style.top = (document.documentElement.clientHeight - bbar.offsetHeight) + 'px';
  249. return;
  250. }
  251. if(!editorisfull) {
  252. savesimplodemode = 0;
  253. if(simplodemode) {
  254. savesimplodemode = 1;
  255. editorsimple();
  256. }
  257. $(editorid + '_simple').style.visibility = 'hidden';
  258. fulloldheight = editorcurrentheight;
  259. document.body.style.overflow = 'hidden';
  260. document.body.scroll = 'no';
  261. control.style.position = 'fixed';
  262. control.style.top = '0px';
  263. control.style.left = '0px';
  264. control.style.width = '100%';
  265. control.style.minWidth = '800px';
  266. area.style.backgroundColor = $(editorid + '_textarea') ? getCurrentStyle($(editorid + '_textarea'), 'backgroundColor', 'background-color') : '#fff';
  267. $(editorid + '_switcher').style.paddingRight = '10px';
  268. var editorheight = document.documentElement.clientHeight - control.offsetHeight - bbar.offsetHeight - parseInt(getCurrentStyle(area, 'paddingTop', 'padding-top')) - parseInt(getCurrentStyle(area, 'paddingBottom', 'padding-bottom'));
  269. area.style.position = 'fixed';
  270. area.style.top = control.offsetHeight + 'px';
  271. area.style.left = '0px';
  272. area.style.width = '100%';
  273. area.style.height = editorheight + 'px';
  274. editorsize('', editorheight);
  275. bbar.style.position = 'fixed';
  276. bbar.style.top = (document.documentElement.clientHeight - bbar.offsetHeight) + 'px';
  277. bbar.style.left = '0px';
  278. bbar.style.width = '100%';
  279. control.style.zIndex = '500';
  280. area.style.zIndex = bbar.style.zIndex = '200';
  281. if($(editorid + '_resize')) {
  282. $(editorid + '_resize').style.display = 'none';
  283. }
  284. window.onresize = function() { editorfull(1); };
  285. editorisfull = 1;
  286. } else {
  287. if(savesimplodemode) {
  288. editorsimple();
  289. }
  290. $(editorid + '_simple').style.visibility = 'visible';
  291. window.onresize = null;
  292. document.body.style.overflow = 'auto';
  293. document.body.scroll = 'yes';
  294. control.style.position = control.style.top = control.style.left = control.style.width = control.style.minWidth = control.style.zIndex =
  295. area.style.position = area.style.top = area.style.left = area.style.width = area.style.height = area.style.zIndex =
  296. bbar.style.position = bbar.style.top = bbar.style.left = bbar.style.width = bbar.style.zIndex = '';
  297. editorheight = fulloldheight;
  298. $(editorid + '_switcher').style.paddingRight = '0px';
  299. editorsize('', editorheight);
  300. if($(editorid + '_resize')) {
  301. $(editorid + '_resize').style.display = '';
  302. }
  303. editorisfull = 0;
  304. editorcontrolpos();
  305. }
  306. $(editorid + '_fullswitcher').innerHTML = editorisfull ? '返回' : '全屏';
  307. initesbar();
  308. }
  309. function editorsimple() {
  310. if($(editorid + '_body').className == 'edt') {
  311. v = 'none';
  312. $(editorid + '_simple').innerHTML = '高级';
  313. $(editorid + '_body').className = 'edt simpleedt';
  314. $(editorid + '_adv_s1').className = 'b2r';
  315. $(editorid + '_adv_s2').className = 'b2r nbl';
  316. if(allowswitcheditor) {
  317. $(editorid + '_switcher').style.display = 'none';
  318. }
  319. $(editorid + '_adv_s3').className = 'b2r esbs';
  320. simplodemode = 1;
  321. } else {
  322. v = '';
  323. $(editorid + '_simple').innerHTML = '常用';
  324. $(editorid + '_body').className = 'edt';
  325. $(editorid + '_adv_s1').className = 'b1r';
  326. $(editorid + '_adv_s2').className = 'b2r nbr nbl';
  327. if(allowswitcheditor) {
  328. $(editorid + '_switcher').style.display = '';
  329. }
  330. $(editorid + '_adv_s3').className = 'b2r esb';
  331. simplodemode = 0;
  332. }
  333. setcookie('editormode_' + editorid, simplodemode ? 1 : -1, 2592000);
  334. for(i = 1;i <= 9;i++) {
  335. if($(editorid + '_adv_' + i)) {
  336. $(editorid + '_adv_' + i).style.display = v;
  337. }
  338. }
  339. var btns = $(editorid + '_adv_s3').getElementsByTagName('A');
  340. for(i = 0;i < btns.length;i++) {
  341. if(btns[i].getAttribute('adv')) {
  342. btns[i].style.display = v;
  343. }
  344. }
  345. }
  346. function pasteWord(str) {
  347. var mstest = /<\w[^>]* class="?[MsoNormal|xl]"?/gi;
  348. if(mstest.test(str)){
  349. str = str.replace(/<!--\[if[\s\S]+?<!\[endif\]-->/gi, "");
  350. str = str.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");
  351. str = str.replace(/<(\w[^>]*) style="([^"]*)"([^>]*)/gi, function ($1, $2, $3, $4) {
  352. var style = '';
  353. re = new RegExp('(^|[;\\s])color:\\s*([^;]+);?', 'ig');
  354. match = re.exec($3);
  355. if(match != null) {
  356. style += 'color:' + match[2] + ';';
  357. }
  358. re = new RegExp('(^|[;\\s])text-indent:\\s*([^;]+);?', 'ig');
  359. match = re.exec($3);
  360. if(match != null) {
  361. style += 'text-indent:' + parseInt(parseInt(match[2]) / 10) + 'em;';
  362. }
  363. re = new RegExp('(^|[;\\s])font-size:\\s*([^;]+);?', 'ig');
  364. match = re.exec($3);
  365. if(match != null) {
  366. style += 'font-size:' + match[2] + ';';
  367. }
  368. if(style) {
  369. style = ' style="' + style + '"';
  370. }
  371. return '<' + $2 + style + $4;
  372. });
  373. str = str.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");
  374. str = str.replace(/<\\?\?xml[^>]*>/gi, "");
  375. str = str.replace(/<\/?\w+:[^>]*>/gi, "");
  376. str = str.replace(/&nbsp;/, " ");
  377. var re = new RegExp("(<P)([^>]*>.*?)(<\/P>)", 'ig');
  378. str = str.replace(re, "<div$2</div>");
  379. if(!wysiwyg) {
  380. str = html2bbcode(str);
  381. }
  382. insertText(str, str.length, 0);
  383. }
  384. }
  385. var ctlent_enable = {8:1,9:1,13:1};
  386. function ctlent(event) {
  387. if(postSubmited == false && (event.ctrlKey && event.keyCode == 13) || (event.altKey && event.keyCode == 83) && editorsubmit) {
  388. if(in_array(editorsubmit.name, ['topicsubmit', 'replysubmit', 'editsubmit']) && !validate(editorform)) {
  389. doane(event);
  390. return;
  391. }
  392. postSubmited = true;
  393. editorsubmit.disabled = true;
  394. editorform.submit();
  395. return;
  396. }
  397. if(ctlent_enable[9] && event.keyCode == 9) {
  398. if(!wysiwyg) {
  399. insertText('\t', 1, 0);
  400. }
  401. doane(event);
  402. }
  403. if(ctlent_enable[8] && event.keyCode == 8 && wysiwyg) {
  404. var sel = getSel();
  405. if(sel) {
  406. insertText('', sel.length - 1, 0);
  407. doane(event);
  408. }
  409. }
  410. }
  411. function keyBackspace() {
  412. if(!wysiwyg) {
  413. return;
  414. }
  415. if(BROWSER.ie) {
  416. sel = editdoc.selection.createRange();
  417. sel.moveStart('character', -1);
  418. sel.moveEnd('character', 0);
  419. sel.select();
  420. editdoc.selection.clear();
  421. } else {
  422. editdoc.execCommand('delete', false, true);
  423. }
  424. }
  425. function keyMenu(code, func) {
  426. var km = 'kM' + Math.random();
  427. var hs = '<span id="' + km + '">' + code + '</span>';
  428. if(BROWSER.ie) {
  429. var range = document.selection.createRange();
  430. range.pasteHTML(hs);
  431. range.moveToElementText(editdoc.getElementById(km));
  432. range.moveStart("character");
  433. range.select();
  434. } else {
  435. var selection = editwin.getSelection();
  436. var range = selection.getRangeAt(0);
  437. var fragment = range.createContextualFragment(hs);
  438. range.insertNode(fragment);
  439. var tmp = editdoc.getElementById(km).firstChild;
  440. range.setStart(tmp, 1);
  441. range.setEnd(tmp, 1);
  442. selection.removeAllRanges();
  443. selection.addRange(range);
  444. }
  445. keyMenuObj = editdoc.getElementById(km);
  446. var b = fetchOffset(editbox);
  447. var o = fetchOffset(keyMenuObj);
  448. var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
  449. func(b.left + o.left, b.top + o.top - scrollTop);
  450. }
  451. function checkFocus() {
  452. if(wysiwyg) {
  453. if(BROWSER.rv) {
  454. return;
  455. }
  456. try {
  457. editwin.focus();
  458. } catch(e) {
  459. editwin.document.body.focus();
  460. }
  461. } else {
  462. textobj.focus();
  463. }
  464. }
  465. function checklength(theform) {
  466. var message = wysiwyg ? html2bbcode(getEditorContents()) : (!theform.parseurloff.checked ? parseurl(theform.message.value) : theform.message.value);
  467. showDialog('当前长度: ' + mb_strlen(message) + ' 字节,' + (postmaxchars != 0 ? '系统限制: ' + postminchars + ' 到 ' + postmaxchars + ' 字节。' : ''), 'notice', '字数检查');
  468. }
  469. function setUnselectable(obj) {
  470. if(BROWSER.ie && BROWSER.ie > 4 && typeof obj.tagName != 'undefined') {
  471. if(obj.hasChildNodes()) {
  472. for(var i = 0; i < obj.childNodes.length; i++) {
  473. setUnselectable(obj.childNodes[i]);
  474. }
  475. }
  476. if(obj.tagName != 'INPUT') {
  477. obj.unselectable = 'on';
  478. }
  479. }
  480. }
  481. function writeEditorContents(text) {
  482. if(wysiwyg) {
  483. if(text == '' && (BROWSER.firefox || BROWSER.opera)) {
  484. text = '<p></p>';
  485. }
  486. if(initialized && !(BROWSER.firefox && BROWSER.firefox >= '3' || BROWSER.opera)) {
  487. editdoc.body.innerHTML = text;
  488. } else {
  489. text = '<!DOCTYPE html PUBLIC "-/' + '/W3C/' + '/DTD XHTML 1.0 Transitional/' + '/EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
  490. '<html><head id="editorheader"><meta http-equiv="Content-Type" content="text/html; charset=' + charset + '" />' +
  491. (BROWSER.ie && BROWSER.ie > 7 ? '<meta http-equiv="X-UA-Compatible" content="IE=7" />' : '' ) +
  492. '<link rel="stylesheet" type="text/css" href="misc.php?css=' + STYLEID + '_wysiwyg&' + VERHASH + '" />' +
  493. (BROWSER.ie ? '<script>window.onerror = function() { return true; }</script>' : '') +
  494. '</head><body>' + text + '</body></html>';
  495. editdoc.designMode = allowhtml ? 'on' : 'off';
  496. editdoc = editwin.document;
  497. editdoc.open('text/html', 'replace');
  498. editdoc.write(text);
  499. editdoc.close();
  500. if(!BROWSER.ie) {
  501. var scriptNode = document.createElement("script");
  502. scriptNode.type = "text/javascript";
  503. scriptNode.text = 'window.onerror = function() { return true; }';
  504. editdoc.getElementById('editorheader').appendChild(scriptNode);
  505. }
  506. editdoc.body.contentEditable = true;
  507. editdoc.body.spellcheck = false;
  508. initialized = true;
  509. if(BROWSER.safari) {
  510. editdoc.onclick = safariSel;
  511. }
  512. }
  513. if(BROWSER.ie && BROWSER.ie <= 8) {
  514. checkpostbg = /<style[^>]+name="editorpostbg"[^>]*>body{background-image:url\("([^\[\<\r\n;'\"\?\(\)]+?)"\);}<\/style>/ig;
  515. var matches = checkpostbg.exec(text);
  516. if(matches != null) {
  517. editdoc.body.innerHTML += '<style type="text/css" name="editorpostbg">body{background-image:url("'+matches[1]+'");}</style>';
  518. }
  519. }
  520. } else {
  521. textobj.value = text;
  522. }
  523. setEditorStyle();
  524. }
  525. function safariSel(e) {
  526. e = e.target;
  527. if(e.tagName.match(/(img|embed)/i)) {
  528. var sel = editwin.getSelection(),rng= editdoc.createRange(true);
  529. rng.selectNode(e);
  530. sel.removeAllRanges();
  531. sel.addRange(rng);
  532. }
  533. }
  534. function getEditorContents() {
  535. return wysiwyg ? editdoc.body.innerHTML : editdoc.value;
  536. }
  537. function setEditorStyle() {
  538. if(wysiwyg) {
  539. textobj.style.display = 'none';
  540. editbox.style.display = '';
  541. editbox.className = textobj.className;
  542. if(BROWSER.ie) {
  543. editdoc.body.style.border = '0px';
  544. editdoc.body.addBehavior('#default#userData');
  545. try{$('subject').focus();} catch(e) {editwin.focus();}
  546. }
  547. if($(editorid + '_iframe')) {
  548. $(editorid + '_iframe').style.height = $(editorid + '_iframe').contentWindow.document.body.style.height = editorcurrentheight + 'px';
  549. }
  550. } else {
  551. var iframe = textobj.parentNode.getElementsByTagName('iframe')[0];
  552. if(iframe) {
  553. textobj.style.display = '';
  554. iframe.style.display = 'none';
  555. }
  556. if(BROWSER.ie) {
  557. try{
  558. $('subject').focus();
  559. } catch(e) {}
  560. }
  561. }
  562. if($('at_menu')) {
  563. $('at_menu').style.display = 'none';
  564. }
  565. }
  566. function setEditorEvents() {
  567. if(BROWSER.firefox || BROWSER.opera) {
  568. editdoc.addEventListener('mouseup', function(e) {mouseUp(e)}, true);
  569. editdoc.addEventListener('keyup', function(e) {keyUp(e)}, true);
  570. editwin.addEventListener('keydown', function(e) {keyDown(e)}, true);
  571. } else if(editdoc.attachEvent) {
  572. try{
  573. editdoc.attachEvent('onmouseup', mouseUp);
  574. editdoc.attachEvent('onkeyup', keyUp);
  575. editdoc.attachEvent('onkeydown', keyDown);
  576. } catch(e) {}
  577. }
  578. }
  579. function mouseUp(event) {
  580. if(wysiwyg) {
  581. setContext();
  582. }
  583. for(i in EXTRAFUNC['mouseup']) {
  584. EXTRAEVENT = event;
  585. try {
  586. eval(EXTRAFUNC['mouseup'][i] + '()');
  587. } catch(e) {}
  588. }
  589. }
  590. function keyUp(event) {
  591. if(wysiwyg) {
  592. setContext();
  593. }
  594. for(i in EXTRAFUNC['keyup']) {
  595. EXTRAEVENT = event;
  596. try {
  597. eval(EXTRAFUNC['keyup'][i] + '()');
  598. } catch(e) {}
  599. }
  600. }
  601. function keyDown(event) {
  602. ctlent(event);
  603. for(i in EXTRAFUNC['keydown']) {
  604. EXTRAEVENT = event;
  605. try {
  606. eval(EXTRAFUNC['keydown'][i] + '()');
  607. } catch(e) {}
  608. }
  609. }
  610. function wrapTags(tagname, useoption, selection) {
  611. if(isUndefined(selection)) {
  612. var selection = getSel();
  613. if(selection === false) {
  614. selection = '';
  615. } else {
  616. selection += '';
  617. }
  618. }
  619. if(useoption !== false) {
  620. var opentag = '[' + tagname + '=' + useoption + ']';
  621. } else {
  622. var opentag = '[' + tagname + ']';
  623. }
  624. var closetag = '[/' + tagname + ']';
  625. var text = opentag + selection + closetag;
  626. insertText(text, strlen(opentag), strlen(closetag), in_array(tagname, ['code', 'quote', 'free', 'hide']) ? true : false);
  627. }
  628. function applyFormat(cmd, dialog, argument) {
  629. if(wysiwyg) {
  630. editdoc.execCommand(cmd, (isUndefined(dialog) ? false : dialog), (isUndefined(argument) ? true : argument));
  631. return;
  632. }
  633. switch(cmd) {
  634. case 'bold':
  635. case 'italic':
  636. case 'underline':
  637. case 'strikethrough':
  638. wrapTags(cmd.substr(0, 1), false);
  639. break;
  640. case 'inserthorizontalrule':
  641. insertText('[hr]', 4, 0);
  642. break;
  643. case 'justifyleft':
  644. case 'justifycenter':
  645. case 'justifyright':
  646. wrapTags('align', cmd.substr(7));
  647. break;
  648. case 'fontname':
  649. wrapTags('font', argument);
  650. break;
  651. case 'fontsize':
  652. wrapTags('size', argument);
  653. break;
  654. case 'forecolor':
  655. wrapTags('color', argument);
  656. break;
  657. case 'hilitecolor':
  658. case 'backcolor':
  659. wrapTags('backcolor', argument);
  660. break;
  661. }
  662. }
  663. function isEmail(email) {
  664. return email.length > 6 && /^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/.test(email);
  665. }
  666. function insertAttachTag(aid) {
  667. var txt = '[attach]' + aid + '[/attach]';
  668. if(wysiwyg) {
  669. insertText(txt, false);
  670. } else {
  671. insertText(txt, strlen(txt), 0);
  672. }
  673. }
  674. function insertAttachimgTag(aid) {
  675. if(wysiwyg) {
  676. insertText('<img src="' + $('image_' + aid).src + '" border="0" aid="attachimg_' + aid + '" alt="" />', false);
  677. } else {
  678. var txt = '[attachimg]' + aid + '[/attachimg]';
  679. insertText(txt, strlen(txt), 0);
  680. }
  681. }
  682. function insertSmiley(smilieid) {
  683. checkFocus();
  684. var src = $('smilie_' + smilieid).src;
  685. var code = $('smilie_' + smilieid).alt;
  686. if(wysiwyg && allowsmilies && (!$('smileyoff') || $('smileyoff').checked == false)) {
  687. insertText('<img src="' + src + '" border="0" smilieid="' + smilieid + '" alt="" />', false);
  688. } else {
  689. code += ' ';
  690. insertText(code, strlen(code), 0);
  691. }
  692. hideMenu();
  693. }
  694. function discuzcode(cmd, arg) {
  695. if(cmd != 'redo') {
  696. addSnapshot(getEditorContents());
  697. }
  698. checkFocus();
  699. if(in_array(cmd, ['sml', 'inserthorizontalrule', 'url', 'quote', 'code', 'free', 'hide', 'aud', 'vid', 'fls', 'beginning', 'attach', 'image', 'pasteword', 'index', 'postbg', 'password']) || typeof EXTRAFUNC['showEditorMenu'][cmd] != 'undefined' || cmd == 'tbl' || in_array(cmd, ['fontname', 'fontsize', 'forecolor', 'backcolor']) && !arg) {
  700. showEditorMenu(cmd);
  701. return;
  702. } else if(cmd.substr(0, 3) == 'cst') {
  703. showEditorMenu(cmd.substr(5), cmd.substr(3, 1));
  704. return;
  705. } else if(cmd == 'page') {
  706. if(wysiwyg) {
  707. str = '<br /><p>[page]</p>';
  708. } else {
  709. str = '\n\n[page]';
  710. }
  711. insertText(str, strlen(str), 0);
  712. } else if(cmd == 'autotypeset') {
  713. autoTypeset();
  714. return;
  715. } else if(!wysiwyg && cmd == 'removeformat') {
  716. var simplestrip = new Array('b', 'i', 'u');
  717. var complexstrip = new Array('font', 'color', 'backcolor', 'size');
  718. var str = getSel();
  719. if(str === false) {
  720. return;
  721. }
  722. for(var tag in simplestrip) {
  723. str = stripSimple(simplestrip[tag], str);
  724. }
  725. for(var tag in complexstrip) {
  726. str = stripComplex(complexstrip[tag], str);
  727. }
  728. insertText(str);
  729. } else if(cmd == 'undo') {
  730. addSnapshot(getEditorContents());
  731. moveCursor(-1);
  732. if((str = getSnapshot()) !== false) {
  733. if(wysiwyg) {
  734. editdoc.body.innerHTML = str;
  735. } else {
  736. editdoc.value = str;
  737. }
  738. }
  739. } else if(cmd == 'redo') {
  740. moveCursor(1);
  741. if((str = getSnapshot()) !== false) {
  742. if(wysiwyg) {
  743. editdoc.body.innerHTML = str;
  744. } else {
  745. editdoc.value = str;
  746. }
  747. }
  748. } else if(!wysiwyg && in_array(cmd, ['insertorderedlist', 'insertunorderedlist'])) {
  749. var listtype = cmd == 'insertorderedlist' ? '1' : '';
  750. var opentag = '[list' + (listtype ? ('=' + listtype) : '') + ']\n';
  751. var closetag = '[/list]';
  752. if(txt = getSel()) {
  753. var regex = new RegExp('([\r\n]+|^[\r\n]*)(?!\\[\\*\\]|\\[\\/?list)(?=[^\r\n])', 'gi');
  754. txt = opentag + trim(txt).replace(regex, '$1[*]') + '\n' + closetag;
  755. insertText(txt, strlen(txt), 0);
  756. } else {
  757. insertText(opentag + closetag, opentag.length, closetag.length);
  758. while(listvalue = prompt('输入一个列表项目.\r\n留空或者点击取消完成此列表.', '')) {
  759. if(BROWSER.opera > 8) {
  760. listvalue = '\n' + '[*]' + listvalue;
  761. insertText(listvalue, strlen(listvalue) + 1, 0);
  762. } else {
  763. listvalue = '[*]' + listvalue + '\n';
  764. insertText(listvalue, strlen(listvalue), 0);
  765. }
  766. }
  767. }
  768. } else if(!wysiwyg && cmd == 'unlink') {
  769. var sel = getSel();
  770. sel = stripSimple('url', sel);
  771. sel = stripComplex('url', sel);
  772. insertText(sel);
  773. } else if(cmd == 'floatleft' || cmd == 'floatright') {
  774. var arg = cmd == 'floatleft' ? 'left' : 'right';
  775. if(wysiwyg) {
  776. if(txt = getSel()) {
  777. argm = arg == 'left' ? 'right' : 'left';
  778. insertText('<br style="clear: both"><table class="float" style="float: ' + arg + '; margin-' + argm + ': 5px;"><tbody><tr><td>' + txt + '</td></tr></tbody></table>', true);
  779. }
  780. } else {
  781. var opentag = '[float=' + arg + ']';
  782. var closetag = '[/float]';
  783. if(txt = getSel()) {
  784. txt = opentag + txt + closetag;
  785. insertText(txt, strlen(txt), 0);
  786. } else {
  787. insertText(opentag + closetag, opentag.length, closetag.length);
  788. }
  789. }
  790. } else if(cmd == 'rst') {
  791. loadData();
  792. setEditorTip('数据已恢复');
  793. } else if(cmd == 'svd') {
  794. saveData();
  795. setEditorTip('数据已保存');
  796. } else if(cmd == 'chck') {
  797. checklength(editorform);
  798. } else if(cmd == 'tpr') {
  799. if(confirm('您确认要清除所有内容吗?')) {
  800. clearContent();
  801. }
  802. } else if(cmd == 'downremoteimg') {
  803. showDialog('<div id="remotedowninfo"><p class="mbn">正在下载远程附件,请稍等……</p><p><img src="' + STATICURL + 'image/common/uploading.gif" alt="" /></p></div>', 'notice', '', null, 1);
  804. var message = wysiwyg ? html2bbcode(getEditorContents()) : (!editorform.parseurloff.checked ? parseurl(editorform.message.value) : editorform.message.value);
  805. var oldValidate = editorform.onsubmit;
  806. var oldAction = editorform.action;
  807. editorform.onsubmit = '';
  808. editorform.action = 'forum.php?mod=ajax&action=downremoteimg&inajax=1&fid='+fid+'&wysiwyg='+(wysiwyg ? 1 : 0);
  809. editorform.target = "ajaxpostframe";
  810. editorform.message.value = message;
  811. editorform.submit();
  812. editorform.onsubmit = oldValidate;
  813. editorform.action = oldAction;
  814. editorform.target = "";
  815. } else {
  816. var formatcmd = cmd == 'backcolor' && !BROWSER.ie ? 'hilitecolor' : cmd;
  817. try {
  818. var ret = applyFormat(formatcmd, false, (isUndefined(arg) ? true : arg));
  819. } catch(e) {
  820. var ret = false;
  821. }
  822. }
  823. if(cmd != 'undo') {
  824. addSnapshot(getEditorContents());
  825. }
  826. if(wysiwyg) {
  827. setContext(cmd);
  828. }
  829. if(in_array(cmd, ['bold', 'italic', 'underline', 'strikethrough', 'fontname', 'fontsize', 'forecolor', 'backcolor', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist', 'insertunorderedlist', 'floatleft', 'floatright', 'removeformat', 'unlink', 'undo', 'redo'])) {
  830. hideMenu();
  831. }
  832. doane();
  833. return ret;
  834. }
  835. function setContext(cmd) {
  836. var cmd = !cmd ? '' : cmd;
  837. var contextcontrols = new Array('bold', 'italic', 'underline', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist', 'insertunorderedlist');
  838. for(var i in contextcontrols) {
  839. var controlid = contextcontrols[i];
  840. var obj = $(editorid + '_' + controlid);
  841. if(obj != null) {
  842. if(cmd == 'clear') {
  843. obj.className = '';
  844. continue;
  845. }
  846. try {
  847. var state = editdoc.queryCommandState(contextcontrols[i]);
  848. } catch(e) {
  849. var state = false;
  850. }
  851. if(isUndefined(obj.state)) {
  852. obj.state = false;
  853. }
  854. if(obj.state != state) {
  855. obj.state = state;
  856. buttonContext(obj, state ? 'mouseover' : 'mouseout');
  857. }
  858. }
  859. }
  860. try {
  861. var fs = editdoc.queryCommandValue('fontname');
  862. } catch(e) {
  863. fs = null;
  864. }
  865. if(fs == '' && !BROWSER.ie && window.getComputedStyle) {
  866. fs = editdoc.body.style.fontFamily;
  867. } else if(fs == null) {
  868. fs = '';
  869. }
  870. fs = fs && cmd != 'clear' ? fs : '字体';
  871. if(fs != $(editorid + '_font').fontstate) {
  872. thingy = fs.indexOf(',') > 0 ? fs.substr(0, fs.indexOf(',')) : fs;
  873. $(editorid + '_font').innerHTML = thingy;
  874. $(editorid + '_font').fontstate = fs;
  875. }
  876. try {
  877. var ss = editdoc.queryCommandValue('fontsize');
  878. if(ss == null || ss == '' || cmd == 'clear') {
  879. ss = formatFontsize(editdoc.body.style.fontSize);
  880. } else {
  881. var ssu = ss.substr(-2);
  882. if(ssu == 'px' || ssu == 'pt') {
  883. ss = formatFontsize(ss);
  884. }
  885. }
  886. } catch(e) {
  887. ss = '大小';
  888. }
  889. if(ss != $(editorid + '_size').sizestate) {
  890. if($(editorid + '_size').sizestate == null) {
  891. $(editorid + '_size').sizestate = '';
  892. }
  893. $(editorid + '_size').innerHTML = ss;
  894. $(editorid + '_size').sizestate = ss;
  895. }
  896. }
  897. function buttonContext(obj, state) {
  898. if(state == 'mouseover') {
  899. obj.style.cursor = 'pointer';
  900. var mode = obj.state ? 'down' : 'hover';
  901. if(obj.mode != mode) {
  902. obj.mode = mode;
  903. obj.className = 'hover';
  904. }
  905. } else {
  906. var mode = obj.state ? 'selected' : 'normal';
  907. if(obj.mode != mode) {
  908. obj.mode = mode;
  909. obj.className = mode == 'selected' ? 'hover' : '';
  910. }
  911. }
  912. }
  913. function formatFontsize(csssize) {
  914. switch(csssize) {
  915. case '7.5pt':
  916. case '10px': return 1;
  917. case '13px':
  918. case '10pt': return 2;
  919. case '16px':
  920. case '12pt': return 3;
  921. case '18px':
  922. case '14pt': return 4;
  923. case '24px':
  924. case '18pt': return 5;
  925. case '32px':
  926. case '24pt': return 6;
  927. case '48px':
  928. case '36pt': return 7;
  929. default: return '大小';
  930. }
  931. }
  932. function showEditorMenu(tag, params) {
  933. var sel, selection;
  934. var str = '', strdialog = 0, stitle = '';
  935. var ctrlid = editorid + (params ? '_cst' + params + '_' : '_') + tag;
  936. var opentag = '[' + tag + ']';
  937. var closetag = '[/' + tag + ']';
  938. var menu = $(ctrlid + '_menu');
  939. var pos = [0, 0];
  940. var menuwidth = 270;
  941. var menupos = '43!';
  942. var menutype = 'menu';
  943. try {
  944. sel = wysiwyg ? (editdoc.selection.createRange() ? editdoc.selection.createRange() : editdoc.getSelection().getRangeAt(0)) : document.selection.createRange();
  945. } catch(e) {}
  946. selection = sel ? (wysiwyg ? sel.htmlText : sel.text) : getSel();
  947. if(BROWSER.rv) {
  948. selection = editdoc.getSelection();
  949. sel = selection.getRangeAt(0);
  950. selection = readNodes(sel.cloneContents(), false);
  951. }
  952. if(menu) {
  953. if($(ctrlid).getAttribute('menupos') !== null) {
  954. menupos = $(ctrlid).getAttribute('menupos');
  955. }
  956. if($(ctrlid).getAttribute('menuwidth') !== null) {
  957. menu.style.width = $(ctrlid).getAttribute('menuwidth') + 'px';
  958. }
  959. if(menupos == '00') {
  960. menu.className = 'fwinmask';
  961. if($(editorid + '_' + tag + '_menu').style.visibility == 'hidden') {
  962. $(editorid + '_' + tag + '_menu').style.visibility = 'visible';
  963. } else {
  964. showMenu({'ctrlid':ctrlid,'mtype':'win','evt':'click','pos':menupos,'timeout':250,'duration':3,'drag':ctrlid + '_ctrl'});
  965. }
  966. } else {
  967. showMenu({'ctrlid':ctrlid,'evt':'click','pos':menupos,'timeout':250,'duration':in_array(tag, ['fontname', 'fontsize', 'sml']) ? 2 : 3,'drag':1});
  968. }
  969. } else {
  970. switch(tag) {
  971. case 'url':
  972. str = '请输入链接地址:<br /><input type="text" id="' + ctrlid + '_param_1" style="width: 98%" value="" class="px" />'+
  973. (selection ? '' : '<br />请输入链接文字:<br /><input type="text" id="' + ctrlid + '_param_2" style="width: 98%" value="" class="px" />');
  974. break;
  975. case 'forecolor':
  976. showColorBox(ctrlid, 1);
  977. return;
  978. case 'backcolor':
  979. showColorBox(ctrlid, 1, '', 1);
  980. return;
  981. case 'inserthorizontalrule':
  982. showHrBox(ctrlid);
  983. break;
  984. case 'postbg':
  985. showHrBox(ctrlid, 'postbg');
  986. break;
  987. case 'password':
  988. str = '<p class="pbn">请输入帖子密码: <input type="text" id="' + ctrlid + '_param_1" size="10" value="" class="px" /></p>';
  989. break;
  990. case 'code':
  991. if(wysiwyg) {
  992. opentag = '<div class="blockcode"><blockquote>';
  993. closetag = '</blockquote></div><br />';
  994. }
  995. case 'quote':
  996. if(wysiwyg && tag == 'quote') {
  997. opentag = '<div class="quote"><blockquote>';
  998. closetag = '</blockquote></div><br />';
  999. }
  1000. case 'hide':
  1001. case 'free':
  1002. if(selection) {
  1003. return insertText((opentag + selection + closetag), strlen(opentag), strlen(closetag), true, sel);
  1004. }
  1005. var lang = {'quote' : '请输入要插入的引用', 'code' : '请输入要插入的代码', 'hide' : '请输入要隐藏的信息内容', 'free' : '如果您设置了帖子售价,请输入购买前免费可见的信息内容'};
  1006. str += lang[tag] + ':<br /><textarea id="' + ctrlid + '_param_1" style="width: 98%" cols="50" rows="5" class="txtarea"></textarea>' +
  1007. (tag == 'hide' ? '<br /><label><input type="radio" name="' + ctrlid + '_radio" id="' + ctrlid + '_radio_1" class="pc" checked="checked" />只有当浏览者回复本帖时才显示</label><br /><label><input type="radio" name="' + ctrlid + '_radio" id="' + ctrlid + '_radio_2" class="pc" />只有当浏览者积分高于</label> <input type="text" size="3" id="' + ctrlid + '_param_2" class="px pxs" /> 时才显示<br /><br /><label>有效天数:</label> <input type="text" size="3" id="' + ctrlid + '_param_3" class="px pxs" /> <br />距离发帖日期大于这个天数时标签自动失效' : '');
  1008. break;
  1009. case 'tbl':
  1010. str = '<p class="pbn">表格行数: <input type="text" id="' + ctrlid + '_param_1" size="2" value="2" class="px" /> &nbsp; 表格列数: <input type="text" id="' + ctrlid + '_param_2" size="2" value="2" class="px" /></p><p class="pbn">表格宽度: <input type="text" id="' + ctrlid + '_param_3" size="2" value="" class="px" /> &nbsp; 背景颜色: <input type="text" id="' + ctrlid + '_param_4" size="2" class="px" onclick="showColorBox(this.id, 2)" /></p><p class="xg2 pbn" style="cursor:pointer" onclick="showDialog($(\'tbltips_msg\').innerHTML, \'notice\', \'小提示\', null, 0)"><img id="tbltips" title="小提示" class="vm" src="' + IMGDIR + '/info_small.gif"> 快速书写表格提示</p>';
  1011. str += '<div id="tbltips_msg" style="display: none">“[tr=颜色]” 定义行背景<br />“[td=宽度]” 定义列宽<br />“[td=列跨度,行跨度,宽度]” 定义行列跨度<br /><br />快速书写表格范例:<div class=\'xs0\' style=\'margin:0 5px\'>[table]<br />Name:|Discuz!<br />Version:|X1<br />[/table]</div>用“|”分隔每一列,表格中如有“|”用“\\|”代替,换行用“\\n”代替。</div>';
  1012. break;
  1013. case 'aud':
  1014. str = '<p class="pbn">请输入音乐文件地址:</p><p class="pbn"><input type="text" id="' + ctrlid + '_param_1" class="px" value="" style="width: 220px;" /></p><p class="xg2 pbn">支持 wma mp3 ra rm 等音乐格式<br />示例: http://server/audio.wma</p>';
  1015. break;
  1016. case 'vid':
  1017. str = '<p class="pbn">请输入视频地址:</p><p class="pbn"><input type="text" value="" id="' + ctrlid + '_param_1" style="width: 220px;" class="px" /></p><p class="pbn">宽: <input id="' + ctrlid + '_param_2" size="5" value="500" class="px" /> &nbsp; 高: <input id="' + ctrlid + '_param_3" size="5" value="375" class="px" /></p><p class="xg2 pbn">支持优酷、土豆、56、酷6等视频站的视频网址<br />支持 wmv avi rmvb mov swf flv 等视频格式<br />示例: http://server/movie.wmv</p>';
  1018. break;
  1019. case 'fls':
  1020. str = '<p class="pbn">请输入 Flash 文件地址:</p><p class="pbn"><input type="text" id="' + ctrlid + '_param_1" class="px" value="" style="width: 220px;" /></p><p class="pbn">宽: <input id="' + ctrlid + '_param_2" size="5" value="" class="px" /> &nbsp; 高: <input id="' + ctrlid + '_param_3" size="5" value="" class="px" /></p><p class="xg2 pbn">支持 swf flv 等 Flash 网址<br />示例: http://server/flash.swf</p>';
  1021. break;
  1022. case 'beginning':
  1023. str = '<p class="pbn">请输入开头动画 Flash 或 图片 地址:</p><p class="pbn"><input type="text" id="' + ctrlid + '_param_1" class="px" value="" style="width: 220px;" /></p>';
  1024. str += '<p class="pbn">点击链接地址:</p><p class="pbn"><input type="text" id="' + ctrlid + '_param_2" class="px" value="" style="width: 220px;" /></p>';
  1025. str += '<p class="pbn">宽: <input id="' + ctrlid + '_param_3" size="5" value="" class="px" /> &nbsp; 高: <input id="' + ctrlid + '_param_4" size="5" value="" class="px" /></p>';
  1026. str += '<p class="pbn">停留秒数: <input id="' + ctrlid + '_param_8" size="5" value="" class="px" /></p>';
  1027. str += '<p class="pbn">载入、消失的效果: </p><p class="pbn"><input id="' + ctrlid + '_param_7" type="radio" name="effect" checked />无 &nbsp; <input id="' + ctrlid + '_param_5" type="radio" name="effect" />淡入淡出 &nbsp; <input id="' + ctrlid + '_param_6" type="radio" name="effect" />展开闭合</p>';
  1028. str += '<p class="xg2 pbn">支持 swf flv jpg gif png 网址<br />宽高范围: 宽400~1024 高300~640<br />示例: http://server/flash.swf</p>';
  1029. break;
  1030. case 'pasteword':
  1031. stitle = '从 Word 粘贴内容';
  1032. str = '<p class="px" style="height:300px"><iframe id="' + ctrlid + '_param_1" frameborder="0" style="width:100%;height:100%" onload="this.contentWindow.document.body.style.width=\'550px\';this.contentWindow.document.body.contentEditable=true;this.contentWindow.document.body.focus();this.onload=null"></iframe></p><p class="xg2 pbn">请通过快捷键(Ctrl+V)把 Word 文件中的内容粘贴到上方</p>';
  1033. menuwidth = 600;
  1034. menupos = '00';
  1035. menutype = 'win';
  1036. break;
  1037. case 'index':
  1038. stitle = '创建帖子目录';
  1039. str = '<p class="pbn">[index]<br />\n\
  1040. [#<span class="xi1">页码</span>]<span class="xi1">标题</span> &nbsp;&nbsp;<span class="xg1">跳转到指定的页</span><br />\n\
  1041. <span class="xi1">*</span>[#<span class="xi1">tid,pid</span>]<span class="xi1">标题</span> &nbsp;&nbsp;<span class="xg1">跳转到指定的帖子</span><br />\n\
  1042. [/index]<br />\n\
  1043. <br />\n\
  1044. <span class="xi1">页码</span> &nbsp;&nbsp;<span class="xg1">用 [page] 对当前帖子分页后的页码</span><br />\n\
  1045. <span class="xi1">tid,pid</span> &nbsp;&nbsp;<span class="xg1">帖子的 TID 和 PID</span><br />\n\
  1046. <span class="xi1">*</span> &nbsp;&nbsp;<span class="xg1">添加行首缩进</span></p>';
  1047. break;
  1048. default:
  1049. for(i in EXTRAFUNC['showEditorMenu']) {
  1050. EXTRASELECTION = selection;
  1051. EXTRASEL = sel;
  1052. try {
  1053. eval('str = ' + EXTRAFUNC['showEditorMenu'][i] + '(\'' + tag + '\', 0)');
  1054. } catch(e) {}
  1055. }
  1056. if(!str) {
  1057. str = '';
  1058. var haveSel = selection == null || selection == false || in_array(trim(selection), ['', 'null', 'undefined', 'false']) ? 0 : 1;
  1059. if(params == 1 && haveSel) {
  1060. return insertText((opentag + selection + closetag), strlen(opentag), strlen(closetag), true, sel);
  1061. }
  1062. var promptlang = custombbcodes[tag]['prompt'].split("\t");
  1063. for(var i = 1; i <= params; i++) {
  1064. if(i != params || !haveSel) {
  1065. str += (promptlang[i - 1] ? promptlang[i - 1] : '请输入第 ' + i + ' 个参数:') + '<br /><input type="text" id="' + ctrlid + '_param_' + i + '" style="width: 98%" value="" class="px" />' + (i < params ? '<br />' : '');
  1066. }
  1067. }
  1068. }
  1069. break;
  1070. }
  1071. var menu = document.createElement('div');
  1072. menu.id = ctrlid + '_menu';
  1073. menu.style.display = 'none';
  1074. menu.className = 'p_pof upf';
  1075. menu.style.width = menuwidth + 'px';
  1076. if(menupos == '00') {
  1077. menu.className = 'fwinmask';
  1078. s = '<table width="100%" cellpadding="0" cellspacing="0" class="fwin"><tr><td class="t_l"></td><td class="t_c"></td><td class="t_r"></td></tr><tr><td class="m_l">&nbsp;&nbsp;</td><td class="m_c">'
  1079. + '<h3 class="flb"><em>' + stitle + '</em><span><a onclick="hideMenu(\'\', \'win\');return false;" class="flbc" href="javascript:;">关闭</a></span></h3><div class="c">' + str + '</div>'
  1080. + '<p class="o pns"><button type="submit" id="' + ctrlid + '_submit" class="pn pnc"><strong>提交</strong></button></p>'
  1081. + '</td><td class="m_r"></td></tr><tr><td class="b_l"></td><td class="b_c"></td><td class="b_r"></td></tr></table>';
  1082. } else {
  1083. s = '<div class="p_opt cl"><span class="y" style="margin:-10px -10px 0 0"><a onclick="hideMenu();return false;" class="flbc" href="javascript:;">关闭</a></span><div>' + str + '</div><div class="pns mtn"><button type="submit" id="' + ctrlid + '_submit" class="pn pnc"><strong>提交</strong></button></div></div>';
  1084. }
  1085. menu.innerHTML = s;
  1086. $(editorid + '_editortoolbar').appendChild(menu);
  1087. showMenu({'ctrlid':ctrlid,'mtype':menutype,'evt':'click','duration':3,'cache':0,'drag':1,'pos':menupos});
  1088. }
  1089. try {
  1090. if($(ctrlid + '_param_1')) {
  1091. $(ctrlid + '_param_1').focus();
  1092. }
  1093. } catch(e) {}
  1094. var objs = menu.getElementsByTagName('*');
  1095. for(var i = 0; i < objs.length; i++) {
  1096. _attachEvent(objs[i], 'keydown', function(e) {
  1097. e = e ? e : event;
  1098. obj = BROWSER.ie ? event.srcElement : e.target;
  1099. if((obj.type == 'text' && e.keyCode == 13) || (obj.type == 'textarea' && e.ctrlKey && e.keyCode == 13)) {
  1100. if($(ctrlid + '_submit') && tag != 'image') $(ctrlid + '_submit').click();
  1101. doane(e);
  1102. } else if(e.keyCode == 27) {
  1103. hideMenu();
  1104. doane(e);
  1105. }
  1106. });
  1107. }
  1108. if($(ctrlid + '_submit')) $(ctrlid + '_submit').onclick = function() {
  1109. checkFocus();
  1110. switch(tag) {
  1111. case 'url':
  1112. var href = $(ctrlid + '_param_1').value;
  1113. href = (isEmail(href) ? 'mailto:' : '') + href;
  1114. if(href != '') {
  1115. var v = selection ? selection : ($(ctrlid + '_param_2').value ? $(ctrlid + '_param_2').value : href);
  1116. str = wysiwyg ? ('<a href="' + href + '">' + v + '</a>') : '[url=' + squarestrip(href) + ']' + v + '[/url]';
  1117. if(wysiwyg) {
  1118. insertText(str, str.length - v.length, 0, (selection ? true : false), sel);
  1119. } else {
  1120. insertText(str, str.length - v.length - 6, 6, (selection ? true : false), sel);
  1121. }
  1122. }
  1123. break;
  1124. case 'code':
  1125. if(wysiwyg) {
  1126. opentag = '<div class="blockcode"><blockquote>';
  1127. closetag = '</blockquote></div><br />';
  1128. if(!BROWSER.ie) {
  1129. selection = selection ? selection : '\n';
  1130. }
  1131. }
  1132. case 'quote':
  1133. if(wysiwyg && tag == 'quote') {
  1134. opentag = '<div class="quote"><blockquote>';
  1135. closetag = '</blockquote></div><br />';
  1136. if(!BROWSER.ie) {
  1137. selection = selection ? selection : '\n';
  1138. }
  1139. }
  1140. case 'hide':
  1141. case 'free':
  1142. if(tag == 'hide') {
  1143. var mincredits = parseInt($(ctrlid + '_param_2').value);
  1144. var expire = parseInt($(ctrlid + '_param_3').value);
  1145. if(expire > 0 || (mincredits > 0 && $(ctrlid + '_radio_2').checked)) {
  1146. opentag = '[hide=';
  1147. if(expire > 0) {
  1148. opentag += 'd'+expire;
  1149. }
  1150. if(mincredits > 0 && $(ctrlid + '_radio_2').checked) {
  1151. opentag += (expire > 0 ? ',' : '')+mincredits;
  1152. }
  1153. opentag += ']';
  1154. } else {
  1155. opentag = '[hide]';
  1156. }
  1157. }
  1158. str = $(ctrlid + '_param_1') && $(ctrlid + '_param_1').value ? $(ctrlid + '_param_1').value : (selection ? selection : '');
  1159. if(wysiwyg) {
  1160. str = preg_replace(['<', '>'], ['&lt;', '&gt;'], str);
  1161. str = str.replace(/\r?\n/g, '<br />');
  1162. }
  1163. str = opentag + str + closetag;
  1164. insertText(str, strlen(opentag), strlen(closetag), false, sel);
  1165. break;
  1166. case 'password':
  1167. str = $(ctrlid + '_param_1') && $(ctrlid + '_param_1').value ? $(ctrlid + '_param_1').value : (selection ? selection : '');
  1168. str = opentag + str + closetag;
  1169. insertText(str, strlen(opentag), strlen(closetag), false, sel);
  1170. break;
  1171. case 'tbl':
  1172. var rows = $(ctrlid + '_param_1').value;
  1173. var columns = $(ctrlid + '_param_2').value;
  1174. var width = $(ctrlid + '_param_3').value;
  1175. var bgcolor = $(ctrlid + '_param_4').value;
  1176. rows = /^[-\+]?\d+$/.test(rows) && rows > 0 && rows <= 30 ? rows : 2;
  1177. columns = /^[-\+]?\d+$/.test(columns) && columns > 0 && columns <= 30 ? columns : 2;
  1178. width = width.substr(width.length - 1, width.length) == '%' ? (width.substr(0, width.length - 1) <= 98 ? width : '98%') : (width <= 560 ? width : '98%');
  1179. bgcolor = /[\(\)%,#\w]+/.test(bgcolor) ? bgcolor : '';
  1180. if(wysiwyg) {
  1181. str = '<table cellspacing="0" cellpadding="0" style="width:' + (width ? width : '50%') + '" class="t_table"' + (bgcolor ? ' bgcolor="' + bgcolor + '"' : '') + '>';
  1182. for (var row = 0; row < rows; row++) {
  1183. str += '<tr>\n';
  1184. for (col = 0; col < columns; col++) {
  1185. str += '<td>&nbsp;</td>\n';
  1186. }
  1187. str += '</tr>\n';
  1188. }
  1189. str += '</table>\n';
  1190. } else {
  1191. str = '[table=' + (width ? width : '50%') + (bgcolor ? ',' + bgcolor : '') + ']\n';
  1192. for (var row = 0; row < rows; row++) {
  1193. str += '[tr]';
  1194. for (col = 0; col < columns; col++) {
  1195. str += '[td] [/td]';
  1196. }
  1197. str += '[/tr]\n';
  1198. }
  1199. str += '[/table]\n';
  1200. }
  1201. insertText(str, str.length, 0, false, sel);
  1202. break;
  1203. case 'aud':
  1204. insertText('[audio]' + $(ctrlid + '_param_1').value + '[/audio]', 7, 8, false, sel);
  1205. break;
  1206. case 'fls':
  1207. if($(ctrlid + '_param_2').value && $(ctrlid + '_param_3').value) {
  1208. insertText('[flash=' + parseInt($(ctrlid + '_param_2').value) + ',' + parseInt($(ctrlid + '_param_3').value) + ']' + squarestrip($(ctrlid + '_param_1').value) + '[/flash]', 7, 8, false, sel);
  1209. } else {
  1210. insertText('[flash]' + squarestrip($(ctrlid + '_param_1').value) + '[/flash]', 7, 8, false, sel);
  1211. }
  1212. break;
  1213. case 'beginning':
  1214. if($(ctrlid + '_param_1').value) {
  1215. insertText('[begin=' + squarestrip($(ctrlid + '_param_2').value) + ',' +
  1216. ($(ctrlid + '_param_3').value ? parseInt($(ctrlid + '_param_3').value) : 0) + ',' +
  1217. ($(ctrlid + '_param_4').value ? parseInt($(ctrlid + '_param_4').value) : 0) + ',' +
  1218. ($(ctrlid + '_param_5').checked ? 2 : ($(ctrlid + '_param_6').checked ? 1 : 0)) + ',' +
  1219. ($(ctrlid + '_param_8').value ? parseInt($(ctrlid + '_param_8').value) : 0) + ']' +
  1220. squarestrip($(ctrlid + '_param_1').value) + '[/begin]', 7, 8, false, sel);
  1221. }
  1222. break;
  1223. case 'vid':
  1224. var mediaUrl = $(ctrlid + '_param_1').value;
  1225. var auto = '';
  1226. var posque = mediaUrl.lastIndexOf('?');
  1227. posque = posque === -1 ? mb_strlen(mediaUrl) : posque;
  1228. var ext = mediaUrl.lastIndexOf('.') === -1 ? '' : mediaUrl.substring(mediaUrl.lastIndexOf('.') + 1, posque).toLowerCase();
  1229. ext = in_array(ext, ['mp3', 'wma', 'ra', 'rm', 'ram', 'mid', 'asx', 'wmv', 'avi', 'mpg', 'mpeg', 'rmvb', 'asf', 'mov', 'flv', 'swf']) ? ext : 'x';
  1230. if(ext == 'x') {
  1231. if(/^mms:\/\//.test(mediaUrl)) {
  1232. ext = 'mms';
  1233. } else if(/^(rtsp|pnm):\/\//.test(mediaUrl)) {
  1234. ext = 'rtsp';
  1235. }
  1236. }
  1237. var str = '[media=' + ext + ',' + $(ctrlid + '_param_2').value + ',' + $(ctrlid + '_param_3').value + ']' + squarestrip(mediaUrl) + '[/media]';
  1238. insertText(str, str.length, 0, false, sel);
  1239. break;
  1240. case 'image':
  1241. var width = parseInt($(ctrlid + '_param_2').value);
  1242. var height = parseInt($(ctrlid + '_param_3').value);
  1243. var src = $(ctrlid + '_param_1').value;
  1244. var style = '';
  1245. if(wysiwyg) {
  1246. style += width ? ' width=' + width : '';
  1247. style += height ? ' _height=' + height : '';
  1248. var str = '<img src=' + src + style + ' border=0 />';
  1249. insertText(str, str.length, 0, false, sel);
  1250. } else {
  1251. style += width || height ? '=' + width + ',' + height : '';
  1252. insertText('[img' + style + ']' + squarestrip(src) + '[/img]', 0, 0, false, sel);
  1253. }
  1254. hideMenu('', 'win');
  1255. $(ctrlid + '_param_1').value = '';
  1256. break;
  1257. case 'pasteword':
  1258. pasteWord($(ctrlid + '_param_1').contentWindow.document.body.innerHTML);
  1259. hideMenu('', 'win');
  1260. break;
  1261. case 'index':
  1262. if(wysiwyg) {
  1263. str = '[index]<br />[#]<br />[#]<br />[/index]';
  1264. } else {
  1265. str = '[index]\n[#]\n[#]\n[/index]';
  1266. }
  1267. insertText(str, str.length, 0, false, sel);
  1268. hideMenu('', 'win');
  1269. break;
  1270. default:
  1271. for(i in EXTRAFUNC['showEditorMenu']) {
  1272. EXTRASELECTION= selection;
  1273. try {
  1274. eval('str = ' + EXTRAFUNC['showEditorMenu'][i] + '(\'' + tag + '\', 1)');
  1275. } catch(e) {}
  1276. }
  1277. if(!str) {
  1278. str = '';
  1279. var first = $(ctrlid + '_param_1').value;
  1280. if($(ctrlid + '_param_2')) var second = $(ctrlid + '_param_2').value;
  1281. if($(ctrlid + '_param_3')) var third = $(ctrlid + '_param_3').value;
  1282. if((params == 1 && first) || (params == 2 && first && (haveSel || second)) || (params == 3 && first && second && (haveSel || third))) {
  1283. if(params == 1) {
  1284. str = first;
  1285. } else if(params == 2) {
  1286. str = haveSel ? selection : second;
  1287. opentag = '[' + tag + '=' + first + ']';
  1288. } else {
  1289. str = haveSel ? selection : third;
  1290. opentag = '[' + tag + '=' + first + ',' + second + ']';
  1291. }
  1292. insertText((opentag + str + closetag), strlen(opentag), strlen(closetag), true, sel);
  1293. }
  1294. }
  1295. break;
  1296. }
  1297. hideMenu();
  1298. };
  1299. }
  1300. function autoTypeset() {
  1301. var sel;
  1302. if(BROWSER.ie) {
  1303. sel = wysiwyg ? editdoc.selection.createRange() : document.selection.createRange();
  1304. }
  1305. var selection = sel ? (wysiwyg ? sel.htmlText.replace(/<\/?p>/ig, '<br />') : sel.text) : getSel();
  1306. selection = trim(selection);
  1307. selection = wysiwyg ? selection.replace(/<br( \/)?>(<br( \/)?>)+/ig, '</p>\n<p style="line-height: 30px; text-indent: 2em;">') : selection.replace(/\n\n+/g, '[/p]\n[p=30, 2, left]');
  1308. opentag = wysiwyg ? '<p style="line-height: 30px; text-indent: 2em;">' : '[p=30, 2, left]';
  1309. var s = opentag + selection + (wysiwyg ? '</p>' : '[/p]');
  1310. insertText(s, strlen(opentag), 4, false, sel);
  1311. hideMenu();
  1312. }
  1313. function getSel() {
  1314. if(wysiwyg) {
  1315. try {
  1316. selection = editwin.getSelection();
  1317. checkFocus();
  1318. range = selection ? selection.getRangeAt(0) : editdoc.createRange();
  1319. return readNodes(range.cloneContents(), false);
  1320. } catch(e) {
  1321. try {
  1322. var range = editdoc.selection.createRange();
  1323. if(range.htmlText && range.text) {
  1324. return range.htmlText;
  1325. } else {
  1326. var htmltext = '';
  1327. for(var i = 0; i < range.length; i++) {
  1328. htmltext += range.item(i).outerHTML;
  1329. }
  1330. return htmltext;
  1331. }
  1332. } catch(e) {
  1333. return '';
  1334. }
  1335. }
  1336. } else {
  1337. if(!isUndefined(editdoc.selectionStart)) {
  1338. return editdoc.value.substr(editdoc.selectionStart, editdoc.selectionEnd - editdoc.selectionStart);
  1339. } else if(document.selection && document.selection.createRange) {
  1340. return document.selection.createRange().text;
  1341. } else if(window.getSelection) {
  1342. return window.getSelection() + '';
  1343. } else {
  1344. return false;
  1345. }
  1346. }
  1347. }
  1348. function insertText(text, movestart, moveend, select, sel) {
  1349. checkFocus();
  1350. if(wysiwyg) {
  1351. try {
  1352. if(!editdoc.execCommand('insertHTML', false, text)) {
  1353. throw 'insertHTML Err';
  1354. }
  1355. } catch(e) {
  1356. try {
  1357. if(!isUndefined(editdoc.selection) && editdoc.selection.type != 'Text' && editdoc.selection.type != 'None') {
  1358. movestart = false;
  1359. editdoc.selection.clear();
  1360. }
  1361. range = isUndefined(sel) ? editdoc.selection.createRange() : sel;
  1362. range.pasteHTML(text);
  1363. if(text.indexOf('\n') == -1) {
  1364. if(!isUndefined(movestart)) {
  1365. range.moveStart('character', -strlen(text) + movestart);
  1366. range.moveEnd('character', -moveend);
  1367. } else if(movestart != false) {
  1368. range.moveStart('character', -strlen(text));
  1369. }
  1370. if(!isUndefined(select) && select) {
  1371. range.select();
  1372. }
  1373. }
  1374. } catch(e) {
  1375. if(!sel) {
  1376. var sel = editdoc.getSelection();
  1377. var range = sel.getRangeAt(0);
  1378. } else {
  1379. var range = sel;
  1380. }
  1381. if(range && range.insertNode) {
  1382. range.deleteContents();
  1383. }
  1384. var frag = range.createContextualFragment(text);
  1385. range.insertNode(frag);
  1386. }
  1387. }
  1388. } else {
  1389. if(!isUndefined(editdoc.selectionStart)) {
  1390. if(editdoc._selectionStart) {
  1391. editdoc.selectionStart = editdoc._selectionStart;
  1392. editdoc.selectionEnd = editdoc._selectionEnd;
  1393. editdoc._selectionStart = 0;
  1394. editdoc._selectionEnd = 0;
  1395. }
  1396. var opn = editdoc.selectionStart + 0;
  1397. editdoc.value = editdoc.value.substr(0, editdoc.selectionStart) + text + editdoc.value.substr(editdoc.selectionEnd);
  1398. if(!isUndefined(movestart)) {
  1399. editdoc.selectionStart = opn + movestart;
  1400. editdoc.selectionEnd = opn + strlen(text) - moveend;
  1401. } else if(movestart !== false) {
  1402. editdoc.selectionStart = opn;
  1403. editdoc.selectionEnd = opn + strlen(text);
  1404. }
  1405. } else if(document.selection && document.selection.createRange) {
  1406. if(isUndefined(sel)) {
  1407. sel = document.selection.createRange();
  1408. }
  1409. if(editbox.sel) {
  1410. sel = editbox.sel;
  1411. editbox.sel = null;
  1412. }
  1413. sel.text = text.replace(/\r?\n/g, '\r\n');
  1414. if(!isUndefined(movestart)) {
  1415. sel.moveStart('character', -strlen(text) +movestart);
  1416. sel.moveEnd('character', -moveend);
  1417. } else if(movestart !== false) {
  1418. sel.moveStart('character', -strlen(text));
  1419. }
  1420. sel.select();
  1421. } else {
  1422. editdoc.value += text;
  1423. }
  1424. }
  1425. checkFocus();
  1426. }
  1427. function stripSimple(tag, str, iterations) {
  1428. var opentag = '[' + tag + ']';
  1429. var closetag = '[/' + tag + ']';
  1430. if(isUndefined(iterations)) {
  1431. iterations = -1;
  1432. }
  1433. while((startindex = stripos(str, opentag)) !== false && iterations != 0) {
  1434. iterations --;
  1435. if((stopindex = stripos(str, closetag)) !== false) {
  1436. var text = str.substr(startindex + opentag.length, stopindex - startindex - opentag.length);
  1437. str = str.substr(0, startindex) + text + str.substr(stopindex + closetag.length);
  1438. } else {
  1439. break;
  1440. }
  1441. }
  1442. return str;
  1443. }
  1444. function readNodes(root, toptag) {
  1445. var html = "";
  1446. var moz_check = /_moz/i;
  1447. switch(root.nodeType) {
  1448. case Node.ELEMENT_NODE:
  1449. case Node.DOCUMENT_FRAGMENT_NODE:
  1450. var closed;
  1451. if(toptag) {
  1452. closed = !root.hasChildNodes();
  1453. html = '<' + root.tagName.toLowerCase();
  1454. var attr = root.attributes;
  1455. for(var i = 0; i < attr.length; ++i) {
  1456. var a = attr.item(i);
  1457. if(!a.specified || a.name.match(moz_check) || a.value.match(moz_check)) {
  1458. continue;
  1459. }
  1460. html += " " + a.name.toLowerCase() + '="' + a.value + '"';
  1461. }
  1462. html += closed ? " />" : ">";
  1463. }
  1464. for(var i = root.firstChild; i; i = i.nextSibling) {
  1465. html += readNodes(i, true);
  1466. }
  1467. if(toptag && !closed) {
  1468. html += "</" + root.tagName.toLowerCase() + ">";
  1469. }
  1470. break;
  1471. case Node.TEXT_NODE:
  1472. html = htmlspecialchars(root.data);
  1473. break;
  1474. }
  1475. return html;
  1476. }
  1477. function stripComplex(tag, str, iterations) {
  1478. var opentag = '[' + tag + '=';
  1479. var closetag = '[/' + tag + ']';
  1480. if(isUndefined(iterations)) {
  1481. iterations = -1;
  1482. }
  1483. while((startindex = stripos(str, opentag)) !== false && iterations != 0) {
  1484. iterations --;
  1485. if((stopindex = stripos(str, closetag)) !== false) {
  1486. var openend = stripos(str, ']', startindex);
  1487. if(openend !== false && openend > startindex && openend < stopindex) {
  1488. var text = str.substr(openend + 1, stopindex - openend - 1);
  1489. str = str.substr(0, startindex) + text + str.substr(stopindex + closetag.length);
  1490. } else {
  1491. break;
  1492. }
  1493. } else {
  1494. break;
  1495. }
  1496. }
  1497. return str;
  1498. }
  1499. function stripos(haystack, needle, offset) {
  1500. if(isUndefined(offset)) {
  1501. offset = 0;
  1502. }
  1503. var index = haystack.toLowerCase().indexOf(needle.toLowerCase(), offset);
  1504. return (index == -1 ? false : index);
  1505. }
  1506. function switchEditor(mode) {
  1507. if(mode == wysiwyg || !allowswitcheditor) {
  1508. return;
  1509. }
  1510. if(!mode) {
  1511. var controlbar = $(editorid + '_controls');
  1512. var controls = [];
  1513. var buttons = controlbar.getElementsByTagName('a');
  1514. var buttonslength = buttons.length;
  1515. for(var i = 0; i < buttonslength; i++) {
  1516. if(buttons[i].id) {
  1517. controls[controls.length] = buttons[i].id;
  1518. }
  1519. }
  1520. var controlslength = controls.length;
  1521. for(var i = 0; i < controlslength; i++) {
  1522. var control = $(controls[i]);
  1523. if(control.id.indexOf(editorid + '_') != -1) {
  1524. control.state = false;
  1525. control.mode = 'normal';
  1526. } else if(control.id.indexOf(editorid + '_popup_') != -1) {
  1527. control.state = false;
  1528. }
  1529. }
  1530. setContext('clear');
  1531. }
  1532. cursor = -1;
  1533. stack = [];
  1534. var parsedtext = getEditorContents();
  1535. parsedtext = mode ? bbcode2html(parsedtext) : html2bbcode(parsedtext);
  1536. wysiwyg = mode;
  1537. $(editorid + '_mode').value = mode;
  1538. newEditor(mode, parsedtext);
  1539. setEditorStyle();
  1540. editwin.focus();
  1541. setCaretAtEnd();
  1542. }
  1543. function setCaretAtEnd() {
  1544. if(wysiwyg) {
  1545. editdoc.body.innerHTML += '';
  1546. } else {
  1547. editdoc.value += '';
  1548. }
  1549. }
  1550. function moveCursor(increment) {
  1551. var test = cursor + increment;
  1552. if(test >= 0 && stack[test] != null && !isUndefined(stack[test])) {
  1553. cursor += increment;
  1554. }
  1555. }
  1556. function addSnapshot(str) {
  1557. if(stack[cursor] == str) {
  1558. return;
  1559. } else {
  1560. cursor++;
  1561. stack[cursor] = str;
  1562. if(!isUndefined(stack[cursor + 1])) {
  1563. stack[cursor + 1] = null;
  1564. }
  1565. }
  1566. }
  1567. function getSnapshot() {
  1568. if(!isUndefined(stack[cursor]) && stack[cursor] != null) {
  1569. return stack[cursor];
  1570. } else {
  1571. return false;
  1572. }
  1573. }
  1574. function squarestrip(str) {
  1575. str = str.replace('[', '%5B');
  1576. str = str.replace(']', '%5D');
  1577. return str;
  1578. }
  1579. function loadimgsize(imgurl, editor, p) {
  1580. var editor = !editor ? editorid : editor;
  1581. var s = new Object();
  1582. var p = !p ? '_image' : p;
  1583. s.img = new Image();
  1584. s.img.src = imgurl;
  1585. s.loadCheck = function () {
  1586. if(s.img.complete) {
  1587. $(editor + p + '_param_2').value = s.img.width ? s.img.width : '';
  1588. $(editor + p + '_param_3').value = s.img.height ? s.img.height : '';
  1589. } else {
  1590. setTimeout(function () {s.loadCheck();}, 100);
  1591. }
  1592. };
  1593. s.loadCheck();
  1594. }
  1595. function showHrBox(ctrlid, boxtype) {
  1596. if(typeof postimg_type == 'undefined') {
  1597. var scriptNode = document.createElement("script");
  1598. scriptNode.type = "text/javascript";
  1599. scriptNode.charset = charset ? charset : (BROWSER.firefox ? document.characterSet : document.charset);
  1600. scriptNode.src = 'data/cache/common_postimg.js?' + VERHASH;
  1601. $('append_parent').appendChild(scriptNode);
  1602. if(BROWSER.ie) {
  1603. scriptNode.onreadystatechange = function() {
  1604. _initHrBox(ctrlid, boxtype);
  1605. };
  1606. } else {
  1607. scriptNode.onload = function() {
  1608. _initHrBox(ctrlid, boxtype);
  1609. };
  1610. }
  1611. } else {
  1612. _initHrBox(ctrlid, boxtype);
  1613. }
  1614. }
  1615. function _initHrBox(ctrlid, boxtype) {
  1616. if(!$(ctrlid + '_menu')) {
  1617. var menu = document.createElement('div');
  1618. menu.id = ctrlid + '_menu';
  1619. menu.unselectable = true;
  1620. menu.style.display = 'none';
  1621. if(boxtype == 'postbg') {
  1622. menu.className = 'p_pop postbgbox';
  1623. var imglist = postimg_type['postbg'];
  1624. var str = '';
  1625. for(var i = 0; i < imglist.length; i++) {
  1626. str += '<input type="button" style="background-image: url(\''+ STATICURL+'image/postbg/'+imglist[i]+ '\');"' + ' onclick="'
  1627. + 'insertPostBackground(\''+imglist[i]+'\');'
  1628. + '" />' ;
  1629. }
  1630. } else {
  1631. menu.className = 'p_pop hrbox';
  1632. var hrimglist = postimg_type['hrline'];
  1633. var str = '';
  1634. for(var i = 0; i < hrimglist.length; i++) {
  1635. inserturl = (hrimglist[i] != '0.gif') ? "'"+STATICURL+'image/hrline/'+hrimglist[i]+"'" : 'false';
  1636. str += '<input type="button" style="background-image: url(\'' + STATICURL+'image/hrline/'+hrimglist[i]+ '\');"' + ' onclick="'
  1637. + 'insertHrImage('+inserturl+');'
  1638. + '" />' ;
  1639. }
  1640. }
  1641. menu.innerHTML = str;
  1642. $('append_parent').appendChild(menu);
  1643. }
  1644. }
  1645. function insertHrImage(url) {
  1646. checkFocus();
  1647. if(wysiwyg) {
  1648. if(url !== false) {
  1649. insertText('<br><img src="' + url + '" border="0" alt="" /><br><br>', false);
  1650. } else {
  1651. insertText('<hr class="l">', 14);
  1652. }
  1653. } else {
  1654. if(url !== false) {
  1655. code = '\n[img]'+url+'[/img]\n';
  1656. } else {
  1657. code = '[hr]';
  1658. }
  1659. insertText(code, strlen(code), 0);
  1660. }
  1661. hideMenu();
  1662. }
  1663. function insertPostBackground(img) {
  1664. checkFocus();
  1665. if(img != '0.gif') {
  1666. code = '[postbg]'+img+'[/postbg]';
  1667. if(wysiwyg) {
  1668. postbgElement = !BROWSER.ie ? editdoc.getElementsByName('editorpostbg') : editdoc.getElementsByTagName('style');
  1669. for(var i = 0; i < postbgElement.length; i++) {
  1670. postbgElement[i].parentNode.removeChild(postbgElement[i]);
  1671. }
  1672. editdoc.body.innerHTML += '<style type="text/css" name="editorpostbg">body{background-image:url("'+STATICURL+'image/postbg/'+img+'");}</style>';
  1673. } else {
  1674. editdoc.value = editdoc.value.replace(/\[postbg\]\s*([^\[\<\r\n;'\"\?\(\)]+?)\s*\[\/postbg\]/ig, '');
  1675. editdoc.value = editdoc.value+code;
  1676. }
  1677. } else {
  1678. if(wysiwyg) {
  1679. postbgElement = !BROWSER.ie ? editdoc.getElementsByName('editorpostbg') : editdoc.getElementsByTagName('style');
  1680. for(var i = 0; i < postbgElement.length; i++) {
  1681. postbgElement[i].parentNode.removeChild(postbgElement[i]);
  1682. }
  1683. } else {
  1684. editdoc.value = editdoc.value.replace(/\[postbg\]\s*([^\[\<\r\n;'\"\?\(\)]+?)\s*\[\/postbg\]/ig, '');
  1685. }
  1686. }
  1687. hideMenu();
  1688. }
  1689. if(typeof jsloaded == 'function') {
  1690. jsloaded('editor');
  1691. }