| <!DOCTYPE html> |
| <html lang="th"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>ผู้ช่วยหาเสียงดิจิทัล (AI Powered) - ธนอนันต์ เมนะสวัสดิ์</title> |
| |
| <script src="https://cdn.tailwindcss.com"></script> |
| |
| <link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@300;400;500;700&display=swap" rel="stylesheet"> |
| |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| |
| <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> |
| |
| <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/> |
| <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script> |
| |
| <script> |
| tailwind.config = { |
| theme: { |
| extend: { |
| colors: { |
| kla: { |
| main: '#15803d', |
| light: '#22c55e', |
| gold: '#FBBF24', |
| yellow: '#F59E0B', |
| dark: '#052e16', |
| } |
| }, |
| fontFamily: { |
| sans: ['Sarabun', 'sans-serif'], |
| } |
| } |
| } |
| } |
| </script> |
| <style> |
| body { font-family: 'Sarabun', sans-serif; } |
| .animate-fade-in { animation: fadeIn 0.5s ease-in-out; } |
| @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } |
| |
| |
| .chat-scroll::-webkit-scrollbar { width: 6px; } |
| .chat-scroll::-webkit-scrollbar-track { background: #f0fdf4; } |
| .chat-scroll::-webkit-scrollbar-thumb { background: #15803d; border-radius: 10px; } |
| .chat-scroll::-webkit-scrollbar-thumb:hover { background: #166534; } |
| |
| |
| .bg-pattern { |
| background-image: radial-gradient(#FBBF24 1px, transparent 1px); |
| background-size: 20px 20px; |
| } |
| |
| |
| .typing-indicator span { |
| animation: blink 1.4s infinite both; |
| height: 5px; |
| width: 5px; |
| background-color: #15803d; |
| border-radius: 50%; |
| display: inline-block; |
| margin: 0 1px; |
| } |
| .typing-indicator span:nth-child(2) { animation-delay: 0.2s; } |
| .typing-indicator span:nth-child(3) { animation-delay: 0.4s; } |
| @keyframes blink { 0% { opacity: 0.1; } 20% { opacity: 1; } 100% { opacity: 0.1; } } |
| |
| |
| .audio-wave span { |
| display: inline-block; |
| width: 3px; |
| height: 10px; |
| background-color: white; |
| animation: wave 1s infinite ease-in-out; |
| margin: 0 1px; |
| } |
| .audio-wave span:nth-child(1) { animation-delay: 0.1s; } |
| .audio-wave span:nth-child(2) { animation-delay: 0.2s; } |
| .audio-wave span:nth-child(3) { animation-delay: 0.3s; } |
| .audio-wave span:nth-child(4) { animation-delay: 0.4s; } |
| @keyframes wave { |
| 0%, 100% { height: 5px; } |
| 50% { height: 15px; } |
| } |
| |
| |
| #map { |
| z-index: 1; |
| border-radius: 1.5rem; |
| box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); |
| } |
| .leaflet-popup-content-wrapper { |
| border-radius: 1rem; |
| padding: 0; |
| overflow: hidden; |
| } |
| .leaflet-popup-content { |
| margin: 0; |
| width: 280px !important; |
| } |
| .custom-div-icon { |
| background: transparent; |
| border: none; |
| } |
| .map-pin { |
| width: 40px; |
| height: 40px; |
| border-radius: 50% 50% 50% 0; |
| background: #15803d; |
| position: absolute; |
| transform: rotate(-45deg); |
| left: 50%; |
| top: 50%; |
| margin: -20px 0 0 -20px; |
| box-shadow: 2px 2px 4px rgba(0,0,0,0.3); |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| border: 3px solid white; |
| } |
| .map-pin i { |
| transform: rotate(45deg); |
| color: white; |
| font-size: 18px; |
| } |
| .map-pin.market { background: #F59E0B; } |
| .map-pin.temple { background: #d97706; } |
| .map-pin:hover { transform: rotate(-45deg) scale(1.1); transition: all 0.2s; } |
| </style> |
| </head> |
| <body class="bg-gray-50 text-gray-800 min-h-screen flex flex-col font-sans"> |
|
|
| |
| <div class="bg-white shadow-md p-3 flex justify-between items-center sticky top-0 z-50 md:hidden border-b-2 border-kla-main"> |
| <div class="font-bold text-lg text-kla-main flex items-center gap-2"> |
| <div class="w-10 h-10 rounded-full flex items-center justify-center overflow-hidden border-2 border-kla-gold bg-green-100"> |
| <img src="https://i.postimg.cc/tTWq33tF/ดาวน_โหลด.png" alt="ทนายโตโต้" class="w-full h-full object-cover object-top scale-110 translate-y-1"> |
| </div> |
| <div class="leading-none"> |
| <span class="block">ทนายโตโต้</span> |
| <span class="text-[10px] font-normal text-gray-500">เบอร์ 1 พรรคกล้าธรรม</span> |
| </div> |
| </div> |
| <button onclick="toggleMobileMenu()" class="text-kla-main focus:outline-none p-2 rounded-md hover:bg-green-50"> |
| <i class="fas fa-bars text-2xl"></i> |
| </button> |
| </div> |
|
|
| |
| <div id="mobile-menu" class="hidden fixed inset-0 bg-white z-40 pt-20 px-6 space-y-3 md:hidden animate-fade-in"> |
| <button onclick="switchTab('home'); toggleMobileMenu()" class="block w-full text-left py-4 px-4 rounded-xl font-bold text-white bg-gradient-to-r from-kla-main to-kla-light shadow-lg"> |
| <i class="fas fa-home mr-2"></i> หน้าหลัก (ประวัติ) |
| </button> |
| <button onclick="switchTab('policies'); toggleMobileMenu()" class="block w-full text-left py-4 px-4 rounded-xl font-medium text-kla-main bg-green-50 hover:bg-green-100 border border-green-100"> |
| <i class="fas fa-scroll mr-2"></i> นโยบายรายอำเภอ |
| </button> |
| <button onclick="switchTab('map'); toggleMobileMenu()" class="block w-full text-left py-4 px-4 rounded-xl font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 border border-blue-100"> |
| <i class="fas fa-map-marked-alt mr-2"></i> แผนที่ยุทธศาสตร์ |
| </button> |
| <button onclick="switchTab('fun'); toggleMobileMenu()" class="block w-full text-left py-4 px-4 rounded-xl font-medium text-purple-600 bg-purple-50 hover:bg-purple-100 border border-purple-100"> |
| <i class="fas fa-magic mr-2"></i> กิจกรรม AI |
| </button> |
| <button onclick="switchTab('chat'); toggleMobileMenu()" class="block w-full text-left py-4 px-4 rounded-xl font-medium text-kla-main bg-green-50 hover:bg-green-100 border border-green-100"> |
| <i class="fas fa-comments mr-2"></i> คุยกับน้องกล้า (AI) |
| </button> |
| <button onclick="switchTab('complaint'); toggleMobileMenu()" class="block w-full text-left py-4 px-4 rounded-xl font-medium text-red-600 bg-red-50 hover:bg-red-100 border border-red-100"> |
| <i class="fas fa-exclamation-triangle mr-2"></i> แจ้งเรื่องด่วน |
| </button> |
| </div> |
|
|
| |
| <div class="max-w-6xl mx-auto w-full md:py-10 flex flex-col md:flex-row gap-8 p-4 md:p-6 flex-1"> |
| |
| |
| <div class="hidden md:block w-72 flex-shrink-0 relative"> |
| <div class="bg-white rounded-3xl shadow-xl p-6 sticky top-10 border-t-4 border-kla-main"> |
| <div class="text-center mb-8 relative"> |
| <div class="w-32 h-32 mx-auto mb-4 flex items-center justify-center bg-white rounded-full p-2 shadow-sm border border-gray-100 relative z-10 overflow-hidden"> |
| |
| <img src="https://i.postimg.cc/Y9Yr66fh/image_removebg_preview.png" alt="โลโก้พรรคกล้าธรรม" class="w-full h-full object-contain"> |
| </div> |
| <h2 class="font-bold text-2xl text-kla-main leading-tight mt-2">ทนายโตโต้</h2> |
| <p class="text-sm text-gray-500 font-medium">ธนอนันต์ เมนะสวัสดิ์</p> |
| <div class="mt-3 inline-block bg-kla-gold/20 text-yellow-800 text-sm px-4 py-1 rounded-full font-bold border border-kla-gold"> |
| เบอร์ 1 ✅ เขต 6 |
| </div> |
| </div> |
|
|
| <nav class="space-y-3" id="desktop-nav"> |
| <button onclick="switchTab('home')" id="nav-home" class="w-full flex items-center gap-3 px-5 py-4 rounded-2xl transition-all duration-300 bg-gradient-to-r from-kla-main to-kla-light text-white shadow-lg font-bold text-lg ring-2 ring-green-200"> |
| <i class="fas fa-home w-6"></i> หน้าหลัก |
| </button> |
| <button onclick="switchTab('policies')" id="nav-policies" class="w-full flex items-center gap-3 px-5 py-4 rounded-2xl transition-all duration-300 hover:bg-green-50 text-gray-600 font-medium border border-transparent hover:border-green-100"> |
| <i class="fas fa-scroll w-6"></i> นโยบาย |
| </button> |
| <button onclick="switchTab('map')" id="nav-map" class="w-full flex items-center gap-3 px-5 py-4 rounded-2xl transition-all duration-300 hover:bg-blue-50 text-blue-600 font-medium border border-transparent hover:border-blue-100"> |
| <i class="fas fa-map-marked-alt w-6"></i> แผนที่ยุทธศาสตร์ |
| </button> |
| <button onclick="switchTab('fun')" id="nav-fun" class="w-full flex items-center gap-3 px-5 py-4 rounded-2xl transition-all duration-300 hover:bg-purple-50 text-purple-600 font-medium border border-transparent hover:border-purple-100 group"> |
| <i class="fas fa-magic w-6"></i> กิจกรรม AI <span class="bg-purple-500 text-white text-[10px] px-1.5 py-0.5 rounded ml-auto">ใหม่!</span> |
| </button> |
| <button onclick="switchTab('chat')" id="nav-chat" class="w-full flex items-center gap-3 px-5 py-4 rounded-2xl transition-all duration-300 hover:bg-green-50 text-gray-600 font-medium border border-transparent hover:border-green-100 group"> |
| <i class="fas fa-comments w-6"></i> ถามน้องกล้า |
| </button> |
| <button onclick="switchTab('complaint')" id="nav-complaint" class="w-full flex items-center gap-3 px-5 py-4 rounded-2xl transition-all duration-300 hover:bg-red-50 text-red-500 font-medium border border-transparent hover:border-red-100"> |
| <i class="fas fa-exclamation-circle w-6"></i> ร้องเรียน |
| </button> |
| </nav> |
| </div> |
| </div> |
|
|
| |
| <div class="flex-1 min-h-[600px]"> |
| |
| |
| <div id="tab-home" class="animate-fade-in block"> |
| |
| <div class="bg-gradient-to-br from-kla-main via-green-800 to-green-900 rounded-3xl overflow-hidden shadow-2xl text-white relative mb-10 min-h-[300px] flex items-center"> |
| <div class="absolute inset-0 opacity-10 bg-pattern"></div> |
| |
| <div class="p-6 md:p-10 flex flex-col md:flex-row items-center gap-8 md:gap-12 relative z-10 w-full"> |
| |
| <div class="w-48 h-48 md:w-64 md:h-64 rounded-full border-[6px] border-kla-gold shadow-2xl overflow-hidden flex-shrink-0 bg-gradient-to-b from-green-400 to-white relative z-20 ring-4 ring-green-900/50 group flex items-center justify-center"> |
| <img src="https://i.postimg.cc/tTWq33tF/ดาวน_โหลด.png" |
| onerror="this.src='https://ui-avatars.com/api/?name=Thanonan+Menasawat&background=15803d&color=fff&size=256'" |
| alt="ธนอนันต์ เมนะสวัสดิ์" |
| class="w-full h-full object-contain object-bottom scale-110 translate-y-2 transition-transform duration-500 group-hover:scale-115"> |
| </div> |
| |
| <div class="text-center md:text-left flex-1"> |
| <div class="inline-flex items-center gap-2 px-4 py-2 bg-kla-gold text-green-900 font-extrabold rounded-full text-base mb-4 shadow-lg animate-pulse"> |
| <span class="text-xl">🗳️</span> เบอร์ 1 ✅ เขต 6 อุดรธานี |
| </div> |
| <h1 class="text-3xl md:text-5xl font-extrabold mb-2 tracking-tight">ธนอนันต์ เมนะสวัสดิ์</h1> |
| <h2 class="text-xl md:text-3xl text-kla-gold mb-4 font-bold drop-shadow-sm">(ทนายโตโต้)</h2> |
| <div class="space-y-2 mb-6"> |
| <p class="text-lg md:text-xl font-medium italic opacity-95 leading-relaxed text-green-100"> |
| "ทนายความของประชาชน... คนรุ่นใหม่ หัวใจดั้งเดิม" |
| </p> |
| <p class="text-sm bg-white/10 inline-block px-3 py-1 rounded-lg backdrop-blur-sm border border-white/20"> |
| <i class="fas fa-user-tie mr-1"></i> บุตรชาย <strong class="text-yellow-300">นายเกียรติอุดม เมนะสวัสดิ์</strong> (อดีต ส.ส. อุดรธานี) |
| </p> |
| </div> |
| |
| <div class="flex flex-wrap gap-4 justify-center md:justify-start"> |
| <button onclick="switchTab('map')" class="bg-white text-kla-main px-8 py-3 rounded-full font-extrabold hover:bg-gray-100 transition shadow-lg transform hover:-translate-y-1 flex items-center gap-2 border-2 border-white"> |
| ดูแผนที่เขต 6 <i class="fas fa-map-marked-alt"></i> |
| </button> |
| <button onclick="switchTab('complaint')" class="bg-transparent border-2 border-kla-gold text-kla-gold px-8 py-3 rounded-full font-bold hover:bg-kla-gold/20 transition transform hover:-translate-y-1 flex items-center gap-2"> |
| ร้องทุกข์ <i class="fas fa-bullhorn"></i> |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="grid md:grid-cols-3 gap-6 mb-10"> |
| <div class="bg-white p-6 rounded-3xl shadow-md border-l-4 border-kla-main col-span-2"> |
| <h3 class="text-xl font-bold text-gray-800 mb-4 flex items-center gap-2"> |
| <i class="fas fa-history text-kla-main"></i> สานต่ออุดมการณ์ พ่อเกียรติอุดม |
| </h3> |
| <p class="text-gray-600 leading-relaxed mb-4"> |
| ทนายโตโต้ เป็นบุตรชายของ <strong>นายเกียรติอุดม เมนะสวัสดิ์</strong> อดีต ส.ส. อุดรธานี ผู้เป็นที่รักของพี่น้องชาวอุดรฯ |
| ซึมซับการทำงานเพื่อประชาชนมาตั้งแต่เด็ก "เดินตามพ่อไปหาเสียง เรียนรู้งานสภา" |
| วันนี้พร้อมแล้วที่จะนำความรู้ด้านกฎหมายมาช่วยเหลือพี่น้อง สืบสานเจตนารมณ์ของคุณพ่อ |
| </p> |
| <div class="flex gap-2 flex-wrap"> |
| <span class="bg-green-50 text-kla-main text-xs px-3 py-1 rounded-full font-bold">#ลูกไม้ใต้ต้น</span> |
| <span class="bg-green-50 text-kla-main text-xs px-3 py-1 rounded-full font-bold">#คนอุดรแท้</span> |
| <span class="bg-green-50 text-kla-main text-xs px-3 py-1 rounded-full font-bold">#ทนายความจิตอาสา</span> |
| </div> |
| </div> |
| <div class="bg-gradient-to-br from-blue-50 to-blue-100 p-6 rounded-3xl shadow-md border-l-4 border-blue-500"> |
| <h3 class="text-xl font-bold text-blue-800 mb-4 flex items-center gap-2"> |
| <i class="fas fa-gavel"></i> ทำไมต้อง "ทนาย"? |
| </h3> |
| <p class="text-blue-900 text-sm leading-relaxed"> |
| "เพราะกฎหมายคือเครื่องมือที่คนตัวเล็กๆ เข้าไม่ถึง" ทนายโตโต้จึงอาสาเป็นทนายแก้ต่างให้คนจนฟรี |
| เปิดศูนย์ปรึกษากฎหมายประจำตำบล เพื่อให้ความยุติธรรมจับต้องได้จริง |
| </p> |
| </div> |
| </div> |
|
|
| |
| <div class="bg-white rounded-3xl shadow-lg overflow-hidden mb-10 border border-green-100"> |
| <div class="bg-green-50 p-4 border-b border-green-100 flex items-center gap-3"> |
| <div class="w-10 h-10 bg-kla-main rounded-full flex items-center justify-center text-white text-lg"> |
| <i class="fas fa-video"></i> |
| </div> |
| <h3 class="text-xl font-bold text-gray-800">แนะนำตัว ทนายโตโต้</h3> |
| </div> |
| <div class="aspect-video w-full bg-black relative"> |
| <iframe |
| src="https://share.zight.com/Jru98vEz?embed=true&title=true&branding=true" |
| width="100%" |
| height="100%" |
| style="border:none" |
| frameborder="0" |
| class="absolute inset-0 w-full h-full" |
| allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" |
| allowtransparency="true" |
| allowfullscreen="true"> |
| </iframe> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="tab-policies" class="animate-fade-in hidden"> |
| <div class="flex flex-col md:flex-row items-start md:items-center justify-between gap-4 mb-8 pb-4 border-b border-gray-200"> |
| <div class="flex items-center gap-4"> |
| <div class="w-16 h-16 flex-shrink-0 bg-green-100 rounded-full flex items-center justify-center text-2xl text-kla-main shadow-sm border border-gray-100"> |
| <i class="fas fa-file-alt"></i> |
| </div> |
| <div> |
| <h2 class="text-3xl font-extrabold text-kla-main">นโยบายเพื่อพี่น้องเขต 6</h2> |
| <p class="text-gray-500 font-medium">ทำจริง ทำไว กล้าคิด กล้าทำ</p> |
| </div> |
| </div> |
| |
| <button onclick="playPolicyAudio()" id="tts-btn" class="bg-kla-main text-white px-5 py-3 rounded-full font-bold shadow-lg hover:bg-green-700 transition flex items-center gap-2 min-w-[180px] justify-center"> |
| <i class="fas fa-volume-up"></i> |
| <span>ฟังเสียงนโยบาย (AI)</span> |
| <div id="tts-loading" class="hidden audio-wave flex gap-0.5 h-3 items-end"> |
| <span></span><span></span><span></span><span></span> |
| </div> |
| </button> |
| <audio id="policy-audio" class="hidden"></audio> |
| </div> |
| |
| <div class="grid md:grid-cols-2 gap-6 mb-8"> |
| |
| <div class="bg-white p-6 rounded-2xl shadow-md border-t-4 border-kla-gold hover:shadow-xl transition-all group"> |
| <div class="flex items-center gap-4 mb-4"> |
| <div class="w-14 h-14 bg-yellow-50 text-kla-gold rounded-full flex items-center justify-center text-3xl shadow-sm group-hover:scale-110 transition border border-yellow-100"> |
| <i class="fas fa-certificate"></i> |
| </div> |
| <div> |
| <h3 class="text-xl font-bold text-gray-800">เปลี่ยน ส.ป.ก. เป็นโฉนด</h3> |
| <span class="text-xs bg-red-100 text-red-600 px-2 py-0.5 rounded-full font-bold">ทำทันที</span> |
| </div> |
| </div> |
| <p class="text-gray-600 leading-relaxed">สานต่อนโยบายหลักของพรรค เปลี่ยน ส.ป.ก. 4-01 ให้เป็นโฉนดเพื่อการเกษตร เพื่อให้พี่น้องใช้ค้ำประกันเงินกู้ได้จริง เพิ่มมูลค่าทรัพย์สินทันที</p> |
| </div> |
| |
| <div class="bg-white p-6 rounded-2xl shadow-md border-t-4 border-kla-main hover:shadow-xl transition-all group"> |
| <div class="flex items-center gap-4 mb-4"> |
| <div class="w-14 h-14 bg-green-50 text-kla-main rounded-full flex items-center justify-center text-3xl shadow-sm group-hover:scale-110 transition border border-green-100"> |
| <i class="fas fa-hand-holding-usd"></i> |
| </div> |
| <h3 class="text-xl font-bold text-gray-800">กองทุนแก้หนี้สิน</h3> |
| </div> |
| <p class="text-gray-600 leading-relaxed">ใช้ความรู้ทนายช่วยไกล่เกลี่ยหนี้นอกระบบ และจัดตั้งกองทุนหมุนเวียนเพื่อลดต้นทุนการผลิต ปุ๋ยยาต้องราคาเป็นธรรม</p> |
| </div> |
| |
| <div class="bg-white p-6 rounded-2xl shadow-md border-t-4 border-blue-500 hover:shadow-xl transition-all group"> |
| <div class="flex items-center gap-4 mb-4"> |
| <div class="w-14 h-14 bg-blue-50 text-blue-600 rounded-full flex items-center justify-center text-3xl shadow-sm group-hover:scale-110 transition border border-blue-100"> |
| <i class="fas fa-road"></i> |
| </div> |
| <div> |
| <h3 class="text-xl font-bold text-gray-800">ถนน 4 เลน</h3> |
| <div class="text-xs text-gray-500">ศรีธาตุ - วังสามหมอ</div> |
| </div> |
| </div> |
| <p class="text-gray-600 leading-relaxed">ผลักดันการขยายถนนเป็น 4 เลน เส้นทางหลัก "ศรีธาตุ-วังสามหมอ" เพื่อรองรับการขนส่งพืชผลการเกษตรและลดอุบัติเหตุ</p> |
| </div> |
| |
| <div class="bg-white p-6 rounded-2xl shadow-md border-t-4 border-green-500 hover:shadow-xl transition-all group"> |
| <div class="flex items-center gap-4 mb-4"> |
| <div class="w-14 h-14 bg-green-50 text-green-600 rounded-full flex items-center justify-center text-3xl shadow-sm group-hover:scale-110 transition border border-green-100"> |
| <i class="fas fa-gavel"></i> |
| </div> |
| <h3 class="text-xl font-bold text-gray-800">ทนายความประจำบ้าน</h3> |
| </div> |
| <p class="text-gray-600 leading-relaxed">ศูนย์ปรึกษากฎหมายฟรีทุกอำเภอ ดูแลคดีที่ดิน คดีมรดก คดีไม่ได้รับความเป็นธรรม โดยทีมงานทนายมืออาชีพ</p> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="tab-map" class="animate-fade-in hidden"> |
| <div class="mb-6 flex flex-col md:flex-row justify-between items-start md:items-center gap-4"> |
| <div> |
| <h2 class="text-3xl font-bold text-gray-800 flex items-center gap-3"> |
| <span class="bg-blue-100 text-blue-600 p-2 rounded-xl"><i class="fas fa-map-marked-alt"></i></span> แผนที่ยุทธศาสตร์ เขต 6 |
| </h2> |
| <p class="text-gray-600 mt-2">แสดงจุดยุทธศาสตร์สำคัญ และพื้นที่เป้าหมายการพัฒนาตามนโยบายพรรค</p> |
| </div> |
| <div class="text-sm bg-yellow-50 text-yellow-800 px-4 py-2 rounded-lg border border-yellow-200"> |
| <i class="fas fa-info-circle"></i> กดที่หมุดเพื่อดูนโยบายเฉพาะจุด และมุมมอง 3D |
| </div> |
| </div> |
|
|
| <div class="bg-white p-2 rounded-3xl shadow-xl border border-gray-200"> |
| <div id="map" class="w-full h-[500px] z-10 relative"></div> |
| </div> |
| |
| <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mt-6"> |
| <div class="flex items-center gap-2 text-sm text-gray-600"> |
| <div class="w-4 h-4 bg-kla-main rounded-full"></div> ที่ว่าการอำเภอ/ศูนย์กลาง |
| </div> |
| <div class="flex items-center gap-2 text-sm text-gray-600"> |
| <div class="w-4 h-4 bg-yellow-500 rounded-full"></div> ตลาดชุมชน/เศรษฐกิจ |
| </div> |
| <div class="flex items-center gap-2 text-sm text-gray-600"> |
| <div class="w-4 h-4 bg-orange-600 rounded-full"></div> ศาสนสถาน/ศูนย์รวมใจ |
| </div> |
| <div class="flex items-center gap-2 text-sm text-gray-600"> |
| <div class="w-4 h-4 bg-blue-500 rounded-full"></div> โครงการพัฒนา (ถนน/น้ำ) |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="tab-fun" class="animate-fade-in hidden"> |
| <div class="mb-8"> |
| <h2 class="text-3xl font-bold text-gray-800 flex items-center gap-3"> |
| <span class="bg-purple-100 text-purple-600 p-2 rounded-xl"><i class="fas fa-magic"></i></span> กิจกรรมสนุกๆ กับ AI |
| </h2> |
| <p class="text-gray-600 mt-2">สัมผัสอนาคตไปกับทนายโตโต้ ด้วยพลังของ Gemini AI และ Imagen</p> |
| </div> |
|
|
| <div class="grid md:grid-cols-2 gap-8"> |
| |
| <div class="bg-white p-6 rounded-3xl shadow-xl border-t-4 border-purple-500"> |
| <div class="flex items-center gap-3 mb-4"> |
| <div class="w-12 h-12 bg-purple-100 text-purple-600 rounded-full flex items-center justify-center text-xl"> |
| <i class="fas fa-eye"></i> |
| </div> |
| <h3 class="text-xl font-bold text-gray-800">🔮 ภาพอนาคต 2573 (Vision 2573)</h3> |
| </div> |
| <p class="text-sm text-gray-500 mb-4">พิมพ์ชื่อหมู่บ้านและอาชีพของคุณ AI จะฉายภาพชีวิตในอีก 4 ปีข้างหน้า เมื่อนโยบายทนายโตโต้สำเร็จ!</p> |
| |
| <div class="space-y-3"> |
| <input type="text" id="vision-village" placeholder="ชื่อหมู่บ้าน (เช่น บ้านหนองหาน)" class="w-full p-3 bg-gray-50 border border-gray-200 rounded-xl focus:ring-2 focus:ring-purple-500 outline-none"> |
| <input type="text" id="vision-job" placeholder="อาชีพ (เช่น ชาวนา, ค้าขาย)" class="w-full p-3 bg-gray-50 border border-gray-200 rounded-xl focus:ring-2 focus:ring-purple-500 outline-none"> |
| <button onclick="generateVision()" id="vision-btn" class="w-full bg-purple-600 text-white py-3 rounded-xl font-bold hover:bg-purple-700 transition flex items-center justify-center gap-2"> |
| ✨ ฉายภาพอนาคต |
| </button> |
| </div> |
| |
| <div id="vision-result" class="mt-6 p-4 bg-purple-50 rounded-xl border border-purple-100 hidden text-purple-900 leading-relaxed italic relative"> |
| |
| </div> |
| </div> |
|
|
| |
| <div class="bg-white p-6 rounded-3xl shadow-xl border-t-4 border-kla-gold"> |
| <div class="flex items-center gap-3 mb-4"> |
| <div class="w-12 h-12 bg-yellow-100 text-yellow-600 rounded-full flex items-center justify-center text-xl"> |
| <i class="fas fa-image"></i> |
| </div> |
| <h3 class="text-xl font-bold text-gray-800">🎨 สร้างโปสเตอร์เชียร์ (AI Poster)</h3> |
| </div> |
| <p class="text-sm text-gray-500 mb-4">อยากได้โปสเตอร์เชียร์แบบไหน? บอก AI ได้เลย (เช่น "ชาวนาเชียร์ทนายโตโต้", "พัฒนาถนน")</p> |
| |
| <div class="space-y-3"> |
| <input type="text" id="poster-prompt" placeholder="แนวคิดโปสเตอร์ (เช่น ทุ่งนาสีทอง, ถนน 4 เลนสวยๆ)" class="w-full p-3 bg-gray-50 border border-gray-200 rounded-xl focus:ring-2 focus:ring-yellow-500 outline-none"> |
| <button onclick="generatePoster()" id="poster-btn" class="w-full bg-gradient-to-r from-kla-gold to-yellow-500 text-white py-3 rounded-xl font-bold hover:shadow-lg transition flex items-center justify-center gap-2"> |
| 🎨 วาดโปสเตอร์ |
| </button> |
| </div> |
|
|
| <div id="poster-result-container" class="mt-6 hidden flex justify-center items-center bg-gray-100 rounded-xl min-h-[250px] relative overflow-hidden"> |
| <img id="poster-img" src="" class="w-full h-full object-cover rounded-xl" alt="AI Generated Poster"> |
| <div id="poster-loading" class="absolute inset-0 bg-white/80 flex flex-col items-center justify-center hidden"> |
| <i class="fas fa-spinner fa-spin text-3xl text-yellow-500 mb-2"></i> |
| <span class="text-sm font-bold text-gray-500">AI กำลังวาดภาพ...</span> |
| </div> |
| </div> |
| <p class="text-xs text-center text-gray-400 mt-2">*สร้างโดย Imagen 3 (AI)</p> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="tab-chat" class="animate-fade-in hidden"> |
| <div class="mb-6"> |
| <h2 class="text-3xl font-bold text-gray-800 flex items-center gap-3"> |
| <span class="bg-green-100 text-kla-main p-2 rounded-xl"><i class="fas fa-robot"></i></span> แชทกับน้องกล้า |
| </h2> |
| <p class="text-gray-600 mt-2 pl-12 flex items-center gap-2"> |
| <span>ผู้ช่วย AI อัจฉริยะ รู้จริงเรื่องพื้นที่และนโยบาย</span> |
| <span class="bg-gradient-to-r from-pink-500 to-green-600 text-white text-[10px] font-bold px-2 py-0.5 rounded-full shadow-sm">✨ Powered by Gemini</span> |
| </p> |
| </div> |
| |
| <div class="flex flex-col h-[600px] bg-white rounded-3xl overflow-hidden shadow-xl border border-green-100"> |
| |
| <div class="bg-gradient-to-r from-kla-main to-green-700 text-white p-4 px-6 flex items-center justify-between shadow-md relative overflow-hidden"> |
| <div class="absolute inset-0 opacity-10 bg-pattern"></div> |
| <div class="flex items-center gap-4 relative z-10"> |
| <div class="w-12 h-12 bg-white rounded-full flex items-center justify-center text-kla-main font-extrabold border-2 border-kla-gold text-xl shadow-sm"> |
| ก |
| </div> |
| <div> |
| <h3 class="font-bold text-lg">น้องกล้า (AI ทนายโตโต้)</h3> |
| <p class="text-xs text-green-200 flex items-center gap-1.5"> |
| <span class="w-2.5 h-2.5 bg-green-400 rounded-full animate-pulse ring-2 ring-green-200"></span> Online (Gemini 2.5 Flash) |
| </p> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="chat-messages" class="flex-1 overflow-y-auto p-6 space-y-6 chat-scroll bg-gray-50"> |
| <div class="flex justify-start"> |
| <div class="flex items-end gap-2"> |
| <div class="w-8 h-8 bg-kla-main rounded-full flex-shrink-0 flex items-center justify-center text-white font-bold text-sm border border-kla-gold mb-1 shadow-sm">ก</div> |
| <div class="max-w-[85%] p-4 rounded-2xl shadow-sm text-sm bg-white text-gray-800 border border-gray-200 rounded-bl-none"> |
| <p class="font-bold text-kla-main mb-1">สวัสดีครับพี่น้องชาวอุดรเขต 6! 🙏</p> |
| ผม <strong>'น้องกล้า'</strong> ผู้ช่วย AI ของทนายโตโต้ครับ <br> |
| <ul class="list-disc list-inside mt-2 text-gray-600 space-y-1"> |
| <li>ถามเรื่องนโยบายเปลี่ยน ส.ป.ก. เป็นโฉนด</li> |
| <li>สอบถามเส้นทางถนน 4 เลน</li> |
| <li>ปรึกษากฎหมายเบื้องต้น</li> |
| <li>ให้ผมช่วยร่างหนังสือร้องเรียนก็ได้นะครับ!</li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="p-4 bg-white border-t border-gray-100"> |
| <form onsubmit="sendMessage(event)" class="flex gap-3 relative"> |
| <input id="chat-input" type="text" placeholder="พิมพ์คำถาม... (เช่น 'พ่อทนายโตโต้คือใคร?', 'สปก.ทำยังไง?')" |
| class="flex-1 p-4 pr-16 border border-gray-300 rounded-2xl focus:outline-none focus:ring-2 focus:ring-kla-main focus:border-transparent shadow-sm bg-gray-50" autocomplete="off"> |
| <button type="submit" id="send-btn" class="absolute right-2 top-2 bottom-2 bg-kla-main text-white p-2 md:px-6 rounded-xl hover:bg-green-800 transition-all font-bold shadow-md flex items-center justify-center gap-1 group disabled:opacity-50 disabled:cursor-not-allowed"> |
| <span class="hidden md:inline">ส่ง</span> |
| <i class="fas fa-paper-plane md:hidden"></i> |
| </button> |
| </form> |
| <div class="mt-3 flex flex-wrap gap-2 text-xs text-gray-500 justify-center"> |
| <span class="bg-gray-100 px-3 py-1 rounded-full cursor-pointer hover:bg-green-100 hover:text-kla-main transition" onclick="document.getElementById('chat-input').value='ทนายโตโต้เป็นลูกใคร?'; sendMessage(event);">👨👩👦 ครอบครัว?</span> |
| <span class="bg-gray-100 px-3 py-1 rounded-full cursor-pointer hover:bg-green-100 hover:text-kla-main transition" onclick="document.getElementById('chat-input').value='สปก. เปลี่ยนเป็นโฉนดได้จริงไหม?'; sendMessage(event);">📜 สปก. เป็นโฉนด?</span> |
| <span class="bg-gray-100 px-3 py-1 rounded-full cursor-pointer hover:bg-green-100 hover:text-kla-main transition" onclick="document.getElementById('chat-input').value='ช่วยร่างหนังสือร้องเรียนเรื่องถนนเป็นหลุมบ่อหน่อย'; sendMessage(event);">✍️ ช่วยเขียนร้องเรียน</span> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="tab-complaint" class="animate-fade-in hidden"> |
| <div class="mb-8"> |
| <h2 class="text-3xl font-bold text-gray-800 flex items-center gap-3"> |
| <span class="bg-red-100 text-red-600 p-2 rounded-xl animate-pulse"><i class="fas fa-exclamation-triangle"></i></span> แจ้งปัญหาในพื้นที่ |
| </h2> |
| <p class="text-gray-600 mt-3 text-lg leading-relaxed max-w-2xl">ทนายโตโต้พร้อมรับฟังทุกปัญหา และใช้ความรู้ทางกฎหมายเข้าช่วยเหลือ แจ้งเรื่องได้เลยครับ</p> |
| </div> |
| |
| <div id="complaint-form-view" class="flex flex-col md:flex-row gap-8 items-start"> |
| <div class="bg-white p-8 rounded-3xl shadow-xl border-t-8 border-red-500 flex-1 w-full"> |
| <h3 class="font-bold text-xl mb-6 text-gray-800">แบบฟอร์มรับเรื่องร้องทุกข์</h3> |
| <form onsubmit="submitComplaint(event)" class="space-y-5"> |
| <div class="grid md:grid-cols-2 gap-5"> |
| <div> |
| <label class="block text-sm font-bold text-gray-700 mb-2">ชื่อ-นามสกุล <span class="text-red-500">*</span></label> |
| <input required type="text" class="w-full p-3 bg-gray-50 border border-gray-300 rounded-xl focus:ring-2 focus:ring-red-500 focus:border-transparent outline-none transition" placeholder="ระบุชื่อของท่าน"> |
| </div> |
| <div> |
| <label class="block text-sm font-bold text-gray-700 mb-2">เบอร์โทรศัพท์ติดต่อ <span class="text-red-500">*</span></label> |
| <input required type="tel" class="w-full p-3 bg-gray-50 border border-gray-300 rounded-xl focus:ring-2 focus:ring-red-500 focus:border-transparent outline-none transition" placeholder="เพื่อให้ทีมงานติดต่อกลับ"> |
| </div> |
| </div> |
| <div> |
| <label class="block text-sm font-bold text-gray-700 mb-2">พื้นที่ (อำเภอ/ตำบล) <span class="text-red-500">*</span></label> |
| <select class="w-full p-3 bg-gray-50 border border-gray-300 rounded-xl focus:ring-2 focus:ring-red-500 focus:border-transparent outline-none transition pr-10"> |
| <option value="">-- กรุณาเลือกอำเภอ --</option> |
| <option>อำเภอศรีธาตุ</option> |
| <option>อำเภอวังสามหมอ</option> |
| <option>อำเภอไชยวาน</option> |
| <option>อำเภอกู่แก้ว</option> |
| <option>อื่นๆ ในเขต 6</option> |
| </select> |
| </div> |
| <div> |
| <div class="flex justify-between items-end mb-2"> |
| <label class="block text-sm font-bold text-gray-700">รายละเอียดปัญหา <span class="text-red-500">*</span></label> |
| <button type="button" onclick="magicDraft()" id="magic-btn" class="text-xs bg-gradient-to-r from-purple-600 to-indigo-600 text-white px-3 py-1.5 rounded-full hover:shadow-lg transition flex items-center gap-1"> |
| ✨ ให้ AI ช่วยเรียบเรียง |
| </button> |
| </div> |
| <textarea id="complaint-detail" required rows="6" class="w-full p-3 bg-gray-50 border border-gray-300 rounded-xl focus:ring-2 focus:ring-red-500 focus:border-transparent outline-none transition resize-none" placeholder="เช่น ถนนเป็นหลุมบ่อสายไหน, น้ำประปาไม่ไหลที่หมู่บ้านใด..."></textarea> |
| <p class="text-xs text-gray-400 mt-1">*เคล็ดลับ: พิมพ์สั้นๆ แล้วกดปุ่ม ✨ เพื่อให้ AI เขียนภาษาทางการให้ครับ</p> |
| </div> |
| <button type="submit" class="w-full bg-gradient-to-r from-red-600 to-red-500 text-white py-4 rounded-xl font-bold hover:from-red-700 hover:to-red-600 transition-all shadow-lg text-lg flex items-center justify-center gap-2"> |
| ส่งเรื่องถึงทนายโตโต้ <i class="fas fa-paper-plane"></i> |
| </button> |
| </form> |
| </div> |
| |
| |
| <div class="md:w-80 bg-green-50 p-6 rounded-3xl border border-green-100 shadow-inner"> |
| <h4 class="font-bold text-kla-main text-lg mb-4 flex items-center gap-2"> |
| <i class="fas fa-info-circle"></i> |
| ศูนย์ประสานงาน |
| </h4> |
| <ul class="space-y-4 text-sm text-gray-700"> |
| <li class="flex items-start gap-3"> |
| <span class="bg-white p-2 rounded-full shadow-sm text-kla-main"><i class="fas fa-map-marker-alt"></i></span> |
| <span>ที่ทำการพรรคกล้าธรรม เขต 6 จ.อุดรธานี</span> |
| </li> |
| <li class="flex items-center gap-3"> |
| <span class="bg-white p-2 rounded-full shadow-sm text-green-600"><i class="fas fa-phone"></i></span> |
| <span class="font-bold">08X-XXXXXXX</span> (สายด่วนทีมงาน) |
| </li> |
| <li class="flex items-center gap-3"> |
| <span class="bg-white p-2 rounded-full shadow-sm text-blue-600"><i class="fab fa-facebook"></i></span> |
| <a href="https://www.facebook.com/thanaana.menasahwat" target="_blank" class="hover:text-blue-800 transition underline font-bold">Facebook: ทนายโตโต้</a> |
| </li> |
| </ul> |
| </div> |
| </div> |
|
|
| |
| <div id="complaint-success-view" class="hidden bg-white border-2 border-green-400 p-12 rounded-3xl text-center mt-8 shadow-xl max-w-2xl mx-auto animate-fade-in"> |
| <div class="w-24 h-24 bg-green-100 text-green-500 rounded-full flex items-center justify-center mx-auto mb-6 text-5xl shadow-sm ring-4 ring-green-50"> |
| <i class="fas fa-check"></i> |
| </div> |
| <h3 class="text-3xl font-extrabold text-gray-800 mb-4">ได้รับเรื่องแล้วครับ!</h3> |
| <p class="text-gray-600 text-lg mb-8">ทีมงานทนายโตโต้จะรีบตรวจสอบและประสานงานแก้ไขให้พี่น้องโดยเร็วที่สุดครับ</p> |
| <button onclick="resetComplaint()" class="bg-gray-100 text-gray-700 px-8 py-3 rounded-full font-bold hover:bg-gray-200 transition">ส่งเรื่องอื่นเพิ่มเติม</button> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <footer class="bg-gray-900 text-gray-400 py-10 mt-12 text-center text-sm border-t-4 border-kla-gold"> |
| <div class="max-w-6xl mx-auto px-4"> |
| <div class="mb-6 flex items-center justify-center gap-3 opacity-50 hover:opacity-100 transition"> |
| <div class="text-left"> |
| <h4 class="font-bold text-white text-base">พรรคกล้าธรรม</h4> |
| <p class="text-xs">Kla Tham Party</p> |
| </div> |
| <a href="https://www.facebook.com/thanaana.menasahwat" target="_blank" class="text-white hover:text-blue-400 transition"><i class="fab fa-facebook text-2xl"></i></a> |
| </div> |
| <p class="font-medium text-gray-300">© 2025 ทีมงานทนายโตโต้ ธนอนันต์ เมนะสวัสดิ์</p> |
| <p>ผู้สมัคร ส.ส. เขต 6 จ.อุดรธานี พรรคกล้าธรรม</p> |
| </div> |
| </footer> |
|
|
| |
| <script> |
| |
| const apiKey = "AIzaSyCfVQrOUMsYk3VjV88QJqNOlUZkrvFdOz8"; |
| |
| |
| function switchTab(tabId) { |
| ['home', 'policies', 'map', 'fun', 'chat', 'complaint'].forEach(id => { |
| const tab = document.getElementById('tab-' + id); |
| if (tab) tab.classList.add('hidden'); |
| |
| const navItem = document.getElementById('nav-' + id); |
| if (navItem) { |
| navItem.classList.remove('bg-gradient-to-r', 'from-kla-main', 'to-kla-light', 'text-white', 'shadow-lg', 'ring-2', 'ring-green-200'); |
| navItem.classList.add('hover:bg-green-50', 'text-gray-600', 'font-medium', 'border', 'border-transparent'); |
| if(id === 'complaint') navItem.classList.add('text-red-500', 'hover:bg-red-50'); |
| if(id === 'map') navItem.classList.add('text-blue-600', 'hover:bg-blue-50'); |
| if(id === 'fun') navItem.classList.add('text-purple-600', 'hover:bg-purple-50'); |
| } |
| }); |
| |
| const activeTab = document.getElementById('tab-' + tabId); |
| if (activeTab) { |
| activeTab.classList.remove('hidden'); |
| if (tabId === 'map' && mapInstance) { |
| setTimeout(() => mapInstance.invalidateSize(), 100); |
| } |
| } |
| |
| const activeNav = document.getElementById('nav-' + tabId); |
| if (activeNav) { |
| activeNav.classList.remove('hover:bg-green-50', 'text-gray-600', 'font-medium', 'border', 'border-transparent', 'text-red-500', 'hover:bg-red-50', 'text-blue-600', 'hover:bg-blue-50', 'text-purple-600', 'hover:bg-purple-50'); |
| activeNav.classList.add('bg-gradient-to-r', 'from-kla-main', 'to-kla-light', 'text-white', 'shadow-lg', 'ring-2', 'ring-green-200'); |
| } |
| |
| if(window.innerWidth < 768) { |
| window.scrollTo({ top: 0, behavior: 'smooth' }); |
| } |
| } |
| |
| function toggleMobileMenu() { |
| const menu = document.getElementById('mobile-menu'); |
| menu.classList.toggle('hidden'); |
| } |
| |
| |
| let mapInstance = null; |
| |
| const mapData = [ |
| { name: "ที่ว่าการอำเภอศรีธาตุ", lat: 16.9958, lng: 103.2111, type: "district", policy: "ขยายถนน 4 เลน (Logistics)", link3d: "https://www.google.com/maps/@16.97278,103.21667,500m/data=!3m1!1e3" }, |
| { name: "ตลาดสดศรีธาตุ", lat: 16.9965, lng: 103.2125, type: "market", policy: "ตลาดชุมชนเข้มแข็ง", link3d: "https://www.google.com/maps/@16.9965,103.2125,500m/data=!3m1!1e3" }, |
| { name: "ที่ว่าการอำเภอวังสามหมอ", lat: 16.9654, lng: 103.4452, type: "district", policy: "ราคายางพาราเป็นธรรม", link3d: "https://www.google.com/maps/@16.94972,103.42861,500m/data=!3m1!1e3" }, |
| { name: "ตลาดสดวังสามหมอ", lat: 16.9662, lng: 103.4468, type: "market", policy: "กระตุ้นเศรษฐกิจฐานราก", link3d: "https://www.google.com/maps/@16.9662,103.4468,500m/data=!3m1!1e3" }, |
| { name: "ที่ว่าการอำเภอไชยวาน", lat: 17.2845, lng: 103.2145, type: "district", policy: "ส่งเสริมการท่องเที่ยววิถีธรรม", link3d: "https://www.google.com/maps/@17.28667,103.22333,500m/data=!3m1!1e3" }, |
| { name: "ทต.โนนทองอินทร์ (กู่แก้ว)", lat: 17.1542, lng: 103.0541, type: "subdistrict", policy: "แหล่งน้ำเพื่อการเกษตร", link3d: "https://www.google.com/maps/@17.14500,103.05500,500m/data=!3m1!1e3" }, |
| { name: "วัดป่าศรีคุณาราม", lat: 17.0012, lng: 103.2085, type: "temple", policy: "ทำนุบำรุงศาสนา", link3d: "https://www.google.com/maps/@17.0012,103.2085,500m/data=!3m1!1e3" } |
| ]; |
| |
| function initMap() { |
| if (mapInstance) return; |
| |
| mapInstance = L.map('map').setView([17.12, 103.25], 10); |
| |
| L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png', { |
| attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors © <a href="https://carto.com/attributions">CARTO</a>', |
| subdomains: 'abcd', |
| maxZoom: 19 |
| }).addTo(mapInstance); |
| |
| const createIcon = (type) => { |
| let iconClass = 'fa-map-marker-alt'; |
| let colorClass = 'bg-green-700'; |
| |
| if (type === 'market') { iconClass = 'fa-shopping-basket'; colorClass = 'market'; } |
| if (type === 'temple') { iconClass = 'fa-vihara'; colorClass = 'temple'; } |
| |
| return L.divIcon({ |
| className: 'custom-div-icon', |
| html: `<div class="map-pin ${colorClass}"><i class="fas ${iconClass}"></i></div>`, |
| iconSize: [40, 42], |
| iconAnchor: [20, 42], |
| popupAnchor: [0, -45] |
| }); |
| }; |
| |
| mapData.forEach(point => { |
| const marker = L.marker([point.lat, point.lng], { icon: createIcon(point.type) }).addTo(mapInstance); |
| |
| const popupContent = ` |
| <div class="font-sans text-center"> |
| <h3 class="font-bold text-lg text-green-800 mb-1">${point.name}</h3> |
| <p class="text-xs text-gray-500 mb-2">📌 นโยบายที่เกี่ยวข้อง:</p> |
| <div class="bg-green-50 border border-green-200 rounded-lg p-2 mb-3 text-sm font-medium text-green-700"> |
| ${point.policy} |
| </div> |
| <a href="${point.link3d}" target="_blank" class="block w-full bg-blue-600 text-white text-xs font-bold py-2 rounded-lg hover:bg-blue-700 transition shadow-sm"> |
| <i class="fas fa-cube mr-1"></i> ดูมุมมอง 3D (ของจริง) |
| </a> |
| </div> |
| `; |
| marker.bindPopup(popupContent); |
| }); |
| } |
| |
| document.addEventListener('DOMContentLoaded', () => { |
| initMap(); |
| }); |
| |
| |
| |
| async function generateVision() { |
| const village = document.getElementById('vision-village').value; |
| const job = document.getElementById('vision-job').value; |
| const resultDiv = document.getElementById('vision-result'); |
| const btn = document.getElementById('vision-btn'); |
| |
| if (!village || !job) { alert('กรุณากรอกข้อมูลให้ครบก่อนนะครับ'); return; } |
| |
| const originalText = btn.innerHTML; |
| btn.innerHTML = `<i class="fas fa-spinner fa-spin"></i> กำลังสร้างภาพอนาคต...`; |
| btn.disabled = true; |
| resultDiv.classList.add('hidden'); |
| |
| const prompt = `Write a short, inspiring narrative (4-5 sentences, Thai language, mixed with Isan dialect) about a person living in "${village}" working as "${job}" in the year 2029 (end of Lawyer Toto's term). Describe how Lawyer Toto's policies (Land titles, 4-lane roads, debt relief) have specifically improved their life. Tone: Hopeful, Warm, Realistic.`; |
| |
| try { |
| const text = await callGemini(prompt); |
| resultDiv.innerHTML = `<i class="fas fa-quote-left text-purple-300 text-4xl absolute -top-4 -left-2 opacity-50"></i>` + marked.parse(text); |
| resultDiv.classList.remove('hidden'); |
| } catch (e) { |
| alert('เกิดข้อผิดพลาด กรุณาลองใหม่ครับ'); |
| } |
| |
| btn.innerHTML = originalText; |
| btn.disabled = false; |
| } |
| |
| async function generatePoster() { |
| if (!apiKey) { alert("ขออภัยครับ ฟีเจอร์นี้ต้องใช้ API Key"); return; } |
| |
| const promptInput = document.getElementById('poster-prompt').value; |
| const container = document.getElementById('poster-result-container'); |
| const img = document.getElementById('poster-img'); |
| const loading = document.getElementById('poster-loading'); |
| const btn = document.getElementById('poster-btn'); |
| |
| if (!promptInput) { alert('กรุณาบอกแนวคิดโปสเตอร์ก่อนนะครับ'); return; } |
| |
| const originalText = btn.innerHTML; |
| btn.innerHTML = `<i class="fas fa-spinner fa-spin"></i> กำลังวาด...`; |
| btn.disabled = true; |
| container.classList.remove('hidden'); |
| loading.classList.remove('hidden'); |
| |
| |
| const fullPrompt = `A high quality political campaign poster for Lawyer Toto, a Thai politician in Udon Thani. Theme: ${promptInput}. Green and Gold color scheme. Friendly, professional, hopeful atmosphere. Thai rural background context. High resolution, photorealistic or high quality illustration style.`; |
| |
| try { |
| const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/imagen-4.0-generate-001:predict?key=${apiKey}`, { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ |
| instances: [{ prompt: fullPrompt }], |
| parameters: { sampleCount: 1 } |
| }) |
| }); |
| |
| if (!response.ok) throw new Error('Image Gen Error'); |
| |
| const data = await response.json(); |
| const base64Image = data.predictions[0].bytesBase64Encoded; |
| img.src = `data:image/png;base64,${base64Image}`; |
| |
| } catch (error) { |
| console.error(error); |
| alert("ขออภัยครับ ไม่สามารถสร้างรูปภาพได้ในขณะนี้"); |
| container.classList.add('hidden'); |
| } |
| |
| loading.classList.add('hidden'); |
| btn.innerHTML = originalText; |
| btn.disabled = false; |
| } |
| |
| |
| const systemInstruction = ` |
| You are 'Nong Kla' (น้องกล้า), an AI digital campaign assistant for Thanonan Menasawat (Lawyer Toto), Candidate No. 1, Kla Tham Party, District 6 Udon Thani. |
| Tone: Polite Thai (ends with Krub), helpful, sincere. Can use a bit of Isan dialect. |
| Key Info: Lawyer Toto is the son of former MP Kiatudom Menasawat. |
| Policies: Convert SPK to Title Deed, Debt Relief Fund, 4-Lane Road (Sri That-Wang Sam Mo), Home Lawyer. |
| `; |
| |
| async function callGemini(userPrompt, specificInstruction = null) { |
| if (!apiKey) { return "ขออภัยครับ ระบบ AI กำลังปรับปรุง (กรุณาใส่ API Key)"; } |
| |
| try { |
| const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`, { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ |
| contents: [{ parts: [{ text: userPrompt }] }], |
| systemInstruction: { parts: [{ text: specificInstruction || systemInstruction }] } |
| }) |
| }); |
| |
| if (!response.ok) throw new Error('API Error'); |
| const data = await response.json(); |
| return data.candidates[0].content.parts[0].text; |
| } catch (error) { |
| console.error(error); |
| return "ขออภัยครับ มีข้อผิดพลาดในการเชื่อมต่อ"; |
| } |
| } |
| |
| async function sendMessage(e) { |
| e.preventDefault(); |
| const input = document.getElementById('chat-input'); |
| const message = input.value.trim(); |
| if (!message) return; |
| |
| addMessage(message, 'user'); |
| input.value = ''; |
| document.getElementById('send-btn').disabled = true; |
| const loadingId = addLoadingBubble(); |
| const aiResponse = await callGemini(message); |
| removeLoadingBubble(loadingId); |
| addMessage(aiResponse, 'bot'); |
| document.getElementById('send-btn').disabled = false; |
| } |
| |
| function addMessage(text, sender) { |
| const container = document.getElementById('chat-messages'); |
| const msgDiv = document.createElement('div'); |
| msgDiv.className = `flex ${sender === 'user' ? 'justify-end' : 'justify-start'} animate-fade-in`; |
| |
| if (sender === 'bot') { |
| const iconDiv = document.createElement('div'); |
| iconDiv.className = "w-8 h-8 bg-kla-main rounded-full flex-shrink-0 flex items-center justify-center text-white font-bold text-sm border border-kla-gold mb-1 shadow-sm mr-2 self-end"; |
| iconDiv.innerHTML = "ก"; |
| msgDiv.appendChild(iconDiv); |
| } |
| |
| const bubble = document.createElement('div'); |
| bubble.className = `max-w-[85%] p-4 rounded-2xl shadow-sm text-sm leading-relaxed ${ |
| sender === 'user' |
| ? 'bg-gradient-to-r from-kla-main to-green-700 text-white rounded-br-none font-medium' |
| : 'bg-white text-gray-800 border border-gray-200 rounded-bl-none' |
| }`; |
| bubble.innerHTML = sender === 'bot' ? marked.parse(text) : text; |
| msgDiv.appendChild(bubble); |
| container.appendChild(msgDiv); |
| container.scrollTop = container.scrollHeight; |
| } |
| |
| function addLoadingBubble() { |
| const container = document.getElementById('chat-messages'); |
| const id = 'loading-' + Date.now(); |
| const msgDiv = document.createElement('div'); |
| msgDiv.id = id; |
| msgDiv.className = "flex justify-start animate-fade-in"; |
| msgDiv.innerHTML = `<div class="w-8 h-8 bg-kla-main rounded-full flex-shrink-0 flex items-center justify-center text-white font-bold text-sm border border-kla-gold mb-1 shadow-sm mr-2 self-end">ก</div><div class="bg-white text-gray-800 border border-gray-200 rounded-2xl rounded-bl-none p-4 shadow-sm"><div class="typing-indicator"><span></span><span></span><span></span></div></div>`; |
| container.appendChild(msgDiv); |
| container.scrollTop = container.scrollHeight; |
| return id; |
| } |
| function removeLoadingBubble(id) { const el = document.getElementById(id); if(el) el.remove(); } |
| |
| async function magicDraft() { |
| const textarea = document.getElementById('complaint-detail'); |
| const userText = textarea.value.trim(); |
| const btn = document.getElementById('magic-btn'); |
| |
| if (!userText) { alert("กรุณาพิมพ์รายละเอียดปัญหาสั้นๆ ก่อนครับ"); return; } |
| |
| const originalBtnText = btn.innerHTML; |
| btn.innerHTML = `<i class="fas fa-spinner fa-spin"></i> กำลังเรียบเรียง...`; |
| btn.disabled = true; |
| |
| const prompt = `Rewrite the following complaint text to be formal, polite, and official (Thai language) suitable for submitting to a lawyer/MP candidate: "${userText}"`; |
| const refinedText = await callGemini(prompt, "You are a professional legal secretary."); |
| |
| if (refinedText) textarea.value = refinedText.replace(/['"]/g, ''); |
| btn.innerHTML = originalBtnText; |
| btn.disabled = false; |
| } |
| |
| |
| function base64ToArrayBuffer(base64) { |
| const binaryString = window.atob(base64); |
| const len = binaryString.length; |
| const bytes = new Uint8Array(len); |
| for (let i = 0; i < len; i++) { |
| bytes[i] = binaryString.charCodeAt(i); |
| } |
| return bytes.buffer; |
| } |
| |
| function createWavHeader(dataLength, sampleRate = 24000) { |
| const buffer = new ArrayBuffer(44); |
| const view = new DataView(buffer); |
| view.setUint8(0, 'R'.charCodeAt(0)); view.setUint8(1, 'I'.charCodeAt(0)); view.setUint8(2, 'F'.charCodeAt(0)); view.setUint8(3, 'F'.charCodeAt(0)); |
| view.setUint32(4, 36 + dataLength, true); |
| view.setUint8(8, 'W'.charCodeAt(0)); view.setUint8(9, 'A'.charCodeAt(0)); view.setUint8(10, 'V'.charCodeAt(0)); view.setUint8(11, 'E'.charCodeAt(0)); |
| view.setUint8(12, 'f'.charCodeAt(0)); view.setUint8(13, 'm'.charCodeAt(0)); view.setUint8(14, 't'.charCodeAt(0)); view.setUint8(15, ' '.charCodeAt(0)); |
| view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, 1, true); |
| view.setUint32(24, sampleRate, true); view.setUint32(28, sampleRate * 2, true); |
| view.setUint16(32, 2, true); view.setUint16(34, 16, true); |
| view.setUint8(36, 'd'.charCodeAt(0)); view.setUint8(37, 'a'.charCodeAt(0)); view.setUint8(38, 't'.charCodeAt(0)); view.setUint8(39, 'a'.charCodeAt(0)); |
| view.setUint32(40, dataLength, true); |
| return buffer; |
| } |
| |
| async function playPolicyAudio() { |
| if (!apiKey) { alert("ขออภัยครับ ฟีเจอร์นี้ต้องใช้ API Key"); return; } |
| |
| const btn = document.getElementById('tts-btn'); |
| const loading = document.getElementById('tts-loading'); |
| const audio = document.getElementById('policy-audio'); |
| |
| if (!audio.paused) { |
| audio.pause(); audio.currentTime = 0; |
| btn.querySelector('span').innerText = "ฟังเสียงนโยบาย (AI)"; |
| loading.classList.add('hidden'); |
| return; |
| } |
| |
| btn.disabled = true; |
| loading.classList.remove('hidden'); |
| btn.querySelector('span').innerText = "กำลังสร้างเสียง..."; |
| |
| const policyText = "นโยบายพรรคกล้าธรรม... เปลี่ยน ส.ป.ก. เป็นโฉนดเพื่อการเกษตร ให้พี่น้องใช้ค้ำประกันเงินกู้ได้... แก้หนี้สินเกษตรกร... ขยายถนน 4 เลน เส้นศรีธาตุ-วังสามหมอ... เลือกเบอร์ 1 ธนอนันต์ เมนะสวัสดิ์ ทนายโตโต้"; |
| |
| try { |
| const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=${apiKey}`, { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ |
| contents: [{ parts: [{ text: policyText }] }], |
| generationConfig: { |
| responseModalities: ["AUDIO"], |
| speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Puck" } } } |
| } |
| }) |
| }); |
| |
| if (!response.ok) throw new Error('TTS API Error'); |
| const data = await response.json(); |
| const audioBase64 = data.candidates[0].content.parts[0].inlineData.data; |
| const pcmBuffer = base64ToArrayBuffer(audioBase64); |
| const wavHeader = createWavHeader(pcmBuffer.byteLength); |
| const wavBlob = new Blob([wavHeader, pcmBuffer], { type: 'audio/wav' }); |
| const audioUrl = URL.createObjectURL(wavBlob); |
| |
| audio.src = audioUrl; |
| audio.play(); |
| btn.disabled = false; |
| btn.querySelector('span').innerText = "หยุดฟัง"; |
| audio.onended = () => { |
| btn.querySelector('span').innerText = "ฟังเสียงนโยบาย (AI)"; |
| loading.classList.add('hidden'); |
| }; |
| } catch (error) { |
| console.error(error); |
| alert("เกิดข้อผิดพลาดในการสร้างเสียง"); |
| btn.disabled = false; |
| loading.classList.add('hidden'); |
| } |
| } |
| |
| |
| function submitComplaint(e) { |
| e.preventDefault(); |
| document.getElementById('complaint-form-view').classList.add('hidden'); |
| document.getElementById('complaint-success-view').classList.remove('hidden'); |
| window.scrollTo({ top: 0, behavior: 'smooth' }); |
| } |
| function resetComplaint() { |
| document.getElementById('complaint-form-view').classList.remove('hidden'); |
| document.getElementById('complaint-success-view').classList.add('hidden'); |
| document.querySelector('#complaint-form-view form').reset(); |
| } |
| </script> |
| </body> |
| </html> |