בחר שפה

לדוגמה צימר האלון בגליל זוג · ג׳קוזי · נוף לגליל ₪790 / לילה
לדוגמה SarahNew York · US צימר האלון בגליל ₪790 / לילה הזמנה מהירה ההזמנה אושרה

כך נתיבה עובדת בשביל הצימר שלכם

גללו — ותראו מה אנחנו בונים סביב הצימר.

כרטיס מקצועי בקטלוג

צוות נתיבה בונה לצימר כרטיס שמוכר — תמונות, תיאור ומחיר.

נבדק ומדורג

מבקרים, בודקים ומעניקים דירוג נתיבה — תו אמון שאורחים מזהים.

ביקורות שעובדות בשבילכם

חוות דעת של אורחים בונות מוניטין שמביא את הבאים.

אטרקציות מסביב

הצימר מוצג יחד עם חוויות בדוקות בסביבה — סיבה נוספת לבחור בו.

התאמה חכמה

המערכת מציגה את הצימר בדיוק לאורח שמחפש אותו.

אורחים מכל העולם

תיירים מ‑20 מדינות מוצאים, בוחרים ומזמינים — בקלות ובשפה שלהם.

אקוסיסטם שלם — סביב הצימר שלכם

הצטרפו עכשיו — ללא עלות עד סוף 2026.

הצטרפו עכשיו
מצטרפים

רוצים להצטרף? השאירו פרטים

נבנה לכם כרטיס מקצועי ונביא אורחים — ללא עלות עד סוף 2026. נחזור אליכם תוך יום עסקים.

בשליחה אתם מאשרים שניצור קשר לגבי הצטרפות ל‑Nativa. בלי ספאם.

החופשה שלכם מתחילה כאן!

צימר מושלם מחכה לכם – בואו לשריין מקום לפני כולם

החופשה שלכם מתחילה כאן!

צימר מושלם מחכה לכם – בואו לשריין מקום לפני כולם

התאמות נגישות באתר
שינוי צבע טקסט
שינוי צבע רקע
שינוי צבע כותרות
הגדלה והקטנת הגופן
שינוי מרווח בין שורות
שינוי מרווח בין אותיות
cookies

אנו משתמשים בעוגיות של צד שלישי כדי להתאים תוכן ופרסומות, ולנתח את תנועת הגולשים באתר.
למידע נוסף

בסדר לא מאשר
ПРОД: localStorage здесь — демо-хранилище. На проде заменить на API/БД, привязанные к аккаунту пользователя (см. пометки // PROD ниже). ====================================================================== */ window.NativaTour = (function () { 'use strict'; var KEY_TOURS = 'nativa_tours'; // PROD: GET/POST /api/me/tours var KEY_FAVS = 'nativa_favorites'; // PROD: GET/POST /api/me/favorites /* ---------------- ТИПЫ точек (label/цвет/чип) -------------------- */ // цвета — вторичная палитра брендбука Nativa (BRAND.md) var TYPES = { lodging: { label: 'לינה', color: '#012824' }, /* Dark Green */ nature: { label: 'טבע', color: '#00B85F' }, food: { label: 'מסעדה', color: '#E03C48' }, /* Poppy */ attraction: { label: 'אטרקציה', color: '#5C82FF' }, /* Blue Crayola */ beach: { label: 'חוף', color: '#3861E0' }, /* Savoy Blue */ winery: { label: 'יקב', color: '#BD1E2C' }, /* Fire Brick */ trail: { label: 'מסלול', color: '#01453E' } /* Brunswick */ }; // фильтр-чипы каталога (key → подпись) var FILTERS = [ { key: 'all', label: 'הכול' }, { key: 'lodging', label: 'לינה' }, { key: 'nature', label: 'טבע' }, { key: 'food', label: 'אוכל' }, { key: 'attraction', label: 'אטרקציות' }, { key: 'beach', label: 'חופים' }, { key: 'winery', label: 'יקבים' }, { key: 'trail', label: 'מסלולים' } ]; /* ---------------- КАТАЛОГ (плейсхолдер) -------------------------- */ // PROD: приходит из каталога Nativa (API). lat/lng — реальные координаты. var IMGH = '../assets/img/hotel/'; var IMGZ = '../assets/img/zimmer/'; // Цена (₪). Режим A (готовая цена Nativa): fullPrice (полная) + nativaPrice (со скидкой), // discount = fullPrice - nativaPrice. Режим B (ручной ввод): полей цены НЕТ — клиент // вписывает userCost сам (еда/заправка). PROD: цены и скидки из данных партнёров. // price (строка) — короткая подпись для каталога/кабинета (необязательно). // recDur — рекомендованное время пребывания (мин; у לינה нет — это ночёвка). // tags — оси для matchScore (плейсхолдер). PROD: теги из БД объектов. // active 0..100 (פעיל), budget 0..100 (מפנק), interests ⊂ [nature,food,culture,water,spa], // company ⊂ [couple,family,friends,solo], kosher bool. var CATALOG = [ // לינה (базы для ночёвок) — режим A { id: 's1', name: 'מלון נתיבה גליל', type: 'lodging', region: 'ראש פינה', lat: 32.9690, lng: 35.5420, img: IMGH + 'h_1.jpg', price: '₪890', fullPrice: 1020, nativaPrice: 890, note: 'מלון בוטיק 4 כוכבים', tags: { active: 30, budget: 70, interests: ['spa', 'culture'], company: ['couple', 'family'], kosher: true } }, { id: 's2', name: 'אחוזת הכינור', type: 'lodging', region: 'הכנרת', lat: 32.8800, lng: 35.5900, img: IMGZ + 'hero_01.jpg', price: '₪1,250', fullPrice: 1430, nativaPrice: 1250, note: 'צימר יוקרה מול האגם', tags: { active: 25, budget: 85, interests: ['spa', 'water'], company: ['couple'], kosher: true } }, { id: 's3', name: 'בקתות יער', type: 'lodging', region: 'הגליל', lat: 33.0500, lng: 35.4500, img: IMGZ + 'hero_06.jpg', price: '₪780', fullPrice: 870, nativaPrice: 780, note: 'בקתות עץ ביער', tags: { active: 45, budget: 45, interests: ['nature'], company: ['family', 'friends'], kosher: true } }, { id: 's4', name: 'וילת הזיתים', type: 'lodging', region: 'הגליל', lat: 32.9300, lng: 35.4800, img: IMGZ + 'hero_04.jpg', price: '₪1,420', fullPrice: 1620, nativaPrice: 1420, note: 'וילה עם בריכה', tags: { active: 30, budget: 80, interests: ['spa', 'nature'], company: ['family', 'couple'], kosher: true } }, { id: 's5', name: 'סוויטות מצפה', type: 'lodging', region: 'הדרום', lat: 30.6100, lng: 34.8000, img: IMGH + 'h_5.jpg', price: '₪1,090', fullPrice: 1240, nativaPrice: 1090, note: 'סוויטות מדבר', tags: { active: 50, budget: 75, interests: ['nature', 'culture'], company: ['couple', 'friends'], kosher: false } }, // טבע / פארקים — режим A { id: 'n1', name: 'שמורת נחל עיון', type: 'nature', region: 'הגליל', lat: 33.2780, lng: 35.5780, img: IMGZ + 'hero_07.jpg', fullPrice: 70, nativaPrice: 56, recDur: 150, note: 'מפלים ומסלול מים', tags: { active: 80, budget: 30, interests: ['nature', 'water'], company: ['family', 'friends'], kosher: true } }, { id: 'n2', name: 'גן לאומי חצור', type: 'nature', region: 'הגליל', lat: 33.0170, lng: 35.5680, img: IMGH + 'h_8.jpg', fullPrice: 55, nativaPrice: 44, recDur: 90, note: 'אתר ארכאולוגי · מוזיאון', tags: { active: 45, budget: 25, interests: ['culture', 'nature'], company: ['family', 'couple'], kosher: true } }, { id: 'n3', name: 'פארק הירדן', type: 'nature', region: 'הכנרת', lat: 32.9100, lng: 35.6100, img: IMGZ + 'hero_03.jpg', fullPrice: 230, nativaPrice: 180, recDur: 180, note: 'קיאקים ופיקניק', tags: { active: 85, budget: 55, interests: ['water', 'nature'], company: ['family', 'friends'], kosher: true } }, // אוכל — режим B (ручной ввод) { id: 'f1', name: 'מסעדת השף הגלילית', type: 'food', region: 'ראש פינה', lat: 32.9700, lng: 35.5400, img: IMGH + 'h_11.jpg', recDur: 90, note: 'מטבח גלילי עכשווי', tags: { active: 20, budget: 75, interests: ['food', 'culture'], company: ['couple', 'family'], kosher: true } }, { id: 'f2', name: 'חומוס הגליל', type: 'food', region: 'ראש פינה', lat: 32.9650, lng: 35.5500, img: IMGH + 'h_12.jpg', recDur: 45, note: 'מקומי ואותנטי', tags: { active: 25, budget: 30, interests: ['food'], company: ['friends', 'family'], kosher: true } }, // אטרקציות — режим A (есть «музейный» большой дисконт) { id: 'a1', name: 'מוזיאון ראש פינה', type: 'attraction', region: 'ראש פינה', lat: 32.9670, lng: 35.5450, img: IMGH + 'h_3.jpg', fullPrice: 200, nativaPrice: 30, recDur: 120, note: 'מוזיאון מורשת', tags: { active: 35, budget: 40, interests: ['culture'], company: ['couple', 'family'], kosher: true } }, { id: 'a2', name: 'פארק חבלים', type: 'attraction', region: 'הגליל', lat: 33.0000, lng: 35.5000, img: IMGZ + 'hero_05.jpg', fullPrice: 130, nativaPrice: 95, recDur: 150, note: 'אתגרי ומשפחתי', tags: { active: 90, budget: 55, interests: ['nature'], company: ['family', 'friends'], kosher: false } }, // חופים — режим A { id: 'b1', name: 'חוף הכנרת', type: 'beach', region: 'הכנרת', lat: 32.8800, lng: 35.5900, img: IMGH + 'h_10.jpg', fullPrice: 45, nativaPrice: 35, recDur: 180, note: 'חוף רחצה מוסדר', tags: { active: 60, budget: 35, interests: ['water', 'nature'], company: ['family', 'friends'], kosher: true } }, { id: 'b2', name: 'חוף גולן', type: 'beach', region: 'הכנרת', lat: 32.8400, lng: 35.6500, img: IMGH + 'h_6.jpg', fullPrice: 35, nativaPrice: 30, recDur: 150, note: 'שקט ויפהפה', tags: { active: 55, budget: 30, interests: ['water', 'nature'], company: ['couple', 'friends'], kosher: false } }, // יקבים — режим A { id: 'w1', name: 'יקב רמת הגולן', type: 'winery', region: 'הגולן', lat: 33.0000, lng: 35.6000, img: IMGH + 'h_7.jpg', fullPrice: 120, nativaPrice: 90, recDur: 120, note: 'סיור וטעימות', tags: { active: 30, budget: 70, interests: ['food', 'culture'], company: ['couple', 'friends'], kosher: false } }, { id: 'w2', name: 'יקבי הגליל', type: 'winery', region: 'הגליל', lat: 33.0220, lng: 35.4750, img: IMGH + 'h_2.jpg', fullPrice: 100, nativaPrice: 80, recDur: 90, note: 'יין בוטיק', tags: { active: 35, budget: 65, interests: ['food', 'culture'], company: ['couple', 'friends'], kosher: true } }, // מסלולים — режим B (бесплатно/ручной ввод) { id: 't1', name: 'מסלול נחל עמוד', type: 'trail', region: 'הגליל', lat: 32.8800, lng: 35.4600, img: IMGZ + 'hero_02.jpg', recDur: 210, note: '2–4 שעות · בינוני', tags: { active: 90, budget: 20, interests: ['nature'], company: ['friends', 'solo', 'family'], kosher: true } }, { id: 't2', name: 'שביל ישראל — גליל', type: 'trail', region: 'הגליל', lat: 33.1000, lng: 35.5000, img: IMGZ + 'gallery_05.jpg', recDur: 180, note: 'קטע נופי', tags: { active: 85, budget: 20, interests: ['nature'], company: ['friends', 'solo'], kosher: true } } ]; var INDEX = {}; CATALOG.forEach(function (p) { INDEX[p.id] = p; }); function byId(id) { return INDEX[id] || null; } /* ---------------- ID / даты ------------------------------------- */ function uid() { // Date.now() в браузере доступен (ограничение было только для воркфлоу-песочницы) return 'tr_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7); } /* ---------------- МОДЕЛЬ маршрута ------------------------------- */ // tour = { id, name, days:[ {nights:[stopId], stops:[stopId]} ], created } function newTour(name) { return { id: uid(), name: name || 'מסלול חדש', days: [{ nights: [], stops: [] }], created: Date.now() }; } function emptyDay() { return { nights: [], stops: [] }; } function countStops(tour) { var n = 0, s = 0; (tour.days || []).forEach(function (d) { n += (d.nights || []).length; s += (d.stops || []).length; }); return { nights: n, stops: s, total: n + s }; } /* ---------------- ХРАНИЛИЩЕ (localStorage / PROD: API) ---------- */ function loadTours() { try { return JSON.parse(localStorage.getItem(KEY_TOURS)) || []; } catch (e) { return []; } } function saveTours(arr) { try { localStorage.setItem(KEY_TOURS, JSON.stringify(arr)); } catch (e) {} } function getTour(id) { var all = loadTours(); for (var i = 0; i < all.length; i++) if (all[i].id === id) return all[i]; return null; } function upsertTour(tour) { // PROD: POST/PUT /api/me/tours var all = loadTours(), found = false; for (var i = 0; i < all.length; i++) { if (all[i].id === tour.id) { all[i] = tour; found = true; break; } } if (!found) all.push(tour); saveTours(all); return tour; } function deleteTour(id) { // PROD: DELETE /api/me/tours/:id saveTours(loadTours().filter(function (t) { return t.id !== id; })); } /* ---------------- ИЗБРАННОЕ ------------------------------------- */ function loadFavs() { try { return JSON.parse(localStorage.getItem(KEY_FAVS)) || []; } catch (e) { return []; } } function saveFavs(arr) { try { localStorage.setItem(KEY_FAVS, JSON.stringify(arr)); } catch (e) {} } function isFav(id) { return loadFavs().indexOf(id) !== -1; } function toggleFav(id) { var f = loadFavs(), i = f.indexOf(id); if (i === -1) f.push(id); else f.splice(i, 1); saveFavs(f); return i === -1; // true = добавлено } /* ---------------- ОТЗЫВЫ (nativa_reviews) ----------------------- */ // review = { id:, name, c:{clean,location,service,value}, text, ts } // PROD: отзывы из БД; право писать — только после реальной брони. var KEY_REVIEWS = 'nativa_reviews'; function loadReviews() { try { return JSON.parse(localStorage.getItem(KEY_REVIEWS)) || []; } catch (e) { return []; } } function saveReviews(arr) { try { localStorage.setItem(KEY_REVIEWS, JSON.stringify(arr)); } catch (e) {} } function getReview(id) { var a = loadReviews(); for (var i = 0; i < a.length; i++) if (a[i].id === id) return a[i]; return null; } function upsertReview(r) { var a = loadReviews(), found = false; for (var i = 0; i < a.length; i++) { if (a[i].id === r.id) { a[i] = r; found = true; break; } } if (!found) a.push(r); saveReviews(a); return r; } function deleteReview(id) { saveReviews(loadReviews().filter(function (r) { return r.id !== id; })); } /* ---------------- БАЛЛЫ ЛОЯЛЬНОСТИ «נקודות נתיבה» (nativa_points) - points = { balance:Number, history:[ {reason, pts, label, key, ts} ] } key — для дедупликации начислений (одно событие = один раз). PROD: баланс/история из биллинга лояльности на сервере. ---------- */ var KEY_POINTS = 'nativa_points'; var POINTS = { review: 50, photo: 20, tour: 30, trip: 100 }; // награды за активность (נק׳) function loadPoints() { try { var p = JSON.parse(localStorage.getItem(KEY_POINTS)); return (p && typeof p.balance === 'number') ? p : { balance: 0, history: [] }; } catch (e) { return { balance: 0, history: [] }; } } function savePoints(p) { try { localStorage.setItem(KEY_POINTS, JSON.stringify(p)); } catch (e) {} return p; } function hasAward(key) { return loadPoints().history.some(function (h) { return h.key && h.key === key; }); } function addPoints(reason, pts, label, key) { var p = loadPoints(); if (key && p.history.some(function (h) { return h.key === key; })) return p; // уже начислено p.balance = (p.balance || 0) + pts; p.history.unshift({ reason: reason, pts: pts, label: label || '', key: key || '', ts: Date.now() }); return savePoints(p); } /* ---------------- ВИЗИТЫ ИЗ МАРШРУТОВ (для напоминаний об отзывах) - Плоский список реальных мест маршрута с днём/датой посещения. Дата дня = startDate (если есть) либо created + индекс дня. PROD: даты визита — из реальных броней/чек-инов. ---------------- */ function tourStart(tour) { return tour && tour.startDate ? new Date(tour.startDate) : new Date((tour && tour.created) || Date.now()); } function tourDayDate(tour, dayIndex) { var d = tourStart(tour); d.setHours(0, 0, 0, 0); d.setDate(d.getDate() + (dayIndex || 0)); return d; } function tourVisits(tour) { var out = []; (tour.days || []).forEach(function (d, di) { (d.nights || []).concat(d.stops || []).forEach(function (id) { var p = byId(id); if (!p) return; out.push({ place: p, dayIndex: di, date: tourDayDate(tour, di), tourId: tour.id, tourName: tour.name, key: tour.id + '_' + id + '_' + di }); }); }); return out; } /* ---------------- ШАРИНГ (base64url, UTF-8) --------------------- */ // Кодируем компактную версию тура в URL (?t=...). PROD: короткая ссылка через API. function b64encode(str) { return btoa(unescape(encodeURIComponent(str))) .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); } function b64decode(s) { s = s.replace(/-/g, '+').replace(/_/g, '/'); while (s.length % 4) s += '='; return decodeURIComponent(escape(atob(s))); } function encodeTour(tour) { // компактно: только name + дни со списками id var compact = { n: tour.name, // g=ночёвки, s=точки, t=необязательная подпись дня d: (tour.days || []).map(function (d) { return { g: d.nights || [], s: d.stops || [], t: d.title || '' }; }), u: tour.userCosts || {}, // введённые вручную суммы (₪), ключ — id точки v: tour.userDurations || {} // выбранное время пребывания (мин), ключ — id точки }; return b64encode(JSON.stringify(compact)); } function decodeTour(str) { try { var c = JSON.parse(b64decode(str)); return { id: uid(), name: c.n || 'מסלול משותף', created: Date.now(), days: (c.d || []).map(function (d) { return { nights: d.g || [], stops: d.s || [], title: d.t || '' }; }), userCosts: c.u || {}, userDurations: c.v || {} }; } catch (e) { return null; } } function shareUrl(tour) { // абсолютная ссылка на конструктор в режиме просмотра (?t=). // Resolve через URL() — корректно и из /tour/, и из /account/, и при file://. // PROD: короткая ссылка через API (например, nativa.co.il/t/AbCd). var rel = /tour-builder\.html/.test(location.pathname) ? 'tour-builder.html' // уже в конструкторе : '../tour/tour-builder.html'; // из /account/ и др. try { return new URL(rel + '?t=' + encodeTour(tour), location.href).href; } catch (e) { return rel + '?t=' + encodeTour(tour); } } /* ---------------- ГЕО: расстояние (haversine, км) --------------- */ function distanceKm(a, b) { if (!a || !b) return 0; var R = 6371, toRad = Math.PI / 180; var dLat = (b.lat - a.lat) * toRad, dLng = (b.lng - a.lng) * toRad; var s = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(a.lat * toRad) * Math.cos(b.lat * toRad) * Math.sin(dLng / 2) * Math.sin(dLng / 2); return R * 2 * Math.atan2(Math.sqrt(s), Math.sqrt(1 - s)); } // грубая оценка времени в пути на авто (км / 60 км/ч) function driveMin(km) { return Math.round(km / 60 * 60); } /* ---------------- ПРОФИЛЬ предпочтений (match) ------------------ */ var KEY_PROFILE = 'nativa_profile'; // PROD: профиль из аккаунта // интересы для квиза (ось «מה חשוב») var INTERESTS = [ { key: 'nature', label: 'טבע' }, { key: 'water', label: 'מים' }, { key: 'culture', label: 'תרבות' }, { key: 'food', label: 'קולינריה' }, { key: 'spa', label: 'ספא' } ]; function loadProfile() { try { return JSON.parse(localStorage.getItem(KEY_PROFILE)) || null; } catch (e) { return null; } } function saveProfile(p) { try { localStorage.setItem(KEY_PROFILE, JSON.stringify(p)); } catch (e) {} return p; } function clearProfile() { try { localStorage.removeItem(KEY_PROFILE); } catch (e) {} } // сброс профиля function hasProfile() { return !!loadProfile(); } /* matchScore — ЧИСТАЯ функция: насколько место подходит профилю (0..100) + разбивка по осям. PROD: теги объекта из БД, профиль из аккаунта; формула может уточняться. */ function matchScore(profile, place) { if (!profile || !place || !place.tags) return null; var t = place.tags, parts = []; function near(a, b) { return Math.max(0, 100 - Math.abs((a || 0) - (b || 0))); } // תקציב var budget = near(profile.budget, t.budget); parts.push({ label: 'תקציב', val: Math.round(budget), w: 1 }); // פעילות / קצב var active = near(profile.active, t.active); parts.push({ label: 'קצב', val: Math.round(active), w: 1 }); // תחומי עניין (доля совпавших интересов профиля) var interest = 100; if (profile.interests && profile.interests.length) { var hit = 0; profile.interests.forEach(function (k) { if ((t.interests || []).indexOf(k) !== -1) hit++; }); interest = Math.round(hit / profile.interests.length * 100); } parts.push({ label: 'עניין', val: interest, w: 1.3 }); // עם מי (חברה) var company = 100; if (profile.company) company = (t.company || []).indexOf(profile.company) !== -1 ? 100 : 55; parts.push({ label: 'חברה', val: company, w: 0.8 }); // כשרות — учитываем только если важно профилю if (profile.kosher === 'yes') { var kosher = t.kosher ? 100 : 40; parts.push({ label: 'כשרות', val: kosher, w: 0.7 }); } var sw = 0, sv = 0; parts.forEach(function (p) { sw += p.w; sv += p.val * p.w; }); return { score: Math.round(sv / sw), parts: parts }; } /* ---------------- ОСИ РАДАР-ЧАРТА (match-визуализация) ----------- */ // Те же данные (profile / place.tags), спроецированные на 6 наглядных осей. // PROD: оси/веса можно уточнять; значения из реальных тегов и профиля. var RADAR_AXES = [ { key: 'budget', label: 'תקציב' }, { key: 'pace', label: 'קצב' }, { key: 'nature', label: 'טבע' }, { key: 'food', label: 'קולינריה' }, { key: 'beauty', label: 'יופי' }, { key: 'rest', label: 'מנוחה' } ]; function has(arr, k) { return (arr || []).indexOf(k) !== -1; } function clamp(n) { return Math.max(0, Math.min(100, Math.round(n))); } // оси для ОДНОГО места (по tags) → {budget,pace,nature,food,beauty,rest} 0..100 function placeAxes(place) { if (!place || !place.tags) return null; var t = place.tags; return { budget: clamp(t.budget), pace: clamp(t.active), nature: clamp(has(t.interests, 'nature') ? 100 : (has(t.interests, 'water') ? 60 : 20)), food: clamp(has(t.interests, 'food') ? 100 : 20), beauty: clamp((has(t.interests, 'nature') || has(t.interests, 'water')) ? 90 : 40), rest: clamp(100 - (t.active || 0)) }; } // оси для ПРОФИЛЯ клиента function profileAxes(prof) { if (!prof) return null; return { budget: clamp(prof.budget), pace: clamp(prof.active), nature: clamp(has(prof.interests, 'nature') ? 100 : (has(prof.interests, 'water') ? 60 : 25)), food: clamp(has(prof.interests, 'food') ? 100 : 25), beauty: clamp((has(prof.interests, 'nature') || has(prof.interests, 'water') || has(prof.interests, 'culture')) ? 90 : 40), rest: clamp(has(prof.interests, 'spa') ? 100 : (100 - (prof.active || 0))) }; } return { TYPES: TYPES, FILTERS: FILTERS, CATALOG: CATALOG, byId: byId, uid: uid, newTour: newTour, emptyDay: emptyDay, countStops: countStops, loadTours: loadTours, saveTours: saveTours, getTour: getTour, upsertTour: upsertTour, deleteTour: deleteTour, loadFavs: loadFavs, isFav: isFav, toggleFav: toggleFav, loadReviews: loadReviews, getReview: getReview, upsertReview: upsertReview, deleteReview: deleteReview, POINTS: POINTS, loadPoints: loadPoints, savePoints: savePoints, addPoints: addPoints, hasAward: hasAward, tourDayDate: tourDayDate, tourVisits: tourVisits, encodeTour: encodeTour, decodeTour: decodeTour, shareUrl: shareUrl, distanceKm: distanceKm, driveMin: driveMin, INTERESTS: INTERESTS, loadProfile: loadProfile, saveProfile: saveProfile, clearProfile: clearProfile, hasProfile: hasProfile, matchScore: matchScore, RADAR_AXES: RADAR_AXES, placeAxes: placeAxes, profileAxes: profileAxes }; })();