/** * รวมฟังก์ชันอรรถประโยชน์ต่างๆ สำหรับใช้งานทั่วไป */ const Utils = { /** * ฟังก์ชันหน่วงเวลาการทำงาน * @param {Function} func - ฟังก์ชันที่ต้องการหน่วงเวลา * @param {number} wait - เวลาที่ต้องการหน่วง (มิลลิวินาที) */ debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; }, /** * จัดรูปแบบตัวเลขเป็นสกุลเงิน */ formatCurrency(amount, currency = CONFIG.LOCALE.CURRENCY, locale = CONFIG.LOCALE.DEFAULT) { return new Intl.NumberFormat(locale, { style: 'currency', currency: currency }).format(amount); }, /** * จัดรูปแบบวันที่ */ formatDate(date, format = 'LONG') { if (!date) return ''; const dateObj = new Date(date); const options = { SHORT: {day: '2-digit', month: '2-digit', year: 'numeric'}, LONG: {day: 'numeric', month: 'long', year: 'numeric'}, WITH_TIME: { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' } }; return dateObj.toLocaleDateString(CONFIG.LOCALE.DEFAULT, options[format]); }, /** * สร้าง ID แบบไม่ซ้ำกัน */ generateId(prefix = '') { return `${prefix}${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; }, /** * ตรวจสอบเบอร์โทรศัพท์ (ประเทศไทย) */ validatePhone(phone) { return /^0[6-9]{1}\d{8}$/.test(phone); }, /** * ตรวจสอบอีเมล */ validateEmail(email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); }, /** * คัดลอกออบเจ็กต์แบบลึก */ clone(obj) { return JSON.parse(JSON.stringify(obj)); }, /** * ดึงข้อมูลจาก localStorage แบบปลอดภัย */ getStorageItem(key, defaultValue = null) { try { const item = localStorage.getItem(key); return item ? JSON.parse(item) : defaultValue; } catch (error) { console.error(`เกิดข้อผิดพลาดในการอ่าน localStorage: ${key}`, error); return defaultValue; } }, /** * บันทึกข้อมูลลง localStorage แบบปลอดภัย */ setStorageItem(key, value) { try { localStorage.setItem(key, JSON.stringify(value)); return true; } catch (error) { console.error(`เกิดข้อผิดพลาดในการเขียน localStorage: ${key}`, error); return false; } }, /** * เลื่อนไปยังอิลิเมนต์ที่ระบุ */ scrollTo(elementId, offset = 0) { const element = document.getElementById(elementId); if (element) { const top = element.offsetTop - offset; window.scrollTo({ top, behavior: 'smooth' }); } }, /** * ตรวจสอบว่าอิลิเมนต์อยู่ในพื้นที่มองเห็นหรือไม่ */ isInViewport(element) { const rect = element.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); }, /** * เพิ่มคลาสชั่วคราวให้กับอิลิเมนต์ */ addTemporaryClass(element, className, duration = CONFIG.ANIMATION_DURATION) { element.classList.add(className); setTimeout(() => element.classList.remove(className), duration); }, /** * จัดรูปแบบขนาดไฟล์ */ formatFileSize(bytes) { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }, /** * ดึงภาษาของเบราว์เซอร์ */ getBrowserLocale(defaultLocale = CONFIG.LOCALE.DEFAULT) { return navigator.language || navigator.userLanguage || defaultLocale; }, /** * ตรวจสอบว่าเป็นอุปกรณ์มือถือหรือไม่ */ isMobile() { return window.innerWidth <= 768; }, /** * ตรวจสอบว่ารองรับการสัมผัสหรือไม่ */ isTouchDevice() { return 'ontouchstart' in window || navigator.maxTouchPoints > 0; }, /** * แยกพารามิเตอร์จาก URL */ getUrlParams() { const params = new URLSearchParams(window.location.search); const result = {}; for (const [key, value] of params) { result[key] = value; } return result; }, /** * คัดลอกข้อความไปยังคลิปบอร์ด */ async copyToClipboard(text) { try { await navigator.clipboard.writeText(text); return true; } catch (error) { console.error('ไม่สามารถคัดลอกข้อความได้:', error); return false; } }, /** * ลบแท็ก HTML ออก */ stripHtml(html) { const tmp = document.createElement('div'); tmp.innerHTML = html; return tmp.textContent || tmp.innerText || ''; }, /** * ตรวจสอบว่าเป็น JSON string หรือไม่ */ isJsonString(str) { try { JSON.parse(str); return true; } catch (e) { return false; } }, /** * สุ่มรายการจากอาเรย์ */ getRandomItem(array) { return array[Math.floor(Math.random() * array.length)]; }, /** * ตรวจสอบว่าออบเจ็กต์ว่างหรือไม่ */ isEmpty(obj) { return Object.keys(obj).length === 0; }, /** * เปรียบเทียบออบเจ็กต์สองตัว */ isEqual(obj1, obj2) { return JSON.stringify(obj1) === JSON.stringify(obj2); }, /** * คำนวณเปอร์เซ็นต์ส่วนลด */ calculateDiscount(originalPrice, finalPrice) { return Math.round(((originalPrice - finalPrice) / originalPrice) * 100); }, /** * จัดรูปแบบเบอร์โทรศัพท์ */ formatPhone(phone) { return phone.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3'); }, /** * จำกัดความยาวข้อความพร้อมเครื่องหมายจุดไข่ปลา */ truncate(str, length, end = '...') { return str.length > length ? str.substring(0, length - end.length) + end : str; }, /** * ตรวจสอบว่าเป็นตัวเลขหรือไม่ */ isNumeric(value) { return !isNaN(parseFloat(value)) && isFinite(value); }, /** * ดึงนามสกุลไฟล์ */ getFileExtension(filename) { return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2); }, /** * แปลงสี RGB เป็น Hex */ rgbToHex(r, g, b) { return '#' + [r, g, b].map(x => { const hex = x.toString(16); return hex.length === 1 ? '0' + hex : hex; }).join(''); } };