{"id":1549,"date":"2026-03-04T03:56:11","date_gmt":"2026-03-04T03:56:11","guid":{"rendered":"https:\/\/marineconservation.id\/?page_id=1549"},"modified":"2026-03-07T12:11:06","modified_gmt":"2026-03-07T12:11:06","slug":"e-turtle-indonesia","status":"publish","type":"page","link":"https:\/\/marineconservation.id\/id\/e-turtle-indonesia\/","title":{"rendered":"e-Turtle Indonesia"},"content":{"rendered":"<style>.elementor-1549 .elementor-element.elementor-element-7a29129{--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-widget-image .widget-image-caption{color:var( --e-global-color-text );font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-weight:var( --e-global-typography-text-font-weight );}.elementor-1549 .elementor-element.elementor-element-987a8a4{--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-1549 .elementor-element.elementor-element-ff6f5cc{--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-1549 .elementor-element.elementor-element-6305993{--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-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-1549 .elementor-element.elementor-element-30ae8eb{text-align:center;}.elementor-1549 .elementor-element.elementor-element-30ae8eb .elementor-heading-title{color:#00399F;}.elementor-1549 .elementor-element.elementor-element-f8f0f69{--display:flex;}.elementor-1549 .elementor-element.elementor-element-28fdbe4 .elementor-wrapper{--video-aspect-ratio:1.77777;}<\/style>\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1549\" class=\"elementor elementor-1549\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a29129 e-flex e-con-boxed e-con e-parent\" data-id=\"7a29129\" 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-1162ef9 elementor-widget elementor-widget-image\" data-id=\"1162ef9\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png\" class=\"attachment-large size-large wp-image-1816\" alt=\"Sea Turtle Identifcation and Data Collection for Marine Conservation\" srcset=\"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png 1024w, https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-300x169.png 300w, https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-768x432.png 768w, https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1536x864.png 1536w, https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-18x10.png 18w, https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\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-987a8a4 e-flex e-con-boxed e-con e-parent\" data-id=\"987a8a4\" 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-1f04208 elementor-widget elementor-widget-html\" data-id=\"1f04208\" 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<div style=\"max-width:1200px; margin:0 auto; font-family:Arial, sans-serif;\">\n    <h2 style=\"color:#0284c7;\">\ud83d\udc22 e-Turtle Indonesia<\/h2>\n    <div style=\"display:flex; flex-wrap:wrap; gap:20px;\">\n        <!-- Kolom Peta Utama (dengan filter di atas) -->\n        <div style=\"flex:2; min-width:300px;\">\n            <!-- Filter di atas peta -->\n            <div style=\"margin-bottom:10px; display:flex; gap:5px; flex-wrap:wrap; align-items:center;\">\n                <select id=\"filterProvince\" style=\"padding:5px; border:1px solid #ccc; border-radius:5px; min-width:120px;\">\n                    <option value=\"\">Semua Provinsi<\/option>\n                <\/select>\n                <select id=\"filterDistrict\" style=\"padding:5px; border:1px solid #ccc; border-radius:5px; min-width:120px;\">\n                    <option value=\"\">Semua Kab\/Kota<\/option>\n                <\/select>\n                <input type=\"text\" id=\"searchInput\" placeholder=\"Cari ID, lokasi, surveyor...\" style=\"flex:1; min-width:150px; padding:5px; border:1px solid #ccc; border-radius:5px;\">\n                <select id=\"filterSex\" style=\"width:120px; padding:5px; border:1px solid #ccc; border-radius:5px;\">\n                    <option value=\"\">Semua Kelamin<\/option>\n                    <option value=\"Jantan\">Jantan<\/option>\n                    <option value=\"Betina\">Betina<\/option>\n                    <option value=\"Tidak tahu\">Tidak tahu<\/option>\n                <\/select>\n                <input type=\"number\" id=\"filterMinCCL\" placeholder=\"Min CCL (cm)\" step=\"0.1\" style=\"width:100px; padding:5px; border:1px solid #ccc; border-radius:5px;\">\n                <button id=\"applyFilter\" style=\"background:#0284c7; color:white; border:none; padding:5px 10px; border-radius:5px; cursor:pointer;\">\ud83d\udd0d<\/button>\n            <\/div>\n            <div id=\"map\" style=\"height:500px; border-radius:10px; overflow:hidden; box-shadow:0 2px 8px rgba(0,0,0,0.1);\"><\/div>\n        <\/div>\n\n        <!-- Kolom Form (hanya muncul jika login) -->\n        <div id=\"formSection\" style=\"flex:1.2; min-width:300px; background:#f9f9f9; padding:20px; border-radius:10px; box-shadow:0 2px 8px rgba(0,0,0,0.1); display:none;\">\n            <!-- Form akan diisi oleh JavaScript jika login -->\n        <\/div>\n        <!-- Info jika belum login -->\n        <div id=\"loginPrompt\" style=\"flex:1.2; min-width:300px; background:#f9f9f9; padding:20px; border-radius:10px; box-shadow:0 2px 8px rgba(0,0,0,0.1); text-align:center;\">\n            <p>\ud83d\udd12 Anda belum login.<\/p>\n            <p>\n                <a href=\"#\" id=\"loginLink\" style=\"background:#0284c7; color:white; padding:10px 20px; text-decoration:none; border-radius:5px; display:inline-block; margin-right:10px;\">Login<\/a>\n                <a href=\"#\" id=\"registerLink\" style=\"background:#2e7d32; color:white; padding:10px 20px; text-decoration:none; border-radius:5px; display:inline-block;\">Daftar<\/a>\n            <\/p>\n            <p style=\"font-size:12px; color:#666;\">Peta menampilkan semua data publik. Tabel hanya menampilkan data Anda.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Bagian Tabel dan Download -->\n<div style=\"margin-top:30px; background:white; padding:20px; border-radius:10px; box-shadow:0 2px 8px rgba(0,0,0,0.1);\">\n    <h3 style=\"margin-top:0; color:#0284c7;\">\ud83d\udccb Data Penyu Tersimpan<\/h3>\n    \n    <!-- Pilihan Format dan Tombol Download -->\n    <div style=\"margin-bottom:15px; display:flex; gap:10px; flex-wrap:wrap; align-items:center;\">\n        <select id=\"formatSelect\" style=\"padding:8px; border:1px solid #ccc; border-radius:5px; min-width:100px;\">\n            <option value=\"csv\">CSV<\/option>\n            <option value=\"xlsx\">XLSX (Excel)<\/option>\n            <option value=\"txt\">TXT<\/option>\n        <\/select>\n        <button id=\"downloadBtn\" style=\"background:#2e7d32; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">\ud83d\udce5 Download (Data Saya)<\/button>\n    <\/div>\n\n    <!-- Tabel Data -->\n    <div style=\"overflow-x:auto;\">\n        <table id=\"dataTable\" style=\"width:100%; border-collapse:collapse; font-size:14px;\">\n            <thead>\n                <tr style=\"background:#f1f5f9;\">\n                    <th style=\"padding:10px; text-align:left;\">ID Penyu<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Nama<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Spesies<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Provinsi<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Kab\/Kota<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Lat<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Lng<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Tanggal<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Waktu<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Foto Kiri<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Foto Kanan<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Foto Cangkang<\/th>\n                    <th style=\"padding:10px; text-align:left;\">CCL (cm)<\/th>\n                    <th style=\"padding:10px; text-align:left;\">CCW (cm)<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Jenis Kelamin<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Kedalaman (m)<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Behaviour<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Kesehatan<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Ket. Sakit<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Hasil Analisis<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Kontributor<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Surveyor<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Instansi<\/th>\n                    <th style=\"padding:10px; text-align:left;\">Aksi<\/th>\n                <\/tr>\n            <\/thead>\n            <tbody id=\"tableBody\">\n                <tr><td colspan=\"24\" style=\"text-align:center; padding:20px;\">Memuat data...<\/td><\/tr>\n            <\/tbody>\n        <\/table>\n    <\/div>\n<\/div>\n\n<!-- Leaflet, MarkerCluster, Cropper, SheetJS -->\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet.markercluster@1.4.1\/dist\/MarkerCluster.css\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet.markercluster@1.4.1\/dist\/MarkerCluster.Default.css\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/cropperjs\/1.5.13\/cropper.min.css\" \/>\n<script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\"><\/script>\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n<script src=\"https:\/\/unpkg.com\/leaflet.markercluster@1.4.1\/dist\/leaflet.markercluster.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/cropperjs\/1.5.13\/cropper.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\n\n<style>\n    #confirmMatchBtn, #useExistingBtn, #newIndividualBtn {\n        z-index: 9999;\n        position: relative;\n        pointer-events: auto !important;\n        margin: 5px;\n    }\n    .loading {\n        opacity: 0.6;\n        pointer-events: none;\n    }\n    .comparison-container {\n        display: flex;\n        gap: 20px;\n        margin-bottom: 15px;\n        flex-wrap: wrap;\n        justify-content: center;\n    }\n    .comparison-item {\n        flex: 1;\n        min-width: 200px;\n        text-align: center;\n        background: #f0f8ff;\n        padding: 10px;\n        border-radius: 8px;\n    }\n    .comparison-item img {\n        max-width: 100%;\n        max-height: 200px;\n        border: 2px solid #0284c7;\n        border-radius: 8px;\n        box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n    }\n<\/style>\n\n<script>\n\/\/ ================== OBJEK INDONESIA REGIONS (LENGKAP) ==================\nconst indonesiaRegions = {\n    \"Aceh\": [\"Aceh Barat\", \"Aceh Barat Daya\", \"Aceh Besar\", \"Aceh Jaya\", \"Aceh Selatan\", \"Aceh Singkil\", \"Aceh Tamiang\", \"Aceh Tengah\", \"Aceh Tenggara\", \"Aceh Timur\", \"Aceh Utara\", \"Bener Meriah\", \"Bireuen\", \"Gayo Lues\", \"Nagan Raya\", \"Pidie\", \"Pidie Jaya\", \"Simeulue\", \"Kota Banda Aceh\", \"Kota Langsa\", \"Kota Lhokseumawe\", \"Kota Sabang\", \"Kota Subulussalam\"],\n    \"Sumatera Utara\": [\"Asahan\", \"Batu Bara\", \"Dairi\", \"Deli Serdang\", \"Humbang Hasundutan\", \"Karo\", \"Labuhanbatu\", \"Labuhanbatu Selatan\", \"Labuhanbatu Utara\", \"Langkat\", \"Mandailing Natal\", \"Nias\", \"Nias Barat\", \"Nias Selatan\", \"Nias Utara\", \"Padang Lawas\", \"Padang Lawas Utara\", \"Pakpak Bharat\", \"Samosir\", \"Serdang Bedagai\", \"Simalungun\", \"Tapanuli Selatan\", \"Tapanuli Tengah\", \"Tapanuli Utara\", \"Toba Samosir\", \"Kota Binjai\", \"Kota Gunungsitoli\", \"Kota Medan\", \"Kota Padangsidimpuan\", \"Kota Pematangsiantar\", \"Kota Sibolga\", \"Kota Tanjungbalai\", \"Kota Tebing Tinggi\"],\n    \"Sumatera Barat\": [\"Agam\", \"Dharmasraya\", \"Kepulauan Mentawai\", \"Lima Puluh Kota\", \"Padang Pariaman\", \"Pasaman\", \"Pasaman Barat\", \"Pesisir Selatan\", \"Sijunjung\", \"Solok\", \"Solok Selatan\", \"Tanah Datar\", \"Kota Bukittinggi\", \"Kota Padang\", \"Kota Padang Panjang\", \"Kota Pariaman\", \"Kota Payakumbuh\", \"Kota Sawahlunto\", \"Kota Solok\"],\n    \"Riau\": [\"Bengkalis\", \"Indragiri Hilir\", \"Indragiri Hulu\", \"Kampar\", \"Kepulauan Meranti\", \"Kuantan Singingi\", \"Pelalawan\", \"Rokan Hilir\", \"Rokan Hulu\", \"Siak\", \"Kota Dumai\", \"Kota Pekanbaru\"],\n    \"Kepulauan Riau\": [\"Bintan\", \"Karimun\", \"Kepulauan Anambas\", \"Lingga\", \"Natuna\", \"Kota Batam\", \"Kota Tanjungpinang\"],\n    \"Jambi\": [\"Batanghari\", \"Bungo\", \"Kerinci\", \"Merangin\", \"Muaro Jambi\", \"Sarolangun\", \"Tanjung Jabung Barat\", \"Tanjung Jabung Timur\", \"Tebo\", \"Kota Jambi\", \"Kota Sungai Penuh\"],\n    \"Bengkulu\": [\"Bengkulu Selatan\", \"Bengkulu Tengah\", \"Bengkulu Utara\", \"Kaur\", \"Kepahiang\", \"Lebong\", \"Muko Muko\", \"Rejang Lebong\", \"Seluma\", \"Kota Bengkulu\"],\n    \"Sumatera Selatan\": [\"Banyuasin\", \"Empat Lawang\", \"Lahat\", \"Muara Enim\", \"Musi Banyuasin\", \"Musi Rawas\", \"Musi Rawas Utara\", \"Ogan Ilir\", \"Ogan Komering Ilir\", \"Ogan Komering Ulu\", \"Ogan Komering Ulu Selatan\", \"Ogan Komering Ulu Timur\", \"Penukal Abab Lematang Ilir\", \"Kota Lubuklinggau\", \"Kota Pagar Alam\", \"Kota Palembang\", \"Kota Prabumulih\"],\n    \"Bangka Belitung\": [\"Bangka\", \"Bangka Barat\", \"Bangka Selatan\", \"Bangka Tengah\", \"Belitung\", \"Belitung Timur\", \"Kota Pangkalpinang\"],\n    \"Lampung\": [\"Lampung Barat\", \"Lampung Selatan\", \"Lampung Tengah\", \"Lampung Timur\", \"Lampung Utara\", \"Mesuji\", \"Pesawaran\", \"Pesisir Barat\", \"Pringsewu\", \"Tanggamus\", \"Tulang Bawang\", \"Tulang Bawang Barat\", \"Way Kanan\", \"Kota Bandar Lampung\", \"Kota Metro\"],\n    \"Banten\": [\"Lebak\", \"Pandeglang\", \"Serang\", \"Tangerang\", \"Kota Cilegon\", \"Kota Serang\", \"Kota Tangerang\", \"Kota Tangerang Selatan\"],\n    \"DKI Jakarta\": [\"Kepulauan Seribu\", \"Kota Jakarta Barat\", \"Kota Jakarta Pusat\", \"Kota Jakarta Selatan\", \"Kota Jakarta Timur\", \"Kota Jakarta Utara\"],\n    \"Jawa Barat\": [\"Bandung\", \"Bandung Barat\", \"Bekasi\", \"Bogor\", \"Ciamis\", \"Cianjur\", \"Cirebon\", \"Garut\", \"Indramayu\", \"Karawang\", \"Kuningan\", \"Majalengka\", \"Pangandaran\", \"Purwakarta\", \"Subang\", \"Sukabumi\", \"Sumedang\", \"Tasikmalaya\", \"Kota Bandung\", \"Kota Banjar\", \"Kota Bekasi\", \"Kota Bogor\", \"Kota Cimahi\", \"Kota Cirebon\", \"Kota Depok\", \"Kota Sukabumi\", \"Kota Tasikmalaya\"],\n    \"Jawa Tengah\": [\"Banjarnegara\", \"Banyumas\", \"Batang\", \"Blora\", \"Boyolali\", \"Brebes\", \"Cilacap\", \"Demak\", \"Grobogan\", \"Jepara\", \"Karanganyar\", \"Kebumen\", \"Kendal\", \"Klaten\", \"Kudus\", \"Magelang\", \"Pati\", \"Pekalongan\", \"Pemalang\", \"Purbalingga\", \"Purworejo\", \"Rembang\", \"Semarang\", \"Sragen\", \"Sukoharjo\", \"Tegal\", \"Temanggung\", \"Wonogiri\", \"Wonosobo\", \"Kota Magelang\", \"Kota Pekalongan\", \"Kota Salatiga\", \"Kota Semarang\", \"Kota Surakarta\", \"Kota Tegal\"],\n    \"DI Yogyakarta\": [\"Bantul\", \"Gunungkidul\", \"Kulon Progo\", \"Sleman\", \"Kota Yogyakarta\"],\n    \"Jawa Timur\": [\"Bangkalan\", \"Banyuwangi\", \"Blitar\", \"Bojonegoro\", \"Bondowoso\", \"Gresik\", \"Jember\", \"Jombang\", \"Kediri\", \"Lamongan\", \"Lumajang\", \"Madiun\", \"Magetan\", \"Malang\", \"Mojokerto\", \"Nganjuk\", \"Ngawi\", \"Pacitan\", \"Pamekasan\", \"Pasuruan\", \"Ponorogo\", \"Probolinggo\", \"Sampang\", \"Sidoarjo\", \"Situbondo\", \"Sumenep\", \"Trenggalek\", \"Tuban\", \"Tulungagung\", \"Kota Batu\", \"Kota Blitar\", \"Kota Kediri\", \"Kota Madiun\", \"Kota Malang\", \"Kota Mojokerto\", \"Kota Pasuruan\", \"Kota Probolinggo\", \"Kota Surabaya\"],\n    \"Bali\": [\"Badung\", \"Bangli\", \"Buleleng\", \"Gianyar\", \"Jembrana\", \"Karangasem\", \"Klungkung\", \"Tabanan\", \"Kota Denpasar\"],\n    \"Nusa Tenggara Barat\": [\"Bima\", \"Dompu\", \"Lombok Barat\", \"Lombok Tengah\", \"Lombok Timur\", \"Lombok Utara\", \"Sumbawa\", \"Sumbawa Barat\", \"Kota Bima\", \"Kota Mataram\"],\n    \"Nusa Tenggara Timur\": [\"Alor\", \"Belu\", \"Ende\", \"Flores Timur\", \"Kupang\", \"Lembata\", \"Malaka\", \"Manggarai\", \"Manggarai Barat\", \"Manggarai Timur\", \"Nagekeo\", \"Ngada\", \"Rote Ndao\", \"Sabu Raijua\", \"Sikka\", \"Sumba Barat\", \"Sumba Barat Daya\", \"Sumba Tengah\", \"Sumba Timur\", \"Timor Tengah Selatan\", \"Timor Tengah Utara\", \"Kota Kupang\"],\n    \"Kalimantan Barat\": [\"Bengkayang\", \"Kapuas Hulu\", \"Kayong Utara\", \"Ketapang\", \"Kubu Raya\", \"Landak\", \"Melawi\", \"Mempawah\", \"Sambas\", \"Sanggau\", \"Sekadau\", \"Sintang\", \"Kota Pontianak\", \"Kota Singkawang\"],\n    \"Kalimantan Tengah\": [\"Barito Selatan\", \"Barito Timur\", \"Barito Utara\", \"Gunung Mas\", \"Kapuas\", \"Katingan\", \"Kotawaringin Barat\", \"Kotawaringin Timur\", \"Lamandau\", \"Murung Raya\", \"Pulang Pisau\", \"Sukamara\", \"Seruyan\", \"Kota Palangka Raya\"],\n    \"Kalimantan Selatan\": [\"Balangan\", \"Banjar\", \"Barito Kuala\", \"Hulu Sungai Selatan\", \"Hulu Sungai Tengah\", \"Hulu Sungai Utara\", \"Kotabaru\", \"Tabalong\", \"Tanah Bumbu\", \"Tanah Laut\", \"Tapin\", \"Kota Banjarbaru\", \"Kota Banjarmasin\"],\n    \"Kalimantan Timur\": [\"Berau\", \"Kutai Barat\", \"Kutai Kartanegara\", \"Kutai Timur\", \"Mahakam Ulu\", \"Paser\", \"Penajam Paser Utara\", \"Kota Balikpapan\", \"Kota Bontang\", \"Kota Samarinda\"],\n    \"Kalimantan Utara\": [\"Bulungan\", \"Malinau\", \"Nunukan\", \"Tana Tidung\", \"Kota Tarakan\"],\n    \"Sulawesi Utara\": [\"Bolaang Mongondow\", \"Bolaang Mongondow Selatan\", \"Bolaang Mongondow Timur\", \"Bolaang Mongondow Utara\", \"Kepulauan Sangihe\", \"Kepulauan Siau Tagulandang Biaro\", \"Kepulauan Talaud\", \"Minahasa\", \"Minahasa Selatan\", \"Minahasa Tenggara\", \"Minahasa Utara\", \"Kota Bitung\", \"Kota Kotamobagu\", \"Kota Manado\", \"Kota Tomohon\"],\n    \"Gorontalo\": [\"Boalemo\", \"Bone Bolango\", \"Gorontalo\", \"Gorontalo Utara\", \"Pohuwato\", \"Kota Gorontalo\"],\n    \"Sulawesi Tengah\": [\"Banggai\", \"Banggai Kepulauan\", \"Banggai Laut\", \"Buol\", \"Donggala\", \"Morowali\", \"Morowali Utara\", \"Parigi Moutong\", \"Poso\", \"Sigi\", \"Tojo Una-Una\", \"Toli-Toli\", \"Kota Palu\"],\n    \"Sulawesi Barat\": [\"Majene\", \"Mamasa\", \"Mamuju\", \"Mamuju Tengah\", \"Pasangkayu\", \"Polewali Mandar\"],\n    \"Sulawesi Selatan\": [\"Bantaeng\", \"Barru\", \"Bone\", \"Bulukumba\", \"Enrekang\", \"Gowa\", \"Jeneponto\", \"Kepulauan Selayar\", \"Luwu\", \"Luwu Timur\", \"Luwu Utara\", \"Maros\", \"Pangkajene dan Kepulauan\", \"Pinrang\", \"Sidenreng Rappang\", \"Sinjai\", \"Soppeng\", \"Takalar\", \"Tana Toraja\", \"Toraja Utara\", \"Wajo\", \"Kota Makassar\", \"Kota Palopo\", \"Kota Parepare\"],\n    \"Sulawesi Tenggara\": [\"Bombana\", \"Buton\", \"Buton Selatan\", \"Buton Tengah\", \"Buton Utara\", \"Kolaka\", \"Kolaka Timur\", \"Kolaka Utara\", \"Konawe\", \"Konawe Kepulauan\", \"Konawe Selatan\", \"Konawe Utara\", \"Muna\", \"Muna Barat\", \"Wakatobi\", \"Kota Bau-Bau\", \"Kota Kendari\"],\n    \"Maluku\": [\"Buru\", \"Buru Selatan\", \"Kepulauan Aru\", \"Maluku Barat Daya\", \"Maluku Tengah\", \"Maluku Tenggara\", \"Maluku Tenggara Barat\", \"Seram Bagian Barat\", \"Seram Bagian Timur\", \"Kota Ambon\", \"Kota Tual\"],\n    \"Maluku Utara\": [\"Halmahera Barat\", \"Halmahera Tengah\", \"Halmahera Timur\", \"Halmahera Selatan\", \"Halmahera Utara\", \"Kepulauan Sula\", \"Pulau Morotai\", \"Pulau Taliabu\", \"Kota Ternate\", \"Kota Tidore Kepulauan\"],\n    \"Papua\": [\"Asmat\", \"Biak Numfor\", \"Boven Digoel\", \"Deiyai\", \"Dogiyai\", \"Intan Jaya\", \"Jayapura\", \"Jayawijaya\", \"Keerom\", \"Kepulauan Yapen\", \"Lanny Jaya\", \"Mamberamo Raya\", \"Mamberamo Tengah\", \"Mappi\", \"Merauke\", \"Mimika\", \"Nabire\", \"Nduga\", \"Paniai\", \"Pegunungan Bintang\", \"Puncak\", \"Puncak Jaya\", \"Sarmi\", \"Supiori\", \"Tolikara\", \"Waropen\", \"Yahukimo\", \"Yalimo\", \"Kota Jayapura\"],\n    \"Papua Barat\": [\"Fakfak\", \"Kaimana\", \"Manokwari\", \"Manokwari Selatan\", \"Maybrat\", \"Pegunungan Arfak\", \"Raja Ampat\", \"Sorong\", \"Sorong Selatan\", \"Tambrauw\", \"Teluk Bintuni\", \"Teluk Wondama\", \"Kota Sorong\"],\n    \"Papua Selatan\": [\"Merauke\", \"Mappi\", \"Asmat\", \"Boven Digoel\"],\n    \"Papua Tengah\": [\"Nabire\", \"Puncak Jaya\", \"Paniai\", \"Mimika\", \"Puncak\", \"Dogiyai\", \"Intan Jaya\", \"Deiyai\"],\n    \"Papua Pegunungan\": [\"Jayawijaya\", \"Lanny Jaya\", \"Mamberamo Tengah\", \"Nduga\", \"Pegunungan Bintang\", \"Tolikara\", \"Yahukimo\", \"Yalimo\"],\n    \"Papua Barat Daya\": [\"Sorong\", \"Sorong Selatan\", \"Raja Ampat\", \"Tambrauw\", \"Maybrat\", \"Kota Sorong\"]\n};\n\nlet currentUser = null;\nlet isSuperAdmin = false;\nlet allData = [];\nlet filteredAllData = [];\nlet filteredUserData = [];\nconst themeFolder = 'astra'; \/\/ GANTI SESUAI TEMA ANDA\n\n\/\/ Variabel global untuk menyimpan hasil match\nlet currentMatch = null;\n\n\/\/ ================== FUNGSI REVERSE GEOCODING ==================\nasync function fillFromCoordinates(lat, lng) {\n    const radii = [0, 5000, 10000, 20000, 50000, 100000];\n    let provinceFound = false;\n    let provinceName = \"\";\n    let responseData = null;\n\n    for (let radius of radii) {\n        try {\n            const url = `https:\/\/api.bigdatacloud.net\/data\/reverse-geocode-client?latitude=${lat}&longitude=${lng}&localityLanguage=id&radius=${radius}`;\n            const response = await fetch(url);\n            const data = await response.json();\n\n            if (!data || !data.localityInfo) continue;\n\n            data.localityInfo.administrative.forEach(admin => {\n                if (admin.adminLevel === 4) {\n                    provinceName = admin.name;\n                }\n            });\n\n            if (provinceName) {\n                responseData = data;\n                provinceFound = true;\n                break;\n            }\n        } catch (err) {\n            console.error(`Gagal dengan radius ${radius}:`, err);\n        }\n    }\n\n    if (!provinceFound) return;\n\n    const provinceMapping = {\n        \"Jakarta\": \"DKI Jakarta\",\n        \"Daerah Khusus Ibukota Jakarta\": \"DKI Jakarta\",\n        \"Yogyakarta\": \"DI Yogyakarta\",\n        \"Daerah Istimewa Yogyakarta\": \"DI Yogyakarta\",\n        \"Bali Province\": \"Bali\",\n        \"West Java\": \"Jawa Barat\",\n        \"Central Java\": \"Jawa Tengah\",\n        \"East Java\": \"Jawa Timur\",\n        \"West Nusa Tenggara\": \"Nusa Tenggara Barat\",\n        \"East Nusa Tenggara\": \"Nusa Tenggara Timur\",\n        \"North Sumatra\": \"Sumatera Utara\",\n        \"West Sumatra\": \"Sumatera Barat\",\n        \"South Sumatra\": \"Sumatera Selatan\",\n        \"Bangka Belitung Islands\": \"Bangka Belitung\",\n        \"Riau Islands\": \"Kepulauan Riau\",\n        \"Lampung\": \"Lampung\"\n    };\n\n    if (provinceMapping[provinceName]) {\n        provinceName = provinceMapping[provinceName];\n    }\n\n    const provinceSelect = document.getElementById(\"provinceSelect\");\n    const citySelect = document.getElementById(\"districtSelect\");\n\n    let provinceMatched = false;\n    Array.from(provinceSelect.options).forEach(opt => {\n        if (opt.text.trim().toLowerCase() === provinceName.trim().toLowerCase()) {\n            provinceSelect.value = opt.value;\n            provinceMatched = true;\n        }\n    });\n\n    if (!provinceMatched) return;\n\n    provinceSelect.dispatchEvent(new Event('change'));\n\n    setTimeout(() => {\n        const selectedProv = provinceSelect.value;\n        if (!selectedProv || !indonesiaRegions[selectedProv]) return;\n\n        const possibleCities = indonesiaRegions[selectedProv];\n        let cityFound = \"\";\n\n        responseData.localityInfo.administrative.forEach(admin => {\n            possibleCities.forEach(city => {\n                const cleanApi = admin.name.toLowerCase()\n                    .replace(\"kota \", \"\")\n                    .replace(\"kabupaten \", \"\")\n                    .trim();\n                const cleanLocal = city.toLowerCase()\n                    .replace(\"kota \", \"\")\n                    .replace(\"kabupaten \", \"\")\n                    .trim();\n                if (cleanApi === cleanLocal) {\n                    cityFound = city;\n                }\n            });\n        });\n\n        if (cityFound) {\n            Array.from(citySelect.options).forEach(opt => {\n                if (opt.text === cityFound) {\n                    citySelect.value = opt.value;\n                }\n            });\n        }\n    }, 600);\n}\n\n\/\/ ================== HANDLE SUBMIT (event delegation) ==================\nasync function handleTurtleFormSubmit(e) {\n    e.preventDefault();\n    console.log('\ud83d\ude80 Submit triggered via delegation');\n\n    const form = document.getElementById('turtleForm');\n    if (!form) {\n        console.error('Form tidak ditemukan');\n        return;\n    }\n\n    const submitBtn = document.getElementById('submitBtn');\n    const originalText = submitBtn.innerText;\n\n    \/\/ Disable tombol dan tampilkan loading\n    submitBtn.disabled = true;\n    submitBtn.innerText = 'Menyimpan...';\n    submitBtn.classList.add('loading');\n\n    try {\n        \/\/ Validasi: foto kiri wajib\n        const leftHidden = document.getElementById('leftPhotoData');\n        if (!leftHidden?.value) {\n            throw new Error('Foto sisi kiri wajib diisi. Crop terlebih dahulu.');\n        }\n\n        const species = form.querySelector('select[name=\"species\"]')?.value;\n        const surveyDate = form.querySelector('input[name=\"survey_date\"]')?.value;\n\n        if (!species) {\n            throw new Error('Pilih spesies terlebih dahulu.');\n        }\n        if (!surveyDate) {\n            throw new Error('Tanggal survey harus diisi.');\n        }\n\n        const newNameField = document.getElementById('newNameField');\n        const newTurtleName = document.getElementById('newTurtleName');\n\n        \/\/ Validasi nama jika mode individu baru\n        if (newNameField && newNameField.style.display === 'block') {\n            if (!newTurtleName || !newTurtleName.value.trim()) {\n                throw new Error('Harap beri nama untuk individu baru.');\n            }\n        }\n\n        \/\/ Siapkan FormData\n        const formData = new FormData(form);\n\n        \/\/ Hapus file input asli (kita kirim base64)\n        formData.delete('left_photo');\n        formData.append('left_photo_base64', leftHidden.value);\n\n        \/\/ Foto kanan (opsional)\n        const rightHidden = document.getElementById('rightPhotoData');\n        if (rightHidden?.value) {\n            formData.append('right_photo_base64', rightHidden.value);\n        }\n\n        const shellHidden = document.getElementById('shellPhotoData');\n        if (shellHidden?.value) {\n            formData.append('shell_photo_base64', shellHidden.value);\n        }\n\n        \/\/ Tambahkan turtle_name langsung ke formData jika mode individu baru\n        if (newNameField && newNameField.style.display === 'block') {\n            formData.append('turtle_name', newTurtleName.value.trim());\n            console.log('\u2705 turtle_name ditambahkan ke formData:', newTurtleName.value.trim());\n        }\n\n        \/\/ Kirim via fetch dengan timeout 30 detik\n        const controller = new AbortController();\n        const timeoutId = setTimeout(() => controller.abort(), 30000);\n\n        const response = await fetch(`\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-save.php`, {\n            method: 'POST',\n            body: formData,\n            signal: controller.signal\n        });\n        clearTimeout(timeoutId);\n\n        if (!response.ok) {\n            const text = await response.text();\n            throw new Error(`HTTP ${response.status}: ${text.substring(0,100)}`);\n        }\n\n        const result = await response.json();\n        if (result.success) {\n            alert('\u2705 Data berhasil disimpan!');\n            window.location.reload();\n        } else {\n            alert('\u274c Gagal menyimpan: ' + result.message);\n        }\n    } catch (err) {\n        console.error('\ud83d\udd25 Submit error:', err);\n        if (err.name === 'AbortError') {\n            alert('\u23f1\ufe0f Waktu habis. Server terlalu lama merespons.');\n        } else {\n            alert('\u274c Error: ' + err.message);\n        }\n    } finally {\n        submitBtn.disabled = false;\n        submitBtn.innerText = originalText;\n        submitBtn.classList.remove('loading');\n    }\n}\n\n\/\/ Pasang event delegation untuk submit form\ndocument.addEventListener('submit', function(e) {\n    if (e.target && e.target.id === 'turtleForm') {\n        handleTurtleFormSubmit(e).catch(err => console.error('Unhandled error in submit:', err));\n    }\n});\n\n\/\/ ================== INISIALISASI DOKUMEN ==================\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Set login links dengan redirect ke halaman saat ini\n    const currentUrl = encodeURIComponent(window.location.href);\n    document.getElementById('loginLink').href = `\/wp-login.php?redirect_to=${currentUrl}`;\n    document.getElementById('registerLink').href = `\/wp-login.php?action=register&redirect_to=${currentUrl}`;\n\n    \/\/ Cek login via AJAX\n    fetch(`\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-ajax.php`)\n        .then(response => response.json())\n        .then(data => {\n            currentUser = data.logged_in ? data.username : null;\n            isSuperAdmin = (currentUser === 'ckradiwijaya@gmail.com'); \/\/ sesuaikan\n\n            const formSection = document.getElementById('formSection');\n            const loginPrompt = document.getElementById('loginPrompt');\n\n            if (data.logged_in) {\n                loginPrompt.style.display = 'none';\n                formSection.style.display = 'block';\n                renderTurtleForm(data.username);\n            } else {\n                loginPrompt.style.display = 'block';\n                formSection.style.display = 'none';\n            }\n        })\n        .catch(err => {\n            console.error('Gagal cek login', err);\n            document.getElementById('loginPrompt').innerHTML = '\u274c Gagal cek login. Pastikan file turtle-ajax.php tersedia.';\n        });\n\n    \/\/ Inisialisasi peta utama\n    var map = L.map('map').setView([-2.5, 118], 5);\n    L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}', { attribution: 'Tiles &copy; Esri' }).addTo(map);\n    var markersCluster = L.markerClusterGroup();\n    window.map = map;\n    window.markersCluster = markersCluster;\n\n    \/\/ ================== RENDER FORM ==================\n    function renderTurtleForm(username) {\n        const formSection = document.getElementById('formSection');\n        formSection.innerHTML = `\n            <h3 style=\"margin-top:0;\">\ud83d\udc22 Tambah Data Penyu Baru<\/h3>\n            <form id=\"turtleForm\" enctype=\"multipart\/form-data\">\n                <!-- Nama Lokasi -->\n                <div style=\"margin-bottom:12px;\">\n                    <label style=\"display:block; font-weight:bold; margin-bottom:5px;\">Nama Lokasi Penemuan<\/label>\n                    <input type=\"text\" name=\"location_name\" placeholder=\"Misal: Pantai Trisik\" style=\"width:100%; padding:8px; border:1px solid #ccc; border-radius:5px;\">\n                <\/div>\n\n                <!-- Peta mini -->\n                <div style=\"margin-bottom:12px;\">\n                    <label style=\"display:block; font-weight:bold; margin-bottom:5px;\">Pilih Titik Koordinat (klik peta)<\/label>\n                    <div id=\"mini-map\" style=\"height:200px; border-radius:5px; margin-bottom:5px;\"><\/div>\n                    <div style=\"display:flex; gap:5px;\">\n                        <input type=\"number\" step=\"any\" id=\"lat\" name=\"latitude\" required placeholder=\"Latitude\" style=\"flex:1; padding:8px; border:1px solid #ccc; border-radius:5px;\">\n                        <input type=\"number\" step=\"any\" id=\"lng\" name=\"longitude\" required placeholder=\"Longitude\" style=\"flex:1; padding:8px; border:1px solid #ccc; border-radius:5px;\">\n                    <\/div>\n                <\/div>\n\n                <!-- Wilayah -->\n                <div style=\"display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:10px;\">\n                    <div>\n                        <select name=\"province\" id=\"provinceSelect\" style=\"width:100%; padding:8px;\">\n                            <option value=\"\">Pilih Provinsi<\/option>\n                        <\/select>\n                    <\/div>\n                    <div>\n                        <select name=\"district\" id=\"districtSelect\" style=\"width:100%; padding:8px;\">\n                            <option value=\"\">Pilih Kab\/Kota<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n\n                <!-- Tanggal dan Waktu -->\n                <div style=\"display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:10px;\">\n                    <div><input type=\"date\" name=\"survey_date\" style=\"width:100%; padding:8px;\"><\/div>\n                    <div><input type=\"time\" name=\"survey_time\" style=\"width:100%; padding:8px;\"><\/div>\n                <\/div>\n\n                <!-- Spesies -->\n                <div style=\"margin-bottom:10px;\">\n                    <label style=\"display:block; font-weight:bold; margin-bottom:5px;\">Spesies<\/label>\n                    <select name=\"species\" style=\"width:100%; padding:8px;\">\n                        <option value=\"\">-- Pilih Spesies --<\/option>\n                        <option value=\"Chelonia mydas\">Penyu Hijau (Chelonia mydas)<\/option>\n                        <option value=\"Eretmochelys imbricata\">Penyu Sisik (Eretmochelys imbricata)<\/option>\n                        <option value=\"Lepidochelys olivacea\">Penyu Lekang (Lepidochelys olivacea)<\/option>\n                        <option value=\"Caretta caretta\">Penyu Tempayan (Caretta caretta)<\/option>\n                        <option value=\"Dermochelys coriacea\">Penyu Belimbing (Dermochelys coriacea)<\/option>\n                        <option value=\"Natator depressus\">Penyu Pipih (Natator depressus)<\/option>\n                    <\/select>\n                <\/div>\n\n                <!-- Surveyor dan Instansi -->\n                <div style=\"display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:10px;\">\n                    <div><input type=\"text\" name=\"surveyor\" placeholder=\"Nama Surveyor\" style=\"width:100%; padding:8px;\"><\/div>\n                    <div><input type=\"text\" name=\"institution\" placeholder=\"Instansi\" style=\"width:100%; padding:8px;\"><\/div>\n                <\/div>\n\n                <!-- Upload Foto dengan Crop + Kompresi -->\n                <div style=\"margin-bottom:15px;\">\n                    <label style=\"display:block; font-weight:bold; margin-bottom:5px; color:#d32f2f;\">Foto Sisi Kiri (wajib) *<\/label>\n                    <input type=\"file\" id=\"leftPhotoInput\" accept=\"image\/*\" required style=\"width:100%; padding:5px;\">\n                    <input type=\"hidden\" name=\"left_photo\" id=\"leftPhotoData\">\n                <\/div>\n                <div style=\"margin-bottom:15px;\">\n                    <label style=\"display:block; font-weight:bold; margin-bottom:5px;\">Foto Sisi Kanan (opsional)<\/label>\n                    <input type=\"file\" id=\"rightPhotoInput\" accept=\"image\/*\" style=\"width:100%; padding:5px;\">\n                    <input type=\"hidden\" name=\"right_photo\" id=\"rightPhotoData\">\n                <\/div>\n\n                <!-- Upload Foto Cangkang (opsional) -->\n                <div style=\"margin-bottom:15px;\">\n                    <label style=\"display:block; font-weight:bold; margin-bottom:5px;\">Foto Cangkang (opsional)<\/label>\n                    <input type=\"file\" id=\"shellPhotoInput\" accept=\"image\/*\" style=\"width:100%; padding:5px;\">\n                    <input type=\"hidden\" name=\"shell_photo\" id=\"shellPhotoData\">\n                    <div style=\"display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:10px;\">\n                        <div><input type=\"number\" step=\"0.1\" name=\"ccl\" placeholder=\"CCL (cm)\"><\/div>\n                        <div><input type=\"number\" step=\"0.1\" name=\"ccw\" placeholder=\"CCW (cm)\"><\/div>\n                    <\/div>\n                <\/div>\n\n                <!-- Jenis Kelamin -->\n                <div style=\"margin-bottom:15px;\">\n                    <label>Jenis Kelamin<\/label>\n                    <select name=\"sex\" style=\"width:100%; padding:8px;\">\n                        <option value=\"\">-- Pilih --<\/option>\n                        <option value=\"Jantan\">Jantan<\/option>\n                        <option value=\"Betina\">Betina<\/option>\n                        <option value=\"Tidak tahu\">Tidak tahu<\/option>\n                    <\/select>\n                <\/div>\n\n                <!-- Kedalaman -->\n                <div style=\"margin-bottom:15px;\">\n                    <label>Kedalaman (meter)<\/label>\n                    <input type=\"number\" step=\"0.1\" name=\"depth\" style=\"width:100%; padding:8px;\">\n                <\/div>\n\n                <!-- Behaviour -->\n                <div style=\"margin-bottom:15px;\">\n                    <label>Behaviour \/ Aktivitas<\/label>\n                    <textarea name=\"behaviour\" rows=\"2\" style=\"width:100%; padding:8px;\"><\/textarea>\n                <\/div>\n\n                <!-- Kondisi Kesehatan -->\n                <div style=\"margin-bottom:15px;\">\n                    <label>Kondisi Kesehatan<\/label>\n                    <select name=\"health\" id=\"healthSelect\" style=\"width:100%; padding:8px;\">\n                        <option value=\"\">-- Pilih --<\/option>\n                        <option value=\"Baik\">Baik<\/option>\n                        <option value=\"Sakit\">Sakit<\/option>\n                        <option value=\"Mati\">Mati<\/option>\n                    <\/select>\n                    <div id=\"healthNotes\" style=\"display:none; margin-top:10px;\">\n                        <textarea name=\"health_notes\" placeholder=\"Keterangan sakit\" rows=\"2\" style=\"width:100%; padding:8px;\"><\/textarea>\n                    <\/div>\n                <\/div>\n\n                <!-- Hidden input untuk menyimpan ID individu hasil match -->\n                <input type=\"hidden\" name=\"individual_id\" id=\"individualId\" value=\"\">\n\n                <!-- Area hasil analisis -->\n                <div id=\"analysisResult\" style=\"margin-bottom:15px; padding:10px; background:#e6f7ff; border-radius:5px; display:none;\">\n                    <p id=\"analysisMessage\"><\/p>\n                    <div id=\"matchInfo\" style=\"display:none;\">\n                        <p><strong>Individu yang mirip ditemukan:<\/strong><\/p>\n                        <div id=\"matchDetails\"><\/div>\n                        <div style=\"margin-top:10px;\">\n                            <button type=\"button\" id=\"useExistingBtn\" style=\"background:#2e7d32; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">\u2705 Gunakan Individu Ini<\/button>\n                            <button type=\"button\" id=\"newIndividualBtn\" style=\"background:#0284c7; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">\ud83c\udd95 Simpan Sebagai Individu Baru<\/button>\n                        <\/div>\n                    <\/div>\n                    <div id=\"newNameField\" style=\"display:none; margin-top:10px;\">\n                        <label>Nama untuk individu baru:<\/label>\n                        <input type=\"text\" id=\"newTurtleName\" style=\"width:100%; padding:8px; margin-top:5px;\">\n                    <\/div>\n                <\/div>\n\n                <!-- Tombol Submit -->\n                <button type=\"submit\" id=\"submitBtn\" disabled style=\"background:#0284c7; color:white; border:none; padding:12px; border-radius:5px; cursor:pointer; width:100%; font-size:16px;\">\ud83d\udcbe Simpan Data<\/button>\n            <\/form>\n            <p style=\"font-size:12px; color:#666; margin-top:15px;\">*Field wajib diisi. Klik foto untuk crop.<\/p>\n        `;\n\n        \/\/ Inisialisasi komponen form\n        initRegionDropdowns();\n        initMiniMap();\n        initTurtleForm();\n    }\n\n    function initMiniMap() {\n        try {\n            var miniMap = L.map('mini-map').setView([-2.5, 118], 5);\n            L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}', { attribution: 'Tiles &copy; Esri' }).addTo(miniMap);\n            var marker;\n\n            function updateMarkerFromInput() {\n                var lat = parseFloat(document.getElementById('lat').value);\n                var lng = parseFloat(document.getElementById('lng').value);\n                if (!isNaN(lat) && !isNaN(lng)) {\n                    if (marker) miniMap.removeLayer(marker);\n                    marker = L.marker([lat, lng]).addTo(miniMap);\n                    miniMap.setView([lat, lng], 10);\n                    fillFromCoordinates(lat, lng).catch(e => console.error(e));\n                } else {\n                    if (marker) miniMap.removeLayer(marker);\n                    marker = null;\n                }\n            }\n\n            miniMap.on('click', function(e) {\n                var lat = e.latlng.lat.toFixed(6);\n                var lng = e.latlng.lng.toFixed(6);\n                document.getElementById('lat').value = lat;\n                document.getElementById('lng').value = lng;\n                updateMarkerFromInput();\n            });\n\n            document.getElementById('lat').addEventListener('input', updateMarkerFromInput);\n            document.getElementById('lng').addEventListener('input', updateMarkerFromInput);\n            updateMarkerFromInput();\n        } catch (e) {\n            console.error('Error di initMiniMap:', e);\n        }\n    }\n\n    function initRegionDropdowns() {\n        try {\n            const provinceSelect = document.getElementById('provinceSelect');\n            const districtSelect = document.getElementById('districtSelect');\n            if (!provinceSelect || !districtSelect) return;\n\n            provinceSelect.innerHTML = '<option value=\"\">Pilih Provinsi<\/option>';\n            districtSelect.innerHTML = '<option value=\"\">Pilih Kab\/Kota<\/option>';\n\n            const provinces = Object.keys(indonesiaRegions).sort();\n            provinces.forEach(prov => {\n                const option = document.createElement('option');\n                option.value = prov;\n                option.textContent = prov;\n                provinceSelect.appendChild(option);\n            });\n\n            provinceSelect.addEventListener('change', function() {\n                const selectedProv = this.value;\n                districtSelect.innerHTML = '<option value=\"\">Pilih Kab\/Kota<\/option>';\n                if (selectedProv && indonesiaRegions[selectedProv]) {\n                    const cities = indonesiaRegions[selectedProv].sort();\n                    cities.forEach(city => {\n                        const option = document.createElement('option');\n                        option.value = city;\n                        option.textContent = city;\n                        districtSelect.appendChild(option);\n                    });\n                }\n            });\n        } catch (e) {\n            console.error('Error di initRegionDropdowns:', e);\n        }\n    }\n\n    function initTurtleForm() {\n        const healthSelect = document.getElementById('healthSelect');\n        const healthNotesDiv = document.getElementById('healthNotes');\n        const analysisResult = document.getElementById('analysisResult');\n        const analysisMessage = document.getElementById('analysisMessage');\n        const matchInfo = document.getElementById('matchInfo');\n        const matchDetails = document.getElementById('matchDetails');\n        const useExistingBtn = document.getElementById('useExistingBtn');\n        const newIndividualBtn = document.getElementById('newIndividualBtn');\n        const newNameField = document.getElementById('newNameField');\n        const newTurtleName = document.getElementById('newTurtleName');\n        const submitBtn = document.getElementById('submitBtn');\n        const individualId = document.getElementById('individualId');\n        const leftInput = document.getElementById('leftPhotoInput');\n        const rightInput = document.getElementById('rightPhotoInput');\n        const leftHidden = document.getElementById('leftPhotoData');\n        const rightHidden = document.getElementById('rightPhotoData');\n        const shellInput = document.getElementById('shellPhotoInput');\n        const shellHidden = document.getElementById('shellPhotoData');\n\n        \/\/ Health notes toggle\n        healthSelect.addEventListener('change', function() {\n            healthNotesDiv.style.display = (this.value === 'Sakit') ? 'block' : 'none';\n        });\n\n        \/\/ ========== MODAL CROP ==========\n        const modalHTML = `\n        <div id=\"cropModal\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.8); z-index:10000; justify-content:center; align-items:center; flex-direction:column;\">\n            <div style=\"background:#fff; padding:20px; border-radius:10px; width:90%; max-width:800px;\">\n                <div style=\"display:flex; justify-content:space-between; align-items:center;\">\n                    <h3 style=\"margin:0;\">Crop Foto<\/h3>\n                    <button id=\"closeCropModal\" style=\"background:none; border:none; font-size:24px; cursor:pointer;\">&times;<\/button>\n                <\/div>\n                <div style=\"margin:20px 0;\">\n                    <img decoding=\"async\" id=\"cropImage\" src=\"\" style=\"max-width:100%; max-height:70vh;\">\n                <\/div>\n                <div style=\"display:flex; justify-content:flex-end; gap:10px;\">\n                    <button id=\"cropButton\" style=\"background:#0284c7; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">Crop<\/button>\n                    <button id=\"cancelCrop\" style=\"background:#6c757d; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">Batal<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n        `;\n        document.body.insertAdjacentHTML('beforeend', modalHTML);\n\n        let cropper;\n        let currentInput = null;\n        const cropModal = document.getElementById('cropModal');\n        const cropImage = document.getElementById('cropImage');\n        const cropButton = document.getElementById('cropButton');\n        const closeCropModal = document.getElementById('closeCropModal');\n        const cancelCrop = document.getElementById('cancelCrop');\n\n        function showCropModal() { cropModal.style.display = 'flex'; }\n        function hideCropModal() {\n            cropModal.style.display = 'none';\n            if (cropper) { cropper.destroy(); cropper = null; }\n        }\n\n        closeCropModal.addEventListener('click', hideCropModal);\n        cancelCrop.addEventListener('click', hideCropModal);\n\n        \/\/ Fungsi kompresi gambar\n        function compressImage(file, quality = 0.85) {\n            return new Promise((resolve, reject) => {\n                const reader = new FileReader();\n                reader.onload = function(e) {\n                    const img = new Image();\n                    img.onload = function() {\n                        const canvas = document.createElement('canvas');\n                        canvas.width = img.width;\n                        canvas.height = img.height;\n                        const ctx = canvas.getContext('2d');\n                        ctx.drawImage(img, 0, 0);\n                        canvas.toBlob(function(blob) {\n                            if (!blob) {\n                                reject(new Error('Gagal mengompresi gambar'));\n                                return;\n                            }\n                            const compressedFile = new File([blob], file.name, { type: 'image\/jpeg' });\n                            resolve(compressedFile);\n                        }, 'image\/jpeg', quality);\n                    };\n                    img.onerror = reject;\n                    img.src = e.target.result;\n                };\n                reader.onerror = reject;\n                reader.readAsDataURL(file);\n            });\n        }\n\n        \/\/ Fungsi untuk menangani file hasil crop\n        async function handleCroppedFile(blob, inputElement, hiddenElement, side) {\n            try {\n                console.log(`\ud83d\udcf8 Memproses crop untuk ${side}`);\n                const file = new File([blob], 'cropped.jpg', { type: 'image\/jpeg' });\n                const quality = (side === 'shell') ? 0.9 : 0.85;\n                const compressedFile = await compressImage(file, quality);\n                \n                const reader = new FileReader();\n                reader.onload = function(e) {\n                    hiddenElement.value = e.target.result;\n                    console.log(`\u2705 ${side} hidden value length:`, e.target.result.length);\n                    \n                    \/\/ Jika foto kiri sudah siap, lakukan analisis (tidak perlu menunggu kanan)\n                    if (side === 'left') {\n                        analyzePhotos();\n                    }\n                };\n                reader.readAsDataURL(compressedFile);\n            } catch (err) {\n                console.error(`\u274c Gagal memproses ${side}:`, err);\n                alert(`Gagal memproses foto ${side}. Coba lagi.`);\n            }\n        }\n\n        leftInput.addEventListener('change', function() {\n            currentInput = this;\n            const file = this.files[0];\n            if (file) {\n                const reader = new FileReader();\n                reader.onload = function(e) {\n                    cropImage.src = e.target.result;\n                    showCropModal();\n                    if (cropper) cropper.destroy();\n                    cropper = new Cropper(cropImage, { aspectRatio: NaN, viewMode: 1, autoCropArea: 1 });\n                };\n                reader.readAsDataURL(file);\n            }\n        });\n\n        rightInput.addEventListener('change', function() {\n            currentInput = this;\n            const file = this.files[0];\n            if (file) {\n                const reader = new FileReader();\n                reader.onload = function(e) {\n                    cropImage.src = e.target.result;\n                    showCropModal();\n                    if (cropper) cropper.destroy();\n                    cropper = new Cropper(cropImage, { aspectRatio: NaN, viewMode: 1, autoCropArea: 1 });\n                };\n                reader.readAsDataURL(file);\n            }\n        });\n\n        shellInput.addEventListener('change', function() {\n            currentInput = this;\n            const file = this.files[0];\n            if (file) {\n                const reader = new FileReader();\n                reader.onload = function(e) {\n                    cropImage.src = e.target.result;\n                    showCropModal();\n                    if (cropper) cropper.destroy();\n                    cropper = new Cropper(cropImage, { aspectRatio: NaN, viewMode: 1, autoCropArea: 1 });\n                };\n                reader.readAsDataURL(file);\n            }\n        });\n\n        cropButton.addEventListener('click', function() {\n            if (cropper) {\n                const canvas = cropper.getCroppedCanvas();\n                canvas.toBlob(function(blob) {\n                    hideCropModal();\n                    let hidden, side;\n                    if (currentInput === leftInput) {\n                        hidden = leftHidden;\n                        side = 'left';\n                    } else if (currentInput === rightInput) {\n                        hidden = rightHidden;\n                        side = 'right';\n                    } else {\n                        hidden = shellHidden;\n                        side = 'shell';\n                    }\n                    handleCroppedFile(blob, currentInput, hidden, side);\n                }, 'image\/jpeg');\n            }\n        });\n\n        \/\/ ========== MODAL KALIBRASI & PENGUKURAN CANGKANG ==========\n        const calibrationModalHTML = `\n        <div id=\"calibrationModal\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.9); z-index:10001; justify-content:center; align-items:center; flex-direction:column;\">\n            <div style=\"background:#fff; padding:20px; border-radius:10px; width:90%; max-width:900px;\">\n                <div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:15px;\">\n                    <h3 style=\"margin:0;\">\ud83d\udccf Kalibrasi & Pengukuran Cangkang<\/h3>\n                    <button id=\"closeCalibrationModal\" style=\"background:none; border:none; font-size:24px; cursor:pointer;\">&times;<\/button>\n                <\/div>\n                \n                <canvas id=\"calibrationCanvas\" style=\"width:100%; height:400px; border:2px solid #0284c7; background:#f0f0f0;\"><\/canvas>\n                \n                <div id=\"calibrationStep1\" style=\"margin-top:20px;\">\n                    <p><strong>Langkah 1:<\/strong> Tarik garis pada objek dengan ukuran yang diketahui (misal: uang koin, penggaris).<\/p>\n                    <div style=\"display:flex; gap:10px; align-items:center; margin-bottom:10px;\">\n                        <input type=\"number\" id=\"knownLength\" placeholder=\"Panjang sebenarnya (cm)\" step=\"0.1\" min=\"0.1\" style=\"flex:1; padding:8px; border:1px solid #ccc; border-radius:5px;\">\n                        <button id=\"calibrateBtn\" style=\"background:#0284c7; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">Kalibrasi<\/button>\n                    <\/div>\n                    <p id=\"calibrationResult\" style=\"margin-top:10px; font-weight:bold; color:#0284c7;\"><\/p>\n                <\/div>\n                \n                <div id=\"calibrationStep2\" style=\"display:none; margin-top:20px;\">\n                    <p><strong>Langkah 2:<\/strong> Ukur CCL (panjang karapas) dan CCW (lebar karapas).<\/p>\n                    <div style=\"display:flex; gap:20px; margin-bottom:15px;\">\n                        <button id=\"measureCCLBtn\" style=\"background:#2e7d32; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">\ud83d\udccf Ukur CCL<\/button>\n                        <button id=\"measureCCWBtn\" style=\"background:#2e7d32; color:white; border:none; padding:8px 15px; border-radius:5px; cursor:pointer;\">\ud83d\udcd0 Ukur CCW<\/button>\n                    <\/div>\n                    <div style=\"display:flex; gap:20px;\">\n                        <div>\n                            <label>CCL hasil:<\/label>\n                            <input type=\"number\" id=\"measuredCCL\" step=\"0.1\" readonly style=\"width:100px; padding:5px;\">\n                        <\/div>\n                        <div>\n                            <label>CCW hasil:<\/label>\n                            <input type=\"number\" id=\"measuredCCW\" step=\"0.1\" readonly style=\"width:100px; padding:5px;\">\n                        <\/div>\n                    <\/div>\n                    <div style=\"margin-top:20px; text-align:right;\">\n                        <button id=\"applyCalibrationBtn\" style=\"background:#0284c7; color:white; border:none; padding:10px 20px; border-radius:5px; cursor:pointer;\">\u2705 Terapkan ke Form<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        `;\n        document.body.insertAdjacentHTML('beforeend', calibrationModalHTML);\n\n        let calibrationState = {\n            image: null,\n            canvas: document.getElementById('calibrationCanvas'),\n            ctx: null,\n            scale: 0,\n            knownLength: 0,\n            drawing: false,\n            startX: 0,\n            startY: 0,\n            currentX: 0,\n            currentY: 0,\n            mode: 'calibrate',\n            tempLine: null\n        };\n\n        if (calibrationState.canvas) {\n            calibrationState.ctx = calibrationState.canvas.getContext('2d');\n        }\n\n        function fileToBase64(file, callback) {\n            const reader = new FileReader();\n            reader.onload = function(e) {\n                callback(e.target.result);\n            };\n            reader.readAsDataURL(file);\n        }\n\n        function openCalibrationModal(imageFile) {\n            const modal = document.getElementById('calibrationModal');\n            if (!modal) return;\n            \n            const reader = new FileReader();\n            reader.onload = function(e) {\n                const img = new Image();\n                img.onload = function() {\n                    calibrationState.image = img;\n                    calibrationState.canvas.width = img.width;\n                    calibrationState.canvas.height = img.height;\n                    calibrationState.ctx.drawImage(img, 0, 0);\n                    calibrationState.scale = 0;\n                    calibrationState.mode = 'calibrate';\n                    document.getElementById('calibrationStep1').style.display = 'block';\n                    document.getElementById('calibrationStep2').style.display = 'none';\n                    document.getElementById('calibrationResult').innerHTML = '';\n                };\n                img.src = e.target.result;\n            };\n            reader.readAsDataURL(imageFile);\n            \n            modal.style.display = 'flex';\n        }\n\n        shellInput.addEventListener('change', function() {\n            if (this.files && this.files[0]) {\n                openCalibrationModal(this.files[0]);\n            }\n        });\n\n        calibrationState.canvas.addEventListener('mousedown', function(e) {\n            const rect = calibrationState.canvas.getBoundingClientRect();\n            const scaleX = calibrationState.canvas.width \/ rect.width;\n            const scaleY = calibrationState.canvas.height \/ rect.height;\n            \n            calibrationState.drawing = true;\n            calibrationState.startX = (e.clientX - rect.left) * scaleX;\n            calibrationState.startY = (e.clientY - rect.top) * scaleY;\n            calibrationState.currentX = calibrationState.startX;\n            calibrationState.currentY = calibrationState.startY;\n        });\n\n        calibrationState.canvas.addEventListener('mousemove', function(e) {\n            if (!calibrationState.drawing) return;\n            \n            const rect = calibrationState.canvas.getBoundingClientRect();\n            const scaleX = calibrationState.canvas.width \/ rect.width;\n            const scaleY = calibrationState.canvas.height \/ rect.height;\n            \n            calibrationState.currentX = (e.clientX - rect.left) * scaleX;\n            calibrationState.currentY = (e.clientY - rect.top) * scaleY;\n            \n            const ctx = calibrationState.ctx;\n            ctx.clearRect(0, 0, calibrationState.canvas.width, calibrationState.canvas.height);\n            ctx.drawImage(calibrationState.image, 0, 0);\n            \n            ctx.beginPath();\n            ctx.strokeStyle = calibrationState.mode === 'calibrate' ? '#0284c7' : '#dc2626';\n            ctx.lineWidth = 3;\n            ctx.moveTo(calibrationState.startX, calibrationState.startY);\n            ctx.lineTo(calibrationState.currentX, calibrationState.currentY);\n            ctx.stroke();\n            \n            const pixelLength = Math.sqrt(\n                Math.pow(calibrationState.currentX - calibrationState.startX, 2) +\n                Math.pow(calibrationState.currentY - calibrationState.startY, 2)\n            );\n            \n            if (calibrationState.mode === 'calibrate') {\n                document.getElementById('calibrationResult').innerHTML = \n                    `Panjang: ${pixelLength.toFixed(1)} piksel. Masukkan panjang sebenarnya lalu klik Kalibrasi.`;\n            } else if (calibrationState.mode === 'measureCCL' && calibrationState.scale > 0) {\n                const lengthCm = pixelLength \/ calibrationState.scale;\n                document.getElementById('measuredCCL').value = lengthCm.toFixed(1);\n            } else if (calibrationState.mode === 'measureCCW' && calibrationState.scale > 0) {\n                const lengthCm = pixelLength \/ calibrationState.scale;\n                document.getElementById('measuredCCW').value = lengthCm.toFixed(1);\n            }\n        });\n\n        calibrationState.canvas.addEventListener('mouseup', function() {\n            if (!calibrationState.drawing) return;\n            calibrationState.drawing = false;\n            if (calibrationState.mode === 'measureCCL' || calibrationState.mode === 'measureCCW') {\n                calibrationState.mode = 'idle';\n            }\n        });\n\n        document.getElementById('calibrateBtn').addEventListener('click', function() {\n            const knownLength = parseFloat(document.getElementById('knownLength').value);\n            if (isNaN(knownLength) || knownLength <= 0) {\n                alert('Masukkan panjang sebenarnya yang valid (cm)');\n                return;\n            }\n            \n            const pixelLength = Math.sqrt(\n                Math.pow(calibrationState.currentX - calibrationState.startX, 2) +\n                Math.pow(calibrationState.currentY - calibrationState.startY, 2)\n            );\n            \n            if (pixelLength === 0) {\n                alert('Tarik garis terlebih dahulu');\n                return;\n            }\n            \n            calibrationState.scale = pixelLength \/ knownLength;\n            calibrationState.knownLength = knownLength;\n            \n            document.getElementById('calibrationResult').innerHTML = \n                `Kalibrasi berhasil! 1 cm = ${calibrationState.scale.toFixed(2)} piksel. Sekarang ukur CCL dan CCW.`;\n            \n            document.getElementById('calibrationStep1').style.display = 'none';\n            document.getElementById('calibrationStep2').style.display = 'block';\n        });\n\n        document.getElementById('measureCCLBtn').addEventListener('click', function() {\n            if (calibrationState.scale === 0) {\n                alert('Lakukan kalibrasi terlebih dahulu');\n                return;\n            }\n            calibrationState.mode = 'measureCCL';\n            alert('Tarik garis dari ujung atas ke ujung bawah karapas (panjang)');\n        });\n\n        document.getElementById('measureCCWBtn').addEventListener('click', function() {\n            if (calibrationState.scale === 0) {\n                alert('Lakukan kalibrasi terlebih dahulu');\n                return;\n            }\n            calibrationState.mode = 'measureCCW';\n            alert('Tarik garis dari sisi kiri ke kanan karapas (lebar)');\n        });\n\n        document.getElementById('applyCalibrationBtn').addEventListener('click', function() {\n            const cclInput = document.querySelector('input[name=\"ccl\"]');\n            const ccwInput = document.querySelector('input[name=\"ccw\"]');\n            const measuredCCL = document.getElementById('measuredCCL').value;\n            const measuredCCW = document.getElementById('measuredCCW').value;\n            \n            if (measuredCCL) cclInput.value = measuredCCL;\n            if (measuredCCW) ccwInput.value = measuredCCW;\n            \n            if (shellInput.files && shellInput.files[0]) {\n                fileToBase64(shellInput.files[0], function(base64) {\n                    if (shellHidden) shellHidden.value = base64;\n                });\n            }\n            \n            document.getElementById('calibrationModal').style.display = 'none';\n        });\n\n        document.getElementById('closeCalibrationModal').addEventListener('click', function() {\n            document.getElementById('calibrationModal').style.display = 'none';\n        });\n\n        \/\/ ========== ANALISIS FOTO (HANYA SISI KIRI) ==========\n        async function analyzePhotos() {\n            const form = document.getElementById('turtleForm');\n            const formData = new FormData(form);\n            formData.delete('left_photo');\n            formData.append('left_photo_base64', leftHidden.value);\n            \/\/ Opsional: jika ada foto kanan, tetap kirim\n            if (rightHidden?.value) {\n                formData.append('right_photo_base64', rightHidden.value);\n            }\n\n            analysisResult.style.display = 'block';\n            analysisMessage.textContent = '\u23f3 Menganalisis pola sisi kiri...';\n\n            try {\n                const response = await fetch(`\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-analyze.php`, {\n                    method: 'POST',\n                    body: formData\n                });\n                const result = await response.json();\n                currentMatch = result.matchData ? { id: result.matchData.id, name: result.matchData.name, confidence: result.matchData.confidence } : null;\n\n                if (result.status === 'match') {\n                    matchInfo.style.display = 'block';\n                    newNameField.style.display = 'none';\n\n                    \/\/ Tampilkan perbandingan gambar sisi kiri (upload vs database)\n                    const uploadedLeft = leftHidden.value;\n                    const dbLeft = result.matchData.left_photo_url || '';\n\n                    matchDetails.innerHTML = `\n                        <div class=\"comparison-container\">\n                            <div class=\"comparison-item\">\n                                <strong>Foto Kiri Upload<\/strong><br>\n                                <img decoding=\"async\" src=\"${uploadedLeft}\" alt=\"Kiri Upload\">\n                            <\/div>\n                            <div class=\"comparison-item\">\n                                <strong>Foto Kiri Database<\/strong><br>\n                                ${dbLeft ? `<img decoding=\"async\" src=\"${dbLeft}\" alt=\"Kiri DB\">` : '<p>Foto tidak tersedia<\/p>'}\n                            <\/div>\n                        <\/div>\n                        <p><strong>ID:<\/strong> ${result.matchData.id}<\/p>\n                        <p><strong>Nama:<\/strong> ${result.matchData.name || ''}<\/p>\n                        <p><strong>Spesies:<\/strong> ${result.matchData.species || ''}<\/p>\n                        <p><strong>Kemiripan:<\/strong> ${Math.round(result.matchData.confidence * 100)}%<\/p>\n                    `;\n                    \/\/ Tombol submit tetap disabled sampai user memilih\n                    submitBtn.disabled = true;\n                } else if (result.status === 'new') {\n                    matchInfo.style.display = 'none';\n                    newNameField.style.display = 'block';\n                    submitBtn.disabled = false; \/\/ langsung enable untuk individu baru\n                    if (result.feature_data?.temp_id) {\n                        let oldTemp = form.querySelector('input[name=\"temp_id\"]');\n                        if (oldTemp) oldTemp.remove();\n                        let tempInput = document.createElement('input');\n                        tempInput.type = 'hidden';\n                        tempInput.name = 'temp_id';\n                        tempInput.value = result.feature_data.temp_id;\n                        form.appendChild(tempInput);\n                        console.log('temp_id ditambahkan ke form:', result.feature_data.temp_id);\n                    }\n                } else {\n                    analysisMessage.textContent = '\u274c ' + (result.message || 'Gagal menganalisis. Simpan sebagai individu baru.');\n                    submitBtn.disabled = false; \/\/ tetap bisa simpan meskipun analisis gagal\n                }\n            } catch (err) {\n                analysisMessage.textContent = '\u274c Gagal menganalisis. Simpan sebagai individu baru.';\n                submitBtn.disabled = false;\n                console.error(err);\n            }\n        }\n\n        \/\/ ========== TOMBOL \"Gunakan Individu Ini\" ==========\n        if (useExistingBtn) {\n            useExistingBtn.addEventListener('click', function() {\n                if (currentMatch) {\n                    individualId.value = currentMatch.id;\n                    \/\/ Hapus temp_id jika ada\n                    const tempInput = document.querySelector('input[name=\"temp_id\"]');\n                    if (tempInput) tempInput.remove();\n                    matchInfo.style.display = 'none';\n                    newNameField.style.display = 'none';\n                    submitBtn.disabled = false;\n                    analysisMessage.textContent = `\u2705 Menggunakan individu ${currentMatch.id}`;\n                }\n            });\n        }\n\n        \/\/ ========== TOMBOL \"Simpan Sebagai Individu Baru\" ==========\n        if (newIndividualBtn) {\n            newIndividualBtn.addEventListener('click', function() {\n                individualId.value = ''; \/\/ kosongkan ID\n                matchInfo.style.display = 'none';\n                newNameField.style.display = 'block';\n                submitBtn.disabled = false;\n            });\n        }\n    }\n\n    \/\/ ========== FUNGSI TABEL DAN PETA ==========\n    function loadDataAndRender() {\n        fetch(`\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-get.php`)\n            .then(response => response.json())\n            .then(data => {\n                allData = data;\n                const provinces = [...new Set(data.map(item => item.province).filter(p => p))];\n                const districts = [...new Set(data.map(item => item.district).filter(d => d))];\n                document.getElementById('filterProvince').innerHTML = '<option value=\"\">Semua Provinsi<\/option>' + provinces.sort().map(p => `<option value=\"${p}\">${p}<\/option>`).join('');\n                document.getElementById('filterDistrict').innerHTML = '<option value=\"\">Semua Kab\/Kota<\/option>' + districts.sort().map(d => `<option value=\"${d}\">${d}<\/option>`).join('');\n                filterData();\n            })\n            .catch(err => {\n                document.getElementById('tableBody').innerHTML = '<tr><td colspan=\"24\" style=\"text-align:center; padding:20px; color:red;\">Gagal memuat data.<\/td><\/tr>';\n                console.error(err);\n            });\n    }\n\n    function filterData() {\n        const province = document.getElementById('filterProvince').value;\n        const district = document.getElementById('filterDistrict').value;\n        const search = document.getElementById('searchInput').value.toLowerCase();\n        const selectedSex = document.getElementById('filterSex').value;\n        const minCCL = parseFloat(document.getElementById('filterMinCCL').value);\n\n        filteredAllData = allData.filter(item => {\n            if (province && item.province !== province) return false;\n            if (district && item.district !== district) return false;\n            if (search) {\n                const rowText = Object.values(item).join(' ').toLowerCase();\n                if (!rowText.includes(search)) return false;\n            }\n            if (selectedSex && item.sex !== selectedSex) return false;\n            if (!isNaN(minCCL)) {\n                const ccl = parseFloat(item.ccl) || 0;\n                if (ccl < minCCL) return false;\n            }\n            return true;\n        });\n\n        if (isSuperAdmin) {\n            filteredUserData = filteredAllData;\n        } else if (currentUser) {\n            filteredUserData = filteredAllData.filter(item => item.user_login === currentUser);\n        } else {\n            filteredUserData = [];\n        }\n\n        renderTable(filteredUserData);\n        updateMapMarkers(filteredAllData);\n    }\n\n    function renderTable(data) {\n        const tbody = document.getElementById('tableBody');\n        if (!currentUser) {\n            tbody.innerHTML = '<tr><td colspan=\"24\" style=\"text-align:center; padding:20px;\">Silakan login untuk melihat data Anda.<\/td><\/tr>';\n            return;\n        }\n        if (data.length === 0) {\n            tbody.innerHTML = '<tr><td colspan=\"24\" style=\"text-align:center; padding:20px;\">Anda belum memiliki data atau tidak ada data sesuai filter.<\/td><\/tr>';\n            return;\n        }\n        let html = '';\n        data.forEach(item => {\n            const canEdit = (item.user_login === currentUser);\n            const actionButtons = canEdit ? `\n                <a href=\"\/edit-turtle\/?id=${item.id}\" style=\"background:#0284c7; color:white; padding:4px 8px; border-radius:4px; text-decoration:none; font-size:12px; margin-right:5px;\">Edit<\/a>\n                <a href=\"javascript:void(0)\" onclick=\"confirmDelete(${item.id})\" style=\"background:#dc2626; color:white; padding:4px 8px; border-radius:4px; text-decoration:none; font-size:12px;\">Hapus<\/a>\n            ` : '';\n            html += `<tr>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.turtle_id || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.turtle_name || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.species || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.province || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.district || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.latitude || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.longitude || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.survey_date || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.survey_time || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\"><img decoding=\"async\" src=\"${item.left_photo_url}\" style=\"max-width:50px; max-height:50px;\" alt=\"Kiri\"><\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\"><img decoding=\"async\" src=\"${item.right_photo_url}\" style=\"max-width:50px; max-height:50px;\" alt=\"Kanan\"><\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.shell_photo_url ? '<img decoding=\"async\" src=\"'+item.shell_photo_url+'\" style=\"max-width:50px; max-height:50px;\" alt=\"Cangkang\">' : ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.ccl || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.ccw || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.sex || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.depth || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.behaviour || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.health || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.health_notes || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.analysis_result || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.contributor || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.surveyor || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${item.institution || ''}<\/td>\n                <td style=\"padding:8px; border-bottom:1px solid #e2e8f0;\">${actionButtons}<\/td>\n            <\/tr>`;\n        });\n        tbody.innerHTML = html;\n    }\n\n    window.confirmDelete = function(id) {\n        if (confirm('Apakah Anda yakin ingin menghapus data ini?')) {\n            fetch(`\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-delete.php?id=` + id, { method: 'DELETE' })\n                .then(response => response.json())\n                .then(result => {\n                    if (result.success) {\n                        alert('Data berhasil dihapus.');\n                        window.location.reload();\n                    } else {\n                        alert('Gagal menghapus: ' + result.message);\n                    }\n                })\n                .catch(err => alert('Gagal menghapus: ' + err.message));\n        }\n    };\n\n    function updateMapMarkers(data) {\n        \/\/ Kelompokkan data per turtle_id untuk polyline dan hitung jumlah resighting\n        const grouped = {};\n        data.forEach(item => {\n            const tid = item.turtle_id;\n            if (!tid) return;\n            if (!grouped[tid]) grouped[tid] = [];\n            grouped[tid].push(item);\n        });\n\n        \/\/ Urutkan setiap grup berdasarkan tanggal\n        Object.keys(grouped).forEach(tid => {\n            grouped[tid].sort((a, b) => {\n                const dateA = a.survey_date + ' ' + (a.survey_time || '00:00');\n                const dateB = b.survey_date + ' ' + (b.survey_time || '00:00');\n                return dateA.localeCompare(dateB);\n            });\n        });\n\n        markersCluster.clearLayers();\n\n        \/\/ Gambar polyline untuk setiap individu dengan > 1 titik\n        Object.keys(grouped).forEach(tid => {\n            const points = grouped[tid];\n            if (points.length < 2) return;\n            \n            let hash = 0;\n            for (let i = 0; i < tid.length; i++) {\n                hash = ((hash << 5) - hash) + tid.charCodeAt(i);\n                hash |= 0;\n            }\n            const hue = Math.abs(hash) % 360;\n            const color = `hsl(${hue}, 70%, 50%)`;\n            const latlngs = points.map(p => [parseFloat(p.latitude), parseFloat(p.longitude)]);\n            const polyline = L.polyline(latlngs, { color: color, weight: 3, opacity: 0.7 });\n            markersCluster.addLayer(polyline);\n        });\n\n        \/\/ Gambar marker untuk setiap data\n        Object.keys(grouped).forEach(tid => {\n            const points = grouped[tid];\n            const baseName = points[0].turtle_name || 'Penyu';\n            \n            points.forEach((item, index) => {\n                const lat = parseFloat(item.latitude);\n                const lng = parseFloat(item.longitude);\n                if (isNaN(lat) || isNaN(lng)) return;\n\n                const occurrence = index + 1;\n                const displayName = occurrence > 1 ? `${baseName} (${occurrence})` : baseName;\n\n                const marker = L.marker([lat, lng]);\n                marker.bindPopup(`\n                    <b>${displayName}<\/b><br>\n                    <img decoding=\"async\" src=\"${item.left_photo_url}\" style=\"max-width:100px; max-height:100px;\"><br>\n                    Spesies: ${item.species || '-'}<br>\n                    \ud83c\udd94 ID: ${item.turtle_id}<br>\n                    \ud83d\udcc5 Tanggal: ${item.survey_date}<br>\n                    \ud83d\udccf CCL: ${item.ccl || '-'} cm<br>\n                    \u26a5 Kelamin: ${item.sex || '-'}<br>\n                    \ud83d\udcca Kesehatan: ${item.health || '-'}\n                `);\n                markersCluster.addLayer(marker);\n            });\n        });\n\n        if (map.hasLayer(markersCluster)) map.removeLayer(markersCluster);\n        map.addLayer(markersCluster);\n\n        if (data.length > 0) {\n            const group = L.featureGroup(data.map(item => L.marker([parseFloat(item.latitude), parseFloat(item.longitude)])));\n            map.fitBounds(group.getBounds().pad(0.1));\n        } else {\n            map.setView([-2.5, 118], 5);\n        }\n    }\n\n    document.getElementById('applyFilter').addEventListener('click', filterData);\n    document.getElementById('searchInput').addEventListener('keyup', function(e) { if (e.key === 'Enter') filterData(); });\n    document.getElementById('filterProvince').addEventListener('change', filterData);\n    document.getElementById('filterDistrict').addEventListener('change', filterData);\n    document.getElementById('filterSex').addEventListener('change', filterData);\n    document.getElementById('filterMinCCL').addEventListener('keyup', function(e) { if (e.key === 'Enter') filterData(); });\n\n    document.getElementById('downloadBtn').addEventListener('click', function() {\n        if (!currentUser) { alert('Anda harus login untuk mendownload data.'); return; }\n        const password = prompt('Masukkan password untuk mendownload data:');\n        if (password !== '17agustus1945') { alert('Password salah!'); return; }\n        if (filteredUserData.length === 0) { alert('Tidak ada data sesuai filter.'); return; }\n\n        const format = document.getElementById('formatSelect').value;\n        const headers = ['ID Penyu','Nama','Spesies','Provinsi','Kab\/Kota','Lat','Lng','Tanggal','Waktu','Foto Kiri URL','Foto Kanan URL','Foto Cangkang URL','CCL','CCW','Jenis Kelamin','Kedalaman','Behaviour','Kesehatan','Keterangan Sakit','Hasil Analisis','Kontributor','Surveyor','Instansi'];\n        const rows = filteredUserData.map(item => [\n            item.turtle_id || '', item.turtle_name || '', item.species || '', item.province || '', item.district || '',\n            item.latitude || '', item.longitude || '', item.survey_date || '', item.survey_time || '',\n            item.left_photo_url || '', item.right_photo_url || '', item.shell_photo_url || '',\n            item.ccl || '', item.ccw || '', item.sex || '', item.depth || '', item.behaviour || '',\n            item.health || '', item.health_notes || '', item.analysis_result || '',\n            item.contributor || '', item.surveyor || '', item.institution || ''\n        ]);\n\n        if (format === 'csv') {\n            let csv = headers.join(',') + '\\n';\n            rows.forEach(row => { csv += row.map(val => `\"${val}\"`).join(',') + '\\n'; });\n            downloadBlob(csv, 'text\/csv;charset=utf-8;', 'data_penyu.csv');\n        } else if (format === 'xlsx') {\n            (async () => {\n                try {\n                    const wsData = [headers, ...rows];\n                    const wb = XLSX.utils.book_new();\n                    const ws = XLSX.utils.aoa_to_sheet(wsData);\n                    XLSX.utils.book_append_sheet(wb, ws, 'Data Penyu');\n                    \n                    \/\/ Hitung summary per spesies\n                    const speciesSummary = {};\n                    filteredUserData.forEach(item => {\n                        const sp = item.species || 'Tidak diketahui';\n                        if (!speciesSummary[sp]) {\n                            speciesSummary[sp] = { total_records: 0, unique_individuals: new Set() };\n                        }\n                        speciesSummary[sp].total_records++;\n                        if (item.turtle_id) {\n                            speciesSummary[sp].unique_individuals.add(item.turtle_id);\n                        }\n                    });\n                    \n                    const summaryData = [['Spesies', 'Jumlah Individu Unik', 'Total Record']];\n                    Object.keys(speciesSummary).sort().forEach(sp => {\n                        summaryData.push([\n                            sp,\n                            speciesSummary[sp].unique_individuals.size,\n                            speciesSummary[sp].total_records\n                        ]);\n                    });\n                    \n                    const wsSummary = XLSX.utils.aoa_to_sheet(summaryData);\n                    XLSX.utils.book_append_sheet(wb, wsSummary, 'Summary Spesies');\n                    \n                    \/\/ \/\/ Hitung resighting per individu\nconst resightingMap = {};\nfilteredUserData.forEach(item => {\n    const tid = item.turtle_id;\n    if (!tid) return;\n    if (!resightingMap[tid]) resightingMap[tid] = [];\n    resightingMap[tid].push(item);\n});\n\n\/\/ Buat sheet Resighting: detail per kejadian untuk individu yang muncul lebih dari sekali\nconst resightingRows = [\n    ['ID Penyu', 'Nama', 'Kemunculan ke', 'Tanggal', 'Waktu', 'Latitude', 'Longitude', 'Lokasi', 'Provinsi', 'Kab\/Kota', 'Foto URL']\n];\n\nObject.keys(resightingMap).forEach(tid => {\n    const items = resightingMap[tid];\n    if (items.length > 1) {  \/\/ Hanya individu dengan resighting (\u22652 kejadian)\n        \/\/ Urutkan berdasarkan tanggal dan waktu\n        items.sort((a, b) => {\n            const dateA = a.survey_date + ' ' + (a.survey_time || '00:00');\n            const dateB = b.survey_date + ' ' + (b.survey_time || '00:00');\n            return dateA.localeCompare(dateB);\n        });\n        \n        items.forEach((item, index) => {\n            const nama = item.turtle_name || '-';\n            resightingRows.push([\n                tid,\n                nama,\n                index + 1,  \/\/ nomor urut kemunculan\n                item.survey_date || '',\n                item.survey_time || '',\n                item.latitude || '',\n                item.longitude || '',\n                item.location_name || '',\n                item.province || '',\n                item.district || '',\n                item.left_photo_url || ''   \/\/ URL foto sisi kiri\n            ]);\n        });\n    }\n});\n\nconst wsResighting = XLSX.utils.aoa_to_sheet(resightingRows);\nXLSX.utils.book_append_sheet(wb, wsResighting, 'Resighting');\n                    \n                    const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });\n                    downloadBlob(new Blob([wbout], { type: 'application\/octet-stream' }), 'application\/octet-stream', 'data_penyu.xlsx');\n                } catch (e) {\n                    console.error('Error saat export XLSX:', e);\n                    alert('Terjadi kesalahan saat mengexport data.');\n                }\n            })();\n        } else if (format === 'txt') {\n            let txt = headers.join('\\t') + '\\n';\n            rows.forEach(row => { txt += row.join('\\t') + '\\n'; });\n            downloadBlob(txt, 'text\/plain;charset=utf-8;', 'data_penyu.txt');\n        }\n    });\n\n    function downloadBlob(content, mimeType, filename) {\n        const blob = new Blob([content], { type: mimeType });\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url;\n        a.download = filename;\n        a.click();\n        URL.revokeObjectURL(url);\n    }\n\n    loadDataAndRender();\n});\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-ff6f5cc e-flex e-con-boxed e-con e-parent\" data-id=\"ff6f5cc\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-6305993 e-con-full e-flex e-con e-child\" data-id=\"6305993\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-30ae8eb elementor-widget elementor-widget-heading\" data-id=\"30ae8eb\" 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-f8f0f69 e-con-full e-flex e-con e-child\" data-id=\"f8f0f69\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-28fdbe4 elementor-widget elementor-widget-video\" data-id=\"28fdbe4\" data-element_type=\"widget\" data-settings=\"{&quot;youtube_url&quot;:&quot;https:\\\/\\\/www.youtube.com\\\/watch?v=7lKq2brY-GQ&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\udc22 e-Turtle Indonesia Semua Provinsi Semua Kab\/Kota Semua KelaminJantanBetinaTidak tahu \ud83d\udd0d \ud83d\udd12 Anda belum login. Login Daftar Peta menampilkan semua [&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-1549","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>e-Turtle Indonesia - 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\/e-turtle-indonesia\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"e-Turtle Indonesia\" \/>\n<meta property=\"og:description\" content=\"\ud83d\udc22 e-Turtle Indonesia Semua Provinsi Semua Kab\/Kota Semua KelaminJantanBetinaTidak tahu \ud83d\udd0d \ud83d\udd12 Anda belum login. Login Daftar Peta menampilkan semua [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marineconservation.id\/id\/e-turtle-indonesia\/\" \/>\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-07T12:11:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"1 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/\",\"url\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/\",\"name\":\"e-Turtle Indonesia - marineconservation.id\",\"isPartOf\":{\"@id\":\"https:\/\/marineconservation.id\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png\",\"datePublished\":\"2026-03-04T03:56:11+00:00\",\"dateModified\":\"2026-03-07T12:11:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/marineconservation.id\/e-turtle-indonesia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/#primaryimage\",\"url\":\"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png\",\"contentUrl\":\"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/marineconservation.id\/e-turtle-indonesia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/marineconservation.id\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"e-Turtle Indonesia\"}]},{\"@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":"e-Turtle Indonesia - 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\/e-turtle-indonesia\/","og_locale":"id_ID","og_type":"article","og_title":"e-Turtle Indonesia","og_description":"\ud83d\udc22 e-Turtle Indonesia Semua Provinsi Semua Kab\/Kota Semua KelaminJantanBetinaTidak tahu \ud83d\udd0d \ud83d\udd12 Anda belum login. Login Daftar Peta menampilkan semua [&hellip;]","og_url":"https:\/\/marineconservation.id\/id\/e-turtle-indonesia\/","og_site_name":"marineconservation.id","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61572311944591","article_modified_time":"2026-03-07T12:11:06+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimasi waktu membaca":"1 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/marineconservation.id\/e-turtle-indonesia\/","url":"https:\/\/marineconservation.id\/e-turtle-indonesia\/","name":"e-Turtle Indonesia - marineconservation.id","isPartOf":{"@id":"https:\/\/marineconservation.id\/#website"},"primaryImageOfPage":{"@id":"https:\/\/marineconservation.id\/e-turtle-indonesia\/#primaryimage"},"image":{"@id":"https:\/\/marineconservation.id\/e-turtle-indonesia\/#primaryimage"},"thumbnailUrl":"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png","datePublished":"2026-03-04T03:56:11+00:00","dateModified":"2026-03-07T12:11:06+00:00","breadcrumb":{"@id":"https:\/\/marineconservation.id\/e-turtle-indonesia\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marineconservation.id\/e-turtle-indonesia\/"]}]},{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/marineconservation.id\/e-turtle-indonesia\/#primaryimage","url":"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png","contentUrl":"https:\/\/marineconservation.id\/wp-content\/uploads\/2026\/03\/Penyu-Hijau-1024x576.png"},{"@type":"BreadcrumbList","@id":"https:\/\/marineconservation.id\/e-turtle-indonesia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marineconservation.id\/"},{"@type":"ListItem","position":2,"name":"e-Turtle Indonesia"}]},{"@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\/1549","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=1549"}],"version-history":[{"count":226,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1549\/revisions"}],"predecessor-version":[{"id":1838,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1549\/revisions\/1838"}],"wp:attachment":[{"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/media?parent=1549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}