const removeWhitespaceButton = document.getElementById("removeWhitespaceButton");
const downtenkiButton = document.getElementById("downtenkiButton");
const uptekiButton = document.getElementById("uptekiButton");
const adjustClearButton = document.getElementById("adjustClearButton");
const downloadButton =  document.getElementById("downloadButton");
const adjustLineBreaksButton=  document.getElementById("adjustLineBreaksButton");
const newlineMarkButton =  document.getElementById("newlineMarkButton");
const trimRowTopButton =  document.getElementById("trimRowTopButton");
const trimRowLastButton =  document.getElementById("trimRowLastButton");
const removeLineBreaksButton =  document.getElementById("removeLineBreaksButton");
const copyTextButton= document.getElementById("copyTextButton");
const delShortRowToolButton= document.getElementById("delShortRowToolButton");
const removeCotnNlButton= document.getElementById("removeCotnNlButton");

const lineThreshold = document.getElementById("lineThreshold");
const adjText = document.getElementById("adjText");
const adjText2= document.getElementById("adjText2");
const nwlnmark = document.getElementById("nwlnmark");
const regexStrInput = document.getElementById("regexStrInput");

const NowRowSpan = document.getElementById("NowRowSpan");

const back_data_turns = 999;
var textforback=[]

/*
// 🍞連続改行削除ボタン OLD
removeCotnNlButton.addEventListener("click", () => {
  textforback.push(adjText.value);

//ボタンの効果
botton_click_anime(removeWhitespaceButton, 100)

// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false
    console.log(textforback)
  adjText.value = adjText.value.replace(/[\r\n]{3,}/gm, "\n\n");
  adjText.value = adjText.value.replace(/[\r]{3,}/gm, "\n\n");
  adjText.value = adjText.value.replace(/[\n]{3,}/gm, "\n\n");
  });
*/

// 🍚new連続改行削除　選択範囲
removeCotnNlButton.addEventListener("click", () => {
  //ボタンの効果
 botton_click_anime(removeWhitespaceButton, 100)
  
// 選択範囲の開始位置と終了位置を取得
const start = adjText.selectionStart;
const end = adjText.selectionEnd;

textforback.push([adjText.value, start, end]);
// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false

// テキストエリアの選択範囲のテキストを取得
const selectedText = adjText.value.substring(start, end);

// 全角スペースと半角スペースを削除したテキストを作成
var updatedText
   updatedText = selectedText.replace(/[\r\n]{3,}/gm, "\n\n");
   updatedText = updatedText.replace(/[\r]{3,}/gm, "\n\n");
   updatedText = updatedText.replace(/[\n]{3,}/gm, "\n\n");

// 置換後のテキストをテキストエリアに挿入
const content = adjText.value;
const updatedContent = content.substring(0, start) + updatedText + content.substring(end);
adjText.value = updatedContent;

// 選択範囲を再設定
const newEnd = start + updatedText.length;
// 選択範囲を設定
adjText.focus();
adjText.setSelectionRange(start, newEnd);

  })

/*
// 🍞空白行削除ボタン
removeWhitespaceButton.addEventListener("click", () => {
  textforback.push(adjText.value);

//ボタンの効果
botton_click_anime(removeWhitespaceButton, 100)

// textforback の要素数がを超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false
    console.log(textforback)
  adjText.value = adjText.value.replace(/[\r\n]{2,}/gm, "\n");
  adjText.value = adjText.value.replace(/[\r]{2,}/gm, "\n");
  adjText.value = adjText.value.replace(/[\n]{2,}/gm, "\n");
  });
*/


// 🍚new空白行削除ボタン　選択範囲
removeWhitespaceButton.addEventListener("click", () => {
  //ボタンの効果
 botton_click_anime(removeWhitespaceButton, 100)
  
  // 選択範囲の開始位置と終了位置を取得
  const start = adjText.selectionStart;
  const end = adjText.selectionEnd;

  textforback.push([adjText.value, start,end]);
  // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
    if (textforback.length > back_data_turns) {
        textforback.shift();
      }
      adjustClearButton.disabled = false
    
// テキストエリアの選択範囲のテキストを取得
const selectedText = adjText.value.substring(start, end);

// 全角スペースと半角スペースを削除したテキストを作成
var updatedText
   updatedText = selectedText.replace(/[\r\n]{2,}/gm, "\n");
   updatedText = updatedText.replace(/[\r]{2,}/gm, "\n");
   updatedText = updatedText.replace(/[\n]{2,}/gm, "\n");
   updatedText = updatedText.replace(/^\n/g, "");

// 置換後のテキストをテキストエリアに挿入
const content = adjText.value;
const updatedContent = content.substring(0, start) + updatedText + content.substring(end);
adjText.value = updatedContent;

// 選択範囲を再設定
const newEnd = start + updatedText.length;
// 選択範囲を設定
adjText.focus();
adjText.setSelectionRange(start, newEnd);

  })

/*
// 🍞行頭トリムボタン
trimRowTopButton.addEventListener("click", () => {
  textforback.push(adjText.value);
// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false

   //ボタンの効果
   botton_click_anime(trimRowTopButton, 100)

    var txt = adjText.value
    var lines = txt.split('\n');
    var trimmedLines = lines.map(line => line.replace(/^[\s\u3000]+/, '')); // 各行の先頭を削除

    var result = trimmedLines.join('\n'); 
    adjText.value = result
  })
*/

// 🍚　new行頭トリムボタン
trimRowTopButton.addEventListener("click", () => {
 
   //ボタンの効果
   botton_click_anime(trimRowTopButton, 100)

    // 選択範囲の開始位置と終了位置を取得
    const start = adjText.selectionStart;
    const end = adjText.selectionEnd;
 
  textforback.push([adjText.value, start,end]);
// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false

    
    // テキストエリアの選択範囲のテキストを取得
    const selectedText = adjText.value.substring(start, end);
    
   //取り出したテキストを処理   
   
    var txt = selectedText
    var lines = txt.split('\n');
    var trimmedLines = lines.map(line => line.replace(/^[\s\u3000]+/, '')); // 各行の先頭を削除

    var updatedText = trimmedLines.join('\n'); 
    
    // 置換後のテキストをテキストエリアに挿入
    const content = adjText.value;
    const updatedContent = content.substring(0, start) + updatedText + content.substring(end);
    adjText.value = updatedContent;

    // 選択範囲を再設定
    const newEnd = start + updatedText.length;
    // 選択範囲を設定
    adjText.focus();
    adjText.setSelectionRange(start, newEnd);
  })


/*
// 🍞行末トリムボタン
trimRowLastButton.addEventListener("click", () => {
  textforback.push(adjText.value);
// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false
    
     //ボタンの効果
   botton_click_anime(trimRowLastButton, 100)

    var txt = adjText.value
    var lines = txt.split('\n');
    var trimmedLines = lines.map(line => line.replace(/[\s\u3000]+$/, '')); // 各行の末尾を削除

    var result = trimmedLines.join('\n'); 
    adjText.value = result
  });
*/

// 🍚　new行末トリムボタン
trimRowLastButton.addEventListener("click", () => {
  
   //ボタンの効果
   botton_click_anime(trimRowTopButton, 100)

    // 選択範囲の開始位置と終了位置を取得
    const start = adjText.selectionStart;
    const end = adjText.selectionEnd;
 
  textforback.push([adjText.value, start,end]);
// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false
    
    // テキストエリアの選択範囲のテキストを取得
    const selectedText = adjText.value.substring(start, end);
    
   //取り出したテキストを処理   
   
    var txt = selectedText
    var lines = txt.split('\n');
    var trimmedLines =lines.map(line => line.replace(/[\s\u3000]+$/, '')); // 各行の末尾を削除

    var updatedText = trimmedLines.join('\n'); 
    
    // 置換後のテキストをテキストエリアに挿入
    const content = adjText.value;
    const updatedContent = content.substring(0, start) + updatedText + content.substring(end);
    adjText.value = updatedContent;

    // 選択範囲を再設定
    const newEnd = start + updatedText.length;
    // 選択範囲を設定
    adjText.focus();
    adjText.setSelectionRange(start, newEnd);
  })



// 🍞改行削除処理ボタン
adjustLineBreaksButton.addEventListener("click", () => {
  // 選択範囲の開始位置と終了位置を取得
  const start = adjText.selectionStart;
  const end = adjText.selectionEnd;
  
  //戻るボタン用データ格納
    textforback.push([adjText.value, start, end]);
   // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
    if (textforback.length > back_data_turns) {
        textforback.shift();
      }
      adjustClearButton.disabled = false

    //ボタンの効果
     botton_click_anime(adjustLineBreaksButton, 100)
    
    // テキストエリアの選択範囲のテキストを取得
    const selectedText = adjText.value.substring(start, end); 
    
    //変数の取り込み
    Threshold = Number(lineThreshold.value)/100
    
    nwlnmark_str = nwlnmark.value  //改行マーク
    non_nwl_input_str = regexStrInput.value //回避文字列取り込み

    var lang = document.querySelector('input[name="txtlanguage"]:checked').value;
    
    txt = selectedText
    newtxt= cmb_lines2(txt, Threshold, non_nwl_input_str, nwlnmark_str, lang)
    
    var updatedText = newtxt

    // 置換後のテキストをテキストエリアに挿入
    const content = adjText.value;
    const updatedContent = content.substring(0, start) + updatedText + content.substring(end);
    adjText.value = updatedContent;

    // 選択範囲を再設定
    const newEnd = start + updatedText.length;
    // 選択範囲を設定
    adjText.focus();
    adjText.setSelectionRange(start, newEnd);
     });


// 🔨入力のリスト化
function parseString() {
  const text = regexStrInput.value;
  const pattern = /([^\s\u3000]+)/g;
  const matches = text.match(pattern) || [];
  const result = matches.filter((r) => r !== "")
  return result
}     




// 🔨改行を削除する関数　改行を削除してnlmarkを入れる。langがen（英語）ならスペース入れる。  
function cmb_lines2(txt, len_ratio, nocmb_str, nlmark="🔶",lang = "ja") {
  var flst = txt.split("\n");
 
  var maxrow = flst.reduce(function(a, b) {
    return a.length > b.length ? a : b;
  });
  var maxlen = maxrow.length;
  var deln_len = Math.floor(maxlen * len_ratio);

  var pl = -1; // 前の行の文字数。ここが閾値以上なら改行しない
  var slst = [];
  for (var i = 0; i < flst.length; i++) {
    var row = flst[i];
    
    if (pl >= deln_len && !isTopMatch2(row, nocmb_str)) {
      var sep = lang === "en" ? " " : "";
      slst[slst.length - 1] += sep + nlmark + row;
      pl = row.length;
    } else {
      slst.push(row);
      pl = row.length;
    }
  }
  var optext = slst.join("\n");
  return optext;
}

//　🔨先頭が一致するか検証する関数
function isTopMatch2(s, nocmb_str) {
  var ptnstr = nocmb_str;
  //先頭と末尾の|を削除
  ptnstr=ptnstr.replace(/^\||\|$/g, "");
  //空白であればダミー文字列にする。
  ptnstr = ptnstr === "" ? "これはdummyの文言です" : ptnstr;

  const regex = new RegExp(`^(${ptnstr})`);
  const match = s.match(regex);
  return !!match;
}





//　🔨先頭が一致するか検証する関数
function isTopMatch(s, ptn_lst) {
  const ptnstr = ptn_lst.map(ptn => ptn.source).join("|");
  const regex = new RegExp(`^(${ptnstr})`);
  const match = s.match(regex);
  return !!match;
}
   
  //const ptnlst = [/(第.{1,3}条)/, /[0-9]/, /[①-⑨]/];
// 🔨正規表現のパターンのリストを作成する。空の場合でも何か入れて返す
 function lstToRegLst(strlst){
  let reg_lst = [/dummyforemptylst/]
  strlst.forEach(element => {
    var regex = new RegExp(element);
    reg_lst.push(regex);
  });
  return reg_lst
 }


  
// 🔨改行を削除する関数　改行を削除してnlmarkを入れる。langがen（英語）ならスペース入れる。  
  function cmb_lines(txt, len_ratio, nocmb_lst, nlmark="🔶",lang = "ja") {
    var flst = txt.split("\n");
    
    var maxrow = flst.reduce(function(a, b) {
      return a.length > b.length ? a : b;
    });
    var maxlen = maxrow.length;
    var deln_len = Math.floor(maxlen * len_ratio);
  
    var pl = -1; // 前の行の文字数。ここが閾値以上なら改行しない
    var slst = [];
    for (var i = 0; i < flst.length; i++) {
      var row = flst[i];
      
      if (pl >= deln_len && !isTopMatch(row, nocmb_lst)) {
        var sep = lang === "en" ? " " : "";
        slst[slst.length - 1] += sep + nlmark + row;
        pl = row.length;
      } else {
        slst.push(row);
        pl = row.length;
      }
    }
    var optext = slst.join("\n");
    return optext;
  }

//　🔨先頭が一致するか検証する関数
function isTopMatch(s, ptn_lst) {
    const ptnstr = ptn_lst.map(ptn => ptn.source).join("|");
    const regex = new RegExp(`^(${ptnstr})`);
    const match = s.match(regex);
    return !!match;
  }




  
// 🍞確定ボタン  
removeLineBreaksButton.addEventListener("click", () => {
    // 選択範囲の開始位置と終了位置を取得
    const start = adjText.selectionStart;
    const end = adjText.selectionEnd;
  
  //戻るボタン用データ格納
    textforback.push([adjText.value, start, end]);
  
    // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
    if (textforback.length > back_data_turns) {
        textforback.shift();
      }
      adjustClearButton.disabled = false

      //ボタンの効果
     botton_click_anime(removeLineBreaksButton, 100)

      
      temptext =adjText.value

      //重複を先に削除
      nwlnmark_str = nwlnmark.value  //改行マーク
      var lang = document.querySelector('input[name="txtlanguage"]:checked').value;
      var sep = lang === "en" ? " " : "";
      sep_and_mark= sep + nwlnmark_str
      pattern = new RegExp(`(${sep_and_mark})+`, "g");
      temptext = temptext.replace(pattern, sep_and_mark)

      
      adjText.value =  temptext.replaceAll(nwlnmark_str, "")
    
      });

// 🍞　すべて選択するボタン
function selectAllText() {
  
  const start = adjText.selectionStart;
  const end = adjText.selectionEnd;
  var textarea = adjText;
  textlength = textarea.value.length

  if(start==0 && end==textlength){
    textarea.focus();
    textarea.setSelectionRange(0, 0);
  }else{
    textarea.focus();
    textarea.setSelectionRange(0, textarea.value.length);
  } 
  
}




// 🍞戻るボタン。配列がゼロになればグレーアウトする。
adjustClearButton.addEventListener("click", () => {
  if (textforback.length > 0) {
    var lastElements = textforback.pop(); // 最後の要素を取り出す
    adjText.value = lastElements[0]; // テキストエリアに転記
      if (textforback.length < 1){
          adjustClearButton.disabled = true
      }
  }   
  const button = event.target; // クリックされたボタンのオブジェクトを取得
  //ボタンの効果
  botton_click_anime(button, 100)

const start = lastElements[1]
const end = lastElements[2]

// 選択範囲を設定
adjText.focus();
adjText.setSelectionRange(start, end);


});


// 🍞スペース　改行削除の
function removeSpaces(tgt) {
  const tgt_str = tgt
   //ボタンの効果
   botton_click_anime(trimRowTopButton, 100)

    // 選択範囲の開始位置と終了位置を取得
    const start = adjText.selectionStart;
    const end = adjText.selectionEnd;
 
  textforback.push([adjText.value, start,end]);
// textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
      textforback.shift();
    }
    adjustClearButton.disabled = false

// テキストエリアの選択範囲のテキストを取得
const selectedText = adjText.value.substring(start, end);

// 全角スペースと半角スペースを削除したテキストを作成
const updatedText = selectedText.replaceAll(tgt, '');

// 置換後のテキストをテキストエリアに挿入
const content = adjText.value;
const updatedContent = content.substring(0, start) + updatedText + content.substring(end);
adjText.value = updatedContent;

// 選択範囲を再設定
const newEnd = start + updatedText.length;

// 選択範囲を設定
adjText.focus();
adjText.setSelectionRange(start, newEnd);
}



// 🍞ダウンロードボタン。
downloadButton.addEventListener("click", () => {
  var text = adjText.value; // outputtxtに保存されているテキストを取得する

  //ボタンの効果
  botton_click_anime(downloadButton, 100)


  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  element.setAttribute('download', 'renewlines.txt');
  element.style.display = 'none';
  document.body.appendChild(element);

  element.click();

  document.body.removeChild(element);

   });

   // 🍞コピー ボタン。
copyTextButton.addEventListener("click", () => {
  var text = adjText.value; // outputtxtに保存されているテキストを取得する
  adjText.select()
  adjText.setSelectionRange(0, text.length);

  document.execCommand("copy");
  window.getSelection().removeAllRanges();

  copyTextButton.disabled = true;
  copyTextButton.innerHTML ="　Copied..　";
 // 1秒後にボタンのdisabledを解除する
 setTimeout(function() {
  copyTextButton.disabled = false;
  copyTextButton.innerHTML = "　Copy　";
  }, 500);
   });


// 🍞　削除ツールボタン。
delShortRowToolButton.addEventListener("click", () => {
  //テキストをリストに格納
  var text = adjText.value; // outputtxtに保存されているテキストを取得する
  TOOLtextlst = text.split("\n")
  
  //画面処理
  const adjustetTextSet= document.getElementById("adjustetTextSet");
  const delShortRowToolSet= document.getElementById("delShortRowToolSet");
  const gensetumei= document.getElementById("gensetumei")
  adjustetTextSet.style.display="none"
  delShortRowToolSet.style.removeProperty ("display")
  gensetumei.style.display="none"
    
  const elements = document.getElementsByClassName('basebtns');
  const elementsArray = Array.from(elements);
  elementsArray.forEach(element => {
    element.style.display="none"
  });
  tableWrite()
  });


// 🔨改行コードの統一
  function newLinesUnify(text, nlcode) {
    var targetRegex;
    switch (nlcode) {
      case "\n":
        targetRegex = /\r\n/g;
        text = text.replace(targetRegex, nlcode);
        targetRegex = /\r/g;
        break;
      case "\r\n":
        targetRegex = /\r\n/g;
        text = text.replace(targetRegex, "__temp__");  
        targetRegex = /\r|\n|__temp__/g;
        break;
      case "\r":
        targetRegex = /\r\n/g;
        text = text.replace(targetRegex, nlcode);
        targetRegex = /\n/g;
        break;
      default:
        throw new Error("Invalid newline code specified.");
    }
    return text.replace(targetRegex, nlcode);
  }




//　ボツ
function isTopMatch22(s, ptn_lst) {
  const ptnstr = ptn_lst.map(ptn => ptn.source.replace(/\\/g, '\\\\')).join("|");
  const regex = new RegExp(`^(${ptnstr})`);
  const match = s.match(regex);
  return !!match;
}


//*****************　ここからtool　＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊/
const Tool_back_turns = 20;
var TOOLtextlst =[]
var TOOLlstforback=[]
var TOOLnowrow = -1
const TABLEBODY=document.getElementById('toolmaintable');
const DelThreshold=document.getElementById('DelThreshold');

document.addEventListener('keydown', function(event) {
  if (event.key === 'f') {
  }})


//　🔨行が完全一致するか検証するためのregptnを作る
function createAllmatchRegex(ptn_lst) {
  
  const ptnstr = ptn_lst.join("|");
  const regex = new RegExp(`^(${ptnstr})$`);
  
  return regex;
}
//test = ["test", "テスト"]
//a = createAllmatchRegex(test)

// 🔨入力のリスト化
function strSplitbySpace(text) {
  const pattern = /([^\s\u3000]+)/g;
  const matches = text.match(pattern) || [];
  const result = matches.filter((r) => r !== "")
  return result
}    



/***********　　🍚文字列での検索🍚　******++++++*/
// 🍚前へボタン
const toolprevButton2 = document.getElementById('toolprevButton2');
toolprevButton2.addEventListener('click', function() {
  //逆順にサーチする。
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からハイライトクラスを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  //フォームから値をもらって正規表現に処理する
  var regex_rstr = document.getElementById('toolregexInput').value   
  var ptn=regex_rstr
  
  if (ptn ==""){
    ptn = "dummyの文言で検索がヒットしないようにする"
  }

  ptn = new RegExp(`^(${ptn})$`);
 
  matchlist= getIndexList(TOOLtextlst,ptn)
  
  var tgtrow= rows.length +1
  matchlist.forEach(element => {
    if (element < TOOLnowrow && (tgtrow === rows.length +1 || element > tgtrow)) {
      tgtrow = element;
    }    
  })
 
  if(tgtrow != rows.length +1){
    rows[tgtrow].classList.add('serchedrow');
  }
  TOOLnowrow=tgtrow
 
  jumpToRow(TOOLnowrow)
  NowRowSpan.textContent=TOOLnowrow
})


// 🍚次へボタン
const toolNextButton2 = document.getElementById('toolNextButton2');
toolNextButton2.addEventListener('click', function() {
    //順番にサーチする。
    const rows = TABLEBODY.getElementsByTagName('tr');
    // すべての行からハイライトクラスを削除
    for (let i = 0; i < rows.length; i++) {
      rows[i].classList.remove('serchedrow');
    }
    //フォームから値をもらって正規表現に処理する
    var regex_rstr = document.getElementById('toolregexInput').value   
    var ptn=regex_rstr
    if (ptn ==""){
      ptn = "dummyの文言で検索がヒットしないようにする"
    }
    ptn = new RegExp(`^(${ptn})$`);

    matchlist= getIndexList(TOOLtextlst,ptn)
    
    var tgtrow=-1
    matchlist.forEach(element => {
      if (element > TOOLnowrow && (tgtrow === -1 || element < tgtrow)) {
        tgtrow = element;
      }    
    })
    
    if(tgtrow !=-1){
      rows[tgtrow].classList.add('serchedrow');
    }
    TOOLnowrow=tgtrow
    
    jumpToRow(TOOLnowrow)
    if(TOOLnowrow==0){jumpToRow(1)}
    NowRowSpan.textContent=TOOLnowrow
});

// 🍚選択ボタン
const toolSlctButton2 = document.getElementById('toolSlctButton2');
toolSlctButton2.addEventListener('click', function() {
  //選択する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  const rows = TABLEBODY.getElementsByTagName('tr');
  rows[TOOLnowrow].classList.add('toolhighlight')
});

// 🍚解除ボタン
const toolKaijyoButton2 = document.getElementById('toolKaijyoButton2');
toolKaijyoButton2.addEventListener('click', function() {
  //選択解除。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  const rows = TABLEBODY.getElementsByTagName('tr');
  rows[TOOLnowrow].classList.remove('toolhighlight')
});

// 🍚一括選択ボタン
const toolAllslctButton2 = document.getElementById('toolAllslctButton2');
toolAllslctButton2.addEventListener('click', function() {
  //ptnに一致するものを選択する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])

  //フォームから値をもらって正規表現に処理する
    var regex_rstr = document.getElementById('toolregexInput').value   
    var ptn=regex_rstr
    if (ptn ==""){
      ptn = "dummyの文言で検索がヒットしないようにする"
    }
    ptn = new RegExp(`^(${ptn})$`);
    

  matchlist= getIndexList(TOOLtextlst,ptn)
  
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からserchedrowを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  
  // toolhighlightを追加。
  matchlist.forEach(element => {
    rows[element].classList.add('toolhighlight');
    rows[element].classList.add('serchedrow');
  })
})


// 🍚一括解除ボタン
const toolAllcnslButton2 = document.getElementById('toolAllcnslButton2');
toolAllcnslButton2.addEventListener('click', function() {
  //ptnに一致するものを選択する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])

  //フォームから値をもらって正規表現に処理する
    var regex_rstr = document.getElementById('toolregexInput').value   
    var ptn=regex_rstr
    if (ptn ==""){
      ptn = "dummyの文言で検索がヒットしないようにする"
    }
    ptn = new RegExp(`^(${ptn})$`);
    
  matchlist= getIndexList(TOOLtextlst,ptn)
  
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からserchedrowを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  
  // toolhighlightを削除し、serchedrowを追加
  matchlist.forEach(element => {
    rows[element].classList.remove('toolhighlight');
    rows[element].classList.add('serchedrow');
  })
})



/***********　　🍚文字数での検索🍚　******++++++*/

// 🍚前へボタン
const toolprevButton1 = document.getElementById('toolprevButton1');
toolprevButton1.addEventListener('click', function() {
  //逆順にサーチする。
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からserchedrowを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  var str_num = DelThreshold.value
  var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num)
  //parseString
  
  matchlist= getIndexList(TOOLtextlst,ptn)
  
  var tgtrow= rows.length +1
  matchlist.forEach(element => {
    if (element < TOOLnowrow && (tgtrow === rows.length +1 || element > tgtrow)) {
      tgtrow = element;
    }    
  })
  
  if(tgtrow != rows.length +1){
    rows[tgtrow].classList.add('serchedrow');
  }
  TOOLnowrow=tgtrow
  
  jumpToRow(TOOLnowrow)
  NowRowSpan.textContent=TOOLnowrow
})

// 🍚次へボタン
const toolNextButton1 = document.getElementById('toolNextButton1');
toolNextButton1.addEventListener('click', function() {
  //順番にサーチする。
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からseachedrowを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  //正規表現を格納
  var str_num = DelThreshold.value
  var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num)
  
  matchlist= getIndexList(TOOLtextlst,ptn)
  
  var tgtrow=-1
  matchlist.forEach(element => {
    if (element > TOOLnowrow && (tgtrow === -1 || element < tgtrow)) {
      tgtrow = element;
    }    
  })
  
  if(tgtrow !=-1){
    rows[tgtrow].classList.add('serchedrow');
  }
  TOOLnowrow=tgtrow
  
  jumpToRow(TOOLnowrow);
  if(TOOLnowrow==0){jumpToRow(1)}
  NowRowSpan.textContent=TOOLnowrow
})


// 🍚選択ボタン
const toolSlctButton1 = document.getElementById('toolSlctButton1');
toolSlctButton1.addEventListener('click', function() {
  //選択する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  const rows = TABLEBODY.getElementsByTagName('tr');
  rows[TOOLnowrow].classList.add('toolhighlight')
});

// 🍚解除ボタン
const toolKaijyoButton1 = document.getElementById('toolKaijyoButton1');
toolKaijyoButton1.addEventListener('click', function() {
  //選択解除。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  const rows = TABLEBODY.getElementsByTagName('tr');
  rows[TOOLnowrow].classList.remove('toolhighlight')
});

// 🍚一括選択ボタン
const toolAllslctButton1 = document.getElementById('toolAllslctButton1');
toolAllslctButton1.addEventListener('click', function() {
  //ptnに一致するものを一括選択する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  //var ptn = ".{1,10}$|^<Confidential>";
  var str_num = DelThreshold.value
  var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num)
  
  matchlist= getIndexList(TOOLtextlst,ptn)
  
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からserchedrowを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  // toolhighlightを追加。
  matchlist.forEach(element => {
    rows[element].classList.add('toolhighlight');
    rows[element].classList.add('serchedrow');
  })
  }
)


// 🍚一括解除ボタン
const toolAllcnslButton1 = document.getElementById('toolAllcnslButton1');
toolAllcnslButton1.addEventListener('click', function() {
  //ptnに一致するものを一括選択する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  //var ptn = ".{1,10}$|^<Confidential>";
  var str_num = DelThreshold.value
  var ptn = "^.{0,XXnumXX}$".replaceAll("XXnumXX",str_num)

  matchlist= getIndexList(TOOLtextlst,ptn)
  
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からserchedrowを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('serchedrow');
  }
  // toolhighlightを削除し、serchedrowを追加
  matchlist.forEach(element => {
    rows[element].classList.remove('toolhighlight');
    rows[element].classList.add('serchedrow');
  })
  }
)



// 🍚 ハイライト行を削除ボタン
const deleteHighlightButton = document.getElementById('deleteHighlightButton');
deleteHighlightButton.addEventListener('click', function() {
  //ハイライトを削除する。
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  hilightRows= toolgetstatus()[2]
  deleteFromArray(TOOLtextlst,hilightRows)
  
  tableWrite() 
}
);

// 🍚 ハイライトすべて解除
const removeHighlightButton = document.getElementById('removeHighlightButton');
  removeHighlightButton.addEventListener('click', function() {
  TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
  //ハイライト解除
  const rows = TABLEBODY.getElementsByTagName('tr');
  // すべての行からハイライトクラスを削除
  for (let i = 0; i < rows.length; i++) {
    rows[i].classList.remove('toolhighlight');
    rows[i].classList.remove('serchedrow');
  }
})
// 🍚 一つ前にもどる
toolBackButton = document.getElementById('toolBackButton');
toolBackButton.addEventListener('click', function() {
  //一つ前に戻る
  lastElement = TOOLlstforback.pop(); // 最後の要素を取り出す
  TOOLtextlstvar  = lastElement[0]; // テキストエリアに転記
  TABLEBODY.innerHTML = lastElement[1]; 
  if (TOOLlstforback.length < 1){
        adjustClearButton.disabled = true
    }
});




/*　部品の関数
🔨配列から完全一致するものを抽出する。
🔨配列の要をインデックス指定で削除 ポイントは後ろから削除する。
🔨テキスト文章リスト、ハイライトの状況を調べる。
*/

// 🔨配列から完全一致するものを抽出する。
function getIndexList(lsn, ptn) {
  const regex = new RegExp(ptn);
  const indexList = [];

  for (let i = 0; i < lsn.length; i++) {
    const element = lsn[i];
    if (regex.test(element)) {
      indexList.push(i);
    }
  }
  return indexList;
}
// 使用例
const lsn = ['abc', 'def', 'テスト', 'abcd', 'テスト', 'テストパターン'];
const ptn = 'テスト';

const result = getIndexList(lsn, ptn);
//console.log(result);  // [2]


//　🔨配列の要をインデックス指定で削除 ポイントは後ろから削除する。
function deleteFromArray(array1, delArray) {
  for (let i = delArray.length - 1; i >= 0; i--) {
    const index = delArray[i];
    if (index >= 0 && index < array1.length) {
      array1.splice(index, 1);
    }
  }
}

//　🔨テキスト文章リスト、ハイライトの状況を調べる。
function toolgetstatus(){
    function getHighlightedRows() {
      return document.querySelectorAll('tr.toolhighlight');
    }
    function getHighlightedRowNumbers() {
      const highlightedRows = getHighlightedRows();
      return Array.from(highlightedRows).map(function(row) {
        const rows = TABLEBODY.getElementsByTagName('tr');
        return Array.prototype.indexOf.call(rows, row);
      });
    }
    // ハイライトされている行のリストを取得してコンソールに出力
    const highlightedRows = getHighlightedRows();
    //console.log('Highlighted rows:', highlightedRows)
    // ハイライトされている行の行数のリストを取得してコンソールに出力
    const highlightedRowNumbers = getHighlightedRowNumbers();
    //console.log('Highlighted row numbers:', highlightedRowNumbers);
    return [TOOLtextlst,highlightedRows,highlightedRowNumbers]
  };

  
/*　基本部品の関数
🔨テーブル描写
🔨指定行へ移動
🔨指定行をハイライト
*/


// 🔨テーブル描写
function tableWrite() {
  var tooltablbody = document.getElementById("toolmaintable");
  var table = '<table id="toolmaintable">'; // テーブルの開始タグを定義します
  table = ""
  const STR_PER_ROW = 45
  for (var i = 0; i < TOOLtextlst.length ; i++) {
    var rslicedText = TOOLtextlst[i]
    var slicedText = rslicedText.slice(0, STR_PER_ROW).replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll(" ","&nbsp;").replaceAll("　","&emsp; "); // テキストを20文字までにスライスします
    if (TOOLtextlst[i].length >= STR_PER_ROW){
      slicedText=slicedText+"・・・"
    }else if(slicedText.length==0){
      slicedText="－空白行－"

    }
    var tableRow = "<tr><td><span>" + slicedText + "</span></td></tr>"; // テーブルの行とセルを作成します
    table += tableRow; // テーブルに行を追加します
  }

  table += "" //</table>"; // テーブルの終了タグを追加します
  tooltablbody.innerHTML = table; // tooltextのinnerHTMLにテーブルをセットします
}



//　🔨指定行へ移動
//　スクロール調整機能を持たせる。
function jumpToRow(rowNumber) {
  const tableBody = document.getElementById('toolmaintable');
  const scrolladj = document.getElementById('scrolladj');
  var rowCount = tableBody.rows.length;
  var acrolladj_ratio = Number(scrolladj.value)/100
  
  if (rowNumber >= 1 && rowNumber <= rowCount) {
    const tableContainer = document.getElementById('tooltablcontainer');
    const rowHeight = tableBody.clientHeight / rowCount;
    const scrollTo = (rowHeight + acrolladj_ratio) * (rowNumber)-tableContainer.clientHeight*0.5;
    tableContainer.scrollTop = scrollTo;
    //console.log(rowHeight)
  }
}

//　🔨指定行をハイライト
function highlightRow(rowNumber) {
  if (rowNumber >= 1 && rowNumber <= rowCount) {
    const tableContainer = document.getElementById('toolmaintable');
    const rows = tableContainer.getElementsByTagName('tr');
    
    // すべての行からハイライトクラスを削除
    for (let i = 0; i < rows.length; i++) {
      rows[i].classList.remove('toolhighlight');
    }
    
    const highlightedRow = rows[rowNumber];
    
    // ハイライトクラスを追加
    highlightedRow.classList.add('toolhighlight');
    
    // 行を中央にスクロール
    jumpToRowNum(rowNumber)
  }
}
  

// 🍞テーブルの行をクリックしたときの処理
TABLEBODY.addEventListener('click', function(event) {
const chktype = document.querySelector('input[name="clicktype"]:checked').value;
if  (chktype=="click"){
  const clickedRow = event.target.closest('tr');
  if (clickedRow) {
    TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
    // すべての行からハイライトクラスを削除
    const rows = TABLEBODY.getElementsByTagName('tr');
    // すべての行からserchedrowを削除
    for (let i = 0; i < rows.length; i++) {
      rows[i].classList.remove('serchedrow');
    }
    //}
    // クリックされた行にハイライトクラスを追加
    const classList = clickedRow.classList;
    // toolhighlightクラスの状態を切り替える
    if (classList.contains('toolhighlight')) {
      classList.remove('toolhighlight');
    } else {
      classList.add('toolhighlight');
    }

    // クリックされた行のインデックスを取得してコンソールに出力
    const rowIndex = Array.prototype.indexOf.call(rows, clickedRow);
    //console.log('Clicked row index:', rowIndex);
  }
}
});

// 　🍞テーブルの行をダブルクリックしたときの処理
TABLEBODY.addEventListener('dblclick', function(event) {
  const chktype = document.querySelector('input[name="clicktype"]:checked').value;
  if  (chktype=="dblclick"){
    const clickedRow = event.target.closest('tr');
    if (clickedRow) {
      TOOLlstforback.push([TOOLtextlst,TABLEBODY.innerHTML])
      // すべての行からハイライトクラスを削除
      const rows = TABLEBODY.getElementsByTagName('tr');
      //for (let i = 0; i < rows.length; i++) {
      //  rows[i].classList.remove('toolhighlight');
      //}
      // クリックされた行にハイライトクラスを追加
      const classList = clickedRow.classList;
      // toolhighlightクラスの状態を切り替える
      if (classList.contains('toolhighlight')) {
        classList.remove('toolhighlight');
      } else {
        classList.add('toolhighlight');
      }
  
      // クリックされた行のインデックスを取得してコンソールに出力
      const rowIndex = Array.prototype.indexOf.call(rows, clickedRow);
      //console.log('Clicked row index:', rowIndex);
    }
  }
  });


//　🍞ツール完了ボタン
  const toolProsessButton = document.getElementById('toolProsessButton');
  toolProsessButton.addEventListener('click', function() {
    if (hilightRows= toolgetstatus()[2].length>0){
          // 確認メッセージの表示
        const answer = confirm('ハイライトが残っていますが終了しますか？');
        // ユーザーの回答による分岐
        if (answer) {
            // 実行する処理
            end_tool()
        } else {
            // 実行しない処理
            //console.log('実行しません');
        }
    }else{
      end_tool()
    }
  });

  function end_tool(){
  textforback.push([adjText.value, 0, 0]);
  // textforback の要素数が back_data_turns を超えた場合、先頭の要素を削除
  if (textforback.length > back_data_turns) {
          textforback.shift();
      }
      adjustClearButton.disabled = false

    // 実行する処理
    //テキストを戻す
    var joinedText = TOOLtextlst.join("\n");
    adjText.value = joinedText
    //画面の設定
    const adjustetTextSet= document.getElementById("adjustetTextSet");
    const delShortRowToolSet= document.getElementById("delShortRowToolSet");
    const gensetumei= document.getElementById("gensetumei");
    delShortRowToolSet.style.display="none"
    adjustetTextSet.style.removeProperty ("display")
    gensetumei.style.removeProperty ("display")
   
    const elements = document.getElementsByClassName('basebtns');
   const elementsArray = Array.from(elements);
    elementsArray.forEach(element => {
   element.style.removeProperty ("display")
    });
  }



//　🍞ツールキャンセルボタン
  const cancelButton = document.getElementById('toolCancelButton');
  cancelButton.addEventListener('click', function() {
    // 確認メッセージの表示
    const answer = confirm('行の削除を反映せずに閉じますか？');
    // ユーザーの回答による分岐
    if (answer) {
      // 実行する処理
      const adjustetTextSet= document.getElementById("adjustetTextSet");
      const delShortRowToolSet= document.getElementById("delShortRowToolSet");
      const gensetumei= document.getElementById("gensetumei");
      delShortRowToolSet.style.display="none"
      adjustetTextSet.style.removeProperty ("display")
      gensetumei.style.removeProperty ("display")
        
      const elements = document.getElementsByClassName('basebtns');
     const elementsArray = Array.from(elements);
      elementsArray.forEach(element => {
     element.style.removeProperty ("display")
  });
    } else {
      // 実行しない処理
      //console.log('実行しません');
    }
  });

  function botton_click_anime(btn, dis_time){
    btn.disabled = true;
    // dis_timeミリ秒後にボタンのdisabledを解除する
     setTimeout(function() {
      btn.disabled = false;
      }, dis_time);
  }  



// 🍞🍞PDFの送受信
function pdrSubmit() {
  MY_AD = encodeURIComponent(location.href) //リクエスト時の居場所
  LOCAL_URL = 'http://localhost:5000/pdftext/response'
  API_URL =  'https://egaoyo.com/mytools/pdftext/response'
  
  if (MY_AD.includes('localhost')) {
      API_URL = LOCAL_URL;
  }
    var fileInput = document.getElementById("fileInput");
    var file = fileInput.files[0];
  
    var formData = new FormData();
    formData.append("file", file);

    var adjText = document.getElementById("adjText");
    
    fetch(API_URL, {
      method: "POST",
      body: formData
    })
      .then(response => response.json())
      .then(data => {
        var resText = data.res_text;
        adjText.value = resText;
      })
      .catch(error => {
        adjText.value = "PDFの読取りに失敗しました。"
        //console.error("エラー:", error);
      });
  }
