/***************************************************************************/
/* */
/* edit.js -- Version 1.2 */
/* */
/* Uyghur Unicode Input System -- edit file. */
/* */
/* Copyleft 2003-2004 by Muhammad Abdulla (muhammad@yulghun.com) */
/* */
/* Anyone is free to use and distribute this piece of software, provided */
/* that this copyright notice is retained. The author is not responsible */
/* for any damage caused by the usage of this software. */
/* */
/* Uyghurcha: */
/* Bu programmini harkim mushu nashir hoquqi sozini saqlap qalghan halda */
/* ishlatsa wa tarqatsa bolidu. Bu programmini tuzguchi ishlitishtin */
/* kilip chiqqan ziyangha masul bolmaydu. */
/* Pikirliringiz bolsa muhammad@yulghun.com digan addrisqa hat awating. */
/***************************************************************************/
var inited = 0 ;
var imode = 0 ; // input mode, default is Uyghur
var prevflag = 0 ;
var txtcpy = "" ;
//var editable = true ;
var isIE = false ;
var isGecko = false ;
var isMaxthon = false ;
function storeCaret ( content ) { // text area content
if ( content.createTextRange ) {
content.caretPos = document.selection.createRange().duplicate() ;
}
return true ;
};
function findSpecialString ( input )
{
// special character array, some cursor like chars so as not to disturb
// users much on slow computers.
// Return str should not part of the input string to locate cursor position
// correctly.
var scarr = "|Il!" ;
var esp = scarr.substr ( 0, 1 ) ;
var i ;
while ( input.indexOf ( esp ) != -1 ) {
i = Math.floor ( Math.random() * scarr.length ) ;
esp = esp + String.fromCharCode ( scarr.charCodeAt(i) ) ;
}
return esp ;
};
function insertAtContext ( content, charcode ) { // text area content
var tmp = "" ;
var prev_str = "", next_str = "" ;
var prev = -1, cur = -1, next =-1 ; // previous, current, next character codes
var repl = "" ; //replacement string
var line_no = 0 ; // which line we are at
var pos ;
var charcount = 1 ;
var esp = "" ;
var cursor_position = 0 ;
if ( (isIE && content.createTextRange && content.caretPos) ||
(isGecko && ( content.setSelectionRange || document.selection )) ) {
// clear selected text
if ( isIE ) {
document.selection.createRange().text = "" ;
} else if ( isGecko ) {
content.value = content.value.substring (0, content.selectionStart ) +
content.value.substr ( content.selectionEnd ) ;
}
// backup the current text content
tmp = content.value ;
if ( isIE ) {
// IE does not give cursor position.
// Insert a special character array and find its index to obtain cursor position
esp = findSpecialString ( tmp ) ;
content.caretPos.text = esp ;
cursor_position = content.value.indexOf ( esp );
prev_str = tmp.substring(0, cursor_position - 1 ); //string to the left
next_str = tmp.substr( cursor_position + esp.length ); //string to the right
} else if ( isGecko ) { // Mozilla gives range variables
cursor_position = content.selectionStart ;
prev_str = tmp.substring(0, cursor_position - 1 ); //string to the left
next_str = tmp.substr( cursor_position + 1 ); //string to the right
}
line_no = get_lineno ( prev_str ) ;
if ( cursor_position > 0 ) {
prev = tmp.charCodeAt ( cursor_position - 1 ) ;
charcount++ ;
}
if ( cursor_position < content.value.length - esp.length ) {
next = content.value.charCodeAt ( cursor_position + esp.length ) ;
charcount++ ;
}
cur = charcode ;
repl = getContextString ( prev, cur, next ) ;
tmp = prev_str + repl + next_str ;
content.value = tmp ;
pos = cursor_position + 1 - line_no ; // compensate for "\r\n"
pos = pos + repl.length - charcount ; // compensate for special joint letters: "LA", etc.
setSelectionRange ( content, pos, pos ) ;
}
};
function setSelectionRange(input, selectionStart, selectionEnd) {
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
} else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
};
// returns the number of newlines in a string
function get_lineno ( str )
{
var nl = "\r" ;
var index ;
var nolines = 0 ;
index = str.indexOf ( nl ) ;
while ( index != -1 ) {
nolines++ ;
index = str.indexOf ( nl, index + 1 ); //start search after last match found
}
return nolines ;
};
/*
* setHexText(str) -- returns HTML comaptible ASCII representation of str in &#ddddd; form
*/
function setHexText ( str ) {
var tmp = "" ;
var cstr = "" ;
var i, code ;
for ( i = 0 ; i < str.length ; i++ ) {
code = str.charCodeAt(i) ;
cstr = String.fromCharCode(code) ;
if ( code < 128 ) {
tmp += cstr ;
} else {
tmp += "&#" + code + ";" ;
}
}
return tmp ;
};
/*
* validate() -- This was originally used to check for invalid email addresses.
* It's kept to support email sending application by changing mail body and
* mail subject in Uyghur from UTF-8 to ASCII form ( &#dddd; ).
*/
function validate ( )
{
var t = document.forms.textform.mail ;
var us = document.forms.textform.usubject ;
var to = document.textform.to.value ;
var from = document.textform.from.value ;
document.textform.hex.value = setHexText ( t.value ) ;
document.textform.usubhex.value = setHexText ( us.value ) ;
};
function insertAtCaret ( content, text ) { // text area content, text to be inserted
if ( content.createTextRange && content.caretPos ) {
var cpos = content.caretPos ;
cpos.text = text ;
} else {
content.value = content.value + text ;
}
};
function proc_kp ( content, event ) {
var ev = event ;
var t = content ;
var ch, i, k, ch2 ;
var itoggle = false ; // input mode toggle
/*
if ( editable == false ) {
ev.returnValue = false ;
return false ;
}
*/
// if Contrl-k is pressed, toggle between input modes
if ( ev.ctrlKey ) {
if ( isIE ) {
k = ev.keyCode ;
if ( isMaxthon && k == 2 ) { // for Maxthon browser: Ctrl-B toggles imode
itoggle = true ;
}
// when "k" is pressed with "Control", the keyCode in IE is equal to 11, strange.
if ( k == 11 ) {
itoggle = true ;
}
} else if ( isGecko ) { // ev.which is equal to ascii code of "k" in Mozilla.
k = ev.which ;
if ( k == 107 ) {
itoggle = true ;
} else {
return true ;
}
}
if ( itoggle ) {
imode = 1 - imode ; // toggle input mode
ev.returnValue = false ;
return false;
}
}
if ( imode == 1 ) { // English
ev.returnValue = true ;
return true ;
}
if ( isIE ) {
// for text field, allow default behaviour for "Enter"
if ( ev.keyCode == 13 && t.type == "text" ) {
return true ;
} else {
insertAtContext ( t, ev.keyCode ) ;
}
} else if ( isGecko ) {
var kcode = ev.which ;
// for text field, allow default behaviour for "Enter"
if ( kcode == 13 && instanceOf ( t, HTMLTextAreaElement ) ) {
insertAtContext ( t, kcode ) ;
} else if ( kcode < 32 || kcode == 46 ) {
return true ;
} else {
insertAtContext ( t, kcode ) ;
}
}
ev.returnValue = false ;
return false ;
};
function instanceOf(object, class_name ) {
if ( isIE ) {
return ( eval ( "object instanceof class_name" ) ) ;
} else if ( isGecko ) {
while (object != null) {
if (object == class_name .prototype) {
return true
}
object = object.__proto__;
}
}
return false;
};
function proc_kd ( content ) {
var t = content ;
storeCaret( t ) ;
};
function proc_ku ( content, event ) {
var t = content ;
var kcode ;
storeCaret( t ) ;
kcode = event.keyCode ;
if ( kcode == 8 ) { // backspace key
insertAtContext ( t, -1 ) ;
} else if ( kcode == 46 ) { // delete key
insertAtContext ( t, -1 ) ;
}
//setPreviewText ( t.value ) ;
};
function selectLang ( langID )
{
var idx = document.getElementById(langID).selectedIndex ;
var selected = document.getElementById(langID).options[idx].value;
if ( selected == "English" ) {
imode = 1 ;
} else {
imode = 0 ;
}
};
function setFocus ( content ) {
if ( inited == 0 ) {
var flag = 1 ;
var i, code ;
var cstr ;
inited = 1 ;
t = content ;
// if all of the text is whitespace, set to blank
for ( i = 0 ; i < t.value.length ; i++ ) {
code = t.value.charCodeAt(i) ;
cstr = String.fromCharCode ( code ) ;
if ( cstr != " " && cstr != "\t" ) {
flag = 0 ;
break ;
}
}
if ( flag == 1 ) {
t.value = "" ;
}
}
};
function init () {
// detect browser
var ua = navigator.userAgent.toLowerCase();
isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)) ;
isGecko = (ua.indexOf("gecko") != -1 && ua.indexOf("safari") == -1) ;
isMaxthon = ((ua.indexOf("msie") != -1) && (ua.indexOf("maxthon") != -1)) ;
};