// 2007/01/15  File Created
//
// This program is free software; you can use and redistribute it as you want.
// Check the last newly version at http://www.einstand.idv.tw

EinsUTF8Lib = function()   // CONSTRUCTOR for 'EinsUTF8Lib' object
{
}

EinsUTF8Lib.prototype.UTF16to8 = function(str)
{
   var sRet = "";
   var len = str.length;
   for (var i = 0; i < len; i++)
   {
      var c = str.charCodeAt(i);
      if ((c >= 0x0001) && (c <= 0x007F))
      {
         sRet += str.charAt(i);
      }
      else if (c > 0x07FF)
      {
         sRet += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
         sRet += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
         sRet += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
      }
      else
      {
         sRet += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
         sRet += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
      }
   }
   return sRet;
}

EinsUTF8Lib.prototype.UTF8to16 = function(str)
{
    var char2, char3;

    var sRet = "";
    var len = str.length;
    var i = 0;
    while (i < len)
    {
      var c = str.charCodeAt(i++);
      switch(c >> 4)
      {
         case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 0xxxxxxx
            sRet += str.charAt(i-1);
            break;
         case 12: case 13: // 110x xxxx   10xx xxxx
            char2 = str.charCodeAt(i++);
            sRet += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
            break;
         case 14: // 1110 xxxx  10xx xxxx  10xx xxxx
            char2 = str.charCodeAt(i++);
            char3 = str.charCodeAt(i++);
            sRet += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
            break;
      }
   }
   return sRet;
}