let timer = null;

    // Switch tab function
    function switchTab(tabName) {
      document.querySelectorAll('.tab-content').forEach(el => el.classList.remove('active'));
      document.querySelectorAll('.tab-buttons button').forEach(button => button.classList.remove('active'));
      document.getElementById(tabName).classList.add('active');
      document.querySelector(`button[onclick="switchTab('${tabName}')"]`).classList.add('active');
    }

    // Toggle Auto Update
    function toggleAuto(button) {
      if (timer) {
        clearInterval(timer);
        timer = null;
        button.textContent = "Auto Update: OFF";
      } else {
        const interval = 1000;
        timer = setInterval(readMemory, interval);
        button.textContent = "Auto Update: ON";
      }
    }

    // Parse hexadecimal inputs
    function parseHex(str) {
  str = str.trim().toLowerCase();

  let isNegative = false;

  // -が付いていたらフラグを立てて取り除く
  if (str.startsWith("-")) {
    isNegative = true;
    str = str.slice(1);
  }

  // 0x がなければ追加
  if (!str.startsWith("0x")) {
    str = "0x" + str;
  }

  // BigInt で変換し、必要なら符号を反転
  let value = BigInt(str);
  return isNegative ? -value : value;
}

    // Read memory function
    function readMemory() {
  const addrInput = document.getElementById("addr").value;
  const rangeInput = document.getElementById("range").value;
  const output = document.getElementById("output");
  const type = document.getElementById("valueType").value; // ← 追加された型

  let base, range;
  try {
    base = parseHex(addrInput);
    range = parseHex(rangeInput);
  } catch {
    output.textContent = "Invalid address or range format.";
    return;
  }

  let result = "";
  const step = 4n;
  const startOffset = range < 0n ? range : 0n;
  const endOffset = range > 0n ? range : 0n;

  for (let offset = startOffset; offset <= endOffset; offset += step) {
    const addr = base + offset;
    const val = h5gg.getValue(addr.toString(), type); // ← 型反映
    const offsetStr = offset >= 0n ? `+0x${offset.toString(16)}` : `-0x${(-offset).toString(16)}`;
    result += `${offsetStr.padEnd(10)} = ${val}\n`;
  }

  output.textContent = result || "No values found.";
}








    // Search function
function doSearch() {
  if (typeof h5gg === "undefined") {
    alert("H5GG is not connected.");
    return;
  }

  const value = document.getElementById("searchValue").value.trim();
  const type = document.getElementById("searchType").value;
  const output = document.getElementById("searchOutput");

  console.log("Search value:", value);
  console.log("Search type:", type);

  if (!value || !type) {
    output.textContent = "Please input value and type.";
    return;
  }

h5gg.searchNumber("10000", "F32", "0x0", "0x200000000");

  const count = h5gg.getResultsCount();
  alert("Results count:", count);

  if (count === 0) {
    output.textContent = "No results found.";
    return;
  }

  const results = h5gg.getResults(0, count);
  console.log("Raw results:", results);

  if (!Array.isArray(results)) {
    output.textContent = "Unexpected result format.";
    return;
  }

  let resultText = "";
  results.forEach(r => {
    resultText += `0x${Number(r.address).toString(16)} = ${r.value}\n`;
  });

  output.textContent = resultText || "No value found.";
}

    // Nearby search function
    function doNearby() {
  const value = document.getElementById("nearbyValue").value;
  const type = document.getElementById("nearbyType").value;
  let range = document.getElementById("nearbyRange").value.trim();

  // マイナス記号は不要なので除去（必要ならここで切る）
  range = range.replace(/^-/, "");

  // 0x が付いていない場合、自動で追加
  if (!range.startsWith("0x")) {
    range = "0x" + range;
  }

  h5gg.searchNearby(value, type, range);
  const result = h5gg.getResults();
  document.getElementById("searchOutput").textContent = formatResults(result);
}

    // Edit function
    function doEdit() {
      const value = document.getElementById("editValue").value;
      const type = document.getElementById("editType").value;
      h5gg.editAll(value, type);
      document.getElementById("searchOutput").textContent = "All values edited.";
    }

    // Clear results
    function clearResults() {
      h5gg.clearResults();
      document.getElementById("searchOutput").textContent = "Results cleared.";
    }

    // Format results for display
    function formatResults(results) {
      if (!results || results.length === 0) {
        return "No results found.";
      }
      const header = `Found: ${results.length} result${results.length > 1 ? "s" : ""}\n\n`;
      const body = results.map(r => `0x${Number(r.address).toString(16)} = ${r.value}`).join("\n");
      return header + body;
    }