{
  "version": 3,
  "sources": ["/cdn/shop/t/19/assets/pdp-reviews-pagination.js?cb=sec-h1-sanitize-20260529"],
  "sourcesContent": ["/* ============================================================\n   PDP REVIEWS \u2014 JM Live Fetch Paginate (Tur 128 + Tur 129 + Tur 130 + Tur 132)\n   ------------------------------------------------------------\n   Pure browser fetch + DOM build. NO Worker, NO auth, NO CORS proxy.\n\n   Tur 132 (25 May 2026) \u2014 Hakan Bey: \"Lightbox'ta yorumlar\u0131 gezdim\n   diye pdp sayfas\u0131nda neden t\u00FCm yorumlar\u0131 g\u00F6z\u00FCk\u00FCr hale getirdin?\n   orada daha fazla g\u00F6ster'e basmas\u0131 gerekirdi. neden ayn\u0131 ak\u0131\u015F\u0131\n   orada uygulad\u0131n?\"\n\n   Channel separation: lightbox arrow-next now uses fetchNextSilent\n   which returns raw JM review objects WITHOUT mutating PDP DOM.\n   Two independent page cursors:\n     - state.currentPage  \u2190 DOM-coupled (PDP \"Daha Fazla G\u00F6ster\" button)\n     - state.silentPage   \u2190 lightbox-only (no DOM append, no renderedUuids mutation)\n   Lightbox stores raw reviews in its own Map (uuid keyed). PDP button\n   keeps its previous behavior; clicking it after lightbox usage will\n   still append in page order \u2014 uuid dedup prevents double-render.\n   Shared helper rawReviewToLightboxMeta(review) mirrors readMeta()\n   output shape so lightbox renders raw objects identically to DOM rows.\n\n   Tur 130 (25 May 2026) \u2014 Hakan Bey: \"lightbox a\u00E7\u0131ld\u0131\u011F\u0131nda sol \u00FCstte\n   X/11 yazmas\u0131n\u0131 beklerdim. 5. resimden sonra ileri bast\u0131\u011F\u0131mda 6/10\n   yaz\u0131yor bu do\u011Fru de\u011Fil. Kullan\u0131c\u0131 orada ka\u00E7 resim oldu\u011Funu g\u00F6rmeli,\n   5 ten sonra fetch yaparken bir LOADING (T\u00FCrk\u00E7esi Y\u00FCkleniyor yazmal\u0131)\n   g\u00F6sterimi yapsak iyi olur gibi? hatta pdp sayfas\u0131nda 'Daha Fazla\n   G\u00F6ster'e bast\u0131\u011F\u0131nda metin de\u011Fi\u015Fsin 'Y\u00FCkleniyor' yazs\u0131n, y\u00FCkleme\n   bitince yorumlar eklensin, daha ba\u015Fka fetch yap\u0131lacak page varsa\n   Daha Fazla G\u00F6ster'e geri d\u00F6ns\u00FCn\"\n\n   Tur 130 surface changes:\n     - state.totalCount  \u2190 button[data-total-count] = rating_count\n     - state.defaultBtnText  \u2190 capture original \"DAHA FAZLA G\u00D6STER\"\n     - state.loadingLabel  \u2190 button[data-i18n-loading] = \"Y\u00FCkleniyor\u2026\"\n     - loadNextPage(): btn.textContent toggles loading \u2194 default\n     - window.SantoPDPReviews.getTotalCount(sectionEl) \u2192 JM total\n\n   Tur 129 (25 May 2026) \u2014 Hakan Bey: \"resme t\u0131klay\u0131nca, a\u00E7\u0131lan\n   review gallery de, 5 resimden sonra fetch ederek devam etmesi\n   gerekiyordu. oraya etki vermi\u015Fsin.\"\n\n   Public API for lightbox (`pdp-review-lightbox.js`) added to drive\n   the same fetch + render path when the user navigates past the\n   last loaded review via the lightbox side arrows.\n\n     window.SantoPDPReviews = {\n       hasMore(sectionEl) \u2192 bool                  // PDP-button channel\n       loadMore(sectionEl) \u2192 Promise<{appendedCount, currentPage,\n                                       totalPages, exhausted}>\n       isLoading(sectionEl) \u2192 bool\n       getTotalCount(sectionEl) \u2192 int             // Tur 130 (JM rating_count)\n       hasMoreSilent(sectionEl) \u2192 bool            // Tur 132 (lightbox channel)\n       fetchNextSilent(sectionEl) \u2192 Promise<{reviews, silentPage,\n                                              totalPages, exhausted}>\n       rawReviewToLightboxMeta(review) \u2192 meta     // Tur 132 shared helper\n     }\n\n   Section state lives in a WeakMap keyed on the section element\n   (GC-safe \u2014 section removed from DOM \u2192 entry collected).\n\n   Tur 128 (25 May 2026) \u2014 Hakan Bey: \"sitede 8 \u00FCr\u00FCn var, daha\n   ba\u015Fka \u00FCr\u00FCnlerde ekleyebiliriz. bunun s\u00FCrd\u00FCr\u00FClebilir olmas\u0131\n   gerek anl\u0131yor musun? server side jm cache zaten mevcutta 5\n   yorumu g\u00F6steriyor de\u011Fil mi? hepsini otomatik neden cachelemiyor.\n   kendi widget'\u0131 olsayd\u0131 nas\u0131l olacakt\u0131? onun yapt\u0131\u011F\u0131n\u0131 biz neden\n   yapam\u0131yoruz sorun ne\"\n\n   PROBE-verified endpoint (25 May 2026):\n     URL: https://api.judge.me/reviews/reviews_for_widget\n     Params: url, shop_domain, platform=shopify, product_id, per_page, page\n     CORS: Access-Control-Allow-Origin: *  (open, no Origin restriction)\n     Auth: none (public widget endpoint \u2014 same one jdgm widget uses)\n     Cache: Cache-Control max-age=1200 (20-min JM server-side cache)\n     Response: {reviews[], pagination:{total_pages,current_page,per_page}, ...}\n     Scales N products natively (one endpoint, product_id param)\n     Hepsiburada-ready: same endpoint, source-agnostic data layer\n\n   Markup contract (sections/product-reviews.liquid):\n     section.pdp-reviews\n       .pdp-reviews__list[data-reviews-list]\n         article.pdp-review-card[data-review-row]  (server-renders first 5)\n       button.pdp-reviews__show-more[data-reviews-show-more]\n         [data-product-id]        = {{ product.id }}\n         [data-shop-domain]       = {{ shop.permanent_domain }}\n         [data-i18n-verified]     = locale string (no placeholder)\n         [data-i18n-source-from]  = locale string with __SOURCE__ sentinel\n         [data-i18n-photos-aria]  = locale string with __COUNT__  sentinel\n         [data-i18n-photo-alt]    = locale string (no placeholder)\n         [data-i18n-open-aria]    = locale string with __NAME__   sentinel\n       (Sentinels avoid Liquid {{ }} parser conflict inside t: 'string'.)\n\n   Page bookkeeping:\n     state.currentPage = floor(rendered_count / 5), min 1\n     onClick: page = currentPage + 1 \u2192 fetch, append, increment\n     state.totalPages from API response (refreshed each fetch)\n     Hide button when currentPage >= totalPages\n\n   Dedupe: review uuid tracked in Set; widget_data overlap (rare \u2014\n     widget_data normally renders 5) is silently skipped, with\n     auto-advance if ALL fetched are duplicates.\n\n   Body markers (source-agnostic for future Hepsiburada):\n     [kaynak:X]            \u2192 r_source override\n     [tarih:YYYY-MM-DD]    \u2192 r_created_iso/display override\n   Both stripped from body_html before render (regex).\n\n   Lightbox JS (pdp-review-lightbox.js) queries [data-review-row]\n   at runtime \u2192 newly-fetched cards integrate automatically.\n   ============================================================ */\n(function () {\n  \"use strict\";\n\n  var API_URL = \"https://api.judge.me/reviews/reviews_for_widget\";\n  var PAGE_SIZE = 5;\n\n  // WeakMap keyed on the section element. Per-section state (productId,\n  // shopDomain, i18n bindings, renderedUuids, paging cursors) lives here so\n  // the lightbox (separate IIFE) can call loadMore(sectionEl) from outside\n  // this closure. GC-safe \u2014 section removed from DOM \u2192 entry collected.\n  var sectionState = new WeakMap();\n\n  function init() {\n    document.querySelectorAll(\".pdp-reviews\").forEach(initSection);\n  }\n\n  function initSection(section) {\n    var btn = section.querySelector(\"[data-reviews-show-more]\");\n    if (!btn) return;\n    var listEl = section.querySelector(\"[data-reviews-list]\");\n    if (!listEl) return;\n\n    var productId = btn.getAttribute(\"data-product-id\");\n    var shopDomain = btn.getAttribute(\"data-shop-domain\");\n    if (!productId || !shopDomain) {\n      btn.style.display = \"none\";\n      return;\n    }\n\n    var i18n = {\n      verified: btn.getAttribute(\"data-i18n-verified\") || \"\",\n      sourceFrom: btn.getAttribute(\"data-i18n-source-from\") || \"__SOURCE__\",\n      photosAria: btn.getAttribute(\"data-i18n-photos-aria\") || \"\",\n      photoAlt: btn.getAttribute(\"data-i18n-photo-alt\") || \"\",\n      openAria: btn.getAttribute(\"data-i18n-open-aria\") || \"\",\n    };\n\n    // Collect already-rendered uuid attrs (server-render uses numeric forloop.index,\n    // not uuid \u2014 so this Set will usually be empty initially). Safety net for\n    // future widget_data schemas that emit uuid.\n    var renderedUuids = new Set();\n    listEl.querySelectorAll(\"article[data-review-row]\").forEach(function (card) {\n      var uuid = card.getAttribute(\"data-review-uuid\");\n      if (uuid) renderedUuids.add(uuid);\n    });\n\n    var initialCount = listEl.querySelectorAll(\"article[data-review-row]\").length;\n\n    // Tur 130 \u2014 totalCount comes from rating_count (JM total reviews\n    // for this product); used by lightbox to show \"X / N\" where N is\n    // the true total, not the DOM row count.\n    var totalCount = parseInt(btn.getAttribute(\"data-total-count\"), 10) || 0;\n\n    // Tur 130 \u2014 capture original button text (locale-driven, e.g.\n    // \"DAHA FAZLA G\u00D6STER\") and the loading replacement\n    // (\"Y\u00FCkleniyor\u2026\"). loadNextPage() toggles between them.\n    var defaultBtnText = (btn.textContent || \"\").trim();\n    var loadingLabel = btn.getAttribute(\"data-i18n-loading\") || \"Y\u00FCkleniyor\u2026\";\n\n    var state = {\n      section: section,\n      btn: btn,\n      listEl: listEl,\n      productId: productId,\n      shopDomain: shopDomain,\n      i18n: i18n,\n      renderedUuids: renderedUuids,\n      currentPage: Math.max(Math.floor(initialCount / PAGE_SIZE), 1),\n      // Tur 132 \u2014 silentPage is the lightbox-only cursor. Initialised to\n      // currentPage (whatever the server-side render covered). Lightbox\n      // silent fetches advance this independently of the PDP button.\n      silentPage: Math.max(Math.floor(initialCount / PAGE_SIZE), 1),\n      totalPages: Infinity,\n      totalCount: totalCount,\n      defaultBtnText: defaultBtnText,\n      loadingLabel: loadingLabel,\n      loading: false,\n    };\n\n    sectionState.set(section, state);\n\n    btn.addEventListener(\"click\", function (event) {\n      event.preventDefault();\n      // Fire-and-forget; loadMore handles loading/exhausted guards internally.\n      loadMore(state);\n    });\n  }\n\n  // Promise-returning facade. Two callers:\n  //   1) \"Daha Fazla G\u00F6ster\" click \u2192 fire-and-forget (button shows next 5)\n  //   2) Lightbox arrow next at last DOM review \u2192 awaits the new card and\n  //      advances reviewIndex past the previous last review (Tur 129)\n  function loadMore(state) {\n    if (!state) {\n      return Promise.resolve({ appendedCount: 0, currentPage: 0, totalPages: 0, exhausted: true });\n    }\n    if (state.loading) {\n      return Promise.resolve({\n        appendedCount: 0,\n        currentPage: state.currentPage,\n        totalPages: state.totalPages,\n        exhausted: false,\n      });\n    }\n    if (state.currentPage >= state.totalPages) {\n      state.btn.style.display = \"none\";\n      return Promise.resolve({\n        appendedCount: 0,\n        currentPage: state.currentPage,\n        totalPages: state.totalPages,\n        exhausted: true,\n      });\n    }\n    return loadNextPage(state);\n  }\n\n  // \u2500\u2500\u2500 H2 (29 May 2026): shared fetch + parse for one review page \u2500\u2500\u2500\n  // loadNextPage() (DOM-coupled, PDP button) and fetchNextSilent() (lightbox-\n  // only, no DOM) previously duplicated the exact same network call: identical\n  // URLSearchParams, identical fetch() options, identical res.ok guard and JSON\n  // parse, identical current_page/total_pages defaulting. Extracted here.\n  // Behaviour-identical: rejects on HTTP error (callers keep their own .catch),\n  // returns {reviews, currentPage, totalPages} with the same fallbacks as\n  // before (current_page \u2192 pageNum, total_pages \u2192 currentPage). NO side\n  // effects \u2014 button text / state cursors stay in the callers.\n  function fetchReviewPage(state, pageNum) {\n    var params = new URLSearchParams({\n      url: state.shopDomain,\n      shop_domain: state.shopDomain,\n      platform: \"shopify\",\n      product_id: state.productId,\n      per_page: String(PAGE_SIZE),\n      page: String(pageNum),\n    });\n\n    return fetch(API_URL + \"?\" + params.toString(), {\n      credentials: \"omit\",\n      cache: \"default\",\n    })\n      .then(function (res) {\n        if (!res.ok) throw new Error(\"HTTP \" + res.status);\n        return res.json();\n      })\n      .then(function (data) {\n        var reviews = data && Array.isArray(data.reviews) ? data.reviews : [];\n        var pagination = (data && data.pagination) || {};\n        var currentPage = parseInt(pagination.current_page, 10) || pageNum;\n        var totalPages = parseInt(pagination.total_pages, 10) || currentPage;\n        return { reviews: reviews, currentPage: currentPage, totalPages: totalPages };\n      });\n  }\n\n  function loadNextPage(state) {\n    state.loading = true;\n    state.btn.disabled = true;\n    state.btn.setAttribute(\"aria-busy\", \"true\");\n    // Tur 130 \u2014 button text \"DAHA FAZLA G\u00D6STER\" \u2192 \"Y\u00FCkleniyor\u2026\" while\n    // fetch is in flight. Restored in both .then() and .catch() below.\n    state.btn.textContent = state.loadingLabel;\n\n    var nextPage = state.currentPage + 1;\n\n    return fetchReviewPage(state, nextPage)\n      .then(function (parsed) {\n        var reviews = parsed.reviews;\n        var currentPage = parsed.currentPage;\n        var totalPages = parsed.totalPages;\n\n        var fragment = document.createDocumentFragment();\n        var appended = 0;\n        reviews.forEach(function (review) {\n          var uuid = String((review && review.uuid) || \"\");\n          if (uuid && state.renderedUuids.has(uuid)) return;\n          var card = buildCard(review, state.i18n);\n          if (card) {\n            fragment.appendChild(card);\n            if (uuid) state.renderedUuids.add(uuid);\n            appended++;\n          }\n        });\n        state.listEl.insertBefore(fragment, state.btn);\n\n        state.currentPage = currentPage;\n        state.totalPages = totalPages;\n        state.loading = false;\n        state.btn.disabled = false;\n        state.btn.removeAttribute(\"aria-busy\");\n        // Tur 130 \u2014 restore original \"DAHA FAZLA G\u00D6STER\" text.\n        state.btn.textContent = state.defaultBtnText;\n\n        // If this page was ALL-duplicates AND more pages exist, auto-advance.\n        // Return the inner promise so the caller sees the final accumulated result.\n        if (appended === 0 && currentPage < totalPages) {\n          return loadNextPage(state);\n        }\n        if (currentPage >= totalPages) {\n          state.btn.style.display = \"none\";\n        }\n        return {\n          appendedCount: appended,\n          currentPage: currentPage,\n          totalPages: totalPages,\n          exhausted: currentPage >= totalPages,\n        };\n      })\n      .catch(function (err) {\n        state.loading = false;\n        state.btn.disabled = false;\n        state.btn.removeAttribute(\"aria-busy\");\n        // Tur 130 \u2014 restore original \"DAHA FAZLA G\u00D6STER\" text on failure\n        // so the user can retry (button stays visible since exhausted=false).\n        state.btn.textContent = state.defaultBtnText;\n        if (window.console && console.warn) {\n          console.warn(\"[pdp-reviews] fetch failed:\", err);\n        }\n        return {\n          appendedCount: 0,\n          currentPage: state.currentPage,\n          totalPages: state.totalPages,\n          exhausted: false,\n          error: err,\n        };\n      });\n  }\n\n  // \u2500\u2500\u2500 Tur 132: Silent fetch channel (lightbox-only) \u2500\u2500\u2500\n  // Mirrors loadNextPage's network shape but DOES NOT touch DOM,\n  // does NOT mutate renderedUuids, does NOT toggle the PDP button\n  // text/disabled state. Returns raw JM review objects so the\n  // lightbox can render them via the shared rawReviewToLightboxMeta\n  // helper. silentPage is bumped independently of currentPage.\n  function fetchNextSilent(state) {\n    if (!state) {\n      return Promise.resolve({\n        reviews: [],\n        silentPage: 0,\n        totalPages: 0,\n        exhausted: true,\n      });\n    }\n    if (state.silentPage >= state.totalPages) {\n      return Promise.resolve({\n        reviews: [],\n        silentPage: state.silentPage,\n        totalPages: state.totalPages,\n        exhausted: true,\n      });\n    }\n\n    var nextPage = state.silentPage + 1;\n\n    return fetchReviewPage(state, nextPage)\n      .then(function (parsed) {\n        var reviews = parsed.reviews;\n        var currentPage = parsed.currentPage;\n        var totalPages = parsed.totalPages;\n\n        state.silentPage = currentPage;\n        // totalPages is shared across both channels \u2014 refresh whichever value\n        // we last learned. Math.max guards against a stale Infinity init.\n        if (isFinite(totalPages)) {\n          state.totalPages = isFinite(state.totalPages)\n            ? Math.max(state.totalPages, totalPages)\n            : totalPages;\n        }\n\n        return {\n          reviews: reviews,\n          silentPage: currentPage,\n          totalPages: totalPages,\n          exhausted: currentPage >= totalPages,\n        };\n      })\n      .catch(function (err) {\n        if (window.console && console.warn) {\n          console.warn(\"[pdp-reviews] silent fetch failed:\", err);\n        }\n        return {\n          reviews: [],\n          silentPage: state.silentPage,\n          totalPages: state.totalPages,\n          exhausted: false,\n          error: err,\n        };\n      });\n  }\n\n  // \u2500\u2500\u2500 H1 (29 May 2026): shared review-meta derivation \u2500\u2500\u2500\n  // Single source of truth for the raw-JM-review \u2192 derived-fields step that\n  // buildCard() and rawReviewToLightboxMeta() previously duplicated verbatim.\n  // Computes EVERY derived value both callers need (marker parsing for\n  // [tarih:YYYY-MM-DD] / [kaynak:X], source casing, date formatting, photo URL\n  // selection, initials, hasText/hasPhotos). Behaviour-identical: same field\n  // formulas, same order, same regexes \u2014 extraction only, no logic change.\n  // Consumers pick the variant they need (e.g. title raw vs titleClean trimmed,\n  // bodyHtmlClean only used by the DOM render path).\n  function deriveReviewMeta(review) {\n    var uuid = String(review.uuid || \"\");\n    var name = (review.reviewer_name || \"Anonim\").toString();\n    var rating = parseInt(review.rating, 10) || 0;\n    var bodyHtmlRaw = (review.body_html || \"\").toString();\n    var title = (review.title || \"\").toString();\n    var createdAtIso = (review.created_at || \"\").toString();\n    var verified = !!review.verified_buyer;\n    var sourceFromField = (review.source || \"\").toString();\n    var pictures = Array.isArray(review.pictures_urls) ? review.pictures_urls : [];\n\n    // Derive plain text from body_html (JM widget endpoint sets body=null)\n    var bodyPlainRaw = stripHtmlToText(bodyHtmlRaw);\n\n    // [tarih:YYYY-MM-DD] marker overrides created_at\n    var dateIso = createdAtIso ? createdAtIso.slice(0, 10) : \"\";\n    var tarihMatch = bodyPlainRaw.match(/\\[tarih:([0-9]{4}-[0-9]{2}-[0-9]{2})\\]/);\n    if (tarihMatch) {\n      dateIso = tarihMatch[1];\n    }\n\n    // [kaynak:X] marker overrides empty source (Tur 127 migration pattern)\n    var source = sourceFromField;\n    if (!source) {\n      var kaynakMatch = bodyPlainRaw.match(/\\[kaynak:([^\\]]+)\\]/);\n      if (kaynakMatch) {\n        source = kaynakMatch[1].trim();\n      }\n    }\n\n    var dateDisplay = formatDateTR(dateIso);\n\n    // Strip BOTH markers from body before render\n    var markerRegex = /\\[(kaynak|tarih):[^\\]]+\\]/g;\n    var bodyHtmlClean = bodyHtmlRaw.replace(markerRegex, \"\").trim();\n    var bodyPlainClean = bodyPlainRaw.replace(markerRegex, \"\").trim();\n    var titleClean = title.trim();\n\n    var hasText = !!(bodyPlainClean || titleClean);\n\n    // Full-size picture URLs for lightbox (mirror Liquid r_photos_json)\n    var photosFull = pictures.map(pickPictureUrl).filter(Boolean);\n    var hasPhotos = photosFull.length > 0;\n\n    var initials = computeInitials(name);\n\n    return {\n      uuid: uuid,\n      name: name,\n      rating: rating,\n      title: title,\n      titleClean: titleClean,\n      bodyHtmlClean: bodyHtmlClean,\n      bodyPlainClean: bodyPlainClean,\n      dateIso: dateIso,\n      dateDisplay: dateDisplay,\n      source: source,\n      verified: verified,\n      pictures: pictures,\n      photosFull: photosFull,\n      hasPhotos: hasPhotos,\n      hasText: hasText,\n      initials: initials,\n    };\n  }\n\n  // \u2500\u2500\u2500 Tur 132: Shared meta extractor \u2500\u2500\u2500\n  // Mirrors readMeta() in pdp-review-lightbox.js but takes a raw JM\n  // review object (not a DOM row). Single source of truth for marker\n  // parsing ([tarih:YYYY-MM-DD], [kaynak:X]), source casing, date\n  // formatting, photo URL selection, initials.\n  // H1: now thin wrapper over deriveReviewMeta \u2014 same returned shape\n  // ({photos, body, title, name, initials, date, rating, source, verified,\n  // hasPhotos, hasText}); title is the TRIMMED variant exactly as before.\n  function rawReviewToLightboxMeta(review) {\n    if (!review) return null;\n    var m = deriveReviewMeta(review);\n    return {\n      photos: m.photosFull,\n      body: m.bodyPlainClean,\n      title: m.titleClean,\n      name: m.name,\n      initials: m.initials,\n      date: m.dateDisplay,\n      rating: m.rating,\n      source: m.source,\n      verified: m.verified,\n      hasPhotos: m.hasPhotos,\n      hasText: m.hasText,\n    };\n  }\n\n  function buildCard(review, i18n) {\n    if (!review) return null;\n\n    // H1: derive all card fields through the shared helper. Locals below\n    // alias the exact values the DOM-build code referenced before, so the\n    // produced DOM (attributes, gating, text) is byte-identical.\n    var m = deriveReviewMeta(review);\n    var uuid = m.uuid;\n    var name = m.name;\n    var rating = m.rating;\n    var title = m.title;\n    var verified = m.verified;\n    var source = m.source;\n    var pictures = m.pictures;\n    var dateDisplay = m.dateDisplay;\n    var dateIso = m.dateIso;\n    var bodyHtmlClean = m.bodyHtmlClean;\n    var bodyPlainClean = m.bodyPlainClean;\n    var hasText = m.hasText;\n    var photosFull = m.photosFull;\n    var hasPhotos = m.hasPhotos;\n    var initials = m.initials;\n\n    // \u2500\u2500 ARTICLE WRAPPER \u2500\u2500\n    var article = document.createElement(\"article\");\n    article.className = \"pdp-review-card\";\n    article.setAttribute(\"data-review-row\", \"\");\n    article.setAttribute(\"data-review-id\", uuid);\n    article.setAttribute(\"data-review-uuid\", uuid);\n    article.setAttribute(\"data-review-rating\", String(rating));\n    article.setAttribute(\"data-review-has-photos\", hasPhotos ? \"true\" : \"false\");\n    article.setAttribute(\"data-review-has-text\", hasText ? \"true\" : \"false\");\n    article.setAttribute(\"data-review-date-iso\", dateIso);\n    article.setAttribute(\"data-review-photos\", JSON.stringify(photosFull));\n    article.setAttribute(\"data-review-photo-count\", String(pictures.length));\n    article.setAttribute(\"data-review-body\", bodyPlainClean);\n    article.setAttribute(\"data-review-title\", title);\n    article.setAttribute(\"data-review-name\", name);\n    article.setAttribute(\"data-review-initials\", initials);\n    article.setAttribute(\"data-review-date\", dateDisplay);\n    article.setAttribute(\"data-review-source\", source);\n    article.setAttribute(\"data-review-verified\", verified ? \"true\" : \"false\");\n\n    // \u2500\u2500 KEYBOARD/AT OPEN BUTTON \u2500\u2500\n    // Mirrors the server-rendered markup: native <button> with content-derived\n    // name (no aria-label, no role override) so dynamically loaded reviews keep\n    // the same a11y contract \u2014 Lighthouse aria-allowed-role +\n    // label-content-name-mismatch fix (22 Haz 2026).\n    var openBtn = document.createElement(\"button\");\n    openBtn.type = \"button\";\n    openBtn.className = \"pdp-review-card__open visually-hidden\";\n    openBtn.setAttribute(\"data-review-open\", \"\");\n    openBtn.textContent = substitute(i18n.openAria, { name: name });\n    article.appendChild(openBtn);\n\n    // \u2500\u2500 LEFT PANEL (~33%) \u2500\u2500\n    var left = document.createElement(\"div\");\n    left.className = \"pdp-review-card__left\";\n\n    var namerow = document.createElement(\"div\");\n    namerow.className = \"pdp-review-card__namerow\";\n    var nameP = document.createElement(\"p\");\n    nameP.className = \"pdp-review-card__name\";\n    nameP.textContent = name;\n    var dateSpan = document.createElement(\"span\");\n    dateSpan.className = \"pdp-review-card__date\";\n    dateSpan.textContent = dateDisplay;\n    namerow.appendChild(nameP);\n    namerow.appendChild(dateSpan);\n    left.appendChild(namerow);\n\n    if (verified) {\n      var verifiedP = document.createElement(\"p\");\n      verifiedP.className = \"pdp-review-card__verified\";\n      verifiedP.textContent = i18n.verified;\n      left.appendChild(verifiedP);\n    }\n\n    if (source) {\n      var sourceDisplay = capitalize(source);\n      var sourceP = document.createElement(\"p\");\n      sourceP.className = \"pdp-review-card__source\";\n      sourceP.setAttribute(\"data-source\", source);\n      sourceP.textContent = substitute(i18n.sourceFrom, { source: sourceDisplay });\n      left.appendChild(sourceP);\n    }\n\n    article.appendChild(left);\n\n    // \u2500\u2500 RIGHT PANEL (~67%) \u2500\u2500\n    var right = document.createElement(\"div\");\n    right.className = \"pdp-review-card__right\";\n\n    var header = document.createElement(\"div\");\n    header.className = \"pdp-review-card__header\";\n    var stars = document.createElement(\"div\");\n    stars.className = \"pdp-review-card__stars\";\n    stars.setAttribute(\"aria-label\", rating + \" / 5\");\n    for (var i = 1; i <= 5; i++) {\n      var star = document.createElement(\"span\");\n      star.className =\n        \"pdp-review-card__star\" + (i <= rating ? \" pdp-review-card__star--filled\" : \"\");\n      star.textContent = \"\u2605\";\n      stars.appendChild(star);\n    }\n    header.appendChild(stars);\n    right.appendChild(header);\n\n    if (title) {\n      var titleP = document.createElement(\"p\");\n      titleP.className = \"pdp-review-card__title\";\n      titleP.textContent = title;\n      right.appendChild(titleP);\n    }\n\n    if (bodyHtmlClean) {\n      var bodyDiv = document.createElement(\"div\");\n      bodyDiv.className = \"pdp-review-card__body pdp-review-card__body--html\";\n      bodyDiv.innerHTML = sanitizeReviewHtml(bodyHtmlClean); // SEC-H1: allowlist-sanitize\n      right.appendChild(bodyDiv);\n    }\n\n    if (hasPhotos) {\n      var photosDiv = document.createElement(\"div\");\n      photosDiv.className = \"pdp-review-card__photos\";\n      photosDiv.setAttribute(\n        \"aria-label\",\n        substitute(i18n.photosAria, { count: String(pictures.length) }),\n      );\n      pictures.forEach(function (pic, idx) {\n        var thumb = pickPictureThumb(pic);\n        if (!thumb) return;\n        var photoBtn = document.createElement(\"button\");\n        photoBtn.type = \"button\";\n        photoBtn.className = \"pdp-review-card__photo\";\n        photoBtn.setAttribute(\"data-review-photo-trigger\", \"\");\n        photoBtn.setAttribute(\"data-photo-index\", String(idx));\n        photoBtn.setAttribute(\"aria-label\", i18n.photoAlt);\n        var img = document.createElement(\"img\");\n        img.src = thumb;\n        img.alt = i18n.photoAlt;\n        img.loading = \"lazy\";\n        img.decoding = \"async\";\n        img.width = 80;\n        img.height = 80;\n        photoBtn.appendChild(img);\n        photosDiv.appendChild(photoBtn);\n      });\n      right.appendChild(photosDiv);\n    }\n\n    article.appendChild(right);\n    return article;\n  }\n\n  // \u2500\u2500 HELPERS \u2500\u2500\n\n  function pickPictureUrl(pic) {\n    if (!pic) return \"\";\n    if (typeof pic === \"string\") return pic;\n    return pic.original || pic.huge || pic.compact || pic.small || \"\";\n  }\n\n  function pickPictureThumb(pic) {\n    if (!pic) return \"\";\n    if (typeof pic === \"string\") return pic;\n    return pic.small || pic.compact || pic.original || pic.huge || \"\";\n  }\n\n  function computeInitials(name) {\n    var parts = (name || \"\").trim().split(/\\s+/).slice(0, 2);\n    return parts\n      .map(function (p) {\n        return (p[0] || \"\").toUpperCase();\n      })\n      .join(\"\");\n  }\n\n  function capitalize(str) {\n    if (!str) return \"\";\n    return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n  }\n\n  function formatDateTR(iso) {\n    if (!iso) return \"\";\n    var m = iso.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})/);\n    if (!m) return iso;\n    return m[3] + \".\" + m[2] + \".\" + m[1];\n  }\n\n  function stripHtmlToText(html) {\n    if (!html) return \"\";\n    var tmp = document.createElement(\"div\");\n    tmp.innerHTML = html;\n    return tmp.textContent || tmp.innerText || \"\";\n  }\n\n  // Allowlist-sanitize Judge.me review body_html (SEC-H1 fix, 29 May 2026).\n  // Mirrors snippets/sanitize-review-html.liquid (server, first-5 reviews) \u2014\n  // keep the 9-tag allowlist in sync. Allowed: p br strong em b i ul ol li,\n  // NO attributes on any. Everything else is unwrapped to inert text.\n  function sanitizeReviewHtml(html) {\n    if (!html) return \"\";\n    var ALLOWED = { P: 1, BR: 1, STRONG: 1, EM: 1, B: 1, I: 1, UL: 1, OL: 1, LI: 1 };\n    // DOMParser builds an INERT document: no resource loads, no script/handler execution.\n    var doc = new DOMParser().parseFromString(html, \"text/html\");\n    function clean(node) {\n      var child = node.firstChild;\n      while (child) {\n        var next = child.nextSibling;\n        if (child.nodeType === 1) {\n          // element\n          if (ALLOWED[child.tagName]) {\n            // strip every attribute (href, on*, style, class, src, ...)\n            while (child.attributes.length) {\n              child.removeAttribute(child.attributes[0].name);\n            }\n            clean(child);\n          } else {\n            // disallowed element: clean its subtree, then unwrap (lift cleaned\n            // children up into the parent) so legitimate text is preserved.\n            clean(child);\n            while (child.firstChild) {\n              node.insertBefore(child.firstChild, child);\n            }\n            node.removeChild(child);\n          }\n        } else if (child.nodeType !== 3) {\n          // not a text node \u2192 drop (comments, etc.)\n          node.removeChild(child);\n        }\n        child = next;\n      }\n    }\n    clean(doc.body);\n    return doc.body.innerHTML;\n  }\n\n  // __VAR__ sentinel substitution. Liquid section emits __SOURCE__ / __COUNT__ /\n  // __NAME__ as t: filter parameters (avoids nested {{ }} parser conflict inside\n  // single-quoted string literals).\n  function substitute(template, vars) {\n    if (!template) return \"\";\n    return template.replace(/__([A-Z_]+)__/g, function (_, key) {\n      var lower = key.toLowerCase();\n      if (vars && Object.prototype.hasOwnProperty.call(vars, lower)) {\n        return String(vars[lower]);\n      }\n      return \"\";\n    });\n  }\n\n  // \u2500\u2500\u2500 Public API for lightbox integration (Tur 129 + Tur 132) \u2500\u2500\u2500\n  // Exposed on window so `pdp-review-lightbox.js` (separate IIFE) can drive\n  // the same fetch path when the user navigates past the last DOM-rendered\n  // review via the lightbox side arrows.\n  //\n  // Tur 132: Two channels are exposed. PDP \"Daha Fazla G\u00F6ster\" button uses\n  // hasMore + loadMore (DOM-coupled, appends cards). Lightbox arrow-next\n  // uses hasMoreSilent + fetchNextSilent (returns raw reviews; lightbox\n  // stores in its own Map). The DOM stays at the user-clicked size \u2014 PDP\n  // pagination is NOT silently consumed by lightbox gezinti.\n  window.SantoPDPReviews = {\n    hasMore: function (sectionEl) {\n      var s = sectionState.get(sectionEl);\n      if (!s) return false;\n      return s.currentPage < s.totalPages;\n    },\n    loadMore: function (sectionEl) {\n      var s = sectionState.get(sectionEl);\n      if (!s) {\n        return Promise.resolve({\n          appendedCount: 0,\n          currentPage: 0,\n          totalPages: 0,\n          exhausted: true,\n        });\n      }\n      return loadMore(s);\n    },\n    isLoading: function (sectionEl) {\n      var s = sectionState.get(sectionEl);\n      return s ? !!s.loading : false;\n    },\n    // Tur 130 \u2014 lightbox reads the true JM total (from rating_count) so the\n    // counter shows \"X / N\" with N stable across fetches, not the growing\n    // DOM card count (5 \u2192 10 \u2192 11).\n    getTotalCount: function (sectionEl) {\n      var s = sectionState.get(sectionEl);\n      return s ? s.totalCount || 0 : 0;\n    },\n    // Tur 132 \u2014 silent channel for lightbox. Independent silentPage cursor\n    // so lightbox advances do not consume PDP-button pages.\n    hasMoreSilent: function (sectionEl) {\n      var s = sectionState.get(sectionEl);\n      if (!s) return false;\n      return s.silentPage < s.totalPages;\n    },\n    fetchNextSilent: function (sectionEl) {\n      var s = sectionState.get(sectionEl);\n      if (!s) {\n        return Promise.resolve({\n          reviews: [],\n          silentPage: 0,\n          totalPages: 0,\n          exhausted: true,\n        });\n      }\n      return fetchNextSilent(s);\n    },\n    // Tur 132 \u2014 shared marker / shape extractor so the lightbox can render\n    // raw JM review objects with the same meta shape readMeta() produces\n    // for DOM-row inputs.\n    rawReviewToLightboxMeta: function (review) {\n      return rawReviewToLightboxMeta(review);\n    },\n  };\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
