/* * AVIM JavaScript Vietnamese Input Method Source File dated 06-08-2007 * * Copyright (C) 2004-2007 Hieu Tran Dang * Website: http://hdang.co.uk * * 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, 4=VIQR* on_off=1 //Start AVIM on dockspell=1 //Start AVIM with spell checking on dauCu=1 //Start AVIM with old way of marking accent (o`a, o`e, u`y) useCookie=1 //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,attached=new Array() 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,specialChange=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="",nnc;oc=obj;uni2=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(D2.indexOf(up(key))>=0) nnc=true else nnc=false if((!w)||(obj.sel)) return main(w[0],key,w[1],uni,nnc) if(!dockspell) w=mozGetText(obj) if((w)&&(uni2)&&(!changed)) main(w[0],key,w[1],uni2,nnc) } else { obj=ieGetText(obj) if(obj) { var sT=obj.cW.text w=main(obj.cW.text,key,0,uni,false) if((uni2)&&((w==sT)||(typeof(w)=='undefined'))) w=main(obj.cW.text,key,0,uni2,false) 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=0) { var ret=sr(w,k,i); got=true if(ret) return ret } else if(uk==Z) { sf=repSign(null) for(h=0;h=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=0) for(a=0;a=0) return true for(b=0;b=0) next=false if((next)&&((gi.indexOf(notViet[b])<0)||(a<=0)||(uw2.substr(a-1,1)!='G'))) return true } } } for(b=0;b=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;z0)&&(uk=='E')) check=false if((them.indexOf(uk)>=0)&&(check)) { for(a=0;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;a4) 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=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=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=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=0)) return g else if(tE.indexOf(w.substr(w.length-g,1))>=0) { for(h=0;h=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=0) { operaV=agt.split(" ");operaVersion=parseInt(operaV[operaV.length-1]) if(operaVersion>=8) is_opera=true else { operaV=operaV[0].split("/");operaVersion=parseInt(operaV[1]) if(operaVersion>=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=0) w=w.substr(0,z)+rep.substr(io,1)+w.substr(z+1) } } return w } function findIgnore(el) { for(i=0;i0)) 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 function onKeyPress(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 if (!is_ie) e.preventDefault() else return false } } function attachEvt(obj,evt,handle,capture) { if(is_ie) obj.attachEvent("on"+evt,handle) else obj.addEventListener(evt,handle,capture) } attachEvt(document,"keydown",onKeyDown,false) attachEvt(document,"keypress",onKeyPress,false) function findF() { for(g=0;g