source: [view]
var LRM = '\u200E';
var elem = dojo.isIE ? event.srcElement : event.target;
var str1 = elem.value;
var ieKey = event.keyCode;
if((ieKey == dojo.keys.HOME)
|| (ieKey == dojo.keys.END)
|| (ieKey == dojo.keys.SHIFT)){
return;
}
var cursorStart, cursorEnd;
var selection = dojox.string.BidiComplex._getCaretPos(event, elem);
if(selection){
cursorStart = selection[0];
cursorEnd = selection[1];
}
//Jump over a cursor processing
if(dojo.isIE){
var cursorStart1 = cursorStart, cursorEnd1 = cursorEnd;
if(ieKey == dojo.keys.LEFT_ARROW){
if((str1.charAt(cursorEnd-1) == LRM)
&& (cursorStart == cursorEnd)){
dojox.string.BidiComplex._setSelectedRange(elem,cursorStart - 1, cursorEnd - 1);
}
return;
}
if(ieKey == dojo.keys.RIGHT_ARROW){
if(str1.charAt(cursorEnd-1) == LRM){
cursorEnd1 = cursorEnd + 1;
if(cursorStart == cursorEnd){
cursorStart1 = cursorStart + 1;
}
}
dojox.string.BidiComplex._setSelectedRange(elem, cursorStart1, cursorEnd1);
return;
}
}else{ //Firefox
if(ieKey == dojo.keys.LEFT_ARROW){
if(str1.charAt(cursorEnd-1) == LRM){
dojox.string.BidiComplex._setSelectedRange(elem, cursorStart - 1, cursorEnd - 1);
}
return;
}
if(ieKey == dojo.keys.RIGHT_ARROW){
if(str1.charAt(cursorEnd-1) == LRM){
dojox.string.BidiComplex._setSelectedRange(elem, cursorStart + 1, cursorEnd + 1);
}
return;
}
}
var str2 = dojox.string.BidiComplex.createDisplayString(str1, elem.alt);
if(str1 != str2)
{
window.status = str1 + " c=" + cursorEnd;
elem.value = str2;
if((ieKey == dojo.keys.DELETE) && (str2.charAt(cursorEnd)==LRM)){
elem.value = str2.substring(0, cursorEnd) + str2.substring(cursorEnd+2, str2.length);
}
if(ieKey == dojo.keys.DELETE){
dojox.string.BidiComplex._setSelectedRange(elem,cursorStart,cursorEnd);
}else if(ieKey == dojo.keys.BACKSPACE){
if((_str0.length >= cursorEnd) && (_str0.charAt(cursorEnd-1)==LRM)){
dojox.string.BidiComplex._setSelectedRange(elem, cursorStart - 1, cursorEnd - 1);
}else{
dojox.string.BidiComplex._setSelectedRange(elem, cursorStart, cursorEnd);
}
}else if(elem.value.charAt(cursorEnd) != LRM){
dojox.string.BidiComplex._setSelectedRange(elem, cursorStart + 1, cursorEnd + 1);
}
}