/////////////////////////////////////////////////////////////////////////////////////////
function MTB_I_Make_RegExp(strName)
{
	return new RegExp('\\b' + escape(strName).replace(/%/g, '\\x').replace(/\+/g, ' ') + '\\b', 'g');
}

function MTB_I_EscapeText(strSrc)
{
	return strSrc.replace(/&/g,'&amp;').replace(/</g,'&lt;');
}

function MTB_I_UnescapeText(strSrc)
{
	return strSrc.replace(/&lt;/g, '<').replace(/&amp;/g, '&');
}
/////////////////////////////////////////////////////////////////////////////////////////
function MTB_I_StdAction(strText)
{
	this.obj.restore(strText);
}
function MTB_I_DummyObj()
{
	this.value	= '';
	this.name	= 'MTB_Dummy.action(this.document.forms[0].msg_body.value), parent.opener.MTB_Dummy';
	this.obj	= null;
}
MTB_I_DummyObj.prototype.action	= MTB_I_StdAction;
var MTB_Dummy	= new MTB_I_DummyObj();
/////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////
/*
function MTB_I_Compose_Text(bSimple)
{
	var	pCol	= eval(	this.m_strDoc + '.' + 
						this.m_strCollection);											
						
	var nColLen	= pCol.length;
	var	strResult;
	var i,j;
	var count	= 0;

	if (bSimple)
		strResult	= '';
	else
		strResult	= this.m_strBegin;
	for (i = 0; i < nColLen; i++)
	{
		var	pSCol	= eval(	this.m_strDoc + '.' + 
							this.m_strCollection + '[' + i + ']' + '.' + 
							this.m_strSubCollection);
		var nSClLen	= pSCol.length;
		
		for (j = 0; j < nSClLen; j++)
		{		
			var rXn	= MTB_I_Make_RegExp(pSCol[j].name);						
			var rXt	= MTB_I_Make_RegExp(pSCol[j].type);
			
			if (rXt.test(this.m_strTypes) && ((!this.m_strNames.length) || rXn.test(this.m_strNames)) && (!pSCol[j].value.match(/^\s*$/)))
			{
				var sPath	= 	this.m_strDoc + '.' + 
								this.m_strCollection + '[' + i + ']' + '.' + 
								this.m_strSubCollection + '[' + j + ']';
																			
				var	sVal	= 	eval(sPath).value;
				
				if (!bSimple)
					strResult	+= this.m_strRBegin + '_x_path="' + sPath + '"' + this.m_strRMiddle;
				strResult		+= MTB_I_EscapeText(sVal);
				if (!bSimple)	
					strResult	+= this.m_strREnd;
				else
					strResult	+= this.m_strSDiv;
				count++;
			}
		}
	}
	if (!bSimple)
		strResult	+= this.m_strEnd;
	return strResult;
}
*/

function MTB_I_Compose_Text(bSimple)
{
	var	pCol	= eval(	this.m_strDoc + '.' + 
						this.m_strCollection);											
						
	var nColLen	= pCol.length;
	var	strResult;
	var i,j;
	var count	= 0;

	if (bSimple)
		strResult	= '';
	else
		strResult	= this.m_strBegin;
	for (i = 0; i < nColLen; i++)
	{
		var	pSCol	= eval(	this.m_strDoc + '.' + 
							this.m_strCollection + '[' + i + ']' + '.' + 
							this.m_strSubCollection);
		var nSClLen	= pSCol.length;
		
		for (j = 0; j < nSClLen; j++)
		{	
			// !!!!! modification !!!!!!
			// using element number instead of name, because our []'s mess things up
			// we send a list of element numbers, and this tests to see if that number is in the list	
			var rXn	= MTB_I_Make_RegExp(j);						
			var rXt	= MTB_I_Make_RegExp(pSCol[j].type);
			
			if (rXt.test(this.m_strTypes) && ((!this.m_strNames.length) || rXn.test(this.m_strNames)) && (!pSCol[j].value.match(/^\s*$/)))
			{
				var sPath	= 	this.m_strDoc + '.' + 
								this.m_strCollection + '[' + i + ']' + '.' + 
								this.m_strSubCollection + '[' + j + ']';
																			
				var	sVal	= 	eval(sPath).value;
				
				if (!bSimple)
					strResult	+= this.m_strRBegin + '_x_path="' + sPath + '"' + this.m_strRMiddle;
				strResult		+= MTB_I_EscapeText(sVal);
				if (!bSimple)	
					strResult	+= this.m_strREnd;
				else
					strResult	+= this.m_strSDiv;
				count++;
			}
		}
	}
	if (!bSimple)
		strResult	+= this.m_strEnd;
	return strResult;
}


/////////////////////////////////////////////////////////////////////////////////////////
function MTB_I_Restore(strValue)
{
	var aE	= MTB_I_UnescapeText(strValue).split(this.m_strSplitter);
	var i;
	var sPath;
	var nBeg,nEnd;
	
	for (i = 0; i < aE.length - 1; i++)
	{
		nBeg				= aE[i].indexOf('_x_path="') + '_x_path="'.length;
		nEnd				= aE[i].indexOf('"' + this.m_strRMiddle, nBeg);
		sPath 				= aE[i].substring(nBeg, nEnd);
		eval(sPath).value	= aE[i].substring(nEnd + this.m_strRMiddle.length + 1, aE[i].length);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////
function MTB_I_Check()
{
	MTB_Dummy.value		= this.compose(false);
	MTB_Dummy.obj    	= this;

	if (MTB_Dummy.value == (this.m_strBegin + this.m_strEnd))
		alert('Nothing to check');
	else
		doSpell(this.m_strLang, MTB_Dummy, this.m_strSPath, true);
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
function MTBChecker(strNames, strLang, strSproxyPath)
{
	this.m_strNames	= strNames;
	this.m_strLang	= strLang;
	this.m_strSPath	= strSproxyPath;
}

MTBChecker.prototype.check		= MTB_I_Check;
MTBChecker.prototype.compose	= MTB_I_Compose_Text;
MTBChecker.prototype.restore	= MTB_I_Restore;

MTBChecker.prototype.m_strBegin		= '<table border=1 bordercolor=silver width=100%>';
MTBChecker.prototype.m_strEnd		= '</table>';
MTBChecker.prototype.m_strRBegin	= '<TR tr_x_tr><TD ';
MTBChecker.prototype.m_strRMiddle	= '><PRE>';
MTBChecker.prototype.m_strREnd		= '</PRE></TD tr_x_tr></TR tr_x_tr>';
MTBChecker.prototype.m_strSplitter	= "</PRE></TD tr_x_tr></TR tr_x_tr>";
MTBChecker.prototype.m_strSDiv		= '\n\n';

MTBChecker.prototype.m_strDoc			= 'document';
MTBChecker.prototype.m_strCollection	= 'forms';
MTBChecker.prototype.m_strSubCollection	= 'elements';
MTBChecker.prototype.m_strTypes			= 'text,textarea';


function FCH_CheckFormTextControls(strNames, strLanf, strSproxyPath)
{
	var pChecker	= new MTBChecker(strNames, strLanf, strSproxyPath);
	pChecker.check();
}

