var Xex = {
LogNode: null,
+ LogNodeLen: 0,
Log: function (arg, indent, cont)
{
if (! Xex.LogNode)
return;
- if (typeof indent == 'number')
- return;
if (! arg)
- Xex.LogNode.value = '';
+ {
+ while (Xex.LogNode.childNodes.length > 0)
+ Xex.LogNode.removeChild (Xex.LogNode.firstChild);
+ LogNodeLen = 0;
+ }
else
{
- var str = '';
- if (! cont)
- {
- str = "\n";
- if (indent != undefined)
- for (var i = 0; i <= indent; i++)
- str += ' ';
- }
- Xex.LogNode.value += str + arg;
+ var node;
+ LogNodeLen++;
+ if (LogNodeLen >= 200)
+ node = Xex.LogNode.firstElement ();
+ else
+ node = document.createElement ('div');
+ if (indent != undefined)
+ node.style.textIndent = (indent + 1) + 'em';
+ else
+ node.style.textIndent = '0px';
+ node.innerText = LogNodeLen + ': ' + arg;
+ Xex.LogNode.appendChild (node);
Xex.LogNode.scrollTop = Xex.LogNode.scrollHeight;
}
}
var arglist = ''
var len = this.args.length;
var str = '<' + this.func.name;
- if (this.vari)
- str += ' vname="' + this.vari.name + '"';
+ if (this.vname)
+ str += ' vname="' + this.vname + '"';
if (len == 0)
return str + '/>';
if (this.func instanceof Xex.Subrountine)
from = rr.text.length - r.text.length;
to = rr.text.length;
}
- if (ic.range[0] == from && ic.range[1] == to
- && (to == from || target.value.substring (from, to) == ic.preedit))
+ if (from == to
+ && from == ic.range[0] + ic.cursor_pos
+ && (ic.preedit.length == 0
+ || ic.preedit == target.value.substring (ic.range[0], ic.range[1])))
return true;
+ Xex.Log ('reset ic');
+ ic.reset ();
ic.range[0] = from;
ic.range[1] = to;
return false;
-}
-
-MIM.set_caret = function (target, ic)
-{
- if (target.setSelectionRange) // Mozilla
- {
- var scrollTop = target.scrollTop;
- target.setSelectionRange (ic.range[0], ic.range[1]);
- target.scrollTop = scrollTop;
- }
- else // IE
- {
- var range = target.createTextRange ();
- range.moveStart ('character', ic.range[0]);
- range.moveEnd ('character', ic.range[1]);
- range.select ();
- }
-};
-
-MIM.update = function (target, ic)
-{
- var text = target.value;
- target.value = (text.substring (0, ic.range[0])
- + ic.produced
- + ic.preedit
- + text.substring (ic.range[1]));
- ic.range[0] += ic.produced.length;
- ic.range[1] = ic.range[0] + ic.preedit.length;
- MIM.set_caret (target, ic);
};
(function () {
+ var temp;
+
var style_props = {
width: 'width',
height: 'height',
to.style.height = from.offsetHeight;
}
+ MIM.get_preedit_pos = function (target, ic)
+ {
+ if (! temp)
+ {
+ temp = document.createElement ('div');
+ temp.style.visibility = 'hidden';
+ temp.style.position = 'absolute';
+ temp.appendChild (document.createElement ('span'));
+ temp.appendChild (document.createElement ('span'));
+ document.getElementsByTagName ('body')[0].appendChild (temp);
+ }
+ if (temp.ic != ic)
+ {
+ temp.ic = ic;
+ copy_style (target, temp);
+ ic.abs_top = 0;
+ ic.abs_left = 0;
+ for (var elm = target.offsetParent; elm; elm = elm.offsetParent)
+ {
+ ic.abs_top += elm.offsetTop;
+ ic.abs_left += elm.offsetLeft;
+ }
+ }
+ temp.firstChild.innerText = target.value.substr (0, ic.range[0]);
+ temp.lastChild.innerText = "." + target.value.substr (ic.range[0], ic.range[1]);
+ ic.abs_y = (ic.abs_top + temp.lastChild.offsetTop
+ + temp.lastChild.offsetHeight - target.scrollTop);
+ ic.abs_x0 = ic.abs_left + temp.lastChild.offsetLeft;
+ ic.abs_x1 = ic.abs_x0 + temp.lastChild.offsetWidth;
+ }
+}) ();
+
+MIM.set_caret = function (target, ic)
+{
+ if (ic.preedit.length > 0)
+ {
+ MIM.get_preedit_pos (target, ic);
+ if (! ic.bar)
+ {
+ ic.bar = document.createElement ('div');
+ ic.bar.style.position = 'absolute';
+ ic.bar.style.backgroundColor = "black";
+ ic.bar.style.minHeight = '1px';
+ document.getElementsByTagName ('body')[0].appendChild (ic.bar);
+ }
+ ic.bar.style.display = 'block'
+ ic.bar.style.top = (ic.abs_y + 1) + 'px';
+ ic.bar.style.left = ic.abs_x0 + 'px';
+ ic.bar.style.minWidth = (ic.abs_x1 - ic.abs_x0) + 'px';
+ }
+ else if (ic.bar)
+ ic.bar.style.display = 'none'
+};
+
+MIM.update = function (target, ic, for_focus_out)
+{
+ var text = target.value;
+ target.value = (text.substring (0, ic.range[0])
+ + ic.produced
+ + ic.preedit
+ + text.substring (ic.range[1]));
+ ic.range[0] += ic.produced.length;
+ ic.range[1] = ic.range[0] + ic.preedit.length;
+ MIM.set_caret (target, ic);
+ if (! for_focus_out)
+ {
+ var pos = ic.range[0] + ic.cursor_pos;
+ if (target.setSelectionRange) // Mozilla
+ {
+ var scrollTop = target.scrollTop;
+ target.setSelectionRange (pos, pos);
+ target.scrollTop = scrollTop;
+ }
+ else // IE
+ {
+ var range = target.createTextRange ();
+ range.moveStart ('character', pos);
+ range.moveEnd ('character', pos);
+ range.select ();
+ }
+ }
+};
+
+(function () {
MIM.show = function (ic)
{
if (! ic.candidates)
return;
var target = ic.target;
- if (! ic.div_node)
+ MIM.get_preedit_pos (target, ic);
+ if (! ic.can_node)
{
- ic.target_top = 0;
- ic.target_left = 0;
- for (var elm = ic.target.offsetParent; elm; elm = elm.offsetParent)
- {
- ic.target_top += elm.offsetTop;
- ic.target_left += elm.offsetLeft;
- }
- ic.div_node = document.createElement ('div');
- copy_style (target, ic.div_node);
- ic.div_node.style.visibility="hidden";
- ic.div_node.style.position = "absolute";
- document.getElementsByTagName ('body')[0].appendChild (ic.div_node);
- ic.div_node_first = document.createElement ('span');
- ic.div_node_last = document.createElement('span');
- ic.div_node_last.innerHTML = '.';
- ic.div_node.appendChild (ic.div_node_first);
- ic.div_node.appendChild (ic.div_node_last);
ic.can_node = document.createElement ('table');
ic.can_node.style.position = 'absolute';
ic.can_node.style.display = 'none';
tr.appendChild (td);
}
ic.can_node.appendChild (tr);
- ic.div_node_first.innerHTML = target.value.substr (0, ic.range[0]);
- var x = ic.target_left + ic.div_node.lastChild.offsetLeft;
- var y = (ic.target_top + ic.div_node.lastChild.offsetTop
- + ic.div_node.lastChild.offsetHeight - target.scrollTop + 10);
- ic.can_node.style.left = x + 'px';
- ic.can_node.style.top = y + 'px';
+ ic.can_node.style.top = (ic.abs_y + 10) + 'px';
+ ic.can_node.style.left = ic.abs_x0 + 'px';
}
else
{
{
var target = event.target;
var ic = target.mim_ic;
- if (ic.wait_update == true)
- {
- Xex.Log ("Focus in " + target.tagName + ' IGNORED');
- event.preventDefault ();
- return false;
- }
Xex.Log ("Focus in " + target.tagName);
+ MIM.get_range (target, ic)
ic.Filter (MIM.Key.FocusIn);
- function up () {MIM.update (target, ic);}
- setTimeout (up, 100);
+ setTimeout (function () { MIM.update (target, ic, false); }, 100);
+ return true;
}
MIM.focus_out = function (event)
{
var target = event.target;
var ic = target.mim_ic;
- function reset_update () { ic.wait_update = false; };
- if (ic.wait_update == true)
- {
- Xex.Log ("Focus out " + target.tagName + ' IGNORED');
- event.preventDefault ();
- return false;
- }
Xex.Log ("Focus out " + target.tagName);
ic.Filter (MIM.Key.FocusOut);
- ic.wait_update = true;
MIM.update (target, ic, true);
- setTimeout (reset_update, 1000);
+ return true;
};
MIM.keydown = function (event)
{
var target = event.target;
- if (target.id == 'log')
- return;
if (! (target.type == "text" || target.type == "textarea"))
return;
Xex.Log ('creating IC');
ic = new MIM.IC (MIM.current, target);
if (ic.im.load_status != MIM.LoadStatus.Loaded)
- return;
+ return true;
target.mim_ic = ic;
MIM.add_event_listener (target, 'focus', MIM.focus_in);
MIM.add_event_listener (target, 'blur', MIM.focus_out);
- MIM.get_range (target, ic)
- }
- else
- {
- if (! MIM.get_range (target, ic))
- ic.reset ();
}
+ MIM.get_range (target, ic)
MIM.debug_print (event, ic);
ic.key = MIM.decode_key_event (event);
if (ic.key)
Xex.Log ('Error' + e);
throw (e);
}
- MIM.update (target, ic);
+ MIM.update (target, ic, false);
if (! ic.key_unhandled)
event.preventDefault ();
}
MIM.keypress = function (event)
{
var target = event.target;
- if (target.id == 'log')
- return;
if (! (target.type == "text" || target.type == "textarea"))
return;
Xex.Log ('Error:' + e);
throw (e);
}
- MIM.update (target, ic);
+ MIM.update (target, ic, false);
if (! ic.key_unhandled)
event.preventDefault ();
} catch (e) {
function destroy_menu () {
if (! destroy_timer)
destroy_timer = setTimeout (destroy, 1000);
+ return true;
}
function show_submenu (event)
{
+ var target = event.target;
+ if (! target.menu_level)
+ {
+ if (! target.parentNode || ! target.parentNode.menu_level)
+ return true;
+ target = target.parentNode;
+ }
if (destroy_timer)
{
clearTimeout (destroy_timer);
destroy_timer = null;
}
- var target = event.target;
- if (! target.menu_level)
- return;
if (last_target && target.parentLi != last_target)
{
last_target.style.backgroundColor = 'white';
function select_im (event)
{
var target = event.target;
+ if (! target.im)
+ {
+ if (! target.parentNode || ! target.parentNode.menu_level)
+ {
+ event.preventDefault ();
+ return false;
+ }
+ target = target.parentNode;
+ }
if (target.im)
{
MIM.current = target.im;
menu.style.fontFamily = 'sans-serif';
menu.style.fontWeight = 'bold';
menu.id = 'mim-menu';
- menu.onclick = select_im;
+ menu.onmousedown = select_im;
menu.onmouseover = show_submenu;
menu.onmouseout = destroy_menu;
for (var catname in lang_category)
MIM.init_debug = function ()
{
MIM.debug = true;
- Xex.LogNode = document.getElementById ('log');
+ Xex.LogNode = document.getElementById ('xexlog');
Xex.Log (null);
MIM.init ();
};