From f4f6291ec16bd2fe368f868e667ea2071c514098 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 24 Jun 2010 09:27:43 -0400
Subject: [PATCH] - Use built-in spellchecker instead of a PHP files of spellchecker plugin in TinyMCE

---
 program/steps/utils/spell_googie.inc      |    4 
 /dev/null                                 |  114 -------------------
 program/steps/utils/spell_pspell.inc      |    5 
 program/steps/utils/spell_html_googie.inc |  106 +++++++++++++++++
 program/js/editor.js                      |    1 
 program/steps/utils/spell.inc             |    8 +
 program/steps/utils/spell_html_pspell.inc |   76 ++++++++++++
 7 files changed, 192 insertions(+), 122 deletions(-)

diff --git a/program/js/editor.js b/program/js/editor.js
index 34511ce..bd9c00c 100644
--- a/program/js/editor.js
+++ b/program/js/editor.js
@@ -52,6 +52,7 @@
       content_css : skin_path + '/editor_content.css',
       external_image_list_url : 'program/js/editor_images.js',
       spellchecker_languages : (rcmail.env.spellcheck_langs ? rcmail.env.spellcheck_langs : 'Dansk=da,Deutsch=de,+English=en,Espanol=es,Francais=fr,Italiano=it,Nederlands=nl,Polski=pl,Portugues=pt,Suomi=fi,Svenska=sv'),
+      spellchecker_rpc_url : '?_task=utils&_action=spell&tiny=1',
       gecko_spellcheck : true,
       relative_urls : false,
       remove_script_host : false,
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/EnchantSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/EnchantSpell.php
deleted file mode 100755
index fb6e67c..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/EnchantSpell.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * This class was contributed by Michel Weimerskirch.
- *
- * @author Moxiecode
- * @copyright Copyright � 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-class EnchantSpell extends SpellChecker {
-	/**
-	 * Spellchecks an array of words.
-	 *
-	 * @param String $lang Selected language code (like en_US or de_DE). Shortcodes like "en" and "de" work with enchant >= 1.4.1
-	 * @param Array $words Array of words to check.
-	 * @return Array of misspelled words.
-	 */
-	function &checkWords($lang, $words) {
-		$r = enchant_broker_init();
-		
-		if (enchant_broker_dict_exists($r,$lang)) {
-			$d = enchant_broker_request_dict($r, $lang);
-			
-			$returnData = array();
-			foreach($words as $key => $value) {
-				$correct = enchant_dict_check($d, $value);
-				if(!$correct) {
-					$returnData[] = trim($value);
-				}
-			}
-	
-			return $returnData;
-			enchant_broker_free_dict($d);
-		} else {
-
-		}
-		enchant_broker_free($r);
-	}
-
-	/**
-	 * Returns suggestions for a specific word.
-	 *
-	 * @param String $lang Selected language code (like en_US or de_DE). Shortcodes like "en" and "de" work with enchant >= 1.4.1
-	 * @param String $word Specific word to get suggestions for.
-	 * @return Array of suggestions for the specified word.
-	 */
-	function &getSuggestions($lang, $word) {
-		$r = enchant_broker_init();
-		$suggs = array();
-
-		if (enchant_broker_dict_exists($r,$lang)) {
-			$d = enchant_broker_request_dict($r, $lang);
-			$suggs = enchant_dict_suggest($d, $word);
-
-			enchant_broker_free_dict($d);
-		} else {
-
-		}
-		enchant_broker_free($r);
-
-		return $suggs;
-	}
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php
deleted file mode 100755
index 5ae501d..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright � 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-class GoogleSpell extends SpellChecker {
-	/**
-	 * Spellchecks an array of words.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {Array} $words Array of words to spellcheck.
-	 * @return {Array} Array of misspelled words.
-	 */
-	function &checkWords($lang, $words) {
-		$wordstr = implode(' ', $words);
-		$matches = $this->_getMatches($lang, $wordstr);
-		$words = array();
-
-		for ($i=0; $i<count($matches); $i++)
-			$words[] = $this->_unhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8"));
-
-		return $words;
-	}
-
-	/**
-	 * Returns suggestions of for a specific word.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {String} $word Specific word to get suggestions for.
-	 * @return {Array} Array of suggestions for the specified word.
-	 */
-	function &getSuggestions($lang, $word) {
-		$sug = array();
-		$osug = array();
-		$matches = $this->_getMatches($lang, $word);
-
-		if (count($matches) > 0)
-			$sug = explode("\t", $this->_unhtmlentities($matches[0][4]));
-
-		// Remove empty
-		foreach ($sug as $item) {
-			if ($item)
-				$osug[] = $item;
-		}
-
-		return $osug;
-	}
-
-	function &_getMatches($lang, $str) {
-		$server = "www.google.com";
-		$port = 443;
-		$path = "/tbproxy/spell?lang=" . $lang . "&hl=en";
-		$ssl = true;
-		
-		// spell check uri is configured (added by RoundCube)
-		if (!empty($this->_config['rpc_uri'])) {
-			$a_uri = parse_url($this->_config['rpc_uri']);
-			$ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');
-			$port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);
-			$server = $a_uri['host'];
-			$path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;
-		}
-
-		// Setup XML request
-		$xml = '<?xml version="1.0" encoding="utf-8" ?>\
-		<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' . $str . '</text></spellrequest>';
-
-		$header  = "POST ".$path." HTTP/1.0 \r\n";
-		$header .= "MIME-Version: 1.0 \r\n";
-		$header .= "Content-type: application/PTI26 \r\n";
-		$header .= "Content-length: ".strlen($xml)." \r\n";
-		$header .= "Content-transfer-encoding: text \r\n";
-		$header .= "Request-number: 1 \r\n";
-		$header .= "Document-type: Request \r\n";
-		$header .= "Interface-Version: Test 1.4 \r\n";
-		$header .= "Connection: close \r\n\r\n";
-		$header .= $xml;
-
-		// Use curl if it exists
-		if (function_exists('curl_init')) {
-			// Use curl
-			$ch = curl_init();
-			curl_setopt($ch, CURLOPT_URL, ($ssl ? "https://" : "http://") . $server);
-			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
-			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
-			$xml = curl_exec($ch);
-			curl_close($ch);
-		} else {
-			// Use raw sockets
-			$fp = fsockopen(($ssl ? "ssl://" : "") . $server, $port, $errno, $errstr, 30);
-			if ($fp) {
-				// Send request
-				fwrite($fp, $header);
-
-				// Read response
-				$xml = "";
-				while (!feof($fp))
-					$xml .= fgets($fp, 128);
-
-				fclose($fp);
-			} else
-				echo "Could not open SSL connection to google.";
-		}
-
-		// Grab and parse content
-		$matches = array();
-		preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER);
-
-		return $matches;
-	}
-
-	function _unhtmlentities($string) {
-		$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
-		$string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);
-
-		$trans_tbl = get_html_translation_table(HTML_ENTITIES);
-		$trans_tbl = array_flip($trans_tbl);
-
-		return strtr($string, $trans_tbl);
-	}
-}
-
-// Patch in multibyte support
-if (!function_exists('mb_substr')) {
-	function mb_substr($str, $start, $len = '', $encoding="UTF-8"){
-		$limit = strlen($str);
-
-		for ($s = 0; $start > 0;--$start) {// found the real start
-			if ($s >= $limit)
-				break;
-
-			if ($str[$s] <= "\x7F")
-				++$s;
-			else {
-				++$s; // skip length
-
-				while ($str[$s] >= "\x80" && $str[$s] <= "\xBF")
-					++$s;
-			}
-		}
-
-		if ($len == '')
-			return substr($str, $s);
-		else
-			for ($e = $s; $len > 0; --$len) {//found the real end
-				if ($e >= $limit)
-					break;
-
-				if ($str[$e] <= "\x7F")
-					++$e;
-				else {
-					++$e;//skip length
-
-					while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit)
-						++$e;
-				}
-			}
-
-		return substr($str, $s, $e - $s);
-	}
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/PSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/PSpell.php
deleted file mode 100755
index 6aa255c..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/PSpell.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright � 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-class PSpell extends SpellChecker {
-	/**
-	 * Spellchecks an array of words.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {Array} $words Array of words to spellcheck.
-	 * @return {Array} Array of misspelled words.
-	 */
-	function &checkWords($lang, $words) {
-		$plink = $this->_getPLink($lang);
-
-		$outWords = array();
-		foreach ($words as $word) {
-			if (!pspell_check($plink, trim($word)))
-				$outWords[] = utf8_encode($word);
-		}
-
-		return $outWords;
-	}
-
-	/**
-	 * Returns suggestions of for a specific word.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {String} $word Specific word to get suggestions for.
-	 * @return {Array} Array of suggestions for the specified word.
-	 */
-	function &getSuggestions($lang, $word) {
-		$words = pspell_suggest($this->_getPLink($lang), $word);
-
-		for ($i=0; $i<count($words); $i++)
-			$words[$i] = $words[$i];
-
-		return $words;
-	}
-
-	/**
-	 * Opens a link for pspell.
-	 */
-	function &_getPLink($lang) {
-		// Check for native PSpell support
-		if (!function_exists("pspell_new"))
-			$this->throwError("PSpell support not found in PHP installation.");
-
-		// Setup PSpell link
-		$plink = pspell_new(
-			$lang,
-			$this->_config['PSpell.spelling'],
-			$this->_config['PSpell.jargon'],
-			$this->_config['PSpell.encoding'],
-			$this->_config['PSpell.mode']
-		);
-
-		// Setup PSpell link
-/*		if (!$plink) {
-			$pspellConfig = pspell_config_create(
-				$lang,
-				$this->_config['PSpell.spelling'],
-				$this->_config['PSpell.jargon'],
-				$this->_config['PSpell.encoding']
-			);
-
-			$plink = pspell_new_config($pspell_config);
-		}*/
-
-		if (!$plink)
-			$this->throwError("No PSpell link found opened.");
-
-		return $plink;
-	}
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/PSpellShell.php b/program/js/tiny_mce/plugins/spellchecker/classes/PSpellShell.php
deleted file mode 100755
index 0bc57de..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/PSpellShell.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright � 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-class PSpellShell extends SpellChecker {
-	/**
-	 * Spellchecks an array of words.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {Array} $words Array of words to spellcheck.
-	 * @return {Array} Array of misspelled words.
-	 */
-	function &checkWords($lang, $words) {
-		$cmd = $this->_getCMD($lang);
-
-		if ($fh = fopen($this->_tmpfile, "w")) {
-			fwrite($fh, "!\n");
-
-			foreach($words as $key => $value)
-				fwrite($fh, "^" . $value . "\n");
-
-			fclose($fh);
-		} else
-			$this->throwError("PSpell support was not found.");
-
-		$data = shell_exec($cmd);
-		@unlink($this->_tmpfile);
-
-		$returnData = array();
-		$dataArr = preg_split("/[\r\n]/", $data, -1, PREG_SPLIT_NO_EMPTY);
-
-		foreach ($dataArr as $dstr) {
-			$matches = array();
-
-			// Skip this line.
-			if (strpos($dstr, "@") === 0)
-				continue;
-
-			preg_match("/\& ([^ ]+) .*/i", $dstr, $matches);
-
-			if (!empty($matches[1]))
-				$returnData[] = utf8_encode(trim($matches[1]));
-		}
-
-		return $returnData;
-	}
-
-	/**
-	 * Returns suggestions of for a specific word.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {String} $word Specific word to get suggestions for.
-	 * @return {Array} Array of suggestions for the specified word.
-	 */
-	function &getSuggestions($lang, $word) {
-		$cmd = $this->_getCMD($lang);
-
-        if (function_exists("mb_convert_encoding"))
-            $word = mb_convert_encoding($word, "ISO-8859-1", mb_detect_encoding($word, "UTF-8"));
-        else
-            $word = utf8_encode($word);
-
-		if ($fh = fopen($this->_tmpfile, "w")) {
-			fwrite($fh, "!\n");
-			fwrite($fh, "^$word\n");
-			fclose($fh);
-		} else
-			$this->throwError("Error opening tmp file.");
-
-		$data = shell_exec($cmd);
-		@unlink($this->_tmpfile);
-
-		$returnData = array();
-		$dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY);
-
-		foreach($dataArr as $dstr) {
-			$matches = array();
-
-			// Skip this line.
-			if (strpos($dstr, "@") === 0)
-				continue;
-
-			preg_match("/\&[^:]+:(.*)/i", $dstr, $matches);
-
-			if (!empty($matches[1])) {
-				$words = array_slice(explode(',', $matches[1]), 0, 10);
-
-				for ($i=0; $i<count($words); $i++)
-					$words[$i] = trim($words[$i]);
-
-				return $words;
-			}
-		}
-
-		return array();
-	}
-
-	function _getCMD($lang) {
-		$this->_tmpfile = tempnam($this->_config['PSpellShell.tmp'], "tinyspell");
-
-		if(preg_match("#win#i", php_uname()))
-			return $this->_config['PSpellShell.aspell'] . " -a --lang=". escapeshellarg($lang) . " --encoding=utf-8 -H < " . $this->_tmpfile . " 2>&1";
-
-		return "cat ". $this->_tmpfile ." | " . $this->_config['PSpellShell.aspell'] . " -a --encoding=utf-8 -H --lang=". escapeshellarg($lang);
-	}
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/SpellChecker.php b/program/js/tiny_mce/plugins/spellchecker/classes/SpellChecker.php
deleted file mode 100755
index d680039..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/SpellChecker.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright � 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-class SpellChecker {
-	/**
-	 * Constructor.
-	 *
-	 * @param $config Configuration name/value array.
-	 */
-	function SpellChecker(&$config) {
-		$this->_config = $config;
-	}
-
-	/**
-	 * Simple loopback function everything that gets in will be send back.
-	 *
-	 * @param $args.. Arguments.
-	 * @return {Array} Array of all input arguments. 
-	 */
-	function &loopback(/* args.. */) {
-		return func_get_args();
-	}
-
-	/**
-	 * Spellchecks an array of words.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {Array} $words Array of words to spellcheck.
-	 * @return {Array} Array of misspelled words.
-	 */
-	function &checkWords($lang, $words) {
-		return $words;
-	}
-
-	/**
-	 * Returns suggestions of for a specific word.
-	 *
-	 * @param {String} $lang Language code like sv or en.
-	 * @param {String} $word Specific word to get suggestions for.
-	 * @return {Array} Array of suggestions for the specified word.
-	 */
-	function &getSuggestions($lang, $word) {
-		return array();
-	}
-
-	/**
-	 * Throws an error message back to the user. This will stop all execution.
-	 *
-	 * @param {String} $str Message to send back to user.
-	 */
-	function throwError($str) {
-		die('{"result":null,"id":null,"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');
-	}
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php b/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php
deleted file mode 100755
index 1c46116..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php
+++ /dev/null
@@ -1,595 +0,0 @@
-<?php
-/**
- * $Id: JSON.php 40 2007-06-18 11:43:15Z spocke $
- *
- * @package MCManager.utils
- * @author Moxiecode
- * @copyright Copyright � 2007, Moxiecode Systems AB, All rights reserved.
- */
-
-define('JSON_BOOL', 1);
-define('JSON_INT', 2);
-define('JSON_STR', 3);
-define('JSON_FLOAT', 4);
-define('JSON_NULL', 5);
-define('JSON_START_OBJ', 6);
-define('JSON_END_OBJ', 7);
-define('JSON_START_ARRAY', 8);
-define('JSON_END_ARRAY', 9);
-define('JSON_KEY', 10);
-define('JSON_SKIP', 11);
-
-define('JSON_IN_ARRAY', 30);
-define('JSON_IN_OBJECT', 40);
-define('JSON_IN_BETWEEN', 50);
-
-class Moxiecode_JSONReader {
-	var $_data, $_len, $_pos;
-	var $_value, $_token;
-	var $_location, $_lastLocations;
-	var $_needProp;
-
-	function Moxiecode_JSONReader($data) {
-		$this->_data = $data;
-		$this->_len = strlen($data);
-		$this->_pos = -1;
-		$this->_location = JSON_IN_BETWEEN;
-		$this->_lastLocations = array();
-		$this->_needProp = false;
-	}
-
-	function getToken() {
-		return $this->_token;
-	}
-
-	function getLocation() {
-		return $this->_location;
-	}
-
-	function getTokenName() {
-		switch ($this->_token) {
-			case JSON_BOOL:
-				return 'JSON_BOOL';
-
-			case JSON_INT:
-				return 'JSON_INT';
-
-			case JSON_STR:
-				return 'JSON_STR';
-
-			case JSON_FLOAT:
-				return 'JSON_FLOAT';
-
-			case JSON_NULL:
-				return 'JSON_NULL';
-
-			case JSON_START_OBJ:
-				return 'JSON_START_OBJ';
-
-			case JSON_END_OBJ:
-				return 'JSON_END_OBJ';
-
-			case JSON_START_ARRAY:
-				return 'JSON_START_ARRAY';
-
-			case JSON_END_ARRAY:
-				return 'JSON_END_ARRAY';
-
-			case JSON_KEY:
-				return 'JSON_KEY';
-		}
-
-		return 'UNKNOWN';
-	}
-
-	function getValue() {
-		return $this->_value;
-	}
-
-	function readToken() {
-		$chr = $this->read();
-
-		if ($chr != null) {
-			switch ($chr) {
-				case '[':
-					$this->_lastLocation[] = $this->_location;
-					$this->_location = JSON_IN_ARRAY;
-					$this->_token = JSON_START_ARRAY;
-					$this->_value = null;
-					$this->readAway();
-					return true;
-
-				case ']':
-					$this->_location = array_pop($this->_lastLocation);
-					$this->_token = JSON_END_ARRAY;
-					$this->_value = null;
-					$this->readAway();
-
-					if ($this->_location == JSON_IN_OBJECT)
-						$this->_needProp = true;
-
-					return true;
-
-				case '{':
-					$this->_lastLocation[] = $this->_location;
-					$this->_location = JSON_IN_OBJECT;
-					$this->_needProp = true;
-					$this->_token = JSON_START_OBJ;
-					$this->_value = null;
-					$this->readAway();
-					return true;
-
-				case '}':
-					$this->_location = array_pop($this->_lastLocation);
-					$this->_token = JSON_END_OBJ;
-					$this->_value = null;
-					$this->readAway();
-
-					if ($this->_location == JSON_IN_OBJECT)
-						$this->_needProp = true;
-
-					return true;
-
-				// String
-				case '"':
-				case '\'':
-					return $this->_readString($chr);
-
-				// Null
-				case 'n':
-					return $this->_readNull();
-
-				// Bool
-				case 't':
-				case 'f':
-					return $this->_readBool($chr);
-
-				default:
-					// Is number
-					if (is_numeric($chr) || $chr == '-' || $chr == '.')
-						return $this->_readNumber($chr);
-
-					return true;
-			}
-		}
-
-		return false;
-	}
-
-	function _readBool($chr) {
-		$this->_token = JSON_BOOL;
-		$this->_value = $chr == 't';
-
-		if ($chr == 't')
-			$this->skip(3); // rue
-		else
-			$this->skip(4); // alse
-
-		$this->readAway();
-
-		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-			$this->_needProp = true;
-
-		return true;
-	}
-
-	function _readNull() {
-		$this->_token = JSON_NULL;
-		$this->_value = null;
-
-		$this->skip(3); // ull
-		$this->readAway();
-
-		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-			$this->_needProp = true;
-
-		return true;
-	}
-
-	function _readString($quote) {
-		$output = "";
-		$this->_token = JSON_STR;
-		$endString = false;
-
-		while (($chr = $this->peek()) != -1) {
-			switch ($chr) {
-				case '\\':
-					// Read away slash
-					$this->read();
-
-					// Read escape code
-					$chr = $this->read();
-					switch ($chr) {
-							case 't':
-								$output .= "\t";
-								break;
-
-							case 'b':
-								$output .= "\b";
-								break;
-
-							case 'f':
-								$output .= "\f";
-								break;
-
-							case 'r':
-								$output .= "\r";
-								break;
-
-							case 'n':
-								$output .= "\n";
-								break;
-
-							case 'u':
-								$output .= $this->_int2utf8(hexdec($this->read(4)));
-								break;
-
-							default:
-								$output .= $chr;
-								break;
-					}
-
-					break;
-
-					case '\'':
-					case '"':
-						if ($chr == $quote)
-							$endString = true;
-
-						$chr = $this->read();
-						if ($chr != -1 && $chr != $quote)
-							$output .= $chr;
-
-						break;
-
-					default:
-						$output .= $this->read();
-			}
-
-			// String terminated
-			if ($endString)
-				break;
-		}
-
-		$this->readAway();
-		$this->_value = $output;
-
-		// Needed a property
-		if ($this->_needProp) {
-			$this->_token = JSON_KEY;
-			$this->_needProp = false;
-			return true;
-		}
-
-		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-			$this->_needProp = true;
-
-		return true;
-	}
-
-	function _int2utf8($int) {
-		$int = intval($int);
-
-		switch ($int) {
-			case 0:
-				return chr(0);
-
-			case ($int & 0x7F):
-				return chr($int);
-
-			case ($int & 0x7FF):
-				return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F));
-
-			case ($int & 0xFFFF):
-				return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F));
-
-			case ($int & 0x1FFFFF):
-				return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F));
-		}
-	}
-
-	function _readNumber($start) {
-		$value = "";
-		$isFloat = false;
-
-		$this->_token = JSON_INT;
-		$value .= $start;
-
-		while (($chr = $this->peek()) != -1) {
-			if (is_numeric($chr) || $chr == '-' || $chr == '.') {
-				if ($chr == '.')
-					$isFloat = true;
-
-				$value .= $this->read();
-			} else
-				break;
-		}
-
-		$this->readAway();
-
-		if ($isFloat) {
-			$this->_token = JSON_FLOAT;
-			$this->_value = floatval($value);
-		} else
-			$this->_value = intval($value);
-
-		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-			$this->_needProp = true;
-
-		return true;
-	}
-
-	function readAway() {
-		while (($chr = $this->peek()) != null) {
-			if ($chr != ':' && $chr != ',' && $chr != ' ')
-				return;
-
-			$this->read();
-		}
-	}
-
-	function read($len = 1) {
-		if ($this->_pos < $this->_len) {
-			if ($len > 1) {
-				$str = substr($this->_data, $this->_pos + 1, $len);
-				$this->_pos += $len;
-
-				return $str;
-			} else
-				return $this->_data[++$this->_pos];
-		}
-
-		return null;
-	}
-
-	function skip($len) {
-		$this->_pos += $len;
-	}
-
-	function peek() {
-		if ($this->_pos < $this->_len)
-			return $this->_data[$this->_pos + 1];
-
-		return null;
-	}
-}
-
-/**
- * This class handles JSON stuff.
- *
- * @package MCManager.utils
- */
-class Moxiecode_JSON {
-	function Moxiecode_JSON() {
-	}
-
-	function decode($input) {
-		$reader = new Moxiecode_JSONReader($input);
-
-		return $this->readValue($reader);
-	}
-
-	function readValue(&$reader) {
-		$this->data = array();
-		$this->parents = array();
-		$this->cur =& $this->data;
-		$key = null;
-		$loc = JSON_IN_ARRAY;
-
-		while ($reader->readToken()) {
-			switch ($reader->getToken()) {
-				case JSON_STR:
-				case JSON_INT:
-				case JSON_BOOL:
-				case JSON_FLOAT:
-				case JSON_NULL:
-					switch ($reader->getLocation()) {
-						case JSON_IN_OBJECT:
-							$this->cur[$key] = $reader->getValue();
-							break;
-
-						case JSON_IN_ARRAY:
-							$this->cur[] = $reader->getValue();
-							break;
-
-						default:
-							return $reader->getValue();
-					}
-					break;
-
-				case JSON_KEY:
-					$key = $reader->getValue();
-					break;
-
-				case JSON_START_OBJ:
-				case JSON_START_ARRAY:
-					if ($loc == JSON_IN_OBJECT)
-						$this->addArray($key);
-					else
-						$this->addArray(null);
-
-					$cur =& $obj;
-
-					$loc = $reader->getLocation();
-					break;
-
-				case JSON_END_OBJ:
-				case JSON_END_ARRAY:
-					$loc = $reader->getLocation();
-
-					if (count($this->parents) > 0) {
-						$this->cur =& $this->parents[count($this->parents) - 1];
-						array_pop($this->parents);
-					}
-					break;
-			}
-		}
-
-		return $this->data[0];
-	}
-
-	// This method was needed since PHP is crapy and doesn't have pointers/references
-	function addArray($key) {
-		$this->parents[] =& $this->cur;
-		$ar = array();
-
-		if ($key)
-			$this->cur[$key] =& $ar;
-		else
-			$this->cur[] =& $ar;
-
-		$this->cur =& $ar;
-	}
-
-	function getDelim($index, &$reader) {
-		switch ($reader->getLocation()) {
-			case JSON_IN_ARRAY:
-			case JSON_IN_OBJECT:
-				if ($index > 0)
-					return ",";
-				break;
-		}
-
-		return "";
-	}
-
-	function encode($input) {
-		switch (gettype($input)) {
-			case 'boolean':
-				return $input ? 'true' : 'false';
-
-			case 'integer':
-				return (int) $input;
-
-			case 'float':
-			case 'double':
-				return (float) $input;
-
-			case 'NULL':
-				return 'null';
-
-			case 'string':
-				return $this->encodeString($input);
-
-			case 'array':
-				return $this->_encodeArray($input);
-
-			case 'object':
-				return $this->_encodeArray(get_object_vars($input));
-		}
-
-		return '';
-	}
-
-	function encodeString($input) {
-		// Needs to be escaped
-		if (preg_match('/[^a-zA-Z0-9]/', $input)) {
-			$output = '';
-
-			for ($i=0; $i<strlen($input); $i++) {
-				switch ($input[$i]) {
-					case "\b":
-						$output .= "\\b";
-						break;
-
-					case "\t":
-						$output .= "\\t";
-						break;
-
-					case "\f":
-						$output .= "\\f";
-						break;
-
-					case "\r":
-						$output .= "\\r";
-						break;
-
-					case "\n":
-						$output .= "\\n";
-						break;
-
-					case '\\':
-						$output .= "\\\\";
-						break;
-
-					case '\'':
-						$output .= "\\'";
-						break;
-
-					case '"':
-						$output .= '\"';
-						break;
-
-					default:
-						$byte = ord($input[$i]);
-
-						if (($byte & 0xE0) == 0xC0) {
-							$char = pack('C*', $byte, ord($input[$i + 1]));
-							$i += 1;
-							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-						} if (($byte & 0xF0) == 0xE0) {
-							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]));
-							$i += 2;
-							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-						} if (($byte & 0xF8) == 0xF0) {
-							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3])));
-							$i += 3;
-							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-						} if (($byte & 0xFC) == 0xF8) {
-							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4])));
-							$i += 4;
-							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-						} if (($byte & 0xFE) == 0xFC) {
-							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5])));
-							$i += 5;
-							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-						} else if ($byte < 128)
-							$output .= $input[$i];
-				}
-			}
-
-			return '"' . $output . '"';
-		}
-
-		return '"' . $input . '"';
-	}
-
-	function _utf82utf16($utf8) {
-		if (function_exists('mb_convert_encoding'))
-			return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-
-		switch (strlen($utf8)) {
-			case 1:
-				return $utf8;
-
-			case 2:
-				return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1])));
-
-			case 3:
-				return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2])));
-		}
-
-		return '';
-	}
-
-	function _encodeArray($input) {
-		$output = '';
-		$isIndexed = true;
-
-		$keys = array_keys($input);
-		for ($i=0; $i<count($keys); $i++) {
-			if (!is_int($keys[$i])) {
-				$output .= $this->encodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]);
-				$isIndexed = false;
-			} else
-				$output .= $this->encode($input[$keys[$i]]);
-
-			if ($i != count($keys) - 1)
-				$output .= ',';
-		}
-
-		return $isIndexed ? '[' . $output . ']' : '{' . $output . '}';
-	}
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php b/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php
deleted file mode 100755
index bc501ea..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php
+++ /dev/null
@@ -1,268 +0,0 @@
-<?php
-/**
- * $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $
- *
- * @package MCFileManager.filesystems
- * @author Moxiecode
- * @copyright Copyright � 2005, Moxiecode Systems AB, All rights reserved.
- */
-
-// File type contstants
-define('MC_LOGGER_DEBUG', 0);
-define('MC_LOGGER_INFO', 10);
-define('MC_LOGGER_WARN', 20);
-define('MC_LOGGER_ERROR', 30);
-define('MC_LOGGER_FATAL', 40);
-
-/**
- * Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's
- * designed to be compact but still powerful and flexible.
- */
-class Moxiecode_Logger {
-	// Private fields
-	var $_path;
-	var $_filename;
-	var $_maxSize;
-	var $_maxFiles;
-	var $_maxSizeBytes;
-	var $_level;
-	var $_format;
-
-	/**
-	 * Constructs a new logger instance.
-	 */
-	function Moxiecode_Logger() {
-		$this->_path = "";
-		$this->_filename = "{level}.log";
-		$this->setMaxSize("100k");
-		$this->_maxFiles = 10;
-		$this->_level = MC_LOGGER_DEBUG;
-		$this->_format = "[{time}] [{level}] {message}";
-	}
-
-	/**
-	 * Sets the current log level, use the MC_LOGGER constants.
-	 *
-	 * @param int $level Log level instance for example MC_LOGGER_DEBUG.
-	 */
-	function setLevel($level) {
-		if (is_string($level)) {
-			switch (strtolower($level)) {
-				case "debug":
-					$level = MC_LOGGER_DEBUG;
-					break;
-
-				case "info":
-					$level = MC_LOGGER_INFO;
-					break;
-
-				case "warn":
-				case "warning":
-					$level = MC_LOGGER_WARN;
-					break;
-
-				case "error":
-					$level = MC_LOGGER_ERROR;
-					break;
-
-				case "fatal":
-					$level = MC_LOGGER_FATAL;
-					break;
-
-				default:
-					$level = MC_LOGGER_FATAL;
-			}
-		}
-
-		$this->_level = $level;
-	}
-
-	/**
-	 * Returns the current log level for example MC_LOGGER_DEBUG.
-	 *
-	 * @return int Current log level for example MC_LOGGER_DEBUG.
-	 */
-	function getLevel() {
-		return $this->_level;
-	}
-
-	function setPath($path) {
-		$this->_path = $path;
-	}
-
-	function getPath() {
-		return $this->_path;
-	}
-
-	function setFileName($file_name) {
-		$this->_filename = $file_name;
-	}
-
-	function getFileName() {
-		return $this->_filename;
-	}
-
-	function setFormat($format) {
-		$this->_format = $format;
-	}
-
-	function getFormat() {
-		return $this->_format;
-	}
-
-	function setMaxSize($size) {
-		// Fix log max size
-		$logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size));
-
-		// Is KB
-		if (strpos((strtolower($size)), "k") > 0)
-			$logMaxSizeBytes *= 1024;
-
-		// Is MB
-		if (strpos((strtolower($size)), "m") > 0)
-			$logMaxSizeBytes *= (1024 * 1024);
-
-		$this->_maxSizeBytes = $logMaxSizeBytes;
-		$this->_maxSize = $size;
-	}
-
-	function getMaxSize() {
-		return $this->_maxSize;
-	}
-
-	function setMaxFiles($max_files) {
-		$this->_maxFiles = $max_files;
-	}
-
-	function getMaxFiles() {
-		return $this->_maxFiles;
-	}
-
-	function debug($msg) {
-		$args = func_get_args();
-		$this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args));
-	}
-
-	function info($msg) {
-		$args = func_get_args();
-		$this->_logMsg(MC_LOGGER_INFO, implode(', ', $args));
-	}
-
-	function warn($msg) {
-		$args = func_get_args();
-		$this->_logMsg(MC_LOGGER_WARN, implode(', ', $args));
-	}
-
-	function error($msg) {
-		$args = func_get_args();
-		$this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args));
-	}
-
-	function fatal($msg) {
-		$args = func_get_args();
-		$this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args));
-	}
-
-	function isDebugEnabled() {
-		return $this->_level >= MC_LOGGER_DEBUG;
-	}
-
-	function isInfoEnabled() {
-		return $this->_level >= MC_LOGGER_INFO;
-	}
-
-	function isWarnEnabled() {
-		return $this->_level >= MC_LOGGER_WARN;
-	}
-
-	function isErrorEnabled() {
-		return $this->_level >= MC_LOGGER_ERROR;
-	}
-
-	function isFatalEnabled() {
-		return $this->_level >= MC_LOGGER_FATAL;
-	}
-
-	function _logMsg($level, $message) {
-		$roll = false;
-
-		if ($level < $this->_level)
-			return;
-
-		$logFile = $this->toOSPath($this->_path . "/" . $this->_filename);
-
-		switch ($level) {
-			case MC_LOGGER_DEBUG:
-				$levelName = "DEBUG";
-				break;
-
-			case MC_LOGGER_INFO:
-				$levelName = "INFO";
-				break;
-
-			case MC_LOGGER_WARN:
-				$levelName = "WARN";
-				break;
-
-			case MC_LOGGER_ERROR:
-				$levelName = "ERROR";
-				break;
-
-			case MC_LOGGER_FATAL:
-				$levelName = "FATAL";
-				break;
-		}
-
-		$logFile = str_replace('{level}', strtolower($levelName), $logFile);
-
-		$text = $this->_format;
-		$text = str_replace('{time}', date("Y-m-d H:i:s"), $text);
-		$text = str_replace('{level}', strtolower($levelName), $text);
-		$text = str_replace('{message}', $message, $text);
-		$message = $text . "\r\n";
-
-		// Check filesize
-		if (file_exists($logFile)) {
-			$size = @filesize($logFile);
-
-			if ($size + strlen($message) > $this->_maxSizeBytes)
-				$roll = true;
-		}
-
-		// Roll if the size is right
-		if ($roll) {
-			for ($i=$this->_maxFiles-1; $i>=1; $i--) {
-				$rfile = $this->toOSPath($logFile . "." . $i);
-				$nfile = $this->toOSPath($logFile . "." . ($i+1));
-
-				if (@file_exists($rfile))
-					@rename($rfile, $nfile);
-			}
-
-			@rename($logFile, $this->toOSPath($logFile . ".1"));
-
-			// Delete last logfile
-			$delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1));
-			if (@file_exists($delfile))
-				@unlink($delfile);
-		}
-
-		// Append log line
-		if (($fp = @fopen($logFile, "a")) != null) {
-			@fputs($fp, $message);
-			@fflush($fp);
-			@fclose($fp);
-		}
-	}
-
-	/**
-	 * Converts a Unix path to OS specific path.
-	 *
-	 * @param String $path Unix path to convert.
-	 */
-	function toOSPath($path) {
-		return str_replace("/", DIRECTORY_SEPARATOR, $path);
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/config.php b/program/js/tiny_mce/plugins/spellchecker/config.php
deleted file mode 100755
index b653dc9..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/config.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-	/** start RoundCube specific code */
-	
-	define('INSTALL_PATH', preg_replace('/program[\\\\\/]js[\\\\\/].+$/', '', getcwd()));
-	require_once INSTALL_PATH . 'program/include/iniset.php';
-	
-	$rcmail_config = new rcube_config();
-	$config['general.engine'] = $rcmail_config->get('spellcheck_engine') == 'pspell' ? 'PSpell' : 'GoogleSpell';
-	$config['GoogleSpell.rpc_uri'] = $rcmail_config->get('spellcheck_uri');
-	
-	/** end RoundCube specific code */
-
-	// General settings
-	//$config['general.engine'] = 'GoogleSpell';
-	//$config['general.engine'] = 'PSpell';
-	//$config['general.engine'] = 'PSpellShell';
-	//$config['general.remote_rpc_url'] = 'http://some.other.site/some/url/rpc.php';
-
-	// PSpell settings
-	$config['PSpell.mode'] = PSPELL_FAST;
-	$config['PSpell.spelling'] = "";
-	$config['PSpell.jargon'] = "";
-	$config['PSpell.encoding'] = "";
-
-	// PSpellShell settings
-	$config['PSpellShell.mode'] = PSPELL_FAST;
-	$config['PSpellShell.aspell'] = '/usr/bin/aspell';
-	$config['PSpellShell.tmp'] = '/tmp';
-	
-	// Windows PSpellShell settings
-	//$config['PSpellShell.aspell'] = '"c:\Program Files\Aspell\bin\aspell.exe"';
-	//$config['PSpellShell.tmp'] = 'c:/temp';
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/includes/general.php b/program/js/tiny_mce/plugins/spellchecker/includes/general.php
deleted file mode 100755
index 9a12145..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/includes/general.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * general.php
- *
- * @package MCManager.includes
- * @author Moxiecode
- * @copyright Copyright � 2007, Moxiecode Systems AB, All rights reserved.
- */
-
-@error_reporting(E_ALL ^ E_NOTICE);
-$config = array();
-
-require_once(dirname(__FILE__) . "/../classes/utils/Logger.php");
-require_once(dirname(__FILE__) . "/../classes/utils/JSON.php");
-require_once(dirname(__FILE__) . "/../config.php");
-require_once(dirname(__FILE__) . "/../classes/SpellChecker.php");
-
-if (isset($config['general.engine']))
-	require_once(dirname(__FILE__) . "/../classes/" . $config["general.engine"] . ".php");
-
-/**
- * Returns an request value by name without magic quoting.
- *
- * @param String $name Name of parameter to get.
- * @param String $default_value Default value to return if value not found.
- * @return String request value by name without magic quoting or default value.
- */
-function getRequestParam($name, $default_value = false, $sanitize = false) {
-	if (!isset($_REQUEST[$name]))
-		return $default_value;
-
-	if (is_array($_REQUEST[$name])) {
-		$newarray = array();
-
-		foreach ($_REQUEST[$name] as $name => $value)
-			$newarray[formatParam($name, $sanitize)] = formatParam($value, $sanitize);
-
-		return $newarray;
-	}
-
-	return formatParam($_REQUEST[$name], $sanitize);
-}
-
-function &getLogger() {
-	global $mcLogger, $man;
-
-	if (isset($man))
-		$mcLogger = $man->getLogger();
-
-	if (!$mcLogger) {
-		$mcLogger = new Moxiecode_Logger();
-
-		// Set logger options
-		$mcLogger->setPath(dirname(__FILE__) . "/../logs");
-		$mcLogger->setMaxSize("100kb");
-		$mcLogger->setMaxFiles("10");
-		$mcLogger->setFormat("{time} - {message}");
-	}
-
-	return $mcLogger;
-}
-
-function debug($msg) {
-	$args = func_get_args();
-
-	$log = getLogger();
-	$log->debug(implode(', ', $args));
-}
-
-function info($msg) {
-	$args = func_get_args();
-
-	$log = getLogger();
-	$log->info(implode(', ', $args));
-}
-
-function error($msg) {
-	$args = func_get_args();
-
-	$log = getLogger();
-	$log->error(implode(', ', $args));
-}
-
-function warn($msg) {
-	$args = func_get_args();
-
-	$log = getLogger();
-	$log->warn(implode(', ', $args));
-}
-
-function fatal($msg) {
-	$args = func_get_args();
-
-	$log = getLogger();
-	$log->fatal(implode(', ', $args));
-}
-
-?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/rpc.php b/program/js/tiny_mce/plugins/spellchecker/rpc.php
deleted file mode 100755
index 0024d3f..0000000
--- a/program/js/tiny_mce/plugins/spellchecker/rpc.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-/**
- * $Id: rpc.php 822 2008-04-28 13:45:03Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright � 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-require_once("./includes/general.php");
-
-// Set RPC response headers
-header('Content-Type: text/plain');
-header('Content-Encoding: UTF-8');
-header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
-header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
-header("Cache-Control: no-store, no-cache, must-revalidate");
-header("Cache-Control: post-check=0, pre-check=0", false);
-header("Pragma: no-cache");
-
-$raw = "";
-
-// Try param
-if (isset($_POST["json_data"]))
-	$raw = getRequestParam("json_data");
-
-// Try globals array
-if (!$raw && isset($_GLOBALS) && isset($_GLOBALS["HTTP_RAW_POST_DATA"]))
-	$raw = $_GLOBALS["HTTP_RAW_POST_DATA"];
-
-// Try globals variable
-if (!$raw && isset($HTTP_RAW_POST_DATA))
-	$raw = $HTTP_RAW_POST_DATA;
-
-// Try stream
-if (!$raw) {
-	if (!function_exists('file_get_contents')) {
-		$fp = fopen("php://input", "r");
-		if ($fp) {
-			$raw = "";
-
-			while (!feof($fp))
-				$raw = fread($fp, 1024);
-
-			fclose($fp);
-		}
-	} else
-		$raw = "" . file_get_contents("php://input");
-}
-
-// No input data
-if (!$raw)
-	die('{"result":null,"id":null,"error":{"errstr":"Could not get raw post data.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');
-
-
-// Passthrough request to remote server
-if (isset($config['general.remote_rpc_url'])) {
-	$url = parse_url($config['general.remote_rpc_url']);
-
-	// Setup request
-	$req = "POST " . $url["path"] . " HTTP/1.0\r\n";
-	$req .= "Connection: close\r\n";
-	$req .= "Host: " . $url['host'] . "\r\n";
-	$req .= "Content-Length: " . strlen($raw) . "\r\n";
-	$req .= "\r\n" . $raw;
-
-	if (!isset($url['port']) || !$url['port'])
-		$url['port'] = 80;
-
-	$errno = $errstr = "";
-
-	$socket = fsockopen($url['host'], intval($url['port']), $errno, $errstr, 30);
-	if ($socket) {
-		// Send request headers
-		fputs($socket, $req);
-
-		// Read response headers and data
-		$resp = "";
-		while (!feof($socket))
-				$resp .= fgets($socket, 4096);
-
-		fclose($socket);
-
-		// Split response header/data
-		$resp = explode("\r\n\r\n", $resp);
-		echo $resp[1]; // Output body
-	}
-
-	die();
-}
-
-console($raw);
-// Get JSON data
-$json = new Moxiecode_JSON();
-$input = $json->decode($raw);
-
-// Execute RPC
-if (isset($config['general.engine'])) {
-	$spellchecker = new $config['general.engine']($config);
-	$result = call_user_func_array(array($spellchecker, $input['method']), $input['params']);
-} else
-	die('{"result":null,"id":null,"error":{"errstr":"You must choose an spellchecker engine in the config.php file.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');
-
-// Request and response id should always be the same
-$output = array(
-	"id" => $input->id,
-	"result" => $result,
-	"error" => null
-);
-
-console($json->encode($output));
-// Return JSON encoded string
-echo $json->encode($output);
-
-?>
\ No newline at end of file
diff --git a/program/steps/utils/spell.inc b/program/steps/utils/spell.inc
index d0fbcb9..3778865 100644
--- a/program/steps/utils/spell.inc
+++ b/program/steps/utils/spell.inc
@@ -18,11 +18,15 @@
 
 */
 
+// max. number of suggestions for one word
+define('MAX_SUGGESTIONS', 10);
+
+$tiny = !empty($_GET['tiny']) ? 'html_' : '';
+
 if ($spell_engine = $RCMAIL->config->get('spellcheck_engine', 'googie')) {
-    include('spell_'.$spell_engine.'.inc');
+    include('spell_'.$tiny.$spell_engine.'.inc');
 }
 
 header('HTTP/1.1 404 Not Found');
 exit;
-
 
diff --git a/program/steps/utils/spell_googie.inc b/program/steps/utils/spell_googie.inc
index 038559c..d06a1a8 100644
--- a/program/steps/utils/spell_googie.inc
+++ b/program/steps/utils/spell_googie.inc
@@ -2,7 +2,7 @@
 
 /*
  +-----------------------------------------------------------------------+
- | program/steps/utils/spell.inc                                         |
+ | program/steps/utils/spell_googie.inc                                  |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
  | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
@@ -52,7 +52,7 @@
   $out .= "Connection: Close\r\n\r\n";
   $out .= $data;
   fwrite($fp, $out);
-  
+
   while (!feof($fp))
     $store .= fgets($fp, 128);
   fclose($fp);
diff --git a/program/steps/utils/spell_html_googie.inc b/program/steps/utils/spell_html_googie.inc
new file mode 100644
index 0000000..292f303
--- /dev/null
+++ b/program/steps/utils/spell_html_googie.inc
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell_html_googie.inc                             |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2010, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Submit request to Google's spell checking engine                    |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell_googie.inc 3780 2010-06-23 09:55:08Z alec $
+
+*/
+
+function json_error($str)
+{
+    echo '{"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}';
+    exit;
+}
+
+function googie_get($host, $port, $path, $data)
+{
+    $store = '';
+    if ($fp = fsockopen($host, $port, $errno, $errstr, 30)) {
+        $out = "POST $path HTTP/1.0\r\n";
+        $out .= "Host: $host\r\n";
+        $out .= "Content-Length: " . strlen($data) . "\r\n";
+        $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
+        $out .= "Connection: Close\r\n\r\n";
+        $out .= $data;
+        fwrite($fp, $out);
+
+        while (!feof($fp))
+            $store .= fgets($fp, 128);
+        fclose($fp);
+    }
+
+    if (!$store) {
+        json_error("Empty result from spelling engine");
+    }
+
+    $matches = array();
+    preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $store, $matches, PREG_SET_ORDER);
+
+    return $matches;
+}
+
+$REMOTE_REQUEST = TRUE;
+
+// read input
+$data = file_get_contents('php://input');
+
+// Decode JSON input
+$request = json_decode($data, true);
+$result = array();
+
+$lang = $request['params'][0];
+$data = $request['params'][1];
+$result['id'] = $request['id'];
+
+// default settings
+$host = "ssl://www.google.com";
+$port = 443;
+$path = "/tbproxy/spell?lang=$lang";
+
+// spell check uri is configured
+if (!empty($CONFIG['spellcheck_uri']))
+  {
+  $a_uri = parse_url($CONFIG['spellcheck_uri']);
+  $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');
+  $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);
+  $host = ($ssl ? 'ssl://' : '') . $a_uri['host'];
+  $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;
+  }
+
+$wordstr = implode(' ', (array) $data);
+$data = '<?xml version="1.0" encoding="utf-8" ?>'
+    .'<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'
+    .'<text>' . $wordstr . '</text>'
+    .'</spellrequest>';
+$matches = googie_get($host, $port, $path, $data);
+
+if ($request['method'] == 'checkWords') {
+    $result['result'] = array();
+    for ($i=0, $len=count($matches); $i<$len; $i++)
+        $result['result'][] = mb_substr($wordstr, $matches[$i][1], $matches[$i][2], RCMAIL_CHARSET);
+}
+else if ($request['method'] == 'getSuggestions') {
+    $suggestions = explode("\t", $matches[0][4]);
+    if (sizeof($suggestions)>MAX_SUGGESTIONS)
+        $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
+    $result['result'] = $suggestions;
+}
+
+// send output
+header("Content-Type: text/xml; charset=".RCMAIL_CHARSET);
+echo json_encode($result);
+exit;
+
diff --git a/program/steps/utils/spell_html_pspell.inc b/program/steps/utils/spell_html_pspell.inc
new file mode 100644
index 0000000..13344b0
--- /dev/null
+++ b/program/steps/utils/spell_html_pspell.inc
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell_pspell_tiny.inc                             |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2010, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Use the Pspell extension to check spelling in TinyMCE               |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell_pspell.inc 3780 2010-06-23 09:55:08Z alec $
+
+*/
+
+function json_error($str)
+{
+    echo '{"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}';
+    exit;
+}
+
+if (!extension_loaded('pspell')) {
+    raise_error(array(
+      'code' => 500,
+      'type' => 'php',
+      'file' => __FILE__, 'line' => __LINE__,
+      'message' => "Pspell extension not available"), true, false);
+
+    json_error("Pspell extension not available");
+}
+
+// read input
+$data = file_get_contents('php://input');
+
+// Decode JSON input
+$request = json_decode($data, true);
+$result = array();
+
+$lang = $request['params'][0];
+$data = $request['params'][1];
+$result['id'] = $request['id'];
+
+// init spellchecker
+$plink = pspell_new($lang, null, null, RCMAIL_CHARSET, PSPELL_FAST);
+
+if (!$plink) {
+    json_error("Unable to load Pspell engine for selected language");
+}
+
+if ($request['method'] == 'checkWords') {
+    $result['result'] = array();
+    foreach ((array)$data as $word) {
+        if ($word && preg_match('/[^0-9\.]/', $word)
+	        && !pspell_check($plink, $word)) {
+            $result['result'][] = $word;
+        }
+    }
+}
+else if ($request['method'] == 'getSuggestions') {
+    $suggestions = pspell_suggest($plink, $data);
+    if (sizeof($suggestions)>MAX_SUGGESTIONS)
+        $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
+    $result['result'] = $suggestions;
+}
+
+// send output
+header("Content-Type: text/xml; charset=".RCMAIL_CHARSET);
+echo json_encode($result);
+exit;
+
diff --git a/program/steps/utils/spell_pspell.inc b/program/steps/utils/spell_pspell.inc
index 2c9c233..58720ff 100644
--- a/program/steps/utils/spell_pspell.inc
+++ b/program/steps/utils/spell_pspell.inc
@@ -30,9 +30,6 @@
     exit;
 }
 
-// max. number of suggestions for one word
-define('MAX_SUGGESTIONS', 10);
-
 // read input
 $data = file_get_contents('php://input');
 
@@ -59,7 +56,7 @@
     if ($word && $plink && preg_match('/[^0-9\.]/', $word)
 	&& !pspell_check($plink, $word)) {
         $suggestions = pspell_suggest($plink, $word);
-	if (sizeof($suggestions)>10)
+	if (sizeof($suggestions)>MAX_SUGGESTIONS)
 	  $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
 
         $out .= '<c o="'.$pos.'" l="'.$len.'">';

--
Gitblit v1.9.1