  /******************************************************************

   Projectname: translit.ru
   Projectdescription: an multifunctional international transliteration tool and a virtual keyboard
   Project URLs: http://www.translit.ru, http://www.translit.net
   Author: Igor Ilin (Игорь Ильин) <info@translit.ru>
   Extra optimizations: Paul Puzyrev <ghappa@gmail.com>
   Author's website: http://www.translit.ru/
   Copyright (c): 2002-2010 Igor Ilin (Игорь Ильин), all rights reserved

   * This program is distributed in the hope that it will
   * be useful, but WITHOUT ANY WARRANTY; without even the
   * implied warranty of MERCHANTABILITY or FITNESS FOR A
   * PARTICULAR PURPOSE.

  ******************************************************************/

var tra = new Array();
var abc2 = new Array();
var abc1 = new Array();

tra['a'] = new Array ('ы+','Й+','Ы+','й+','Ы','й','ы','Й','','');
abc2['a'] = new Array ('ыа','Йа','Ыа','йа','Я','я','я','Я','а','a');

tra['b'] = new Array ('','');
abc2['b'] = new Array ('б','b');

tra['v'] = new Array ('','');
abc2['v'] = new Array ('в','v');

tra['g'] = new Array ('','');
abc2['g'] = new Array ('г','g');

tra['d'] = new Array ('','');
abc2['d'] = new Array ('д','d');

tra['e'] = new Array ('Й+','й+','Й','й','','');
abc2['e'] = new Array ('Йе','йе','Э','э','е','e');

tra['o'] = new Array ('ы+','Й+','Ы+','й+','Ы','ы','Й','й','','');
abc2['o'] = new Array ('ыо','Йо','Ыо','йо','Ё','ё','Ё','ё','о','o');

tra['ö'] = new Array ('','');
abc2['ö'] = new Array ('ё','ö');

tra['h'] = new Array ('сх+','Сх+','з+','Сх','с+','ш+','Ц+','Ш+','С+','сх','ц+','З+','Ш','с','ц','ш','З','С','Ц','з','','');
abc2['h'] = new Array ('схх','Схх','зх','Щ','сх','шх','Цх','Шх','Сх','щ','цх','Зх','Щ','ш','ч','щ','Ж','Ш','Ч','ж','х','h');

tra['z'] = new Array ('','');
abc2['z'] = new Array ('з','z');

tra['i'] = new Array ('','');
abc2['i'] = new Array ('и','i');

tra['j'] = new Array ('','');
abc2['j'] = new Array ('й','j');

tra['k'] = new Array ('','');
abc2['k'] = new Array ('к','k');

tra['l'] = new Array ('','');
abc2['l'] = new Array ('л','l');

tra['m'] = new Array ('','');
abc2['m'] = new Array ('м','m');

tra['n'] = new Array ('','');
abc2['n'] = new Array ('н','n');

tra['p'] = new Array ('','');
abc2['p'] = new Array ('п','p');

tra['r'] = new Array ('','');
abc2['r'] = new Array ('р','r');

tra['s'] = new Array ('','');
abc2['s'] = new Array ('с','s');

tra['t'] = new Array ('','');
abc2['t'] = new Array ('т','t');

tra['u'] = new Array ('ы+','Й+','Ы+','й+','Ы','й','ы','Й','','');
abc2['u'] = new Array ('ыу','Йу','Ыу','йу','Ю','ю','ю','Ю','у','u');

tra['f'] = new Array ('','');
abc2['f'] = new Array ('ф','f');

tra['x'] = new Array ('','');
abc2['x'] = new Array ('х','x');

tra['c'] = new Array ('','');
abc2['c'] = new Array ('ц','c');

tra['w'] = new Array ('','');
abc2['w'] = new Array ('щ','w');

tra['#'] = new Array ('ъ+','ъ','','');
abc2['#'] = new Array ('ъъ','Ъ','ъ','#');

tra['y'] = new Array ('','');
abc2['y'] = new Array ('ы','y');

tra['\''] = new Array ('ь+','ь','','');
abc2['\''] = new Array ('ьь','Ь','ь','\'');

tra['ä'] = new Array ('','');
abc2['ä'] = new Array ('э','ä');

tra['ü'] = new Array ('','');
abc2['ü'] = new Array ('ю','ü');

tra['q'] = new Array ('','');
abc2['q'] = new Array ('я','q');

tra['A'] = new Array ('Ы+','Й+','Ы','Й','','');
abc2['A'] = new Array ('ЫА','ЙА','Я','Я','А','A');

tra['B'] = new Array ('','');
abc2['B'] = new Array ('Б','B');

tra['V'] = new Array ('','');
abc2['V'] = new Array ('В','V');

tra['G'] = new Array ('','');
abc2['G'] = new Array ('Г','G');

tra['D'] = new Array ('','');
abc2['D'] = new Array ('Д','D');

tra['E'] = new Array ('Й+','Й','','');
abc2['E'] = new Array ('ЙЕ','Э','Е','E');

tra['O'] = new Array ('Ы+','Й+','Ы','Й','','');
abc2['O'] = new Array ('ЫО','ЙО','Ё','Ё','О','O');

tra['Ö'] = new Array ('','');
abc2['Ö'] = new Array ('Ё','Ö');

tra['H'] = new Array ('СХ+','Ц+','СХ','С+','З+','Ш+','Ш','Ц','С','З','','');
abc2['H'] = new Array ('СХХ','ЦХ','Щ','СХ','ЗХ','ШХ','Щ','Ч','Ш','Ж','Х','H');

tra['Z'] = new Array ('','');
abc2['Z'] = new Array ('З','Z');

tra['I'] = new Array ('','');
abc2['I'] = new Array ('И','I');

tra['J'] = new Array ('','');
abc2['J'] = new Array ('Й','J');

tra['K'] = new Array ('','');
abc2['K'] = new Array ('К','K');

tra['L'] = new Array ('','');
abc2['L'] = new Array ('Л','L');

tra['M'] = new Array ('','');
abc2['M'] = new Array ('М','M');

tra['N'] = new Array ('','');
abc2['N'] = new Array ('Н','N');

tra['P'] = new Array ('','');
abc2['P'] = new Array ('П','P');

tra['R'] = new Array ('','');
abc2['R'] = new Array ('Р','R');

tra['S'] = new Array ('','');
abc2['S'] = new Array ('С','S');

tra['T'] = new Array ('','');
abc2['T'] = new Array ('Т','T');

tra['U'] = new Array ('Ы+','Й+','Ы','Й','','');
abc2['U'] = new Array ('ЫУ','ЙУ','Ю','Ю','У','U');

tra['F'] = new Array ('','');
abc2['F'] = new Array ('Ф','F');

tra['X'] = new Array ('','');
abc2['X'] = new Array ('Х','X');

tra['C'] = new Array ('','');
abc2['C'] = new Array ('Ц','C');

tra['W'] = new Array ('','');
abc2['W'] = new Array ('Щ','W');

tra['Y'] = new Array ('','');
abc2['Y'] = new Array ('Ы','Y');

tra['Ä'] = new Array ('','');
abc2['Ä'] = new Array ('Э','Ä');

tra['Ü'] = new Array ('','');
abc2['Ü'] = new Array ('Ю','Ü');

tra['Q'] = new Array ('','');
abc2['Q'] = new Array ('Я','Q');

var translit = 0;
var pretranslit = 0;
var processhtmltags = 1;
var processbbcodetags = 1;
var securetext = 0;

function setfoc() 
{
	document.postMsg.postText.focus();
	return true;
}

function getselectedtext()
{
	document.secondaryform.subject.value = gettextareaval(document.postMsg.postText);
	document.secondaryform.extendedsubject.value = document.searchform.subject.value;
	return false;
}

function nofstrings(thetext, txtareawidthpix, symbolwidth)
{
	var maxstrlengthallowed = Math.floor(txtareawidthpix/(symbolwidth+1))+1;
	var tt, pp, ppp, tuntil, ii;
	var t2 = thetext.split("\n");
	var s = t2.length;
	for (ii=0; ii<t2.length; ii++)
	{
		tt=t2[ii]+" ";
		pp = 0;
		tuntil = maxstrlengthallowed;
		while(tt.indexOf(" ",pp)!=-1)
		{
			ppp = pp;
			pp = tt.indexOf(" ",pp)+1;
			if (pp>tuntil&&pp-ppp-1)
			{
				tuntil = ppp+maxstrlengthallowed;
				if (pp<tuntil) 
				{
					pp = ppp;
				}
				s++;
			}	
		}		
	}
	return s;
}

function laststringlength(thetext)
{
	var t = thetext.replace(/\n/g," ");
	return thetext.replace(/\n/g," ").length-thetext.replace(/\n/g," ").lastIndexOf(" ")-1;
}

var textareafontsize = 16;
var textreafontwidth = 9;

var pXpix = 0;
var pYpix = 0;
       	
function get_texatrea_scroll_position()
{
	pXpix = window.document.postMsg.postText.scrollTop;
	pYpix = window.document.postMsg.postText.scrollLeft;
	return false;
}

function set_texatrea_scroll_position() 
{
	var txtarea = document.postMsg.postText;
	var therest = txtarea.value.substr(txtarea.selectionEnd);
	var fbeg = txtarea.value.substring(0, txtarea.selectionStart);
	var vv = therest.search(/[\n\s]/);
	var r = laststringlength(fbeg)*(textreafontwidth+1)-pYpix-txtarea.clientWidth/2;
	var dd = Math.abs(2*r)<txtarea.clientWidth?0:r-txtarea.clientWidth/2*(r>0?1:-1);
	txtarea.scrollLeft = pYpix+dd+(dd==0?0:(dd>0)?2:-textreafontwidth-1);
	r = (nofstrings(fbeg+(vv==-1?therest:therest.substring(0, vv)),txtarea.clientWidth, textreafontwidth)-0.5)*(textareafontsize+3)-pXpix-txtarea.clientHeight/2;
	txtarea.scrollTop = pXpix+(Math.abs(2*r)<(txtarea.clientHeight-textareafontsize-3)?0:r-(txtarea.clientHeight-textareafontsize-3)/2*(r>0?1:-1));
	return false;
}

function translatesymboltocharset2(txt)
{
	var pretxt = txt.substr(0,txt.length-1);
	var last = txt.substr(txt.length-1,1);
	var lat = tra[last];
	var rus = abc2[last];
	if (lat)
	{
		for (var ii=0; ii<lat.length; ii++)
		{
			var pos = pretxt.length>lat[ii].length?(pretxt.length-lat[ii].length):0;
			if (lat[ii]==pretxt.substr(pos,pretxt.length-pos)) 
			{
				return pretxt.substr(0,pretxt.length-lat[ii].length)+rus[ii];
			}
		}
	}
	return txt;
}

//by Paul Puzyrev (c) 2010
function array_replace(arrayName, replaceTo, replaceWith)
{
  for(var i=0; i<arrayName.length; i++ )
  {  
    if(arrayName[i]==replaceTo)
      arrayName.splice(i,1,replaceWith);          
  }        
}

function customPreTranslit(txt){
//by Paul Puzyrev (c) 2010
var searchStr = new Array('lj', 'jo', 'sj', 'nj', 'tj');
var replaceStr = new Array('l\'', 'yo', 's#', 'n\'', 't\'');
var newtxt=txt;

for(i=0;i<searchStr.length;i++){
repljs=new RegExp(searchStr[i], 'ig')
newtxt=newtxt.replace(repljs, replaceStr[i]);
}

return newtxt;
}
//--by Paul Puzyrev (c) 2010

function translatealltocharset2()
{
	var inloop=1;
	get_texatrea_scroll_position()
	var tt = window.document.postMsg.postText;
	var p1 = tt.selectionStart;
	var p2 = tt.selectionEnd;
	var preval = ""; 
	var postval="";
	if (p1==p2) {txt = tt.value;}
	else
	{
		preval = tt.value.substring(0, p1);
		txt = tt.value.substring(p1,p2);
		postval = tt.value.substring(p2);
	}

	//Paul's optimizing
	txt=customPreTranslit(txt);

	var txtnew = "";
	if ((!processhtmltags)&&(!processbbcodetags))
	{
		txtnew = translatestringtocharset2(txt);	
	}
	else
	{
		var htt1,pbb1,t1,t2,txt1,txt2,tag_open,tag_close;
		var noinputtag=0;
		if (processhtmltags) {tag_open="<";tag_close=">";}
		if (processbbcodetags) {tag_open="[";tag_close="]";}
		while(inloop)
		{
			if (processhtmltags&&processbbcodetags)
			{
				htt1 = txt.indexOf("<");
				pbb1 = txt.indexOf("[");
				if (pbb1==htt1) {noinputtag=1}
				if (pbb1==-1) {pbb1=txt.length;}
				if (htt1==-1) {htt1=txt.length;}		
				if (htt1<pbb1) {t1=htt1; tag_close=">";} else {t1=pbb1; tag_close="]";}
			}
			else
			{
				t1 = txt.indexOf(tag_open);
				if (t1==-1) noinputtag=1;
			}
			if (noinputtag) {inloop=0;t1=txt.length;t2=txt.length;}
			else
			{
				txt2=txt.substring(t1,txt.length);
				t2=txt2.indexOf(tag_close);
				//if (t2==-1) {t2=txt.length; inloop=0;} else {t2=t2+t1+1};
				if (t2==-1) {t2=t1+1} else {t2=t2+t1+1};
			}
			txt1 = txt.substring(0,t1);
			txt2 = txt.substring(t1,t2);
			txt = txt.substring(t2,txt.length);
			txtnew = txtnew+translatestringtocharset2(txt1)+txt2;			
		}
	}
	tt.value = preval+txtnew+postval;
	if (p1!=p2) {tt.setSelectionRange(p1+txtnew.length,p1+txtnew.length);}
	set_texatrea_scroll_position();
	
	if(window.document.postMsg.topicTitle) translatesubjtocharset2();
	
	return false;
}

function translatesubjtocharset2()
{
	var inloop=1;
	var tt = window.document.postMsg.topicTitle;
	var preval = ""; 
	var postval="";
	txt = tt.value;

	//Paul's optimizing
	txt=customPreTranslit(txt);
  txtnew = translatestringtocharset2(txt);

	tt.value = txtnew;
	return false;
}

function translatestringtocharset2(thestringlat)
{
	var symbb,fromm,howmuch,thestringcyr="";
	for (kk=0;kk<thestringlat.length;kk++)
	{
		thestringcyr = translatesymboltocharset2(thestringcyr+thestringlat.substr(kk,1))		
	}
	return thestringcyr;
}
