function checkText(textarea,counter,maxSize)
{
	tmp=maxSize-textarea.value.length;
	if (tmp<=0)
	{
		textarea.value=textarea.value.substr(0,maxSize);
		tmp=0;
	}
	counter.value=tmp;
}

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}

function addEmoticon(field, icon)
{
	fieldObj = document.getElementById(field);
	counterObj = document.getElementById(field+"_count");
	sizeObj = document.getElementById(field+"_size");

	if(fieldObj != null && counterObj != null && sizeObj != null)
	{

		fieldObj.value += icon + " ";
		counterObj.value = sizeObj.value - fieldObj.value.length;
	}

	checkText(fieldObj, document.getElementById(field+"_count").value, document.getElementById(field+"_size").value);

	return false;
}

var spellReq;

var orig = new Array();
var errors = new Array();

function sndReq(fieldName,action) {
    spellReq = createRequestObject();
    spellReq.open('POST', 'ajax/');
    spellReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

    if (action.length > 0)
    {

	    spellReq.onreadystatechange = handleResponse;
	    action=action.replace(/\&/g,"\%26");

	    spellReq.send('subaction=spellcheck&content='+action+'&fieldName='+fieldName);
     } else
     {
	document.getElementById(fieldName+'_spellCheck').disabled=false;
	document.getElementById(fieldName+'_spellCheck').value='Check Spelling';
     }
}

function handleResponse() {
    if(spellReq.readyState == 4){
        origNode = spellReq.responseXML.getElementsByTagName('original');

	if (origNode.length != 1)
	{
		alert('Error: Unable to check spelling.');
	}
	else if (origNode[0].firstChild != null)
	{
		var fieldName=origNode[0].getAttribute('fieldName');
		orig[fieldName]=origNode[0].firstChild.nodeValue;
		orig[fieldName]=orig[fieldName].replace(/\%26/g,"&");
		orig[fieldName]=orig[fieldName].replace(/\&lt;/g,"<");
		orig[fieldName]=orig[fieldName].replace(/\&gt;/g,">");

	}

	if (orig != null)
	{

		var errs = spellReq.responseXML.getElementsByTagName('error');
		errors[fieldName]=new Array();

		var output = "";
		var lastOffset=0;
		for (var i=0;i<errs.length;i++)
		{
			var word=errs[i].getAttribute('word');
			var offset=errs[i].getAttribute('offset');
			var length=errs[i].getAttribute('length');


			errors[fieldName][i]=new Array();
			errors[fieldName][i]['word']=word;
			errors[fieldName][i]['offset']=offset;
			errors[fieldName][i]['length']=length;

			var suggestions="";
			var suggs=errs[i].getElementsByTagName('suggestion');
			for (var j=0;j<suggs.length;j++)
				suggestions+=suggs[j].firstChild.nodeValue+" ";
			suggestions+=word;

			var before=orig[fieldName].substr(lastOffset,offset-lastOffset);
			before=before.replace(/&/g,"&amp;");
			before=before.replace(/</g,"&lt;");
			before=before.replace(/>/g,"&gt;");

			output+=before+"<a href=\"#\" onclick=\"replaceError('"+fieldName+"_error"+i+"','"+suggestions.replace(/\'/g,"\\'")+"'); return false;\"><font id=\""+fieldName+"_error"+i+"\" color=red>"+word+"</font></a>";
			lastOffset=(parseInt(offset)+parseInt(length));

		}

		if (errs.length == 0)
		{
			alert('No Spelling Errors Detected.');

		} else
		{
			var remainder=orig[fieldName].substr(lastOffset,orig[fieldName].length-lastOffset);
			remainder=remainder.replace(/&/g,"&amp;");
			remainder=remainder.replace(/</g,"&lt;");
			remainder=remainder.replace(/>/g,"&gt;");

			output+=remainder;
			output=output.replace(/\n/g, "<br/>");



			width=document.getElementById(fieldName).cols*5;
			height=document.getElementById(fieldName).rows*13;;
			document.getElementById(fieldName+'_highlighted').innerHTML = '<div class="spellCheckPane" style="width:'+width+'; height:'+height+';">'+output+'</div><br/><input type="button" value="Finalize Changes" onclick="finalize(\''+fieldName+'\');"><br/>Detected errors are highlighted in red.  Click each spelling error to cycle through a list of suggested words.  When you are done, click the "Finalize Changes" button.';
			document.getElementById(fieldName+'_highlighted').style.display='inline';
			document.getElementById(fieldName+'_original').style.display='none';
		}

		document.getElementById(fieldName+'_spellCheck').disabled=false;
		document.getElementById(fieldName+'_spellCheck').value='Check Spelling';
	}
    }
}

function finalize(fieldName)
{
	var output = "";
	var lastOffset=0;
	for (var i=0;i<errors[fieldName].length;i++)
	{
		var word=errors[fieldName][i]['word'];
		var offset=errors[fieldName][i]['offset'];
		var length=errors[fieldName][i]['length'];


		output+=orig[fieldName].substr(lastOffset,offset-lastOffset)+document.getElementById(fieldName+'_error'+i).innerHTML;
		lastOffset=(parseInt(offset)+parseInt(length));
	}
	output += orig[fieldName].substr(lastOffset,orig[fieldName].length-lastOffset);

	document.getElementById(fieldName).value=output;
	document.getElementById(fieldName+'_highlighted').innerHTML='';
	document.getElementById(fieldName+'_highlighted').style.display='none';
	document.getElementById(fieldName+'_original').style.display='inline';
	checkText(document.getElementById(fieldName),document.getElementById(fieldName+'_count'),parseInt(document.getElementById(fieldName+'_size').value));
}

function replaceError(word,suggestions)
{
	word=document.getElementById(word);
	var suggs=suggestions.split(' ');

	var i;
	for (i=0; suggs[i] != word.innerHTML && i < suggs.length; i++);

	var newIndex=((i+1)%suggs.length);

	word.innerHTML=suggs[newIndex];

	if (newIndex == suggs.length-1)
	{
		word.color="red";
	} else
	{
		word.color="blue";
	}

}

