﻿/*

##############################################################################

# UniSarasvati Devnagari Transliterator             Version 1.1 Beta                      

# Creator: Prasad Shirgaonkar		prasad.shir@gmail.com                 

# Created 20/08/2004                   Last Modified 02/12/2008 

Change log :  from v 1.0
Disabled conversion of Roman/Eng numbers to Devnagari numbers. (See function   replaceEngNums(txt) on line 284)

# This program comes on AS IS basis, without any warranty &/or support of any sort. 

# You are free to use and distribute this program freely! 

##############################################################################

*/

document.onkeydown = toggleKBMode;



document.onkeypress = eventCaptured;



//variable iexplore will be set if the browser is Internet Explorer

var iexplore = !window.opera && (window.event || document.all); 



function eventCaptured(evt)

{

//alert("eventCaptured");



    var target,event;



    if(iexplore) {  //if the browser is IE

        event = window.event;

        target = window.event.srcElement;

    }

    else { //for other browsers

        event = evt;

        target = evt.target;

    }

//alert(target)

  if(target.type!="password")

  {

	if(target.id!="edit-mail")
	{

    convertThis(event,target);

	}

    //event handler function of specific file corresponding

    //to specific keyboard layout


  }

}







var vyanjan = ['क','ख','ग','घ','ङ','च','छ','ज','झ','ञ','ट','ठ','ड','ढ','ण','त','थ','द','ध','न','प','फ','ब','भ','म','य','र','र','ल','ळ','व','स','श','ऽ','ष','ह','क्ष','ज्ञ','ॐ']

var halanta = ['क्','ख्','ग्','घ्','ङ्','च्','छ्','ज्','झ्','ञ्','ट्','ठ्','ड्','ढ्','ण्','त्','थ्','द्','ध्','न्','प्','फ्','ब्','भ्','म्','य्','र्','र्‍','ल्','ळ्','व्','स्','श्','ऽ','ष्','ह्','क्ष्', 'ज्ञ्','ॐ']

var input = ['k','क्h','g','ग्h','~N','ch','च्h','j','ज्h','Y','T','ट्h','D','ड्h','N','t','त्h','d','द्h','n','p','प्h','b','ब्h','m','y','r','R','l','L','v','s','स्h','S','ऽh','h','x','द्Y','ऑM']

var rhasva_swar = ['ि', 'ु', 'े', 'ृ' , 'ॅ' ,'ॅ' , 'ँ' , 'ं', 'ः','ा','ी','ू','ॉ']

var rhasva_swar_input = ['i', 'u', 'e','q', 'E','_', '^', 'M', 'H','A','I','U','O' ]

var all_swar = ['ँ', 'ं', 'ः', 'अ', 'आ', 'आ', 'इ', 'ई', 'ई', 'उ', 'ऊ', 'ऋ', 'ऌ', 'ए', 'ऐ', 'ऑ', 'ओ', 'औ','ऍ']

var all_swar_input = ['^','M', 'H','a','अअ','A','i','I','इइ','u','U','Q','Lu','e','अइ','O','o','अउ','E']

var punctuation_marks =['.','!','\,','\'','\"','\?','\;','\(','\)']

var chnbin = "\u094D";

var ugar = "\u0941";

var uugar = "\u0942";



function replTxt(txt)

{

	prvlen = txt.length;





//Pre Processing



	txt = txt.replace(/B/g, "b");

	txt = txt.replace(/C/g, "ch");

	txt = txt.replace(/F/gi, "ph");

	txt = txt.replace(/G/g, "g");

	txt = txt.replace(/J/g, "j");

	txt = txt.replace(/K/g, "k");

	txt = txt.replace(/P/g, "p");

//	txt = txt.replace(/Q/g, "k");

//	txt = txt.replace(/q/g, "k");

	txt = txt.replace(/V/g, "v");

	txt = txt.replace(/W/gi, "v");

	txt = txt.replace(/X/g, "x");

	txt = txt.replace(/Z/gi, "jh");





//Actual Processing

			//phonetic string typing converts to halanta 

			for (i=0;i<input.length;i++)

			{txt = txt.replace(input[i], unescape(halanta[i]));}



			//halanta followed by 'a' converts to vyanjana

			for (i=0;i<halanta.length;i++)

			{txt = txt.replace(halanta[i]+'a', unescape(vyanjan[i]));}



			//halanta followed by 'space' converts to vyanjana

			for (i=0;i<halanta.length;i++)

			{txt = txt.replace(halanta[i]+' ', unescape(vyanjan[i]+' '));}



			//halanta followed by punctuation mark converts to vyanjana with punctuation mark

			for (i=0;i<halanta.length;i++)

				for (k=0;k<punctuation_marks.length;k++)

				{txt = txt.replace(halanta[i]+punctuation_marks[k], unescape(vyanjan[i]+punctuation_marks[k]));}





			//kaanaa

			for (i=0;i<halanta.length;i++)

			{txt = txt.replace(vyanjan[i]+'a', unescape(vyanjan[i]+'ा'));}



			//halanta followed by rhasva swar converts to vyanjana with rhasva swar

			for (i=0;i<halanta.length;i++)

				for (j=0;j<rhasva_swar.length;j++)

				{txt = txt.replace(halanta[i]+rhasva_swar_input[j], unescape(vyanjan[i]+rhasva_swar[j]));}



			//ikaarant to eekaarant 

			//for (i=0;i<halanta.length;i++)

			//{txt = txt.replace(vyanjan[i]+'ि'+'i', unescape(vyanjan[i]+'ी'));}

			{txt = txt.replace('ि'+'i', unescape('ी'));}

			{txt = txt.replace('े'+'e', unescape('ी'));}



			//ukaaraant to ookaarant 

			//for (i=0;i<halanta.length;i++)

			//{txt = txt.replace(vyanjan[i]+'ु'+'u', unescape(vyanjan[i]+'ू'));}

			{txt = txt.replace('ु'+'u', unescape('ू'));}

			{txt = txt.replace('ो'+'o', unescape('ू'));}



			//halanta followed by 'ai' converts to 'ai' kar 

			for (i=0;i<halanta.length;i++)

			{txt = txt.replace(vyanjan[i]+'i', unescape(vyanjan[i]+'ै'));}



			//okaar

			for (i=0;i<halanta.length;i++)

			{txt = txt.replace(halanta[i]+'o', unescape(vyanjan[i]+'ो'));}



			//'au' kaar

			for (i=0;i<halanta.length;i++)

			{txt = txt.replace(vyanjan[i]+'u', unescape(vyanjan[i]+'ौ'));}

			

			//logic for inputting swars as characters

			for (i=0;i<all_swar.length;i++)

			{txt = txt.replace(all_swar_input[i], unescape(all_swar[i]));}



	txt = replaceEngNums(txt);

	sPos += (txt.length -prvlen +1);

	return txt;

}





function replaceEngNums(txt)
// Modified by Prasad on 02/12/08
// Disabled this function to return Roman numbers instead of converting to Devnagari numbers. This was done to handle numbers in a consisstent way so that any calculations can be performed properly. 
{
/*
	txt = txt.replace(/1/g, "\u0967");

	txt = txt.replace(/2/g, "\u0968");

	txt = txt.replace(/3/g, "\u0969");

	txt = txt.replace(/4/g, "\u096A");

	txt = txt.replace(/5/g, "\u096B");

	txt = txt.replace(/6/g, "\u096C");

	txt = txt.replace(/7/g, "\u096D");

	txt = txt.replace(/8/g, "\u096E");

	txt = txt.replace(/9/g, "\u096F");

	txt = txt.replace(/0/g, "\u0966");

*/

	return txt;

}



//CORE PROCESSING CODE 



var isIE = document.all?true:false;

var myimg = new Image();

var sPos = 0;

var isTh = false;

var isNg = false;

var kbmode = "roman";

var pkbmode = "roman";

var SplKeys = new Array();

//var myFieldID = "edit-comment1"



SplKeys["ZR"] = 0;

SplKeys["BS"] = 8;

SplKeys["CR"] = 13;



function convertThis(e, tar)

{

    if (!isIE)

        Key = e.which;

    else

		Key = e.keyCode;

	Char = String.fromCharCode(Key);

//	myField = document.getElementById(id);

myField = tar;

//myField = this();

//alert(myField)

	if( isIE )

	{

		myField.caretPos = document.selection.createRange().duplicate();

		prevChar = myField.caretPos.text;

		if(prevChar.length != 0)

			document.selection.clear();

		if(myField.value.length != 0)

			myField.caretPos.moveStart('character',-1);

		prevChar = myField.caretPos.text;

		if(prevChar == chnbin)

		{

			myField.caretPos.moveStart('character',-1);

			prevChar = myField.caretPos.text;

		}

		if(prevChar == "" && myField.value.length != 0)

			prevChar = "\u000A";

		if(Key == 13)

			Char = "\u000A";

		myField.caretPos.text = getLang(prevChar,Char, 0)

		e.cancelBubble = true;

		e.returnValue = false;



	}

	else if( myField.selectionStart >= 0)

	{

		if(isSplKey(Key) ||  e.ctrlKey )

			return true;

		var startPos = myField.selectionStart;

		var endPos = myField.selectionEnd;

		txtTop = myField.scrollTop;

		if(myField.value.length == 0)

		{

			prevChar = "";

			myField.value = getLang(prevChar,Char, startPos)

		}

		else

		{

			prevChar = myField.value.substring(startPos-1,startPos);

			prevStr =  myField.value.substring(0,startPos -1);

			if(prevChar == chnbin)

			{

				prevChar = myField.value.substring(startPos-2,startPos);

				prevStr =  myField.value.substring(0,startPos - 2);

			}

			myField.value = prevStr + getLang(prevChar,Char, myField.selectionStart)

					  + myField.value.substring(endPos, myField.value.length);

		}

		myField.selectionStart = sPos ;

		myField.selectionEnd = sPos;

		if((myField.scrollHeight+4)+"px" != myField.style.height)

			myField.scrollTop = txtTop;

		e.stopPropagation();

		e.preventDefault();

	}

}



function toggleT(obj)

{

	isTh = obj.checked;

}



function toggleG(obj)

{

	isNg = obj.checked;

}



function toggleKBMode(e,obj)

{

	if(obj != null)

	{

		pkbmode = kbmode;

		kbmode = obj.value;

		if(kbmode == "typewriter")

			myimg.src = "images/tw.png";

		else

			myimg.src = "images/"+"lang"+".png";

	}

	else

	{

		if (!isIE)

	        key = e.which;

	    else

			key = window.event.keyCode;

		if (key == 123)

		{

			if(kbmode != "english")

			{

				pkbmode = kbmode;

				kbmode = "english";

				document.keybdsel.keybrd[1].checked = true;

			}

			else

			{

				kbmode = pkbmode;

				pkbmode = "english";

				document.keybdsel.keybrd[0].checked = true;

			}

		}



	}

}



function isSplKey(keynum)

{

	retVal = false;

	for(i in SplKeys)

	{

		if(keynum == SplKeys[i])

			retVal = true;

	}

	return retVal;

}



function getLang(prv, txt, sP, mod)

{

	sPos = sP;

	if(kbmode == "english")

	{

		retTxt = prv+txt;

		sPos ++;

	}

	else if(kbmode == "typewriter")

	{

		if(prv == ugar && mapLangTw(txt,sP) == uugar)

			retTxt = mapLangTw(prv+txt,sP,mod);

		else

		{

			retTxt = prv+mapLangTw(txt,sP,mod);

		}

	}

	else

	{

		if(pkbmode == "english")

		{

			retTxt = prv+replTxt(txt);

			pkbmode = "roman";

		}

		else

			retTxt = replTxt(prv+txt);

	}

	return retTxt;

}






