// Copyright (c) 2009-2021 Quadralay Corporation.  All rights reserved.
//

var Unicode = {};

Unicode.Break_CheckBreak_Sequence = function (ParamPrevious, ParamCurrent) {
  'use strict';

  var VarResult = true;

    if (ParamPrevious === ' ') {
      VarResult = false;
    }
    else if ((UnicodeInfo.Korean_L(ParamPrevious)) &&
             (UnicodeInfo.Korean_L(ParamCurrent))) {
      VarResult = false;
    }
    else if (((UnicodeInfo.Korean_L(ParamPrevious)) ||
             (UnicodeInfo.Korean_LV(ParamPrevious))) &&
             (UnicodeInfo.Korean_LV(ParamCurrent))) {
      VarResult = false;
    }
    else if ((UnicodeInfo.Korean_L(ParamPrevious))  ||
             (UnicodeInfo.Korean_LV(ParamPrevious)) &&
             (UnicodeInfo.Korean_V(ParamCurrent))) {
      VarResult = false;
    }
    else if ((UnicodeInfo.Korean_L(ParamPrevious)) &&
             (UnicodeInfo.Korean_LVT(ParamCurrent))) {
      VarResult = false;
    }
    else if ((UnicodeInfo.Korean_L(ParamPrevious))
             ||
             (UnicodeInfo.Korean_LV(ParamPrevious))
             ||
             (UnicodeInfo.Korean_V(ParamPrevious))
             ||
             (UnicodeInfo.Korean_LVT(ParamPrevious))
             ||
             (UnicodeInfo.Korean_T(ParamPrevious))
             &&
             (UnicodeInfo.Korean_T(ParamCurrent))) {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.ALetter(ParamPrevious))
                ||
              (UnicodeInfo.ABaseLetter(ParamPrevious))
                ||
              (UnicodeInfo.ACMLetter(ParamPrevious))
                ||
              (UnicodeInfo.Numeric(ParamPrevious))
                ||
              (UnicodeInfo.MidNum(ParamPrevious))
                ||
              (UnicodeInfo.MidNumLet(ParamPrevious))
                ||
              (UnicodeInfo.MidLetter(ParamPrevious))
                ||
              (UnicodeInfo.Katakana(ParamPrevious))
                ||
              (UnicodeInfo.Hiragana(ParamPrevious))
                ||
              (UnicodeInfo.Ideographic(ParamPrevious))
                ||
              (UnicodeInfo.Korean_L(ParamPrevious))
                ||
              (UnicodeInfo.Korean_LV(ParamPrevious))
                ||
              (UnicodeInfo.Korean_V(ParamPrevious))
                ||
              (UnicodeInfo.Korean_LVT(ParamPrevious))
                ||
              (UnicodeInfo.Korean_T(ParamPrevious))
                ||
              (UnicodeInfo.Extend(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.Extend(ParamCurrent))
              )
            )
    {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.ALetter(ParamPrevious))
                ||
              (UnicodeInfo.Extend(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.ALetter(ParamCurrent))
              )
            )

    {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.Katakana(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.Katakana(ParamCurrent))
              )
            )
    {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.Numeric(ParamPrevious))
                ||
              (UnicodeInfo.MidNumLet(ParamPrevious))
                ||
              (UnicodeInfo.MidLetter(ParamPrevious))
                ||
              (UnicodeInfo.Extend(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.ABaseLetter(ParamCurrent))
                ||
              (UnicodeInfo.ACMLetter(ParamCurrent))
              )
            )
    {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.ALetter(ParamPrevious))
                ||
              (UnicodeInfo.ABaseLetter(ParamPrevious))
                ||
              (UnicodeInfo.ACMLetter(ParamPrevious))
                ||
              (UnicodeInfo.Extend(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.MidNumLet(ParamCurrent))
                ||
              (UnicodeInfo.MidLetter(ParamCurrent))
              )
            )
    {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.ABaseLetter(ParamPrevious))
                ||
              (UnicodeInfo.ACMLetter(ParamPrevious))
                ||
              (UnicodeInfo.MidNum(ParamPrevious))
                ||
              (UnicodeInfo.MidNumLet(ParamPrevious))
                ||
              (UnicodeInfo.Numeric(ParamPrevious))
                ||
              (UnicodeInfo.Extend(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.Numeric(ParamCurrent))
              )
            )
    {
      VarResult = false;
    }
    else if (
              (
              (UnicodeInfo.Numeric(ParamPrevious))
                ||
              (UnicodeInfo.Extend(ParamPrevious))
              )
              &&
              (
              (UnicodeInfo.MidNum(ParamCurrent))
                ||
              (UnicodeInfo.MidNumLet(ParamCurrent))
              )
            )
    {
      VarResult = false;
    }
    else if (
             (
             (UnicodeInfo.Hiragana(ParamCurrent))
                 ||
             (UnicodeInfo.Ideographic(ParamCurrent))
             )
            )
    {
      VarResult = true;
    }

  return VarResult;
};

Unicode.CheckBreakAtIndex = function (ParamString, ParamIndex) {
  'use strict';

  var VarResult, VarPrevious, VarCurrent, VarNext;

  VarResult = false;

  if (ParamIndex < ParamString.length) {
    if (ParamString.length === 1) {
      VarResult = false;
    }
    else if (ParamString.length > 1) {
      // String is at least two characters long
      //
      if (ParamIndex === 0) {
        VarResult = false;
      }
      else {
        VarPrevious = ParamString.charAt(ParamIndex - 1);
        VarCurrent = ParamString.charAt(ParamIndex);

        VarResult = Unicode.Break_CheckBreak_Sequence(VarPrevious, VarCurrent);

        // Check ending
        //
        if (!VarResult) {
          // Ending with a middle character?
          //
          if ((UnicodeInfo.MidLetter(VarCurrent))
               ||
               (UnicodeInfo.MidNumLet(VarCurrent))
               ||
               (UnicodeInfo.MidNum(VarCurrent))) {
            // Check next character
            //
            if ((ParamIndex + 1) === ParamString.length) {
              // Break at end of search string
              //
              VarResult = true;
            }

            else {
              VarNext = ParamString.charAt(ParamIndex + 1);
              // Depends on the next character
              //
              VarResult = Unicode.Break_CheckBreak_Sequence(VarCurrent, VarNext);
            }
          }
        }
      }
    }
  }

  return VarResult;
};