Annotation of loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.js, revision 1.1

1.1     ! www         1: // Spell Checker Plugin for HTMLArea-3.0
        !             2: // Implementation by Mihai Bazon.  Sponsored by www.americanbible.org
        !             3: //
        !             4: // htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
        !             5: // This notice MUST stay intact for use (see license.txt).
        !             6: //
        !             7: // A free WYSIWYG editor replacement for <textarea> fields.
        !             8: // For full source code and docs, visit http://www.interactivetools.com/
        !             9: //
        !            10: // Version 3.0 developed by Mihai Bazon for InteractiveTools.
        !            11: //	     http://students.infoiasi.ro/~mishoo
        !            12: //
        !            13: // $Id: spell-check-ui.js,v 1.2 2003/08/10 15:56:35 mishoo Exp $
        !            14: 
        !            15: // internationalization file was already loaded in parent ;-)
        !            16: var SpellChecker = window.opener.SpellChecker;
        !            17: var i18n = SpellChecker.I18N;
        !            18: 
        !            19: var is_ie = window.opener.HTMLArea.is_ie;
        !            20: var editor = SpellChecker.editor;
        !            21: var frame = null;
        !            22: var currentElement = null;
        !            23: var wrongWords = null;
        !            24: var modified = false;
        !            25: var allWords = {};
        !            26: 
        !            27: function makeCleanDoc(leaveFixed) {
        !            28: 	// document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML';
        !            29: 	for (var i in wrongWords) {
        !            30: 		var el = wrongWords[i];
        !            31: 		if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) {
        !            32: 			el.parentNode.insertBefore(el.firstChild, el);
        !            33: 			el.parentNode.removeChild(el.nextSibling);
        !            34: 			el.parentNode.removeChild(el);
        !            35: 		} else {
        !            36: 			el.className = "HA-spellcheck-fixed";
        !            37: 			el.parentNode.removeChild(el.nextSibling);
        !            38: 		}
        !            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 window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, leaveFixed);
        !            44: };
        !            45: 
        !            46: function recheckClicked() {
        !            47: 	document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".';
        !            48: 	var field = document.getElementById("f_content");
        !            49: 	field.value = makeCleanDoc(true);
        !            50: 	field.form.submit();
        !            51: };
        !            52: 
        !            53: function saveClicked() {
        !            54: 	if (modified) {
        !            55: 		editor.setHTML(makeCleanDoc(false));
        !            56: 	}
        !            57: 	window.close();
        !            58: 	return false;
        !            59: };
        !            60: 
        !            61: function cancelClicked() {
        !            62: 	var ok = true;
        !            63: 	if (modified) {
        !            64: 		ok = confirm(i18n["QUIT_CONFIRMATION"]);
        !            65: 	}
        !            66: 	if (ok) {
        !            67: 		window.close();
        !            68: 	}
        !            69: 	return false;
        !            70: };
        !            71: 
        !            72: function replaceWord(el) {
        !            73: 	var replacement = document.getElementById("v_replacement").value;
        !            74: 	modified = (el.innerHTML != replacement);
        !            75: 	if (el) {
        !            76: 		el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " ");
        !            77: 	}
        !            78: 	el.className += " HA-spellcheck-fixed";
        !            79: 	el.__msh_fixed = true;
        !            80: 	if (!modified) {
        !            81: 		return false;
        !            82: 	}
        !            83: 	el.innerHTML = replacement;
        !            84: };
        !            85: 
        !            86: function replaceClicked() {
        !            87: 	replaceWord(currentElement);
        !            88: 	var start = currentElement.__msh_id;
        !            89: 	var index = start;
        !            90: 	do {
        !            91: 		++index;
        !            92: 		if (index == wrongWords.length) {
        !            93: 			index = 0;
        !            94: 		}
        !            95: 	} while ((index != start) && wrongWords[index].__msh_fixed);
        !            96: 	if (index == start) {
        !            97: 		index = 0;
        !            98: 		alert(i18n["Finished list of mispelled words"]);
        !            99: 	}
        !           100: 	wrongWords[index].onclick();
        !           101: 	return false;
        !           102: };
        !           103: 
        !           104: function replaceAllClicked() {
        !           105: 	var replacement = document.getElementById("v_replacement").value;
        !           106: 	var ok = true;
        !           107: 	var spans = allWords[currentElement.__msh_origWord];
        !           108: 	if (spans.length == 0) {
        !           109: 		alert("An impossible condition just happened.  Call FBI.  ;-)");
        !           110: 	} else if (spans.length == 1) {
        !           111: 		replaceClicked();
        !           112: 		return false;
        !           113: 	}
        !           114: 	/*
        !           115: 	var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n";
        !           116: 	if (replacement == currentElement.__msh_origWord) {
        !           117: 		ok = confirm(message + "Ignore all occurrences?");
        !           118: 	} else {
        !           119: 		ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?");
        !           120: 	}
        !           121: 	*/
        !           122: 	if (ok) {
        !           123: 		for (var i in spans) {
        !           124: 			if (spans[i] != currentElement) {
        !           125: 				replaceWord(spans[i]);
        !           126: 			}
        !           127: 		}
        !           128: 		// replace current element the last, so that we jump to the next word ;-)
        !           129: 		replaceClicked();
        !           130: 	}
        !           131: 	return false;
        !           132: };
        !           133: 
        !           134: function ignoreClicked() {
        !           135: 	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
        !           136: 	replaceClicked();
        !           137: 	return false;
        !           138: };
        !           139: 
        !           140: function ignoreAllClicked() {
        !           141: 	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
        !           142: 	replaceAllClicked();
        !           143: 	return false;
        !           144: };
        !           145: 
        !           146: function learnClicked() {
        !           147: 	alert("Not [yet] implemented");
        !           148: 	return false;
        !           149: };
        !           150: 
        !           151: function internationalizeWindow() {
        !           152: 	var types = ["div", "span", "button"];
        !           153: 	for (var i in types) {
        !           154: 		var tag = types[i];
        !           155: 		var els = document.getElementsByTagName(tag);
        !           156: 		for (var j = els.length; --j >= 0;) {
        !           157: 			var el = els[j];
        !           158: 			if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) {
        !           159: 				var txt = el.innerHTML;
        !           160: 				if (typeof i18n[txt] != "undefined") {
        !           161: 					el.innerHTML = i18n[txt];
        !           162: 				}
        !           163: 			}
        !           164: 		}
        !           165: 	}
        !           166: };
        !           167: 
        !           168: function initDocument() {
        !           169: 	internationalizeWindow();
        !           170: 	modified = false;
        !           171: 	frame = document.getElementById("i_framecontent");
        !           172: 	var field = document.getElementById("f_content");
        !           173: 	field.value = editor.getHTML();
        !           174: 	field.form.submit();
        !           175: 	document.getElementById("f_init").value = "0";
        !           176: 
        !           177: 	// assign some global event handlers
        !           178: 
        !           179: 	var select = document.getElementById("v_suggestions");
        !           180: 	select.onchange = function() {
        !           181: 		document.getElementById("v_replacement").value = this.value;
        !           182: 	};
        !           183: 	if (is_ie) {
        !           184: 		select.attachEvent("ondblclick", replaceClicked);
        !           185: 	} else {
        !           186: 		select.addEventListener("dblclick", replaceClicked, true);
        !           187: 	}
        !           188: 
        !           189: 	document.getElementById("b_replace").onclick = replaceClicked;
        !           190: 	// document.getElementById("b_learn").onclick = learnClicked;
        !           191: 	document.getElementById("b_replall").onclick = replaceAllClicked;
        !           192: 	document.getElementById("b_ignore").onclick = ignoreClicked;
        !           193: 	document.getElementById("b_ignall").onclick = ignoreAllClicked;
        !           194: 	document.getElementById("b_recheck").onclick = recheckClicked;
        !           195: 
        !           196: 	document.getElementById("b_ok").onclick = saveClicked;
        !           197: 	document.getElementById("b_cancel").onclick = cancelClicked;
        !           198: 
        !           199: 	select = document.getElementById("v_dictionaries");
        !           200: 	select.onchange = function() {
        !           201: 		document.getElementById("f_dictionary").value = this.value;
        !           202: 	};
        !           203: };
        !           204: 
        !           205: function wordClicked() {
        !           206: 	if (currentElement) {
        !           207: 		var a = allWords[currentElement.__msh_origWord];
        !           208: 		currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " ");
        !           209: 		for (var i in a) {
        !           210: 			var el = a[i];
        !           211: 			if (el != currentElement) {
        !           212: 				el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " ");
        !           213: 			}
        !           214: 		}
        !           215: 	}
        !           216: 	currentElement = this;
        !           217: 	this.className += " HA-spellcheck-current";
        !           218: 	var a = allWords[currentElement.__msh_origWord];
        !           219: 	for (var i in a) {
        !           220: 		var el = a[i];
        !           221: 		if (el != currentElement) {
        !           222: 			el.className += " HA-spellcheck-same";
        !           223: 		}
        !           224: 	}
        !           225: 	document.getElementById("b_replall").disabled = (a.length <= 1);
        !           226: 	document.getElementById("b_ignall").disabled = (a.length <= 1);
        !           227: 	var txt;
        !           228: 	if (a.length == 1) {
        !           229: 		txt = "one occurrence";
        !           230: 	} else if (a.length == 2) {
        !           231: 		txt = "two occurrences";
        !           232: 	} else {
        !           233: 		txt = a.length + " occurrences";
        !           234: 	}
        !           235: 	document.getElementById("statusbar").innerHTML = "Found " + txt +
        !           236: 		' for word "<b>' + currentElement.__msh_origWord + '</b>"';
        !           237: 	var select = document.getElementById("v_suggestions");
        !           238: 	for (var i = select.length; --i >= 0;) {
        !           239: 		select.remove(i);
        !           240: 	}
        !           241: 	var suggestions;
        !           242: 	suggestions = this.nextSibling.firstChild.data.split(/,/);
        !           243: 	for (var i = 0; i < suggestions.length; ++i) {
        !           244: 		var txt = suggestions[i];
        !           245: 		var option = document.createElement("option");
        !           246: 		option.value = txt;
        !           247: 		option.appendChild(document.createTextNode(txt));
        !           248: 		select.appendChild(option);
        !           249: 	}
        !           250: 	document.getElementById("v_currentWord").innerHTML = this.__msh_origWord;
        !           251: 	if (suggestions.length > 0) {
        !           252: 		select.selectedIndex = 0;
        !           253: 		select.onchange();
        !           254: 	} else {
        !           255: 		document.getElementById("v_replacement").value = this.innerHTML;
        !           256: 	}
        !           257: 	return false;
        !           258: };
        !           259: 
        !           260: function wordMouseOver() {
        !           261: 	this.className += " HA-spellcheck-hover";
        !           262: };
        !           263: 
        !           264: function wordMouseOut() {
        !           265: 	this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " ");
        !           266: };
        !           267: 
        !           268: function finishedSpellChecking() {
        !           269: 	// initialization of global variables
        !           270: 	currentElement = null;
        !           271: 	wrongWords = null;
        !           272: 	allWords = {};
        !           273: 
        !           274: 	document.getElementById("status").innerHTML = "HTMLArea Spell Checker (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)";
        !           275: 	var doc = frame.contentWindow.document;
        !           276:         var spans = doc.getElementsByTagName("span");
        !           277:         var sps = [];
        !           278: 	var id = 0;
        !           279:         for (var i = 0; i < spans.length; ++i) {
        !           280:                 var el = spans[i];
        !           281:                 if (/HA-spellcheck-error/.test(el.className)) {
        !           282:                         sps.push(el);
        !           283: 			el.onclick = wordClicked;
        !           284: 			el.onmouseover = wordMouseOver;
        !           285: 			el.onmouseout = wordMouseOut;
        !           286: 			el.__msh_id = id++;
        !           287: 			var txt = (el.__msh_origWord = el.firstChild.data);
        !           288: 			el.__msh_fixed = false;
        !           289: 			if (typeof allWords[txt] == "undefined") {
        !           290: 				allWords[txt] = [el];
        !           291: 			} else {
        !           292: 				allWords[txt].push(el);
        !           293: 			}
        !           294:                 }
        !           295:         }
        !           296: 	wrongWords = sps;
        !           297: 	if (sps.length == 0) {
        !           298: 		if (!modified) {
        !           299: 			alert(i18n["NO_ERRORS_CLOSING"]);
        !           300: 			window.close();
        !           301: 		} else {
        !           302: 			alert(i18n["NO_ERRORS"]);
        !           303: 		}
        !           304: 		return false;
        !           305: 	}
        !           306: 	(currentElement = sps[0]).onclick();
        !           307: 	var as = doc.getElementsByTagName("a");
        !           308: 	for (var i = as.length; --i >= 0;) {
        !           309: 		var a = as[i];
        !           310: 		a.onclick = function() {
        !           311: 			if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" +
        !           312: 				    this.href + "\n" + i18n["I will open it in a new page."])) {
        !           313: 				window.open(this.href);
        !           314: 			}
        !           315: 			return false;
        !           316: 		};
        !           317: 	}
        !           318: 	var dicts = doc.getElementById("HA-spellcheck-dictionaries");
        !           319: 	if (dicts) {
        !           320: 		dicts.parentNode.removeChild(dicts);
        !           321: 		dicts = dicts.innerHTML.split(/,/);
        !           322: 		var select = document.getElementById("v_dictionaries");
        !           323: 		for (var i = select.length; --i >= 0;) {
        !           324: 			select.remove(i);
        !           325: 		}
        !           326: 		for (var i = 0; i < dicts.length; ++i) {
        !           327: 			var txt = dicts[i];
        !           328: 			var option = document.createElement("option");
        !           329: 			option.value = txt;
        !           330: 			option.appendChild(document.createTextNode(txt));
        !           331: 			select.appendChild(option);
        !           332: 		}
        !           333: 	}
        !           334: };

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>