//
// 王：
//
if (document.all && !document.getElementById) {
	document.getElementById = function(id) {
		return document.all[id];
	}
}

function imeGetForm() {
	// frmgg:
	return domGetfrmgg();
}

function imeGetEditArea() {
//return document.getElementById("editarea");
	// eit_area or q:
	var obj = document.getElementById("editarea");
	if(! obj)
	{
		obj = imeGetq();
  }
  return obj;
}

function imeSetFocusEditArea() {
	var obj = imeGetEditArea();
	if(obj)
	{
		obj.focus();
  }
	return 1;
}

function onload_justinput() {
	if (navigator.appName.indexOf('Microsoft') != -1) {
		browser = 'IE';
	} else if (navigator.appName.indexOf('Netscape') != -1) {
		browser = 'NS';
		var strBtn;
		if(locIsLangLocalFr())
		{
			strBtn = "Copier";
		}
		else if(locIsLangLocalCn())
		{
			strBtn = "拷贝";
		}
		else
		{
			strBtn = "Copy";
		}
		document.getElementById("copyall").value = strBtn;
	} else {
	//if (navigator.appName.indexOf('Opera') != -1) {
		browser = 'OP';
	}
	//imeSetFocusEditArea();
	//frm.shanchu.disabled = true;
	document.getElementById("codefield").innerHTML = "　";
	document.getElementById("listarea").innerHTML = "　";
}

var codefield = "";
var candidates = "";
code_len = 12;
code_table = new Array();
pattern = /[a-z';]+[^a-z';]+/g;
pattern.compile("[a-z';]+[^a-z';]+", "g");
// "raw" is defined in *-table.js
while (pattern.exec(raw) != null) code_table.push(RegExp.lastMatch);

word_list = new Array();
left_yinhao1 = false;
left_yinhao2 = false;
ctrl_keydown = false;
right_arrow = false;
cancel_key_event = false;
start_mem = -1;
index_mem = 0;
start_stack = new Array();
index_stack = new Array();
key_en = "1234567890abcdefghijklmnopqrstuvwxyz";
key_EN = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
key_quan = "１２３４５６７８９０ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ";
key_QUAN = "！＠＃＄％∧＆＊（）ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ";
//
// 1 punct, 2 math, 3 num, 4 spec, 5 table, 6 greek, 7 russian, 8 pinyin,
// 9 zhuyin, 10 hiragana, 11 hatagana, 12 arabic, 13 hebrew, 14 korean:
//←→↑↓↖↗↘↙↔↕
fuhao = new Array();
fuhao[1] = "。，、；：？！…—·ˉˇ¨‘’“”々～‖∶＂＇｀｜〃〔〕〈〉《》「」『』．〖〗【】（）［］｛｝︵︶︹︺︿﹀︽︾﹁﹂﹃﹄︻︼︷︸︱︳︴";
fuhao[2] = "≈≡≠＝≤≥＜＞≮≯∷±＋－×÷／∫∮∝∞∧∨∑∏∪∩∈∵∴⊥∥∠⌒⊙≌∽√≒≦≧⊿";
fuhao[3] = "ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅩⅪⅫ⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩";
fuhao[4] = "￥￠￡℅℉㎡℃♂♀°′″¤‰§№☆★○●◎◇◆□■△▲▼▽◢◣◤◥※→←↑↓↖↗↘↙↔↕〓＿￣―☉⊕〒";
fuhao[5] = "─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▓▔▕";
fuhao[6] = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω";
fuhao[7] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщыьэюя";
fuhao[8] = "āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜü";
fuhao[9] = "ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˊˇˋ";
fuhao[10] = "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん";
fuhao[11] = "ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ";
fuhao[12] = "ﺍﺏﺕﺙﺝﺡﺥﺩﺫﺭﺯﺱﺵﺹﺽﻁﻅﻉﻍﻑﻕﻙﻝﻡﻥﻩﻭﻱ" + "ء";
fuhao[13] = "אבבּגדהוזחטיככּךלמנסעפפּצקרששׁשׂתםןףץְֱֲֳִֵֶַָֹֻּֽ֑֔וֹוּ׳״־׀׃";
fuhao[14] = "ᄀᄁᄂᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎᄏᄐᄑ하악안알암압앙앞애액앵야얀약양어억언얼엄업엉에여역연열염엽영예오옥온올옴옹와완왈왕왜외왼요욕용우욱운울움웅워원월위유육윤율융윷으은을음읍응의이익인일임입잉잎";

pattern.compile("[^a-z';]");
function search_code_table(str) {
	var start = -1;
	var low = 0;
	var high = code_table.length - 1;
	var str_len = str.length;
	while (low <= high) {
		var mid = Math.floor((low+high)/2);
		var code = code_table[mid].substr(0, code_table[mid].search(pattern));
		if (code.substr(0,str_len) == str) {
			start = mid;
			high = mid-1;
		}
		else if (code.substr(0,str_len) > str) high = mid-1;
		else low = mid+1;
	}
	return(start);
}

function create_word_list(start, index, str) {
	var str_len = str.length;
	var cnt = 1;
	var same_code_words = code_table[start].replace(/[a-z';]+/, '').split(',');
	candidates = "";
	while (cnt <= 10) {
		candidates += (cnt % 10) + '.' + same_code_words[index] + ' ';
		word_list[cnt-1] = same_code_words[index];
		++index;
		if (index >= same_code_words.length) {
			index = 0;
			++start;
			if (start >= code_table.length || code_table[start].substr(0, str_len) != str) {
				start = -1;
				break;
			}
			same_code_words = code_table[start].replace(/[a-z';]+/, '').split(',');
		}
		++cnt;
	}
	if (start > 0) {
		if (start_stack.length > 1) {
			candidates += '<PgUp  PgDn>';
		} else {
			candidates += ' PgDn>';
		}
	} else if (start_stack.length > 1) {
		//for (i=cnt+1; i<=10; i++) document.form1.listarea.value += '\n';
		candidates += '<PgUp';
	} else {
		candidates += '';//FIXME';
	}
	start_mem = start;
	index_mem = index;
	document.getElementById("listarea").innerHTML = candidates + "　"; 
}

function on_code_change(str){
	for (i=0;i<=9;i++) {
		word_list[i] = "";
	}
	candidates = "";
	start_stack = new Array();
	index_stack = new Array();
	if (str != "") {
		start = search_code_table(str);
		start_stack.push(start);
		index_stack.push(0);
		if (start >= 0) create_word_list(start, 0, str);
	}
	document.getElementById("codefield").innerHTML =  str + "　";
	document.getElementById("listarea").innerHTML =  candidates + "　";
}

function insert_char(str) {
	if (str == "") return;
  var obj = imeGetEditArea();
	switch (browser) {
		case 'IE':
			var r = document.selection.createRange();
			r.text=str;
			r.select();
			break;
		case 'NS':
			var selectionStart = obj.selectionStart;
			var selectionEnd = obj.selectionEnd;
			var oldScrollTop = obj.scrollTop;
			var oldScrollHeight = obj.scrollHeight;
			var oldLen = obj.value.length;
			
			obj.value = obj.value.substring(0, selectionStart) + str + obj.value.substring(selectionEnd);
			obj.selectionStart = obj.selectionEnd = selectionStart + str.length;
			if (obj.value.length == oldLen) {
				obj.scrollTop = obj.scrollHeight;
			} else if (obj.scrollHeight > oldScrollHeight) {
				obj.scrollTop = oldScrollTop + obj.scrollHeight - oldScrollHeight;
			} else {
				obj.scrollTop = oldScrollTop;
			}
			break;
		default:
			obj.value += str;
	}
}

function key_down(e) {
	//
	var frm = imeGetForm();
	//
	// return true to validate input character:
	//
  if (! frm) {
    return true;
	}
	//
	var key = e.which ? e.which : e.keyCode;
	//
	if (key!=33 && key!=57383 && key!=34 && key!=57384) {
		if (frm.select1.selectedIndex!=0) {
			frm.select1.selectedIndex=0;
		}
	}
	var key_char = String.fromCharCode(key);
//alert("key_down(): key_char="+key_char);	
	ctrl_keydown = false;
	switch (key) {
		// Backspace
		case 8:
			if (codefield != "") {
				var str = codefield;
				codefield = str.substr(0, str.length-1);
				on_code_change(codefield);
				cancel_key_event = true;
				return false;
			}
			return true;
		// Tab
		case 9:
			insert_char('　');
			cancel_key_event = true;
			return false; 
		// Esc
		case 27:
			clear_all();
			cancel_key_event = true;
			return false;
		// PageUp
		case 33:
		case 57383:
			if (codefield != "") {
				if(start_stack.length > 1) {
					start_stack.pop();	index_stack.pop();
					create_word_list(start_stack[start_stack.length-1], index_stack[index_stack.length-1], codefield);
				}
				cancel_key_event = true;
				return false;
			}
/*			else if (getEl("iFrame").num != undefined) {
				if (getEl("iFrame").start > 0) {
					last_page();
					cancel_key_event = true;
					return false;
				}
			}*/
			return true;
		// PageDown
		case 34:
		case 57384:
			if (codefield != "") {
				if (start_mem != -1) {
					start_stack.push(start_mem);
					index_stack.push(index_mem);
					for(i=0; i<=9; i++) {
						word_list[i] = "";
					}
					create_word_list(start_mem, index_mem, codefield);
				}
				cancel_key_event = true;
				return false;
			}
			/*else if (getEl("iFrame").num != undefined) {
				if ((getEl("iFrame").shurufa=='bihua' && getEl("iFrame").num>100) || (getEl("iFrame").shurufa!='bihua' && getEl("iFrame").num>36)) {
					next_page();
					cancel_key_event = true;
					return false;
				}
			}*/
			return true;
		// Space
		case 32:
			if (codefield != "") {
				insert_char(word_list[0]);
				codefield = "";
				document.getElementById("codefield").innerHTML = "　";
				candidates = "";
				document.getElementById("listarea").innerHTML = "　";
				cancel_key_event = true;
				return false;
			} /*else if (getEl("iFrame").num != undefined) {
				insert_char(getEl("iFrame").words[0]);
				blank_page();
				cancel_key_event = true;
				return false;
			}*/
			return true;
		// Enter
		case 13:
			if (codefield!="") {
				//wait_message();
				//str = "?shurufa="+shurufa+"&para2="+jianfan+"&para3="+codefield.toLowerCase()+"&start=0";
				//getEl("iFrame").location.replace(str);
				cancel_key_event = true;
				return false;
			}
			return true;
		// Ctrl
		case 17:
		case 57402:
			ctrl_keydown = true;
			break;
	}
	
	if (e.ctrlKey) return true;

	if (/\d/.test(key_char)) {
		if (e.shiftKey) {
			if (frm.fullshape.checked || frm.chenswitch[0].checked) {
				if (frm.chenswitch[0].checked && key_char=='4') insert_char('￥');
				else {
					pos = key_EN.indexOf(key_char);
					insert_char(key_QUAN.substr(pos,1));
				}
				cancel_key_event = true;
				return false;
			}
		} else {
			if (codefield == "") {
			/*	if (getEl("iFrame").num != undefined) {
					if(key_en.indexOf(key_char) < getEl("iFrame").num) {
						insert_char(getEl("iFrame").words[key_en.indexOf(key_char)]);
						blank_page();
					}
					cancel_key_event = true;
					return false;
				} else if (frm.fullshape.checked || frm.chenswitch[0].checked) {
					pos = key_EN.indexOf(key_char);
					insert_char(key_quan.substr(pos,1));
					cancel_key_event = true;
					return false;
				}*/
			} else {
				if (frm.chenswitch[0].checked) {
					insert_char(word_list[(9+parseInt(key_char))%10]);
					codefield = "";
					document.getElementById("codefield").innerHTML = "　";
					candidates = "";
					document.getElementById("listarea").innerHTML = "　";
					cancel_key_event = true;
					return false;
				}
			}
		}
		return true;
	}

	if (frm.fullshape.checked || frm.chenswitch[0].checked) {
//		if ((key>=186 && key<=192) || (key>=219 && key<=222) ) {
		if (key == 186 || (key>=188 && key<=192) || (key>=219 && key<=222) ) {
			if (key == 186) {
				if (frm.chenswitch[0].checked) {
					if (e.shiftKey) insert_char('：');
					else if (codefield == "") insert_char('；');
					else return true;
				} else {
					insert_char( e.shiftKey ? '：' : '；' );
				}
			}
//			else if (key == 187) insert_char( e.shiftKey ? '＋' : '＝' );
			else if (key == 188) insert_char( e.shiftKey ? ((frm.chenswitch[0].checked)? '《' :'〈') : '，' );
			else if (key == 189) insert_char( e.shiftKey ? '＿' : '－' );
			else if (key == 190) insert_char( e.shiftKey ? ((frm.chenswitch[0].checked)? '》' :'〉') : (frm.chenswitch[0].checked)? '。' :'．');
			else if (key == 191) insert_char( e.shiftKey ? '？' : '／' );
			else if (key == 192) insert_char( e.shiftKey ? '～' : '｀' );
			else if (key == 219) insert_char( e.shiftKey ? '｛' : '〔' );
			else if (key == 220) insert_char( e.shiftKey ? '│' : (frm.chenswitch[0].checked)? '、' :'＼');
			else if (key == 221) insert_char( e.shiftKey ? '｝' : '〕' );
			else {
				if (frm.chenswitch[0].checked) {
					if (e.shiftKey) insert_char( (left_yinhao2 = !left_yinhao2) ? '“' : '”' );
					else if (codefield == "") insert_char( (left_yinhao1 = !left_yinhao1) ? '‘' : '’' );
					else return true;
				} else {
					insert_char( e.shiftKey ? '＂' : '＇' );
				}
			}
			cancel_key_event = true;
			return false;
		}
		if (frm.chenswitch[1].checked && key == 187) {
			insert_char( e.shiftKey ? '＋' : '＝' );
			cancel_key_event = true;
			return false;
		}
	}    
	
	if (browser == 'NS') {
		if (frm.fullshape.checked || frm.chenswitch[0].checked) {
			if (key == 59) {
				if (frm.chenswitch[0].checked) {
					if (e.shiftKey) insert_char('：');
					else if (codefield == "") insert_char('；');
					else return true;
				} else {
					insert_char( e.shiftKey ? '：' : '；' );
				}
				cancel_key_event = true;
				return false;
			}
			else if (key == 61) {
				if (frm.chenswitch[1].checked) {
					insert_char( e.shiftKey ? '＋' : '＝' );
					cancel_key_event = true;
					return false;
				}
			}
			else if (key == 109) {
				insert_char( e.shiftKey ? '＿' : '－' );
				cancel_key_event = true;
				return false;
			}
		}
	}

	right_arrow = (key == 39)? true : false;
	
	return(true);
}

function key_up(e) {
	var key = e.which ? e.which : e.keyCode;
	// Ctrl
	if (key == 17 || key == 57402) {
		if (ctrl_keydown == true) {
    	var frm = imeGetForm();
			if (frm.chenswitch[0].checked) {
				frm.chenswitch[1].checked = true;
				clear_all();
			}
			else frm.chenswitch[0].checked = true;
		}
	}
	return true;
}

function highlight_copy() {
	var obj = imeGetEditArea();
	/*
	if (browser == 'IE') {
		str_len = obj.value.length;
		obj.value += '';
		range = obj.createTextRange();
		range.execCommand("Copy");
		obj.value = obj.value.substr(0,str_len);
	} else if (obj.value.indexOf('ip138.com') == -1) {
		obj.value += '';
	}
	obj.select();
	*/
	//return clpCopyById(obj.id);
	return clpCopyObject(obj);
}

function clear_all() {
	codefield = "";
	document.getElementById("codefield").innerHTML = "　";
	candidates = "";
	document.getElementById("listarea").innerHTML = "　";
}

function key_press(e) {
	var key = e.which ? e.which : e.keyCode;
	var key_char = String.fromCharCode(key);
/*
 * this will ignore each first letter for next word: 01-APR-2011.
alert("key_press(): key_char="+key_char+",browser="+browser+",cancel_key_event="+cancel_key_event);	
	if (browser == 'NS' || browser == 'OP') {
		if (cancel_key_event) {
			cancel_key_event = false;
			return false;
		}
	}
*/	
	if (e.ctrlKey) return true; 

	var frm = imeGetForm();
  if (! frm) {
	  return true;
  }
	if (/[A-Z]/.test(key_char)) {
		if (frm.chenswitch[1].checked) {
			if (frm.fullshape.checked) {
				pos = key_EN.indexOf(key_char)
				insert_char(key_QUAN.substr(pos,1));
				return false;
			}
			return true;
		}
		else key_char = key_char.toLowerCase();
	}
	
	if (/[a-z';]/.test(key_char) && !right_arrow) {
		/*if (/[a-z]/.test(key_char) && getEl("iFrame").num != undefined) {
			if(key_en.indexOf(key_char) < getEl("iFrame").num) {
				insert_char(getEl("iFrame").words[key_en.indexOf(key_char)]);
				blank_page();
			}
			return false;
		}*/
		if (frm.chenswitch[1].checked) {
			if (frm.fullshape.checked) {
				pos = key_en.indexOf(key_char)
				insert_char(key_quan.substr(pos,1));
				return false;
			}
			return true;
		} else {
			if (codefield.length < code_len) {
				codefield += key_char;
				on_code_change(codefield);
			}
			return false;
		}
	}
	
	if (browser == 'NS' && (key == 47 || key == 63)) {
		if (frm.chenswitch[0].checked || frm.fullshape.checked) return false;
	}

	return true;
}

function imeDispFuhaoBySelect(selObj) {
	var sOut="";
	if(selObj.selectedIndex <= 0) return;
	for(var i=0;i<fuhao[selObj.selectedIndex].length;i++){
		sOut += '<input name="'+i+'" type="button" style="height: 18pt;font-size: 12pt" value="'+fuhao[selObj.selectedIndex].substr(i,1)+'" onClick="insertHTML(\''+fuhao[selObj.selectedIndex].substr(i,1)+'\' )"> ';
	}
	document.getElementById("button_field").innerHTML = sOut;
	var h = document.body.scrollHeight-document.body.clientHeight;
	window.resizeBy(0,h);
	imeSetFocusEditArea();
}

function imeDispFuhaoBySelectValue(strVal) {
	if(strVal == "") {
		 return false;
	}
	var obj = document.getElementById("select1");
	if(obj) {
		obj.value = strVal;
	  return imeDispFuhaoBySelect(obj);
	}
  return false;
}

function insertHTML(html){
	if(html=="")return;
	imeSetFocusEditArea();
	insert_char(html);
}

//
function imeDoOnClickHanzi() {
	var frm = imeGetForm();
	if (frm.chenswitch[0].checked) {
		if(frm.elements["langpair"])
		{
		  ggtSetElementXValue("langpair", "zh|" + locGetLangByNavigator());
		}
  }
}

//
function imeDoUpdateHanziRadioByLangpair() {
  var strLangFrom = ggtGetLangFrom();
	if(strLangFrom != "")	{
		var i;
  	if(strLangFrom == "zh")	{
	    i = 0;
    }
    else
    {
	    i = 1;
    }
    var frm  = imeGetForm();
    frm.chenswitch[i].checked = true;
    return true;
  }
  return false;
}

//
function imeSaveAsFile() {
 //frm = frm.elements;  //  reduce overhead

  var w = window.frames.w;
  if( !w ) {
    w = document.createElement( 'iframe' );
    w.id = 'w';
    w.style.display = 'none';
    document.body.insertBefore( w, null );
    w = window.frames.w;
    if( !w ) {
      w = window.open( '', '_temp', 'width=100,height=100' );
      if( !w ) {
        window.alert( 'Sorry, the file could not be created.' );
        return false;
      }
    }
  }
  var d = w.document;
  //ext = frm.ext.options[frm.ext.selectedIndex],
  //name = frm.filename.value.replace( /\//g, '\\' ) + ext.text;
  var strFilename = "hanzi.txt";
//
  d.open('text/plain', 'replace');
// d.charset = ext.value;
  d.charset = "utf-8";
//
//if( ext.text==='.txt' ) {
//  d.write( frm.txt.value );
//  d.close();
// } else {  //  '.html'
//  d.close();
//  d.body.innerHTML = '\r\n' + frm.txt.value + '\r\n';
// }
//
 	var obj = imeGetEditArea();
  d.write(obj.value);
  d.close();

  if(d.execCommand('SaveAs', null, strFilename )){
    window.alert(strFilename + ' has been saved.');
  } else {
    window.alert('The file has not been saved under ' + navigator.userAgent + '.');
  }
  w.close();
  //  don't submit the form
  return false;
}
