import Foundation
let hobukeskusAppInjectedScript = #"""
(function() {
if (window.__hobukeskusIOSAppInstalled) return;
window.__hobukeskusIOSAppInstalled = true;
var searchDebounceTimer = null;
var latestSearchQuery = '';
var latestSearchRequestId = 0;
function injectAppStyles() {
if (document.getElementById('hobukeskus-ios-app-style')) return;
var style = document.createElement('style');
style.id = 'hobukeskus-ios-app-style';
style.innerHTML = `
body.hobukeskus-ios-app #masthead,
body.hobukeskus-ios-app .header-wrapper,
body.hobukeskus-ios-app .header-main,
body.hobukeskus-ios-app .header-bottom,
body.hobukeskus-ios-app .mobile-header,
body.hobukeskus-ios-app .stuck .header-main,
body.hobukeskus-ios-app .header-bg-container {
display: none !important;
height: 0 !important;
min-height: 0 !important;
max-height: 0 !important;
overflow: hidden !important;
}
body.hobukeskus-ios-app .header-wrapper.stuck,
body.hobukeskus-ios-app .sticky-wrapper {
display: none !important;
}
body.hobukeskus-ios-app {
padding-top: 0 !important;
}
/* App mode: never show WooCommerce/Flatsome sidebar filters on category/search pages */
body.hobukeskus-ios-app #shop-sidebar,
body.hobukeskus-ios-app .shop-sidebar,
body.hobukeskus-ios-app .woocommerce-sidebar,
body.hobukeskus-ios-app .category-sidebar,
body.hobukeskus-ios-app #secondary,
body.hobukeskus-ios-app .widget-area,
body.hobukeskus-ios-app .category-page-row > .large-3,
body.hobukeskus-ios-app .category-page-row > .medium-3,
body.hobukeskus-ios-app .category-page-row > .small-12.large-3 {
display: none !important;
}
body.hobukeskus-ios-app .category-page-row > .large-9,
body.hobukeskus-ios-app .category-page-row > .medium-9,
body.hobukeskus-ios-app .category-page-row > .small-12.large-9,
body.hobukeskus-ios-app .shop-container .large-9,
body.hobukeskus-ios-app .shop-container .medium-9 {
max-width: 100% !important;
flex-basis: 100% !important;
width: 100% !important;
}
#hobukeskus-app-search-overlay {
position: fixed !important;
z-index: 2147483647 !important;
inset: 0 !important;
background: rgba(255,255,255,0.96) !important;
backdrop-filter: blur(12px) !important;
-webkit-backdrop-filter: blur(12px) !important;
display: none;
padding: calc(env(safe-area-inset-top) + 28px) 18px 18px 18px !important;
box-sizing: border-box !important;
overflow-y: auto !important;
}
#hobukeskus-app-search-overlay.is-open {
display: block !important;
}
#hobukeskus-app-search-card {
background: #fff !important;
border-radius: 22px !important;
padding: 18px !important;
box-shadow: 0 12px 34px rgba(0,0,0,0.18) !important;
max-width: 680px !important;
margin: 0 auto !important;
box-sizing: border-box !important;
}
#hobukeskus-app-search-top {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
gap: 12px !important;
margin-bottom: 14px !important;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif !important;
}
#hobukeskus-app-search-title {
font-size: 18px !important;
font-weight: 700 !important;
color: #222 !important;
}
#hobukeskus-app-search-close {
appearance: none !important;
-webkit-appearance: none !important;
border: 0 !important;
background: #f1f1f1 !important;
color: #333 !important;
border-radius: 999px !important;
padding: 9px 13px !important;
font-size: 14px !important;
font-weight: 700 !important;
text-transform: uppercase !important;
}
#hobukeskus-app-search-form {
display: flex !important;
gap: 10px !important;
align-items: center !important;
margin: 0 !important;
}
#hobukeskus-app-search-input {
flex: 1 !important;
width: 100% !important;
height: 52px !important;
border: 1px solid #ddd !important;
background: #f6f6f6 !important;
border-radius: 14px !important;
padding: 0 14px !important;
font-size: 17px !important;
color: #222 !important;
box-sizing: border-box !important;
outline: none !important;
box-shadow: 0 3px 12px rgba(0,0,0,0.12) inset !important;
}
#hobukeskus-app-search-submit {
width: 58px !important;
min-width: 58px !important;
height: 52px !important;
border-radius: 14px !important;
border: 0 !important;
background: #ad74a2 !important;
color: #fff !important;
font-size: 24px !important;
font-weight: 800 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
#hobukeskus-app-search-results {
margin-top: 14px !important;
max-height: calc(100vh - 230px) !important;
overflow-y: auto !important;
-webkit-overflow-scrolling: touch !important;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif !important;
}
.hobukeskus-app-search-status {
padding: 14px 4px !important;
color: #777 !important;
font-size: 14px !important;
}
/* Guaven cloned results inside app overlay */
#hobukeskus-app-search-results .guaven_woos_suggestion {
display: block !important;
position: static !important;
width: 100% !important;
max-width: none !important;
min-width: 0 !important;
margin: 0 !important;
padding: 0 !important;
border: 0 !important;
box-shadow: none !important;
background: transparent !important;
opacity: 1 !important;
visibility: visible !important;
transform: none !important;
}
#hobukeskus-app-search-results ul {
list-style: none !important;
margin: 0 !important;
padding: 0 !important;
}
#hobukeskus-app-search-results .guaven_woos_suggestion_catul {
margin-bottom: 10px !important;
padding-bottom: 8px !important;
border-bottom: 1px solid rgba(0,0,0,0.08) !important;
}
#hobukeskus-app-search-results .guaven_woos_suggestion_catul:before {
content: "Kategooriad";
display: block !important;
margin: 16px 0 8px 0 !important;
font-size: 12px !important;
font-weight: 800 !important;
color: #999 !important;
text-transform: uppercase !important;
letter-spacing: 0.04em !important;
}
#hobukeskus-app-search-results .guaven_woos_final_results:before {
content: "Tooted";
display: block !important;
margin: 16px 0 8px 0 !important;
font-size: 12px !important;
font-weight: 800 !important;
color: #999 !important;
text-transform: uppercase !important;
letter-spacing: 0.04em !important;
}
#hobukeskus-app-search-results .guaven_woos_suggestion_list {
display: block !important;
width: 100% !important;
float: none !important;
clear: both !important;
padding: 10px 2px !important;
margin: 0 !important;
border-bottom: 1px solid rgba(0,0,0,0.08) !important;
background: transparent !important;
min-height: 0 !important;
overflow: hidden !important;
}
#hobukeskus-app-search-results .guaven_woos_suggestion_list a {
display: block !important;
text-decoration: none !important;
color: #2d405f !important;
}
#hobukeskus-app-search-results .guaven_woos_titlediv_cat {
font-size: 16px !important;
line-height: 1.3 !important;
font-weight: 600 !important;
color: #2d405f !important;
padding: 0 !important;
margin: 0 !important;
}
#hobukeskus-app-search-results .woos_cat_par_span {
color: #888 !important;
}
#hobukeskus-app-search-results .guaven_woos_final_results .guaven_woos_suggestion_list {
display: grid !important;
grid-template-columns: 58px 1fr !important;
gap: 12px !important;
align-items: center !important;
}
#hobukeskus-app-search-results .guaven_woos_div {
display: contents !important;
}
#hobukeskus-app-search-results .guaven_woos_img {
width: 58px !important;
height: 58px !important;
object-fit: contain !important;
border-radius: 10px !important;
background: #f7f7f7 !important;
grid-column: 1 !important;
}
#hobukeskus-app-search-results .guaven_woos_titlediv {
grid-column: 2 !important;
font-size: 15px !important;
line-height: 1.25 !important;
font-weight: 600 !important;
color: #2d405f !important;
margin: 0 !important;
padding: 0 !important;
}
#hobukeskus-app-search-results .guaven_woos_hidden,
#hobukeskus-app-search-results .guaven_woos_hidden_tags,
#hobukeskus-app-search-results .woos_sku {
display: none !important;
}
#hobukeskus-app-search-results .guaven_woos_showallli {
display: block !important;
padding: 14px 2px !important;
margin-top: 8px !important;
text-align: center !important;
background: #f6f6f6 !important;
border-radius: 14px !important;
font-weight: 700 !important;
color: #2d405f !important;
}
#hobukeskus-app-search-results .guaven_woos_showallli a {
color: #2d405f !important;
text-decoration: none !important;
}
/* App menu overlay */
#hobukeskus-app-menu-overlay {
position: fixed !important;
z-index: 2147483647 !important;
inset: 0 !important;
background: rgba(255,255,255,0.97) !important;
backdrop-filter: blur(12px) !important;
-webkit-backdrop-filter: blur(12px) !important;
display: none;
padding: calc(env(safe-area-inset-top) + 24px) 18px 18px 18px !important;
box-sizing: border-box !important;
overflow-y: auto !important;
-webkit-overflow-scrolling: touch !important;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif !important;
}
#hobukeskus-app-menu-overlay.is-open {
display: block !important;
}
#hobukeskus-app-menu-card {
background: #fff !important;
border-radius: 24px !important;
padding: 18px !important;
box-shadow: 0 12px 34px rgba(0,0,0,0.16) !important;
max-width: 720px !important;
margin: 0 auto 90px auto !important;
box-sizing: border-box !important;
}
#hobukeskus-app-menu-top {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
gap: 12px !important;
margin-bottom: 14px !important;
}
#hobukeskus-app-menu-title {
font-size: 21px !important;
font-weight: 700 !important;
color: #555 !important;
text-transform: uppercase !important;
letter-spacing: 0.03em !important;
}
#hobukeskus-app-menu-close {
appearance: none !important;
-webkit-appearance: none !important;
border: 0 !important;
background: #f1f1f1 !important;
color: #333 !important;
border-radius: 999px !important;
padding: 10px 14px !important;
font-size: 14px !important;
font-weight: 800 !important;
text-transform: uppercase !important;
}
#hobukeskus-app-menu-status {
padding: 14px 2px !important;
color: #777 !important;
font-size: 14px !important;
}
.hbk-app-menu-section {
border-bottom: 1px solid rgba(0,0,0,0.10) !important;
}
.hbk-app-menu-section-toggle,
.hbk-app-menu-link {
width: 100% !important;
min-height: 52px !important;
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
gap: 12px !important;
border: 0 !important;
background: transparent !important;
color: #555 !important;
font-size: 17px !important;
font-weight: 700 !important;
text-align: left !important;
text-decoration: none !important;
padding: 14px 2px !important;
box-sizing: border-box !important;
text-transform: uppercase !important;
letter-spacing: 0.02em !important;
}
.hbk-app-menu-link {
border-bottom: 1px solid rgba(0,0,0,0.10) !important;
}
.hbk-app-menu-section-toggle:after {
content: "+";
color: #ad74a2 !important;
font-size: 28px !important;
font-weight: 800 !important;
line-height: 1 !important;
}
.hbk-app-menu-section.is-open > .hbk-app-menu-section-toggle:after {
content: "−";
}
.hbk-app-menu-section-content {
display: none;
padding: 0 0 14px 0 !important;
}
.hbk-app-menu-section.is-open > .hbk-app-menu-section-content {
display: block !important;
}
.hbk-app-menu-html {
color: #333 !important;
font-size: 16px !important;
line-height: 1.35 !important;
}
.hbk-app-menu-html .row,
.hbk-app-menu-html .row-small,
.hbk-app-menu-html .large-columns-4,
.hbk-app-menu-html .medium-columns-3,
.hbk-app-menu-html .small-columns-2 {
display: block !important;
width: 100% !important;
max-width: 100% !important;
margin-left: 0 !important;
margin-right: 0 !important;
}
.hbk-app-menu-html .col,
.hbk-app-menu-html .columns,
.hbk-app-menu-html [class*="large-"],
.hbk-app-menu-html [class*="medium-"],
.hbk-app-menu-html [class*="small-"] {
display: block !important;
width: 100% !important;
max-width: 100% !important;
flex-basis: 100% !important;
padding-left: 0 !important;
padding-right: 0 !important;
margin: 0 !important;
}
.hbk-app-menu-html h1,
.hbk-app-menu-html h2,
.hbk-app-menu-html h3,
.hbk-app-menu-html h4,
.hbk-app-menu-html h5,
.hbk-app-menu-html h6,
.hbk-app-menu-html .uppercase {
margin: 14px 0 6px 0 !important;
color: #111 !important;
font-size: 13px !important;
font-weight: 900 !important;
text-transform: uppercase !important;
letter-spacing: 0.02em !important;
}
.hbk-app-menu-html p,
.hbk-app-menu-html ul,
.hbk-app-menu-html ol {
margin: 0 !important;
padding: 0 !important;
}
.hbk-app-menu-html ul,
.hbk-app-menu-html ol {
list-style: none !important;
}
.hbk-app-menu-html li {
list-style: none !important;
margin: 0 !important;
padding: 0 !important;
border-bottom: 1px solid rgba(0,0,0,0.06) !important;
}
.hbk-app-menu-html a {
display: block !important;
min-height: 42px !important;
padding: 10px 0 !important;
color: #2d405f !important;
font-size: 16px !important;
font-weight: 600 !important;
line-height: 1.25 !important;
text-decoration: none !important;
text-transform: uppercase !important;
letter-spacing: 0.01em !important;
}
.hbk-app-menu-html img {
max-width: 100% !important;
height: auto !important;
border-radius: 14px !important;
margin: 8px 0 !important;
}
.hbk-app-menu-html .button,
.hbk-app-menu-html button {
width: 100% !important;
border-radius: 14px !important;
}
.hbk-app-submenu {
border-bottom: 1px solid rgba(0,0,0,0.08) !important;
}
.hbk-app-submenu-toggle {
width: 100% !important;
min-height: 48px !important;
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
gap: 12px !important;
appearance: none !important;
-webkit-appearance: none !important;
border: 0 !important;
background: transparent !important;
color: #555 !important;
font-size: 16px !important;
font-weight: 700 !important;
text-align: left !important;
padding: 12px 0 !important;
text-transform: uppercase !important;
letter-spacing: 0.02em !important;
}
.hbk-app-submenu-toggle:after {
content: "+";
color: #ad74a2 !important;
font-size: 23px !important;
font-weight: 900 !important;
line-height: 1 !important;
}
.hbk-app-submenu.is-open > .hbk-app-submenu-toggle:after {
content: "−";
}
.hbk-app-submenu-content {
display: none;
padding: 0 0 8px 0 !important;
}
.hbk-app-submenu.is-open > .hbk-app-submenu-content {
display: block !important;
}
.hbk-app-submenu-content a {
padding-left: 8px !important;
}
`;
document.head.appendChild(style);
}
function markBody() {
document.documentElement.classList.add('hobukeskus-ios-app');
if (document.body) {
document.body.classList.add('hobukeskus-ios-app');
}
}
function ensureSearchOverlay() {
var overlay = document.getElementById('hobukeskus-app-search-overlay');
if (overlay) return overlay;
overlay = document.createElement('div');
overlay.id = 'hobukeskus-app-search-overlay';
overlay.innerHTML = `
`;
document.body.appendChild(overlay);
overlay.addEventListener('click', function(event) {
if (event.target === overlay) {
closeSearchOverlay();
}
});
var closeButton = overlay.querySelector('#hobukeskus-app-search-close');
if (closeButton) {
closeButton.addEventListener('click', function() {
closeSearchOverlay();
});
}
var form = overlay.querySelector('#hobukeskus-app-search-form');
var input = overlay.querySelector('#hobukeskus-app-search-input');
if (form) {
form.addEventListener('submit', function(event) {
event.preventDefault();
var query = input ? input.value.trim() : '';
if (query.length > 0) {
window.location.href = '/?s=' + encodeURIComponent(query) + '&post_type=product';
}
});
}
if (input) {
input.addEventListener('input', function() {
scheduleGuavenSearch(input.value);
});
input.addEventListener('keyup', function() {
scheduleGuavenSearch(input.value);
});
input.addEventListener('search', function() {
scheduleGuavenSearch(input.value);
});
}
return overlay;
}
function closeSearchOverlay() {
var overlay = document.getElementById('hobukeskus-app-search-overlay');
if (overlay) overlay.classList.remove('is-open');
}
function focusAppSearchInput() {
var overlay = ensureSearchOverlay();
var input = overlay.querySelector('#hobukeskus-app-search-input');
if (!input) return false;
try {
input.removeAttribute('readonly');
input.focus({ preventScroll: false });
input.click();
if (typeof input.select === 'function') {
input.select();
}
return true;
} catch (e) {
return false;
}
}
function setNativeInputValue(input, value) {
try {
var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
nativeInputValueSetter.call(input, value);
} catch (e) {
input.value = value;
}
}
function findOriginalGuavenInput() {
if (
window.guaven_woos &&
window.guaven_woos.current_input_object &&
window.guaven_woos.current_input_object.length &&
window.guaven_woos.current_input_object[0]
) {
return window.guaven_woos.current_input_object[0];
}
var selectors = [
'#woocommerce-product-search-field-1',
'#woocommerce-product-search-field-0',
'.guaven_woos_search_input',
'input.guaven_woos_search_input',
'#guaven_woos_s',
'.header-search input[type="search"]',
'.header-search input[name="s"]',
'.searchform input[type="search"]',
'.woocommerce-product-search input[type="search"]',
'input[type="search"][name="s"]',
'input[name="s"]'
];
for (var i = 0; i < selectors.length; i++) {
var elements = document.querySelectorAll(selectors[i]);
for (var j = 0; j < elements.length; j++) {
var input = elements[j];
if (input.closest('#hobukeskus-app-search-overlay')) {
continue;
}
return input;
}
}
return null;
}
function fireSearchEvents(input, query) {
setNativeInputValue(input, query);
var events = [
'focus',
'keydown',
'keypress',
'input',
'keyup',
'change'
];
for (var i = 0; i < events.length; i++) {
try {
input.dispatchEvent(new Event(events[i], { bubbles: true, cancelable: true }));
} catch (e) {}
}
try {
input.dispatchEvent(new KeyboardEvent('keyup', {
bubbles: true,
cancelable: true,
key: query.slice(-1) || '',
code: '',
which: query.length ? query.charCodeAt(query.length - 1) : 0,
keyCode: query.length ? query.charCodeAt(query.length - 1) : 0
}));
} catch (e) {}
if (window.jQuery) {
try {
window.jQuery(input)
.val(query)
.trigger('focus')
.trigger('keydown')
.trigger('input')
.trigger('keyup')
.trigger('change');
} catch (e) {}
}
}
function findGuavenSuggestionSource() {
var suggestions = document.querySelectorAll('.guaven_woos_suggestion');
for (var i = 0; i < suggestions.length; i++) {
var suggestion = suggestions[i];
if (suggestion.closest('#hobukeskus-app-search-overlay')) {
continue;
}
return suggestion;
}
return null;
}
function scheduleGuavenSearch(rawQuery) {
var query = (rawQuery || '').trim();
var results = document.getElementById('hobukeskus-app-search-results');
latestSearchQuery = query;
latestSearchRequestId++;
clearTimeout(searchDebounceTimer);
if (!results) return;
if (query.length < 2) {
results.innerHTML = 'Sisesta vähemalt 2 tähemärki.
';
return;
}
results.innerHTML = 'Otsin…
';
searchDebounceTimer = setTimeout(function() {
runGuavenSearch(query, latestSearchRequestId);
}, 120);
}
function runGuavenSearch(query, requestId) {
var sourceInput = findOriginalGuavenInput();
var results = document.getElementById('hobukeskus-app-search-results');
if (!results) return;
if (!window.guaven_woos) {
results.innerHTML = `
Guaveni otsingumootorit ei leitud.
`;
return;
}
if (!sourceInput) {
results.innerHTML = `
Guaveni otsinguvälja ei leitud.
`;
return;
}
setNativeInputValue(sourceInput, query);
try {
if (window.jQuery) {
window.guaven_woos.current_input_object = window.jQuery(sourceInput);
window.jQuery(sourceInput)
.val(query)
.trigger('focus')
.trigger('input')
.trigger('keyup')
.trigger('change');
}
} catch (e) {}
try {
window.guaven_woos.focused = 1;
window.guaven_woos.tempval = query;
window.guaven_woos.tempval_raw = query;
} catch (e) {}
try {
if (typeof window.guaven_woos.runner === 'function') {
window.guaven_woos.runner();
}
} catch (e) {}
setTimeout(function() { mirrorGuavenResults(query, requestId); }, 100);
setTimeout(function() { mirrorGuavenResults(query, requestId); }, 250);
setTimeout(function() { mirrorGuavenResults(query, requestId); }, 500);
setTimeout(function() { mirrorGuavenResults(query, requestId); }, 900);
}
function mirrorGuavenResults(query, requestId) {
var results = document.getElementById('hobukeskus-app-search-results');
var currentInput = document.getElementById('hobukeskus-app-search-input');
var currentQuery = currentInput ? currentInput.value.trim() : '';
if (!results) return;
if (
requestId !== latestSearchRequestId ||
query !== latestSearchQuery ||
query !== currentQuery
) {
return;
}
var source = findGuavenSuggestionSource();
if (!source) {
results.innerHTML = `
Guaveni soovitusi ei leitud.
`;
return;
}
var clone = source.cloneNode(true);
clone.style.display = 'block';
clone.style.position = 'static';
clone.style.visibility = 'visible';
clone.style.opacity = '1';
clone.style.width = '100%';
Array.prototype.forEach.call(clone.querySelectorAll('a[href]'), function(a) {
try {
var href = a.getAttribute('href');
if (!href) return;
if (href.indexOf('gwp=') === 0) {
href = href.replace('gwp={gwsvid}', '');
}
a.href = new URL(href, window.location.origin).href;
} catch (e) {}
});
Array.prototype.forEach.call(clone.querySelectorAll('img[src]'), function(img) {
try {
img.src = new URL(img.getAttribute('src'), window.location.origin).href;
} catch (e) {}
});
results.innerHTML = '';
results.appendChild(clone);
}
function escapeHTML(value) {
return String(value || '')
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
function escapeAttribute(value) {
return escapeHTML(value).replace(/`/g, '`');
}
function getAppMenuCacheKey() {
return 'hbk_app_menu_cache_v4_' + getAppMenuLanguage();
}
function getCachedAppMenu() {
try {
var raw = window.localStorage.getItem(getAppMenuCacheKey());
if (!raw) return null;
var cached = JSON.parse(raw);
if (!cached || !cached.savedAt || !cached.data) return null;
var maxAgeMs = 24 * 60 * 60 * 1000;
if ((Date.now() - cached.savedAt) > maxAgeMs) return null;
return cached.data;
} catch (e) {
return null;
}
}
function setCachedAppMenu(data) {
try {
window.localStorage.setItem(getAppMenuCacheKey(), JSON.stringify({
savedAt: Date.now(),
data: data
}));
} catch (e) {}
}
function ensureAppMenuOverlay() {
var overlay = document.getElementById('hobukeskus-app-menu-overlay');
if (overlay) return overlay;
overlay = document.createElement('div');
overlay.id = 'hobukeskus-app-menu-overlay';
overlay.innerHTML = `
`;
document.body.appendChild(overlay);
overlay.addEventListener('click', function(event) {
if (event.target === overlay) {
closeAppMenuOverlay();
}
});
var closeButton = overlay.querySelector('#hobukeskus-app-menu-close');
if (closeButton) {
closeButton.addEventListener('click', function() {
closeAppMenuOverlay();
});
}
return overlay;
}
function closeAppMenuOverlay() {
var overlay = document.getElementById('hobukeskus-app-menu-overlay');
if (overlay) overlay.classList.remove('is-open');
}
function openAppMenuOverlay() {
var overlay = ensureAppMenuOverlay();
overlay.classList.add('is-open');
loadAppMenu({ silent: false });
}
function preloadAppMenu() {
ensureAppMenuOverlay();
loadAppMenu({ silent: true });
}
function getAppMenuLanguage() {
try {
if (document.documentElement.lang && document.documentElement.lang.toLowerCase().indexOf('en') === 0) {
return 'en';
}
} catch (e) {}
return 'et';
}
function loadAppMenu(options) {
options = options || {};
var overlay = ensureAppMenuOverlay();
var content = overlay.querySelector('#hobukeskus-app-menu-content');
if (!content) return;
if (content.getAttribute('data-loaded') === '1') {
return;
}
var cached = getCachedAppMenu();
if (cached) {
renderAppMenu(cached);
return;
}
if (!options.silent) {
content.innerHTML = '';
}
var url = '/wp-json/hbk-app/v1/menu?lang='
+ encodeURIComponent(getAppMenuLanguage())
+ '&_='
+ Date.now();
fetch(url, {
method: 'GET',
credentials: 'same-origin',
cache: 'no-store',
headers: {
'Accept': 'application/json',
'Cache-Control': 'no-cache'
}
})
.then(function(response) {
if (!response.ok) {
throw new Error('HTTP ' + response.status + ' ' + response.statusText);
}
return response.json();
})
.then(function(data) {
setCachedAppMenu(data);
renderAppMenu(data);
})
.catch(function(error) {
content.innerHTML = `
`;
});
}
function isAppMenuHeadingNode(node) {
if (!node || node.nodeType !== 1) return false;
if (node.closest('.hbk-app-submenu')) return false;
var tag = node.tagName ? node.tagName.toLowerCase() : '';
var cls = node.className ? String(node.className).toLowerCase() : '';
var text = (node.innerText || node.textContent || '').trim();
if (!text || text.length > 80) return false;
if (tag === 'h1' || tag === 'h2' || tag === 'h3' || tag === 'h4' || tag === 'h5' || tag === 'h6') return true;
if (cls.indexOf('ux-menu-title') !== -1) return true;
if (cls.indexOf('uppercase') !== -1 && text === text.toUpperCase()) return true;
return false;
}
function isIgnorableMenuNode(node) {
if (!node) return true;
if (node.nodeType === 3 && !node.textContent.trim()) return true;
if (node.nodeType === 8) return true;
return false;
}
function enhanceAppMenuBlock(root) {
if (!root || root.getAttribute('data-submenu-enhanced') === '1') return;
root.setAttribute('data-submenu-enhanced', '1');
var headings = Array.prototype.slice.call(root.querySelectorAll('h1,h2,h3,h4,h5,h6,.ux-menu-title,.uppercase'))
.filter(isAppMenuHeadingNode);
for (var i = 0; i < headings.length; i++) {
var heading = headings[i];
if (!heading.parentNode || heading.closest('.hbk-app-submenu')) continue;
var title = (heading.innerText || heading.textContent || '').trim();
if (!title) continue;
var parent = heading.parentNode;
var section = document.createElement('div');
section.className = 'hbk-app-submenu';
var toggle = document.createElement('button');
toggle.type = 'button';
toggle.className = 'hbk-app-submenu-toggle';
toggle.textContent = title;
var body = document.createElement('div');
body.className = 'hbk-app-submenu-content';
parent.insertBefore(section, heading);
section.appendChild(toggle);
section.appendChild(body);
var node = heading.nextSibling;
parent.removeChild(heading);
while (node) {
var next = node.nextSibling;
if (isAppMenuHeadingNode(node)) {
break;
}
body.appendChild(node);
node = next;
}
if (!body.textContent.trim() && body.querySelectorAll('a,img,button').length === 0) {
section.parentNode.removeChild(section);
continue;
}
toggle.addEventListener('click', function(event) {
var submenu = event.currentTarget.closest('.hbk-app-submenu');
if (!submenu) return;
submenu.classList.toggle('is-open');
});
}
}
function renderAppMenu(data) {
var overlay = ensureAppMenuOverlay();
var content = overlay.querySelector('#hobukeskus-app-menu-content');
if (!content) return;
var items = data && data.items ? data.items : [];
if (!items.length) {
content.innerHTML = '';
return;
}
var html = '';
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item.type === 'block') {
html += `
`;
continue;
}
if (item.type === 'link') {
html += `
`;
}
}
content.innerHTML = html;
content.setAttribute('data-loaded', '1');
Array.prototype.forEach.call(content.querySelectorAll('.hbk-app-menu-html'), function(blockRoot) {
enhanceAppMenuBlock(blockRoot);
});
Array.prototype.forEach.call(content.querySelectorAll('.hbk-app-menu-section-toggle'), function(button) {
button.addEventListener('click', function() {
var section = button.closest('.hbk-app-menu-section');
if (!section) return;
section.classList.toggle('is-open');
});
});
Array.prototype.forEach.call(content.querySelectorAll('a[href]'), function(link) {
link.addEventListener('click', function() {
closeAppMenuOverlay();
});
});
// Menüü avaneb vaikimisi suletuna. Kasutaja avab soovitud osa + märgist.
}
function readCartCountFromPage() {
var selectors = [
'.cart-icon strong',
'.cart-icon .cart-count',
'.header-cart-link .cart-icon strong',
'.header-cart-link .cart-count',
'a.cart-contents .count',
'.cart-contents .count',
'.woocommerce-mini-cart__total',
'.cart-count',
'[data-icon-label]'
];
for (var i = 0; i < selectors.length; i++) {
var elements = document.querySelectorAll(selectors[i]);
for (var j = 0; j < elements.length; j++) {
var el = elements[j];
var value = '';
if (el.getAttribute && el.getAttribute('data-icon-label')) {
value = el.getAttribute('data-icon-label') || '';
} else {
value = (el.innerText || el.textContent || '').trim();
}
var match = value.match(/\d+/);
if (match) {
var parsed = parseInt(match[0], 10);
if (!isNaN(parsed)) return parsed;
}
}
}
return 0;
}
function readWishlistHasItemsFromPage() {
var countSelectors = [
'.wishlist_products_counter_number',
'.wishlist-count',
'.wishlist-counter',
'.yith-wcwl-items-count',
'.tinvwl-count',
'[data-wishlist-count]',
'[data-tinv-wl-count]'
];
for (var i = 0; i < countSelectors.length; i++) {
var elements = document.querySelectorAll(countSelectors[i]);
for (var j = 0; j < elements.length; j++) {
var el = elements[j];
var value = '';
if (el.getAttribute && el.getAttribute('data-wishlist-count')) {
value = el.getAttribute('data-wishlist-count') || '';
} else if (el.getAttribute && el.getAttribute('data-tinv-wl-count')) {
value = el.getAttribute('data-tinv-wl-count') || '';
} else {
value = (el.innerText || el.textContent || '').trim();
}
var match = value.match(/\d+/);
if (match && parseInt(match[0], 10) > 0) {
return true;
}
}
}
var wishlistPageSelectors = [
'.wishlist_table tbody tr',
'.shop_table.wishlist_table tbody tr',
'.tinv-wishlist table tbody tr',
'.wishlist-items-wrapper .product',
'.woocommerce-wishlist .product'
];
for (var k = 0; k < wishlistPageSelectors.length; k++) {
var rows = document.querySelectorAll(wishlistPageSelectors[k]);
if (rows && rows.length > 0) {
for (var r = 0; r < rows.length; r++) {
var rowText = (rows[r].innerText || rows[r].textContent || '').toLowerCase();
if (
rowText.indexOf('no products') === -1 &&
rowText.indexOf('empty') === -1 &&
rowText.indexOf('tühi') === -1
) {
return true;
}
}
}
}
return false;
}
function sendCartCount() {
try {
var count = readCartCountFromPage();
if (
window.webkit &&
window.webkit.messageHandlers &&
window.webkit.messageHandlers.cartCount
) {
window.webkit.messageHandlers.cartCount.postMessage(count);
}
} catch (e) {}
}
function sendWishlistState() {
try {
var hasItems = readWishlistHasItemsFromPage();
if (
window.webkit &&
window.webkit.messageHandlers &&
window.webkit.messageHandlers.wishlistState
) {
window.webkit.messageHandlers.wishlistState.postMessage(hasItems);
}
} catch (e) {}
}
window.HobukeskusAppOpenMenu = function() {
openAppMenuOverlay();
return true;
};
window.HobukeskusAppPreloadMenu = function() {
preloadAppMenu();
return true;
};
window.HobukeskusAppOpenSearch = function() {
var overlay = ensureSearchOverlay();
overlay.classList.add('is-open');
var input = overlay.querySelector('#hobukeskus-app-search-input');
if (input) {
latestSearchQuery = input.value.trim();
if (latestSearchQuery.length < 2) {
var results = overlay.querySelector('#hobukeskus-app-search-results');
if (results) {
results.innerHTML = 'Sisesta vähemalt 2 tähemärki.
';
}
} else {
scheduleGuavenSearch(latestSearchQuery);
}
}
focusAppSearchInput();
setTimeout(focusAppSearchInput, 50);
setTimeout(focusAppSearchInput, 180);
setTimeout(focusAppSearchInput, 450);
return true;
};
window.HobukeskusAppSendCartCount = sendCartCount;
window.HobukeskusAppSendWishlistState = sendWishlistState;
markBody();
injectAppStyles();
sendCartCount();
sendWishlistState();
document.addEventListener('DOMContentLoaded', function() {
markBody();
injectAppStyles();
sendCartCount();
sendWishlistState();
setTimeout(preloadAppMenu, 650);
});
setTimeout(preloadAppMenu, 900);
document.addEventListener('click', function() {
setTimeout(sendCartCount, 700);
setTimeout(sendCartCount, 1800);
setTimeout(sendWishlistState, 700);
setTimeout(sendWishlistState, 1800);
}, true);
var observer = new MutationObserver(function() {
sendCartCount();
sendWishlistState();
});
function startObserver() {
if (document.body) {
observer.observe(document.body, {
childList: true,
subtree: true,
characterData: true,
attributes: true
});
}
}
startObserver();
setInterval(function() {
sendCartCount();
sendWishlistState();
}, 2500);
})();
"""#