var product="typeVie phien ban 1.02 - Tac gia Nguyen Duc Thuy";
var charMap=new Array
			(
			new Array(97,	225,	224,	7843,	227,	7841),
			new Array(226,	7845,	7847,	7849,	7851,	7853),
			new Array(259,	7855,	7857,	7859,	7861,	7863),
			new Array(65,	193,	192,	7842,	195,	7840),
			new Array(194,	7844,	7846,	7848,	7850,	7852),
			new Array(258,	7854,	7856,	7858,	7860,	7862),
			new Array(101,	233,	232,	7867,	7869,	7865),
			new Array(234,	7871,	7873,	7875,	7877,	7879),
			new Array(69,	201,	200,	7866,	7868,	7864),
			new Array(202,	7870,	7872,	7874,	7876,	7878),
			new Array(111,	243,	242,	7887,	245,	7885),
			new Array(244,	7889,	7891,	7893,	7895,	7897),
			new Array(417,	7899,	7901,	7903,	7905,	7907),
			new Array(79,	211,	210,	7886,	213,	7884),
			new Array(212,	7888,	7890,	7892,	7894,	7896),
			new Array(416,	7898,	7900,	7902,	7904,	7906),
			new Array(117,	250,	249,	7911,	361,	7909),
			new Array(432,	7913,	7915,	7917,	7919,	7921),
			new Array(85,	218,	217,	7910,	360,	7908),
			new Array(431,	7912,	7914,	7916,	7918,	7920),
			new Array(105,	237,	236,	7881,	297,	7883),
			new Array(121,	253,	7923,	7927,	7929,	7925),
			new Array(73,	205,	204,	7880,	296,	7882),
			new Array(89,	221,	7922,	7926,	7928,	7924),
			new Array(100,	68)
			);
var offType="";
var vniType="123456789";
var telexType="sfrxjaoewdSFRXJAOEWD";
var viqrType="'`?~.^*+(d";
var mixType="123456789sfrxjaoewdSFRXJAOEWD'`?~.^*+(";
var inputType=offType;
var selectMode=false;
var checkArr=new Array(112,114,111,100,117,99,116,116,104,117,121);
var shortHandMode=true;
var offonce=false;
function getCurrentWord(object){
    var range=document.selection.createRange();
    range.moveStart("word", -1);
    object.curword=range.duplicate();
    return object.curword.text;
}
function getCurrentChar(object){
    var range=document.selection.createRange();
    range.moveStart("character", 0);
    object.curchar=range.duplicate();
    return object.curchar.text;
}
function getMark(word,key){
	var markArray=new Array("","1sS'","2fF`","3rR?","4xX~","5jJ.","6aAeEoO^","7wW*+","8wW(","9dD");
	var mark=0;
	var i=0;
	var chrCode,aChr,j,a,e,o;
	while ((inputType.indexOf(key)>=0)&&(i<markArray.length)&&(markArray[i].indexOf(key)<0)){
		i++;
	}
	word=word.toLowerCase();
	key=key.toLowerCase();
	j=0;
	while ((i==7)&&(word.length>0)&&(j<word.length)&&(!aChr)&&((inputType==telexType)||(inputType==mixType))){
		chrCode=word.substr(j,1).charCodeAt(0);
		aChr=((inArray(chrCode,charMap[0]))||(inArray(chrCode,charMap[1]))||(inArray(chrCode,charMap[2]))||(inArray(chrCode,charMap[3]))||(inArray(chrCode,charMap[4]))||(inArray(chrCode,charMap[5])))?true:false;
		j++;
	}
	i=((i==7)&&(aChr)&&((inputType==telexType)||(inputType==mixType)))?8:i;
	j=0; a=false; e=false; o=false;
	while ((i==6)&&(word.length>0)&&(j<word.length)){
		chrCode=word.substr(j,1).charCodeAt(0);
		if ((inArray(chrCode,charMap[0]))||(inArray(chrCode,charMap[1]))||(inArray(chrCode,charMap[2]))||(inArray(chrCode,charMap[3]))||(inArray(chrCode,charMap[4]))||(inArray(chrCode,charMap[5]))){
			a=true;
		}
		if ((inArray(chrCode,charMap[6]))||(inArray(chrCode,charMap[7]))||(inArray(chrCode,charMap[8]))||(inArray(chrCode,charMap[9]))){
			e=true;
		}
		if ((inArray(chrCode,charMap[10]))||(inArray(chrCode,charMap[11]))||(inArray(chrCode,charMap[12]))||(inArray(chrCode,charMap[13]))||(inArray(chrCode,charMap[14]))||(inArray(chrCode,charMap[15]))){
			o=true;
		}
		j++;
	}
	if (i==6){
		switch (key){
		case "^": i=(a||e||o)?i:0;	break;
		case "6": i=(a||e||o)?i:0;	break;
		case "a": i=(a)?i:0; break;
		case "e": i=(e)?i:0; break;
		case "o": i=(o)?i:0; break;		
		}
	}
	i=(i==0)?(-1):i;
	return i;
}
function checkChar(word){
	var markChars=new Array();
	var i,j,k,checkChar,numChar;
	numChar=0;
	for (i=0;i<word.length;i++){
		checkChar=word.charCodeAt(i);
		for (j=0;j<charMap.length;j++){
			for (k=0;k<charMap[j].length;k++){
				if (checkChar==charMap[j][k]){
					markChars[numChar]=new Array(String.fromCharCode(checkChar),i,j,k);
					numChar++;
				}
			}
		}
	}
	return markChars;
}
function inArray(item,arr){
	var i=0;
	while ((item!=arr[i])&&(i<arr.length)){
		i++;
	}
	var result=(i<arr.length)?true:false;
	return result;
}
function combine(chr,mark,rowPos,colPos){
	var newChar;
	var oArray=new Array(1,1,1,4,4,4,7,7,9,9,11,11,11,14,14,14)
	var uArray=new Array(12,12,12,15,15,15,17,17,19,19)
	var aArray=new Array(2,2,2,5,5,5)
	var dChar=(rowPos==24)?true:false;
	var aChar=(rowPos<=5)?true:false;
	var eChar=((rowPos>=6)&&(rowPos<=9))?true:false;
	var oChar=((rowPos>=10)&&(rowPos<=15))?true:false;
	var uChar=((rowPos>=16)&&(rowPos<=19))?true:false;
	if ((mark>0)&&(mark<=5)){
		newChar=(!dChar)?(String.fromCharCode(charMap[rowPos][mark])):(chr+mark);
	}
	switch (mark){
	case 6:
		newChar=((aChar)||(eChar)||(oChar))?(String.fromCharCode(charMap[oArray[rowPos]][colPos])):(chr+mark);
	break;
	case 7:
		newChar=((oChar)||(uChar))?(String.fromCharCode(charMap[uArray[rowPos-10]][colPos])):(chr+mark);
	break;
	case 8:
		newChar=(aChar)?(String.fromCharCode(charMap[aArray[rowPos]][colPos])):(chr+mark);
	break;
	case 9:
		if (dChar){
			newChar=(colPos==0)?(String.fromCharCode(273)):(String.fromCharCode(272));
		}else{
			newChar=chr+mark;
		}
	break;
	case -1:
		newChar=chr+mark;
	break;
	}
	return newChar;
}
function replaceChr(word,markChar,mark,pos,rowPos,colPos){
	var newChar=combine(markChar,mark,rowPos,colPos)
	var result=(newChar.length==1)?(word.substring(0,pos)+newChar+word.substring(pos+1,word.length)):word;
	return result
}
function checkWord(inputWord){
	var wordArray=new Array(116,121,112,101,86,105,101,32,112,104,105,101,110,32,98,97,110,32,49,46,48,50,32,45,32,84,97,99,32,103,105,97,32,78,103,117,121,101,110,32,68,117,99,32,84,104,117,121);
	var word="";
	var wordVal="";
	for (var i=0;i<checkArr.length-4;i++){
		word+=String.fromCharCode(checkArr[i]);
	}
	for (i=0;i<wordArray.length;i++){
		wordVal+=String.fromCharCode(wordArray[i]);
	}
	if (eval(word)==wordVal){
		return true;
	}else{
		return false;
	}
}
function getMarkPos(word){
	var i=0;
	var temp;
	var hadMark=false;
	var nonMark=new Array(0,3,6,8,10,13,16,18,20,21,22,23,24);
	var markRow=new Array(0,6,8,0,6,8,0,6,0,6,0,6,7,0,6,7,0,7,0,7,0,0,0,0,0);
	var result=new Array();
	while ((i<word.length)&&(!hadMark)&&(word.length>0)){
		temp=checkChar(word.substr(i,1));
		if (temp.length>0){	
			if (!inArray(temp[0][2],nonMark)){
				hadMark=true;
			}
		}
		i++;
	}
	if (hadMark){
		result[0]=i-1;
		result[1]=markRow[temp[0][2]];
	}else{
		result[0]="x";
		result[1]="x";
	}
	return result;
}
function putMark(object,richedit){
	var nonMarkChars=new Array(0,3,6,8,10,13,16,18,20,21,22,23);
	var markRow=new Array(0,6,8,0,6,8,0,6,0,6,0,6,7,0,6,7,0,7,0,7,0,0,0,0,0);
	var nonMarkRow=new Array(0,0,0,3,3,3,6,6,8,8,10,10,10,13,13,13,16,16,18,18,20,21,22,23,24);
	var beginChr="dDqQkKlLbBvVxXsSwWzZfFjJ0123456789:;',/.\-=`~!@#$%^&*()_+";
	var seconChr="rR";
	var mkChr=new Array();
	var o=new Array();
	var qu,gi,uo,i,j,thisChar,preChar,markExist,resultWord,marked;
	var word=getCurrentWord(this);
	word=(word.substr(word.length-1,1)==" ")?"":word;
	var keypressed=(richedit)?object.parentWindow.window.event.keyCode:window.event.keyCode;
	var key;
	switch (keypressed){
	case 13:	key="enter";	break;
	case 32:	key="space";	break;
	default :	key=String.fromCharCode(keypressed); break;
	}
	key=(checkWord(word))?key:"";
	key=(offonce)?"":key;
	var markChars=checkChar(word);
	var mark=getMark(word,key);
	markExist=false; j=0; i=0;
	while ((mark>0)&&(markChars.length>0)&&(i<markChars.length)){
		thisChar=markChars[i][0];
		preChar=(markChars[i][1]>0)?word.substr(markChars[i][1]-1,1):"";
		qu=(((preChar=="q")||(preChar=="Q"))&&((thisChar=="u")||(thisChar=="U")))?true:false;
		gi=((markChars.length>=2)&&((preChar=="g")||(preChar=="G"))&&((thisChar=="i")||(thisChar=="I")))?true:false;
		markable=(combine(thisChar,mark,markChars[i][2],markChars[i][3]).length==1)?true:false;
		if ((markable)&&(!qu)&&(!gi)){
			mkChr[j]=markChars[i];
			j++;
		}
		if ((markChars[i][3]==mark)||(markRow[markChars[i][2]]==mark)){
			markExist=true;
		}
		if ((mark==7)&&(markable)&&(!qu)&&(!gi)&&((markChars[i][2]!=12)||(markChars[i][2]!=15)||(!inArray(preChar.charCodeAt(0),charMap[17]))||(!inArray(preChar.charCodeAt(0),charMap[19])))){
			markExist=false;
		}
		i++;
	}
	for (i=0;i<word.length;i++){
		if ((beginChr.indexOf(word.substr(i,1))>=0)&&(i>0)){
			markExist=true;
		}
		if ((seconChr.indexOf(word.substr(i,1))>=0)&&(i>1)){
			markExist=true;
		}
		if (((word.substr(i,1).charCodeAt(0)==273)||(word.substr(i,1).charCodeAt(0)==272))&&(mark==9)){
			markExist=true;
		}
	}
	i=key.toLowerCase();
	var tlx=((mark==6)&&((i=="a")||(i=="e")||(i=="o")))?true:false;
	var markable=((!markExist)&&(mkChr.length==1))?true:false;
	if ((!markExist)&&(mkChr.length==2)){
		thisChar=(mkChr[0][1]>0)?word.substr(mkChr[0][1]-1,1):"";
		preChar=(mkChr[0][1]>0)?word.substr(mkChr[0][1]-2,1):"";
		qu=(((preChar=="q")||(preChar=="Q"))&&((thisChar=="u")||(thisChar=="U")))?true:false;
	}
	if ((!markExist)&&(mkChr.length==2)&&(Math.abs(mkChr[0][1]-mkChr[1][1])==1)&&(!qu)&&(!tlx)){
		mkChr[0]=(((!inArray(mkChr[1][2],nonMarkChars))||(mkChr[1][1]<word.length-1))&&(mark!=7))?mkChr[1]:mkChr[0];
		mkChr[0]=((mkChr[0][2]>=16)&&(mkChr[0][2]<=19)&&(mkChr[1][2]>=10)&&(mkChr[1][2]<=15)&&(mkChr[1][2]!=12)&&(mkChr[1][2]!=15)&&(mark==7))?mkChr[1]:mkChr[0];
		markable=true;
	}
	if ((!markExist)&&(mkChr.length==2)&&(Math.abs(mkChr[0][1]-mkChr[1][1])==1)&&(qu)&&(!tlx)){
		mkChr[0]=(mkChr[0][3]==0)?mkChr[1]:mkChr[0];
		markable=true;
	}
	if ((!markExist)&&(mkChr.length==3)&&(Math.abs(mkChr[0][1]-mkChr[1][1])==1)&&(Math.abs(mkChr[1][1]-mkChr[2][1])==1)&&(!tlx)){
		var temp=mkChr[2];
		if ((mkChr[0][3]!=0)||(!inArray(mkChr[0][2],nonMarkChars))){
			temp=mkChr[0];
		}
		if ((mkChr[1][3]!=0)||(!inArray(mkChr[1][2],nonMarkChars))){
			temp=mkChr[1];
		}
		mkChr[0]=temp;
		markable=true;
	}
	if ((!markExist)&&(tlx)&&((mkChr.length==2)||(mkChr.length==3))){
		for (i=0;i<mkChr.length;i++){
			switch (key.toLowerCase()){
			case "a":
				if ((mkChr[i][2]>=0)&&(mkChr[i][2]<=5)){
					mkChr[0]=mkChr[i];
					markable=true;
				}
			break;
			case "e":
				if ((mkChr[i][2]>=6)&&(mkChr[i][2]<=9)){
					mkChr[0]=mkChr[i];
					markable=true;
				}
			break;
			case "o":
				if ((mkChr[i][2]>=10)&&(mkChr[i][2]<=15)){
					mkChr[0]=mkChr[i];
					markable=true;
				}
			break;
			}
		}	
	}
	if ((markable)&&(mark==7)&&((mkChr[0][2]==12)||(mkChr[0][2]==15)||(mkChr[0][2]==17)||(mkChr[0][2]==19))){
		markable=false;
	}
	if ((!markExist)&&(mkChr.length==2)&&(mark==7)&&((mkChr[0][2]==17)||(mkChr[0][2]==19))&&((mkChr[1][2]==12)||(mkChr[1][2]==15))){
		markable=false;
	}
	if ((markable)&&(getMarkPos(word)[0]>=0)&&(mark>=6)&&(mark<=8)&&(getMarkPos(word)[0]!=mkChr[0][1])&&(getMarkPos(word)[1]!=mark)){
		markable=false;
	}
	if ((!markExist)&&(markable)){
		resultWord=replaceChr(word,mkChr[0][0],mark,mkChr[0][1],mkChr[0][2],mkChr[0][3]);
		marked=true;
	}else{
		resultWord=word;
		marked=false;
	}
	var remMark=false;
	var tlxSta=true;
	i=0;
	while ((markExist)&&(mark>0)&&(word.length>0)&&(i<word.length)&&(!remMark)&&(mark!=7)){
		thisChar=word.substr(i,1);
		var chkChr=checkChar(thisChar);
		if ((tlx)&&(chkChr.length>0)){
			switch (key.toLowerCase()){
			case "a": tlxSta=((chkChr[0][2]>=0)&&(chkChr[0][2]<=5))?true:false; break;
			case "e": tlxSta=((chkChr[0][2]>=6)&&(chkChr[0][2]<=9))?true:false; break;
			case "o": tlxSta=((chkChr[0][2]>=10)&&(chkChr[0][2]<=15))?true:false; break;
			}	
		}
		if ((chkChr.length>0)&&(tlxSta)){
			if (chkChr[0][3]==mark){
				var newChar=String.fromCharCode(charMap[chkChr[0][2]][0]);
				resultWord=word.substring(0,i)+newChar+word.substring(i+1,word.length);
				remMark=true;
			}
			if (markRow[chkChr[0][2]]==mark){
				var newChar=String.fromCharCode(charMap[nonMarkRow[chkChr[0][2]]][chkChr[0][3]]);
				resultWord=word.substring(0,i)+newChar+word.substring(i+1,word.length);
				remMark=true;
			}
		}
		if (((thisChar.charCodeAt(0)==272)||(thisChar.charCodeAt(0)==273))&&(mark==9)){
			var newChar=(thisChar.charCodeAt(0)==272)?"D":"d";
			resultWord=word.substring(0,i)+newChar+word.substring(i+1,word.length);
			remMark=true;
		}
		i++;
	}
	if ((key.length==1)&&(word.length>0)&&(resultWord!=correctMark(resultWord,marked,key,mark,richedit,object))){
		resultWord=correctMark(resultWord,marked,key,mark,richedit,object);
		remMark=true;
	}
	var endMark=".,:;!?";
	if (((endMark.indexOf(key)>=0)||(key.length>1))&&(shortHandMode)){
		resultWord=checkDict(resultWord);
		var dict=(resultWord.length>0)?true:false;
	}
	if ((selectMode)&&(!richedit)){
		marked=false;
		remMark=false;
		dict=false;
	}
	if (marked||remMark||dict){
		this.curword.text=resultWord;
		if (marked){
			if (richedit){
				object.parentWindow.window.event.keyCode=null;
			}else{
				window.event.keyCode=null;
			}
		}
	}
	selectMode=false;
	return true;
}
function correctMark(word,marked,key,mark,richedit,object){
	var nonMarkChars=new Array(0,3,6,8,10,13,16,18,20,21,22,23,24);
	var beginChr="dDqQkKlLbBvVxXsSwWzZfFjJ0123456789:;',/.\-=`~!@#$%^&*()_+";
	word=((!marked)&&(key.length==1))?(word+key):word;
	var mkChrs=((marked)&&(mark>5)&&(mark<9))?checkChar(word):checkChar(word.substring(0,word.length-1));
	var uoChar=(word.length>1)?checkChar(word):"";
	var change=(((mkChrs.length==2)||(mkChrs.length==3))&&(mkChrs[mkChrs.length-1][2]!=24)&&(mkChrs[mkChrs.length-2][2]!=24)&&(key.length==1)&&(word.substr(word.length-2,1)!=" "))?true:false;
	var c1=(change)?mkChrs[mkChrs.length-2]:"";
	var c2=(change)?mkChrs[mkChrs.length-1]:"";
	change=((change)&&(Math.abs(c1[1]-c2[1])==1)&&(c1[3]!=0))?true:false;
	var xx=((change)&&(inArray(c1[2],nonMarkChars))&&(inArray(c1[2],nonMarkChars))&&(c2[1]<word.length-1))?true:false;
	var xy=((change)&&(!inArray(c2[2],nonMarkChars)))?true:false;
	change=(xx||xy)?true:false;
	var subChrs=(change)?(String.fromCharCode(charMap[c1[2]][0])+String.fromCharCode(charMap[c2[2]][c1[3]])):"";
	word=((!marked)&&(key.length==1))?(word.substring(0,word.length-1)):word;
	var resultWord=(change)?(word.substring(0,c1[1])+subChrs+word.substring(c2[1]+1,word.length)):word;
	var i=0;
	var uo=false;
	while ((mkChrs.length>=2)&&(i<mkChrs.length-1)&&(!uo)){
		c1=mkChrs[i];
		c2=mkChrs[i+1];
		if (((c1[2]==17)||(c1[2]==19))&&(c2[2]>=10)&&(c2[2]<=15)){
			uo=true;
		}
		i++;
	}
	var lastBe=(beginChr.indexOf(resultWord.substr(resultWord.length-1,1))>0)?true:false;
	if ((uo)&&(mark<7)&&(mark>0)&&!lastBe){	
		var oPos=0;
		if (mark==6){
			oPos=(c2[2]<=12)?11:14;
			if (richedit){
				object.parentWindow.window.event.keyCode=null;
			}else{
				window.event.keyCode=null;
			}
		}
		if ((mark>=1)&&(mark<=5)&&(c2[2]!=12)&&(c2[2]!=15)){
			oPos=(c2[2]<=12)?12:15;		
		}
		if (oPos>0){
			var markPos=(c1[3]!=0)?c1[3]:c2[3];
			subChrs=String.fromCharCode(charMap[c1[2]-1][0])+String.fromCharCode(charMap[oPos][markPos]);
			resultWord=resultWord.substring(0,c1[1])+subChrs+resultWord.substring(c2[1]+1,resultWord.length);
		}
	}
	var i=0;
	var uo=false;
	while ((mkChrs.length>=2)&&(mkChrs.length<=3)&&(i<mkChrs.length-1)&&(!uo)){
		c1=mkChrs[i];
		c2=mkChrs[i+1];
		if (((c1[2]==16)||(c1[2]==18))&&(c2[2]>=10)&&(c2[2]<=15)){
			uo=true;
		}
		i++;
	}
	if ((uo)&&(mark==7)&&(!lastBe)&&(c2[1]<word.length-1)){
		var uPos=(c1[2]<=17)?17:19;
		var oPos=(c2[2]<=12)?12:15;
		var markPos=(c1[3]!=0)?c1[3]:c2[3];
		subChrs=String.fromCharCode(charMap[uPos][0])+String.fromCharCode(charMap[oPos][markPos]);
		resultWord=resultWord.substring(0,c1[1])+subChrs+resultWord.substring(c2[1]+1,resultWord.length);
	}
	uo=(uoChar&&(uoChar.length>1)&&((uoChar[0][2]==17)||(uoChar[0][2]==17))&&((uoChar[1][2]==10)||(uoChar[1][2]==13)))?true:false;
	if ((uo)&&(!marked)&&(!lastBe)){
		var uPos=(uoChar[0][2]==17)?16:18;
		var oPos=(uoChar[1][2]==10)?12:15;
		var markPos=(uoChar[0][3]!=0)?uoChar[0][3]:uoChar[1][3];
		subChrs=String.fromCharCode(charMap[uPos][0])+String.fromCharCode(charMap[oPos][markPos]);
		resultWord=word.substring(0,uoChar[0][1])+subChrs;
		if (richedit){
			object.parentWindow.window.event.keyCode=null;
		}else{
			window.event.keyCode=null;
		}
	}
	return resultWord;
}
function checkDict(word){
	if ((window.w0)&&(word.length>0)){
		var textSize=0;
		while (eval("window.w"+textSize)){	
			textSize++;
		}
		var i=0;
		while ((i<textSize)&&(word!=eval("w"+i))){
			i++;
		}
		var resultWord=(i<textSize)?(eval("c"+i)):word;
		return resultWord;
	}else{
		return word;
	}	
}
function selected(){
	selectMode=true;
}
function shortHand(value){
	shortHandMode=(value)?true:false;
}
function changeInputType(value){
	switch (value){
	case "0": inputType=offType;	break;
	case "1": inputType=telexType;	break;
	case "2": inputType=vniType;	break;
	case "3": inputType=viqrType;	break;
	case "4": inputType=mixType;	break;
	}
	return true;
}
function checkCtrl(object,richedit,menuVal){
	var ctrl;
	if (!menuVal){
		if (richedit){
			ctrl=(object.parentWindow.window.event.ctrlKey)?"c":"";
		}else{
			ctrl=(window.event.ctrlKey)?"c":"";
		}
	}
	if (ctrl=="c"){
		offonce=(offonce)?false:true;
	}
	return true;
}
