﻿/*


 *  AVIM JavaScript Vietnamese Input Method Source File dated 27-03-2007


 *


 *	Copyright (C) 2004 Hieu Tran Dang <lt2hieu2004 (at) users (dot) sf (dot) net>


 *	Website:	http://hdang.co.uk


 *				http://hieu.acunett.com


 *


 *	You are allowed to use this software in any way you want providing:


 *		1. You must retain this copyright notice at all time


 *		2. You must not claim that you or any other third party is the author


 *		   of this software in any way.


*/





va="email".split(',') //Put the ID of the fields you DON'T want to let users type Vietnamese in, multiple fields allowed, separated by a comma (,)


method=0 //Default input method, 0=AUTO, 1=TELEX, 2=VNI, 3=VIQR


on_off=0 //Start H.I.M on


dockspell=0 //Start H.I.M with spell checking on


dauCu=0 //Start H.I.M with old way of marking accent (o`a, o`e, u`y)


useCookie=0 //Set this to 0 to NOT use cookies


radioID="him_auto,him_telex,him_vni,him_viqr,him_viqr2,him_off,him_ckspell,him_daucu".split(",")


var agt=navigator.userAgent.toLowerCase(),alphabet="QWERTYUIOPASDFGHJKLZXCVBNM\ ",them,spellerr,setCookie,getCookie


var is_ie=((agt.indexOf("msie")!=-1)&&(agt.indexOf("opera")==-1)),S,F,J,R,X,D,oc,sk,saveStr,wi,frame,is_opera=false,D2,isKHTML=false


var ver=0,support=true,changed=false,uni,uni2,g,h,SFJRX,DAWEO,Z,AEO,moc,trang,kl=0,tw5,range=null,doc,fID=document.getElementsByTagName("iframe")


skey=new Array(97,226,259,101,234,105,111,244,417,117,432,121,65,194,258,69,202,73,79,212,416,85,431,89)


var skey2="a,a,a,e,e,i,o,o,o,u,u,y,A,A,A,E,E,I,O,O,O,U,U,Y".split(','),A,E,O,whit=false,english="ĐÂĂƠƯÊÔ",lowen="đâăơưêô",ds1="d,D".split(","),db1=new Array(273,272)


os1="o,O,ơ,Ơ,ó,Ó,ò,Ò,ọ,Ọ,ỏ,Ỏ,õ,Õ,ớ,Ớ,ờ,Ờ,ợ,Ợ,ở,Ở,ỡ,Ỡ".split(","),ob1="ô,Ô,ô,Ô,ố,Ố,ồ,Ồ,ộ,Ộ,ổ,Ổ,ỗ,Ỗ,ố,Ố,ồ,Ồ,ộ,Ộ,ổ,Ổ,ỗ,Ỗ".split(",")


mocs1="o,O,ô,Ô,u,U,ó,Ó,ò,Ò,ọ,Ọ,ỏ,Ỏ,õ,Õ,ú,Ú,ù,Ù,ụ,Ụ,ủ,Ủ,ũ,Ũ,ố,Ố,ồ,Ồ,ộ,Ộ,ổ,Ổ,ỗ,Ỗ".split(",");mocb1="ơ,Ơ,ơ,Ơ,ư,Ư,ớ,Ớ,ờ,Ờ,ợ,Ợ,ở,Ở,ỡ,Ỡ,ứ,Ứ,ừ,Ừ,ự,Ự,ử,Ử,ữ,Ữ,ớ,Ớ,ờ,Ờ,ợ,Ợ,ở,Ở,ỡ,Ỡ".split(",")


trangs1="a,A,â,Â,á,Á,à,À,ạ,Ạ,ả,Ả,ã,Ã,ấ,Ấ,ầ,Ầ,ậ,Ậ,ẩ,Ẩ,ẫ,Ẫ".split(",");trangb1="ă,Ă,ă,Ă,ắ,Ắ,ằ,Ằ,ặ,Ặ,ẳ,Ẳ,ẵ,Ẵ,ắ,Ắ,ằ,Ằ,ặ,Ặ,ẳ,Ẳ,ẵ,Ẵ".split(",")


as1="a,A,ă,Ă,á,Á,à,À,ạ,Ạ,ả,Ả,ã,Ã,ắ,Ắ,ằ,Ằ,ặ,Ặ,ẳ,Ẳ,ẵ,Ẵ,ế,Ế,ề,Ề,ệ,Ệ,ể,Ể,ễ,Ễ".split(",");ab1="â,Â,â,Â,ấ,Ấ,ầ,Ầ,ậ,Ậ,ẩ,Ẩ,ẫ,Ẫ,ấ,Ấ,ầ,Ầ,ậ,Ậ,ẩ,Ẩ,ẫ,Ẫ,é,É,è,È,ẹ,Ẹ,ẻ,Ẻ,ẽ,Ẽ".split(",")


es1="e,E,é,É,è,È,ẹ,Ẹ,ẻ,Ẻ,ẽ,Ẽ".split(",");eb1="ê,Ê,ế,Ế,ề,Ề,ệ,Ệ,ể,Ể,ễ,Ễ".split(",")


arA="á,à,ả,ã,ạ,a,Á,À,Ả,Ã,Ạ,A".split(',');mocrA="ó,ò,ỏ,õ,ọ,o,ú,ù,ủ,ũ,ụ,u,Ó,Ò,Ỏ,Õ,Ọ,O,Ú,Ù,Ủ,Ũ,Ụ,U".split(',');erA="é,è,ẻ,ẽ,ẹ,e,É,È,Ẻ,Ẽ,Ẹ,E".split(',');orA="ó,ò,ỏ,õ,ọ,o,Ó,Ò,Ỏ,Õ,Ọ,O".split(',')


aA="ấ,ầ,ẩ,ẫ,ậ,â,Ấ,Ầ,Ẩ,Ẫ,Ậ,Â".split(',');mocA="ớ,ờ,ở,ỡ,ợ,ơ,ứ,ừ,ử,ữ,ự,ư,Ớ,Ờ,Ở,Ỡ,Ợ,Ơ,Ứ,Ừ,Ử,Ữ,Ự,Ư".split(',');trangA="ắ,ằ,ẳ,ẵ,ặ,ă,Ắ,Ằ,Ẳ,Ẵ,Ặ,Ă".split(',');eA="ế,ề,ể,ễ,ệ,ê,Ế,Ề,Ể,Ễ,Ệ,Ê".split(',');oA="ố,ồ,ổ,ỗ,ộ,ô,Ố,Ồ,Ổ,Ỗ,Ộ,Ô".split(',')





function notWord(w) {


	var str="\ \r\n#,\\;.:-_()<>+-*/=?!\"$%{}[]\'~|^\@\&\t"+fcc(160)


	return (str.indexOf(w)>=0)


}


function nan(w) {


	if ((isNaN(w))||(w=='e')) return true


	else return false


}


function mozGetText(obj) {


	var v,pos,w="";g=1


	v=(obj.data)?obj.data:obj.value


	if(v.length<=0) return false


	if(!obj.data) {


		if(!obj.setSelectionRange) return false


		pos=obj.selectionStart


	} else pos=obj.pos


	if(obj.selectionStart!=obj.selectionEnd) return new Array("",pos)


	while(1) {


		if(pos-g<0) break


		else if(notWord(v.substr(pos-g,1))) { if(v.substr(pos-g,1)=="\\") w=v.substr(pos-g,1)+w; break }


		else w=v.substr(pos-g,1)+w; g++


	}


	return new Array(w,pos)


}


function start(obj,key) {


	var w="";oc=obj;uni2=false;fixed=false


	if(method==0) { uni="D,A,E,O,W,W".split(','); uni2="9,6,6,6,7,8".split(','); D2="DAWEO6789" }


	else if(method==1) { uni="D,A,E,O,W,W".split(','); D2="DAWEO" }


	else if(method==2) { uni="9,6,6,6,7,8".split(','); D2="6789" }


	else if(method==3) { uni="D,^,^,^,+,(".split(','); D2="D^+(" }


	else if(method==4) { uni="D,^,^,^,*,(".split(','); D2="D^*(" }


	if(!is_ie) {


		key=fcc(key.which)


		w=mozGetText(obj)


		if((!w)||(obj.sel)) return


		main(w[0],key,w[1],uni)


		if(!dockspell) w=mozGetText(obj)


		if((w)&&(uni2)&&(!changed)) main(w[0],key,w[1],uni2)


	} else {


		obj=ieGetText(obj)


		if(obj) {


			var sT=obj.cW.text


			w=main(obj.cW.text,key,0,uni)


			if((uni2)&&((w==sT)||(typeof(w)=='undefined'))) w=main(obj.cW.text,key,0,uni2)


			if(w) obj.cW.text=w


		}


	}


	if(D2.indexOf(up(key))>=0) {


		if(!is_ie) {


			w=mozGetText(obj)


			if(!w) return


			normC(w[0],key,w[1])


		} else if(typeof(obj)=="object") { 


			obj=ieGetText(obj)


			if(obj) {


				w=obj.cW.text


				if(!changed) { w+=key; changed=true }


				obj.cW.text=w


				w=normC(w,key,0)


				if(w) { obj=ieGetText(obj); obj.cW.text=w }


			}


		} 


	}


}


function ieGetText(obj) {


	var caret=obj.document.selection.createRange(),w=""


	if(caret.text) caret.text=""


	else {


		while(1) {


			caret.moveStart("character",-1)


			if(w.length==caret.text.length) break


			w=caret.text


			if(notWord(w.charAt(0))) {


				if(w.charCodeAt(0)==13) w=w.substr(2)


				else if(w.charAt(0)!="\\") w=w.substr(1)


				break


			}


		}


	}


	if(w.length) {


		caret.collapse(false)


		caret.moveStart("character",-w.length)


		obj.cW=caret.duplicate()


		return obj


	} else return false


}


function ie_replaceChar(w,pos,c) {


	var r="",uc=0


	if(isNaN(c)) uc=up(c)


	if((whit)&&(up(w.substr(w.length-pos-1,1))=='U')&&(pos!=1)&&(up(w.substr(w.length-pos-2,1))!='Q')) {


		whit=false


		if((up(unV(fcc(c)))=="Ơ")||(uc=="O")) {


			if(w.substr(w.length-pos-1,1)=='u') r=fcc(432)


			else r=fcc(431)


		}


		if(uc=="O") {


			if(c=="o") c=417


			else c=416


		}


	}


	if(!isNaN(c)) {


		changed=true;r+=fcc(c)


		return w.substr(0,w.length-pos-r.length+1)+r+w.substr(w.length-pos+1)


	} else return w.substr(0,w.length-pos)+c+w.substr(w.length-pos+1)


}


function tr(k,w,by,sf,i) {


	var r,pos=findC(w,k,sf)


	if(pos) {


		if(pos[1]) {


			if(is_ie) return ie_replaceChar(w,pos[0],pos[1])


			else return replaceChar(oc,i-pos[0],pos[1])


		} else {


			var c,pC=w.substr(w.length-pos,1),cmp;r=sf


			for(g=0;g<r.length;g++) {


				if((nan(r[g]))||(r[g]=="e")) cmp=pC


				else cmp=pC.charCodeAt(0)


				if(cmp==r[g]) {


					if(!nan(by[g])) c=by[g]


					else c=by[g].charCodeAt(0)


					if(is_ie) return ie_replaceChar(w,pos,c)


					else return replaceChar(oc,i-pos,c)


				}


			}


		}


	}


	return false


}


function main(w,k,i,a) {


	var uk=up(k),bya=new Array(db1,ab1,eb1,ob1,mocb1,trangb1),got=false,t="d,D,a,A,a,A,o,O,u,U,e,E,o,O".split(",")


	var sfa=new Array(ds1,as1,es1,os1,mocs1,trangs1),by=new Array(),sf=new Array()


	if((method==2)||((method==0)&&(a[0]=="9"))) {


		DAWEO="6789";SFJRX="12534";S="1";F="2";J="5";R="3";X="4";Z="0";D="9";FRX="234";AEO="6";moc="7";trang="8";them="678";A="^";E="^";O="^"


	} else if(method==3) {


		DAWEO="^+(D";SFJRX="'`.?~";S="'";F="`";J=".";R="?";X="~";Z="-";D="D";FRX="`?~";AEO="^";moc="+";trang="(";them="^+(";A="^";E="^";O="^"


	} else if(method==4) {


		DAWEO="^*(D";SFJRX="'`.?~";S="'";F="`";J=".";R="?";X="~";Z="-";D="D";FRX="`?~";AEO="^";moc="*";trang="(";them="^*(";A="^";E="^";O="^"


	} else if((method==1)||((method==0)&&(a[0]=="D"))) {


		SFJRX="SFJRX";DAWEO="DAWEO";D='D';S='S';F='F';J='J';R='R';X='X';Z='Z';FRX="FRX";them="AOEW";trang="W";moc="W";A="A";E="E";O="O"


	}


	if(SFJRX.indexOf(uk)>=0) {


		var ret=sr(w,k,i); got=true


		if(ret) return ret


	} else if(uk==Z) {


		sf=repSign(null)


		for(h=0;h<english.length;h++) {


			sf[sf.length]=lowen.charCodeAt(h)


			sf[sf.length]=english.charCodeAt(h)


		}


		for(h=0;h<5;h++) for(g=0;g<skey.length;g++) by[by.length]=skey[g]


		for(h=0;h<t.length;h++) by[by.length]=t[h]


		got=true


	}


	else for(h=0;h<a.length;h++) if(a[h]==uk) { got=true; by=by.concat(bya[h]); sf=sf.concat(sfa[h]) }


	if(uk==moc) whit=true;


	if(!got) return normC(w,k,i)


	return DAWEOZ(k,w,by,sf,i,uk)


}


function DAWEOZ(k,w,by,sf,i,uk) { if((DAWEO.indexOf(uk)>=0)||(Z.indexOf(uk)>=0)) return tr(k,w,by,sf,i) }


function normC(w,k,i) {


	var uk=up(k),u=repSign(null),fS,c,j,space=(k.charCodeAt(0)==32)?true:false


	if((!is_ie)&&(space)) return


	for(j=1;j<=w.length;j++) {


		for(h=0;h<u.length;h++) {


			if(u[h]==w.charCodeAt(w.length-j)) {


				if(h<=23) fS=S


				else if(h<=47) fS=F


				else if(h<=71) fS=J


				else if(h<=95) fS=R


				else fS=X


				c=skey[h%24]; if((alphabet.indexOf(uk)<0)&&(D2.indexOf(uk)<0)) return w; w=unV(w)


				if((!space)&&(!changed)) w+=k


				if(!is_ie) {


					var sp=oc.selectionStart,pos=sp


					if(!changed) {


						var sst=oc.scrollTop;pos+=k.length


						if(!oc.data) { oc.value=oc.value.substr(0,sp)+k+oc.value.substr(oc.selectionEnd);changed=true;oc.scrollTop=sst }


						else { oc.insertData(oc.pos,k);range.setEnd(oc,oc.pos+1);oc.pos++;changed=true }


					}


					if(!oc.data) oc.setSelectionRange(pos,pos)


					if(!ckspell(w,fS)) {


						replaceChar(oc,i-j,c)


						if(!oc.data) {


							var a=new Array(D)


							main(w,fS,pos,a)


						} else {


							var ww=mozGetText(oc)


							var a=new Array(D)


							main(ww[0],fS,ww[1],a)


						}


					}


				} else {


					var ret=sr(w,fS,0)


					if((space)&&(ret)) ret+=fcc(32)


					if(ret) return ret


				}


			}


		}


	}


}


function nospell(w,k) { return false }


function ckspell(w,k) {


	w=unV(w); var exc="UOU,IEU".split(','),z,next=true,noE="UU,UOU,UOI,IEU,AO,IA,AI,AY,AU,AO".split(','),noBE="YEU",test,a,b


	var check=true,noM="UE,UYE,IU,EU,UY".split(','),noMT="AY,AU".split(','),noT="UA",t=-1,notV2="IAO"


	var uw=up(w),tw=uw,update=false,gi="IO",noAOEW="OE,OO,AO,EO,IA,AI".split(','),noAOE="OA"


	var notViet="AA,AE,EE,OU,YY,YI,IY,EY,EA,EI,II,IO,YO,YA,OOO".split(','),uk=up(k),twE,uw2=unV2(uw)


	var vSConsonant="B,C,D,G,H,K,L,M,N,P,Q,R,S,T,V,X".split(','),vDConsonant="CH,GI,KH,NGH,GH,NG,NH,PH,QU,TH,TR".split(',')


	var vDConsonantE="CH,NG,NH".split(','),sConsonant="C,P,T,CH".split(','),vSConsonantE="C,M,N,P,T".split(',')


	var noNHE="O,U,IE,Ô,Ơ,Ư,IÊ,Ă,Â,UYE,UYÊ,UO,ƯƠ,ƯO,UƠ,UA,ƯA,OĂ,OE,OÊ".split(','),oMoc="UU,UOU".split(',')


	if(FRX.indexOf(uk)>=0) for(a=0;a<sConsonant.length;a++) if(uw.substr(uw.length-sConsonant[a].length,sConsonant[a].length)==sConsonant[a]) return true


	for(a=0;a<uw.length;a++) {


		if("FJZW1234567890".indexOf(uw.substr(a,1))>=0) return true


		for(b=0;b<notViet.length;b++) {


			if(uw2.substr(a,notViet[b].length)==notViet[b]) {


				for(z=0;z<exc.length;z++) if(uw2.indexOf(exc[z])>=0) next=false


				if((next)&&((gi.indexOf(notViet[b])<0)||(a<=0)||(uw2.substr(a-1,1)!='G'))) return true


			}


		}


	}


	for(b=0;b<vDConsonant.length;b++) if(tw.indexOf(vDConsonant[b])==0){tw=tw.substr(vDConsonant[b].length);update=true;t=b;break}


	if(!update) for(b=0;b<vSConsonant.length;b++) if(tw.indexOf(vSConsonant[b])==0){tw=tw.substr(1);break}


	update=false;twE=tw


	for(b=0;b<vDConsonantE.length;b++) {


		if(tw.substr(tw.length-vDConsonantE[b].length)==vDConsonantE[b]) {


			tw=tw.substr(0,tw.length-vDConsonantE[b].length)


			if(b==2){


				for(z=0;z<noNHE.length;z++) if(tw==noNHE[z]) return true


				if((uk==trang)&&((tw=="OA")||(tw=="A"))) return true


			}


			update=true;break


		}


	}


	if(!update) for(b=0;b<vSConsonantE.length;b++) if(tw.substr(tw.length-1)==vSConsonantE[b]){tw=tw.substr(0,tw.length-1);break}


	if(tw) {


		for(a=0;a<vDConsonant.length;a++) {


			for(b=0;b<tw.length;b++) { if(tw.substr(b,vDConsonant[a].length)==vDConsonant[a]) return true }


		}


		for(a=0;a<vSConsonant.length;a++) { if(tw.indexOf(vSConsonant[a])>=0) return true }


	}


	test=tw.substr(0,1)


	if((t==3)&&((test=="A")||(test=="O")||(test=="U")||(test=="Y"))) return true


	if((t==5)&&((test=="E")||(test=="I")||(test=="Y"))) return true


	uw2=unV2(tw)


	if(uw2==notV2) return true


	if(tw!=twE) for(z=0;z<noE.length;z++) if(uw2==noE[z]) return true


	if((tw!=uw)&&(uw2==noBE)) return true


	if(uk!=moc) for(z=0;z<oMoc.length;z++) if(tw==oMoc[z]) return true


	if((uw2.indexOf('UYE')>0)&&(uk=='E')) check=false


	if((them.indexOf(uk)>=0)&&(check)) {


		for(a=0;a<noAOEW.length;a++) if(uw2.indexOf(noAOEW[a])>=0) return true


		if(uk!=trang) if(uw2==noAOE) return true


		if((uk==trang)&&(trang!='W')) if(uw2==noT) return true


		if(uk==moc) for(a=0;a<noM.length;a++) if(uw2==noM[a]) return true


		if((uk==moc)||(uk==trang)) for(a=0;a<noMT.length;a++) if(uw2==noMT[a]) return true


	}


	tw5=tw


	if((uw2.charCodeAt(0)==272)||(uw2.charCodeAt(0)==273)) { if(uw2.length>4) return true }


	else if(uw2.length>3) return true


	return false


}


function DAWEOF(cc,k) {


	var ret=new Array(),kA=new Array(A,moc,trang,E,O),z,a;ret[0]=g


	var ccA=new Array(aA,mocA,trangA,eA,oA),ccrA=new Array(arA,mocrA,arA,erA,orA)


	for(a=0;a<kA.length;a++) if(k==kA[a]) for(z=0;z<ccA[a].length;z++) if(cc==ccA[a][z]) ret[1]=ccrA[a][z]


	if(ret[1]) return ret


	else return false


}


function findC(w,k,sf) {


	if(((method==3)||(method==4))&&(w.substr(w.length-1,1)=="\\")) return new Array(1,k.charCodeAt(0))


	var str="",res,cc="",pc="",tE="",vowA=new Array(),s="ÂĂÊÔƠƯêâăơôư",c=0,dn=false,uw=up(w),tv;spellerr(w,k)


	var DAWEOFA=aA.join()+eA.join()+mocA.join()+trangA.join()+oA.join()+english;DAWEOFA=up(DAWEOFA)


	for(g=0;g<sf.length;g++) {


		if(nan(sf[g])) str+=sf[g]


		else str+=fcc(sf[g])


	}


	var uk=up(k),i=w.length,uni_array=repSign(k),w2=up(unV2(unV(w))),dont="ƯA,ƯU".split(',')


	if (DAWEO.indexOf(uk)>=0) {


		if(uk==moc) {


			if((w2.indexOf("UU")>=0)&&(tw5!=dont[1])) {


				if(w2.indexOf("UU")==(w.length-2)) res=2


				else return false


			} else if(w2.indexOf("UOU")>=0) {


				if(w2.indexOf("UOU")==(w.length-3)) res=2


				else return false


			}


		}


		if(!res) {


			for(g=1;g<=w.length;g++) {


				cc=w.substr(w.length-g,1)


				pc=up(w.substr(w.length-g-1,1))


				uc=up(cc)


				for(h=0;h<dont.length;h++) if((tw5==dont[h])&&(tw5==unV(pc+uc))) dn=true


				if(dn) { dn=false; continue }


				if(str.indexOf(uc)>=0) {


					if(((uk==moc)&&(unV(uc)=="U")&&(up(unV(w.substr(w.length-g+1,1)))=="A"))||((uk==trang)&&(unV(uc)=='A')&&(unV(pc)=='U'))) {


						if(unV(uc)=="U") tv=1


						else tv=2


						ccc=up(w.substr(w.length-g-tv,1))


						if(ccc!="Q") res=g+tv-1


						else if(uk==trang) res=g


						else if(moc!=trang) return false


					} else res=g


					if((!whit)||(uw.indexOf("Ư")<0)||(uw.indexOf("W")<0)) break


				} else if(DAWEOFA.indexOf(uc)>=0) {


					if(uk==D) {


						if(cc=="đ") res=new Array(g,'d')


						else if(cc=="Đ") res=new Array(g,'D')


					} else res=DAWEOF(cc,uk)


					if(res) break


				}


			}


		}


	}


	if((uk!=Z)&&(DAWEO.indexOf(uk)<0)) { var tEC=retKC(uk); for (g=0;g<tEC.length;g++) tE+=fcc(tEC[g]) }


	for(g=1;g<=w.length;g++) {


		if(DAWEO.indexOf(uk)<0) {


			cc=up(w.substr(w.length-g,1))


			pc=up(w.substr(w.length-g-1,1))


			if(str.indexOf(cc)>=0) {


				if(cc=='U') {


					if(pc!='Q') { c++;vowA[vowA.length]=g }


				} else if(cc=='I') {


					if((pc!='G')||(c<=0)) { c++;vowA[vowA.length]=g }


				} else { c++;vowA[vowA.length]=g }


			} else if(uk!=Z) {


				for(h=0;h<uni_array.length;h++) if(uni_array[h]==w.charCodeAt(w.length-g)) {


					if(spellerr(w,k)) return false


					return new Array(g,tEC[h%24])


				}


				for(h=0;h<tEC.length;h++) if(tEC[h]==w.charCodeAt(w.length-g)) return new Array(g,fcc(skey[h]))


			}


		}


	}


	if((uk!=Z)&&(typeof(res)!='object')) if(spellerr(w,k)) return false


	if(DAWEO.indexOf(uk)<0) {


		for(g=1;g<=w.length;g++) {


			if((uk!=Z)&&(s.indexOf(w.substr(w.length-g,1))>=0)) return g


			else if(tE.indexOf(w.substr(w.length-g,1))>=0) {


				for(h=0;h<tEC.length;h++) {


					if(w.substr(w.length-g,1).charCodeAt(0)==tEC[h]) return new Array(g,fcc(skey[h]))


				}


			}


		}


	}


	if(res) return res


	if((c==1)||(uk==Z)) return vowA[0]


	else if(c==2) {


		var v=2


		if(w.substr(w.length-1)==" ") v=3


		var ttt=up(w.substr(w.length-v,2))


		if((dauCu==0)&&((ttt=="UY")||(ttt=="OA")||(ttt=="OE"))) return vowA[0]


		var c2=0,fdconsonant,sc="BCD"+fcc(272)+"GHKLMNPQRSTVX",dc="CH,GI,KH,NGH,GH,NG,NH,PH,QU,TH,TR".split(',')


		for(h=1;h<=w.length;h++) {


			fdconsonant=false


			for(g=0;g<dc.length;g++) {


				if(up(w.substr(w.length-h-dc[g].length+1,dc[g].length)).indexOf(dc[g])>=0) {


					c2++;fdconsonant=true


					if(dc[g]!='NGH') h++


					else h+=2


				}


			}


			if(!fdconsonant) {


				if(sc.indexOf(up(w.substr(w.length-h,1)))>=0) c2++


				else break


			}


		}


		if((c2==1)||(c2==2)) return vowA[0]


		else return vowA[1]


	} else if(c==3) return vowA[1]


	else return false


}


function unV(w) {


	var u=repSign(null),b,a


	for(a=1;a<=w.length;a++) {


		for(b=0;b<u.length;b++) {


			if(u[b]==w.charCodeAt(w.length-a)) {


				w=w.substr(0,w.length-a)+fcc(skey[b%24])+w.substr(w.length-a+1)


			}


		}


	}


	return w


}


function unV2(w) {


	var a,b


	for(a=1;a<=w.length;a++) {


		for(b=0;b<skey.length;b++) {


			if(skey[b]==w.charCodeAt(w.length-a)) w=w.substr(0,w.length-a)+skey2[b]+w.substr(w.length-a+1)


		}


	}


	return w


}


function repSign(k) {


	var t=new Array(),u=new Array(),a,b


	for(a=0;a<5;a++) {


		if((k==null)||(SFJRX.substr(a,1)!=up(k))) {


			t=retKC(SFJRX.substr(a,1))


			for(b=0;b<t.length;b++) u[u.length]=t[b]


		}


	}


	return u


}


function sr(w,k,i) {


	var sf=getSF()


	pos=findC(w,k,sf)


	if(pos) {


		if(pos[1]) {


			if(!is_ie) replaceChar(oc,i-pos[0],pos[1])


			else return ie_replaceChar(w,pos[0],pos[1])


		} else {


			var c=retUni(w,k,pos)


			if (!is_ie) replaceChar(oc,i-pos,c)


			else return ie_replaceChar(w,pos,c)


		}


	}


	return false


}


function retUni(w,k,pos) {


	var u=retKC(up(k)),uC,lC,c=w.charCodeAt(w.length-pos),a


	for(a=0;a<skey.length;a++) if(skey[a]==c) {


		if(a<12) { lC=a;uC=a+12 }


		else { lC=a-12;uC=a }


		t=fcc(c);if(t!=up(t)) return u[lC]


		return u[uC]


	}


}


function replaceChar(o,pos,c) {


	var bb=false; if(!nan(c)) { var replaceBy=fcc(c),wfix=up(unV(fcc(c))); changed=true }


	else { var replaceBy=c; if((up(c)=="O")&&(whit)) bb=true }


	if(!o.data) {


		var savePos=o.selectionStart,sst=o.scrollTop


		if ((up(o.value.substr(pos-1,1))=='U')&&(pos<savePos-1)&&(up(o.value.substr(pos-2,1))!='Q')) {


			if((wfix=="Ơ")||(bb))


			{


				if (o.value.substr(pos-1,1)=='u') var r=fcc(432)


				else var r=fcc(431)


			}


			if(bb) {


				changed=true; if(c=="o") replaceBy="ơ"


				else replaceBy="Ơ"


			}


		}


		o.value=o.value.substr(0,pos)+replaceBy+o.value.substr(pos+1)


		if(r) o.value=o.value.substr(0,pos-1)+r+o.value.substr(pos)


		o.setSelectionRange(savePos,savePos);o.scrollTop=sst


	} else {


		if ((up(o.data.substr(pos-1,1))=='U')&&(pos<o.pos-1)) {


			if((wfix=="Ơ")||(bb))


			{


				if (o.data.substr(pos-1,1)=='u') var r=fcc(432)


				else var r=fcc(431)


			}


			if(bb) {


				changed=true; if(c=="o") replaceBy="ơ"


				else replaceBy="Ơ"


			}


		}


		o.deleteData(pos,1);o.insertData(pos,replaceBy)


		if(r) { o.deleteData(pos-1,1);o.insertData(pos-1,r) }


	}


	if(whit) whit=false


}


function retKC(k) {


	if(k==S) return new Array(225,7845,7855,233,7871,237,243,7889,7899,250,7913,253,193,7844,7854,201,7870,205,211,7888,7898,218,7912,221)


	if(k==F) return new Array(224,7847,7857,232,7873,236,242,7891,7901,249,7915,7923,192,7846,7856,200,7872,204,210,7890,7900,217,7914,7922)


	if(k==J) return new Array(7841,7853,7863,7865,7879,7883,7885,7897,7907,7909,7921,7925,7840,7852,7862,7864,7878,7882,7884,7896,7906,7908,7920,7924)


	if(k==R) return new Array(7843,7849,7859,7867,7875,7881,7887,7893,7903,7911,7917,7927,7842,7848,7858,7866,7874,7880,7886,7892,7902,7910,7916,7926)


	if(k==X) return new Array(227,7851,7861,7869,7877,297,245,7895,7905,361,7919,7929,195,7850,7860,7868,7876,296,213,7894,7904,360,7918,7928)


}


function getEL(id) { return document.getElementById(id) }


function getSF() { var sf=new Array(),x; for(x=0;x<skey.length;x++) sf[sf.length]=fcc(skey[x]); return sf }


function statusMessage() {


	var str='Kiểu gõ: '


	if(on_off==0) str+='Tắt'


	else if(method==1) str+='TELEX'


	else if(method==2) str+='VNI'


	else if(method==3) str+='VIQR'


	else if(method==4) str+='VIQR*'


	else if(method==0) str+='Tự động'


	if(isKHTML) str+=" [Alt-F9]"


	else str+=" [F9]"


	str+=" | Chính tả: "


	str+=(dockspell==0)?"Tắt":"Bật"


	if(isKHTML) str+=" [Alt-F8]"


	else str+=" [F8]"


	str+=" | Bỏ dấu: "


	str+=(dauCu==1)?"Cũ":"Mới"


	if(isKHTML) str+=" [Alt-F7]"


	else str+=" [F7]"


	str+=" | Bật/Tắt [F12] - AVIM 20070327"


	window.status=str


}


function updateInfo() { setCookie(); if(support) statusMessage() }


function setMethod(m) {


	if(m==-1) { on_off=0;if(getEL(radioID[5])) getEL(radioID[5]).checked=true }


	else { on_off=1;method=m;if(getEL(radioID[m])) getEL(radioID[m]).checked=true }


	setSpell(dockspell);setDauCu(dauCu);updateInfo()


}


function setDauCu(box) {


	if(typeof(box)=="number") {


		dauCu=box;if(getEL(radioID[7])) getEL(radioID[7]).checked=box


	} else dauCu=(box.checked)?1:0


	updateInfo()


}


function setSpell(box) {


	if(typeof(box)=="number") { 


		spellerr=(box==1)?ckspell:nospell


		if(getEL(radioID[6])) getEL(radioID[6]).checked=box


	}


	else {


		if(box.checked) { spellerr=ckspell;dockspell=1 }


		else { spellerr=nospell;dockspell=0 }


	}


	updateInfo()


}


function onKeyDown(e) {


	if (e=='iframe') { frame=findF();var key=frame.event.keyCode }


	else var key=(!is_ie)?e.which:window.event.keyCode


	if((key==120)||(key==123)||(key==119)||(key==118)) {


		if(key==120) { on_off=1;setMethod(((method==4)?0:++method)) }


		else if(key==118) { setDauCu(((dauCu==1)?0:1)) }


		else if(key==119) { dockspell=(dockspell==0)?1:0;setSpell(dockspell) }


		else if(key==123) {


			on_off=(on_off==0)?1:0


			if(on_off==0) setMethod(-1)


			else setMethod(method)


		}


		updateInfo()


	}


}


function ifInit(w) {


	var sel=w.getSelection();w.focus()


	range=sel?sel.getRangeAt(0):document.createRange()


}


function ifMoz(e) {


	if((e.ctrlKey)||((e.altKey)&&(code!=92)&&(code!=126))) return;ifInit(e.target.parentNode.wi)


	var code=e.which,node=range.endContainer;sk=fcc(code);saveStr=""


	if(checkCode(code)||(!range.startOffset)||(typeof(node.data)=='undefined')) return;node.sel=false


	if(node.data) {


		saveStr=node.data.substr(range.endOffset)


		if(range.startOffset!=range.endOffset) node.sel=true


		node.deleteData(range.startOffset,node.data.length)


	}


	range.setEnd(node,range.endOffset)


	range.setStart(node,0)


	if(!node.data) return


	node.value=node.data; node.pos=node.data.length; node.which=code


	start(node,e)


	node.insertData(node.data.length,saveStr)


	range.setEnd(node,node.data.length-saveStr.length+kl)


	range.setStart(node,node.data.length-saveStr.length+kl); kl=0


	if(changed) { changed=false; e.preventDefault() }


}


function FKeyPress() {


	var obj=findF()


	sk=fcc(obj.event.keyCode)


	if(checkCode(obj.event.keyCode)||((obj.event.ctrlKey)&&(obj.event.keyCode!=92)&&(obj.event.keyCode!=126))) return


	start(obj,fcc(obj.event.keyCode))


}


function checkCode(code) { if(((on_off==0)||((code<45)&&(code!=42))||(code==145)||(code==255))&&(code!=32)&&(code!=39)&&(code!=40)&&(code!=43)) return true }


function fcc(x) { return String.fromCharCode(x) }


if(useCookie==1) { setCookie=doSetCookie; getCookie=doGetCookie }


else { setCookie=noCookie; getCookie=noCookie }


function noCookie() {}


function doSetCookie() {


	var exp=new Date(11245711156480).toGMTString()


	document.cookie='HIM_on_off='+on_off+';expires='+exp


	document.cookie='HIM_method='+method+';expires='+exp


	document.cookie='HIM_ckspell='+dockspell+';expires='+exp


	document.cookie='HIM_daucu='+dauCu+';expires='+exp


}


function doGetCookie() {


	var ck=document.cookie, res=/HIM_method/.test(ck)


	if((!res)||(ck.indexOf('HIM_ckspell')<0)) { setCookie(); return }


	var p,ckA=ck.split(';')


	for(var i=0;i<ckA.length;i++) {


		p=ckA[i].split('='); p[0]=p[0].replace(/^\s+/g,""); p[1]=parseInt(p[1])


		if(p[0]=='HIM_on_off') on_off=p[1]


		else if(p[0]=='HIM_method') method=p[1]


		else if(p[0]=='HIM_ckspell') {


			if(p[1]==0) { dockspell=0; spellerr=nospell }


			else { dockspell=1; spellerr=ckspell }


		} else if(p[0]=='HIM_daucu') dauCu=parseInt(p[1])


	}


}


if(!is_ie) {


	if(agt.indexOf("opera")>=0) {


		operaV=agt.split(" ")


		if(parseInt(operaV[operaV.length-1])>=8) is_opera=true


		else {


			operaV=operaV[0].split("/")


			if(parseInt(operaV[1])>=8) is_opera=true


		}


	} else if(agt.indexOf("khtml")>=0) isKHTML=true


	else {


		ver=agt.substr(agt.indexOf("rv:")+3)


		ver=parseFloat(ver.substr(0,ver.indexOf(" ")))


		if(agt.indexOf("mozilla")<0) ver=0


	}


}


function up(w) {


	w=w.toUpperCase()


	if(isKHTML) {


		str="êôơâăưếốớấắứềồờầằừễỗỡẫẵữệộợậặự",rep="ÊÔƠÂĂƯẾỐỚẤẮỨỀỒỜẦẰỪỄỖỠẪẴỮỆỘỢẶỰ"


		for(z=0;z<w.length;z++) {


			io=str.indexOf(w.substr(z,1))


			if(io>=0) w=w.substr(0,z)+rep.substr(io,1)+w.substr(z+1)


		}


	}


	return w


}


function findIgnore(el) {


	for(i=0;i<va.length;i++) if((el.id==va[i])&&(va[i].length>0)) return true


}


if((is_ie)||(ver>=1.3)||(is_opera)||(isKHTML)) {


	getCookie()


	if(on_off==0) setMethod(-1)


	else setMethod(method)


	setSpell(dockspell);setDauCu(dauCu);statusMessage()


} else support=false


document.onkeydown=function(e) { onKeyDown(e) }


document.onkeypress=function(e) {


	if(!support) return


	if(!is_ie) { var el=e.target,code=e.which; if(e.ctrlKey) return; if((e.altKey)&&(code!=92)&&(code!=126)) return }


	else { var el=window.event.srcElement,code=window.event.keyCode; if((event.ctrlKey)&&(code!=92)&&(code!=126)) return }


	if(((el.type!='textarea')&&(el.type!='text'))||checkCode(code)) return


	sk=fcc(code); if (findIgnore(el)) return


	if(!is_ie) start(el,e)


	else start(el,sk)


	if(changed) { changed=false; return false }


}


function findF() {


	for(g=0;g<fID.length;g++) {


		if(findIgnore(fID[g])) return;frame=document.frames[fID[g].id]


		if((typeof(frame)!="undefined")&&(frame.document)&&(frame.event)) return frame


	}


}


function init() {


if((support)&&(!is_opera)&&(!isKHTML)) {


	for(g=0;g<fID.length;g++) {


		if(is_ie) {


			if(findIgnore(fID[g])) return;frame=document.frames[fID[g].id]


			if((typeof(frame)!="undefined")&&(frame.document)) doc=frame.document


			if((doc)&&(up(doc.designMode)=="ON")) {


				doc.onkeydown=function() { onKeyDown('iframe') }


				doc.onkeypress=function() { FKeyPress(); if(changed) { changed=false; return false } }


			}


		} else {


			if(findIgnore(fID[g])) return;wi=fID[g].contentWindow;iframedit=wi.document;iframedit.wi=wi


			if(up(iframedit.designMode)=="ON") {


				iframedit.addEventListener("keypress",ifMoz,false)


				iframedit.addEventListener("keydown",onKeyDown,true)


			}


		}


	}


}


}


function uglyF() { ugly=50;while(ugly<5000) {setTimeout("init()",ugly);ugly+=50} }


uglyF();document.onmousedown=function(e) { uglyF() }


