{"product_id":"pay-as-you-go-subscription","title":"Langganan Bayar Sesuai Pemakaian","description":"\u003cstyle\u003e\n  .rc-ge-product{\n    max-width: 760px;\n    margin: 0 auto;\n    padding: 24px 20px 22px;\n    border-radius: 26px;\n    background: linear-gradient(145deg, #ffffff 0%, #f5fcfc 100%);\n    border: 1px solid rgba(80,170,180,.16);\n    box-shadow: 0 14px 30px rgba(29,120,133,.08);\n    color: #1f2937;\n    line-height: 1.7;\n  }\n\n  .rc-ge-product *,\n  .rc-ge-product h2,\n  .rc-ge-product h3,\n  .rc-ge-product p,\n  .rc-ge-product li,\n  .rc-ge-product a,\n  .rc-ge-product span,\n  .rc-ge-product div,\n  .rc-ge-product strong{\n    font-family: inherit !important;\n  }\n\n  .rc-ge-product-hero{\n    text-align: center;\n    margin-bottom: 18px;\n  }\n\n  .rc-ge-product-hero h2{\n    margin: 0 0 10px;\n    font-size: clamp(1.7rem, 3.2vw, 2.3rem);\n    line-height: 1.15;\n    color: #111827;\n    letter-spacing: -.02em;\n  }\n\n  .rc-ge-product-sub{\n    max-width: 620px;\n    margin: 0 auto 12px;\n    font-size: 1.03rem;\n    color: #4b5563;\n  }\n\n  .rc-ge-product-highlight{\n    display: inline-block;\n    padding: 12px 16px;\n    border-radius: 18px;\n    background: linear-gradient(135deg, #f3ffff 0%, #eafcfc 100%);\n    border: 1px solid rgba(78,170,176,.20);\n    box-shadow: 0 10px 22px rgba(29,120,133,.08);\n    font-weight: 700;\n    color: #116466;\n  }\n\n  .rc-ge-product-bubbles{\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: center;\n    gap: 10px;\n    margin: 16px 0 20px;\n  }\n\n  .rc-ge-product-bubble{\n    display: inline-flex;\n    align-items: center;\n    padding: 10px 14px;\n    border-radius: 999px;\n    border: 1px solid rgba(0,0,0,.06);\n    box-shadow: 0 6px 14px rgba(0,0,0,.05);\n    font-weight: 700;\n    font-size: .95rem;\n    color: #1f2937;\n  }\n\n  .rc-ge-product-bubble:nth-child(1){ background: #eafcfc; }\n  .rc-ge-product-bubble:nth-child(2){ background: #eefdf2; }\n  .rc-ge-product-bubble:nth-child(3){ background: #fff4df; }\n  .rc-ge-product-bubble:nth-child(4){ background: #eef6ff; }\n\n  .rc-ge-product-copy{\n    margin-bottom: 18px;\n  }\n\n  .rc-ge-product-copy p{\n    margin: 0 0 12px;\n  }\n\n  .rc-ge-product-copy ul{\n    margin: 0;\n    padding-left: 1.2rem;\n  }\n\n  .rc-ge-product-copy li{\n    margin-bottom: 8px;\n  }\n\n  .rc-ge-times-shell{\n    margin: 18px 0 18px;\n    padding: 18px 16px;\n    border-radius: 22px;\n    background: linear-gradient(145deg, #ffffff 0%, #f3fbfb 100%);\n    border: 1px solid rgba(80,170,180,.16);\n    box-shadow: 0 12px 24px rgba(29,120,133,.06);\n  }\n\n  .rc-ge-times-head{\n    display: flex;\n    align-items: flex-start;\n    justify-content: space-between;\n    gap: 12px;\n    margin-bottom: 4px;\n  }\n\n  .rc-ge-times-head h3{\n    margin: 0 0 8px;\n    font-size: 1.18rem;\n    line-height: 1.2;\n    color: #111827;\n  }\n\n  .rc-ge-times-ship{\n    flex: 0 0 auto;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    min-width: 52px;\n  }\n\n  .rc-ge-times-ship img{\n    display: block;\n    width: 52px;\n    height: auto;\n    max-height: 52px;\n    object-fit: contain;\n    filter: drop-shadow(0 4px 10px rgba(31,127,150,.16));\n  }\n\n  .rc-ge-times-topline{\n    margin: 0 0 8px;\n    color: #4b5563;\n    font-size: .98rem;\n  }\n\n  .rc-ge-timezone{\n    display: inline-block;\n    margin: 0 0 14px;\n    padding: 8px 12px;\n    border-radius: 999px;\n    background: linear-gradient(145deg,#f3ffff 0%,#e7fbfb 100%);\n    border: 1px solid rgba(78,170,176,.22);\n    color: #116466;\n    font-weight: 700;\n    font-size: .93rem;\n  }\n\n  .rc-ge-times-grid{\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 12px;\n  }\n\n  .rc-ge-day{\n    border-radius: 18px;\n    padding: 14px;\n    background: linear-gradient(180deg, #ffffff 0%, #f8fefe 100%);\n    border: 1px solid rgba(80,170,180,.12);\n    box-shadow: 0 8px 18px rgba(29,120,133,.04);\n  }\n\n  .rc-ge-day h4{\n    margin: 0 0 8px;\n    font-size: 1rem;\n    color: #111827;\n  }\n\n  .rc-ge-slots{\n    margin: 0;\n    padding-left: 1rem;\n  }\n\n  .rc-ge-slots li{\n    margin-bottom: 6px;\n  }\n\n  .rc-ge-times-loading,\n  .rc-ge-times-empty,\n  .rc-ge-times-error{\n    padding: 14px 16px;\n    border-radius: 18px;\n    background: linear-gradient(145deg,#ffffff 0%,#f5fdfd 100%);\n    border: 1px solid rgba(80,170,180,.12);\n  }\n\n  .rc-ge-times-error{\n    background: #fff7f7;\n    border-color: rgba(185,28,28,.12);\n    color: #991b1b;\n  }\n\n  .rc-ge-note{\n    margin-top: 12px;\n    color: #6b7280;\n    font-size: .95rem;\n  }\n\n  .rc-ge-product-buttons{\n    display: flex;\n    flex-wrap: wrap;\n    gap: 12px;\n    margin-top: 18px;\n  }\n\n  .rc-ge-btn{\n    display: inline-block;\n    padding: 12px 18px;\n    border-radius: 999px;\n    text-decoration: none;\n    font-weight: 800;\n    border: 1px solid rgba(0,0,0,.08);\n    box-shadow: 0 8px 18px rgba(0,0,0,.06);\n    transition: transform .15s ease, opacity .15s ease, box-shadow .15s ease;\n  }\n\n  .rc-ge-btn:hover{\n    transform: translateY(-1px);\n    opacity: .96;\n    box-shadow: 0 12px 24px rgba(0,0,0,.08);\n  }\n\n  .rc-ge-btn-primary{\n    background: linear-gradient(145deg,#4fc8c4 0%,#2ca7b1 58%,#1f7d95 100%);\n    color: #fff !important;\n    border-color: rgba(16,94,105,.18);\n    box-shadow: 0 10px 22px rgba(29,120,133,.18);\n  }\n\n  .rc-ge-btn-secondary{\n    background: linear-gradient(145deg,#ffffff 0%,#f2fcfc 100%);\n    color: #1f2937 !important;\n    border: 1px solid rgba(80,170,180,.18);\n    box-shadow: 0 10px 22px rgba(29,120,133,.08);\n  }\n\n  @media (max-width: 700px){\n    .rc-ge-times-grid{\n      grid-template-columns: 1fr;\n    }\n  }\n\n  @media (max-width: 640px){\n    .rc-ge-product{\n      padding: 20px 16px 20px;\n      border-radius: 22px;\n    }\n\n    .rc-ge-product-buttons{\n      flex-direction: column;\n    }\n\n    .rc-ge-btn{\n      width: 100%;\n      text-align: center;\n      box-sizing: border-box;\n    }\n\n    .rc-ge-times-head{\n      gap: 10px;\n    }\n\n    .rc-ge-times-ship img{\n      width: 46px;\n      max-height: 46px;\n    }\n  }\n\u003c\/style\u003e\n\u003cdiv class=\"rc-ge-product\"\u003e\n\u003cdiv class=\"rc-ge-product-hero\"\u003e\n\u003ch2\u003eLangganan Bulanan Pay-As-You-Go\u003c\/h2\u003e\n\u003cp class=\"rc-ge-product-sub\"\u003eCara yang lebih mudah untuk melanjutkan kelas Bahasa Inggris mingguan Anda setiap bulan tanpa repot membayar setiap minggu.\u003c\/p\u003e\n\u003cdiv class=\"rc-ge-product-highlight\"\u003eSatu kali pembayaran setiap bulan untuk waktu kelas mingguan Anda. Perlu menyesuaikan jadwal rutin sesekali? Cukup beri tahu Ross.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"rc-ge-product-bubbles\"\u003e\n\u003cspan class=\"rc-ge-product-bubble\"\u003eDibayar bulanan\u003c\/span\u003e \u003cspan class=\"rc-ge-product-bubble\"\u003eWaktu kelas mingguan\u003c\/span\u003e \u003cspan class=\"rc-ge-product-bubble\"\u003ePerubahan fleksibel\u003c\/span\u003e \u003cspan class=\"rc-ge-product-bubble\"\u003eGuru sungguhan\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"rc-ge-product-copy\"\u003e\n\u003cp\u003eOpsi ini untuk siswa yang menginginkan kemudahan membayar sekali sebulan dibanding menangani pembayaran mingguan. Sebagian besar siswa memilih satu waktu kelas rutin setiap minggu dan tetap dengan itu, tetapi jika Anda sesekali perlu mengubah waktu mingguan Anda, itu biasanya tidak masalah. Cukup beri tahu Ross dan Dokumen Waktu Anda dapat diperbarui sesuai kebutuhan.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eTerbaik untuk:\u003c\/strong\u003e siswa yang menginginkan pembayaran bulanan sederhana untuk kelas Bahasa Inggris mingguan rutin\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eJadwal:\u003c\/strong\u003e biasanya satu waktu kelas per minggu\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eFleksibilitas:\u003c\/strong\u003e perubahan jadwal biasanya tidak masalah bila diperlukan — cukup beri tahu sebelumnya\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eKebijakan:\u003c\/strong\u003e kebijakan pembatalan 5+ jam yang biasa tetap berlaku\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"rc-ge-times-shell\"\u003e\n\u003cdiv class=\"rc-ge-times-head\"\u003e\n\u003ch3\u003eWaktu kelas yang tersedia saat ini\u003c\/h3\u003e\n\u003cdiv class=\"rc-ge-times-ship\" aria-hidden=\"true\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0567\/6148\/3312\/files\/sail-1.gif?v=1692956642\" alt=\"\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp class=\"rc-ge-times-topline\"\u003eIni adalah waktu Bahasa Inggris Umum saat ini di zona waktu lokal Anda.\u003c\/p\u003e\n\u003cdiv id=\"rc-ge-timezone\" class=\"rc-ge-timezone\"\u003eMemeriksa zona waktu Anda…\u003c\/div\u003e\n\u003cdiv id=\"rc-ge-output\" class=\"rc-ge-times-loading\"\u003eMemuat waktu yang tersedia…\u003c\/div\u003e\n\u003cp class=\"rc-ge-note\"\u003eSebagian besar siswa memilih satu waktu mingguan tetap, tetapi perubahan kecil biasanya bisa diatur. Cukup beri tahu Ross.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"rc-ge-product-buttons\"\u003e\n\u003ca class=\"rc-ge-btn rc-ge-btn-primary\" href=\"\/id-kh\/appointment\"\u003eBuat Janji Temu\u003c\/a\u003e \u003ca class=\"rc-ge-btn rc-ge-btn-secondary\" href=\"\/id-kh\/register\"\u003eRegister\u003c\/a\u003e \u003ca class=\"rc-ge-btn rc-ge-btn-secondary\" href=\"\/id-kh\/policy\"\u003ePolicy\u003c\/a\u003e \u003ca class=\"rc-ge-btn rc-ge-btn-secondary\" href=\"\/id-kh\/pages\/time-document\"\u003eTime Document\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cscript\u003e\n(function() {\n  var RC_GE_CONFIG = {\n    jsonUrl: 'https:\/\/script.google.com\/macros\/s\/AKfycbzoUYUQY_BcMQEUOGhiQZ043MrmJ61PS8aJxMSB8JMfMiMuyB-xw3ndNOFYYsQic5A-Kg\/exec',\n    strings: {\n      timezonePrefix: 'Timezone:',\n      loading: 'Memuat waktu yang tersedia…',\n      empty: 'No class times are available at the moment. Please check back soon.',\n      error: 'We could not load the class schedule right now.',\n      localTimeSuffix: 'local time',\n      dayLabelFallback: 'Available times'\n    }\n  };\n\n  var timezoneEl = document.getElementById('rc-ge-timezone');\n  var outputEl = document.getElementById('rc-ge-output');\n\n  if (!timezoneEl || !outputEl) return;\n\n  var viewerTimeZone = '';\n  try {\n    viewerTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n  } catch (e) {\n    viewerTimeZone = '';\n  }\n\n  timezoneEl.textContent = RC_GE_CONFIG.strings.timezonePrefix + ' ' + (viewerTimeZone || 'Local time');\n  outputEl.className = 'rc-ge-times-loading';\n  outputEl.textContent = RC_GE_CONFIG.strings.loading;\n\n  function escapeHtml(str) {\n    return String(str).replace(\/[\u0026\u003c\u003e\"']\/g, function(match) {\n      return ({\n        '\u0026':'\u0026amp;',\n        '\u003c':'\u0026lt;',\n        '\u003e':'\u0026gt;',\n        '\"':'\u0026quot;',\n        \"'\":'\u0026#39;'\n      })[match];\n    });\n  }\n\n  function weekdayIndexFromDate(date) {\n    var weekday = new Intl.DateTimeFormat('en-US', {\n      weekday: 'short',\n      timeZone: viewerTimeZone || undefined\n    }).format(date);\n\n    var map = { Sun:0, Mon:1, Tue:2, Wed:3, Thu:4, Fri:5, Sat:6 };\n    return map[weekday] != null ? map[weekday] : date.getDay();\n  }\n\n  function weekdayNameFromDate(date) {\n    return new Intl.DateTimeFormat(undefined, {\n      weekday: 'long',\n      timeZone: viewerTimeZone || undefined\n    }).format(date);\n  }\n\n  function timeLabelFromDate(date) {\n    return new Intl.DateTimeFormat(undefined, {\n      hour: 'numeric',\n      minute: '2-digit',\n      timeZone: viewerTimeZone || undefined\n    }).format(date);\n  }\n\n  function minuteValueFromDate(date) {\n    var parts = new Intl.DateTimeFormat('en-GB', {\n      hour: '2-digit',\n      minute: '2-digit',\n      hourCycle: 'h23',\n      timeZone: viewerTimeZone || undefined\n    }).formatToParts(date);\n\n    var hour = 0;\n    var minute = 0;\n\n    for (var i = 0; i \u003c parts.length; i++) {\n      if (parts[i].type === 'hour') hour = parseInt(parts[i].value, 10) || 0;\n      if (parts[i].type === 'minute') minute = parseInt(parts[i].value, 10) || 0;\n    }\n\n    return (hour * 60) + minute;\n  }\n\n  function groupByWeekday(slots) {\n    var groups = {};\n    var ordered = [];\n\n    for (var i = 0; i \u003c slots.length; i++) {\n      var date = new Date(slots[i].iso);\n      if (isNaN(date.getTime())) continue;\n\n      var weekdayIndex = weekdayIndexFromDate(date);\n      var weekdayName = weekdayNameFromDate(date);\n      var timeLabel = timeLabelFromDate(date);\n      var uniqueKey = weekdayIndex + '|' + timeLabel;\n\n      if (!groups[weekdayIndex]) {\n        groups[weekdayIndex] = {\n          weekdayIndex: weekdayIndex,\n          weekdayName: weekdayName,\n          items: []\n        };\n        ordered.push(groups[weekdayIndex]);\n      }\n\n      var exists = false;\n      for (var j = 0; j \u003c groups[weekdayIndex].items.length; j++) {\n        if (groups[weekdayIndex].items[j].uniqueKey === uniqueKey) {\n          exists = true;\n          break;\n        }\n      }\n\n      if (!exists) {\n        groups[weekdayIndex].items.push({\n          uniqueKey: uniqueKey,\n          timeLabel: timeLabel,\n          minuteValue: minuteValueFromDate(date)\n        });\n      }\n    }\n\n    ordered.sort(function(a, b) {\n      return a.weekdayIndex - b.weekdayIndex;\n    });\n\n    for (var k = 0; k \u003c ordered.length; k++) {\n      ordered[k].items.sort(function(a, b) {\n        return a.minuteValue - b.minuteValue;\n      });\n    }\n\n    return ordered;\n  }\n\n  function renderSchedule(slots) {\n    if (!slots || !slots.length) {\n      outputEl.className = 'rc-ge-times-empty';\n      outputEl.textContent = RC_GE_CONFIG.strings.empty;\n      return;\n    }\n\n    var groups = groupByWeekday(slots);\n    var html = '\u003cdiv class=\"rc-ge-times-grid\"\u003e';\n\n    for (var i = 0; i \u003c groups.length; i++) {\n      html += '\u003cdiv class=\"rc-ge-day\"\u003e';\n      html += '\u003ch4\u003e' + escapeHtml(groups[i].weekdayName || RC_GE_CONFIG.strings.dayLabelFallback) + '\u003c\/h4\u003e';\n      html += '\u003cul class=\"rc-ge-slots\"\u003e';\n\n      for (var j = 0; j \u003c groups[i].items.length; j++) {\n        html += '\u003cli\u003e' + escapeHtml(groups[i].items[j].timeLabel) + ' \u003cspan style=\"color:#6b7280;\"\u003e(' + escapeHtml(RC_GE_CONFIG.strings.localTimeSuffix) + ')\u003c\/span\u003e\u003c\/li\u003e';\n      }\n\n      html += '\u003c\/ul\u003e';\n      html += '\u003c\/div\u003e';\n    }\n\n    html += '\u003c\/div\u003e';\n    outputEl.className = '';\n    outputEl.innerHTML = html;\n  }\n\n  function renderError(message) {\n    outputEl.className = 'rc-ge-times-error';\n    outputEl.textContent = message || RC_GE_CONFIG.strings.error;\n  }\n\n  window.rcGeScheduleCallback = function(data) {\n    try {\n      if (!data || !data.ok || !data.slots) {\n        throw new Error(data \u0026\u0026 data.error ? data.error : RC_GE_CONFIG.strings.error);\n      }\n      renderSchedule(data.slots);\n    } catch (err) {\n      renderError(err \u0026\u0026 err.message ? err.message : RC_GE_CONFIG.strings.error);\n    }\n  };\n\n  function loadSchedule() {\n    var url = RC_GE_CONFIG.jsonUrl\n      + '?callback=rcGeScheduleCallback\u0026_rcv='\n      + Date.now();\n\n    var script = document.createElement('script');\n    script.src = url;\n    script.async = true;\n    script.onerror = function() {\n      renderError('Load failed');\n    };\n    document.head.appendChild(script);\n  }\n\n  loadSchedule();\n})();\n\u003c\/script\u003e\n","brand":"rosscline.com","offers":[{"title":"Default Title","offer_id":42906910785584,"sku":null,"price":144000.0,"currency_code":"KHR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0567\/6148\/3312\/files\/ross-cline-pay-as-you-go-four-classes-subscription-offer-square_b2e38195-6693-47aa-99e2-df63aa298e77.jpg?v=1778590988","url":"https:\/\/rosscline.com\/id-kh\/products\/berlangganan-bayar-sesuai-pemakaian","provider":"rosscline.com","version":"1.0","type":"link"}