for reference see 3.2 in http://unicode.org/reports/tr9/
function _getCharType(ch) {
      var charCode = ch.charCodeAt(),
          range = charCode >> 8,
          rangeIdx = _UNICODE_RANGES_MAP[range];

      if (rangeIdx !== undefined) {
        return _UNICODE_TYPES[rangeIdx * 256 + (charCode & 0xFF)];
      } else if (range === 0xFC || range === 0xFD) {
        return "AL";
      } else if (_LTR_RANGES_REG_EXPR.test(range)) {
        //unlikely case
        return "L";
      } else if (range === 8) {
        // even less likely
        return "R";
      }

      return "N"; //undefined type, mark as neutral
    }