{"id":1968,"date":"2026-03-30T07:15:32","date_gmt":"2026-03-30T07:15:32","guid":{"rendered":"https:\/\/marineconservation.id\/?page_id=1968"},"modified":"2026-04-04T15:07:55","modified_gmt":"2026-04-04T15:07:55","slug":"find-your-turtle","status":"publish","type":"page","link":"https:\/\/marineconservation.id\/id\/find-your-turtle\/","title":{"rendered":"Find Your Turtle!"},"content":{"rendered":"<style>.elementor-1968 .elementor-element.elementor-element-a552a6e{--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;}<\/style>\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1968\" class=\"elementor elementor-1968\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a552a6e e-flex e-con-boxed e-con e-parent\" data-id=\"a552a6e\" 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-420a91c elementor-widget elementor-widget-html\" data-id=\"420a91c\" 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<!DOCTYPE html>\r\n<html lang=\"id\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\r\n    <title>e-Turtle Indonesia \u2013 Upload & Isi Data Penyu<\/title>\r\n    <!-- Leaflet & MarkerCluster -->\r\n    <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\r\n    <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet.markercluster@1.4.1\/dist\/MarkerCluster.css\" \/>\r\n    <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet.markercluster@1.4.1\/dist\/MarkerCluster.Default.css\" \/>\r\n    <!-- Cropper -->\r\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/cropperjs\/1.5.13\/cropper.min.css\" \/>\r\n    <style>\r\n        * { box-sizing: border-box; }\r\n        body { font-family: 'Segoe UI', Arial, sans-serif; background: #f0f9ff; margin: 0; padding: 20px; }\r\n        .container { max-width: 1400px; margin: 0 auto; }\r\n        .header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; margin-bottom: 20px; background: white; padding: 15px 20px; border-radius: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\r\n        h1 { margin: 0; color: #0284c7; display: flex; align-items: center; gap: 10px; font-size: 1.8rem; }\r\n        .language-selector { padding: 5px 10px; border-radius: 20px; border: 1px solid #cbd5e1; background: #f8fafc; font-size: 14px; cursor: pointer; }\r\n        .grid { display: flex; flex-wrap: wrap; gap: 20px; }\r\n        .map-panel { flex: 2; min-width: 300px; }\r\n        .filter-bar { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 10px; align-items: center; }\r\n        .filter-bar select, .filter-bar input, .filter-bar button { padding: 5px 10px; border-radius: 5px; border: 1px solid #ccc; font-size: 14px; }\r\n        #map { height: 500px; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1); background: #e5e5e5; }\r\n        .contributor-stats {\r\n            background: white;\r\n            border-radius: 12px;\r\n            padding: 12px 15px;\r\n            margin-top: 15px;\r\n            box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n        }\r\n        .contributor-stats h4 {\r\n            margin: 0 0 8px 0;\r\n            color: #0284c7;\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 8px;\r\n        }\r\n        .contributor-list {\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            gap: 12px;\r\n            max-height: 150px;\r\n            overflow-y: auto;\r\n            font-size: 14px;\r\n        }\r\n        .contributor-item {\r\n            background: #f0f8ff;\r\n            padding: 4px 12px;\r\n            border-radius: 20px;\r\n            display: inline-flex;\r\n            align-items: center;\r\n            gap: 6px;\r\n        }\r\n        .contributor-name {\r\n            font-weight: 500;\r\n        }\r\n        .contributor-count {\r\n            background: #0284c7;\r\n            color: white;\r\n            border-radius: 20px;\r\n            padding: 0 8px;\r\n            font-size: 12px;\r\n            font-weight: bold;\r\n        }\r\n        .upload-panel { flex: 1.2; min-width: 350px; background: white; padding: 20px; border-radius: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\r\n        .upload-area { border: 2px dashed #ccc; border-radius: 12px; padding: 30px; text-align: center; margin: 15px 0; transition: all 0.3s; cursor: pointer; background: #fafafa; }\r\n        .upload-area:hover { border-color: #0284c7; background: #f0f8ff; }\r\n        .example-img { max-width: 80px; max-height: 80px; border-radius: 8px; margin-top: 5px; border: 1px solid #ccc; }\r\n        .result-box { margin-top: 15px; padding: 12px; border-radius: 8px; background: #f8fafc; border-left: 4px solid #0284c7; }\r\n        .comparison { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 10px; }\r\n        .comparison img { max-width: 80px; max-height: 80px; border-radius: 8px; border: 1px solid #ccc; }\r\n        .loading { display: inline-block; width: 20px; height: 20px; border: 3px solid #f3f3f3; border-top: 3px solid #0284c7; border-radius: 50%; animation: spin 1s linear infinite; vertical-align: middle; margin-left: 10px; }\r\n        @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\r\n        .btn { background: #0284c7; color: white; border: none; padding: 10px 15px; border-radius: 5px; cursor: pointer; font-size: 14px; transition: background 0.2s; }\r\n        .btn:hover { background: #0369a1; }\r\n        .btn-green { background: #2e7d32; }\r\n        .btn-green:hover { background: #1b5e20; }\r\n        footer { text-align: center; margin-top: 30px; font-size: 12px; color: #666; }\r\n        .form-group { margin-bottom: 12px; }\r\n        .form-group label { display: block; font-weight: bold; margin-bottom: 5px; font-size: 14px; }\r\n        .form-group input, .form-group select { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 5px; }\r\n        .mini-map { height: 200px; border-radius: 8px; margin-bottom: 8px; background: #e5e5e5; }\r\n        .coordinate-row { display: flex; gap: 8px; }\r\n        .coordinate-row input { flex: 1; }\r\n        .hidden-form { display: none; }\r\n        .suggestion-badge { background: #e6f7ff; border-left: 3px solid #0284c7; padding: 8px; margin-top: 5px; margin-bottom: 10px; font-size: 13px; border-radius: 4px; }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"container\">\r\n    <div class=\"header\">\r\n        <h1>\ud83d\udc22 <span id=\"titleText\">e-Turtle Indonesia<\/span><\/h1>\r\n        <select id=\"languageSelect\" class=\"language-selector\">\r\n            <option value=\"id\">\ud83c\uddee\ud83c\udde9 Indonesia<\/option>\r\n            <option value=\"en\">\ud83c\uddec\ud83c\udde7 English<\/option>\r\n        <\/select>\r\n    <\/div>\r\n    <div class=\"grid\">\r\n        <div class=\"map-panel\">\r\n            <div class=\"filter-bar\">\r\n                <select id=\"filterProvince\"><option value=\"\">Semua Provinsi<\/option><\/select>\r\n                <select id=\"filterDistrict\"><option value=\"\">Semua Kab\/Kota<\/option><\/select>\r\n                <input type=\"text\" id=\"searchInput\" placeholder=\"Cari ID, lokasi...\" style=\"flex:1;\">\r\n                <select id=\"filterSex\"><option value=\"\">Semua Kelamin<\/option><option value=\"Jantan\">Jantan<\/option><option value=\"Betina\">Betina<\/option><\/select>\r\n                <input type=\"number\" id=\"filterMinCCL\" placeholder=\"Min CCL (cm)\" step=\"0.1\" style=\"width:100px;\">\r\n                <button id=\"applyFilter\" class=\"btn\">\ud83d\udd0d<\/button>\r\n            <\/div>\r\n            <div id=\"map\"><\/div>\r\n            <!-- DAFTAR KONTRIBUTOR TERBANYAK -->\r\n            <div class=\"contributor-stats\" id=\"contributorStats\">\r\n                <h4>\ud83c\udfc6 <span id=\"contributorTitle\">Kontributor Terbanyak<\/span><\/h4>\r\n                <div id=\"contributorList\" class=\"contributor-list\">Memuat data...<\/div>\r\n            <\/div>\r\n        <\/div>\r\n        <div class=\"upload-panel\">\r\n            <h3 id=\"uploadTitle\">\ud83d\udc22 Upload Foto Sisi Kiri<\/h3>\r\n            <p id=\"uploadDesc\">Upload foto sisi kiri penyu. Setelah itu, isi data lokasi.<\/p>\r\n            <div class=\"upload-area\" id=\"uploadArea\">\r\n                <p id=\"dragText\">\ud83d\udcf8 Klik atau tarik foto sisi kiri ke sini<\/p>\r\n                <input type=\"file\" id=\"leftPhotoInput\" accept=\"image\/*\" style=\"display:none;\">\r\n                <button id=\"uploadBtn\" class=\"btn\" style=\"margin-top:10px;\">Pilih Foto<\/button>\r\n            <\/div>\r\n            <div id=\"exampleSection\"><small id=\"exampleLabel\">Contoh foto kiri:<\/small><br><div id=\"exampleContent\">Memuat contoh...<\/div><\/div>\r\n            <div id=\"analysisResult\" style=\"display:none;\" class=\"result-box\"><\/div>\r\n            <div id=\"dataForm\" class=\"hidden-form\">\r\n                <h4 id=\"formTitle\">\ud83d\udcdd Lengkapi Data Penemuan<\/h4>\r\n                <div class=\"form-group\"><label id=\"speciesLabel\">Spesies<\/label><select id=\"speciesSelect\"><option value=\"\">-- Pilih --<\/option><option value=\"Chelonia mydas\">Penyu Hijau (Chelonia mydas)<\/option><option value=\"Eretmochelys imbricata\">Penyu Sisik (Eretmochelys imbricata)<\/option><option value=\"Lepidochelys olivacea\">Penyu Lekang (Lepidochelys olivacea)<\/option><option value=\"Caretta caretta\">Penyu Tempayan (Caretta caretta)<\/option><option value=\"Dermochelys coriacea\">Penyu Belimbing (Dermochelys coriacea)<\/option><option value=\"Natator depressus\">Penyu Pipih (Natator depressus)<\/option><\/select><\/div>\r\n                <div class=\"form-group\"><label id=\"locNameLabel\">Nama Lokasi<\/label><input type=\"text\" id=\"locationName\" placeholder=\"Contoh: Pantai Trisik\"><\/div>\r\n                <div class=\"form-group\"><label id=\"coordinateLabel\">Koordinat (klik peta mini)<\/label><div id=\"miniMap\" class=\"mini-map\"><\/div><div class=\"coordinate-row\"><input type=\"number\" step=\"any\" id=\"latitude\" placeholder=\"Latitude\"><input type=\"number\" step=\"any\" id=\"longitude\" placeholder=\"Longitude\"><\/div><\/div>\r\n                <div class=\"form-group\"><label id=\"provinceLabel\">Provinsi<\/label><select id=\"provinceSelect\"><option value=\"\">Pilih Provinsi<\/option><\/select><\/div>\r\n                <div class=\"form-group\"><label id=\"districtLabel\">Kabupaten\/Kota<\/label><select id=\"districtSelect\"><option value=\"\">Pilih Kab\/Kota<\/option><\/select><\/div>\r\n                <div class=\"form-group\"><label id=\"dateLabel\">Tanggal<\/label><input type=\"date\" id=\"surveyDate\"><\/div>\r\n                <div class=\"form-group\"><label id=\"contributorLabel\">Nama Kontributor (opsional)<\/label><input type=\"text\" id=\"contributorName\" placeholder=\"Contoh: Yayasan Penyu Indonesia\"><\/div>\r\n                <div id=\"suggestionBox\" class=\"suggestion-badge\" style=\"display:none;\"><\/div>\r\n                <div id=\"newNameGroup\" class=\"form-group\" style=\"display:none;\"><label id=\"newNameLabel\">Nama individu baru (opsional)<\/label><input type=\"text\" id=\"newTurtleName\" placeholder=\"Contoh: Penyu Hijau Betina 01\"><\/div>\r\n                <div id=\"matchInfo\" style=\"display:none; margin-bottom:10px; padding:8px; background:#e6f7ff; border-radius:5px;\"><\/div>\r\n                <button id=\"submitDataBtn\" class=\"btn btn-green\" style=\"width:100%;\">\ud83d\udcbe Simpan Data<\/button>\r\n                <div id=\"saveStatus\" style=\"display:none; margin-top:10px;\"><\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n    <footer id=\"footerText\">\u00a9 e-Turtle Indonesia \u2013 Data publik, tanpa login.<\/footer>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\"><\/script>\r\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\r\n<script src=\"https:\/\/unpkg.com\/leaflet.markercluster@1.4.1\/dist\/leaflet.markercluster.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/cropperjs\/1.5.13\/cropper.min.js\"><\/script>\r\n\r\n<script>\r\n\/\/ ========== KONFIGURASI ==========\r\nconst themeFolder = 'astra'; \/\/ sesuaikan dengan folder tema Anda\r\nconst analyzeEndpoint = `\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-analyze.php`;\r\nconst getDataEndpoint = `\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-get.php`;\r\nconst saveEndpoint = `\/wp-content\/themes\/${themeFolder}\/turtle-api\/turtle-save.php`;\r\n\r\n\/\/ ========== BAHASA ==========\r\nconst translations = {\r\n    id: {\r\n        title:\"e-Turtle Indonesia\", uploadTitle:\"\ud83d\udc22 Upload Foto Sisi Kiri\", uploadDesc:\"Upload foto sisi kiri penyu. Setelah itu, isi data lokasi.\",\r\n        dragText:\"\ud83d\udcf8 Klik atau tarik foto sisi kiri ke sini\", uploadBtn:\"Pilih Foto\", exampleLabel:\"Contoh foto kiri:\",\r\n        analyzing:\"\ud83d\udd0d Menganalisis pola...\", matchFound:\"\u2705 Individu Ditemukan\", newIndividual:\"\ud83c\udd95 Individu Baru\",\r\n        saving:\"\ud83d\udcbe Menyimpan...\", saveSuccess:\"\u2705 Data berhasil disimpan!\", saveError:\"\u274c Gagal menyimpan: \",\r\n        errorMsg:\"\u274c Gagal menganalisis: \", serverError:\"\u274c Gagal hubungi server: \", processError:\"\u274c Gagal proses foto: \",\r\n        noExample:\"Belum ada contoh.\", similarity:\"Kemiripan\", id:\"ID\", name:\"Nama\", species:\"Spesies\",\r\n        photoUpload:\"Foto Upload\", photoDB:\"Foto DB\", photoNotAvailable:\"Tidak ada\", suggestedSpecies:\"Spesies saran: \",\r\n        footer:\"\u00a9 e-Turtle Indonesia \u2013 Data publik, tanpa login.\", formTitle:\"\ud83d\udcdd Lengkapi Data\",\r\n        speciesLabel:\"Spesies\", locNameLabel:\"Nama Lokasi\", coordinateLabel:\"Koordinat\", provinceLabel:\"Provinsi\",\r\n        districtLabel:\"Kab\/Kota\", dateLabel:\"Tanggal\", contributorLabel:\"Nama Kontributor (opsional)\",\r\n        newNameLabel:\"Nama individu baru (opsional)\", submitBtn:\"\ud83d\udcbe Simpan Data\",\r\n        matchInfoText:\"Individu cocok: {name} (ID: {id}) - Kemiripan {conf}%\",\r\n        previousLocationSuggestion:\"\ud83d\udccd Lokasi pertemuan sebelumnya: {loc} ({date})\",\r\n        loginError:\"\u274c Endpoint memerlukan login. Periksa kembali backend.\",\r\n        contributorTitle:\"\ud83c\udfc6 Kontributor Terbanyak\"\r\n    },\r\n    en: {\r\n        title:\"e-Turtle Indonesia\", uploadTitle:\"\ud83d\udc22 Upload Left Side Photo\", uploadDesc:\"Upload left side photo, then fill location.\",\r\n        dragText:\"\ud83d\udcf8 Click or drag left photo\", uploadBtn:\"Choose Photo\", exampleLabel:\"Example left photo:\",\r\n        analyzing:\"\ud83d\udd0d Analyzing pattern...\", matchFound:\"\u2705 Individual Found\", newIndividual:\"\ud83c\udd95 New Individual\",\r\n        saving:\"\ud83d\udcbe Saving...\", saveSuccess:\"\u2705 Data saved!\", saveError:\"\u274c Save failed: \",\r\n        errorMsg:\"\u274c Analysis failed: \", serverError:\"\u274c Server error: \", processError:\"\u274c Photo processing failed: \",\r\n        noExample:\"No example yet.\", similarity:\"Similarity\", id:\"ID\", name:\"Name\", species:\"Species\",\r\n        photoUpload:\"Uploaded\", photoDB:\"Database\", photoNotAvailable:\"N\/A\", suggestedSpecies:\"Suggested species: \",\r\n        footer:\"\u00a9 e-Turtle Indonesia \u2013 Public data, no login.\", formTitle:\"\ud83d\udcdd Complete Data\",\r\n        speciesLabel:\"Species\", locNameLabel:\"Location\", coordinateLabel:\"Coordinates\", provinceLabel:\"Province\",\r\n        districtLabel:\"District\", dateLabel:\"Date\", contributorLabel:\"Contributor Name (optional)\",\r\n        newNameLabel:\"New individual name (optional)\", submitBtn:\"\ud83d\udcbe Save Data\",\r\n        matchInfoText:\"Matching: {name} (ID: {id}) - {conf}%\",\r\n        previousLocationSuggestion:\"\ud83d\udccd Previous location: {loc} ({date})\",\r\n        loginError:\"\u274c Endpoint requires login. Please check backend.\",\r\n        contributorTitle:\"\ud83c\udfc6 Top Contributors\"\r\n    }\r\n};\r\n\r\nlet currentLang = 'id';\r\nlet allData = [], filteredAllData = [], map, markersCluster, miniMap, miniMarker;\r\nlet currentMatch = null, currentPhotoBase64 = null, suggestedSpecies = null, currentTempId = null, isNewIndividual = false;\r\nfunction getText(k) { return translations[currentLang][k] || translations.id[k]; }\r\n\r\n\/\/ ========== DATA LENGKAP PROVINSI DAN KABUPATEN\/KOTA INDONESIA ==========\r\nconst indonesiaRegions = {\r\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\"],\r\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\", \"Kota Binjai\", \"Kota Gunungsitoli\", \"Kota Medan\", \"Kota Padangsidimpuan\", \"Kota Pematangsiantar\", \"Kota Sibolga\", \"Kota Tanjungbalai\", \"Kota Tebing Tinggi\"],\r\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\"],\r\n    \"Riau\": [\"Bengkalis\", \"Indragiri Hilir\", \"Indragiri Hulu\", \"Kampar\", \"Kepulauan Meranti\", \"Kuantan Singingi\", \"Pelalawan\", \"Rokan Hilir\", \"Rokan Hulu\", \"Siak\", \"Kota Dumai\", \"Kota Pekanbaru\"],\r\n    \"Kepulauan Riau\": [\"Bintan\", \"Karimun\", \"Kepulauan Anambas\", \"Lingga\", \"Natuna\", \"Kota Batam\", \"Kota Tanjungpinang\"],\r\n    \"Jambi\": [\"Batanghari\", \"Bungo\", \"Kerinci\", \"Merangin\", \"Muaro Jambi\", \"Sarolangun\", \"Tanjung Jabung Barat\", \"Tanjung Jabung Timur\", \"Tebo\", \"Kota Jambi\", \"Kota Sungai Penuh\"],\r\n    \"Bengkulu\": [\"Bengkulu Selatan\", \"Bengkulu Tengah\", \"Bengkulu Utara\", \"Kaur\", \"Kepahiang\", \"Lebong\", \"Muko Muko\", \"Rejang Lebong\", \"Seluma\", \"Kota Bengkulu\"],\r\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\"],\r\n    \"Bangka Belitung\": [\"Bangka\", \"Bangka Barat\", \"Bangka Selatan\", \"Bangka Tengah\", \"Belitung\", \"Belitung Timur\", \"Kota Pangkalpinang\"],\r\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\"],\r\n    \"Banten\": [\"Lebak\", \"Pandeglang\", \"Serang\", \"Tangerang\", \"Kota Cilegon\", \"Kota Serang\", \"Kota Tangerang\", \"Kota Tangerang Selatan\"],\r\n    \"DKI Jakarta\": [\"Kepulauan Seribu\", \"Kota Jakarta Barat\", \"Kota Jakarta Pusat\", \"Kota Jakarta Selatan\", \"Kota Jakarta Timur\", \"Kota Jakarta Utara\"],\r\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\"],\r\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\"],\r\n    \"DI Yogyakarta\": [\"Bantul\", \"Gunungkidul\", \"Kulon Progo\", \"Sleman\", \"Kota Yogyakarta\"],\r\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\"],\r\n    \"Bali\": [\"Badung\", \"Bangli\", \"Buleleng\", \"Gianyar\", \"Jembrana\", \"Karangasem\", \"Klungkung\", \"Tabanan\", \"Kota Denpasar\"],\r\n    \"Nusa Tenggara Barat\": [\"Bima\", \"Dompu\", \"Lombok Barat\", \"Lombok Tengah\", \"Lombok Timur\", \"Lombok Utara\", \"Sumbawa\", \"Sumbawa Barat\", \"Kota Bima\", \"Kota Mataram\"],\r\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\"],\r\n    \"Kalimantan Barat\": [\"Bengkayang\", \"Kapuas Hulu\", \"Kayong Utara\", \"Ketapang\", \"Kubu Raya\", \"Landak\", \"Melawi\", \"Mempawah\", \"Sambas\", \"Sanggau\", \"Sekadau\", \"Sintang\", \"Kota Pontianak\", \"Kota Singkawang\"],\r\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\"],\r\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\"],\r\n    \"Kalimantan Timur\": [\"Berau\", \"Kutai Barat\", \"Kutai Kartanegara\", \"Kutai Timur\", \"Mahakam Ulu\", \"Paser\", \"Penajam Paser Utara\", \"Kota Balikpapan\", \"Kota Bontang\", \"Kota Samarinda\"],\r\n    \"Kalimantan Utara\": [\"Bulungan\", \"Malinau\", \"Nunukan\", \"Tana Tidung\", \"Kota Tarakan\"],\r\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\"],\r\n    \"Gorontalo\": [\"Boalemo\", \"Bone Bolango\", \"Gorontalo\", \"Gorontalo Utara\", \"Pohuwato\", \"Kota Gorontalo\"],\r\n    \"Sulawesi Tengah\": [\"Banggai\", \"Banggai Kepulauan\", \"Banggai Laut\", \"Buol\", \"Donggala\", \"Morowali\", \"Morowali Utara\", \"Parigi Moutong\", \"Poso\", \"Sigi\", \"Tojo Una-Una\", \"Toli-Toli\", \"Kota Palu\"],\r\n    \"Sulawesi Barat\": [\"Majene\", \"Mamasa\", \"Mamuju\", \"Mamuju Tengah\", \"Pasangkayu\", \"Polewali Mandar\"],\r\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\"],\r\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\"],\r\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\"],\r\n    \"Maluku Utara\": [\"Halmahera Barat\", \"Halmahera Tengah\", \"Halmahera Timur\", \"Halmahera Selatan\", \"Halmahera Utara\", \"Kepulauan Sula\", \"Pulau Morotai\", \"Pulau Taliabu\", \"Kota Ternate\", \"Kota Tidore Kepulauan\"],\r\n    \"Papua Barat\": [\"Fakfak\", \"Kaimana\", \"Manokwari\", \"Manokwari Selatan\", \"Maybrat\", \"Pegunungan Arfak\", \"Raja Ampat\", \"Sorong\", \"Sorong Selatan\", \"Tambrauw\", \"Teluk Bintuni\", \"Teluk Wondama\", \"Kota Sorong\"],\r\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\"],\r\n    \"Papua Tengah\": [\"Nabire\", \"Puncak Jaya\", \"Paniai\", \"Mimika\", \"Puncak\", \"Dogiyai\", \"Intan Jaya\", \"Deiyai\"],\r\n    \"Papua Pegunungan\": [\"Jayawijaya\", \"Lanny Jaya\", \"Mamberamo Tengah\", \"Nduga\", \"Pegunungan Bintang\", \"Tolikara\", \"Yahukimo\", \"Yalimo\"],\r\n    \"Papua Selatan\": [\"Merauke\", \"Mappi\", \"Asmat\", \"Boven Digoel\"],\r\n    \"Papua Barat Daya\": [\"Sorong\", \"Sorong Selatan\", \"Raja Ampat\", \"Tambrauw\", \"Maybrat\", \"Kota Sorong\"]\r\n};\r\n\r\n\/\/ ========== API FETCH ==========\r\nasync function apiFetch(url, options = {}) {\r\n    const res = await fetch(url, { ...options, credentials: 'omit' });\r\n    if (res.status === 401 || res.status === 403) throw new Error(getText('loginError'));\r\n    if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n    return res.json();\r\n}\r\n\r\n\/\/ ========== FUNGSI REFRESH UKURAN PETA ==========\r\nfunction refreshMapSize() {\r\n    setTimeout(() => {\r\n        if (map) map.invalidateSize();\r\n        if (miniMap) miniMap.invalidateSize();\r\n    }, 100);\r\n}\r\n\r\n\/\/ ========== RENDER DAFTAR KONTRIBUTOR (TERBANYAK) ==========\r\nfunction renderContributorStats(data) {\r\n    const container = document.getElementById('contributorList');\r\n    if (!container) return;\r\n    \/\/ Hitung frekuensi contributor\r\n    const freq = {};\r\n    data.forEach(item => {\r\n        let contr = item.contributor || 'Anonymous';\r\n        if (contr === '') contr = 'Anonymous';\r\n        freq[contr] = (freq[contr] || 0) + 1;\r\n    });\r\n    \/\/ Urutkan descending\r\n    const sorted = Object.entries(freq).sort((a,b) => b[1] - a[1]);\r\n    if (sorted.length === 0) {\r\n        container.innerHTML = '<span style=\"color:#888;\">Belum ada data<\/span>';\r\n        return;\r\n    }\r\n    \/\/ Buat HTML\r\n    let html = '';\r\n    sorted.forEach(([name, count]) => {\r\n        html += `<div class=\"contributor-item\"><span class=\"contributor-name\">${escapeHtml(name)}<\/span><span class=\"contributor-count\">${count}<\/span><\/div>`;\r\n    });\r\n    container.innerHTML = html;\r\n}\r\n\r\nfunction escapeHtml(str) {\r\n    return str.replace(\/[&<>]\/g, function(m) {\r\n        if (m === '&') return '&amp;';\r\n        if (m === '<') return '&lt;';\r\n        if (m === '>') return '&gt;';\r\n        return m;\r\n    });\r\n}\r\n\r\n\/\/ ========== LOAD DATA & MAP ==========\r\nasync function loadData() {\r\n    try {\r\n        const data = await apiFetch(getDataEndpoint);\r\n        allData = data;\r\n        filteredAllData = [...allData];\r\n        const provinces = [...new Set(allData.map(d => d.province).filter(p => p))];\r\n        const districts = [...new Set(allData.map(d => d.district).filter(d => d))];\r\n        document.getElementById('filterProvince').innerHTML = '<option value=\"\">Semua Provinsi<\/option>' + provinces.sort().map(p => `<option value=\"${p}\">${p}<\/option>`).join('');\r\n        document.getElementById('filterDistrict').innerHTML = '<option value=\"\">Semua Kab\/Kota<\/option>' + districts.sort().map(d => `<option value=\"${d}\">${d}<\/option>`).join('');\r\n        filterData();\r\n        const example = allData.find(d => d.left_photo_url);\r\n        document.getElementById('exampleContent').innerHTML = example ? `<img decoding=\"async\" src=\"${example.left_photo_url}\" class=\"example-img\"><br><small>${getText('id')}: ${example.turtle_id}<\/small>` : `<span>${getText('noExample')}<\/span>`;\r\n        \/\/ Tampilkan daftar kontributor\r\n        renderContributorStats(allData);\r\n        refreshMapSize();\r\n    } catch (err) { console.error(err); document.getElementById('exampleContent').innerHTML = `<span style=\"color:red;\">${err.message}<\/span>`; }\r\n}\r\nfunction filterData() {\r\n    const province = document.getElementById('filterProvince').value;\r\n    const district = document.getElementById('filterDistrict').value;\r\n    const search = document.getElementById('searchInput').value.toLowerCase();\r\n    const sex = document.getElementById('filterSex').value;\r\n    const minCCL = parseFloat(document.getElementById('filterMinCCL').value);\r\n    filteredAllData = allData.filter(item => {\r\n        if (province && item.province !== province) return false;\r\n        if (district && item.district !== district) return false;\r\n        if (search && !Object.values(item).join(' ').toLowerCase().includes(search)) return false;\r\n        if (sex && item.sex !== sex) return false;\r\n        if (!isNaN(minCCL) && (parseFloat(item.ccl) || 0) < minCCL) return false;\r\n        return true;\r\n    });\r\n    updateMapMarkers(filteredAllData);\r\n    refreshMapSize();\r\n}\r\nfunction updateMapMarkers(data) {\r\n    if (!map) return;\r\n    if (markersCluster) map.removeLayer(markersCluster);\r\n    markersCluster = L.markerClusterGroup({ chunkedLoading: true });\r\n    const nameMap = new Map(); allData.forEach(i => { if(i.turtle_id && i.turtle_name) nameMap.set(i.turtle_id, i.turtle_name); });\r\n    data.forEach(item => {\r\n        const lat = parseFloat(item.latitude), lng = parseFloat(item.longitude);\r\n        if (isNaN(lat) || isNaN(lng)) return;\r\n        let displayName = nameMap.get(item.turtle_id) || item.turtle_name || 'Penyu';\r\n        let contributorText = item.contributor ? `Kontributor: ${item.contributor}` : 'Kontributor: -';\r\n        L.marker([lat, lng]).bindPopup(`<b>${displayName}<\/b><br><img decoding=\"async\" src=\"${item.left_photo_url}\" style=\"max-width:100px;\"><br>ID: ${item.turtle_id}<br>Tanggal: ${item.survey_date}<br>Spesies: ${item.species}<br>${contributorText}`).addTo(markersCluster);\r\n    });\r\n    map.addLayer(markersCluster);\r\n    if(data.length){ \r\n        let bounds = L.featureGroup(data.map(d=>L.marker([d.latitude,d.longitude]))).getBounds(); \r\n        if(bounds.isValid()) map.fitBounds(bounds); \r\n    } else map.setView([-2.5,118],5);\r\n    refreshMapSize();\r\n}\r\nfunction initMapMain(){ \r\n    map = L.map('map').setView([-2.5,118],5); \r\n    L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}', { attribution: 'Tiles &copy; Esri' }).addTo(map); \r\n    markersCluster = L.markerClusterGroup(); \r\n    map.addLayer(markersCluster);\r\n    refreshMapSize();\r\n    window.addEventListener('resize', () => refreshMapSize());\r\n    document.addEventListener('visibilitychange', () => { if(!document.hidden) refreshMapSize(); });\r\n}\r\n\r\n\/\/ ========== MINI MAP & REGIONS ==========\r\nfunction initMiniMap(){\r\n    miniMap = L.map('miniMap').setView([-2.5,118],5);\r\n    L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}', { attribution: 'Tiles &copy; Esri' }).addTo(miniMap);\r\n    miniMarker = null;\r\n    miniMap.on('click', e => { let lat=e.latlng.lat.toFixed(6), lng=e.latlng.lng.toFixed(6); document.getElementById('latitude').value=lat; document.getElementById('longitude').value=lng; if(miniMarker) miniMap.removeLayer(miniMarker); miniMarker = L.marker([lat,lng]).addTo(miniMap); miniMap.setView([lat,lng],10); fillFromCoordinates(lat,lng); refreshMapSize(); });\r\n    const latI=document.getElementById('latitude'), lngI=document.getElementById('longitude');\r\n    latI.addEventListener('input',()=>updateMiniMarker()); lngI.addEventListener('input',()=>updateMiniMarker());\r\n    function updateMiniMarker(){ let lat=parseFloat(latI.value), lng=parseFloat(lngI.value); if(!isNaN(lat)&&!isNaN(lng)){ if(miniMarker) miniMap.removeLayer(miniMarker); miniMarker = L.marker([lat,lng]).addTo(miniMap); miniMap.setView([lat,lng],10); fillFromCoordinates(lat,lng); refreshMapSize(); } }\r\n    refreshMapSize();\r\n}\r\nasync function fillFromCoordinates(lat,lng){\r\n    try{ let res=await fetch(`https:\/\/api.bigdatacloud.net\/data\/reverse-geocode-client?latitude=${lat}&longitude=${lng}&localityLanguage=id&radius=10000`); let data=await res.json(); let province='', city=''; data.localityInfo.administrative.forEach(a=>{ if(a.adminLevel===4) province=a.name; if(a.adminLevel===6) city=a.name; }); let provSelect=document.getElementById('provinceSelect'); for(let i=0;i<provSelect.options.length;i++) if(provSelect.options[i].text===province){ provSelect.value=provSelect.options[i].value; provSelect.dispatchEvent(new Event('change')); setTimeout(()=>{ let distSelect=document.getElementById('districtSelect'); for(let j=0;j<distSelect.options.length;j++) if(distSelect.options[j].text===city) distSelect.value=distSelect.options[j].value; refreshMapSize(); },300); break; } }catch(e){console.error(e);} }\r\nfunction initRegionDropdowns(){ \r\n    let provSelect = document.getElementById('provinceSelect');\r\n    let distSelect = document.getElementById('districtSelect');\r\n    provSelect.innerHTML = '<option value=\"\">Pilih Provinsi<\/option>';\r\n    Object.keys(indonesiaRegions).sort().forEach(prov => {\r\n        let opt = document.createElement('option');\r\n        opt.value = prov;\r\n        opt.textContent = prov;\r\n        provSelect.appendChild(opt);\r\n    });\r\n    provSelect.addEventListener('change', function() {\r\n        let selected = this.value;\r\n        distSelect.innerHTML = '<option value=\"\">Pilih Kab\/Kota<\/option>';\r\n        if (selected && indonesiaRegions[selected]) {\r\n            indonesiaRegions[selected].sort().forEach(city => {\r\n                let opt = document.createElement('option');\r\n                opt.value = city;\r\n                opt.textContent = city;\r\n                distSelect.appendChild(opt);\r\n            });\r\n        }\r\n        refreshMapSize();\r\n    });\r\n}\r\n\r\n\/\/ ========== SUGESTI LOKASI ==========\r\nfunction populateLastLocation(turtle_id) {\r\n    const records = allData.filter(item => item.turtle_id === turtle_id);\r\n    if (records.length === 0) return;\r\n    records.sort((a,b) => (b.survey_date || '').localeCompare(a.survey_date || ''));\r\n    const last = records[0];\r\n    if (!last.latitude || !last.longitude) return;\r\n    document.getElementById('locationName').value = last.location_name || '';\r\n    document.getElementById('latitude').value = last.latitude;\r\n    document.getElementById('longitude').value = last.longitude;\r\n    if (miniMarker) miniMap.removeLayer(miniMarker);\r\n    miniMarker = L.marker([last.latitude, last.longitude]).addTo(miniMap);\r\n    miniMap.setView([last.latitude, last.longitude], 10);\r\n    const provSelect = document.getElementById('provinceSelect');\r\n    let provFound = false;\r\n    for (let i=0; i<provSelect.options.length; i++) {\r\n        if (provSelect.options[i].value === last.province || provSelect.options[i].text === last.province) {\r\n            provSelect.value = provSelect.options[i].value;\r\n            provFound = true;\r\n            break;\r\n        }\r\n    }\r\n    if (provFound) {\r\n        provSelect.dispatchEvent(new Event('change'));\r\n        setTimeout(() => {\r\n            const distSelect = document.getElementById('districtSelect');\r\n            for (let i=0; i<distSelect.options.length; i++) {\r\n                if (distSelect.options[i].value === last.district || distSelect.options[i].text === last.district) {\r\n                    distSelect.value = distSelect.options[i].value;\r\n                    break;\r\n                }\r\n            }\r\n            refreshMapSize();\r\n        }, 300);\r\n    }\r\n    const suggestionBox = document.getElementById('suggestionBox');\r\n    const locText = last.location_name || `${last.latitude}, ${last.longitude}`;\r\n    const dateText = last.survey_date || '';\r\n    suggestionBox.style.display = 'block';\r\n    suggestionBox.innerHTML = getText('previousLocationSuggestion').replace('{loc}', locText).replace('{date}', dateText);\r\n    refreshMapSize();\r\n}\r\n\r\n\/\/ ========== CROP & ANALISIS ==========\r\nlet cropper;\r\nlet isProcessing = false;\r\nlet cropperReady = false;\r\n\r\nconst modalHTML = `<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;\"><div style=\"background:#fff;padding:20px;border-radius:10px;width:90%;max-width:800px;\"><div style=\"display:flex;justify-content:space-between;\"><h3>Crop Foto<\/h3><button id=\"closeCropModal\" style=\"background:none;border:none;font-size:24px;cursor:pointer;\">&times;<\/button><\/div><div style=\"margin:20px 0;\"><img decoding=\"async\" id=\"cropImage\" src=\"\" style=\"max-width:100%;max-height:70vh;\"><\/div><div style=\"display:flex;justify-content:flex-end;gap:10px;\"><button id=\"cropButton\" class=\"btn\">Crop<\/button><button id=\"cancelCrop\" style=\"background:#6c757d;color:white;border:none;padding:8px 15px;\">Batal<\/button><\/div><\/div><\/div>`;\r\ndocument.body.insertAdjacentHTML('beforeend',modalHTML);\r\nconst cropModal = document.getElementById('cropModal');\r\nconst cropImage = document.getElementById('cropImage');\r\nconst cropBtn = document.getElementById('cropButton');\r\nconst closeCrop = document.getElementById('closeCropModal');\r\nconst cancelCrop = document.getElementById('cancelCrop');\r\n\r\nfunction showCropModal() { cropModal.style.display = 'flex'; refreshMapSize(); }\r\nfunction hideCropModal() { cropModal.style.display = 'none'; if (cropper) { cropper.destroy(); cropper = null; cropperReady = false; } refreshMapSize(); }\r\ncloseCrop.addEventListener('click', hideCropModal);\r\ncancelCrop.addEventListener('click', hideCropModal);\r\n\r\nfunction compressImage(file, quality = 0.85) {\r\n    return new Promise((resolve, reject) => {\r\n        const reader = new FileReader();\r\n        reader.onload = (e) => {\r\n            const img = new Image();\r\n            img.onload = () => {\r\n                const canvas = document.createElement('canvas');\r\n                canvas.width = img.width;\r\n                canvas.height = img.height;\r\n                canvas.getContext('2d').drawImage(img, 0, 0);\r\n                canvas.toBlob((blob) => {\r\n                    if (!blob) reject(new Error('Gagal kompresi'));\r\n                    else resolve(new File([blob], file.name, { type: 'image\/jpeg' }));\r\n                }, 'image\/jpeg', quality);\r\n            };\r\n            img.onerror = reject;\r\n            img.src = e.target.result;\r\n        };\r\n        reader.onerror = reject;\r\n        reader.readAsDataURL(file);\r\n    });\r\n}\r\n\r\nasync function handleCroppedFile(blob) {\r\n    if (isProcessing) return;\r\n    isProcessing = true;\r\n    try {\r\n        const file = new File([blob], 'cropped.jpg', { type: 'image\/jpeg' });\r\n        const compressed = await compressImage(file, 0.85);\r\n        const reader = new FileReader();\r\n        reader.onload = (e) => {\r\n            currentPhotoBase64 = e.target.result;\r\n            analyzePhoto(currentPhotoBase64);\r\n            isProcessing = false;\r\n        };\r\n        reader.readAsDataURL(compressed);\r\n    } catch (err) {\r\n        console.error('Error handleCroppedFile:', err);\r\n        showAnalysisResult(getText('processError') + err.message, 'error');\r\n        isProcessing = false;\r\n    }\r\n}\r\n\r\nasync function analyzePhoto(base64) {\r\n    const resultDiv = document.getElementById('analysisResult');\r\n    resultDiv.style.display = 'block';\r\n    resultDiv.innerHTML = `<p>${getText('analyzing')}<span class=\"loading\"><\/span><\/p>`;\r\n    try {\r\n        const formData = new FormData();\r\n        formData.append('left_photo_base64', base64);\r\n        formData.append('species', '');\r\n        formData.append('survey_date', '');\r\n        const result = await apiFetch(analyzeEndpoint, { method: 'POST', body: formData });\r\n        if (result.status === 'match') {\r\n            const match = result.matchData;\r\n            currentMatch = { id: match.id, name: match.name, species: match.species, left_photo_url: match.left_photo_url, confidence: Math.round(match.confidence * 100) };\r\n            isNewIndividual = false;\r\n            resultDiv.innerHTML = `<div><span style=\"background:#2e7d32;color:white;padding:4px12px;border-radius:20px;\">${getText('matchFound')}<\/span><\/div><p><strong>${getText('similarity')}:<\/strong> ${currentMatch.confidence}%<\/p><p><strong>${getText('id')}:<\/strong> ${match.id}<\/p><p><strong>${getText('name')}:<\/strong> ${match.name||'-'}<\/p><p><strong>${getText('species')}:<\/strong> ${match.species||'-'}<\/p><div class=\"comparison\"><div><strong>${getText('photoUpload')}<\/strong><br><img decoding=\"async\" src=\"${base64}\"><\/div><div><strong>${getText('photoDB')}<\/strong><br>${match.left_photo_url?`<img decoding=\"async\" src=\"${match.left_photo_url}\">`:`<p>${getText('photoNotAvailable')}<\/p>`}<\/div><\/div>`;\r\n            showDataForm();\r\n            document.getElementById('speciesSelect').value = match.species || '';\r\n            document.getElementById('newNameGroup').style.display = 'none';\r\n            document.getElementById('matchInfo').style.display = 'block';\r\n            document.getElementById('matchInfo').innerHTML = getText('matchInfoText').replace('{name}', match.name||'-').replace('{id}', match.id).replace('{conf}', currentMatch.confidence);\r\n            populateLastLocation(match.id);\r\n        } else if (result.status === 'new') {\r\n            currentMatch = null;\r\n            isNewIndividual = true;\r\n            suggestedSpecies = result.suggested_species || (result.feature_data?.suggested_species) || 'Chelonia mydas';\r\n            currentTempId = result.temp_id || result.feature_data?.temp_id || null;\r\n            resultDiv.innerHTML = `<div><span style=\"background:#0284c7;color:white;padding:4px12px;border-radius:20px;\">${getText('newIndividual')}<\/span><\/div><p>${getText('suggestedSpecies')}<strong>${suggestedSpecies}<\/strong><\/p><div><strong>${getText('photoUpload')}<\/strong><br><img decoding=\"async\" src=\"${base64}\" style=\"max-width:150px;\"><\/div>`;\r\n            showDataForm();\r\n            document.getElementById('speciesSelect').value = suggestedSpecies;\r\n            document.getElementById('newNameGroup').style.display = 'block';\r\n            document.getElementById('matchInfo').style.display = 'none';\r\n            document.getElementById('suggestionBox').style.display = 'none';\r\n        } else {\r\n            resultDiv.innerHTML = `<p>${getText('errorMsg')}${result.message||''}<\/p>`;\r\n        }\r\n    } catch (err) {\r\n        resultDiv.innerHTML = `<p>${err.message}<\/p>`;\r\n    }\r\n}\r\nfunction showDataForm(){\r\n    document.getElementById('dataForm').classList.remove('hidden-form');\r\n    if(!document.getElementById('surveyDate').value) document.getElementById('surveyDate').value = new Date().toISOString().slice(0,10);\r\n    refreshMapSize();\r\n}\r\n\r\n\/\/ ========== SIMPAN DATA ==========\r\nasync function saveData(){\r\n    const lat=document.getElementById('latitude').value, lng=document.getElementById('longitude').value;\r\n    const province=document.getElementById('provinceSelect').value, district=document.getElementById('districtSelect').value;\r\n    const locationName=document.getElementById('locationName').value, surveyDate=document.getElementById('surveyDate').value;\r\n    const species=document.getElementById('speciesSelect').value;\r\n    let contributor = document.getElementById('contributorName').value.trim();\r\n    if(contributor === '') contributor = 'Anonymous';\r\n    if(!surveyDate||!lat||!lng||!species){ alert('Harap isi semua field wajib (tanggal, koordinat, spesies)'); return; }\r\n    let turtleName='';\r\n    if(isNewIndividual){ const inp=document.getElementById('newTurtleName'); if(inp) turtleName=inp.value.trim(); }\r\n    const fd=new FormData();\r\n    fd.append('left_photo_base64',currentPhotoBase64);\r\n    fd.append('species',species);\r\n    fd.append('survey_date',surveyDate);\r\n    fd.append('contributor',contributor);\r\n    fd.append('latitude',lat);\r\n    fd.append('longitude',lng);\r\n    fd.append('province',province);\r\n    fd.append('district',district);\r\n    fd.append('location_name',locationName);\r\n    if(!isNewIndividual && currentMatch){\r\n        fd.append('individual_id',currentMatch.id);\r\n    } else {\r\n        if(currentTempId) fd.append('temp_id',currentTempId);\r\n        if(turtleName) fd.append('turtle_name',turtleName);\r\n    }\r\n    fd.append('survey_time',''); fd.append('ccl',''); fd.append('ccw',''); fd.append('sex','');\r\n    fd.append('depth',''); fd.append('behaviour',''); fd.append('health',''); fd.append('health_notes','');\r\n    fd.append('surveyor',''); fd.append('institution','');\r\n\r\n    const statusDiv=document.getElementById('saveStatus');\r\n    statusDiv.style.display='block';\r\n    statusDiv.innerHTML=`<p>${getText('saving')}<span class=\"loading\"><\/span><\/p>`;\r\n    try{\r\n        const result=await apiFetch(saveEndpoint,{method:'POST',body:fd});\r\n        if(result.success){\r\n            statusDiv.innerHTML=`<p style=\"color:green;\">${getText('saveSuccess')}<\/p>`;\r\n            document.getElementById('dataForm').classList.add('hidden-form');\r\n            document.getElementById('analysisResult').style.display='none';\r\n            document.getElementById('leftPhotoInput').value='';\r\n            currentPhotoBase64=null; currentMatch=null; currentTempId=null;\r\n            await loadData();\r\n            refreshMapSize();\r\n            setTimeout(()=>{statusDiv.style.display='none';},3000);\r\n        } else {\r\n            statusDiv.innerHTML=`<p style=\"color:red;\">${getText('saveError')}${result.message||''}<\/p>`;\r\n        }\r\n    } catch(err){\r\n        statusDiv.innerHTML=`<p style=\"color:red;\">${err.message}<\/p>`;\r\n    }\r\n}\r\n\r\n\/\/ ========== EVENT & INIT ==========\r\ndocument.getElementById('submitDataBtn').addEventListener('click',saveData);\r\nconst leftInput=document.getElementById('leftPhotoInput'), uploadBtn=document.getElementById('uploadBtn'), uploadArea=document.getElementById('uploadArea');\r\n\r\nuploadBtn.addEventListener('click', (e) => {\r\n    e.stopPropagation();\r\n    leftInput.click();\r\n});\r\n\r\nuploadArea.addEventListener('click', (e) => {\r\n    if (e.target === uploadBtn || uploadBtn.contains(e.target)) return;\r\n    leftInput.click();\r\n});\r\n\r\nleftInput.addEventListener('change', function(e) {\r\n    const file = this.files[0];\r\n    if (!file) return;\r\n    if (cropper) {\r\n        cropper.destroy();\r\n        cropper = null;\r\n    }\r\n    cropperReady = false;\r\n    cropImage.src = '';\r\n    const reader = new FileReader();\r\n    reader.onload = function(event) {\r\n        cropImage.src = event.target.result;\r\n        cropImage.onload = () => {\r\n            showCropModal();\r\n            setTimeout(() => {\r\n                try {\r\n                    cropper = new Cropper(cropImage, {\r\n                        aspectRatio: NaN,\r\n                        viewMode: 1,\r\n                        autoCropArea: 1,\r\n                        responsive: true,\r\n                        checkOrientation: false\r\n                    });\r\n                    cropperReady = true;\r\n                } catch (err) {\r\n                    console.error('Cropper init error:', err);\r\n                    alert('Gagal memuat editor crop. Silakan coba lagi.');\r\n                    hideCropModal();\r\n                }\r\n            }, 150);\r\n        };\r\n        cropImage.onerror = () => {\r\n            alert('Gagal memuat gambar. Coba file lain.');\r\n            hideCropModal();\r\n        };\r\n    };\r\n    reader.readAsDataURL(file);\r\n});\r\n\r\ncropBtn.addEventListener('click', () => {\r\n    if (!cropperReady || !cropper) {\r\n        alert('Mohon tunggu sebentar, editor crop masih bersiap.');\r\n        return;\r\n    }\r\n    const canvas = cropper.getCroppedCanvas();\r\n    if (!canvas) {\r\n        alert('Gagal memotong gambar, coba lagi.');\r\n        return;\r\n    }\r\n    canvas.toBlob(blob => {\r\n        hideCropModal();\r\n        handleCroppedFile(blob);\r\n        refreshMapSize();\r\n    }, 'image\/jpeg');\r\n});\r\n\r\nuploadArea.addEventListener('dragover',e=>{e.preventDefault();uploadArea.style.borderColor='#0284c7';});\r\nuploadArea.addEventListener('dragleave',e=>{e.preventDefault();uploadArea.style.borderColor='#ccc';});\r\nuploadArea.addEventListener('drop',e=>{\r\n    e.preventDefault();\r\n    uploadArea.style.borderColor='#ccc';\r\n    const file=e.dataTransfer.files[0];\r\n    if(file&&file.type.startsWith('image\/')){\r\n        leftInput.files=e.dataTransfer.files;\r\n        leftInput.dispatchEvent(new Event('change',{bubbles:true}));\r\n    } else alert('Harap unggah file gambar.');\r\n});\r\n\r\ndocument.getElementById('applyFilter').addEventListener('click',filterData);\r\ndocument.getElementById('searchInput').addEventListener('keyup',e=>{if(e.key==='Enter')filterData();});\r\ndocument.getElementById('filterProvince').addEventListener('change',filterData);\r\ndocument.getElementById('filterDistrict').addEventListener('change',filterData);\r\ndocument.getElementById('filterSex').addEventListener('change',filterData);\r\ndocument.getElementById('filterMinCCL').addEventListener('keyup',e=>{if(e.key==='Enter')filterData();});\r\ndocument.getElementById('languageSelect').addEventListener('change',e=>{currentLang=e.target.value;updateUI();updateMapMarkers(filteredAllData);renderContributorStats(allData);refreshMapSize();});\r\n\r\nfunction updateUI(){\r\n    const t=translations[currentLang];\r\n    document.getElementById('titleText').innerText=t.title;\r\n    document.getElementById('uploadTitle').innerHTML=t.uploadTitle;\r\n    document.getElementById('uploadDesc').innerHTML=t.uploadDesc;\r\n    document.getElementById('dragText').innerHTML=t.dragText;\r\n    document.getElementById('uploadBtn').innerHTML=t.uploadBtn;\r\n    document.getElementById('exampleLabel').innerHTML=t.exampleLabel;\r\n    document.getElementById('footerText').innerHTML=t.footer;\r\n    document.getElementById('formTitle').innerHTML=t.formTitle;\r\n    document.getElementById('speciesLabel').innerHTML=t.speciesLabel;\r\n    document.getElementById('locNameLabel').innerHTML=t.locNameLabel;\r\n    document.getElementById('coordinateLabel').innerHTML=t.coordinateLabel;\r\n    document.getElementById('provinceLabel').innerHTML=t.provinceLabel;\r\n    document.getElementById('districtLabel').innerHTML=t.districtLabel;\r\n    document.getElementById('dateLabel').innerHTML=t.dateLabel;\r\n    document.getElementById('contributorLabel').innerHTML=t.contributorLabel;\r\n    document.getElementById('newNameLabel').innerHTML=t.newNameLabel;\r\n    document.getElementById('submitDataBtn').innerHTML=t.submitBtn;\r\n    document.getElementById('contributorTitle').innerHTML = t.contributorTitle;\r\n    refreshMapSize();\r\n}\r\n\r\ninitMapMain();\r\ninitMiniMap();\r\ninitRegionDropdowns();\r\nloadData();\r\nupdateUI();\r\n<\/script>\r\n<\/body>\r\n<\/html>\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>e-Turtle Indonesia \u2013 Upload &#038; Isi Data Penyu \ud83d\udc22 e-Turtle Indonesia \ud83c\uddee\ud83c\udde9 Indonesia\ud83c\uddec\ud83c\udde7 English Semua Provinsi Semua Kab\/Kota Semua KelaminJantanBetina [&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-1968","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>Find Your Turtle! - 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\/find-your-turtle\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Find Your Turtle!\" \/>\n<meta property=\"og:description\" content=\"e-Turtle Indonesia \u2013 Upload &#038; Isi Data Penyu \ud83d\udc22 e-Turtle Indonesia \ud83c\uddee\ud83c\udde9 Indonesia\ud83c\uddec\ud83c\udde7 English Semua Provinsi Semua Kab\/Kota Semua KelaminJantanBetina [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marineconservation.id\/id\/find-your-turtle\/\" \/>\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-04-04T15:07:55+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimasi waktu membaca\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/marineconservation.id\/find-your-turtle\/\",\"url\":\"https:\/\/marineconservation.id\/find-your-turtle\/\",\"name\":\"Find Your Turtle! - marineconservation.id\",\"isPartOf\":{\"@id\":\"https:\/\/marineconservation.id\/#website\"},\"datePublished\":\"2026-03-30T07:15:32+00:00\",\"dateModified\":\"2026-04-04T15:07:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/marineconservation.id\/find-your-turtle\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/marineconservation.id\/find-your-turtle\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/marineconservation.id\/find-your-turtle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/marineconservation.id\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Find Your Turtle!\"}]},{\"@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":"Find Your Turtle! - 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\/find-your-turtle\/","og_locale":"id_ID","og_type":"article","og_title":"Find Your Turtle!","og_description":"e-Turtle Indonesia \u2013 Upload &#038; Isi Data Penyu \ud83d\udc22 e-Turtle Indonesia \ud83c\uddee\ud83c\udde9 Indonesia\ud83c\uddec\ud83c\udde7 English Semua Provinsi Semua Kab\/Kota Semua KelaminJantanBetina [&hellip;]","og_url":"https:\/\/marineconservation.id\/id\/find-your-turtle\/","og_site_name":"marineconservation.id","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61572311944591","article_modified_time":"2026-04-04T15:07:55+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimasi waktu membaca":"1 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/marineconservation.id\/find-your-turtle\/","url":"https:\/\/marineconservation.id\/find-your-turtle\/","name":"Find Your Turtle! - marineconservation.id","isPartOf":{"@id":"https:\/\/marineconservation.id\/#website"},"datePublished":"2026-03-30T07:15:32+00:00","dateModified":"2026-04-04T15:07:55+00:00","breadcrumb":{"@id":"https:\/\/marineconservation.id\/find-your-turtle\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marineconservation.id\/find-your-turtle\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/marineconservation.id\/find-your-turtle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marineconservation.id\/"},{"@type":"ListItem","position":2,"name":"Find Your Turtle!"}]},{"@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\/1968","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=1968"}],"version-history":[{"count":70,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1968\/revisions"}],"predecessor-version":[{"id":2246,"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/pages\/1968\/revisions\/2246"}],"wp:attachment":[{"href":"https:\/\/marineconservation.id\/id\/wp-json\/wp\/v2\/media?parent=1968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}