/*
  ** writeKA Scripton Editor
  ** COPYRIGHT 2007 VINEETH KAIMAL. ALL RIGHTS RESERVED.
*/

var LOCK = 0;
var KEYBOARD_WORD="";
var HTTP = CreateRequestObject();
var NUM = 0;
var PREVNUM = 0;	//not used in a global way
var NEXTNUM = 0;	//not used in a global way
var WORDBUFFER=new Array();
var WORDBUFFERPOS=new Array();
var CACHEWORDS=new Array();
var CACHERESPONSE=new Array();
var CACHESELECTED=new Array();
var CURWORD = "";
var CUREDIT = 0;
var SERVER_ERROR_COUNT = 0;


function Load()
{
	if(top.location!=location_url)
	{
		top.location=location_url;
		return;
	}
	top.document.getElementById("writeka_scripton_container_status1").innerHTML = "Ready";
	top.document.getElementById("writeka_scripton_container_status2").style.display = "none";
	SetFocus();
	document.onclick=SetFocus;
	document.onkeypress=SetFocus;
	document.oncontextmenu=function(){return false;};
	document.onselectstart=function(){return false;};
	CUREDIT = 0;
	window.setInterval(Process, 10);
}

function SetFocus()
{
	UpdateBoxSize();
	document.getElementById('transmsg').focus();
}

function UpdateBoxSize()
{
	if(document.getElementById('transmsg').value.length<15)
	{
		document.getElementById('transmsg').size = document.getElementById('transmsg').value.length+1;
		document.getElementById('transmsg').cols = document.getElementById('transmsg').value.length+1;
		document.getElementById('transmsg').style.width=(document.getElementById('transmsg').value.length*10+2)+"px";
	}
	else
	{
		document.getElementById('transmsg').value = document.getElementById('transmsg').value.substr(0,15);
		document.getElementById('transmsg').style.width=(document.getElementById('transmsg').value.length*10+2)+"px";
	}
}

function UpdateStatus(status)
{
	if(status==1)	//Transliterating
	{
		top.document.getElementById("writeka_scripton_container_status1").innerHTML = "Transliterating <span style='color:BLUE'>"+CURWORD+"</span> . . .";
		top.document.getElementById("writeka_scripton_container_status2").style.display = "block";
	}
	else if(status==0)	//Ready
	{
		top.document.getElementById("writeka_scripton_container_status1").innerHTML = "Ready";
		top.document.getElementById("writeka_scripton_container_status2").style.display = "none";
	}
	else if(status==-1)	//Error
	{
		SERVER_ERROR_COUNT = SERVER_ERROR_COUNT +1;
		if(SERVER_ERROR_COUNT==1||SERVER_ERROR_COUNT%5==0)
		{
			alert("The Scripton Server may be down. Sorry for the inconvenience. Please check back later.");
		}
		top.document.getElementById("writeka_scripton_container_status1").innerHTML = "<span style='color:RED;'>Scripton Server is not responding.</span>";
		top.document.getElementById("writeka_scripton_container_status2").style.display = "none";
	}
	else if(status==-2)	//Error
	{
		SERVER_ERROR_COUNT = SERVER_ERROR_COUNT +1;
		if(SERVER_ERROR_COUNT==1||SERVER_ERROR_COUNT%5==0)
		{
			alert("The Scripton Server may be down. Sorry for the inconvenience. Please check back later.");
		}
		top.document.getElementById("writeka_scripton_container_status1").innerHTML = "<span style='color:RED;'>Could not transliterate. The server may be down, please check back later.</span>";
		top.document.getElementById("writeka_scripton_container_status2").style.display = "none";
	}
}

function Process()
{
	if(LOCK==0 && WORDBUFFER.length>0) SendTransliterationRequest();
}

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

function SendTransliterationRequest() 
{
    if(LOCK==0 && WORDBUFFER.length>0)
    {
		LOCK = 1;
		var tempStr = WORDBUFFER.shift();
		CURWORD = tempStr;
        UpdateStatus(1);
		UpdateBoxSize();
		for(i=0;i<CACHEWORDS.length;i++)
		{
			if(CACHEWORDS[i]==tempStr)
			{
				UpdateWord(CACHERESPONSE[i],i);
				return;
			}
		}
		var sid=Math.round(Math.random()*10000);
		HTTP.open('get', translit_url+'?sid='+sid+'&msg='+encodeURIComponent(tempStr));
		HTTP.onreadystatechange = HandleTransliterationResponse;
		HTTP.send(null);
	}
}

function HandleTransliterationResponse()
{
	if(HTTP.readyState == 4)
	{
	    var response = decodeURIComponent(HTTP.responseText);
		UpdateWord(response,-1);
	}
}



function ManageEditKeys(e)
{
	if(document.getElementById('transmsg').value.length!=0) return;
	var unicode=e.charCode? e.charCode : e.keyCode;
	if (unicode==8)	//back space
	{
		var sel = document.getElementById("p"+CUREDIT).innerHTML;
		if(sel>0)
		{
			var prev = document.getElementById("p"+sel).innerHTML;
			document.getElementById("s"+sel).style.display = "none";
			document.getElementById("e"+sel).style.display = "none";
			document.getElementById("p"+CUREDIT).innerHTML = prev;
			document.getElementById("n"+prev).innerHTML = CUREDIT;
		}
	}
	else if (unicode==46)	//delete
	{
		if(CUREDIT > 0)
		{
			ChangeEditLocation(document.getElementById("n"+CUREDIT).innerHTML);
			//rest is same as back space code above
			var sel = document.getElementById("p"+CUREDIT).innerHTML;
			if(sel>0)
			{
				var prev = document.getElementById("p"+sel).innerHTML;
				document.getElementById("s"+sel).style.display = "none";
				document.getElementById("e"+sel).style.display = "none";
				document.getElementById("p"+CUREDIT).innerHTML = prev;
				document.getElementById("n"+prev).innerHTML = CUREDIT;
			}
		}
	}
	else if(unicode ==37) //left
	{
		ChangeEditLocation(document.getElementById("p"+CUREDIT).innerHTML);
	}
	else if(unicode ==39)  //right
	{
		ChangeEditLocation(document.getElementById("n"+CUREDIT).innerHTML);
	}
	else if(unicode ==35)  //end
	{
		sel = CUREDIT;
		while(sel>0 && document.getElementById("s"+sel).innerHTML!="&nbsp;<br>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<BR>")
		{
			sel = document.getElementById("n"+sel).innerHTML;
			//alert(sel+" - *" + document.getElementById("s"+sel).innerHTML +"* - " + document.getElementById("n"+sel).innerHTML);
		}
		ChangeEditLocation(sel);
	}
	else if(unicode ==36)  //home
	{
		sel = document.getElementById("p"+CUREDIT).innerHTML;
		prevsel = CUREDIT;
		while(sel>0 && document.getElementById("s"+sel).innerHTML!="&nbsp;<br>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<BR>")
		{
			prevsel = sel;
			sel = document.getElementById("p"+sel).innerHTML;
			//alert(sel+" - *" + document.getElementById("s"+sel).innerHTML +"* - " + document.getElementById("n"+sel).innerHTML);
		}
		ChangeEditLocation(prevsel);
	}
	else if(unicode ==38)  //up
	{
		prevsel = CUREDIT;
		sel = document.getElementById("p"+CUREDIT).innerHTML;
		while(sel>0 && document.getElementById("s"+sel).innerHTML!="&nbsp;<br>" && document.getElementById("s"+sel).innerHTML!="&nbsp;<BR>" && document.getElementById("s"+sel).innerHTML!="&nbsp;<BR/>"  && document.getElementById("s"+sel).innerHTML!="&nbsp;<br/>")
		{
			prevsel = sel;
			sel = document.getElementById("p"+sel).innerHTML;
		}
		prevsel=sel;
		sel = document.getElementById("p"+sel).innerHTML;
		while(sel>0 && document.getElementById("s"+sel).offsetLeft>=document.getElementById("e"+CUREDIT).offsetLeft && document.getElementById("s"+sel).innerHTML!="&nbsp;<br>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<BR>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<BR/>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<br/>")
		{
			prevsel = sel;
			sel = document.getElementById("p"+sel).innerHTML;
		}
		ChangeEditLocation(prevsel);
	}
	else if(unicode ==40)  //down
	{
		sel = CUREDIT;
		while(sel>0 && document.getElementById("s"+sel).innerHTML!="&nbsp;<br>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<BR>")
		{
			sel = document.getElementById("n"+sel).innerHTML;
		}
		sel = document.getElementById("n"+sel).innerHTML;
		while(sel>0 && document.getElementById("s"+sel).offsetLeft<document.getElementById("e"+CUREDIT).offsetLeft && document.getElementById("s"+sel).innerHTML!="&nbsp;<br>"&& document.getElementById("s"+sel).innerHTML!="&nbsp;<BR>")
		{
			sel = document.getElementById("n"+sel).innerHTML;
		}
		ChangeEditLocation(sel);
	}
	//else alert(unicode);
	//ins - 45
	//pg up - 33
	//pg dwn - 34
	document.getElementById('transmsg').blur();
	document.getElementById('transmsg').focus();
}

function SetWordBuffer()
{
	var tempStr = document.getElementById('transmsg').value;
	var tempStr2 = "";
	var lim = tempStr.length;
	UpdateBoxSize();
	for(i=0;i<lim;i++)
	{
		if(!(tempStr.charAt(i)>='a' && tempStr.charAt(i)<='z') && !(tempStr.charAt(i)>='A' && tempStr.charAt(i)<='Z'))
		{
			tempStr2="";
			tempStr2 = tempStr.substring(0,i);
			if(tempStr2.length>0)
			{
				NUM++;
				WORDBUFFER.push(tempStr2);
				WORDBUFFERPOS.push(NUM);
				InsertWord(tempStr2);
			}
			tempStr2 = tempStr.charAt(i);
			NUM++;
			InsertSpace(tempStr2);

			tempStr = tempStr.substring(i+1,tempStr.length);
			lim = tempStr.length;
			i=-1;
		}
	}
	document.getElementById('transmsg').value = tempStr;
	HideList();
}


function ShowList(number) 
{
	var selected = document.getElementById('s'+number);
	var curobj = document.getElementById('s'+number);
	var list = document.getElementById("word_list");

	var tempStr=selected.title;
	var response = "";

	for(i=0;i<CACHEWORDS.length;i++)
	{
		if(CACHEWORDS[i]==tempStr)
		{
			response = CACHERESPONSE[i];
		}
	}

	var osc = "";
	var options_arr = response.split(",");
	for(i=1;i<options_arr.length;i++)
	{
		osc = osc + '<div class="i" onclick="SetSelected(\''+number+'\',\''+options_arr[i]+'\');">'+options_arr[i]+'</div>';
	}
	osc = osc + '<div class="j" onclick="SetSelected(\''+number+'\',\''+tempStr+'\');">'+tempStr+'</div>';
	//osc = osc + '<div class="j" onclick="ShowKeyboard(\''+number+'\',\''+tempStr+'\');">Edit . . .</div>';
	osc = osc + '<div class="j" onclick="ShowKeyboard(\''+number+'\',\''+tempStr+'\');">Add New . . .</div>';

	var curleft = curtop = 0;
	if (curobj.offsetParent) 
	{
		curleft = curobj.offsetLeft;
		curtop = curobj.offsetTop;
		while (curobj = curobj.offsetParent) 
		{
			curleft += curobj.offsetLeft;
			curtop += curobj.offsetTop;
		}
	}

	curtop = curtop + 20;

	list.style.left = curleft+"px";
	list.style.top = curtop+"px";

	list.innerHTML = osc;

	list.style.display="block";
}

function HideList()
{
	document.getElementById("word_list").style.display = "none";
	document.getElementById("keyboard").style.display = "none";
}


function SetSelected(number, value) 
{
	var selected = document.getElementById('s'+number);
	HideList();
	if(selected.innerHTML!=value)
	{
		selected.innerHTML=value;
		var tempStr1 = selected.title;
		var tempStr2 = selected.innerHTML;
		if(tempStr1!=tempStr2)
		{
			var HTTP2 = CreateRequestObject();
			HTTP2.open('get', 'add.php?w='+encodeURIComponent(tempStr1)+'&tw='+encodeURIComponent(tempStr2));
			HTTP2.onreadystatechange = function() { };
			HTTP2.send(null);
		}

		for(i=0;i<CACHEWORDS.length;i++)	/*CACHE UPDATE*/
		{
			if(CACHEWORDS[i]==tempStr1)
			{
				CACHESELECTED[i]=tempStr2;
				break;
			}
		}

	}
}

function ShowKeyboard(number,value) 
{
	document.getElementById('keyword').innerHTML=value;
	document.getElementById('keyid').innerHTML=number;
	document.getElementById('keybox').innerHTML='';
	KEYBOARD_WORD="";

	var selected = document.getElementById('s'+number);
	var curobj = document.getElementById('s'+number);
	var keyboard = document.getElementById('keyboard');

	HideList();
	keyboard.style.display="block";

	var curleft = curtop = 0;
	if (curobj.offsetParent)
	{
		curleft = curobj.offsetLeft
		curtop = curobj.offsetTop
		while (curobj = curobj.offsetParent)
		{
			curleft += curobj.offsetLeft
			curtop += curobj.offsetTop
		}
	}
	curtop = curtop + 20;

	keyboard.style.left = curleft+"px";
	keyboard.style.top = curtop+"px";
}

function Append(value)
{
	var keybox = document.getElementById('keybox');
	keybox.innerHTML=keybox.innerHTML+value;
	KEYBOARD_WORD=KEYBOARD_WORD+value;
}


function AddNewWord()
{
	var number = document.getElementById('keyid').innerHTML;
	var keybox = document.getElementById('keybox');
	var keyword = document.getElementById('keyword');
	var selected = document.getElementById('s'+number);
	if(keybox.innerHTML!="" && selected.innerHTML!=keybox.innerHTML)
	{
		selected.innerHTML=keybox.innerHTML;
		var keyboard = document.getElementById('keyboard');
		keyboard.style.display="none";

		var HTTP2 = CreateRequestObject();
		var tempStr1 = keyword.innerHTML;
		var tempStr2 = KEYBOARD_WORD;

		HTTP2.open('get', 'add.php?w='+encodeURIComponent(tempStr1)+'&tw='+encodeURIComponent(tempStr2));
		HTTP2.onreadystatechange = function() { };
		HTTP2.send(null);

		for(i=0;i<CACHEWORDS.length;i++)	/*CACHE UPDATE*/
		{
			if(CACHEWORDS[i]==tempStr1)
			{
				CACHESELECTED[i]=tempStr2;
				CACHERESPONSE[i]=CACHERESPONSE[i]+","+tempStr2;
				break;
			}
		}
	}
}


function ChangeEditLocation(number)
{
	NEXTNUM = number;
	PREVNUM = document.getElementById('p'+number).innerHTML;
	if (document.getElementById('e'+CUREDIT).className == "es")
	{
		document.getElementById('e'+CUREDIT).innerHTML="&nbsp;";
		document.getElementById('e'+CUREDIT).className = "e";
	}
	else
	{
		document.getElementById('e'+CUREDIT).innerHTML="";
	}
	CUREDIT = number;
	document.getElementById('e'+CUREDIT).innerHTML = '<textarea class="edit" type="text" id="transmsg" name="transmsg" rows="1" cols="1" size="1" maxlength="20" onkeydown="ManageEditKeys(event);" onkeyup="SetWordBuffer();"></textarea>';
	if (document.getElementById('e'+CUREDIT).className == "e")
		document.getElementById('e'+CUREDIT).className = "es";
	SetFocus();
}

function InsertWord(response)
{
	var oc = ""; /*main output*/
	var osc = ""; /*supplementary code*/

	/*edit box holder*/
	oc = oc + '<span id="i'+NUM+'" name="i'+NUM+'"></span>';
	oc = oc + '<span class="e" id="e'+NUM+'" name="e'+NUM+'" onclick="ChangeEditLocation(\''+NUM+'\');">&nbsp;</span>';
	/*edit box holder*/

	oc = oc + '<span class="s" id="s'+NUM+'" name="s'+NUM+'" onclick="ShowList(\''+NUM+'\');" title="'+response+'">'+response+'</span>';

	/*~BEGIN: form the linked list for editor*/
	PREVNUM = document.getElementById('p'+CUREDIT).innerHTML;
	NEXTNUM = CUREDIT;
	osc = osc + '<span class="vh" id="p'+NUM+'" name="p'+NUM+'">'+PREVNUM+'</span>';
	osc = osc + '<span class="vh" id="n'+NUM+'" name="n'+NUM+'">'+NEXTNUM+'</span>';
	document.getElementById('n'+PREVNUM).innerHTML=NUM;
	document.getElementById('p'+NEXTNUM).innerHTML=NUM;
	document.getElementById('i'+CUREDIT).innerHTML= document.getElementById('i'+CUREDIT).innerHTML + oc;
	document.getElementById("supp_obj_holder").innerHTML= document.getElementById("supp_obj_holder").innerHTML + osc;
}

function InsertSpace(response)
{
	var oc = ""; /*main output*/
	var osc = ""; /*supplementary code*/

	/*edit box holder*/
	oc = oc + '<span id="i'+NUM+'" name="i'+NUM+'"></span>';
	oc = oc + '<span class="ee" id="e'+NUM+'" name="e'+NUM+'"></span>';
	/*edit box holder*/

	var tempCode1 = '<span class="ss" id="s'+NUM+'" name="s'+NUM+'" onclick="ChangeEditLocation(\''+NUM+'\');">';
	var tempCode2 = '</span>';
	switch(response)
	{
		case " ":
		oc = oc + tempCode1 + _whitespace + tempCode2;
		break;

		case ".":
		oc = oc + tempCode1 + _fullstop + tempCode2;
		break;

		case "\r":
		NUM--;
		return;

		case "\n":
		oc = oc + tempCode1 + _newline + tempCode2;
		break;

		default:
		oc = oc + tempCode1 + response + tempCode2;
		break;
	}

	/*~BEGIN: form the linked list for editor*/
	PREVNUM = document.getElementById('p'+CUREDIT).innerHTML;
	NEXTNUM = CUREDIT;
	osc = osc + '<span class="vh" id="p'+NUM+'" name="p'+NUM+'">'+PREVNUM+'</span>';
	osc = osc + '<span class="vh" id="n'+NUM+'" name="n'+NUM+'">'+NEXTNUM+'</span>';
	document.getElementById('n'+PREVNUM).innerHTML=NUM;
	document.getElementById('p'+NEXTNUM).innerHTML=NUM;
	/*~END: form the linked list for editor*/

	//o.innerHTML = o.innerHTML + oc;
	document.getElementById('i'+CUREDIT).innerHTML= document.getElementById('i'+CUREDIT).innerHTML + oc;
	document.getElementById("supp_obj_holder").innerHTML= document.getElementById("supp_obj_holder").innerHTML + osc;
}


function UpdateWord(response, cache_index)
{
	var buf_CUREDIT = WORDBUFFERPOS.shift();
	if(cache_index==-1)
	{
		CACHEWORDS.push(CURWORD);
		CACHERESPONSE.push(response);
	}
	var options_arr = response.split(",");
	if(options_arr[0]=="7" && options_arr.length>=2)
	{
		if(cache_index==-1)
		{
			document.getElementById('s'+buf_CUREDIT).innerHTML = options_arr[1];
			CACHESELECTED.push(options_arr[1]);
		}
		else
		{
			document.getElementById('s'+buf_CUREDIT).innerHTML = CACHESELECTED[cache_index];
		}
        UpdateStatus(0);
	}
	else if(options_arr[0]=="7")
	{
        UpdateStatus(-1);
	}
	else
	{
        UpdateStatus(-2);
	}
	PREVNUM = NUM;
	LOCK = 0;
}


function GetText()
{
	var output="";
	for(var i = document.getElementById('n0').innerHTML;i>0;i=document.getElementById('n'+i).innerHTML)
	{
		if(i>0)
		output = output + document.getElementById('s'+i).innerHTML;
	}
	output = output.replace(/&nbsp;/gi," ");
	output = output.replace(/<br>/gi,"\n");
	return output;
}

function GetHTML()
{
	var output="";
	for(var i = document.getElementById('n0').innerHTML;i>0;i=document.getElementById('n'+i).innerHTML)
	{
		if(i>0)
		output = output + document.getElementById('s'+i).innerHTML;
	}
	return output;
}





/*
  ** writeKA Scripton Editor
  ** COPYRIGHT 2007 VINEETH KAIMAL. ALL RIGHTS RESERVED.
*/