PageRenderTime 31ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/opencore/js/thirdparty/xinha96r1270/plugins/SpellChecker/spell-check-ui.js

https://github.com/socialplanning/oc-js
JavaScript | 454 lines | 391 code | 34 blank | 29 comment | 96 complexity | 1263c384fda9f99947c9808afbf7242c MD5 | raw file
  1. // Spell Checker Plugin for HTMLArea-3.0
  2. // Sponsored by www.americanbible.org
  3. // Implementation by Mihai Bazon, http://dynarch.com/mishoo/
  4. //
  5. // (c) dynarch.com 2003.
  6. // Distributed under the same terms as HTMLArea itself.
  7. // This notice MUST stay intact for use (see license.txt).
  8. //
  9. // $Id:spell-check-ui.js 987M 2008-04-12 12:39:04Z (local) $
  10. // internationalization file was already loaded in parent ;-)
  11. var SpellChecker = window.opener.SpellChecker;
  12. var Xinha = window.opener.Xinha;
  13. var _editor_url = window.opener._editor_url;
  14. var is_ie = Xinha.is_ie;
  15. var editor = SpellChecker.editor;
  16. var frame = null;
  17. var currentElement = null;
  18. var wrongWords = null;
  19. var modified = false;
  20. var allWords = {};
  21. var fixedWords = [];
  22. var suggested_words = {};
  23. var to_p_dict = []; // List of words to add to personal dictionary.
  24. var to_r_list = []; // List of words to add to replacement list.
  25. function _lc(string) {
  26. return Xinha._lc(string, 'SpellChecker');
  27. }
  28. function makeCleanDoc(leaveFixed) {
  29. // document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML';
  30. var words = wrongWords.concat(fixedWords);
  31. for (var i = words.length; --i >= 0;) {
  32. var el = words[i];
  33. if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) {
  34. if(el.firstChild)
  35. el.parentNode.insertBefore(el.firstChild, el);
  36. el.parentNode.removeChild(el);
  37. } else
  38. el.className = "HA-spellcheck-fixed";
  39. }
  40. // we should use innerHTML here, but IE6's implementation fucks up the
  41. // HTML to such extent that our poor Perl parser doesn't understand it
  42. // anymore.
  43. return Xinha.getHTML(frame.contentWindow.document.body, true, editor);
  44. }
  45. function recheckClicked() {
  46. document.getElementById("status").innerHTML = _lc("Please wait: changing dictionary to") + ': "' + document.getElementById("f_dictionary").value + '".';
  47. var field = document.getElementById("f_content");
  48. field.value = makeCleanDoc(true);
  49. field.form.submit();
  50. }
  51. function saveClicked() {
  52. if (modified) {
  53. editor.setHTML(makeCleanDoc(false));
  54. }
  55. if(to_p_dict.length || to_r_list.length && editor.config.SpellChecker.backend == 'php')
  56. {
  57. var data = {};
  58. for(var i = 0;i < to_p_dict.length;i++)
  59. {
  60. data['to_p_dict[' + i + ']'] = to_p_dict[i];
  61. }
  62. for(var i = 0;i < to_r_list.length;i++)
  63. {
  64. data['to_r_list[' + i + '][0]'] = to_r_list[i][0];
  65. data['to_r_list[' + i + '][1]'] = to_r_list[i][1];
  66. }
  67. // var win = window;
  68. window.opener.Xinha._postback(Xinha.getPluginDir("SpellChecker") + '/spell-check-savedicts.php', data);
  69. window.close();
  70. }
  71. else
  72. {
  73. window.close();
  74. }
  75. return false;
  76. }
  77. function cancelClicked() {
  78. var ok = true;
  79. if (modified) {
  80. ok = confirm(_lc("This will drop changes and quit spell checker. Please confirm."));
  81. }
  82. if (ok) {
  83. window.close();
  84. }
  85. return false;
  86. }
  87. function replaceWord(el) {
  88. var replacement = document.getElementById("v_replacement").value;
  89. var this_word_modified = (el.innerHTML != replacement);
  90. if (this_word_modified)
  91. modified = true;
  92. if (el) {
  93. el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " ");
  94. }
  95. el.className += " HA-spellcheck-fixed";
  96. el.__msh_fixed = true;
  97. if (!this_word_modified) {
  98. return false;
  99. }
  100. to_r_list.push([el.innerHTML, replacement]);
  101. el.innerHTML = replacement;
  102. }
  103. function replaceClicked() {
  104. replaceWord(currentElement);
  105. var start = currentElement.__msh_id;
  106. var index = start;
  107. do {
  108. ++index;
  109. if (index == wrongWords.length) {
  110. index = 0;
  111. }
  112. } while ((index != start) && wrongWords[index].__msh_fixed);
  113. if (index == start) {
  114. index = 0;
  115. alert(_lc("Finished list of mispelled words"));
  116. }
  117. wrongWords[index].__msh_wordClicked(true);
  118. return false;
  119. }
  120. function revertClicked() {
  121. document.getElementById("v_replacement").value = currentElement.__msh_origWord;
  122. replaceWord(currentElement);
  123. currentElement.className = "HA-spellcheck-error HA-spellcheck-current";
  124. return false;
  125. }
  126. function replaceAllClicked() {
  127. var replacement = document.getElementById("v_replacement").value;
  128. var ok = true;
  129. var spans = allWords[currentElement.__msh_origWord];
  130. if (spans.length == 0) {
  131. alert("An impossible condition just happened. Call FBI. ;-)");
  132. } else if (spans.length == 1) {
  133. replaceClicked();
  134. return false;
  135. }
  136. /*
  137. var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n";
  138. if (replacement == currentElement.__msh_origWord) {
  139. ok = confirm(message + "Ignore all occurrences?");
  140. } else {
  141. ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?");
  142. }
  143. */
  144. if (ok) {
  145. for (var i = 0; i < spans.length; ++i) {
  146. if (spans[i] != currentElement) {
  147. replaceWord(spans[i]);
  148. }
  149. }
  150. // replace current element the last, so that we jump to the next word ;-)
  151. replaceClicked();
  152. }
  153. return false;
  154. }
  155. function ignoreClicked() {
  156. document.getElementById("v_replacement").value = currentElement.__msh_origWord;
  157. replaceClicked();
  158. return false;
  159. }
  160. function ignoreAllClicked() {
  161. document.getElementById("v_replacement").value = currentElement.__msh_origWord;
  162. replaceAllClicked();
  163. return false;
  164. }
  165. function learnClicked() {
  166. to_p_dict.push(currentElement.__msh_origWord);
  167. return ignoreAllClicked();
  168. }
  169. function internationalizeWindow() {
  170. var types = ["div", "span", "button"];
  171. for (var i = 0; i < types.length; ++i) {
  172. var tag = types[i];
  173. var els = document.getElementsByTagName(tag);
  174. for (var j = els.length; --j >= 0;) {
  175. var el = els[j];
  176. if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) {
  177. var txt = el.innerHTML;
  178. el.innerHTML = _lc(txt);
  179. }
  180. }
  181. }
  182. }
  183. function initDocument() {
  184. internationalizeWindow();
  185. modified = false;
  186. frame = document.getElementById("i_framecontent");
  187. var field = document.getElementById("f_content");
  188. field.value = Xinha.getHTML(editor._doc.body, false, editor);
  189. var dict = document.getElementById("f_dictionary");
  190. if(typeof editor.config.SpellChecker.defaultDictionary != "undefined"
  191. && editor.config.SpellChecker.defaultDictionary != "") {
  192. dict.value = editor.config.SpellChecker.defaultDictionary;
  193. } else {
  194. dict.value = "en_GB";
  195. }
  196. if(editor.config.SpellChecker.backend == 'php')
  197. {
  198. field.form.action = Xinha.getPluginDir("SpellChecker") + '/spell-check-logic.php';
  199. }
  200. if(editor.config.SpellChecker.utf8_to_entities)
  201. {
  202. document.getElementById('utf8_to_entities').value = 1;
  203. }
  204. else
  205. {
  206. document.getElementById('utf8_to_entities').value = 0;
  207. }
  208. field.form.submit();
  209. document.getElementById("f_init").value = "0";
  210. // assign some global event handlers
  211. var select = document.getElementById("v_suggestions");
  212. select.onchange = function() {
  213. document.getElementById("v_replacement").value = this.value;
  214. };
  215. if (is_ie) {
  216. select.attachEvent("ondblclick", replaceClicked);
  217. } else {
  218. select.addEventListener("dblclick", replaceClicked, true);
  219. }
  220. document.getElementById("b_replace").onclick = replaceClicked;
  221. if(editor.config.SpellChecker.backend == 'php')
  222. {
  223. document.getElementById("b_learn").onclick = learnClicked;
  224. }
  225. else
  226. {
  227. document.getElementById("b_learn").parentNode.removeChild(document.getElementById("b_learn"));
  228. }
  229. document.getElementById("b_replall").onclick = replaceAllClicked;
  230. document.getElementById("b_ignore").onclick = ignoreClicked;
  231. document.getElementById("b_ignall").onclick = ignoreAllClicked;
  232. document.getElementById("b_recheck").onclick = recheckClicked;
  233. document.getElementById("b_revert").onclick = revertClicked;
  234. document.getElementById("b_info").onclick = displayInfo;
  235. document.getElementById("b_ok").onclick = saveClicked;
  236. document.getElementById("b_cancel").onclick = cancelClicked;
  237. select = document.getElementById("v_dictionaries");
  238. select.onchange = function() {
  239. document.getElementById("f_dictionary").value = this.value;
  240. };
  241. }
  242. function getAbsolutePos(el) {
  243. var r = { x: el.offsetLeft, y: el.offsetTop };
  244. if (el.offsetParent) {
  245. var tmp = getAbsolutePos(el.offsetParent);
  246. r.x += tmp.x;
  247. r.y += tmp.y;
  248. }
  249. return r;
  250. }
  251. function wordClicked(scroll) {
  252. var self = this;
  253. if (scroll) (function() {
  254. var pos = getAbsolutePos(self);
  255. var ws = { x: frame.offsetWidth - 4,
  256. y: frame.offsetHeight - 4 };
  257. var wp = { x: frame.contentWindow.document.body.scrollLeft,
  258. y: frame.contentWindow.document.body.scrollTop };
  259. pos.x -= Math.round(ws.x/2);
  260. if (pos.x < 0) pos.x = 0;
  261. pos.y -= Math.round(ws.y/2);
  262. if (pos.y < 0) pos.y = 0;
  263. frame.contentWindow.scrollTo(pos.x, pos.y);
  264. })();
  265. if (currentElement) {
  266. var a = allWords[currentElement.__msh_origWord];
  267. currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " ");
  268. for (var i = 0; i < a.length; ++i) {
  269. var el = a[i];
  270. if (el != currentElement) {
  271. el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " ");
  272. }
  273. }
  274. }
  275. currentElement = this;
  276. this.className += " HA-spellcheck-current";
  277. var a = allWords[currentElement.__msh_origWord];
  278. for (var i = 0; i < a.length; ++i) {
  279. var el = a[i];
  280. if (el != currentElement) {
  281. el.className += " HA-spellcheck-same";
  282. }
  283. }
  284. // document.getElementById("b_replall").disabled = (a.length <= 1);
  285. // document.getElementById("b_ignall").disabled = (a.length <= 1);
  286. var txt;
  287. if (a.length == 1) {
  288. txt = "one occurrence";
  289. } else if (a.length == 2) {
  290. txt = "two occurrences";
  291. } else {
  292. txt = a.length + " occurrences";
  293. }
  294. var suggestions = suggested_words[this.__msh_origWord];
  295. if (suggestions)
  296. suggestions = suggestions.split(/,/);
  297. else
  298. suggestions = [];
  299. var select = document.getElementById("v_suggestions");
  300. document.getElementById("statusbar").innerHTML = "Found " + txt +
  301. ' for word "<b>' + currentElement.__msh_origWord + '</b>"';
  302. for (var i = select.length; --i >= 0;) {
  303. select.remove(i);
  304. }
  305. for (var i = 0; i < suggestions.length; ++i) {
  306. var txt = suggestions[i];
  307. var option = document.createElement("option");
  308. option.value = txt;
  309. option.appendChild(document.createTextNode(txt));
  310. select.appendChild(option);
  311. }
  312. document.getElementById("v_currentWord").innerHTML = this.__msh_origWord;
  313. if (suggestions.length > 0) {
  314. select.selectedIndex = 0;
  315. select.onchange();
  316. } else {
  317. document.getElementById("v_replacement").value = this.innerHTML;
  318. }
  319. select.style.display = "none";
  320. select.style.display = "block";
  321. return false;
  322. }
  323. function wordMouseOver() {
  324. this.className += " HA-spellcheck-hover";
  325. }
  326. function wordMouseOut() {
  327. this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " ");
  328. }
  329. function displayInfo() {
  330. var info = frame.contentWindow.spellcheck_info;
  331. if (!info)
  332. alert("No information available");
  333. else {
  334. var txt = "** Document information **";
  335. for (var i in info) {
  336. txt += "\n" + i + " : " + info[i];
  337. }
  338. alert(txt);
  339. }
  340. return false;
  341. }
  342. function finishedSpellChecking() {
  343. // initialization of global variables
  344. currentElement = null;
  345. wrongWords = null;
  346. allWords = {};
  347. fixedWords = [];
  348. suggested_words = frame.contentWindow.suggested_words;
  349. document.getElementById("status").innerHTML = "Xinha Spell Checker (<a href=\"readme-tech.html\" onclick=\"window.open(this.href,'_blank');return false;\" title=\"Technical information\">info</a>)";
  350. var doc = frame.contentWindow.document;
  351. var spans = doc.getElementsByTagName("span");
  352. var sps = [];
  353. var id = 0;
  354. for (var i = 0; i < spans.length; ++i) {
  355. var el = spans[i];
  356. if (/HA-spellcheck-error/.test(el.className)) {
  357. sps.push(el);
  358. el.__msh_wordClicked = wordClicked;
  359. el.onclick = function(ev) {
  360. ev || (ev = window.event);
  361. ev && Xinha._stopEvent(ev);
  362. return this.__msh_wordClicked(false);
  363. };
  364. el.onmouseover = wordMouseOver;
  365. el.onmouseout = wordMouseOut;
  366. el.__msh_id = id++;
  367. var txt = (el.__msh_origWord = el.firstChild.data);
  368. el.__msh_fixed = false;
  369. if (typeof allWords[txt] == "undefined") {
  370. allWords[txt] = [el];
  371. } else {
  372. allWords[txt].push(el);
  373. }
  374. } else if (/HA-spellcheck-fixed/.test(el.className)) {
  375. fixedWords.push(el);
  376. }
  377. }
  378. var dicts = doc.getElementById("HA-spellcheck-dictionaries");
  379. if (dicts) {
  380. dicts.parentNode.removeChild(dicts);
  381. dicts = dicts.innerHTML.split(/,/);
  382. var select = document.getElementById("v_dictionaries");
  383. for (var i = select.length; --i >= 0;) {
  384. select.remove(i);
  385. }
  386. var activeDictionary = document.getElementById("f_dictionary").value;
  387. for (var i = 0; i < dicts.length; ++i) {
  388. var txt = dicts[i];
  389. var option = document.createElement("option");
  390. if(txt == activeDictionary) {
  391. option.selected = true;
  392. }
  393. option.value = txt;
  394. option.appendChild(document.createTextNode(txt));
  395. select.appendChild(option);
  396. }
  397. }
  398. wrongWords = sps;
  399. if (sps.length == 0) {
  400. if (!modified) {
  401. alert(_lc("No mispelled words found with the selected dictionary."));
  402. // window.close();
  403. } else {
  404. alert(_lc("No mispelled words found with the selected dictionary."));
  405. }
  406. return false;
  407. }
  408. (currentElement = sps[0]).__msh_wordClicked(true);
  409. var as = doc.getElementsByTagName("a");
  410. for (var i = as.length; --i >= 0;) {
  411. var a = as[i];
  412. a.onclick = function() {
  413. if (confirm(_lc("Please confirm that you want to open this link") + ":\n" +
  414. this.href + "\n" + _lc("I will open it in a new page."))) {
  415. window.open(this.href);
  416. }
  417. return false;
  418. };
  419. }
  420. }