FTB-FreeTextBox.js
上传用户:lishan0805
上传日期:2019-12-08
资源大小:12048k
文件大小:48k
源码类别:

OA系统

开发平台:

C#

  1. /* main FTB object
  2. -------------------------------------- */
  3. function FTB_FreeTextBox(id, enableToolbars, readOnly, buttons, dropdownlists, breakMode, pasteMode, tabMode, startMode, clientSideTextChanged, designModeCss, designModeBodyTagCssClass, baseUrl, textDirection, buttonImageFormat, imageGalleryUrl, imageGalleryPath, receiveFocus, buttonWidth, buttonHeight) {
  4. this.debug = document.getElementById('debug');
  5. this.id = id;
  6. this.enableToolbars = enableToolbars;
  7. this.readOnly = readOnly;
  8. this.buttons = buttons;
  9. this.dropdownlists = dropdownlists;
  10. this.breakMode = breakMode;
  11. this.pasteMode = pasteMode;
  12. this.tabMode = tabMode;
  13. this.startMode = startMode;
  14. this.clientSideTextChanged = clientSideTextChanged;
  15. this.designModeCss = designModeCss;
  16. this.designModeBodyTagCssClass = designModeBodyTagCssClass;
  17. this.baseUrl = baseUrl;
  18. this.textDirection = textDirection;
  19. this.buttonImageFormat = buttonImageFormat; // currently unused
  20. this.imageGalleryUrl = imageGalleryUrl;
  21. this.imageGalleryPath = imageGalleryPath;
  22. this.hasFocus = false;
  23. this.mode = FTB_MODE_DESIGN;
  24. this.initialized = false;
  25. this.undoArray = new Array();
  26. this.undoArrayMax = 16;
  27. this.undoArrayPos = -1;
  28. this.lastEvent = null;
  29. //};
  30. //FTB_FreeTextBox.prototype.Initialize = function() {
  31. var ftb = this;
  32. // 2. Find everything
  33. //* windows
  34. this.htmlEditor = document.getElementById(this.id);
  35. if (FTB_Browser.isIE) {
  36. this.previewPane = eval(this.id + "_previewPane");
  37. this.designEditor = eval(this.id + "_designEditor");
  38. this.designEditor.ftb = this;
  39. this.designEditor.document.ftb = this;
  40. document.getElementById(this.id + "_designEditor").document.ftb = this;
  41. } else {
  42. this.previewPane = document.getElementById(this.id + "_previewPane").contentWindow;
  43. this.designEditor = document.getElementById(this.id + "_designEditor").contentWindow;
  44. this.designEditor.document.ftb = this;
  45. }
  46. //* areas
  47. this.toolbarArea = document.getElementById(this.id + "_toolbarArea");
  48. this.designEditorArea = document.getElementById(this.id + "_designEditorArea");
  49. this.htmlEditorArea = document.getElementById(this.id + "_htmlEditorArea");
  50. this.previewPaneArea = document.getElementById(this.id + "_previewPaneArea");
  51. //* tabs
  52. this.designModeTab = document.getElementById(this.id + "_designModeTab");
  53. if (this.designModeTab) {
  54. this.designModeTab.ftb = this;
  55. this.designModeTab.onclick = function() { if (!this.ftb.readOnly) {this.ftb.GoToDesignMode(); this.ftb.Focus(); this.ftb.UpdateToolbars(); }}
  56. }
  57. this.htmlModeTab = document.getElementById(this.id + "_htmlModeTab");
  58. if (this.htmlModeTab) {
  59. this.htmlModeTab.ftb = this;
  60. this.htmlModeTab.onclick = function() { if (!this.ftb.readOnly) {this.ftb.GoToHtmlMode(); this.ftb.Focus();  this.ftb.UpdateToolbars(); }}
  61. }
  62. this.previewModeTab = document.getElementById(this.id + "_previewModeTab");
  63. if (this.previewModeTab && !this.ftb.readOnly) {
  64. this.previewModeTab.ftb = this;
  65. this.previewModeTab.onclick = function() { if (!this.ftb.readOnly) {this.ftb.GoToPreviewMode();}}
  66. }
  67. //* ancestor area
  68. this.ancestorArea = document.getElementById(this.id + "_AncestorArea");
  69. // 3. Tell buttons who owns them
  70. //* setup buttons & dropdowns
  71. if (this.enableToolbars) {
  72. for(var i=0; i<this.buttons.length; i++) {
  73. button = this.buttons[i];
  74. button.ftb = this;
  75. if (!this.readOnly)
  76. button.Initialize();
  77. }
  78. for(var i=0; i<this.dropdownlists.length; i++) {
  79. dropdownlist = this.dropdownlists[i];
  80. dropdownlist.ftb = this;
  81. }
  82. }
  83.        
  84. // 4. Setup editor for use
  85. if (!this.readOnly) {
  86. this.designEditor.document.designMode = 'On';
  87. if (FTB_Browser.isGecko) this.designEditor.document.contentEditable = true;
  88.     }
  89. //((this.designModeCss != '') ? "<style type='text/css'>@import url(" + this.designModeCss + ");</style>" : "") + 
  90. this.designEditor.document.open();
  91. this.designEditor.document.write("<html" + ((this.textDirection == "rtl") ? " dir='rtl'" : "") + ">" + 
  92. "<head>" + 
  93. ((this.designModeCss != '') ? "<link rel='stylesheet' href='" + this.designModeCss + "' type='text/css' />" : "") + 
  94. ((this.baseUrl != '') ? "<base href='" + this.baseUrl + "' />" : "") + 
  95. "</head>" + 
  96. "<body" + ((this.designModeBodyTagCssClass != '') ? " class='" + this.designModeBodyTagCssClass + "'" : "") + ">" + 
  97. this.StoreUrls(this.htmlEditor.value) + 
  98. "</body>" + 
  99. "</html>");
  100. this.designEditor.document.close();
  101. if (FTB_Browser.isIE)   {
  102. this.designEditor.document.execCommand("2D-Position", true, true);
  103. this.designEditor.document.execCommand("MultipleSelection", true, true);
  104. }
  105. if (!this.readOnly) {
  106. if (FTB_Browser.isIE) this.designEditor.document.body.contentEditable = true;
  107. // enable this html area
  108. this.htmlEditor.disabled = '';
  109. }
  110. // IE can't get the style right until now...
  111. if (FTB_Browser.isIE) {
  112. this.designEditor.document.body.style.border = '0';
  113. }
  114. // 5. Add events
  115.     if (!this.readOnly) {
  116. if (FTB_Browser.isIE) {
  117. FTB_AddEvents(this.designEditor.document,
  118. new Array("keydown","keypress","mousedown"),
  119. function(e) { ftb.hasFocus=true; return ftb.Event(e); } 
  120. );
  121. FTB_AddEvent(this.designEditor.document.body,
  122. "blur",
  123. function(e) { ftb.Event(e); ftb.hasFocus=false; ftb.StoreHtml(); } 
  124. );
  125. } else {
  126. var evt = function(e) {
  127. //alert(this.document.ftb);
  128. if (this.document.ftb != null) {
  129. this.document.ftb.hasFocus=true; 
  130. this.document.ftb.Event(e);
  131. }
  132. return false;
  133. }
  134. this.designEditor.addEventListener("keydown", evt, true);
  135. this.designEditor.addEventListener("keypress", evt, true);
  136. this.designEditor.addEventListener("mousedown", evt, true);
  137.        // no paste event in Mozilla
  138. }
  139. FTB_AddEvents(this.designEditor,
  140. new Array("blur"),
  141. function(e) { ftb.hasFocus=false; ftb.Event(e); ftb.StoreHtml(); } 
  142. );
  143. }
  144.      
  145. if (this.startMode == FTB_MODE_HTML)
  146. this.GoToHtmlMode();
  147. if (this.readOnly) 
  148. this.DisableAllToolbarItems();
  149. else
  150. this.UpdateToolbars();
  151. this.undoArray[0] = this.htmlEditorArea.value;
  152. this.initialized = true;
  153. if (FTB_Browser.isGecko && !this.readOnly && this.startMode != FTB_MODE_HTML) {
  154. this.designEditor.document.designMode = 'On';
  155. this.designEditor.document.execCommand("useCSS", false, true);
  156. }
  157. if (this.receiveFocus) this.Focus();
  158. };
  159. FTB_FreeTextBox.prototype.StoreUrls = function(input) {
  160. // store urls in temporary attribute (if not already done)
  161. if (!input.match(/(temp_src|temp_href)/gi, input)) {
  162. input = input.replace(new RegExp('src\s*=\s*"([^ >"]*)"', 'gi'), 'src="$1" temp_src="$1"');
  163. input = input.replace(new RegExp('href\s*=\s*"([^ >"]*)"', 'gi'), 'href="$1" temp_href="$1"');
  164. }
  165. return input;
  166. }
  167. FTB_FreeTextBox.prototype.RemoveTempUrls = function(input) {
  168. input = input.replace(new RegExp('\s*temp_src\s*=\s*"([^ >"]*)"', 'gi'), '');
  169. input = input.replace(new RegExp('\s*temp_href\s*=\s*"([^ >"]*)"', 'gi'), '');
  170. return input;
  171. }
  172. FTB_FreeTextBox.prototype.DesignTabClick = function() {
  173. this.GoToDesignMode(); 
  174. this.Focus(); 
  175. this.UpdateToolbars(); 
  176. }
  177. FTB_FreeTextBox.prototype.HtmlTabClick = function() {
  178. this.GoToHtmlMode(); 
  179. this.Focus();
  180. this.UpdateToolbars();
  181. }
  182. FTB_FreeTextBox.prototype.RefreshDesignMode = function() {
  183. if (!this.readOnly && FTB_Browser.isGecko) {
  184. this.designEditor.document.designMode = 'on'; 
  185. this.designEditor.document.execCommand('useCSS', false, true); 
  186. }
  187. }
  188. FTB_FreeTextBox.prototype.AddStyle = function(css) {
  189. var styleEl=document.createElement('style');
  190. styleEl.type='text/css';
  191. styleEl.appendChild(css);
  192. this.designEditor.document.appendChild(styleEl);
  193. };
  194. FTB_FreeTextBox.prototype.Event = function(ev) {
  195.   this.hasFocus = true;
  196. if (ev != null) { 
  197.   if (FTB_Browser.isIE) {
  198.   sel = this.GetSelection();
  199.   r = this.CreateRange(sel);  
  200.  
  201.   // check for undo && redo
  202.   if (ev.ctrlKey && ev.keyCode == FTB_KEY_Z) {
  203.   this.Undo();
  204. this.CancelEvent(ev);
  205.   } else if (ev.ctrlKey && ev.keyCode == FTB_KEY_Y) { 
  206.   this.Redo(); 
  207. this.CancelEvent(ev);
  208.   } else {
  209.  
  210.   if (ev.keyCode == FTB_KEY_ENTER) {
  211.   if (this.breakMode == FTB_BREAK_BR || ev.ctrlKey) {
  212. if (sel.type == 'Control') {
  213. return;
  214. }
  215. if ((!this.CheckTag(r.parentElement(),'LI'))&&(!this.CheckTag(r.parentElement(),'H'))) {
  216. r.pasteHTML('<br>');
  217. this.CancelEvent(ev);
  218. r.select();
  219. r.collapse(false);
  220. return false;
  221.   } 
  222. } else if ((ev.ctrlKey && !ev.shiftKey && !ev.altKey)) {
  223. if (ev.keyCode == FTB_KEY_V || ev.keyCode == 118) {
  224. this.CapturePaste();
  225. this.CancelEvent(ev);
  226. }
  227.   } else if (ev.keyCode == FTB_KEY_TAB) {
  228.   if (this.CheckTag(r.parentElement(),'LI')) {
  229.   if (ev.shiftKey)
  230.   this.ExecuteCommand("outdent");
  231.   else
  232.   this.ExecuteCommand("indent");
  233.   this.CancelEvent(ev);
  234.   } else {  
  235.   switch (this.tabMode) {
  236.   default:
  237.   case FTB_TAB_NEXTCONTROL:
  238.   break;
  239.   case FTB_TAB_INSERTSPACES:
  240.   this.InsertHtml("&nbsp;&nbsp;&nbsp;");
  241.   this.CancelEvent(ev);
  242.   break;
  243.   case FTB_TAB_DISABLED:
  244.   this.CancelEvent(ev);
  245.   break;  
  246.   }
  247.   }
  248.   }
  249.   }
  250.  
  251.   } else {   
  252.   if (ev.type == "keypress" || ev.type == "keydown") {
  253.  
  254.  
  255. // check for undo && redo
  256. if (ev.ctrlKey && ev.which && ev.which == FTB_KEY_Z) {  
  257. this.Undo();
  258. this.CancelEvent(ev);
  259. } else if (ev.ctrlKey && ev.which && ev.which == FTB_KEY_Y) {  
  260. this.Redo(); 
  261. this.CancelEvent(ev);
  262. } else {
  263. if (ev.keyCode == FTB_KEY_ENTER) {
  264. if (this.breakMode == FTB_BREAK_P) {
  265. /*
  266. var insertP = true;
  267. var parent = this.GetParentElement();
  268. if ( parent != null ) 
  269. if (this.CheckTag(this.GetParentElement(),'LI') )
  270. insertP = false;
  271. if (!insertP) return;
  272. if ( parent != null ) {
  273. if ( !this.CheckTag(this.GetParentElement(),'P') )
  274. this.ExecuteCommand('formatblock','','p');
  275. } else {
  276. this.ExecuteCommand('formatblock','','p');
  277. }
  278. var parent = this.GetParentElement();
  279. p = this.designEditor.document.createElement('p');
  280. sel = this.GetSelection();
  281. r = this.CreateRange(sel);
  282. r.insertNode(p);
  283. r.selectNode(p);
  284. //p.focus();
  285. //
  286. //parent.insertBefore(p);
  287. this.CancelEvent(ev);
  288. */
  289. }
  290. // check for control+commands (not in Mozilla by default)
  291. } else if ((ev.ctrlKey && !ev.shiftKey && !ev.altKey)) {
  292. if (ev.which == FTB_KEY_V || ev.which == 118) {
  293. if (ev.which == 118 && this.pasteMode != FTB_PASTE_DEFAULT) {
  294. this.CapturePaste();
  295. this.CancelEvent(ev);
  296. }
  297. } else if (ev.which == FTB_KEY_B || ev.which == 98) {
  298. if (ev.which == FTB_KEY_B) this.ExecuteCommand('bold');
  299. this.CancelEvent(ev);
  300. } else if (ev.which == FTB_KEY_I || ev.which == 105) {
  301. if (ev.which == FTB_KEY_I) this.ExecuteCommand('italic');
  302. this.CancelEvent(ev);
  303. } else if (ev.which == FTB_KEY_U || ev.which == 117) {
  304. if (ev.which == FTB_KEY_U) this.ExecuteCommand('underline');  
  305. this.CancelEvent(ev);
  306. }
  307. } else if (ev.which == FTB_KEY_TAB) {
  308. if (this.CheckTag(r.parentElement,'LI')) {
  309. // do it's own thing!
  310. } else {  
  311. switch (this.tabMode) {
  312. default:
  313. case FTB_TAB_NEXTCONTROL:
  314. // unsupported in Mozilla
  315. break;
  316. case FTB_TAB_INSERTSPACES:
  317. // do it's own thing
  318. break;
  319. case FTB_TAB_DISABLED:
  320. this.CancelEvent(ev);
  321. break;  
  322. }
  323. }
  324. }
  325. }
  326.    } 
  327.   }
  328.   }
  329.  
  330. if (this.mode == FTB_MODE_DESIGN) {
  331. FTB_Timeout.addMethod(this.id+'_UpdateToolbars',this,'UpdateToolbars',200);
  332. }
  333. if (this.clientSideTextChanged)
  334. this.clientSideTextChanged(this);
  335. };
  336. FTB_FreeTextBox.prototype.CancelEvent = function(ev) {
  337. if (FTB_Browser.isIE) {
  338. ev.cancelBubble = true;
  339. ev.returnValue = false;
  340. } else {
  341. ev.preventDefault();
  342. ev.stopPropagation();
  343. }
  344. };
  345. FTB_FreeTextBox.prototype.InsertElement = function(el) {
  346. var sel = this.GetSelection();
  347. var range = this.CreateRange(sel);
  348. if (FTB_Browser.isIE) {
  349. range.pasteHTML(el.outerHTML);
  350. } else {
  351. this.InsertNodeAtSelection(el);
  352. }
  353. };
  354. FTB_FreeTextBox.prototype.RecordUndoStep = function() {
  355. if (!this.initialized) return;
  356. ++this.undoArrayPos;
  357. if (this.undoArrayPos >= this.undoArrayMax) {
  358. // remove the first element
  359. this.undoArray.shift();
  360. --this.undoArrayPos;
  361. }
  362. var take = true;
  363. var html = this.designEditor.document.body.innerHTML;
  364. if (this.undoArrayPos > 0)
  365. take = (this.undoArray[this.undoArrayPos - 1] != html);
  366. if (take) {
  367. this.undoArray[this.undoArrayPos] = html;
  368. } else {
  369. this.undoArrayPos--;
  370. }
  371. };
  372. FTB_FreeTextBox.prototype.Undo = function() {
  373. if (this.undoArrayPos > 0) {
  374. var html = this.undoArray[--this.undoArrayPos];
  375. if (html)
  376. this.designEditor.document.body.innerHTML = html;
  377. else 
  378. ++this.undoArrayPos;
  379. }
  380. };
  381. FTB_FreeTextBox.prototype.CanUndo = function() {
  382. return true;
  383. return (this.undoArrayPos > 0);
  384. };
  385. FTB_FreeTextBox.prototype.Redo = function() {
  386. if (this.undoArrayPos < this.undoArray.length - 1) {
  387. var html = this.undoArray[++this.undoArrayPos];
  388. if (html) 
  389. this.designEditor.document.body.innerHTML = html;
  390. else 
  391. --this.undoArrayPos;
  392. }
  393. };
  394. FTB_FreeTextBox.prototype.CanRedo = function() {
  395. return true;
  396. return (this.undoArrayPos < this.undoArray.length - 1);
  397. };
  398. FTB_FreeTextBox.prototype.CapturePaste = function() {
  399.  
  400.   switch (this.pasteMode) {
  401.   case FTB_PASTE_DISABLED:
  402.   return false;
  403.   case FTB_PASTE_TEXT:
  404.   if (window.clipboardData) {
  405. var text = window.clipboardData.getData('Text');
  406. text = text.replace(/<[^>]*>/gi,'');
  407. this.InsertHtml(text);
  408. } else {
  409. alert("Your browser does not support pasting rich content");
  410. }
  411. return false; 
  412.   default:
  413.   case FTB_PASTE_DEFAULT:
  414. try {
  415. this.ExecuteCommand('paste'); 
  416. } catch (e) {
  417. alert('Your security settings to not allow you to use this command.  Please visit http://www.mozilla.org/editor/midasdemo/securityprefs.html for more information.');
  418. }
  419.   return true;
  420.   }
  421. };
  422. FTB_FreeTextBox.prototype.Debug = function(text) {
  423. if (this.debug)
  424. this.debug.value += text + 'r';
  425. };
  426. FTB_FreeTextBox.prototype.UpdateToolbars = function() {
  427. if (this.hasFocus) {
  428. if (this.mode == FTB_MODE_DESIGN) {
  429. if (this.enableToolbars) {
  430. for (var i=0; i<this.buttons.length; i++) {
  431. button = this.buttons[i];
  432. if (button.customStateQuery)
  433. button.state = button.customStateQuery();
  434. else if (button.commandIdentifier != null && button.commandIdentifier != '')
  435. button.state = this.QueryCommandState(button.commandIdentifier);
  436. button.SetButtonBackground("Out");
  437. }
  438. for (var i=0; i<this.dropdownlists.length; i++) {
  439. dropdownlist = this.dropdownlists[i];
  440. if (dropdownlist.customStateQuery)
  441. dropdownlist.SetSelected(dropdownlist.customStateQuery());
  442. else if (dropdownlist.commandIdentifier != null && dropdownlist.commandIdentifier != '') 
  443. dropdownlist.SetSelected(this.QueryCommandValue(dropdownlist.commandIdentifier));
  444. }
  445. }
  446. this.UpdateAncestorTrail();
  447. }
  448. } else {
  449. if (this.enableToolbars) {
  450. for (var i=0; i<this.buttons.length; i++) {
  451. button = this.buttons[i];
  452. button.state = FTB_BUTTON_OFF;
  453. button.SetButtonBackground("Out");
  454. }
  455. for (var i=0; i<this.dropdownlists.length; i++) {
  456. dropdownlist = this.dropdownlists[i];
  457. dropdownlist.list.selectedIndex = 0;
  458. }
  459. }
  460. this.UpdateAncestorTrail();
  461. }
  462. if (!this.undoTimer) {
  463. this.RecordUndoStep();
  464. var editor = this;
  465. this.undoTimer = setTimeout(function() {
  466. editor.undoTimer = null;
  467. }, 500);
  468. }
  469. this.StoreHtml();
  470. this.SetToolbarItemsEnabledState();
  471. if (this.timerToolbar) 
  472. this.timerToolbar = null;
  473. };
  474. FTB_FreeTextBox.prototype.UpdateAncestorTrail = function() {
  475. if (this.ancestorArea)  {
  476. if (this.hasFocus) {
  477. ancestors = this.GetAllAncestors();
  478. this.ancestorArea.innerHTML = "Path(" + ancestors.length + "): ";
  479. for (var i = ancestors.length-1; i>-1; i--) {
  480. var el = ancestors[i];
  481. if (!el) {
  482. continue;
  483. }
  484. var a = document.createElement("a");
  485. a.href = "javascript:void();";
  486. a.el = el;
  487. a.ftb = this;
  488. a.onclick = function() {
  489. this.blur();
  490. this.ftb.SelectNodeContents(this.el);
  491. this.ftb.UpdateToolbars();
  492. return false;
  493. };
  494. a.oncontextmenu = function () {
  495. this.ftb.EditElementStyle(this.el);
  496. return false;
  497. }
  498. var txt = el.tagName.toLowerCase();
  499. if (txt == "input") txt = el.type;
  500. a.title = el.style.cssText;
  501. if (el.id) {
  502. txt += "#" + el.id;
  503. }
  504. if (el.className) {
  505. txt += "." + el.className;
  506. }
  507. a.appendChild(document.createTextNode("<" + txt + ">"));
  508. this.ancestorArea.appendChild(a);
  509. //if (i != 0)
  510. // this.ancestorArea.appendChild(document.createTextNode(String.fromCharCode(0xbb)));
  511. }
  512. } else {
  513. this.ancestorArea.innerHTML = "";
  514. }
  515. }
  516. };
  517. FTB_FreeTextBox.prototype.SetToolbarItemsEnabledState = function() {
  518. if (!this.enableToolbars) return;
  519. if (this.hasFocus || !this.initialized) {
  520. if (this.mode == FTB_MODE_DESIGN ) {
  521. for (i=0; i<this.buttons.length; i++) {
  522. button = this.buttons[i];
  523. if (button.customEnabled)
  524. button.customEnabled();
  525. else 
  526. button.disabled = false;
  527. if (button.disabled)
  528. this.DisableButton(button);
  529. else
  530. this.EnableButton(button);
  531. }
  532. for (i=0; i<this.dropdownlists.length; i++) {
  533. this.dropdownlists[i].list.disabled=false;
  534. }
  535. } else {
  536. for (i=0; i<this.buttons.length; i++) {
  537. button = this.buttons[i];
  538. if (button.htmlModeEnabled) 
  539. button.disabled=false
  540. else
  541. button.disabled = true;
  542. if (button.disabled)
  543. this.DisableButton(button);
  544. else
  545. this.EnableButton(button);
  546. }
  547. for (i=0; i<this.dropdownlists.length; i++) {
  548. this.dropdownlists[i].list.selectedIndex=0;
  549. this.dropdownlists[i].list.disabled=true;
  550. }
  551. }
  552. } else {
  553. // do nothing: uncomment code to disable buttons when the editor does not have focus
  554. /*
  555. for (i=0; i<this.buttons.length; i++)
  556. this.DisableButton(this.buttons[i]);
  557. for (i=0; i<this.dropdownlists.length; i++)
  558. this.dropdownlists[i].list.disabled=true;
  559. */
  560. }
  561. };
  562. FTB_FreeTextBox.prototype.DisableAllToolbarItems = function() {
  563. if (this.enableToolbars) {
  564. for (i=0; i<this.buttons.length; i++) {
  565. this.DisableButton(this.buttons[i]);
  566. }
  567. for (i=0; i<this.dropdownlists.length; i++) {
  568. this.dropdownlists[i].list.disabled=true;
  569. }
  570. }
  571. };
  572. FTB_FreeTextBox.prototype.EnableButton = function(button) {
  573. if (FTB_Browser.isIE)
  574. button.buttonImage.style.filter = "alpha(opacity = 100);";
  575. //button.td.style.filters.alpha.opacity = 100;
  576. else 
  577. button.buttonImage.style.MozOpacity = 1;
  578. };
  579. FTB_FreeTextBox.prototype.DisableButton = function(button) {
  580. button.state = FTB_BUTTON_OFF;
  581. button.SetButtonStyle("Out");
  582. if (FTB_Browser.isIE)
  583. button.buttonImage.style.filter = "alpha(opacity = 25);";
  584. //button.td.style.filters.alpha.opacity = 25;
  585. else 
  586. button.buttonImage.style.MozOpacity = 0.25;
  587. };
  588. FTB_FreeTextBox.prototype.CopyHtmlToIframe = function(iframe) {
  589.     if (this.initialized) {
  590. html = this.htmlEditor.value;
  591. iframe.document.body.innerHTML = this.StoreUrls(html);
  592. //this.Debug(html.replace('r','<R>').replace('t','<T>').replace('n','<N>'));
  593.     } else {
  594. iframe.document.open();
  595. iframe.document.write("<html>" + 
  596. "<head>" + 
  597. ((this.designModeCss != '' && FTB_Browser.isGecko) ? "<style type='text/css'>@import url(" + this.designModeCss + ");</style>" : "") + 
  598. ((this.baseUrl != '') ? "<base href='" + this.baseUrl + "' />" : "") + 
  599. "</head>" + 
  600. "<body>" + 
  601. this.StoreUrls(this.htmlEditor.value) + 
  602. "</body>" + 
  603. "</html>");
  604. //iframe.document.write(this.htmlEditor.value);
  605. iframe.document.close();
  606. }
  607. };
  608. FTB_FreeTextBox.prototype.CopyDesignToHtml = function() {
  609. // set all stored URLs
  610. var links = this.designEditor.document.getElementsByTagName('a');
  611. var imgs = this.designEditor.document.getElementsByTagName('img');
  612. for (var i=0; i<links.length; i++) {
  613. var stored = links[i].getAttribute('temp_href');
  614. if (stored) {
  615. links[i].setAttribute('href',stored);
  616. }
  617. }
  618. for (var i=0; i<imgs.length; i++) {
  619. var stored = imgs[i].getAttribute('temp_src');
  620. if (stored) {
  621. imgs[i].setAttribute('src',stored);
  622. }
  623. }
  624. var html = this.designEditor.document.body.innerHTML;
  625. html = this.RemoveTempUrls(html);
  626. this.htmlEditor.value = html;
  627. // clear out default moz & ie properties
  628. if (this.htmlEditor.value == '<br>' || this.htmlEditor.value == '<br>rn' || // Moz
  629. this.htmlEditor.value == '<P>&nbsp;</P>') { // IE
  630. this.htmlEditor.value = '';
  631. }
  632. };
  633. FTB_FreeTextBox.prototype.GoToHtmlMode = function() {
  634.     if (this.mode == FTB_MODE_DESIGN) this.CopyDesignToHtml();
  635. if (FTB_Browser.isGecko)
  636. this.designEditor.document.designMode = 'Off';
  637.     this.designEditorArea.style.display = 'none';
  638.     this.htmlEditorArea.style.display = '';
  639.     this.previewPaneArea.style.display = 'none';
  640.    
  641. if (this.ancestorArea) this.ancestorArea.innerHTML = "";    
  642.     this.SetActiveTab(this.htmlModeTab);    
  643.          
  644. this.mode = FTB_MODE_HTML;
  645.     //this.Focus();    
  646.     return true;
  647. };
  648. FTB_FreeTextBox.prototype.GoToDesignMode = function() {
  649. if (this.mode == FTB_MODE_DESIGN) return false;
  650. this.CopyHtmlToIframe(this.designEditor);
  651. this.designEditorArea.style.display = '';
  652. this.htmlEditorArea.style.display = 'none';
  653. this.previewPaneArea.style.display = 'none';
  654. // reset for Gecko
  655. if (FTB_Browser.isGecko) {
  656. this.designEditor.document.designMode = 'On';
  657. this.designEditor.document.execCommand("useCSS", false, true);
  658. }
  659.     
  660.     if (this.ancestorArea) 
  661. this.ancestorArea.innerHTML = "";
  662.     
  663. if (this.designModeTab)
  664. this.SetActiveTab(this.designModeTab);
  665.     
  666.     //this.SetToolbarItemsEnabledState();
  667.     
  668.     this.mode = FTB_MODE_DESIGN;
  669.     //this.Focus();
  670.     return true;
  671. };
  672. FTB_FreeTextBox.prototype.GoToPreviewMode = function() {
  673.     if (this.mode == FTB_MODE_DESIGN) this.CopyDesignToHtml();
  674.     this.CopyHtmlToIframe(this.previewPane);
  675.     this.designEditorArea.style.display = 'none';
  676.     this.htmlEditorArea.style.display = 'none';
  677.     this.previewPaneArea.style.display = '';
  678.       
  679.     this.SetActiveTab(this.previewModeTab);
  680.     if (this.ancestorArea) this.ancestorArea.innerHTML = "";
  681.     
  682.     this.mode = FTB_MODE_PREVIEW;
  683.     return true;
  684. };
  685. FTB_FreeTextBox.prototype.HtmlEncode = function( text ) {
  686. if ( typeof( text ) != "string" )
  687. text = text.toString() ;
  688. text = text.replace(/&/g, "&amp;") ;
  689. text = text.replace(/"/g, "&quot;") ;
  690. text = text.replace(/</g, "&lt;") ;
  691. text = text.replace(/>/g, "&gt;") ;
  692. text = text.replace(/'/g, "&#146;") ;
  693. return text ;
  694. };
  695. FTB_FreeTextBox.prototype.ExecuteCommand = function(commandName, middle, commandValue) {
  696. if (this.mode != FTB_MODE_DESIGN) return;
  697. this.designEditor.focus();
  698. if (commandName == 'backcolor' && !FTB_Browser.isIE) commandName = 'hilitecolor';
  699. if (!FTB_Browser.isIE) {
  700. this.designEditor.document.execCommand("useCSS",null,true);
  701. }
  702. this.designEditor.document.execCommand(commandName,middle,commandValue);
  703. if (this.clientSideTextChanged)
  704. this.clientSideTextChanged(this);
  705. };
  706. FTB_FreeTextBox.prototype.QueryCommandState = function(commandName) {
  707. if (this.mode != FTB_MODE_DESIGN) return false;
  708. try {
  709. if (this.designEditor.document.queryCommandState(commandName)) {
  710. return FTB_BUTTON_ON;
  711. } else {
  712. // special case for paragraph on IE
  713. if (commandName == 'justifyleft') {
  714. if (this.designEditor.document.queryCommandState('justifyright') == false &&
  715. this.designEditor.document.queryCommandState('justifycenter') == false &&
  716. this.designEditor.document.queryCommandState('justifyfull') == false ) {
  717. return FTB_BUTTON_ON;
  718. } else {
  719. return FTB_BUTTON_OFF;
  720. }
  721. } else { 
  722. return FTB_BUTTON_OFF;
  723. }
  724. }
  725. } catch(exp) {
  726. //document.getElementById('debug').value += 'n' + 'BUT ERROR: ' + commandName + 'n' + exp;
  727. return FTB_BUTTON_OFF;
  728. }
  729. };
  730. FTB_FreeTextBox.prototype.QueryCommandValue = function(commandName) {
  731. if (this.mode != FTB_MODE_DESIGN) return false;
  732. try {
  733. value = this.designEditor.document.queryCommandValue(commandName);
  734. } catch (err) {
  735. this.RefreshDesignMode();
  736. value = '';
  737. }
  738. switch (commandName) {
  739. case "backcolor":
  740. if (FTB_Browser.isIE) {
  741. value = FTB_IntToHexColor(value);
  742. } else {
  743. if (value == "") value = "#FFFFFF";
  744. }
  745. break;
  746. case "forecolor":
  747. if (FTB_Browser.isIE) {
  748. value = FTB_IntToHexColor(value);
  749. } else {
  750. if (value == "") value = "#000000";
  751. }
  752. break;
  753. case "formatBlock":
  754. if (!FTB_Browser.isIE) {
  755. if (value == "" || value == "<x>")
  756. value = "<p>";
  757. else
  758. value = "<" + value + ">";
  759. }
  760. break;
  761. }
  762. if (value == '' || value == null) {
  763. if (commandName == 'fontsize') return '3';
  764. if (commandName == 'fontname') return 'Times New Roman';
  765. if (commandName == 'forecolor') return '#000000';
  766. if (commandName == 'backcolor') return '#ffffff';
  767. }
  768. return value;
  769. };
  770. FTB_FreeTextBox.prototype.SurroundHtml = function(start,end) {
  771. if (this.mode == FTB_MODE_HTML) return;
  772. this.designEditor.focus();
  773. if (FTB_Browser.isIE) {
  774. var sel = this.designEditor.document.selection.createRange();
  775. html = start + sel.htmlText + end;
  776. sel.pasteHTML(html);
  777. } else {
  778.         selection = this.designEditor.window.getSelection();
  779.         if (selection) {
  780.             range = selection.getRangeAt(0);
  781.         } else {
  782.             range = this.designEditor.document.createRange();
  783.         } 
  784.         
  785.         this.InsertHtml(start + selection + end);
  786.         //this.InsertHtml(start + selection.toString().replace(/</g,"&lt;").replace(/</g,"&lt;").replace(/n/g,"<br>n") + end);
  787. }
  788. };
  789. FTB_FreeTextBox.prototype.InsertHtml = function(html) {
  790. if (this.mode != FTB_MODE_DESIGN) return;
  791. this.designEditor.focus();
  792. if (FTB_Browser.isIE) {
  793. sel = this.designEditor.document.selection.createRange();
  794. sel.pasteHTML(html);
  795. } else {
  796.         selection = this.designEditor.window.getSelection();
  797. if (selection) {
  798. range = selection.getRangeAt(0);
  799. } else {
  800. range = editor.document.createRange();
  801. }
  802.         var fragment = this.designEditor.document.createDocumentFragment();
  803.         var div = this.designEditor.document.createElement("div");
  804.         div.innerHTML = html;
  805.         while (div.firstChild) {
  806.             fragment.appendChild(div.firstChild);
  807.         }
  808.         selection.removeAllRanges();
  809.         range.deleteContents();
  810.         var node = range.startContainer;
  811.         var pos = range.startOffset;
  812.         switch (node.nodeType) {
  813.             case 3:
  814.                 if (fragment.nodeType == 3) {
  815.                     node.insertData(pos, fragment.data);
  816.                     range.setEnd(node, pos + fragment.length);
  817.                     range.setStart(node, pos + fragment.length);
  818.                 } else {
  819.                     node = node.splitText(pos);
  820.                     node.parentNode.insertBefore(fragment, node);
  821.                     range.setEnd(node, pos + fragment.length);
  822.                     range.setStart(node, pos + fragment.length);
  823.                 }
  824.                 break;
  825.             case 1:
  826.                 node = node.childNodes[pos];
  827.                 node.parentNode.insertBefore(fragment, node);
  828.                 range.setEnd(node, pos + fragment.length);
  829.                 range.setStart(node, pos + fragment.length);
  830.                 break;
  831.         }
  832.         selection.addRange(range);
  833. }
  834. };
  835. /* ------------------------------------------------
  836. START: Node and Selection Methods */
  837. FTB_FreeTextBox.prototype.CheckTag = function(item,tagName) {
  838. if (!item) return null;
  839. if (item.tagName.search(tagName)!=-1) {
  840. return item;
  841. }
  842. if (item.tagName=='BODY') {
  843. return false;
  844. }
  845. item=item.parentElement;
  846. return this.CheckTag(item,tagName);
  847. };
  848. FTB_FreeTextBox.prototype.GetParentElement = function() {
  849. var sel = this.GetSelection();
  850. var range = this.CreateRange(sel);
  851. if (FTB_Browser.isIE) {
  852. switch (sel.type) {
  853.     case "Text":
  854.     case "None":
  855. return range.parentElement();
  856.     case "Control":
  857. return range.item(0);
  858.     default:
  859. return this.designEditor.document.body;
  860. }
  861. } else try {
  862. var p = range.commonAncestorContainer;
  863. if (!range.collapsed && range.startContainer == range.endContainer &&
  864.     range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes())
  865. p = range.startContainer.childNodes[range.startOffset];
  866. /*
  867. alert(range.startContainer + ":" + range.startOffset + "n" +
  868.       range.endContainer + ":" + range.endOffset);
  869. */
  870. while (p.nodeType == 3) {
  871. p = p.parentNode;
  872. }
  873. return p;
  874. } catch (e) {
  875. return null;
  876. }
  877. };
  878. FTB_FreeTextBox.prototype.InsertNodeAtSelection = function(toBeInserted) {
  879. if (!FTB_Browser.isIE) {
  880. var sel = this.GetSelection();
  881. var range = this.CreateRange(sel);
  882. // remove the current selection
  883. sel.removeAllRanges();
  884. range.deleteContents();
  885. var node = range.startContainer;
  886. var pos = range.startOffset;
  887. switch (node.nodeType) {
  888.     case 3: // Node.TEXT_NODE
  889. // we have to split it at the caret position.
  890. if (toBeInserted.nodeType == 3) {
  891. // do optimized insertion
  892. node.insertData(pos, toBeInserted.data);
  893. range = this._createRange();
  894. range.setEnd(node, pos + toBeInserted.length);
  895. range.setStart(node, pos + toBeInserted.length);
  896. sel.addRange(range);
  897. } else {
  898. node = node.splitText(pos);
  899. var selnode = toBeInserted;
  900. if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
  901. selnode = selnode.firstChild;
  902. }
  903. node.parentNode.insertBefore(toBeInserted, node);
  904. this.SelectNodeContents(selnode);
  905. }
  906. break;
  907.     case 1: // Node.ELEMENT_NODE
  908. var selnode = toBeInserted;
  909. if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
  910. selnode = selnode.firstChild;
  911. }
  912. node.insertBefore(toBeInserted, node.childNodes[pos]);
  913. this.SelectNodeContents(selnode);
  914. break;
  915. }
  916. }
  917. };
  918. FTB_FreeTextBox.prototype.SelectNodeContents = function(node, pos) {
  919. var range;
  920. var collapsed = (typeof pos != "undefined");
  921. if (isIE) {
  922. range = this.designEditor.document.body.createTextRange();
  923. range.moveToElementText(node);
  924. (collapsed) && range.collapse(pos);
  925. range.select();
  926. } else {
  927. var sel = this.GetSelection();
  928. range = this.designEditor.document.createRange();
  929. range.selectNodeContents(node);
  930. (collapsed) && range.collapse(pos);
  931. sel.removeAllRanges();
  932. sel.addRange(range);
  933. }
  934. };
  935. FTB_FreeTextBox.prototype.SelectNextNode = function(el) {
  936. var node = el.nextSibling;
  937. while (node && node.nodeType != 1) {
  938. node = node.nextSibling;
  939. }
  940. if (!node) {
  941. node = el.previousSibling;
  942. while (node && node.nodeType != 1) {
  943. node = node.previousSibling;
  944. }
  945. }
  946. if (!node) {
  947. node = el.parentNode;
  948. }
  949. this.SelectNodeContents(node);
  950. };
  951. FTB_FreeTextBox.prototype.GetSelection = function() {
  952. if (FTB_Browser.isIE) {
  953. return this.designEditor.document.selection;
  954. } else {
  955. return this.designEditor.getSelection();
  956. }
  957. };
  958. FTB_FreeTextBox.prototype.CreateRange = function(sel) {
  959. if (FTB_Browser.isIE) {
  960. return sel.createRange();
  961. } else {
  962. if (typeof sel != "undefined") {
  963. try {
  964. return sel.getRangeAt(0);
  965. } catch(e) {
  966. return this.designEditor.document.createRange();
  967. }
  968. } else {
  969. return this.designEditor.document.createRange();
  970. }
  971. }
  972. };
  973. FTB_FreeTextBox.prototype.SelectNodeContents = function(node, pos) {
  974. var range;
  975. var collapsed = (typeof pos != "undefined");
  976. if (FTB_Browser.isIE) {
  977. range = this.designEditor.document.body.createTextRange();
  978. range.moveToElementText(node);
  979. (collapsed) && range.collapse(pos);
  980. range.select();
  981. } else {
  982. var sel = this.GetSelection();
  983. range = this.designEditor.document.createRange();
  984. range.selectNodeContents(node);
  985. (collapsed) && range.collapse(pos);
  986. sel.removeAllRanges();
  987. sel.addRange(range);
  988. }
  989. };
  990. FTB_FreeTextBox.prototype.GetNearest = function(tagName) {
  991. var ancestors = this.GetAllAncestors();
  992. var ret = null;
  993. tagName = ("" + tagName).toLowerCase();
  994. for (var i=0;i<ancestors.length;i++) {
  995. var el = ancestors[i];
  996. if (el) {
  997. if (el.tagName.toLowerCase() == tagName) {
  998. ret = el;
  999. break;
  1000. }
  1001. }
  1002. }
  1003. return ret;
  1004. };
  1005. FTB_FreeTextBox.prototype.GetAllAncestors = function() {
  1006. var p = this.GetParentElement();
  1007. var a = [];
  1008. while (p && (p.nodeType == 1) && (p.tagName.toLowerCase() != 'body')) {
  1009. a.push(p);
  1010. p = p.parentNode;
  1011. }
  1012. a.push(this.designEditor.document.body);
  1013. return a;
  1014. };
  1015. FTB_FreeTextBox.prototype.GetStyle = function() {
  1016. var parent = this.GetParentElement();
  1017. return parent.className;
  1018. };
  1019. FTB_FreeTextBox.prototype.SetActiveTab = function(theTD) {
  1020. if (theTD) {
  1021. parentTR = theTD.parentElement;
  1022. parentTR = document.getElementById(this.id + "_TabRow");
  1023. selectedTab = 1;
  1024. totalButtons = parentTR.cells.length-1;
  1025. for (var i=1;i< totalButtons;i++) {
  1026. parentTR.cells[i].className = this.id + "_TabOffRight";
  1027. if (theTD == parentTR.cells[i]) { selectedTab = i; }
  1028. }
  1029. if (selectedTab==1) {
  1030. parentTR.cells[0].className = this.id + "_StartTabOn";
  1031. } else {
  1032. parentTR.cells[0].className = this.id + "_StartTabOff";
  1033. parentTR.cells[selectedTab-1].className = this.id + "_TabOffLeft";
  1034. }
  1035. theTD.className = this.id + "_TabOn";
  1036. }
  1037. };
  1038. FTB_FreeTextBox.prototype.Focus = function() {
  1039. if (this.mode == FTB_MODE_DESIGN) {
  1040. this.designEditor.focus();
  1041. this.UpdateToolbars();
  1042. } else if (this.mode == FTB_MODE_HTML) {
  1043. this.htmlEditor.focus();
  1044. }
  1045. this.hasFocus = true;
  1046. };
  1047. FTB_FreeTextBox.prototype.SetStyle = function(className) {
  1048. // retrieve parent element of the selection
  1049. var parent = this.GetParentElement();
  1050. var surround = true;
  1051. var isSpan = (parent && parent.tagName.toLowerCase() == "span");
  1052. /*
  1053. // remove class stuff??
  1054. if (isSpan && index == 0 && !/S/.test(parent.style.cssText)) {
  1055. while (parent.firstChild) {
  1056. parent.parentNode.insertBefore(parent.firstChild, parent);
  1057. }
  1058. parent.parentNode.removeChild(parent);
  1059. this.UpdateToolbars();
  1060. return;
  1061. }
  1062. */
  1063. // if we're already in a SPAN
  1064. if (isSpan) {
  1065. if (parent.childNodes.length == 1) {
  1066. parent.className = className;
  1067. surround = false;
  1068. this.UpdateToolbars();
  1069. return;
  1070. }
  1071. } else {
  1072. }
  1073. if (surround) {
  1074. this.SurroundHtml("<span class='" + className + "'>", "</span>");
  1075. }
  1076. };
  1077. FTB_FreeTextBox.prototype.GetHtml = function() {
  1078. if (this.mode == FTB_MODE_DESIGN)
  1079. this.CopyDesignToHtml();
  1080. return this.htmlEditor.value;
  1081. };
  1082. FTB_FreeTextBox.prototype.SetHtml = function(html) {
  1083. this.htmlEditor.value = html;
  1084. this.mode = FTB_MODE_HTML;
  1085. this.GoToDesignMode();
  1086. };
  1087. FTB_FreeTextBox.prototype.StoreHtml = function() {
  1088. if (!this.initialized) return;
  1089. if (this.mode == FTB_MODE_DESIGN)
  1090. this.CopyDesignToHtml();
  1091. return true;
  1092. };
  1093. /* START: Button Methods 
  1094. -------------------------------- */
  1095. FTB_FreeTextBox.prototype.DeleteContents = function() {
  1096. if (confirm('Do you want to delete all the HTML and text presently in the editor?')) {
  1097. this.designEditor.document.body.innerHTML = '';
  1098. this.htmlEditor.value='';
  1099. this.GoToDesignMode();
  1100. }
  1101. };
  1102. FTB_FreeTextBox.prototype.Cut = function() {
  1103. if (this.mode == FTB_MODE_DESIGN) {
  1104. try {
  1105. this.ExecuteCommand('cut'); 
  1106. } catch (e) {
  1107. alert('Your security settings to not allow you to use this command.  Please visit http://www.mozilla.org/editor/midasdemo/securityprefs.html for more information.');
  1108. }
  1109. } else {
  1110. //alert("TODO");
  1111. }
  1112. };
  1113. FTB_FreeTextBox.prototype.Copy = function() {
  1114. if (this.mode == FTB_MODE_DESIGN) {
  1115. try {
  1116. this.ExecuteCommand('copy');
  1117. } catch (e) {
  1118. alert('Your security settings to not allow you to use this command.  Please visit http://www.mozilla.org/editor/midasdemo/securityprefs.html for more information.');
  1119. }
  1120. } else {
  1121. //alert("TODO");
  1122. }
  1123. };
  1124. FTB_FreeTextBox.prototype.Paste = function() {
  1125. if (this.mode == FTB_MODE_DESIGN) this.CapturePaste();
  1126. }
  1127. FTB_FreeTextBox.prototype.SelectAll = function() {
  1128. if (this.mode == FTB_MODE_DESIGN) {
  1129. this.SelectNodeContents(this.designEditor.document.body);
  1130. }
  1131. };
  1132. FTB_FreeTextBox.prototype.Print = function() {
  1133. if (this.mode == FTB_MODE_DESIGN) {
  1134. if (FTB_Browser.isIE) {
  1135. this.ExecuteCommand('print'); 
  1136. } else {
  1137. this.designEditor.print();
  1138. }
  1139. } else {
  1140. printWindow = window.open('','','');
  1141. printWindow.document.open();
  1142. printWindow.document.write("<html><body><pre>" + this.HtmlEncode(this.htmlEditor.value) + "</code></body></html>");
  1143. printWindow.document.close();
  1144. printWindow.document.body.print();
  1145. printWindow.close();
  1146. }
  1147. };
  1148. FTB_FreeTextBox.prototype.CreateLink = function() {
  1149. var link = this.GetNearest('a');
  1150. var url = '';
  1151. if (link) {
  1152. var url = link.getAttribute('temp_href');
  1153. if (!url) url = link.getAttribute('href');
  1154. } else {
  1155. var sel = this.GetSelection();
  1156. var text = '';
  1157. if (FTB_Browser.isIE) {
  1158. text = sel.createRange().text;
  1159. } else {
  1160. text = new String(sel);
  1161. }
  1162. if (text == '') {
  1163. alert('Please select some text');
  1164. return;
  1165. }
  1166. }
  1167. url = prompt('Enter a URL:', (url != '') ? url : 'http://');
  1168. if (url != null) {
  1169. if (!link) {
  1170. var tempUrl = 'http://tempuri.org/tempuri.html';
  1171. this.ExecuteCommand('createlink',null,tempUrl);
  1172. var links = this.designEditor.document.getElementsByTagName('a');
  1173. for (var i=0;i<links.length;i++) {
  1174. if (links[i].href == tempUrl) {
  1175. link = links[i];
  1176. break;
  1177. }
  1178. }
  1179. }
  1180. link.href = url;
  1181. link.setAttribute('temp_href',url);
  1182. }
  1183. };
  1184. FTB_FreeTextBox.prototype.IeSpellCheck = function() {
  1185. if (!FTB_Browser.isIE) {
  1186. alert('IE Spell is not supported in Mozilla');
  1187. return;
  1188. }
  1189. try {
  1190. var tspell = new ActiveXObject('ieSpell.ieSpellExtension');
  1191. tspell.CheckAllLinkedDocuments(window.document);
  1192. } catch (err){
  1193. if (window.confirm('You need ieSpell to use spell check. Would you like to install it?')){
  1194. window.open('http://www.iespell.com/download.php');
  1195. };
  1196. }
  1197. };
  1198. FTB_FreeTextBox.prototype.NetSpell = function() {
  1199. if (typeof(checkSpellingById) == 'function') {
  1200. checkSpellingById(this.id + '_designEditor');
  1201. } else {
  1202. alert('Netspell libraries not properly linked.');
  1203. }
  1204. };
  1205. FTB_FreeTextBox.prototype.InsertImage = function() {
  1206. var img = this.GetNearest('img');
  1207. var imgSrc = '';
  1208. if (img) {
  1209. var imgSrc = img.getAttribute('temp_src');
  1210. if (!imgSrc) imgSrc = img.getAttribute('src');
  1211. }
  1212. imgSrc = prompt('Enter a URL:', (imgSrc != '') ? imgSrc : 'http://');
  1213. if (imgSrc != '') {
  1214. if (!img) {
  1215. var tempUrl = 'http://tempuri.org/tempuri.html';
  1216. this.ExecuteCommand('insertimage',null,tempUrl);
  1217. var imgs = this.designEditor.document.getElementsByTagName('img');
  1218. for (var i=0;i<imgs.length;i++) {
  1219. if (imgs[i].src == tempUrl) {
  1220. img = imgs[i];
  1221. break;
  1222. }
  1223. }
  1224. }
  1225. img.src = imgSrc;
  1226. img.setAttribute('temp_src',imgSrc);
  1227. }
  1228. };
  1229. FTB_FreeTextBox.prototype.SaveButton = function() {
  1230. this.StoreHtml();
  1231. dotNetName = this.id.split('_').join(':');
  1232. __doPostBack(dotNetName,'Save');
  1233. };
  1234. FTB_FreeTextBox.prototype.InsertImageFromGallery = function() {
  1235. url = this.imageGalleryUrl.replace(/{0}/g,this.imageGalleryPath);
  1236. url += "&ftb=" + this.id;
  1237. var gallery = window.open(url,'gallery','width=700,height=600,toolbars=0,resizable=1');
  1238. gallery.focus();
  1239. }
  1240. FTB_FreeTextBox.prototype.Preview = function() {
  1241. this.CopyDesignToHtml();
  1242. printWindow = window.open('','','toolbars=no');
  1243. printWindow.document.open();
  1244. printWindow.document.write("<html><head><link rel='stylesheet' href='" + this.designModeCss + "' type='text/css' />" + ((this.baseUrl != '') ? "<base href='" + this.baseUrl + "' />" : "") + "</head><body>" + this.htmlEditor.value + "</body></html>");
  1245. printWindow.document.close();
  1246. };
  1247. /* START: InsertTable */
  1248. FTB_FreeTextBox.prototype.InsertTable = function(cols,rows,width,widthUnit,align,cellpadding,cellspacing,border) {
  1249. this.designEditor.focus();
  1250. var sel = this.GetSelection();
  1251. var range = this.CreateRange(sel);
  1252. var doc = this.designEditor.document;
  1253. // create the table element
  1254. var table = doc.createElement("table");
  1255. // assign the given arguments
  1256. table.style.width  = width + widthUnit;
  1257. table.align   = align;
  1258. table.border   = border;
  1259. table.cellSpacing  = cellspacing;
  1260. table.cellPadding  = cellpadding;
  1261. var tbody = doc.createElement("tbody");
  1262. table.appendChild(tbody);
  1263. for (var i = 0; i < rows; ++i) {
  1264. var tr = doc.createElement("tr");
  1265. tbody.appendChild(tr);
  1266. for (var j = 0; j < cols; ++j) {
  1267. var td = doc.createElement("td");
  1268. tr.appendChild(td);
  1269. if (!FTB_Browser.isIE) td.appendChild(doc.createElement("br"));
  1270. }
  1271. }
  1272. if (FTB_Browser.isIE) {
  1273. range.pasteHTML(table.outerHTML);
  1274. } else {
  1275. this.InsertNodeAtSelection(table);
  1276. }
  1277. return true;
  1278. };
  1279. FTB_FreeTextBox.prototype.InsertTableWindow = function() {
  1280. this.LaunchTableWindow(false);
  1281. };
  1282. FTB_FreeTextBox.prototype.EditTable = function() {
  1283. this.LaunchTableWindow(true);
  1284. };
  1285. FTB_FreeTextBox.prototype.LaunchTableWindow = function(editing) {
  1286. var tableWin = window.open("","tableWin","width=400,height=200");
  1287. if (tableWin) {
  1288. tableWin.focus();
  1289. } else {
  1290. alert("Please turn off your PopUp blocking software");
  1291. return;
  1292. }
  1293. tableWin.document.body.innerHTML = '';
  1294. tableWin.document.open();
  1295. tableWin.document.write(FTB_TablePopUpHtml);
  1296. tableWin.document.close();
  1297. launchParameters = new Object();
  1298. launchParameters['ftb'] = this;
  1299. launchParameters['table'] = (editing) ? this.GetNearest("table") : null;
  1300. tableWin.launchParameters = launchParameters;
  1301. tableWin.load();
  1302. };
  1303. var FTB_TablePopUpHtml = new String("
  1304. <html><body> 
  1305. <head>
  1306. <title>Table Editor</title>
  1307. <style type='text/css'>
  1308. html, body { 
  1309. background-color: #eee; 
  1310. color: #000; 
  1311. font: 11px Tahoma,Verdana,sans-serif; 
  1312. padding: 0px; 
  1313. body { margin: 5px; } 
  1314. form { margin: 0px; padding: 0px;} 
  1315. table { 
  1316.   font: 11px Tahoma,Verdana,sans-serif; 
  1317. form p { 
  1318.   margin-top: 5px; 
  1319.   margin-bottom: 5px; 
  1320. h3 { margin: 0; margin-top: 4px;  margin-bottom: 5px; font-size: 12px; border-bottom: 2px solid #90A8F0; color: #90A8F0;} 
  1321. .fl { width: 9em; float: left; padding: 2px 5px; text-align: right; } 
  1322. .fr { width: 7em; float: left; padding: 2px 5px; text-align: right; } 
  1323. fieldset { padding: 0px 10px 5px 5px; } 
  1324. button { width: 75px; } 
  1325. select, input, button { font: 11px Tahoma,Verdana,sans-serif; } 
  1326. .space { padding: 2px; } 
  1327. .title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px; 
  1328. border-bottom: 1px solid black; letter-spacing: 2px; 
  1329. .f_title { text-align:right; }
  1330. .footer { border-top:2px solid #90A8F0; padding-top: 3px; margin-top: 4px; text-align:right; }</style>
  1331. <script type='text/javascript'>
  1332. function doTable() { 
  1333. ftb = window.launchParameters['ftb'];
  1334. table = window.launchParameters['table'];
  1335. if (table) { 
  1336. table.style.width = document.getElementById('f_width').value + document.getElementById('f_unit').options[document.getElementById('f_unit').selectedIndex].value; 
  1337. table.align = document.getElementById('f_align').options[document.getElementById('f_align').selectedIndex].value;  
  1338. table.cellPadding = (document.getElementById('f_padding').value.length > 0 && !isNaN(document.getElementById('f_padding').value)) ? parseInt(document.getElementById('f_padding').value) : ''; 
  1339. table.cellSpacing = (document.getElementById('f_spacing').value.length > 0 && !isNaN(document.getElementById('f_spacing').value)) ? parseInt(document.getElementById('f_spacing').value) : ''; 
  1340. table.border = parseInt(document.getElementById('f_border').value); 
  1341. } else {
  1342. cols = parseInt(document.getElementById('f_cols').value); 
  1343. rows = parseInt(document.getElementById('f_rows').value); 
  1344. width = document.getElementById('f_width').value; 
  1345. widthUnit = document.getElementById('f_unit').options[document.getElementById('f_unit').selectedIndex].value; 
  1346. align = document.getElementById('f_align').value; 
  1347. cellpadding = document.getElementById('f_padding').value; 
  1348. cellspacing = document.getElementById('f_spacing').value; 
  1349. border = document.getElementById('f_border').value; 
  1350. ftb.InsertTable(cols,rows,width,widthUnit,align,cellpadding,cellspacing,border); 
  1351. window.close(); 
  1352. }
  1353. </script>
  1354. </head>
  1355. <body>
  1356. <form action=''> 
  1357. <h3>Table Editor</h3> 
  1358. <table border='0' style='padding: 0px; margin: 0px'> 
  1359.   <tbody> 
  1360.   <tr> 
  1361.     <td style='width: 4em; text-align: right'>Rows:</td> 
  1362.     <td><input type='text' name='rows' id='f_rows' size='5' title='Number of rows' value='2' /></td> 
  1363.     <td></td> 
  1364.     <td></td> 
  1365.     <td></td> 
  1366.   </tr> 
  1367.   <tr> 
  1368.     <td style='width: 4em; text-align: right'>Cols:</td> 
  1369.     <td><input type='text' name='cols' id='f_cols' size='5' title='Number of columns' value='4' /></td> 
  1370.     <td style='width: 4em; text-align: right'>Width:</td> 
  1371.     <td><input type='text' name='width' id='f_width' size='5' title='Width of the table' value='100' /></td> 
  1372.     <td><select size='1' name='unit' id='f_unit' title='Width unit'> 
  1373.       <option value='%' selected='1'  >Percent</option> 
  1374.       <option value='px'              >Pixels</option> 
  1375.       <option value='em'              >Em</option> 
  1376.     </select></td> 
  1377.   </tr> 
  1378.   </tbody> 
  1379. </table> 
  1380. <table width='100%'>
  1381. <tr><td valign='top'>
  1382. <fieldset>
  1383. <legend>Layout</legend> 
  1384. <table>
  1385. <tr><td class='f_title'>Alignment:</td><td>
  1386. <select size='1' name='align' id='f_align' 
  1387. title='Positioning of the table'> 
  1388. <option value='' selected='1'                >Not set</option> 
  1389. <option value='left'                         >Left</option> 
  1390. <option value='center'                       >Center</option> 
  1391. <option value='right'                        >Right</option> 
  1392. </select> 
  1393. </td></tr>
  1394. <tr><td class='f_title'>Border thickness:</td><td>
  1395. <input type='text' name='border' id='f_border' size='5' value='1' title='Leave empty for no border' /> 
  1396. </td></tr></table>
  1397. </fieldset>
  1398. </td><td valign='top'>
  1399. <fieldset>
  1400. <legend>Spacing</legend> 
  1401. <table>
  1402. <tr><td class='f_title'>Cell spacing:</td><td>
  1403. <input type='text' name='spacing' id='f_spacing' size='5' value='1' title='Space between adjacent cells' /> 
  1404. </td></tr>
  1405. <tr><td class='f_title'>Cell padding:</td><td>
  1406. <input type='text' name='padding' id='f_padding' size='5' value='1' title='Space between content and border in cell' /> 
  1407. </td></tr></table>
  1408. </fieldset> 
  1409. </td></tr></table>
  1410. <div class='footer'> 
  1411. <button type='button' name='ok' id='f_goButton' onclick='doTable();window.close();'>OK</button> 
  1412. <button type='button' name='cancel' onclick='window.close();'>Cancel</button> 
  1413. </div> 
  1414. <script language='JavaScript'> 
  1415. function load() { 
  1416. ftb = window.launchParameters['ftb'];
  1417. table = window.launchParameters['table'];
  1418. if (table) { 
  1419. width = window.opener.FTB_ParseUnit(table.style.width); 
  1420. document.getElementById('f_width').value = width.value; 
  1421. window.opener.FTB_SetListValue(document.getElementById('f_align'),table.align,true); 
  1422. window.opener.FTB_SetListValue(document.getElementById('f_unit'),width.unitType,true); 
  1423. document.getElementById('f_border').value = table.border; 
  1424. document.getElementById('f_padding').value = table.cellPadding; 
  1425. document.getElementById('f_spacing').value = table.cellSpacing; 
  1426. document.getElementById('f_cols').disabled = true; 
  1427. document.getElementById('f_rows').disabled = true; 
  1428. </script></form> 
  1429. </body> 
  1430. </html>");
  1431. /* END: InsertTable */
  1432. /* --------------------------------
  1433. END: Button Methods */