{"id":1038,"date":"2026-02-27T08:25:01","date_gmt":"2026-02-27T08:25:01","guid":{"rendered":"https:\/\/marineconservation.id\/?page_id=1038"},"modified":"2026-03-11T21:42:27","modified_gmt":"2026-03-11T21:42:27","slug":"fish-data-entry","status":"publish","type":"page","link":"https:\/\/marineconservation.id\/id\/fish-data-entry\/","title":{"rendered":"Fish Data Entry"},"content":{"rendered":"<style>.elementor-1038 .elementor-element.elementor-element-cdf863b{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-1038 .elementor-element.elementor-element-3f5e4d5{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-1038 .elementor-element.elementor-element-463d657{--spacer-size:50px;}.elementor-1038 .elementor-element.elementor-element-1e676b8{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-1038 .elementor-element.elementor-element-95ad5ec{--display:flex;}.elementor-widget-heading .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-weight:var( --e-global-typography-primary-font-weight );color:var( --e-global-color-primary );}.elementor-1038 .elementor-element.elementor-element-9576278{text-align:center;}.elementor-1038 .elementor-element.elementor-element-9576278 .elementor-heading-title{font-family:\"Roboto\", Sans-serif;font-size:45px;font-weight:600;color:#00399F;}.elementor-1038 .elementor-element.elementor-element-23a3b8c{--display:flex;}.elementor-1038 .elementor-element.elementor-element-fdbb5e7 .elementor-wrapper{--video-aspect-ratio:1.77777;}<\/style>\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1038\" class=\"elementor elementor-1038\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cdf863b e-flex e-con-boxed e-con e-parent\" data-id=\"cdf863b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ea58654 elementor-widget elementor-widget-html\" data-id=\"ea58654\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ============================================= -->\r\n<!-- FISH DATA ENTRY APPLICATION                   -->\r\n<!-- Added: Project Save\/Load, Fixed Header Layout -->\r\n\r\n<!-- Tambahkan Font Awesome untuk ikon -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\">\r\n\r\n<style>\r\n  body { font-family: 'Segoe UI', Arial, sans-serif; background: #f9f9f9; padding: 20px; }\r\n  .container { max-width: 1200px; margin: auto; background: #fff; padding: 20px; border-radius: 15px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border: 1px solid #e1e8ed; }\r\n  .form-section { margin-bottom: 25px; padding: 15px; background: #f0f0f0; border-radius: 6px; }\r\n  .form-row { display: flex; flex-wrap: wrap; gap: 15px; margin-bottom: 10px; align-items: flex-end; }\r\n  .form-group { flex: 1 1 200px; display: flex; flex-direction: column; }\r\n  .form-group.nama-group { flex: 3; }\r\n  .form-group.kecil-group { flex: 0.8; }\r\n  label { font-weight: 600; display: block; margin-bottom: 5px; color: #444; }\r\n  input, select, textarea { width: 100%; padding: 12px; border: 1px solid #ced4da; border-radius: 8px; box-sizing: border-box; font-size: 15px; }\r\n  button { background: #0073aa; color: #fff; padding: 12px 20px; border: none; border-radius: 8px; cursor: pointer; font-size: 16px; font-weight: 600; transition: 0.3s; }\r\n  button:hover { background: #005a87; box-shadow: 0 2px 5px rgba(0,115,170,0.3); }\r\n  .map { height: 300px; margin-top: 10px; border: 1px solid #ddd; border-radius: 4px; }\r\n  .radio-group { display: flex; gap: 20px; align-items: center; }\r\n  .radio-group label { font-weight: normal; display: inline; margin-right: 10px; }\r\n  table { width: 100%; border-collapse: collapse; margin-top: 20px; }\r\n  th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\r\n  th { background: #0073aa; color: #fff; }\r\n  #entriesTable th:nth-child(1),\r\n  #entriesTable td:nth-child(1) { min-width: 250px; }\r\n  #entriesTable th:nth-child(3),\r\n  #entriesTable td:nth-child(3),\r\n  #entriesTable th:nth-child(4),\r\n  #entriesTable td:nth-child(4) { width: 80px; }\r\n  .remove-btn { background: #dc3545; color: #fff; border: none; padding: 4px 8px; border-radius: 3px; cursor: pointer; }\r\n  .warning { color: #856404; background-color: #fff3cd; border: 1px solid #ffeeba; padding: 5px; border-radius: 4px; margin-top: 5px; display: none; }\r\n  .total-biomass { font-size: 1.2em; font-weight: bold; margin: 10px 0; }\r\n  .export-btn { background: #28a745; }\r\n  .error-message { color: #721c24; background-color: #f8d7da; border: 1px solid #f5c6cb; padding: 10px; border-radius: 4px; margin: 10px 0; }\r\n  .format-group { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }\r\n\r\n  \/* Language selector - now part of header row *\/\r\n  .header-row {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    margin-bottom: 20px;\r\n    flex-wrap: wrap;\r\n  }\r\n  .header-row h2 {\r\n    margin: 0;\r\n    color: #006097;\r\n  }\r\n  .language-selector {\r\n    display: flex;\r\n    gap: 10px;\r\n    align-items: center;\r\n    flex-wrap: wrap;\r\n  }\r\n  .lang-btn {\r\n    padding: 5px 15px;\r\n    border: 1px solid #0073aa;\r\n    background: white;\r\n    color: #0073aa;\r\n    cursor: pointer;\r\n    border-radius: 20px;\r\n    font-weight: 600;\r\n    transition: 0.3s;\r\n    font-size: 14px;\r\n  }\r\n  .lang-btn.active {\r\n    background: #0073aa;\r\n    color: white;\r\n  }\r\n  .lang-btn:hover {\r\n    background: #005a87;\r\n    color: white;\r\n  }\r\n\r\n  \/* Container gambar spesies (gaya baru) *\/\r\n  #preview-box { margin-top: 25px; text-align: center; border: 1px solid #eee; padding: 15px; border-radius: 12px; background: #fcfcfc; display: none; }\r\n  #loader-text { font-size: 13px; color: #888; margin-bottom: 10px; font-style: italic; }\r\n  .image-container { position: relative; min-height: 200px; display: flex; align-items: center; justify-content: center; background: #f0f0f0; border-radius: 8px; overflow: hidden; }\r\n  #fish-img { max-width: 100%; height: auto; max-height: 250px; transition: 0.3s ease; opacity: 0; }\r\n  #image-source { font-size: 11px; margin-top: 12px; color: #999; }\r\n  .container { position: relative; }\r\n<\/style>\r\n\r\n<!-- Load Leaflet for map -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\r\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\r\n<!-- Load SheetJS for Excel export -->\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\r\n\r\n<div class=\"container\">\r\n  <!-- Header with title and language + project buttons -->\r\n  <div class=\"header-row\">\r\n    <h2 id=\"mainTitle\">\ud83d\udccb Input Data Ikan<\/h2>\r\n    <div class=\"language-selector\">\r\n      <button class=\"lang-btn active\" id=\"langID\" onclick=\"setLanguage('id')\">\ud83c\uddee\ud83c\udde9 Indonesia<\/button>\r\n      <button class=\"lang-btn\" id=\"langEN\" onclick=\"setLanguage('en')\">\ud83c\uddec\ud83c\udde7 English<\/button>\r\n      <!-- TOMBOL SIMPAN & MUAT PROYEK -->\r\n      <button class=\"lang-btn\" id=\"saveProjectBtn\"><i class=\"fas fa-save\"><\/i> <span data-i18n=\"saveProject\">Simpan Proyek<\/span><\/button>\r\n      <button class=\"lang-btn\" id=\"loadProjectBtn\"><i class=\"fas fa-folder-open\"><\/i> <span data-i18n=\"loadProject\">Muat Proyek<\/span><\/button>\r\n      <input type=\"file\" id=\"loadProjectFile\" accept=\".json\" style=\"display: none;\">\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Project Information -->\r\n  <div class=\"form-section\">\r\n    <h3 id=\"projectInfoTitle\">Informasi Project<\/h3>\r\n    <div class=\"form-row\">\r\n      <div class=\"form-group\">\r\n        <label id=\"projectNameLabel\">Nama Project<\/label>\r\n        <input type=\"text\" id=\"projectName\" placeholder=\"Misal: Ekspedisi Karang\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"surveyorLabel\">Nama Surveyor<\/label>\r\n        <input type=\"text\" id=\"surveyor\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"datetimeLabel\">Waktu (Tanggal & Jam)<\/label>\r\n        <input type=\"datetime-local\" id=\"datetime\" \/>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"form-row\">\r\n      <div class=\"form-group\">\r\n        <label id=\"siteNameLabel\">Nama Site<\/label>\r\n        <input type=\"text\" id=\"siteName\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"locationDescLabel\">Lokasi (deskripsi)<\/label>\r\n        <input type=\"text\" id=\"locationDesc\" \/>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"form-row\">\r\n      <div class=\"form-group\">\r\n        <label id=\"latitudeLabel\">Latitude<\/label>\r\n        <input type=\"number\" step=\"any\" id=\"lat\" value=\"-6.2088\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"longitudeLabel\">Longitude<\/label>\r\n        <input type=\"number\" step=\"any\" id=\"lng\" value=\"106.8456\" \/>\r\n      <\/div>\r\n    <\/div>\r\n    <div id=\"map\" class=\"map\"><\/div>\r\n\r\n    <div class=\"form-row\">\r\n      <div class=\"form-group\">\r\n        <label id=\"lineLengthLabel\">Metode \u2013 Panjang Line (m)<\/label>\r\n        <input type=\"number\" step=\"0.1\" id=\"lineLength\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"obsWidthLabel\">Metode \u2013 Lebar Pengamatan (m)<\/label>\r\n        <input type=\"number\" step=\"0.1\" id=\"obsWidth\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"waterConditionLabel\">Kondisi Perairan<\/label>\r\n        <input type=\"text\" id=\"waterCondition\" placeholder=\"Misal: Cerah, Berombak\" \/>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"depthLabel\">Kedalaman (m)<\/label>\r\n        <input type=\"number\" step=\"0.1\" id=\"depth\" \/>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Tingkat Identifikasi -->\r\n  <div class=\"form-section\">\r\n    <h3 id=\"identificationLevelTitle\">Tingkat Identifikasi<\/h3>\r\n    <div class=\"radio-group\">\r\n      <label><input type=\"radio\" name=\"level\" value=\"family\" checked> <span id=\"familyLabel\">Family<\/span><\/label>\r\n      <label><input type=\"radio\" name=\"level\" value=\"genus\"> <span id=\"genusLabel\">Genus<\/span><\/label>\r\n      <label><input type=\"radio\" name=\"level\" value=\"species\"> <span id=\"speciesLabel\">Spesies<\/span><\/label>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Form Pengisian Data Ikan -->\r\n  <div class=\"form-section\">\r\n    <h3 id=\"addFishDataTitle\">Tambah Data Ikan<\/h3>\r\n    <div class=\"form-row\">\r\n      <div class=\"form-group nama-group\">\r\n        <label id=\"taxonLabel\">Nama Family<\/label>\r\n        <input list=\"taxonDatalist\" id=\"taxonInput\" placeholder=\"Ketik untuk mencari...\" style=\"width:100%;\" \/>\r\n        <datalist id=\"taxonDatalist\"><\/datalist>\r\n      <\/div>\r\n      <div class=\"form-group kecil-group\">\r\n        <label id=\"countLabel\">Jumlah<\/label>\r\n        <input type=\"number\" id=\"count\" min=\"1\" value=\"1\" \/>\r\n      <\/div>\r\n      <div class=\"form-group kecil-group\">\r\n        <label id=\"sizeLabel\">Ukuran (cm, kelipatan 5)<\/label>\r\n        <input type=\"number\" id=\"size\" step=\"5\" min=\"0\" value=\"10\" \/>\r\n        <div id=\"sizeWarning\" class=\"warning\"><\/div>\r\n      <\/div>\r\n      <div class=\"form-group\">\r\n        <label id=\"biomassLabel\">Biomassa Total (gram)<\/label>\r\n        <input type=\"text\" id=\"biomassDisplay\" readonly value=\"0\" \/>\r\n      <\/div>\r\n      <div style=\"align-self: flex-end;\">\r\n        <button id=\"addEntryBtn\">\u2795 <span id=\"addButtonText\">Tambah ke Daftar<\/span><\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Container untuk preview gambar spesies (gaya baru) -->\r\n  <div id=\"preview-box\">\r\n    <div id=\"loader-text\">Mencari foto terbaik...<\/div>\r\n    <div class=\"image-container\">\r\n      <img decoding=\"async\" id=\"fish-img\" src=\"\" alt=\"Fish Preview\">\r\n    <\/div>\r\n    <p id=\"image-source\" style=\"font-size: 11px; margin-top: 12px; color: #999;\">Sumber Foto: Memuat...<\/p>\r\n    <hr style=\"border: 0; border-top: 1px solid #eee; margin: 15px 0;\">\r\n    <p id=\"biologyInfoText\" style=\"font-size: 13px; color: #555;\">Untuk informasi parameter biologi lengkap:<\/p>\r\n    <a id=\"fishbase-link\" href=\"#\" target=\"_blank\" style=\"display: inline-block; padding: 10px 20px; background: #0073aa; color: white; text-decoration: none; border-radius: 25px; font-size: 13px; font-weight: 600; transition: 0.3s; box-shadow: 0 2px 5px rgba(0,115,170,0.3);\">\r\n      \ud83d\udd0d <span id=\"fishbaseButtonText\">Buka Detail Spesies di FishBase.se<\/span>\r\n    <\/a>\r\n  <\/div>\r\n\r\n  <!-- Daftar Entri -->\r\n  <h3 id=\"fishListTitle\">Daftar Ikan<\/h3>\r\n  <table id=\"entriesTable\">\r\n    <thead>\r\n      <tr>\r\n        <th id=\"tableName\">Nama<\/th>\r\n        <th id=\"tableLevel\">Level<\/th>\r\n        <th id=\"tableCount\">Jumlah<\/th>\r\n        <th id=\"tableSize\">Ukuran (cm)<\/th>\r\n        <th id=\"tableBiomass\">Biomassa (gram)<\/th>\r\n        <th id=\"tableAction\">Aksi<\/th>\r\n      <\/tr>\r\n    <\/thead>\r\n    <tbody id=\"tableBody\"><\/tbody>\r\n  <\/table>\r\n\r\n  <div class=\"total-biomass\" id=\"totalBiomass\">Total Biomassa: 0 gram<\/div>\r\n\r\n  <!-- Pilihan Format Ekspor -->\r\n  <div class=\"format-group\">\r\n    <label id=\"exportFormatLabel\">Format Ekspor:<\/label>\r\n    <label><input type=\"radio\" name=\"exportFormat\" value=\"xlsx\" checked> Excel (.xlsx)<\/label>\r\n    <label><input type=\"radio\" name=\"exportFormat\" value=\"csv\"> CSV (.csv)<\/label>\r\n    <label><input type=\"radio\" name=\"exportFormat\" value=\"txt\"> TXT (.txt)<\/label>\r\n  <\/div>\r\n  <button class=\"export-btn\" id=\"exportBtn\">\ud83d\udce5 <span id=\"exportButtonText\">Ekspor<\/span><\/button>\r\n  <div id=\"loadError\" class=\"error-message\" style=\"display: none;\"><\/div>\r\n<\/div>\r\n\r\n<script>\r\n\/\/ ===================== KONFIGURASI BAHASA =====================\r\nlet currentLanguage = 'id';\r\n\r\nconst translations = {\r\n  id: {\r\n    mainTitle: '\ud83d\udccb Input Data Ikan',\r\n    projectInfoTitle: 'Informasi Project',\r\n    projectNameLabel: 'Nama Project',\r\n    surveyorLabel: 'Nama Surveyor',\r\n    datetimeLabel: 'Waktu (Tanggal & Jam)',\r\n    siteNameLabel: 'Nama Site',\r\n    locationDescLabel: 'Lokasi (deskripsi)',\r\n    latitudeLabel: 'Latitude',\r\n    longitudeLabel: 'Longitude',\r\n    lineLengthLabel: 'Metode \u2013 Panjang Line (m)',\r\n    obsWidthLabel: 'Metode \u2013 Lebar Pengamatan (m)',\r\n    waterConditionLabel: 'Kondisi Perairan',\r\n    depthLabel: 'Kedalaman (m)',\r\n    identificationLevelTitle: 'Tingkat Identifikasi',\r\n    familyLabel: 'Family',\r\n    genusLabel: 'Genus',\r\n    speciesLabel: 'Spesies',\r\n    addFishDataTitle: 'Tambah Data Ikan',\r\n    taxonLabel: 'Nama Family',\r\n    countLabel: 'Jumlah',\r\n    sizeLabel: 'Ukuran (cm, kelipatan 5)',\r\n    biomassLabel: 'Biomassa Total (gram)',\r\n    addButtonText: 'Tambah ke Daftar',\r\n    loaderText: 'Mencari foto terbaik...',\r\n    imageSource: 'Sumber Foto: Memuat...',\r\n    biologyInfoText: 'Untuk informasi parameter biologi lengkap:',\r\n    fishbaseButtonText: 'Buka Detail Spesies di FishBase.se',\r\n    fishListTitle: 'Daftar Ikan',\r\n    tableName: 'Nama',\r\n    tableLevel: 'Level',\r\n    tableCount: 'Jumlah',\r\n    tableSize: 'Ukuran (cm)',\r\n    tableBiomass: 'Biomassa (gram)',\r\n    tableAction: 'Aksi',\r\n    totalBiomass: 'Total Biomassa: 0 gram',\r\n    exportFormatLabel: 'Format Ekspor:',\r\n    exportButtonText: 'Ekspor',\r\n    removeButtonText: 'Hapus',\r\n    searchPlaceholder: 'Ketik untuk mencari...',\r\n    waterConditionPlaceholder: 'Misal: Cerah, Berombak',\r\n    projectNamePlaceholder: 'Misal: Ekspedisi Karang',\r\n    sizeWarning: 'Ukuran melebihi batas normal (maks ',\r\n    sizeWarningEnd: ' cm)',\r\n    alertEnterName: 'Masukkan nama terlebih dahulu!',\r\n    alertNameNotFound: 'Nama tidak ditemukan dalam database. Pilih dari saran.',\r\n    alertDataCannotAdd: 'Data tidak dapat ditambahkan.',\r\n    saveProject: 'Simpan Proyek',\r\n    loadProject: 'Muat Proyek'\r\n  },\r\n  en: {\r\n    mainTitle: '\ud83d\udccb Fish Data Entry',\r\n    projectInfoTitle: 'Project Information',\r\n    projectNameLabel: 'Project Name',\r\n    surveyorLabel: 'Surveyor Name',\r\n    datetimeLabel: 'Date & Time',\r\n    siteNameLabel: 'Site Name',\r\n    locationDescLabel: 'Location (description)',\r\n    latitudeLabel: 'Latitude',\r\n    longitudeLabel: 'Longitude',\r\n    lineLengthLabel: 'Method \u2013 Line Length (m)',\r\n    obsWidthLabel: 'Method \u2013 Observation Width (m)',\r\n    waterConditionLabel: 'Water Condition',\r\n    depthLabel: 'Depth (m)',\r\n    identificationLevelTitle: 'Identification Level',\r\n    familyLabel: 'Family',\r\n    genusLabel: 'Genus',\r\n    speciesLabel: 'Species',\r\n    addFishDataTitle: 'Add Fish Data',\r\n    taxonLabel: 'Family Name',\r\n    countLabel: 'Count',\r\n    sizeLabel: 'Size (cm, multiple of 5)',\r\n    biomassLabel: 'Total Biomass (grams)',\r\n    addButtonText: 'Add to List',\r\n    loaderText: 'Searching for best photo...',\r\n    imageSource: 'Image Source: Loading...',\r\n    biologyInfoText: 'For complete biological parameter information:',\r\n    fishbaseButtonText: 'Open Species Details on FishBase.se',\r\n    fishListTitle: 'Fish List',\r\n    tableName: 'Name',\r\n    tableLevel: 'Level',\r\n    tableCount: 'Count',\r\n    tableSize: 'Size (cm)',\r\n    tableBiomass: 'Biomass (grams)',\r\n    tableAction: 'Action',\r\n    totalBiomass: 'Total Biomass: 0 grams',\r\n    exportFormatLabel: 'Export Format:',\r\n    exportButtonText: 'Export',\r\n    removeButtonText: 'Remove',\r\n    searchPlaceholder: 'Type to search...',\r\n    waterConditionPlaceholder: 'E.g., Clear, Wavy',\r\n    projectNamePlaceholder: 'E.g., Reef Expedition',\r\n    sizeWarning: 'Size exceeds normal limit (max ',\r\n    sizeWarningEnd: ' cm)',\r\n    alertEnterName: 'Please enter a name first!',\r\n    alertNameNotFound: 'Name not found in database. Select from suggestions.',\r\n    alertDataCannotAdd: 'Data cannot be added.',\r\n    saveProject: 'Save Project',\r\n    loadProject: 'Load Project'\r\n  }\r\n};\r\n\r\nfunction setLanguage(lang) {\r\n  currentLanguage = lang;\r\n  \r\n  \/\/ Update active button states\r\n  document.getElementById('langID').classList.toggle('active', lang === 'id');\r\n  document.getElementById('langEN').classList.toggle('active', lang === 'en');\r\n  \r\n  \/\/ Update all text elements\r\n  document.getElementById('mainTitle').textContent = translations[lang].mainTitle;\r\n  document.getElementById('projectInfoTitle').textContent = translations[lang].projectInfoTitle;\r\n  document.getElementById('projectNameLabel').textContent = translations[lang].projectNameLabel;\r\n  document.getElementById('surveyorLabel').textContent = translations[lang].surveyorLabel;\r\n  document.getElementById('datetimeLabel').textContent = translations[lang].datetimeLabel;\r\n  document.getElementById('siteNameLabel').textContent = translations[lang].siteNameLabel;\r\n  document.getElementById('locationDescLabel').textContent = translations[lang].locationDescLabel;\r\n  document.getElementById('latitudeLabel').textContent = translations[lang].latitudeLabel;\r\n  document.getElementById('longitudeLabel').textContent = translations[lang].longitudeLabel;\r\n  document.getElementById('lineLengthLabel').textContent = translations[lang].lineLengthLabel;\r\n  document.getElementById('obsWidthLabel').textContent = translations[lang].obsWidthLabel;\r\n  document.getElementById('waterConditionLabel').textContent = translations[lang].waterConditionLabel;\r\n  document.getElementById('depthLabel').textContent = translations[lang].depthLabel;\r\n  document.getElementById('identificationLevelTitle').textContent = translations[lang].identificationLevelTitle;\r\n  document.getElementById('familyLabel').textContent = translations[lang].familyLabel;\r\n  document.getElementById('genusLabel').textContent = translations[lang].genusLabel;\r\n  document.getElementById('speciesLabel').textContent = translations[lang].speciesLabel;\r\n  document.getElementById('addFishDataTitle').textContent = translations[lang].addFishDataTitle;\r\n  document.getElementById('countLabel').textContent = translations[lang].countLabel;\r\n  document.getElementById('sizeLabel').textContent = translations[lang].sizeLabel;\r\n  document.getElementById('biomassLabel').textContent = translations[lang].biomassLabel;\r\n  document.getElementById('addButtonText').textContent = translations[lang].addButtonText;\r\n  document.getElementById('loader-text').textContent = translations[lang].loaderText;\r\n  document.getElementById('biologyInfoText').textContent = translations[lang].biologyInfoText;\r\n  document.getElementById('fishbaseButtonText').textContent = translations[lang].fishbaseButtonText;\r\n  document.getElementById('fishListTitle').textContent = translations[lang].fishListTitle;\r\n  document.getElementById('tableName').textContent = translations[lang].tableName;\r\n  document.getElementById('tableLevel').textContent = translations[lang].tableLevel;\r\n  document.getElementById('tableCount').textContent = translations[lang].tableCount;\r\n  document.getElementById('tableSize').textContent = translations[lang].tableSize;\r\n  document.getElementById('tableBiomass').textContent = translations[lang].tableBiomass;\r\n  document.getElementById('tableAction').textContent = translations[lang].tableAction;\r\n  document.getElementById('exportFormatLabel').textContent = translations[lang].exportFormatLabel;\r\n  document.getElementById('exportButtonText').textContent = translations[lang].exportButtonText;\r\n  \r\n  \/\/ Update placeholders\r\n  document.getElementById('taxonInput').placeholder = translations[lang].searchPlaceholder;\r\n  document.getElementById('waterCondition').placeholder = translations[lang].waterConditionPlaceholder;\r\n  document.getElementById('projectName').placeholder = translations[lang].projectNamePlaceholder;\r\n  \r\n  \/\/ Update taxon label based on current level\r\n  const level = document.querySelector('input[name=\"level\"]:checked').value;\r\n  document.getElementById('taxonLabel').textContent = level === 'family' ? \r\n    (lang === 'id' ? 'Nama Family' : 'Family Name') : \r\n    (level === 'genus' ? (lang === 'id' ? 'Nama Genus' : 'Genus Name') : \r\n    (lang === 'id' ? 'Nama Spesies' : 'Species Name'));\r\n  \r\n  \/\/ Update total biomass text\r\n  updateTotalBiomass();\r\n  \r\n  \/\/ Re-render table to update remove button text\r\n  renderTable();\r\n}\r\n\r\n\/\/ ===================== KONFIGURASI =====================\r\nconst FAMILY_CSV_URL = '\/wp-content\/uploads\/Ikan\/Fish_Families.csv';\r\nconst GENUS_CSV_URL  = '\/wp-content\/uploads\/Ikan\/Fish_Genera.csv';\r\nconst SPECIES_CSV_URL = '\/wp-content\/uploads\/Ikan\/Fish_Species.csv';\r\n\r\n\/\/ Global data containers\r\nlet families = [];\r\nlet genera = [];\r\nlet species = [];\r\nlet genusMaxLength = {};\r\nlet speciesLookup = {};\r\nlet familyMaxSize = {};\r\n\r\nlet dataLoaded = false;\r\n\r\n\/\/ ===================== DEBOUNCE TIMER =====================\r\nlet searchTimeout;\r\n\r\n\/\/ ===================== FUNGSI CSV PARSER =====================\r\nfunction parseCSV(csvText) {\r\n  const lines = csvText.trim().split('\\n');\r\n  if (lines.length < 2) return [];\r\n  const headers = lines[0].split(',').map(h => h.trim());\r\n  const result = [];\r\n  for (let i = 1; i < lines.length; i++) {\r\n    const line = lines[i].trim();\r\n    if (line === '') continue;\r\n    const values = line.split(',').map(v => v.trim());\r\n    if (values.length !== headers.length) {\r\n      console.warn(`Baris ${i+1} memiliki jumlah kolom berbeda, dilewati.`);\r\n      continue;\r\n    }\r\n    const obj = {};\r\n    for (let j = 0; j < headers.length; j++) {\r\n      let val = values[j];\r\n      if (val !== '' && !isNaN(val)) obj[headers[j]] = parseFloat(val);\r\n      else obj[headers[j]] = val;\r\n    }\r\n    if (obj.Name && obj['Biomass Constant A'] && !isNaN(obj['Biomass Constant A'])) {\r\n      result.push(obj);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n\/\/ ===================== MUAT DATA =====================\r\nasync function loadData() {\r\n  const errorDiv = document.getElementById('loadError');\r\n  try {\r\n    const [famRes, genRes, speRes] = await Promise.all([\r\n      fetch(FAMILY_CSV_URL),\r\n      fetch(GENUS_CSV_URL),\r\n      fetch(SPECIES_CSV_URL)\r\n    ]);\r\n    \r\n    if (!famRes.ok || !genRes.ok || !speRes.ok) {\r\n      throw new Error('Gagal mengambil file CSV. Pastikan file sudah diupload dan dapat diakses.');\r\n    }\r\n    \r\n    const famText = await famRes.text();\r\n    const genText = await genRes.text();\r\n    const speText = await speRes.text();\r\n\r\n    families = parseCSV(famText);\r\n    genera = parseCSV(genText);\r\n    species = parseCSV(speText);\r\n\r\n    if (families.length === 0 || genera.length === 0 || species.length === 0) {\r\n      throw new Error('File CSV kosong atau format tidak sesuai.');\r\n    }\r\n\r\n    species.forEach(s => {\r\n      speciesLookup[s.Name] = s;\r\n      const nameParts = s.Name.split(' ');\r\n      if (nameParts.length >= 1) {\r\n        const genusName = nameParts[0];\r\n        const maxLen = s['Max Length (cm)'] || 0;\r\n        if (!genusMaxLength[genusName] || maxLen > genusMaxLength[genusName]) {\r\n          genusMaxLength[genusName] = maxLen;\r\n        }\r\n      }\r\n    });\r\n\r\n    families.forEach(fam => {\r\n      const stem = fam.Name.replace(\/idae$\/i, '').toLowerCase();\r\n      let max = 0;\r\n      genera.forEach(gen => {\r\n        if (gen.Name.toLowerCase().startsWith(stem)) {\r\n          const genMax = genusMaxLength[gen.Name] || 0;\r\n          if (genMax > max) max = genMax;\r\n        }\r\n      });\r\n      familyMaxSize[fam.Name] = max > 0 ? max : 500;\r\n    });\r\n\r\n    dataLoaded = true;\r\n    errorDiv.style.display = 'none';\r\n    populateDatalist('family');\r\n    updateBiomassDisplay();\r\n  } catch (error) {\r\n    console.error('Gagal memuat data:', error);\r\n    errorDiv.style.display = 'block';\r\n    errorDiv.textContent = 'Gagal memuat data: ' + error.message + ' Periksa path file dan izin akses.';\r\n  }\r\n}\r\n\r\n\/\/ ===================== POPULATE DATALIST =====================\r\nfunction populateDatalist(level) {\r\n  const datalist = document.getElementById('taxonDatalist');\r\n  datalist.innerHTML = '';\r\n  let options = [];\r\n\r\n  if (level === 'family') {\r\n    families.forEach(f => options.push(f.Name));\r\n  } else if (level === 'genus') {\r\n    genera.forEach(g => options.push(g.Name));\r\n  } else if (level === 'species') {\r\n    species.forEach(s => options.push(s.Name));\r\n  }\r\n\r\n  options.sort((a, b) => a.localeCompare(b));\r\n  options.forEach(opt => {\r\n    const option = document.createElement('option');\r\n    option.value = opt;\r\n    datalist.appendChild(option);\r\n  });\r\n}\r\n\r\n\/\/ ===================== HITUNG BIOMASSA & AMBIL KONSTANTA =====================\r\nfunction getConstants(level, taxonName) {\r\n  if (!dataLoaded) return { A: 0, B: 0 };\r\n  if (level === 'family') {\r\n    const fam = families.find(f => f.Name === taxonName);\r\n    if (fam) return { A: fam['Biomass Constant A'], B: fam['Biomass Constant B'] };\r\n  } else if (level === 'genus') {\r\n    const gen = genera.find(g => g.Name === taxonName);\r\n    if (gen) return { A: gen['Biomass Constant A'], B: gen['Biomass Constant B'] };\r\n  } else if (level === 'species') {\r\n    const sp = speciesLookup[taxonName];\r\n    if (sp) return { A: sp['Biomass Constant A'], B: sp['Biomass Constant B'] };\r\n  }\r\n  return { A: 0, B: 0 };\r\n}\r\n\r\nfunction calculateBiomass(level, taxonName, sizeCm) {\r\n  const { A, B } = getConstants(level, taxonName);\r\n  if (!A || !B || isNaN(A) || isNaN(B)) return 0;\r\n  return A * Math.pow(sizeCm, B); \/\/ hasil dalam gram\r\n}\r\n\r\n\/\/ ===================== VALIDASI UKURAN =====================\r\nfunction validateSize(level, taxonName, sizeCm) {\r\n  if (!dataLoaded) return null;\r\n  let max = 500;\r\n  if (level === 'species') {\r\n    const sp = speciesLookup[taxonName];\r\n    if (sp && sp['Max Length (cm)']) max = sp['Max Length (cm)'];\r\n  } else if (level === 'genus') {\r\n    max = genusMaxLength[taxonName] || 500;\r\n  } else if (level === 'family') {\r\n    max = familyMaxSize[taxonName] || 500;\r\n  }\r\n  if (sizeCm > max) {\r\n    return `\u26a0\ufe0f ${translations[currentLanguage].sizeWarning}${max}${translations[currentLanguage].sizeWarningEnd}`;\r\n  }\r\n  return null;\r\n}\r\n\r\n\/\/ ===================== UPDATE BIOMASSA DISPLAY =====================\r\nfunction updateBiomassDisplay() {\r\n  const level = document.querySelector('input[name=\"level\"]:checked').value;\r\n  const taxon = document.getElementById('taxonInput').value;\r\n  if (!taxon) {\r\n    document.getElementById('biomassDisplay').value = '0';\r\n    return;\r\n  }\r\n  const size = parseFloat(document.getElementById('size').value) || 0;\r\n  const count = parseInt(document.getElementById('count').value) || 1;\r\n  const biomass = calculateBiomass(level, taxon, size) * count; \/\/ dalam gram\r\n  document.getElementById('biomassDisplay').value = biomass.toFixed(2);\r\n\r\n  const warningMsg = validateSize(level, taxon, size);\r\n  const warningDiv = document.getElementById('sizeWarning');\r\n  if (warningMsg) {\r\n    warningDiv.style.display = 'block';\r\n    warningDiv.textContent = warningMsg;\r\n  } else {\r\n    warningDiv.style.display = 'none';\r\n  }\r\n}\r\n\r\n\/\/ ===================== FUNGSI UPDATE GAMBAR (Optimasi Kecepatan) =====================\r\nasync function updateSpeciesImage() {\r\n    const level = document.querySelector('input[name=\"level\"]:checked').value;\r\n    const taxon = document.getElementById('taxonInput').value.trim();\r\n    const previewBox = document.getElementById('preview-box');\r\n    const img = document.getElementById('fish-img');\r\n    const loader = document.getElementById('loader-text');\r\n    const sourceText = document.getElementById('image-source');\r\n    const fbLink = document.getElementById('fishbase-link');\r\n\r\n    \/\/ Sembunyikan jika bukan level spesies atau nama terlalu pendek\r\n    if (level !== 'species' || taxon.length < 3) {\r\n        previewBox.style.display = 'none';\r\n        return;\r\n    }\r\n\r\n    \/\/ Tampilkan UI Loading\r\n    previewBox.style.display = 'block';\r\n    loader.style.display = 'block';\r\n    loader.innerText = currentLanguage === 'id' ? \"Mencari foto spesifik...\" : \"Searching for specific photo...\";\r\n    img.style.opacity = '0.1';\r\n\r\n    \/\/ 1. Set FishBase Link (Cepat\/Tanpa API)\r\n    const fbFormatted = taxon.replace(\/\\s+\/g, '-');\r\n    fbLink.href = `https:\/\/www.fishbase.se\/summary\/${fbFormatted}.html`;\r\n\r\n    \/\/ 2. Cek apakah nama lengkap (Minimal 2 kata untuk spesies)\r\n    const parts = taxon.split(' ');\r\n    if (parts.length < 2) {\r\n        loader.innerText = currentLanguage === 'id' ? \"Ketik nama spesies lengkap...\" : \"Type complete species name...\";\r\n        return;\r\n    }\r\n\r\n    \/\/ 3. Request ke Wikimedia\r\n    const wikiUrl = `https:\/\/commons.wikimedia.org\/w\/api.php?action=query&format=json&prop=pageimages&generator=search&gsrsearch=intitle:\"${encodeURIComponent(taxon)}\"&gsrlimit=1&piprop=thumbnail&pithumbsize=800&origin=*`;\r\n\r\n    try {\r\n        const response = await fetch(wikiUrl);\r\n        const data = await response.json();\r\n\r\n        if (data.query && data.query.pages) {\r\n            const pageId = Object.keys(data.query.pages)[0];\r\n            const page = data.query.pages[pageId];\r\n            if (page.thumbnail) {\r\n                img.src = page.thumbnail.source;\r\n                sourceText.innerText = currentLanguage === 'id' ? \"Sumber: Wikimedia Commons\" : \"Source: Wikimedia Commons\";\r\n            } else { throw new Error(); }\r\n        } else { throw new Error(); }\r\n    } catch (err) {\r\n        \/\/ Fallback langsung ke FishBase (Lebih Cepat)\r\n        const gCode = parts[0].substring(0, 2).toLowerCase();\r\n        const sCode = parts[1].substring(0, 2).toLowerCase();\r\n        img.src = `https:\/\/images.weserv.nl\/?url=www.fishbase.se\/images\/species\/${gCode}${sCode}_u0.jpg&default=https:\/\/via.placeholder.com\/400x200?text=Foto+Tidak+Tersedia`;\r\n        sourceText.innerText = currentLanguage === 'id' ? \"Sumber: FishBase Archive\" : \"Source: FishBase Archive\";\r\n    }\r\n\r\n    img.onload = () => {\r\n        loader.style.display = 'none';\r\n        img.style.opacity = '1';\r\n    };\r\n}\r\n\r\n\/\/ ===================== TAMBAH ENTRI KE TABEL =====================\r\nlet entries = [];\r\n\r\nfunction addEntry() {\r\n  const level = document.querySelector('input[name=\"level\"]:checked').value;\r\n  const taxon = document.getElementById('taxonInput').value.trim();\r\n  if (!taxon) { alert(translations[currentLanguage].alertEnterName); return; }\r\n\r\n  let valid = false;\r\n  if (level === 'family') valid = families.some(f => f.Name === taxon);\r\n  else if (level === 'genus') valid = genera.some(g => g.Name === taxon);\r\n  else valid = speciesLookup.hasOwnProperty(taxon);\r\n  if (!valid) { alert(translations[currentLanguage].alertNameNotFound); return; }\r\n\r\n  const count = parseInt(document.getElementById('count').value) || 1;\r\n  const size = parseFloat(document.getElementById('size').value) || 0;\r\n\r\n  const warningMsg = validateSize(level, taxon, size);\r\n  if (warningMsg) {\r\n    alert(warningMsg + '\\n' + translations[currentLanguage].alertDataCannotAdd);\r\n    return;\r\n  }\r\n\r\n  const { A, B } = getConstants(level, taxon);\r\n  const biomass = calculateBiomass(level, taxon, size) * count;\r\n\r\n  \/\/ Ambil trophic dan functional dari data (untuk species, dari CSV; untuk lain-lain, \"N\/A\")\r\n  let trophic = 'N\/A';\r\n  let functional = 'N\/A';\r\n  if (level === 'species') {\r\n    const sp = speciesLookup[taxon];\r\n    if (sp) {\r\n      trophic = sp['Trophic Group'] || 'N\/A';\r\n      functional = sp['Functional Group'] || 'N\/A';\r\n    }\r\n  }\r\n\r\n  entries.push({ \r\n    level, \r\n    taxon, \r\n    count, \r\n    size, \r\n    biomass,\r\n    constA: A,\r\n    constB: B,\r\n    trophic,\r\n    functional\r\n  });\r\n\r\n  renderTable();\r\n  updateTotalBiomass();\r\n\r\n  \/\/ Reset form\r\n  document.getElementById('count').value = 1;\r\n  document.getElementById('size').value = 10;\r\n  document.getElementById('taxonInput').value = '';\r\n  updateBiomassDisplay();\r\n  updateSpeciesImage(); \/\/ update gambar setelah reset\r\n}\r\n\r\nfunction renderTable() {\r\n  const tbody = document.getElementById('tableBody');\r\n  tbody.innerHTML = '';\r\n  entries.forEach((entry, index) => {\r\n    const row = tbody.insertRow();\r\n    row.innerHTML = `\r\n      <td>${entry.taxon}<\/td>\r\n      <td>${entry.level}<\/td>\r\n      <td>${entry.count}<\/td>\r\n      <td>${entry.size}<\/td>\r\n      <td>${entry.biomass.toFixed(2)}<\/td>\r\n      <td><button class=\"remove-btn\" onclick=\"removeEntry(${index})\">${translations[currentLanguage].removeButtonText}<\/button><\/td>\r\n    `;\r\n  });\r\n}\r\n\r\nfunction removeEntry(index) {\r\n  entries.splice(index, 1);\r\n  renderTable();\r\n  updateTotalBiomass();\r\n}\r\n\r\nfunction updateTotalBiomass() {\r\n  const total = entries.reduce((sum, e) => sum + e.biomass, 0);\r\n  document.getElementById('totalBiomass').textContent = \r\n    (currentLanguage === 'id' ? 'Total Biomassa: ' : 'Total Biomass: ') + \r\n    total.toFixed(2) + \r\n    (currentLanguage === 'id' ? ' gram' : ' grams');\r\n}\r\n\r\n\/\/ ===================== EKSPOR DENGAN FORMAT =====================\r\nfunction exportToFile() {\r\n  const format = document.querySelector('input[name=\"exportFormat\"]:checked').value;\r\n\r\n  const projectData = {\r\n    [currentLanguage === 'id' ? 'Nama Project' : 'Project Name']: document.getElementById('projectName').value,\r\n    [currentLanguage === 'id' ? 'Surveyor' : 'Surveyor']: document.getElementById('surveyor').value,\r\n    [currentLanguage === 'id' ? 'Waktu' : 'Date\/Time']: document.getElementById('datetime').value,\r\n    [currentLanguage === 'id' ? 'Site' : 'Site']: document.getElementById('siteName').value,\r\n    [currentLanguage === 'id' ? 'Lokasi' : 'Location']: document.getElementById('locationDesc').value,\r\n    'Latitude': document.getElementById('lat').value,\r\n    'Longitude': document.getElementById('lng').value,\r\n    [currentLanguage === 'id' ? 'Panjang Line (m)' : 'Line Length (m)']: document.getElementById('lineLength').value,\r\n    [currentLanguage === 'id' ? 'Lebar Pengamatan (m)' : 'Observation Width (m)']: document.getElementById('obsWidth').value,\r\n    [currentLanguage === 'id' ? 'Kondisi Perairan' : 'Water Condition']: document.getElementById('waterCondition').value,\r\n    [currentLanguage === 'id' ? 'Kedalaman (m)' : 'Depth (m)']: document.getElementById('depth').value,\r\n  };\r\n\r\n  const fishData = entries.map(e => ({\r\n    Level: e.level,\r\n    [currentLanguage === 'id' ? 'Nama' : 'Name']: e.taxon,\r\n    [currentLanguage === 'id' ? 'Jumlah' : 'Count']: e.count,\r\n    [currentLanguage === 'id' ? 'Ukuran (cm)' : 'Size (cm)']: e.size,\r\n    [currentLanguage === 'id' ? 'Biomassa (gram)' : 'Biomass (g)']: e.biomass.toFixed(2),\r\n    'Biomass Constant A': e.constA.toFixed(6),\r\n    'Biomass Constant B': e.constB.toFixed(6),\r\n    'Trophic Group': e.trophic,\r\n    'Functional Group': e.functional\r\n  }));\r\n\r\n  if (format === 'xlsx') {\r\n    const wb = XLSX.utils.book_new();\r\n\r\n    \/\/ Sheet 1: Info Project\r\n    const projectSheetData = [[currentLanguage === 'id' ? 'Field' : 'Field', currentLanguage === 'id' ? 'Value' : 'Value']];\r\n    for (let [key, val] of Object.entries(projectData)) {\r\n      projectSheetData.push([key, val]);\r\n    }\r\n    const wsProject = XLSX.utils.aoa_to_sheet(projectSheetData);\r\n    XLSX.utils.book_append_sheet(wb, wsProject, currentLanguage === 'id' ? 'Info Project' : 'Project Info');\r\n\r\n    \/\/ Sheet 2: Data Ikan\r\n    const wsFish = XLSX.utils.json_to_sheet(fishData);\r\n    XLSX.utils.book_append_sheet(wb, wsFish, currentLanguage === 'id' ? 'Data Ikan' : 'Fish Data');\r\n\r\n    \/\/ Sheet 3: Biomassa per Luasan\r\n    const panjang = parseFloat(projectData[currentLanguage === 'id' ? 'Panjang Line (m)' : 'Line Length (m)']) || 0;\r\n    const lebar = parseFloat(projectData[currentLanguage === 'id' ? 'Lebar Pengamatan (m)' : 'Observation Width (m)']) || 0;\r\n    const luas = panjang * lebar;\r\n    const totalBiomassGram = entries.reduce((sum, e) => sum + e.biomass, 0);\r\n    const biomassaPerLuasan = luas > 0 ? (totalBiomassGram \/ luas).toFixed(2) : 0;\r\n\r\n    const luasanData = [\r\n      [currentLanguage === 'id' ? 'Parameter' : 'Parameter', currentLanguage === 'id' ? 'Nilai' : 'Value'],\r\n      [currentLanguage === 'id' ? 'Panjang Line (m)' : 'Line Length (m)', panjang],\r\n      [currentLanguage === 'id' ? 'Lebar Pengamatan (m)' : 'Observation Width (m)', lebar],\r\n      [currentLanguage === 'id' ? 'Luas Area (m\u00b2)' : 'Area (m\u00b2)', luas.toFixed(2)],\r\n      [currentLanguage === 'id' ? 'Total Biomassa (gram)' : 'Total Biomass (g)', totalBiomassGram.toFixed(2)],\r\n      [currentLanguage === 'id' ? 'Biomassa per Luasan (g\/m\u00b2)' : 'Biomass per Area (g\/m\u00b2)', biomassaPerLuasan]\r\n    ];\r\n    const wsLuasan = XLSX.utils.aoa_to_sheet(luasanData);\r\n    XLSX.utils.book_append_sheet(wb, wsLuasan, currentLanguage === 'id' ? 'Biomassa per Luasan' : 'Biomass per Area');\r\n\r\n    \/\/ Export file\r\n    XLSX.writeFile(wb, 'fish_data.xlsx');\r\n  } else {\r\n    \/\/ Untuk CSV dan TXT, buat teks dengan kolom Trophic & Functional\r\n    let csvContent = (currentLanguage === 'id' ? 'Data Project' : 'Project Data') + '\\n';\r\n    for (let [key, val] of Object.entries(projectData)) {\r\n      csvContent += `\"${key}\",\"${val}\"\\n`;\r\n    }\r\n    csvContent += '\\n' + (currentLanguage === 'id' ? 'Data Ikan' : 'Fish Data') + '\\n';\r\n    \r\n    const headers = currentLanguage === 'id' \r\n      ? 'Level,Nama,Jumlah,Ukuran (cm),Biomassa (gram),Biomass Constant A,Biomass Constant B,Trophic Group,Functional Group\\n'\r\n      : 'Level,Name,Count,Size (cm),Biomass (g),Biomass Constant A,Biomass Constant B,Trophic Group,Functional Group\\n';\r\n    \r\n    csvContent += headers;\r\n    \r\n    entries.forEach(e => {\r\n      csvContent += `${e.level},\"${e.taxon}\",${e.count},${e.size},${e.biomass.toFixed(2)},${e.constA.toFixed(6)},${e.constB.toFixed(6)},\"${e.trophic}\",\"${e.functional}\"\\n`;\r\n    });\r\n\r\n    let mimeType = 'text\/csv;charset=utf-8;';\r\n    let fileName = `fish_data.${format}`;\r\n    if (format === 'txt') {\r\n      mimeType = 'text\/plain;charset=utf-8;';\r\n    }\r\n\r\n    const blob = new Blob([\"\\uFEFF\" + csvContent], { type: mimeType });\r\n    const link = document.createElement('a');\r\n    const url = URL.createObjectURL(blob);\r\n    link.setAttribute('href', url);\r\n    link.setAttribute('download', fileName);\r\n    link.style.visibility = 'hidden';\r\n    document.body.appendChild(link);\r\n    link.click();\r\n    document.body.removeChild(link);\r\n  }\r\n}\r\n\r\n\/\/ ===================== FUNGSI SIMPAN PROYEK =====================\r\nfunction saveProject() {\r\n  \/\/ Kumpulkan semua data proyek\r\n  const projectInfo = {\r\n    projectName: document.getElementById('projectName').value,\r\n    surveyor: document.getElementById('surveyor').value,\r\n    datetime: document.getElementById('datetime').value,\r\n    siteName: document.getElementById('siteName').value,\r\n    locationDesc: document.getElementById('locationDesc').value,\r\n    lat: document.getElementById('lat').value,\r\n    lng: document.getElementById('lng').value,\r\n    lineLength: document.getElementById('lineLength').value,\r\n    obsWidth: document.getElementById('obsWidth').value,\r\n    waterCondition: document.getElementById('waterCondition').value,\r\n    depth: document.getElementById('depth').value,\r\n    identificationLevel: document.querySelector('input[name=\"level\"]:checked').value,\r\n    entries: entries \/\/ array objek ikan\r\n  };\r\n\r\n  const jsonStr = JSON.stringify(projectInfo, null, 2);\r\n  const blob = new Blob([jsonStr], { type: 'application\/json' });\r\n  const url = URL.createObjectURL(blob);\r\n  const a = document.createElement('a');\r\n  a.href = url;\r\n  a.download = `proyek_ikan_${new Date().toISOString().slice(0,10)}.json`;\r\n  a.click();\r\n  URL.revokeObjectURL(url);\r\n}\r\n\r\n\/\/ ===================== FUNGSI MUAT PROYEK =====================\r\nfunction loadProject(file) {\r\n  const reader = new FileReader();\r\n  reader.onload = function(e) {\r\n    try {\r\n      const projectInfo = JSON.parse(e.target.result);\r\n\r\n      \/\/ Isi kembali input field\r\n      document.getElementById('projectName').value = projectInfo.projectName || '';\r\n      document.getElementById('surveyor').value = projectInfo.surveyor || '';\r\n      document.getElementById('datetime').value = projectInfo.datetime || '';\r\n      document.getElementById('siteName').value = projectInfo.siteName || '';\r\n      document.getElementById('locationDesc').value = projectInfo.locationDesc || '';\r\n      document.getElementById('lat').value = projectInfo.lat || '-6.2088';\r\n      document.getElementById('lng').value = projectInfo.lng || '106.8456';\r\n      document.getElementById('lineLength').value = projectInfo.lineLength || '';\r\n      document.getElementById('obsWidth').value = projectInfo.obsWidth || '';\r\n      document.getElementById('waterCondition').value = projectInfo.waterCondition || '';\r\n      document.getElementById('depth').value = projectInfo.depth || '';\r\n\r\n      \/\/ Set level identifikasi\r\n      const level = projectInfo.identificationLevel || 'family';\r\n      document.querySelector(`input[name=\"level\"][value=\"${level}\"]`).checked = true;\r\n      \/\/ Trigger change event untuk update label dan datalist\r\n      const event = new Event('change', { bubbles: true });\r\n      document.querySelector(`input[name=\"level\"][value=\"${level}\"]`).dispatchEvent(event);\r\n\r\n      \/\/ Muat entries\r\n      entries = projectInfo.entries || [];\r\n      renderTable();\r\n      updateTotalBiomass();\r\n\r\n      \/\/ Perbarui peta\r\n      const lat = parseFloat(projectInfo.lat) || -6.2088;\r\n      const lng = parseFloat(projectInfo.lng) || 106.8456;\r\n      if (window.map && window.marker) {\r\n        window.map.setView([lat, lng], 13);\r\n        window.marker.setLatLng([lat, lng]);\r\n      }\r\n\r\n      \/\/ Perbarui datalist sesuai level\r\n      if (dataLoaded) {\r\n        populateDatalist(level);\r\n        updateBiomassDisplay();\r\n      }\r\n    } catch (err) {\r\n      alert('Gagal memuat proyek: ' + err);\r\n    }\r\n  };\r\n  reader.readAsText(file);\r\n}\r\n\r\n\/\/ ===================== INISIALISASI PETA =====================\r\nfunction initMap() {\r\n  const lat = parseFloat(document.getElementById('lat').value) || -6.2088;\r\n  const lng = parseFloat(document.getElementById('lng').value) || 106.8456;\r\n  const map = L.map('map').setView([lat, lng], 13);\r\n  L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\r\n    attribution: '\u00a9 OpenStreetMap contributors'\r\n  }).addTo(map);\r\n  let marker = L.marker([lat, lng], { draggable: true }).addTo(map);\r\n\r\n  marker.on('dragend', function(e) {\r\n    const pos = e.target.getLatLng();\r\n    document.getElementById('lat').value = pos.lat.toFixed(6);\r\n    document.getElementById('lng').value = pos.lng.toFixed(6);\r\n  });\r\n\r\n  map.on('click', function(e) {\r\n    marker.setLatLng(e.latlng);\r\n    document.getElementById('lat').value = e.latlng.lat.toFixed(6);\r\n    document.getElementById('lng').value = e.latlng.lng.toFixed(6);\r\n  });\r\n\r\n  document.getElementById('lat').addEventListener('change', function() {\r\n    const newLat = parseFloat(this.value) || lat;\r\n    const newLng = parseFloat(document.getElementById('lng').value) || lng;\r\n    marker.setLatLng([newLat, newLng]);\r\n    map.setView([newLat, newLng]);\r\n  });\r\n  document.getElementById('lng').addEventListener('change', function() {\r\n    const newLng = parseFloat(this.value) || lng;\r\n    const newLat = parseFloat(document.getElementById('lat').value) || lat;\r\n    marker.setLatLng([newLat, newLng]);\r\n    map.setView([newLat, newLng]);\r\n  });\r\n\r\n  \/\/ Simpan referensi global untuk digunakan saat load project\r\n  window.map = map;\r\n  window.marker = marker;\r\n}\r\n\r\n\/\/ ===================== EVENT LISTENERS =====================\r\ndocument.addEventListener('DOMContentLoaded', async function() {\r\n  await loadData();\r\n\r\n  initMap();\r\n\r\n  const levelRadios = document.querySelectorAll('input[name=\"level\"]');\r\n  levelRadios.forEach(radio => {\r\n    radio.addEventListener('change', function() {\r\n      const level = this.value;\r\n      document.getElementById('taxonLabel').textContent = level === 'family' ? \r\n        (currentLanguage === 'id' ? 'Nama Family' : 'Family Name') : \r\n        (level === 'genus' ? (currentLanguage === 'id' ? 'Nama Genus' : 'Genus Name') : \r\n        (currentLanguage === 'id' ? 'Nama Spesies' : 'Species Name'));\r\n      if (dataLoaded) {\r\n        populateDatalist(level);\r\n        updateBiomassDisplay();\r\n        updateSpeciesImage(); \/\/ update gambar saat level berubah\r\n      }\r\n    });\r\n  });\r\n\r\n  document.getElementById('taxonInput').addEventListener('input', function() {\r\n    updateBiomassDisplay(); \/\/ Biomassa tetap update instan\r\n    \r\n    \/\/ Hapus timeout sebelumnya agar tidak \"berat\"\r\n    clearTimeout(searchTimeout);\r\n    \r\n    \/\/ Tunggu 600ms setelah berhenti mengetik baru cari gambar\r\n    searchTimeout = setTimeout(() => {\r\n        updateSpeciesImage();\r\n    }, 600); \r\n  });\r\n\r\n  document.getElementById('size').addEventListener('input', updateBiomassDisplay);\r\n  document.getElementById('count').addEventListener('input', updateBiomassDisplay);\r\n  document.getElementById('addEntryBtn').addEventListener('click', addEntry);\r\n  document.getElementById('exportBtn').addEventListener('click', exportToFile);\r\n\r\n  \/\/ Event listener untuk tombol simpan\/muat proyek\r\n  document.getElementById('saveProjectBtn').addEventListener('click', saveProject);\r\n  document.getElementById('loadProjectBtn').addEventListener('click', () => {\r\n    document.getElementById('loadProjectFile').click();\r\n  });\r\n  document.getElementById('loadProjectFile').addEventListener('change', (e) => {\r\n    if (e.target.files.length > 0) {\r\n      loadProject(e.target.files[0]);\r\n    }\r\n    e.target.value = ''; \/\/ reset agar bisa pilih file yang sama lagi\r\n  });\r\n});\r\n\r\nwindow.removeEntry = removeEntry;\r\nwindow.setLanguage = setLanguage;\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3f5e4d5 e-flex e-con-boxed e-con e-parent\" data-id=\"3f5e4d5\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-463d657 elementor-widget elementor-widget-spacer\" data-id=\"463d657\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1e676b8 e-flex e-con-boxed e-con e-parent\" data-id=\"1e676b8\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-95ad5ec e-con-full e-flex e-con e-child\" data-id=\"95ad5ec\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9576278 elementor-widget elementor-widget-heading\" data-id=\"9576278\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Tutorial<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-23a3b8c e-con-full e-flex e-con e-child\" data-id=\"23a3b8c\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fdbb5e7 elementor-widget elementor-widget-video\" data-id=\"fdbb5e7\" data-element_type=\"widget\" data-settings=\"{&quot;youtube_url&quot;:&quot;https:\\\/\\\/youtu.be\\\/zXlBpnylAcg&quot;,&quot;cc_load_policy&quot;:&quot;yes&quot;,&quot;video_type&quot;:&quot;youtube&quot;,&quot;controls&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-wrapper elementor-open-inline\">\n\t\t\t<div class=\"elementor-video\"><\/div>\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>\ud83d\udccb Input Data Ikan \ud83c\uddee\ud83c\udde9 Indonesia \ud83c\uddec\ud83c\udde7 English Simpan Proyek Muat Proyek Informasi Project Nama Project Nama Surveyor Waktu (Tanggal [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1038","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.3 (Yoast SEO v24.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fish Data Entry - marineconservation.id<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/marineconservation.id\/id\/fish-data-entry\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fish Data Entry\" \/>\n<meta property=\"og:description\" content=\"\ud83d\udccb Input Data Ikan \ud83c\uddee\ud83c\udde9 Indonesia \ud83c\uddec\ud83c\udde7 English Simpan Proyek Muat Proyek Informasi Project Nama Project Nama Surveyor Waktu (Tanggal [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marineconservation.id\/id\/fish-data-entry\/\" \/>\n<meta property=\"og:site_name\" content=\"marineconservation.id\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61572311944591\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T21:42:27+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimasi waktu membaca\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/marineconservation.id\/fish-data-entry\/\",\"url\":\"https:\/\/marineconservation.id\/fish-data-entry\/\",\"name\":\"Fish Data Entry - marineconservation.id\",\"isPartOf\":{\"@id\":\"https:\/\/marineconservation.id\/#website\"},\"datePublished\":\"2026-02-27T08:25:01+00:00\",\"dateModified\":\"2026-03-11T21:42:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/marineconservation.id\/fish-data-entry\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/marineconservation.id\/fish-data-entry\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/marineconservation.id\/fish-data-entry\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/marineconservation.id\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fish Data Entry\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/marineconservation.id\/#website\",\"url\":\"https:\/\/marineconservation.id\/\",\"name\":\"marineconservation.id\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/marineconservation.id\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/marineconservation.id\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"id\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/marineconservation.id\/#organization\",\"name\":\"marineconservation.id\",\"url\":\"https:\/\/marineconservation.id\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/marineconservation.id\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/marineconservation.id\/wp-content\/uploads\/2025\/02\/Marine-Conservation-Indonesia.png\",\"contentUrl\":\"https:\/\/marineconservation.id\/wp-content\/uploads\/2025\/02\/Marine-Conservation-Indonesia.png\",\"width\":500,\"height\":500,\"caption\":\"marineconservation.id\"},\"image\":{\"@id\":\"https:\/\/marineconservation.id\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/profile.php?id=61572311944591\",\"https:\/\/www.instagram.com\/marineconservation.id\/\",\"https:\/\/www.youtube.com\/watch?v=nOmjtk-dTg8&list=LL\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Fish Data Entry - marineconservation.id","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/marineconservation.id\/id\/fish-data-entry\/","og_locale":"id_ID","og_type":"article","og_title":"Fish Data Entry","og_description":"\ud83d\udccb Input Data Ikan \ud83c\uddee\ud83c\udde9 Indonesia \ud83c\uddec\ud83c\udde7 English Simpan Proyek Muat Proyek Informasi Project Nama Project Nama Surveyor Waktu (Tanggal [&hellip;]","og_url":"https:\/\/marineconservation.id\/id\/fish-data-entry\/","og_site_name":"marineconservation.id","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61572311944591","article_modified_time":"2026-03-11T21:42:27+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimasi waktu membaca":"2 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/marineconservation.id\/fish-data-entry\/","url":"https:\/\/marineconservation.id\/fish-data-entry\/","name":"Fish Data Entry - marineconservation.id","isPartOf":{"@id":"https:\/\/marineconservation.id\/#website"},"datePublished":"2026-02-27T08:25:01+00:00","dateModified":"2026-03-11T21:42:27+00:00","breadcrumb":{"@id":"https:\/\/marineconservation.id\/fish-data-entry\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marineconservation.id\/fish-data-entry\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/marineconservation.id\/fish-data-entry\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marineconservation.id\/"},{"@type":"ListItem","position":2,"name":"Fish Data Entry"}]},{"@type":"WebSite","@id":"https:\/\/marineconservation.id\/#website","url":"https:\/\/marineconservation.id\/","name":"marineconservation.id","description":"","publisher":{"@id":"https:\/\/marineconservation.id\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/marineconservation.id\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"id"},{"@type":"Organization","@id":"https:\/\/marineconservation.id\/#organization","name":"marineconservation.id","url":"https:\/\/marineconservation.id\/","logo":{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/marineconservation.id\/#\/schema\/logo\/image\/","url":"https:\/\/marineconservation.id\/wp-content\/uploads\/2025\/02\/Marine-Conservation-Indonesia.png","contentUrl":"https:\/\/marineconservation.id\/wp-content\/uploads\/2025\/02\/Marine-Conservation-Indonesia.png","width":500,"height":500,"caption":"marineconservation.id"},"image":{"@id":"https:\/\/marineconservation.id\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61572311944591","https:\/\/www.instagram.com\/marineconservation.id\/","https:\/\/www.youtube.com\/watch?v=nOmjtk-dTg8&list=LL"]}]}},"_links":{"self":[{"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/comments?post=1038"}],"version-history":[{"count":97,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1038\/revisions"}],"predecessor-version":[{"id":1855,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1038\/revisions\/1855"}],"wp:attachment":[{"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/media?parent=1038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}