*** empty log message ***
[m17n/m17n-lib-js.git] / mim.js
diff --git a/mim.js b/mim.js
index 25d59e4..bb7f551 100644 (file)
--- a/mim.js
+++ b/mim.js
@@ -314,85 +314,65 @@ MIM.debug_print = function (event, ic)
   if (! MIM.debug_nodes)
     {
       MIM.debug_nodes = new Array ();
-      MIM.debug_nodes['status'] = document.getElementById ('status');
-      MIM.debug_nodes['range'] = document.getElementById ('range');
       MIM.debug_nodes['keydown'] = document.getElementById ('keydown');
       MIM.debug_nodes['keypress'] = document.getElementById ('keypress');
-      MIM.debug_nodes['keyseq'] = document.getElementById ('keyseq');
+      MIM.debug_nodes['status0'] = document.getElementById ('status0');
+      MIM.debug_nodes['status1'] = document.getElementById ('status1');
+      MIM.debug_nodes['keyseq0'] = document.getElementById ('keyseq0');
+      MIM.debug_nodes['keyseq1'] = document.getElementById ('keyseq1');
+      MIM.debug_nodes['range0'] = document.getElementById ('range0');
+      MIM.debug_nodes['range1'] = document.getElementById ('range1');
     }
   var target = event.target;
   var code = event.keyCode;
   var ch = event.type == 'keydown' ? 0 : event.charCode;
   var key = MIM.decode_key (event);
   var keyseq = "";
+  var index;
 
   MIM.debug_nodes[event.type].innerHTML = "" + code + "/" + ch + " : " + key;
-  MIM.debug_nodes['status'].innerHTML = ic.im.status;
+  index = (event.type == 'keydown' ? '0' : '1');
+  MIM.debug_nodes['status' + index].innerHTML = ic.im.status;
   for (var i = 0; i < ic.keyseq.length; i++)
     keyseq += ic.keyseq[i];
-  MIM.debug_nodes['keyseq'].innerHTML = keyseq + ":" + ic.keyseq.length;
-  MIM.debug_nodes['range'].innerHTML = "" + ic.range[0] + "," + ic.range[1];;
+  MIM.debug_nodes['keyseq' + index].innerHTML
+    = keyseq + ":" + ic.keyseq.length;
+  MIM.debug_nodes['range' + index].innerHTML
+    = "" + ic.range[0] + ":" + ic.range[1];
 };
 
 MIM.get_range = function (target, range)
 {
-  if (target.selectionStart != null)
+  if (target.selectionStart != null) // for Mozilla
     {
-      // for Mozilla
       range[0] = target.selectionStart;
       range[1] = target.selectionEnd;
-      return true;
     }
-  if (document.selection != null)
+  else                         // for IE
     {
-      target.focus();
-
-      var range = document.selection.createRange ();
-      var bookmark = range.getBookmark ();
-      var value = target.value;
-      var saved_value = value;
-      var marker = "_#_MARKER_#_";
-      while (value.indexOf (marker) != -1)
-        marker += "#_";
-      var parent = range.parentElement ();
-      if (parent == null || parent.type != "textarea")
-       {
-         range[0] = range[1] = 0;
-       }
-      else
-       {
-         range.text = marker + range.text + marker;
-         contents = this.element.value;
-         range[0] = contents.indexOf (marker);
-         contents = contents.replace(marker, "");
-         range[1] = contents.indexOf(marker);
-         target.value = originalContents;
-         range.moveToBookmark (bookmark);
-         range.select ();
-       }
-      return true;
+      var r = document.selection.createRange ();
+      var rr = r.duplicate ();
+
+      rr.moveToElementText (target);
+      rr.setEndPoint ('EndToEnd', range);
+      range[0] = rr.text.length - r.text.length;
+      range[1] = rr.text.length;
     }
-  return false;
-};
+}
 
 MIM.set_caret = function (target, pos)
 {
-  if(/*@cc_on ! @*/ false)     // IE
-    {
-      var range = target.createTextRange ();
-      range.move ('character', pos);
-      ranges.elect ();
-      return true;
-    }
   if (target.selectionStart != null) // Mozilla
     {
       target.focus ();
       target.setSelectionRange (pos, pos);
-      return true;
     }
-  // Unknown
-  target.focus ();
-  return false;
+  else                         // IE
+    {
+      var range = target.createTextRange ();
+      range.move ('character', pos);
+      range.select ();
+    }
 };
 
 MIM.ic = function (im, target)
@@ -401,7 +381,7 @@ MIM.ic = function (im, target)
   this.target = target;
   this.key = false;
   this.keyseq = new Array ();
-  this.range = new Array (-1, -1);
+  this.range = new Array (0, 0);
   return this;
 };
 
@@ -410,22 +390,17 @@ MIM.ic.prototype.reset = function ()
   this.key = false;
   while (this.keyseq.length > 0)
     this.keyseq.pop ();
-  this.range[0] = this.range[1] = -1;
 };
 
-MIM.ic.prototype.check_caret = function ()
+MIM.ic.prototype.check_range = function ()
 {
-  var from = this.range[0];
-  var to = this.range[1];
+  var from = this.range[0], to = this.range[1];
 
   MIM.get_range (this.target, this.range);
-  if (from >= 0)
-    {
-      if (this.range[0] != this.range[1] || to != this.range[0])
-       this.reset ();
-      else
-       this.range[0] = from;
-    }
+  if (this.range[0] != this.range[1] || to != this.range[1])
+    this.reset ();
+  else
+    this.range[0] = from;
 };
 
 MIM.insert = function (ic, insert)
@@ -453,7 +428,10 @@ MIM.handle_keyseq = function (event, ic)
     {
       MIM.insert (ic, map['_target_text']);
       if (! ('_has_child' in map))
-       ic.reset ();
+       {
+         ic.reset ();
+         ic.range[0] = ic.range[1];
+       }
       event.preventDefault ();
       //document.getElementById ('text').value
       //= keyseq_string (ic.keyseq) + " handled";
@@ -487,20 +465,21 @@ MIM.reset_ic = function (event)
 
 MIM.keydown = function (event)
 {
-  if (! (event.target.type == "text" || event.target.type == "textarea"))
+  var target = event.target;
+  if (! (target.type == "text" || target.type == "textarea"))
     return;
 
-  var ic = event.target.mim_ic;
+  var ic = target.mim_ic;
   if (! ic || ic.im != MIM.current_im)
     {
-      ic = new MIM.ic (MIM.current_im, event.target);
-      event.target.mim_ic = ic;
+      ic = new MIM.ic (MIM.current_im, target);
+      target.mim_ic = ic;
+      MIM.add_event_listener (target, 'blur', MIM.reset_ic);
     }
-  MIM.add_event_listener (event.target, 'blur', MIM.reset_ic);
-  MIM.debug_print (event, ic);
   if (ic.im.status < 0)
     return;
-  ic.check_caret ();
+  ic.check_range ();
+  MIM.debug_print (event, ic);
   ic.key = MIM.decode_key (event);
 };
 
@@ -512,20 +491,23 @@ MIM.keypress = function (event)
   var ic = event.target.mim_ic;
   var i;
 
-  MIM.debug_print (event, ic);
-  if (ic.im.status < 0)
-    return;
-  if (! ic.key)
-    ic.key = MIM.decode_key (event);
-  if (! ic.key)
-    {
-      ic.reset ();
+  try {
+    if (ic.im.status < 0)
       return;
-    }
-  ic.keyseq.push (ic.key);
-  if (ic.im.status == 1) // Still loading.
-    return;
-  MIM.handle_keyseq (event, ic);
+    if (! ic.key)
+      ic.key = MIM.decode_key (event);
+    if (! ic.key)
+      {
+       ic.reset ();
+       return;
+      }
+    ic.keyseq.push (ic.key);
+    if (ic.im.status == 1) // Still loading.
+      return;
+    MIM.handle_keyseq (event, ic);
+  } finally {
+    MIM.debug_print (event, ic);
+  }
   return;
 };
 
@@ -596,7 +578,7 @@ MIM.init = function ()
     MIM.server = 'http://localhost/mim';
   MIM.current_im = MIM.register ('latin', 'post', 'latn-post.js');
   MIM.register ('th', 'kesmanee', 'th-kesmanee.js');
-  MIM.load_sync (MIM.current_im);
+  MIM.load (MIM.current_im);
 };
 
 MIM.init_debug = function ()