{"id":8361,"date":"2025-06-30T07:11:15","date_gmt":"2025-06-30T07:11:15","guid":{"rendered":"https:\/\/flightgolf.vn\/price-list\/"},"modified":"2026-06-09T03:23:24","modified_gmt":"2026-06-09T03:23:24","slug":"price-list","status":"publish","type":"page","link":"https:\/\/flightgolf.vn\/en\/price-list\/","title":{"rendered":"Price list"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8361\" class=\"elementor elementor-8361 elementor-3958\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"wd-negative-gap elementor-element elementor-element-a48f361 wd-section-stretch e-flex e-con-boxed e-con e-parent\" data-id=\"a48f361\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0362dbc e-con-full e-flex e-con e-child\" data-id=\"0362dbc\" data-element_type=\"container\" data-e-type=\"container\" id=\"banggia-to-export\">\n\t\t\t\t<div class=\"elementor-element elementor-element-615c95a elementor-widget elementor-widget-html\" data-id=\"615c95a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"pdf-only\" style=\"margin-bottom: 10px; text-align: left;\">\r\n  <img decoding=\"async\" src=\"https:\/\/flightgolf.vn\/wp-content\/uploads\/2025\/03\/flightgolf-logo-01.svg\"\r\n       alt=\"FlightGolf Logo\"\r\n       style=\"height: 80px;\">\r\n<\/div>\r\n<style>.pdf-only {\r\n  visibility: hidden;position: absolute;\r\n}\r\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d70175f elementor-widget elementor-widget-heading\" data-id=\"d70175f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Golf Course Price List - June<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0f65615 color-scheme-inherit text-left elementor-widget elementor-widget-text-editor\" data-id=\"0f65615\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>FlightGolf is pleased to send you our promotional golf course price list in Vietnam. The rates apply to 18-hole tee times and include green fee, caddie fee, and 1\/2 golf cart \u2013 a full package for a premium golf round.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f5f2fef elementor-widget elementor-widget-html\" data-id=\"f5f2fef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div style=\"display: flex; justify-content: flex-end;\">\r\n  <button class=\"export-btn\" id=\"btn-export-pdf\" style=\"background-color: #3a8d39; color: white; border-radius: 50px;\">\r\n    \ud83e\uddfe Download Price List\r\n  <\/button>\r\n<\/div>\r\n\r\n<script>\r\n document.getElementById('btn-export-pdf').addEventListener('click', function () {\r\n  \/\/ 1. Correct the table wrapper ID\r\n  const element = document.getElementById('content-to-export'); \r\n  if (!element) return alert('Data region to export not found!');\r\n\r\n  \/\/ Show elements intended for PDF only\r\n  const pdfOnlyElements = document.querySelectorAll('.pdf-only');\r\n  pdfOnlyElements.forEach(el => {\r\n    el.style.visibility = 'visible';\r\n    el.style.position = 'static';\r\n  });\r\n\r\n  \/\/ Show processing toast notification\r\n  const toast = document.getElementById('pdf-toast');\r\n  if (toast) toast.style.display = 'block';\r\n\r\n  \/\/ Add class to body\/wrapper to hide \"Book Course\" buttons and Search Inputs via CSS when exporting PDF\r\n  element.classList.add('is-exporting');\r\n\r\n  \/\/ Set PDF configuration (Optimized scale and format to prevent layout overflow)\r\n  const opt = {\r\n    margin: [10, 10, 10, 10], \/\/ smaller margins for better presentation\r\n    filename: 'FlightGolf-golf-course-price-list.pdf',\r\n    image: { type: 'jpeg', quality: 0.95 },\r\n    html2canvas: { \r\n      scale: 2, \/\/ scale 2 provides sufficient clarity, scale 3 is too heavy and may crash\/freeze\r\n      useCORS: true,\r\n      logging: false\r\n    },\r\n    jsPDF: {\r\n      unit: 'pt',\r\n      format: 'a3', \/\/ Force to A3 size or use a layout array that fits the 1070px table\r\n      orientation: 'landscape' \/\/ Landscape orientation is highly recommended for multi-column tables\r\n    }\r\n  };\r\n\r\n  \/\/ Run html2pdf\r\n  html2pdf().set(opt).from(element).save().then(() => {\r\n    \/\/ Hide PDF-only logo elements again\r\n    pdfOnlyElements.forEach(el => {\r\n      el.style.visibility = 'hidden';\r\n      el.style.position = 'absolute';\r\n    });\r\n\r\n    \/\/ Hide toast\r\n    if (toast) toast.style.display = 'none';\r\n\r\n    \/\/ Remove export class to restore Web interface to normal, keeping \"Book Course\" links clickable\r\n    element.classList.remove('is-exporting');\r\n  }).catch(err => {\r\n    console.error(\"PDF Export Error: \", err);\r\n    element.classList.remove('is-exporting');\r\n  });\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-90be548 elementor-widget elementor-widget-html\" data-id=\"90be548\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"content-to-export\">\r\n  <!-- Horizontally scrollable table -->\r\n  <div style=\"overflow-x: auto; width: 100%;\">\r\n    <table id=\"golf-table\" style=\"min-width: 1070px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13.5px; text-align: center;\">\r\n      <thead>\r\n        <tr>\r\n          <th rowspan=\"2\" class=\"header-no\" style=\"width:3%;\">No<\/th>\r\n          <th rowspan=\"2\" class=\"header-khuvuc\" style=\"width: 7%;\">Region<\/th>\r\n          <th rowspan=\"2\" class=\"header-sangon sticky-san-gon\" style=\"width: 15%;\">\r\n            Golf Course\r\n            <div style=\"margin-top: 5px;\">\r\n              <input type=\"text\" id=\"golf-search\" placeholder=\"\ud83d\udd0d Search golf course...\" style=\"margin-bottom:15px; padding:6px 12px; max-width:300px; width:100%; border:1px solid #ccc; border-radius:30px; background-color:#fff; color:#000; font-weight:400;\">\r\n            <\/div>\r\n          <\/th>\r\n          <th colspan=\"2\" class=\"header-group\" style=\"width: 13%;\">Day\/Time<\/th>\r\n          <th colspan=\"2\" class=\"header-group\" style=\"width: 15%;\">Weekdays<\/th>\r\n          <th colspan=\"2\" class=\"header-group\" style=\"width: 15%;\">Weekends<\/th>\r\n          <th rowspan=\"2\" class=\"header-fee\" style=\"width: 10%;\">Cart Fee<\/th>\r\n          <th rowspan=\"2\" class=\"header-bonus\" style=\"width: 14%;\">Bonus<\/th>\r\n          <th rowspan=\"2\" class=\"header-datsan\" style=\"width: 8%;\">Book<\/th>\r\n        <\/tr>\r\n        <tr>\r\n          <th class=\"header-child\">Day<\/th>\r\n          <th class=\"header-child\">Time<\/th>\r\n          <th class=\"header-child\">FlightGolf<\/th>\r\n          <th class=\"header-child\">Public<\/th>\r\n          <th class=\"header-child\">FlightGolf<\/th>\r\n          <th class=\"header-child\">Public<\/th>\r\n        <\/tr>\r\n      <\/thead>\r\n\r\n      <tbody id=\"golf-table-body\"><\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8cb5056 elementor-widget elementor-widget-html\" data-id=\"8cb5056\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\n\/\/ D\u1ecbch nh\u00e3n khu v\u1ef1c sang Ti\u1ebfng Anh\r\nconst khuVucLabels = {\r\n  \"mien_bac\": \"Northern Golf Courses\",\r\n  \"vinpearl\": \"Vinpearl Golf Courses\",\r\n  \"flc\": \"FLC Golf Courses\",\r\n  \"mien_trung\": \"Central Golf Courses\",\r\n  \"mien_nam\": \"Southern Golf Courses\"\r\n};\r\n\r\n\/\/ Gi\u1eef nguy\u00ean b\u1ea3n \u0111\u1ed3 \u0111\u1ecba ph\u01b0\u01a1ng (T\u00ean t\u1ec9nh th\u00e0nh d\u1ea1ng kh\u00f4ng d\u1ea5u vi\u1ebft hoa r\u1ea5t ph\u00f9 h\u1ee3p cho kh\u00e1ch n\u01b0\u1edbc ngo\u00e0i)\r\nconst diaPhuongMap = {\r\n  vinh_phuc: \"PHU THO\", ha_noi: \"HA NOI\", bac_giang: \"BAC NINH\", hai_duong: \"HAI PHONG\", hoa_binh: \"HOA BINH\",\r\n  ha_nam: \"NINH BINH\", phu_tho: \"PHU THO\", ninh_binh: \"NINH BINH\", hai_phong: \"HAI PHONG\", quang_ninh: \"QUANG NINH\",\r\n  yen_bai: \"YEN BAI\", lao_cai: \"LAO CAI\", vinpearlcourse: \"VINPEARL\", flccourse: \"FLC COURSE\",\r\n  da_nang: \"DA NANG\", hue: \"HUE\", quang_nam: \"QUANG NAM\", nghe_an: \"NGHE AN\", ha_tinh: \"HA TINH\",\r\n  khanh_hoa: \"KHANH HOA\", ninh_thuan: \"NINH THUAN\", lam_dong: \"LAM DONG\", binh_thuan: \"BINH THUAN\",\r\n  dong_nai: \"DONG NAI\", binh_duong: \"BINH DUONG\", tp_hcm: \"TP HCM\", vung_tau: \"VUNG TAU\",\r\n  long_an: \"TAY NINH\", phu_quoc: \"PHU QUOC\", thai_nguyen: \"THAI NGUYEN\",quang_tri: \"QUANG TRI\"\r\n};\r\n\r\nlet fullGolfData = [];\r\n\r\nasync function fetchAndRenderGolfData(filteredKeyword = \"\") {\r\n  const tbody = document.getElementById('golf-table-body');\r\n  tbody.innerHTML = \"\";\r\n\r\n  const keyword = filteredKeyword.toLowerCase().trim();\r\n\r\n  const filteredData = fullGolfData.filter(san =>\r\n    san.slug.toLowerCase().includes(keyword)\r\n  );\r\n\r\n  let currentKhuVuc = '';\r\n  const diaPhuongRowspans = {};\r\n  const diaPhuongRendered = {};\r\n  let counter = 1;\r\n\r\n  \/\/ T\u00ednh l\u1ea1i rowspan \u0110\u1ecaA PH\u01af\u01a0NG theo d\u1eef li\u1ec7u \u0111\u00e3 l\u1ecdc\r\n  filteredData.forEach(san => {\r\n    const dia_phuong = san.dia_phuong || 'other';\r\n    diaPhuongRowspans[dia_phuong] = (diaPhuongRowspans[dia_phuong] || 0) + san.gia_tee_time.reduce((t, b) => t + b.khung_gio.length, 0);\r\n  });\r\n\r\n  for (const san of filteredData) {\r\n    if (san.khu_vuc !== currentKhuVuc) {\r\n      const trGroup = document.createElement('tr');\r\n      \/\/ D\u1ecbch ti\u00eau \u0111\u1ec1 h\u00e0ng g\u1ed9p khu v\u1ef1c\r\n      trGroup.innerHTML = `<td colspan=\"12\" style=\"background:#799a0a;color:#fff;font-weight:bold;text-align:center;border:1px solid #ccc;\">${khuVucLabels[san.khu_vuc]}<\/td>`;\r\n      tbody.appendChild(trGroup);\r\n      currentKhuVuc = san.khu_vuc;\r\n    }\r\n\r\n    const diaPhuongSlug = san.dia_phuong || 'other';\r\n    const diaPhuongLabel = diaPhuongMap[diaPhuongSlug] || diaPhuongSlug.toUpperCase();\r\n    const allRows = [];\r\n\r\n    san.gia_tee_time.forEach(dateBlock => {\r\n      dateBlock.khung_gio.forEach(slot => {\r\n        allRows.push({ ngay: dateBlock.ngay, ...slot });\r\n      });\r\n    });\r\n\r\n    allRows.forEach((row, index) => {\r\n      const tr = document.createElement('tr');\r\n      tr.setAttribute('data-san', san.slug.toLowerCase());\r\n      let html = '';\r\n\r\n      \/\/ C\u1ed9t STT\r\n      if (index === 0) html += `<td rowspan=\"${allRows.length}\" style=\"border:1px solid #ccc; background-color:#fbefcc; text-align:center; vertical-align:middle;\">${counter}<\/td>`;\r\n\r\n      \/\/ C\u1ed9t \u0111\u1ecba ph\u01b0\u01a1ng\r\n      if (!diaPhuongRendered[diaPhuongSlug]) {\r\n        html += `<td rowspan=\"${diaPhuongRowspans[diaPhuongSlug]}\" style=\"border:1px solid #ccc; font-weight:bold; background-color:#fbefcc;\">${diaPhuongLabel}<\/td>`;\r\n        diaPhuongRendered[diaPhuongSlug] = true;\r\n      }\r\n\r\n      \/\/ C\u1ed9t t\u00ean s\u00e2n (STICKY GOLF COLUMN)\r\n      if (index === 0) {\r\n        html += `<td rowspan=\"${allRows.length}\" class=\"sticky-golf-col\" data-sticky-golf style=\"border:1px solid #ccc; background-color:#fbefcc !important; min-width:150px;\"><b>${san.ten_san}<\/b><\/td>`;\r\n      }\r\n\r\n      \/\/ C\u1ed9t ng\u00e0y\r\n      if (index === 0 || allRows[index].ngay !== allRows[index - 1]?.ngay) {\r\n        const rowspanCount = allRows.filter(r => r.ngay === row.ngay).length;\r\n        html += `<td rowspan=\"${rowspanCount}\" style=\"border:1px solid #ccc; background-color:#fbefcc;\">${row.ngay}<\/td>`;\r\n      }\r\n\r\n      html += `<td style=\"border:1px solid #ccc; background-color:#fbefcc;\">${row.gio || ''}<\/td>`;\r\n      html += `<td style=\"border:1px solid #ccc; padding:8px;font-weight:bold;text-align:center; background-color:#799a0a; color:white;\">${row[\"gia-wd-fl\"] || ''}<\/td>`;\r\n      html += `<td style=\"border:1px solid #ccc; background-color:#fbefcc;\">${row[\"gia-wd-pl\"] || ''}<\/td>`;\r\n      html += `<td style=\"border:1px solid #ccc; padding:8px;font-weight:bold;text-align:center; background-color:#799a0a; color:white;\">${row[\"gia-wk-fl\"] || ''}<\/td>`;\r\n      html += `<td style=\"border:1px solid #ccc; background-color:#fbefcc;\">${row[\"gia-wk-pl\"] || ''}<\/td>`;\r\n\r\n      if (index === 0) {\r\n        html += `<td rowspan=\"${allRows.length}\" style=\"border:1px solid #ccc; max-width:120px; background-color:#fbefcc;\">${san.phi_xe_chung || ''}<\/td>`;\r\n        html += `<td rowspan=\"${allRows.length}\" style=\"border:1px solid #ccc; max-width:200px; word-break:break-word; background-color:#fbefcc;\">${san.bonus_chung || ''}<\/td>`;\r\n        html += `<td rowspan=\"${allRows.length}\" style=\"border:1px solid #ccc; background-color:#fbefcc;\">\r\n<a href=\"${san.link_dat_san}\" target=\"_blank\"\r\n   class=\"btn-book pdf-disable-link\"\r\n   data-href=\"${san.link_dat_san}\"\r\n   style=\"background:#577C3A; color:white !important; padding:5px 8px; border-radius:30px; text-decoration:none; display:flex; align-items:center; justify-content:center;\">\r\n  Book\r\n<\/a>\r\n\r\n        <\/td>`;\r\n      }\r\n\r\n      tr.innerHTML = html;\r\n      tbody.appendChild(tr);\r\n    });\r\n\r\n    counter++;\r\n  }\r\n}\r\n\r\n\/\/ Fetch d\u1eef li\u1ec7u ban \u0111\u1ea7u\r\n(async function () {\r\n  const res = await fetch('https:\/\/flightgolf.vn\/wp-json\/golfdata\/v1\/bang-gia-v2\/');\r\n  fullGolfData = await res.json();\r\n  fetchAndRenderGolfData();\r\n\r\n  \/\/ Search input\r\n  const searchInput = document.getElementById('golf-search');\r\n  searchInput.addEventListener('input', function () {\r\n    fetchAndRenderGolfData(this.value);\r\n  });\r\n})();\r\n<\/script>\r\n\r\n<style>\r\n\/* Sticky golf column when touching left border *\/\r\n.sticky-golf-col {\r\n  position: sticky;\r\n  left: 0;\r\n  background-color: #f5faf4 !important;\r\n  z-index: 1;\r\n  max-width: 33vw;\r\n  min-width: 150px;\r\n  overflow-x: hidden;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .sticky-golf-col {\r\n    max-width: 33vw;\r\n  }\r\n}\r\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-53f43f4 color-scheme-inherit text-left elementor-widget elementor-widget-text-editor\" data-id=\"53f43f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul>\n<li><em>Rates can be changed upon Golf courses&#8217;s Changes<\/em><\/li>\n<\/ul>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"wd-negative-gap elementor-element elementor-element-d6dd6a3 e-flex e-con-boxed e-con e-parent\" data-id=\"d6dd6a3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4b623c4 elementor-widget elementor-widget-html\" data-id=\"4b623c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Toast Notification -->\r\n<div id=\"pdf-toast\" style=\"\r\n  display: none;\r\n  position: fixed;\r\n  bottom: 20px;\r\n  right: 20px;\r\n  background-color: #3a8d39;\r\n  color: white;\r\n  padding: 12px 20px;\r\n  border-radius: 8px;\r\n  box-shadow: 0 4px 10px rgba(0,0,0,0.15);\r\n  font-size: 14px;\r\n  z-index: 9999;\r\n\">\r\n  Generating PDF file, please wait...\r\n<\/div>\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>\n\t\t","protected":false},"excerpt":{"rendered":"<p>FlightGolf is pleased to send you our promotional golf course price list in Vietnam. The rates apply to 18-hole tee<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-8361","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/pages\/8361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/comments?post=8361"}],"version-history":[{"count":1,"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/pages\/8361\/revisions"}],"predecessor-version":[{"id":8365,"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/pages\/8361\/revisions\/8365"}],"wp:attachment":[{"href":"https:\/\/flightgolf.vn\/en\/wp-json\/wp\/v2\/media?parent=8361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}