// Description(1033): Select ", list" in the line "tmp32, list12, Arr2, NumL" and use the script
// Description(1049): Выделите ", list" в строке "tmp32, list12, Arr2, NumL" и используйте скрипт
//
// Usage:
//   Call("Scripts::Main", 1, "DuplicateSelCycle.js")

var sSelText=AkelPad.GetSelText();
if (sSelText=="")
  WScript.Quit();
  // втихаря завершаем

var lenDel = 2; // задаём длину разделителя (1 без пробела, 2 с пробелом, например "," или ", ")
var hEditWnd = AkelPad.GetEditWnd();
var sTitle = "Duplicate";
var nWordWrap;
var oSys = AkelPad.SystemFunction();
 
var nSelStart = AkelPad.GetSelStart();
var nSelEnd = AkelPad.GetSelEnd();

SetRedraw(hEditWnd, false);

  //Disable Word Wrap
nWordWrap = SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0)
  AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

var nLine1 = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nSelStart);
var nLine2 = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nSelEnd);
if (nLine1 != nLine2)
{
SetRedraw(hEditWnd, true);
WScript.Quit();
}

var nLineEnd = GetEndLine(nLine2);

if (nWordWrap > 0)
{
AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
SendMessage(hEditWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
}

var find2 = sSelText.substr(0,lenDel); /*берём 1 или 2 символа из выделенного*/
if (find2.length < 2)
{
SetRedraw(hEditWnd, true);
WScript.Quit();
}

//AkelPad.SetSel(nSelEnd, nLineEnd); // выделяем текст до конца строки
//var sSelText2=AkelPad.GetSelText(); // получаем текст до конца строки
var sSelText2 = AkelPad.GetTextRange(nSelEnd, nLineEnd); // получает текст до конца строки
var nPos = sSelText2.indexOf(find2, 0); // ищем в нём повтор
if (nPos == -1)
  nPos= nPos+1;

nPos = nSelEnd + nPos;

AkelPad.SetSel(nPos, nPos);
AkelPad.ReplaceSel(sSelText);
AkelPad.SetSel(nPos, nPos+sSelText.length);

SetRedraw(hEditWnd, true);


function SetRedraw(hWnd, bRedraw)
{
  SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  bRedraw && oSys.Call("User32::InvalidateRect", hWnd, 0, true);
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

function GetEndLine(nLine)
{
  return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0) + SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0), 0);
}
