- Fixed loadProperties function using wrong variables (prop instead of property) - Added slug field to all hardcoded properties for proper routing - Changed map marker click to navigate to property page instead of modal - Fixed property card structure to include proper links and utility icons
1973 lines
94 KiB
HTML
1973 lines
94 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="es">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="description" content="Agencia inmobiliaria en Tenerife - Terrenos agrícolas y urbanos, casas y apartamentos. La mejor selección de propiedades en las Islas Canarias.">
|
||
<meta name="keywords" content="terrenos Tenerife, casas Tenerife, apartamentos Canarias, invertir Tenerife, propiedades España">
|
||
|
||
<title>TenerifeProp | Terrenos y Propiedades en Tenerife</title>
|
||
|
||
<!-- Open Graph -->
|
||
<meta property="og:title" content="TenerifeProp | Terrenos y Propiedades en Tenerife">
|
||
<meta property="og:description" content="Encuentra tu terreno perfecto en Tenerife. Terrenos agrícolas, urbanos, casas y apartamentos.">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:locale" content="es_ES">
|
||
|
||
<!-- Bootstrap 5 CSS -->
|
||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||
<!-- Bootstrap Icons -->
|
||
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css" rel="stylesheet">
|
||
<!-- Google Fonts -->
|
||
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800&family=Open+Sans:wght@400;500;600&display=swap" rel="stylesheet">
|
||
<!-- AOS Animation -->
|
||
<link href="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.css" rel="stylesheet">
|
||
<!-- Leaflet CSS -->
|
||
<link href="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.min.css" rel="stylesheet">
|
||
|
||
<!-- Custom CSS -->
|
||
<link href="css/variables.css" rel="stylesheet">
|
||
<link href="css/base.css" rel="stylesheet">
|
||
<link href="css/components.css" rel="stylesheet">
|
||
<link href="css/pages/home.css" rel="stylesheet">
|
||
</head>
|
||
<body>
|
||
<!-- ============ NAVBAR ============ -->
|
||
<nav class="navbar navbar-expand-lg fixed-top">
|
||
<div class="container">
|
||
<a class="navbar-brand" href="#" data-i18n="brand">
|
||
Tenerife<span>Prop</span>
|
||
</a>
|
||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||
<span class="navbar-toggler-icon"></span>
|
||
</button>
|
||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||
<ul class="navbar-nav align-items-center">
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="#home" data-i18n="nav.home">Inicio</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="#catalog" data-i18n="nav.catalog">Catálogo</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="#services" data-i18n="nav.services">Servicios</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="#testimonials" data-i18n="nav.testimonials">Testimonios</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="#contact" data-i18n="nav.contact">Contacto</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<div class="lang-switcher">
|
||
<button class="lang-btn active" data-lang="es">ES</button>
|
||
<button class="lang-btn" data-lang="ru">RU</button>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- ============ HERO SECTION ============ -->
|
||
<section class="hero" id="home">
|
||
<div class="hero-bg"></div>
|
||
<div class="hero-overlay"></div>
|
||
<div class="container">
|
||
<div class="row">
|
||
<div class="col-lg-7">
|
||
<div class="hero-content">
|
||
<span class="hero-badge" data-i18n="hero.badge">
|
||
<i class="bi bi-star-fill me-2"></i>
|
||
Más de 500+ propiedades vendidas
|
||
</span>
|
||
<h1>
|
||
<span data-i18n="hero.title1">Terrenos y Propiedades</span>
|
||
<span data-i18n="hero.title2">en Tenerife</span>
|
||
</h1>
|
||
<p class="hero-text" data-i18n="hero.subtitle">
|
||
Encuentra tu terreno perfecto en el paraíso de las Islas Canarias. Terrenos agrícolas, urbanos, casas y apartamentos con documentación garantizada.
|
||
</p>
|
||
<div class="hero-buttons">
|
||
<a href="#catalog" class="btn btn-primary-custom" data-i18n="hero.cta1">
|
||
<i class="bi bi-grid-3x3-gap me-2"></i>Ver Catálogo
|
||
</a>
|
||
<a href="#contact" class="btn btn-secondary-custom" data-i18n="hero.cta2">
|
||
<i class="bi bi-whatsapp me-2"></i>Consultar Ahora
|
||
</a>
|
||
</div>
|
||
<div class="hero-stats">
|
||
<div class="hero-stat">
|
||
<h3>500+</h3>
|
||
<p data-i18n="hero.stat1">Propiedades vendidas</p>
|
||
</div>
|
||
<div class="hero-stat">
|
||
<h3>12</h3>
|
||
<p data-i18n="hero.stat2">Años de experiencia</p>
|
||
</div>
|
||
<div class="hero-stat">
|
||
<h3>98%</h3>
|
||
<p data-i18n="hero.stat3">Clientes satisfechos</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Floating Cards -->
|
||
<div class="hero-float hero-float-1">
|
||
<i class="bi bi-geo-alt-fill"></i>
|
||
<h5 data-i18n="hero.float1.title">Costa Adeje</h5>
|
||
<p data-i18n="hero.float1.text">Desde 85.000€</p>
|
||
</div>
|
||
<div class="hero-float hero-float-2">
|
||
<i class="bi bi-house-door-fill"></i>
|
||
<h5 data-i18n="hero.float2.title">Constalmar</h5>
|
||
<p data-i18n="hero.float2.text">Terreno urbano</p>
|
||
</div>
|
||
|
||
<div class="scroll-indicator">
|
||
<a href="#advantages"><i class="bi bi-chevron-double-down"></i></a>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ ADVANTAGES ============ -->
|
||
<section class="advantages section-padding" id="advantages">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="advantages.title">¿Por Qué Elegirnos?</h2>
|
||
<p class="section-subtitle" data-i18n="advantages.subtitle">
|
||
Más de una década de experiencia en el mercado inmobiliario de Tenerife
|
||
</p>
|
||
</div>
|
||
<div class="row g-4">
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="100">
|
||
<div class="advantage-card">
|
||
<div class="advantage-icon">
|
||
<i class="bi bi-shield-check"></i>
|
||
</div>
|
||
<h4 data-i18n="advantages.item1.title">Legalidad Garantizada</h4>
|
||
<p data-i18n="advantages.item1.text">
|
||
Verificación completa de toda la documentación, incluyendo catastro, registro de la propiedad y licencias municipales.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="200">
|
||
<div class="advantage-card">
|
||
<div class="advantage-icon">
|
||
<i class="bi bi-cash-stack"></i>
|
||
</div>
|
||
<h4 data-i18n="advantages.item2.title">Precios Transparentes</h4>
|
||
<p data-i18n="advantages.item2.text">
|
||
Sin costes ocultos ni comisiones sorpresa. Precio cerrado incluyendo todos los gastos de gestión y notaría.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="300">
|
||
<div class="advantage-card">
|
||
<div class="advantage-icon">
|
||
<i class="bi bi-headset"></i>
|
||
</div>
|
||
<h4 data-i18n="advantages.item3.title">Asistencia 360°</h4>
|
||
<p data-i18n="advantages.item3.text">
|
||
Acompañamiento completo desde la visita hasta la mudanza: transferencias, apertura de cuentas,疏通.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ CATALOG SECTION ============ -->
|
||
<section class="catalog section-padding" id="catalog">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="catalog.title">Nuestro Catálogo</h2>
|
||
<p class="section-subtitle" data-i18n="catalog.subtitle">
|
||
Descubre nuestra selección de propiedades en Tenerife
|
||
</p>
|
||
</div>
|
||
|
||
<!-- Catalog Tabs -->
|
||
<div class="catalog-tabs" data-aos="fade-up">
|
||
<button class="catalog-tab active" data-filter="all" data-i18n="catalog.tab.all">Todos</button>
|
||
<button class="catalog-tab" data-filter="agricultural" data-i18n="catalog.tab.agricultural">Terrenos Agrícolas</button>
|
||
<button class="catalog-tab" data-filter="urban" data-i18n="catalog.tab.urban">Terrenos Urbanos</button>
|
||
<button class="catalog-tab" data-filter="house" data-i18n="catalog.tab.houses">Casas</button>
|
||
<button class="catalog-tab" data-filter="apartment" data-i18n="catalog.tab.apartments">Apartamentos</button>
|
||
<button class="catalog-tab" data-filter="ruins" data-i18n="catalog.tab.ruins">Ruinas</button>
|
||
</div>
|
||
|
||
<div class="row">
|
||
<!-- Filters Sidebar -->
|
||
<div class="col-lg-3" data-aos="fade-right">
|
||
<div class="filters-section">
|
||
<h5 class="mb-4"><i class="bi bi-funnel me-2"></i><span data-i18n="filters.title">Filtros</span></h5>
|
||
|
||
<div class="filter-group">
|
||
<label data-i18n="filters.price">Precio</label>
|
||
<div class="row g-2">
|
||
<div class="col-6">
|
||
<input type="number" class="form-control" id="priceMin" placeholder="Min €" value="20000">
|
||
</div>
|
||
<div class="col-6">
|
||
<input type="number" class="form-control" id="priceMax" placeholder="Max €" value="2000000">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="filter-group">
|
||
<label data-i18n="filters.area">Superficie (m²)</label>
|
||
<div class="row g-2">
|
||
<div class="col-6">
|
||
<input type="number" class="form-control" id="areaMin" placeholder="Min" value="500">
|
||
</div>
|
||
<div class="col-6">
|
||
<input type="number" class="form-control" id="areaMax" placeholder="Max" value="50000">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="filter-group">
|
||
<label data-i18n="filters.utilities">Comunicaciones</label>
|
||
<div class="d-flex flex-column gap-2">
|
||
<label class="filter-checkbox">
|
||
<input type="checkbox" id="filterWater" checked>
|
||
<i class="bi bi-droplet-fill"></i>
|
||
<span data-i18n="filters.water">Agua</span>
|
||
</label>
|
||
<label class="filter-checkbox">
|
||
<input type="checkbox" id="filterElectricity" checked>
|
||
<i class="bi bi-lightning-fill"></i>
|
||
<span data-i18n="filters.electricity">Electricidad</span>
|
||
</label>
|
||
<label class="filter-checkbox">
|
||
<input type="checkbox" id="filterRoad">
|
||
<i class="bi bi-signpost-split-fill"></i>
|
||
<span data-i18n="filters.road">Acceso rodado</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="filter-group">
|
||
<label data-i18n="filters.features">Características</label>
|
||
<div class="d-flex flex-column gap-2">
|
||
<label class="filter-checkbox">
|
||
<input type="checkbox" id="filterRuins">
|
||
<i class="bi bi-house-dash-fill"></i>
|
||
<span data-i18n="filters.hasRuins">Con ruinas/edificación</span>
|
||
</label>
|
||
<label class="filter-checkbox">
|
||
<input type="checkbox" id="filterLicense">
|
||
<i class="bi bi-file-earmark-check-fill"></i>
|
||
<span data-i18n="filters.license">Licencia de obras</span>
|
||
</label>
|
||
<label class="filter-checkbox">
|
||
<input type="checkbox" id="filterSeaView">
|
||
<i class="bi bi-water"></i>
|
||
<span data-i18n="filters.seaView">Vista al mar</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<button class="btn btn-primary-custom w-100 mt-3" id="applyFilters">
|
||
<i class="bi bi-check-lg me-2"></i><span data-i18n="filters.apply">Aplicar Filtros</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Properties Grid -->
|
||
<div class="col-lg-9">
|
||
<!-- View Toggle -->
|
||
<div class="d-flex justify-content-end mb-3">
|
||
<div class="view-toggle">
|
||
<button class="view-btn active" data-view="grid"><i class="bi bi-grid-3x3-gap"></i></button>
|
||
<button class="view-btn" data-view="map"><i class="bi bi-map"></i></button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Grid View -->
|
||
<div id="gridView">
|
||
<div class="row" id="propertiesGrid">
|
||
<!-- Properties will be loaded via JS -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Map View -->
|
||
<div id="mapView" style="display: none;">
|
||
<div class="map-container">
|
||
<div id="map"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ STATISTICS ============ -->
|
||
<section class="statistics section-padding">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="stats.title">Nuestra Trayectoria</h2>
|
||
<p class="section-subtitle" data-i18n="stats.subtitle">
|
||
Números que reflejan nuestra experiencia y compromiso
|
||
</p>
|
||
</div>
|
||
<div class="row g-4">
|
||
<div class="col-lg-3 col-md-6" data-aos="fade-up" data-aos-delay="100">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="bi bi-building"></i>
|
||
</div>
|
||
<div class="stat-number" data-count="527">0</div>
|
||
<div class="stat-label" data-i18n="stats.properties">Propiedades vendidas</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-3 col-md-6" data-aos="fade-up" data-aos-delay="200">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="bi bi-calendar3"></i>
|
||
</div>
|
||
<div class="stat-number" data-count="12">0</div>
|
||
<div class="stat-label" data-i18n="stats.years">Años en el mercado</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-3 col-md-6" data-aos="fade-up" data-aos-delay="300">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="bi bi-people"></i>
|
||
</div>
|
||
<div class="stat-number" data-count="342">0</div>
|
||
<div class="stat-label" data-i18n="stats.clients">Clientes felices</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-3 col-md-6" data-aos="fade-up" data-aos-delay="400">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="bi bi-globe-europe-africa"></i>
|
||
</div>
|
||
<div class="stat-number" data-count="18">0</div>
|
||
<div class="stat-label" data-i18n="stats.countries">Países de origen</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ SERVICES ============ -->
|
||
<section class="services section-padding" id="services">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="services.title">Nuestros Servicios</h2>
|
||
<p class="section-subtitle" data-i18n="services.subtitle">
|
||
Ofrecemos un servicio integral para hacer realidad su sueño
|
||
</p>
|
||
</div>
|
||
<div class="row g-4">
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="100">
|
||
<div class="service-card">
|
||
<div class="service-icon">
|
||
<i class="bi bi-file-text"></i>
|
||
</div>
|
||
<h4 data-i18n="services.item1.title">Asesoría Legal</h4>
|
||
<p data-i18n="services.item1.text">
|
||
Verificación completa de la documentación, gestoría con bancos españoles, y acompañamiento en el Registro de la Propiedad.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="200">
|
||
<div class="service-card">
|
||
<div class="service-icon">
|
||
<i class="bi bi-key"></i>
|
||
</div>
|
||
<h4 data-i18n="services.item2.title">Financiación Hipotecaria</h4>
|
||
<p data-i18n="services.item2.text">
|
||
Apoyo en la obtención de préstamos hipotecarios con los principales bancos españoles. Tasas competitivas para no residentes.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="300">
|
||
<div class="service-card">
|
||
<div class="service-icon">
|
||
<i class="bi bi-tools"></i>
|
||
</div>
|
||
<h4 data-i18n="services.item3.title">Reformas y Construcción</h4>
|
||
<p data-i18n="services.item3.text">
|
||
Red de arquitectos y constructores locales para reformas, ampliaciones y construcción de viviendas desde cero.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="400">
|
||
<div class="service-card">
|
||
<div class="service-icon">
|
||
<i class="bi bi-airplane"></i>
|
||
</div>
|
||
<h4 data-i18n="services.item4.title">Servicio de Relocation</h4>
|
||
<p data-i18n="services.item4.text">
|
||
Apoyo en la obtención de NIE/NIF, apertura de cuentas bancarias, y adaptación a la vida en Tenerife.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="500">
|
||
<div class="service-card">
|
||
<div class="service-icon">
|
||
<i class="bi bi-graph-up"></i>
|
||
</div>
|
||
<h4 data-i18n="services.item5.title">Gestión de Alquileres</h4>
|
||
<p data-i18n="services.item5.text">
|
||
Gestión completa de propiedades en alquiler vacacional. Maximizamos su rentabilidad con Booking, Airbnb y alquileres de larga temporada.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="600">
|
||
<div class="service-card">
|
||
<div class="service-icon">
|
||
<i class="bi bi-eye"></i>
|
||
</div>
|
||
<h4 data-i18n="services.item6.title">Visitas Virtuales</h4>
|
||
<p data-i18n="services.item6.text">
|
||
¿No puede visitar Tenerife? Ofrecemos visitas guiadas por video, drones, y contenido 360° de todas nuestras propiedades.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ CTA SECTION ============ -->
|
||
<section class="cta-section section-padding">
|
||
<div class="container">
|
||
<div class="row align-items-center">
|
||
<div class="col-lg-6 mb-4 mb-lg-0" data-aos="fade-right">
|
||
<div class="cta-content">
|
||
<h2 data-i18n="cta.title">¿No encontró lo que buscaba?</h2>
|
||
<p data-i18n="cta.subtitle">
|
||
Deje sus criterios y le encontraremos la propiedad perfecta. Nuestro equipo analiza más de 500 propiedades disponibles.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-5 offset-lg-1" data-aos="fade-left">
|
||
<form class="cta-form" id="leadForm">
|
||
<h5 class="mb-4"><i class="bi bi-search me-2"></i><span data-i18n="cta.form.title">Búsqueda personalizada</span></h5>
|
||
<div class="row">
|
||
<div class="col-md-6 mb-3">
|
||
<input type="text" class="form-control" id="ctaName" required placeholder="Nombre *">
|
||
</div>
|
||
<div class="col-md-6 mb-3">
|
||
<input type="tel" class="form-control" id="ctaPhone" required placeholder="Teléfono *">
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<input type="email" class="form-control" id="ctaEmail" placeholder="Email">
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<select class="form-select" id="ctaBudget" required>
|
||
<option value="" data-i18n="cta.form.budget">Presupuesto</option>
|
||
<option value="50000">20.000€ - 50.000€</option>
|
||
<option value="100000">50.000€ - 100.000€</option>
|
||
<option value="200000">100.000€ - 200.000€</option>
|
||
<option value="500000">200.000€ - 500.000€</option>
|
||
<option value="1000000">500.000€+</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<select class="form-select" id="ctaType">
|
||
<option value="" data-i18n="cta.form.type">Tipo de propiedad</option>
|
||
<option value="agricultural" data-i18n="cta.form.typeAgricultural">Terreno agrícola</option>
|
||
<option value="urban" data-i18n="cta.form.typeUrban">Terreno urbano</option>
|
||
<option value="house" data-i18n="cta.form.typeHouse">Casa</option>
|
||
<option value="apartment" data-i18n="cta.form.typeApartment">Apartamento</option>
|
||
<option value="ruins" data-i18n="cta.form.typeRuins">Ruinas</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<textarea class="form-control" id="ctaMessage" rows="3" placeholder="Mensaje opcional"></textarea>
|
||
</div>
|
||
<div class="col-12">
|
||
<button type="submit" class="btn btn-primary-custom">
|
||
<i class="bi bi-send me-2"></i><span data-i18n="cta.form.submit">Enviar Solicitud</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ TESTIMONIALS ============ -->
|
||
<section class="testimonials section-padding" id="testimonials">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="testimonials.title">Lo Que Dicen Nuestros Clientes</h2>
|
||
<p class="section-subtitle" data-i18n="testimonials.subtitle">
|
||
Historias reales de personas que encontraron su hogar en Tenerife
|
||
</p>
|
||
</div>
|
||
<div class="row" id="testimonialsCarousel">
|
||
<!-- Testimonials loaded via JS -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ FAQ ============ -->
|
||
<section class="faq section-padding" id="faq">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="faq.title">Preguntas Frecuentes</h2>
|
||
<p class="section-subtitle" data-i18n="faq.subtitle">
|
||
Respondemos las dudas más comunes de nuestros clientes
|
||
</p>
|
||
</div>
|
||
<div class="row justify-content-center">
|
||
<div class="col-lg-8" data-aos="fade-up">
|
||
<div class="accordion" id="faqAccordion">
|
||
<!-- FAQ Items loaded via JS -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ CONTACT ============ -->
|
||
<section class="contact section-padding" id="contact">
|
||
<div class="container">
|
||
<div class="text-center mb-5" data-aos="fade-up">
|
||
<h2 class="section-title" data-i18n="contact.title">Contáctenos</h2>
|
||
<p class="section-subtitle" data-i18n="contact.subtitle">
|
||
Estamos aquí para ayudarle a encontrar su propiedad ideal
|
||
</p>
|
||
</div>
|
||
<div class="row g-4">
|
||
<div class="col-lg-5" data-aos="fade-right">
|
||
<div class="contact-info-card">
|
||
<h4 class="mb-4" data-i18n="contact.info.title">Información de Contacto</h4>
|
||
|
||
<div class="contact-item">
|
||
<div class="contact-icon">
|
||
<i class="bi bi-geo-alt"></i>
|
||
</div>
|
||
<div>
|
||
<h5 data-i18n="contact.info.address">Dirección</h5>
|
||
<p>Avda. de la Constitución, 25<br>38640 Adeje, Tenerife<br>España</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="contact-item">
|
||
<div class="contact-icon">
|
||
<i class="bi bi-telephone"></i>
|
||
</div>
|
||
<div>
|
||
<h5 data-i18n="contact.info.phone">Teléfono</h5>
|
||
<p>+34 922 123 456</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="contact-item">
|
||
<div class="contact-icon">
|
||
<i class="bi bi-envelope"></i>
|
||
</div>
|
||
<div>
|
||
<h5>Email</h5>
|
||
<p>info@tenerifeprop.com</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="contact-item">
|
||
<div class="contact-icon">
|
||
<i class="bi bi-clock"></i>
|
||
</div>
|
||
<div>
|
||
<h5 data-i18n="contact.info.hours">Horario</h5>
|
||
<p data-i18n="contact.info.hoursText">Lunes - Viernes: 9:00 - 19:00<br>Sábado: 10:00 - 14:00</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="social-links">
|
||
<a href="#" class="social-link"><i class="bi bi-facebook"></i></a>
|
||
<a href="#" class="social-link"><i class="bi bi-instagram"></i></a>
|
||
<a href="#" class="social-link"><i class="bi bi-youtube"></i></a>
|
||
<a href="#" class="social-link"><i class="bi bi-telegram"></i></a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-7" data-aos="fade-left">
|
||
<form class="contact-info-card" id="contactForm">
|
||
<h4 class="mb-4" data-i18n="contact.form.title">Envíenos un Mensaje</h4>
|
||
<div class="row">
|
||
<div class="col-md-6 mb-3">
|
||
<input type="text" class="form-control" id="contactName" required placeholder="Nombre *">
|
||
</div>
|
||
<div class="col-md-6 mb-3">
|
||
<input type="tel" class="form-control" id="contactPhone" required placeholder="Teléfono *">
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<input type="email" class="form-control" id="contactEmail" required placeholder="Email *">
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<select class="form-select" id="contactSubject">
|
||
<option value="info" data-i18n="contact.form.subjectInfo">Solicitar información</option>
|
||
<option value="viewing" data-i18n="contact.form.subjectViewing">Solicitar visita</option>
|
||
<option value="purchase" data-i18n="contact.form.subjectPurchase">Compra de propiedad</option>
|
||
<option value="other" data-i18n="contact.form.subjectOther">Otro</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-12 mb-3">
|
||
<textarea class="form-control" id="contactMessage" rows="5" required placeholder="Su mensaje *"></textarea>
|
||
</div>
|
||
<div class="col-12">
|
||
<div class="form-check mb-3">
|
||
<input class="form-check-input" type="checkbox" id="privacyCheck" required>
|
||
<label class="form-check-label" for="privacyCheck" data-i18n="contact.form.privacy">
|
||
Acepto la política de privacidad y el tratamiento de mis datos
|
||
</label>
|
||
</div>
|
||
<button type="submit" class="btn btn-primary-custom">
|
||
<i class="bi bi-send me-2"></i><span data-i18n="contact.form.submit">Enviar Mensaje</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============ FOOTER ============ -->
|
||
<footer>
|
||
<div class="container">
|
||
<div class="row g-4">
|
||
<div class="col-lg-4">
|
||
<div class="footer-brand">Tenerife<span>Prop</span></div>
|
||
<p class="footer-about" data-i18n="footer.about">
|
||
Su socio de confianza en la compra de propiedades en Tenerife. Más de 12 años ayudando a clientes de todo el mundo a encontrar su hogar en el paraíso.
|
||
</p>
|
||
<div class="social-links">
|
||
<a href="#" class="social-link"><i class="bi bi-facebook"></i></a>
|
||
<a href="#" class="social-link"><i class="bi bi-instagram"></i></a>
|
||
<a href="#" class="social-link"><i class="bi bi-youtube"></i></a>
|
||
<a href="#" class="social-link"><i class="bi bi-telegram"></i></a>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-2 col-md-4">
|
||
<h5 class="footer-title" data-i18n="footer.navigation">Navegación</h5>
|
||
<ul class="footer-links">
|
||
<li><a href="#home" data-i18n="nav.home">Inicio</a></li>
|
||
<li><a href="#catalog" data-i18n="nav.catalog">Catálogo</a></li>
|
||
<li><a href="#services" data-i18n="nav.services">Servicios</a></li>
|
||
<li><a href="#testimonials" data-i18n="nav.testimonials">Testimonios</a></li>
|
||
<li><a href="#contact" data-i18n="nav.contact">Contacto</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="col-lg-3 col-md-4">
|
||
<h5 class="footer-title" data-i18n="footer.properties">Propiedades</h5>
|
||
<ul class="footer-links">
|
||
<li><a href="#" data-i18n="footer.terrain">Terrenos agrícolas</a></li>
|
||
<li><a href="#" data-i18n="footer.urban">Terrenos urbanos</a></li>
|
||
<li><a href="#" data-i18n="footer.houses">Casas y villas</a></li>
|
||
<li><a href="#" data-i18n="footer.apartments">Apartamentos</a></li>
|
||
<li><a href="#" data-i18n="footer.ruins">Ruinas</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="col-lg-3 col-md-4">
|
||
<h5 class="footer-title" data-i18n="footer.contact">Contacto</h5>
|
||
<div class="footer-contact-item">
|
||
<i class="bi bi-geo-alt"></i>
|
||
<span>Adeje, Tenerife, España</span>
|
||
</div>
|
||
<div class="footer-contact-item">
|
||
<i class="bi bi-telephone"></i>
|
||
<span>+34 922 123 456</span>
|
||
</div>
|
||
<div class="footer-contact-item">
|
||
<i class="bi bi-envelope"></i>
|
||
<span>info@tenerifeprop.com</span>
|
||
</div>
|
||
<div class="footer-contact-item">
|
||
<i class="bi bi-whatsapp"></i>
|
||
<span>+34 600 123 456</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="footer-bottom">
|
||
<p>© 2024 TenerifeProp. <span data-i18n="footer.rights">Todos los derechos reservados.</span></p>
|
||
<div class="footer-legal">
|
||
<a href="#" data-i18n="footer.privacy">Política de Privacidad</a>
|
||
<a href="#" data-i18n="footer.terms">Términos de Uso</a>
|
||
<a href="#" data-i18n="footer.cookies">Cookies</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
<!-- ============ PROPERTY MODAL ============ -->
|
||
<div class="modal fade property-modal" id="propertyModal" tabindex="-1">
|
||
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-gallery">
|
||
<img src="" alt="" id="modalImage">
|
||
<div class="gallery-controls">
|
||
<span class="gallery-dot active"></span>
|
||
<span class="gallery-dot"></span>
|
||
<span class="gallery-dot"></span>
|
||
</div>
|
||
</div>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<span class="property-type" id="modalType"></span>
|
||
<h3 class="modal-property-title" id="modalTitle"></h3>
|
||
<p class="modal-property-location" id="modalLocation"></p>
|
||
<div class="modal-price" id="modalPrice"></div>
|
||
|
||
<div class="modal-features" id="modalFeatures">
|
||
<!-- Features loaded via JS -->
|
||
</div>
|
||
|
||
<h5 class="mb-3"><i class="bi bi-tools me-2"></i><span data-i18n="modal.utilities">Comunicaciones</span></h5>
|
||
<div class="modal-utilities" id="modalUtilities">
|
||
<!-- Utilities loaded via JS -->
|
||
</div>
|
||
|
||
<div class="d-flex gap-2 mt-4">
|
||
<a href="#" class="btn btn-primary-custom flex-fill" id="modalSchedule" data-i18n="modal.schedule">
|
||
<i class="bi bi-calendar-check me-2"></i>Agendar Visita
|
||
</a>
|
||
<a href="#" class="btn btn-outline-primary flex-fill" id="modalWhatsapp" target="_blank">
|
||
<i class="bi bi-whatsapp me-2"></i>WhatsApp
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============ WHATSAPP FLOAT ============ -->
|
||
<div class="whatsapp-float">
|
||
<a href="https://wa.me/34600123456" class="whatsapp-btn" target="_blank" title="WhatsApp">
|
||
<i class="bi bi-whatsapp"></i>
|
||
</a>
|
||
</div>
|
||
|
||
<!-- Scripts -->
|
||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/jquery-mask-plugin@1.14.16/dist/jquery.mask.min.js"></script>
|
||
<script src="/js/navigation.js"></script>
|
||
|
||
<script>
|
||
// ============ LANGUAGE DATA ============
|
||
const translations = {
|
||
es: {
|
||
brand: 'Tenerife<span>Prop</span>',
|
||
nav: {
|
||
home: 'Inicio',
|
||
catalog: 'Catálogo',
|
||
services: 'Servicios',
|
||
testimonials: 'Testimonios',
|
||
contact: 'Contacto'
|
||
},
|
||
hero: {
|
||
badge: '<i class="bi bi-star-fill me-2"></i>Más de 500+ propiedades vendidas',
|
||
title1: 'Terrenos y Propiedades',
|
||
title2: 'en Tenerife',
|
||
subtitle: 'Encuentra tu terreno perfecto en el paraíso de las Islas Canarias. Terrenos agrícolas, urbanos, casas y apartamentos con documentación garantizada.',
|
||
cta1: '<i class="bi bi-grid-3x3-gap me-2"></i>Ver Catálogo',
|
||
cta2: '<i class="bi bi-whatsapp me-2"></i>Consultar Ahora',
|
||
stat1: 'Propiedades vendidas',
|
||
stat2: 'Años de experiencia',
|
||
stat3: 'Clientes satisfechos',
|
||
float1: { title: 'Costa Adeje', text: 'Desde 85.000€' },
|
||
float2: { title: 'Constalmar', text: 'Terreno urbano' }
|
||
},
|
||
advantages: {
|
||
title: '¿Por Qué Elegirnos?',
|
||
subtitle: 'Más de una década de experiencia en el mercado inmobiliario de Tenerife',
|
||
item1: { title: 'Legalidad Garantizada', text: 'Verificación completa de toda la documentación, incluyendo catastro, registro de la propiedad y licencias municipales.' },
|
||
item2: { title: 'Precios Transparentes', text: 'Sin costes ocultos ni comisiones sorpresa. Precio cerrado incluyendo todos los gastos de gestión y notaría.' },
|
||
item3: { title: 'Asistencia 360°', text: 'Acompañamiento completo desde la visita hasta la mudanza: transferencias, apertura de cuentas, visados.' }
|
||
},
|
||
catalog: {
|
||
title: 'Nuestro Catálogo',
|
||
subtitle: 'Descubre nuestra selección de propiedades en Tenerife',
|
||
tab: {
|
||
all: 'Todos',
|
||
agricultural: 'Terrenos Agrícolas',
|
||
urban: 'Terrenos Urbanos',
|
||
houses: 'Casas',
|
||
apartments: 'Apartamentos',
|
||
ruins: 'Ruinas'
|
||
}
|
||
},
|
||
filters: {
|
||
title: 'Filtros',
|
||
price: 'Precio',
|
||
area: 'Superficie (m²)',
|
||
utilities: 'Comunicaciones',
|
||
water: 'Agua',
|
||
electricity: 'Electricidad',
|
||
road: 'Acceso rodado',
|
||
features: 'Características',
|
||
hasRuins: 'Con ruinas/edificación',
|
||
license: 'Licencia de obras',
|
||
seaView: 'Vista al mar',
|
||
apply: 'Aplicar Filtros'
|
||
},
|
||
property: {
|
||
area: 'm²',
|
||
details: 'Ver Detalles',
|
||
favorite: 'Añadir a favoritos'
|
||
},
|
||
stats: {
|
||
title: 'Nuestra Trayectoria',
|
||
subtitle: 'Números que reflejan nuestra experiencia y compromiso',
|
||
properties: 'Propiedades vendidas',
|
||
years: 'Años en el mercado',
|
||
clients: 'Clientes felices',
|
||
countries: 'Países de origen'
|
||
},
|
||
services: {
|
||
title: 'Nuestros Servicios',
|
||
subtitle: 'Ofrecemos un servicio integral para hacer realidad su sueño',
|
||
item1: { title: 'Asesoría Legal', text: 'Verificación completa de la documentación, gestoría con bancos españoles, y acompañamiento en el Registro de la Propiedad.' },
|
||
item2: { title: 'Financiación Hipotecaria', text: 'Apoyo en la obtención de préstamos hipotecarios con los principales bancos españoles. Tasas competitivas para no residentes.' },
|
||
item3: { title: 'Reformas y Construcción', text: 'Red de arquitectos y constructores locales para reformas, ampliaciones y construcción de viviendas desde cero.' },
|
||
item4: { title: 'Servicio de Relocation', text: 'Apoyo en la obtención de NIE/NIF, apertura de cuentas bancarias, y adaptación a la vida en Tenerife.' },
|
||
item5: { title: 'Gestión de Alquileres', text: 'Gestión completa de propiedades en alquiler vacacional. Maximizamos su rentabilidad con Booking, Airbnb y alquileres de larga temporada.' },
|
||
item6: { title: 'Visitas Virtuales', text: '¿No puede visitar Tenerife? Ofrecemos visitas guiadas por video, drones, y contenido 360° de todas nuestras propiedades.' }
|
||
},
|
||
cta: {
|
||
title: '¿No encontró lo que buscaba?',
|
||
subtitle: 'Deje sus criterios y le encontraremos la propiedad perfecta. Nuestro equipo analiza más de 500 propiedades disponibles.',
|
||
form: {
|
||
title: 'Búsqueda personalizada',
|
||
budget: 'Presupuesto',
|
||
type: 'Tipo de propiedad',
|
||
typeAgricultural: 'Terreno agrícola',
|
||
typeUrban: 'Terreno urbano',
|
||
typeHouse: 'Casa',
|
||
typeApartment: 'Apartamento',
|
||
typeRuins: 'Ruinas',
|
||
submit: 'Enviar Solicitud'
|
||
}
|
||
},
|
||
testimonials: {
|
||
title: 'Lo Que Dicen Nuestros Clientes',
|
||
subtitle: 'Historias reales de personas que encontraron su hogar en Tenerife'
|
||
},
|
||
faq: {
|
||
title: 'Preguntas Frecuentes',
|
||
subtitle: 'Respondemos las dudas más comunes de nuestros clientes'
|
||
},
|
||
contact: {
|
||
title: 'Contáctenos',
|
||
subtitle: 'Estamos aquí para ayudarle a encontrar su propiedad ideal',
|
||
info: {
|
||
title: 'Información de Contacto',
|
||
address: 'Dirección',
|
||
phone: 'Teléfono',
|
||
hours: 'Horario',
|
||
hoursText: 'Lunes - Viernes: 9:00 - 19:00<br>Sábado: 10:00 - 14:00'
|
||
},
|
||
form: {
|
||
title: 'Envíenos un Mensaje',
|
||
subjectInfo: 'Solicitar información',
|
||
subjectViewing: 'Solicitar visita',
|
||
subjectPurchase: 'Compra de propiedad',
|
||
subjectOther: 'Otro',
|
||
privacy: 'Acepto la política de privacidad y el tratamiento de mis datos',
|
||
submit: 'Enviar Mensaje'
|
||
}
|
||
},
|
||
footer: {
|
||
about: 'Su socio de confianza en la compra de propiedades en Tenerife. Más de 12 años ayudando a clientes de todo el mundo a encontrar su hogar en el paraíso.',
|
||
navigation: 'Navegación',
|
||
properties: 'Propiedades',
|
||
contact: 'Contacto',
|
||
terrain: 'Terrenos agrícolas',
|
||
urban: 'Terrenos urbanos',
|
||
houses: 'Casas y villas',
|
||
apartments: 'Apartamentos',
|
||
ruins: 'Ruinas',
|
||
rights: 'Todos los derechos reservados.',
|
||
privacy: 'Política de Privacidad',
|
||
terms: 'Términos de Uso',
|
||
cookies: 'Cookies'
|
||
},
|
||
modal: {
|
||
utilities: 'Comunicaciones',
|
||
schedule: 'Agendar Visita',
|
||
area: 'Superficie',
|
||
rooms: 'Habitaciones',
|
||
bathrooms: 'Baños',
|
||
parking: 'Plazas de garaje',
|
||
seaView: 'Vista al mar',
|
||
hasWater: 'Agua disponible',
|
||
noWater: 'Agua no disponible',
|
||
hasElectricity: 'Electricidad disponible',
|
||
noElectricity: 'Electricidad no disponible',
|
||
hasRoad: 'Acceso rodado',
|
||
noRoad: 'Sin acceso rodado',
|
||
withRuins: 'Con ruinas/edificación',
|
||
hasLicense: 'Licencia de obras',
|
||
noLicense: 'Sin licencia'
|
||
},
|
||
form: {
|
||
success: '¡Formulario enviado con éxito! Nos pondremos en contacto pronto.',
|
||
error: 'Error al enviar el formulario. Por favor, inténtelo de nuevo.'
|
||
},
|
||
utility: {
|
||
water: 'Agua',
|
||
electricity: 'Electricidad',
|
||
road: 'Acceso',
|
||
yes: 'Sí',
|
||
no: 'No'
|
||
}
|
||
},
|
||
ru: {
|
||
brand: 'Tenerife<span>Prop</span>',
|
||
nav: {
|
||
home: 'Главная',
|
||
catalog: 'Каталог',
|
||
services: 'Услуги',
|
||
testimonials: 'Отзывы',
|
||
contact: 'Контакты'
|
||
},
|
||
hero: {
|
||
badge: '<i class="bi bi-star-fill me-2"></i>Более 500+ объектов продано',
|
||
title1: 'Земельные участки и недвижимость',
|
||
title2: 'на Тенерифе',
|
||
subtitle: 'Найдите идеальный участок в раю Канарских островов. Сельскохозяйственные, городские участки, дома и апартаменты с гарантированным оформлением документов.',
|
||
cta1: '<i class="bi bi-grid-3x3-gap me-2"></i>Смотреть каталог',
|
||
cta2: '<i class="bi bi-whatsapp me-2"></i>Консультация',
|
||
stat1: 'Проданных объектов',
|
||
stat2: 'Лет опыта',
|
||
stat3: 'Довольных клиентов',
|
||
float1: { title: 'Коста Адехе', text: 'От 85.000€' },
|
||
float2: { title: 'Констамар', text: 'Городской участок' }
|
||
},
|
||
advantages: {
|
||
title: 'Почему выбирают нас?',
|
||
subtitle: 'Более десяти лет опыта на рынке недвижимости Тенерифе',
|
||
item1: { title: 'Гарантия законности', text: 'Полная проверка всей документации, включая кадастр, реестр собственности и муниципальные лицензии.' },
|
||
item2: { title: 'Прозрачные цены', text: 'Без скрытых платежей и комиссий. Итоговая цена включает все расходы на оформление и нотариуса.' },
|
||
item3: { title: 'Комплексное сопровождение', text: 'Полное сопровождение от просмотра до переезда: переводы, открытие счетов, визы.' }
|
||
},
|
||
catalog: {
|
||
title: 'Наш каталог',
|
||
subtitle: 'Откройте для себя нашу подборку объектов на Тенерифе',
|
||
tab: {
|
||
all: 'Все',
|
||
agricultural: 'Сельхозучастки',
|
||
urban: 'Городские участки',
|
||
houses: 'Дома',
|
||
apartments: 'Апартаменты',
|
||
ruins: 'Руины'
|
||
}
|
||
},
|
||
filters: {
|
||
title: 'Фильтры',
|
||
price: 'Цена',
|
||
area: 'Площадь (м²)',
|
||
utilities: 'Коммуникации',
|
||
water: 'Вода',
|
||
electricity: 'Электричество',
|
||
road: 'Подъезд',
|
||
features: 'Характеристики',
|
||
hasRuins: 'С руинами/постройками',
|
||
license: 'Разрешение на стройку',
|
||
seaView: 'Вид на море',
|
||
apply: 'Применить фильтры'
|
||
},
|
||
property: {
|
||
area: 'м²',
|
||
details: 'Подробнее',
|
||
favorite: 'В избранное'
|
||
},
|
||
stats: {
|
||
title: 'Наш путь',
|
||
subtitle: 'Цифры, отражающие наш опыт и преданность делу',
|
||
properties: 'Проданных объектов',
|
||
years: 'Лет на рынке',
|
||
clients: 'Счастливых клиентов',
|
||
countries: 'Стран происхождения'
|
||
},
|
||
services: {
|
||
title: 'Наши услуги',
|
||
subtitle: 'Мы предлагаем полный спектр услуг, чтобы воплотить вашу мечту в реальность',
|
||
item1: { title: 'Юридическая поддержка', text: 'Полная проверка документации, работа с испанскими банками, сопровождение в Реестре собственности.' },
|
||
item2: { title: 'Ипотечное финансирование', text: 'Помощь в получении ипотечных кредитов в ведущих испанских банках. Конкурентные ставки для нерезидентов.' },
|
||
item3: { title: 'Ремонт и строительство', text: 'Сеть местных архитекторов и строителей для ремонта, расширения и строительства домов с нуля.' },
|
||
item4: { title: 'Сервис релокации', text: 'Помощь в получении NIE/NIF, открытие банковских счетов и адаптация к жизни на Тенерифе.' },
|
||
item5: { title: 'Управление арендой', text: 'Полное управление арендой недвижимости. Максимизируем вашу доходность с Booking, Airbnb и долгосрочной арендой.' },
|
||
item6: { title: 'Виртуальные просмотры', text: 'Не можете посетить Тенерифе? Предлагаем видео-туры, съёмку с дрона и панорамы 360° всех объектов.' }
|
||
},
|
||
cta: {
|
||
title: 'Не нашли подходящий вариант?',
|
||
subtitle: 'Оставьте ваши критерии, и мы найдём для вас идеальную недвижимость. Наша команда анализирует более 500 объектов.',
|
||
form: {
|
||
title: 'Персональный подбор',
|
||
budget: 'Бюджет',
|
||
type: 'Тип недвижимости',
|
||
typeAgricultural: 'Сельхозучасток',
|
||
typeUrban: 'Городской участок',
|
||
typeHouse: 'Дом',
|
||
typeApartment: 'Апартаменты',
|
||
typeRuins: 'Руины',
|
||
submit: 'Отправить заявку'
|
||
}
|
||
},
|
||
testimonials: {
|
||
title: 'Отзывы наших клиентов',
|
||
subtitle: 'Реальные истории людей, нашедших свой дом на Тенерифе'
|
||
},
|
||
faq: {
|
||
title: 'Часто задаваемые вопросы',
|
||
subtitle: 'Отвечаем на самые распространённые вопросы наших клиентов'
|
||
},
|
||
contact: {
|
||
title: 'Свяжитесь с нами',
|
||
subtitle: 'Мы здесь, чтобы помочь вам найти идеальную недвижимость',
|
||
info: {
|
||
title: 'Контактная информация',
|
||
address: 'Адрес',
|
||
phone: 'Телефон',
|
||
hours: 'Часы работы',
|
||
hoursText: 'Пн - Пт: 9:00 - 19:00<br>Сб: 10:00 - 14:00'
|
||
},
|
||
form: {
|
||
title: 'Отправить сообщение',
|
||
subjectInfo: 'Запрос информации',
|
||
subjectViewing: 'Запрос просмотра',
|
||
subjectPurchase: 'Покупка недвижимости',
|
||
subjectOther: 'Другое',
|
||
privacy: 'Я принимаю политику конфиденциальности и обработку моих данных',
|
||
submit: 'Отправить сообщение'
|
||
}
|
||
},
|
||
footer: {
|
||
about: 'Ваш надёжный партнёр в покупке недвижимости на Тенерифе. Более 12 лет помогаем клиентам со всего мира найти свой дом в раю.',
|
||
navigation: 'Навигация',
|
||
properties: 'Объекты',
|
||
contact: 'Контакты',
|
||
terrain: 'Сельхозучастки',
|
||
urban: 'Городские участки',
|
||
houses: 'Дома и виллы',
|
||
apartments: 'Апартаменты',
|
||
ruins: 'Руины',
|
||
rights: 'Все права защищены.',
|
||
privacy: 'Политика конфиденциальности',
|
||
terms: 'Условия использования',
|
||
cookies: 'Файлы cookies'
|
||
},
|
||
modal: {
|
||
utilities: 'Коммуникации',
|
||
schedule: 'Записаться на просмотр',
|
||
area: 'Площадь',
|
||
rooms: 'Комнаты',
|
||
bathrooms: 'Ванные',
|
||
parking: 'Парковка',
|
||
seaView: 'Вид на море',
|
||
hasWater: 'Вода подключена',
|
||
noWater: 'Вода не подключена',
|
||
hasElectricity: 'Электричество подключено',
|
||
noElectricity: 'Электричество не подключено',
|
||
hasRoad: 'Подъезд',
|
||
noRoad: 'Без подъезда',
|
||
withRuins: 'С руинами/постройками',
|
||
hasLicense: 'Разрешение на строительство',
|
||
noLicense: 'Без разрешения'
|
||
},
|
||
form: {
|
||
success: 'Форма успешно отправлена! Мы свяжемся с вами в ближайшее время.',
|
||
error: 'Ошибка отправки формы. Пожалуйста, попробуйте ещё раз.'
|
||
},
|
||
utility: {
|
||
water: 'Вода',
|
||
electricity: 'Электричество',
|
||
road: 'Подъезд',
|
||
yes: 'Есть',
|
||
no: 'Нет'
|
||
}
|
||
}
|
||
};
|
||
|
||
let currentLang = 'es';
|
||
|
||
// ============ XSS PROTECTION ============
|
||
function escapeHtml(text) {
|
||
if (text == null) return '';
|
||
const div = document.createElement('div');
|
||
div.textContent = String(text);
|
||
return div.innerHTML;
|
||
}
|
||
|
||
// ============ PROPERTIES DATA ============
|
||
const properties = [
|
||
{
|
||
id: 1,
|
||
slug: 'terreno-agricola-guimar',
|
||
type: 'agricultural',
|
||
badge: 'new',
|
||
title: { es: 'Terreno Agrícola en Güímar', ru: 'Сельхозучасток в Гуимаре' },
|
||
location: { es: 'Güímar, Tenerife Sur', ru: 'Гуимар, Южное Тенерифе' },
|
||
area: 8500,
|
||
price: 125000,
|
||
image: 'https://images.unsplash.com/photo-1500382017468-9049fed747ef?w=800&q=80',
|
||
water: true,
|
||
electricity: true,
|
||
road: false,
|
||
ruins: false,
|
||
license: false,
|
||
seaView: true,
|
||
coordinates: [28.3121, -16.4096]
|
||
},
|
||
{
|
||
id: 2,
|
||
slug: 'terreno-urbano-adeje',
|
||
type: 'urban',
|
||
badge: 'exclusive',
|
||
title: { es: 'Terreno Urbano en Adeje', ru: 'Городской участок в Адехе' },
|
||
location: { es: 'Adeje, Tenerife Sur', ru: 'Адехе, Южное Тенерифе' },
|
||
area: 2500,
|
||
price: 385000,
|
||
image: 'https://images.unsplash.com/photo-1564013799919-ab600027ffc6?w=800&q=80',
|
||
water: true,
|
||
electricity: true,
|
||
road: true,
|
||
ruins: false,
|
||
license: true,
|
||
seaView: true,
|
||
coordinates: [28.1221, -16.7306]
|
||
},
|
||
{
|
||
id: 3,
|
||
slug: 'villa-los-cristianos',
|
||
type: 'house',
|
||
badge: 'new',
|
||
title: { es: 'Villa con Vistas al Mar', ru: 'Вилла с видом на море' },
|
||
location: { es: 'Los Cristianos, Arona', ru: 'Лос Кристьянос, Арона' },
|
||
area: 350,
|
||
price: 595000,
|
||
image: 'https://images.unsplash.com/photo-1613490493576-7fde63acd811?w=800&q=80',
|
||
rooms: 4,
|
||
bathrooms: 3,
|
||
parking: 2,
|
||
water: true,
|
||
electricity: true,
|
||
road: true,
|
||
ruins: false,
|
||
license: true,
|
||
seaView: true,
|
||
coordinates: [28.0497, -16.7257]
|
||
},
|
||
{
|
||
id: 4,
|
||
slug: 'terreno-vista-orotava',
|
||
type: 'agricultural',
|
||
badge: '',
|
||
title: { es: 'Terreno Rustico en La Orotava', ru: 'Сельский участок в Ла Оротаве' },
|
||
location: { es: 'La Orotava, Tenerife Norte', ru: 'Ла Оротава, Северное Тенерифе' },
|
||
area: 12000,
|
||
price: 95000,
|
||
image: 'https://images.unsplash.com/photo-1501785888041-af3ef285b470?w=800&q=80',
|
||
water: true,
|
||
electricity: false,
|
||
road: true,
|
||
ruins: true,
|
||
license: false,
|
||
seaView: false,
|
||
coordinates: [28.3897, -16.5259]
|
||
},
|
||
{
|
||
id: 5,
|
||
slug: 'apartamento-playa-las-americas',
|
||
type: 'apartment',
|
||
badge: 'exclusive',
|
||
title: { es: 'Apartamento en Puerto de la Cruz', ru: 'Апартаменты в Пуэрто де ла Крус' },
|
||
location: { es: 'Puerto de la Cruz, Tenerife Norte', ru: 'Пуэрто де ла Крус, Северное Тенерифе' },
|
||
area: 85,
|
||
price: 245000,
|
||
image: 'https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80',
|
||
rooms: 2,
|
||
bathrooms: 2,
|
||
parking: 1,
|
||
water: true,
|
||
electricity: true,
|
||
road: true,
|
||
ruins: false,
|
||
license: true,
|
||
seaView: true,
|
||
coordinates: [28.4137, -16.5491]
|
||
},
|
||
{
|
||
id: 6,
|
||
slug: 'villa-piscina-san-miguel',
|
||
type: 'ruins',
|
||
badge: 'new',
|
||
title: { es: 'Casa Ruina para Reconstruir', ru: 'Дом-руина для восстановления' },
|
||
location: { es: 'San Miguel de Abona', ru: 'Сан Мигель де Абона' },
|
||
area: 4200,
|
||
price: 175000,
|
||
image: 'https://images.unsplash.com/photo-1518780664697-55e3ad937233?w=800&q=80',
|
||
water: true,
|
||
electricity: false,
|
||
road: true,
|
||
ruins: true,
|
||
license: true,
|
||
seaView: false,
|
||
coordinates: [28.0997, -16.5697]
|
||
},
|
||
{
|
||
id: 7,
|
||
slug: 'terreno-urbanizable-granadilla',
|
||
type: 'urban',
|
||
badge: '',
|
||
title: { es: 'Parcela Urbana en Granadilla', ru: 'Городской участок в Гранадилье' },
|
||
location: { es: 'Granadilla de Abona', ru: 'Гранадилья де Абона' },
|
||
area: 1800,
|
||
price: 210000,
|
||
image: 'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&q=80',
|
||
water: true,
|
||
electricity: true,
|
||
road: true,
|
||
ruins: false,
|
||
license: true,
|
||
seaView: false,
|
||
coordinates: [28.1197, -16.5797]
|
||
},
|
||
{
|
||
id: 8,
|
||
slug: 'chalet-santa-cruz',
|
||
type: 'house',
|
||
badge: 'exclusive',
|
||
title: { es: 'Chalet Independiente', ru: 'Отдельный шале' },
|
||
location: { es: 'La Caleta, Adeje', ru: 'Ла Каллета, Адехе' },
|
||
area: 280,
|
||
price: 750000,
|
||
image: 'https://images.unsplash.com/photo-1600596542815-ffad4c1539a9?w=800&q=80',
|
||
rooms: 5,
|
||
bathrooms: 4,
|
||
parking: 3,
|
||
water: true,
|
||
electricity: true,
|
||
road: true,
|
||
ruins: false,
|
||
license: true,
|
||
seaView: true,
|
||
coordinates: [28.0921, -16.7406]
|
||
},
|
||
{
|
||
id: 9,
|
||
slug: 'finca-platanos-canarios',
|
||
type: 'agricultural',
|
||
badge: '',
|
||
title: { es: 'Finca con Palmeras', ru: 'Финка с пальмами' },
|
||
location: { es: 'El Sauzal, Tenerife Norte', ru: 'Эль Саузаль, Северное Тенерифе' },
|
||
area: 15000,
|
||
price: 320000,
|
||
image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80',
|
||
water: true,
|
||
electricity: true,
|
||
road: true,
|
||
ruins: true,
|
||
license: false,
|
||
seaView: true,
|
||
coordinates: [28.4297, -16.4897]
|
||
}
|
||
];
|
||
|
||
// ============ TESTIMONIALS DATA ============
|
||
const testimonials = [
|
||
{
|
||
text: {
|
||
es: 'Encontré mi terreno perfecto en solo 3 semanas. El equipo de TenerifeProp me ayudó con todo, desde la documentación hasta la conexión de servicios. Increíble servicio.',
|
||
ru: 'Я нашёл идеальный участок всего за 3 недели. Команда TenerifeProp помогла мне со всем — от документации до подключения коммуникаций. Невероятный сервис.'
|
||
},
|
||
name: 'Michael Schmidt',
|
||
country: { es: 'Alemania', ru: 'Германия' },
|
||
image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop'
|
||
},
|
||
{
|
||
text: {
|
||
es: 'Compré una casa en Adeje para jubilación. El proceso fue transparente y sin sorpresas. Totalmente recomendados para cualquier persona que busque invertir en Tenerife.',
|
||
ru: 'Купил дом в Адехе для пенсии. Процесс был прозрачным без сюрпризов. Настоятельно рекомендую всем, кто хочет инвестировать на Тенерифе.'
|
||
},
|
||
name: 'Pierre Dubois',
|
||
country: { es: 'Francia', ru: 'Франция' },
|
||
image: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=100&h=100&fit=crop'
|
||
},
|
||
{
|
||
text: {
|
||
es: 'Las ruinas que compramos fueron restauradas y ahora tenemos la casa de nuestros sueños. El equipo,懂 todo el proceso legal y nos mantuvieron informados en cada paso.',
|
||
ru: 'Купили руины, которые теперь превратились в дом нашей мечты. Команда TenerifeProp знала все юридические тонкости и держала нас в курсе на каждом этапе.'
|
||
},
|
||
name: 'Anna Petrova',
|
||
country: { es: 'Rusia', ru: 'Россия' },
|
||
image: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop'
|
||
},
|
||
{
|
||
text: {
|
||
es: 'Invertí en 3 apartamentos para alquiler vacacional. TenerifeProp gestiona todo y tengo una rentabilidad del 12% anual. Excelente inversión.',
|
||
ru: 'Инвестировал в 3 апартамента для краткосрочной аренды. TenerifeProp управляет всем, и я получаю 12% годовых. Отличная инвестиция.'
|
||
},
|
||
name: 'Carlos García',
|
||
country: { es: 'España', ru: 'Испания' },
|
||
image: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=100&h=100&fit=crop'
|
||
}
|
||
];
|
||
|
||
// ============ FAQ DATA ============
|
||
const faqItems = [
|
||
{
|
||
question: {
|
||
es: '¿Puedo comprar terreno siendo extranjero en España?',
|
||
ru: 'Могу ли я, как иностранец, купить землю в Испании?'
|
||
},
|
||
answer: {
|
||
es: 'Sí, absolutamente. España permite la compra de propiedades a ciudadanos extranjeros sin restricciones. Necesitará obtener un NIE (Número de Identificación de Extranjero) para completar la transacción, pero es un proceso sencillo que podemos ayudarle a gestionar.',
|
||
ru: 'Да, абсолютно. Испания позволяет иностранным гражданам покупать недвижимость без ограничений. Вам понадобится получить NIE (идентификационный номер иностранца) для завершения сделки, но это простой процесс, с которым мы можем помочь.'
|
||
}
|
||
},
|
||
{
|
||
question: {
|
||
es: '¿Qué costes adicionales hay que tener en cuenta al comprar?',
|
||
ru: 'Какие дополнительные расходы нужно учитывать при покупке?'
|
||
},
|
||
answer: {
|
||
es: 'Además del precio de compra, debe presupuestar: Impuesto de Transmisiones Patrimoniales (ITP) 6.5-8%, gastos de notaría (aprox. 1%), registro de propiedad (0.5-1%), gestoría (0.5-1%) y honorarios de la agencia (si aplica). En total, sumando un 10-12% al precio de compra.',
|
||
ru: 'Помимо стоимости покупки, необходимо учесть: налог на передачу собственности (ITP) 6.5-8%, нотариальные расходы (~1%), регистрация собственности (0.5-1%), услуги гестора (0.5-1%) и комиссия агентства (если применимо). Всего около 10-12% от стоимости покупки.'
|
||
}
|
||
},
|
||
{
|
||
question: {
|
||
es: '¿Puedo obtener hipoteca siendo no residente?',
|
||
ru: 'Могу ли я получить ипотеку как нерезидент?'
|
||
},
|
||
answer: {
|
||
es: 'Sí, los bancos españoles ofrecen hipotecas a no residentes, generalmente hasta el 60-70% del valor de tasación. Las tasas de interés son similares a las de los residentes. Le ayudamos a negociar con varios bancos para conseguir las mejores condiciones.',
|
||
ru: 'Да, испанские банки предлагают ипотеку нерезидентам, обычно до 60-70% от оценочной стоимости. Процентные ставки аналогичны ставкам для резидентов. Мы помогаем вести переговоры с несколькими банками для получения лучших условий.'
|
||
}
|
||
},
|
||
{
|
||
question: {
|
||
es: '¿Qué diferencia hay entre terreno rústico y urbano?',
|
||
ru: 'В чём разница между сельским и городским участком?'
|
||
},
|
||
answer: {
|
||
es: 'Un terreno rústico está destinado a uso agrícola y tiene restricciones de construcción más estrictas. Un terreno urbano puede строительство residencial/comercial con mayor facilidad. Los urbanos son más caros pero ofrecen más posibilidades de desarrollo.',
|
||
ru: 'Сельский участок предназначен для сельскохозяйственного использования и имеет более строгие ограничения на строительство. Городской участок позволяет строить жилую/коммерческую недвижимость с большей лёгкостью. Городские участки дороже, но предлагают больше возможностей для развития.'
|
||
}
|
||
},
|
||
{
|
||
question: {
|
||
es: '¿Cuánto tiempo tarda el proceso completo de compra?',
|
||
ru: 'Сколько времени занимает весь процесс покупки?'
|
||
},
|
||
answer: {
|
||
es: 'Desde la reserva hasta la escritura pública suelen pasar entre 4 y 8 semanas, dependiendo de la complejidad de la документации y si hay hipoteca involucrada. Para propiedades con situaciones jurídicas complejas, puede tomar un poco más.',
|
||
ru: 'От резервации до публичной записи обычно проходит от 4 до 8 недель, в зависимости от сложности документации и наличия ипотеки. Для объектов со сложными юридическими ситуациями это может занять немного больше времени.'
|
||
}
|
||
},
|
||
{
|
||
question: {
|
||
es: '¿Qué son las "ruinas" y es arriesgado comprar?',
|
||
ru: 'Что такое «руины» и рискованно ли их покупать?'
|
||
},
|
||
answer: {
|
||
es: 'Las "ruinas" son edificaciones en mal estado que pueden rehabilitarse. No es arriesgado si se verifica bien la documentación: que tenga licencia original, que no tenga deudas pendientes y que el catastro esté actualizado. Nosotros hacemos esta проверку exhaustiva antes de ofrecer cualquier propiedad.',
|
||
ru: '«Руины» — это здания в плохом состоянии, которые можно восстановить. Это не рискованно, если тщательно проверить документацию: наличие оригинальной лицензии, отсутствие долгов и актуальность кадастра. Мы проводим такую проверку перед предложением любого объекта.'
|
||
}
|
||
}
|
||
];
|
||
|
||
// ============ INITIALIZE APP ============
|
||
$(document).ready(function() {
|
||
// Initialize AOS
|
||
AOS.init({
|
||
duration: 800,
|
||
once: true,
|
||
offset: 100
|
||
});
|
||
|
||
// Initialize map
|
||
initMap();
|
||
|
||
// Load properties
|
||
loadProperties();
|
||
|
||
// Load testimonials
|
||
loadTestimonials();
|
||
|
||
// Load FAQ
|
||
loadFAQ();
|
||
|
||
// Language switcher
|
||
$('.lang-btn').click(function() {
|
||
const lang = $(this).data('lang');
|
||
switchLanguage(lang);
|
||
});
|
||
|
||
// Navbar scroll effect
|
||
$(window).scroll(function() {
|
||
if ($(this).scrollTop() > 100) {
|
||
$('.navbar').addClass('scrolled');
|
||
} else {
|
||
$('.navbar').removeClass('scrolled');
|
||
}
|
||
});
|
||
|
||
// Catalog tabs
|
||
$('.catalog-tab').click(function() {
|
||
$('.catalog-tab').removeClass('active');
|
||
$(this).addClass('active');
|
||
const filter = $(this).data('filter');
|
||
filterProperties(filter);
|
||
});
|
||
|
||
// View toggle
|
||
$('.view-btn').click(function() {
|
||
$('.view-btn').removeClass('active');
|
||
$(this).addClass('active');
|
||
const view = $(this).data('view');
|
||
toggleView(view);
|
||
});
|
||
|
||
// Apply filters
|
||
$('#applyFilters').click(function() {
|
||
applyFilters();
|
||
});
|
||
|
||
// Form submissions
|
||
$('#leadForm').submit(handleLeadForm);
|
||
$('#contactForm').submit(handleContactForm);
|
||
|
||
// Phone mask
|
||
$('#ctaPhone, #contactPhone').mask('+34 000 000 000');
|
||
|
||
// Smooth scroll
|
||
$('a[href^="#"]').on('click', function(e) {
|
||
e.preventDefault();
|
||
const target = $(this.getAttribute('href'));
|
||
if (target.length) {
|
||
$('html, body').stop().animate({
|
||
scrollTop: target.offset().top - 80
|
||
}, 800);
|
||
}
|
||
// Close mobile menu
|
||
$('.navbar-collapse').collapse('hide');
|
||
});
|
||
|
||
// Animate counters
|
||
animateCounters();
|
||
});
|
||
|
||
// ============ LANGUAGE FUNCTIONS ============
|
||
function switchLanguage(lang) {
|
||
currentLang = lang;
|
||
$('html').attr('lang', lang);
|
||
|
||
$('.lang-btn').removeClass('active');
|
||
$(`.lang-btn[data-lang="${lang}"]`).addClass('active');
|
||
|
||
$('[data-i18n]').each(function() {
|
||
const key = $(this).data('i18n');
|
||
const value = getNestedValue(translations[lang], key);
|
||
if (value) {
|
||
if ($(this).is('input, textarea')) {
|
||
$(this).attr('placeholder', value);
|
||
} else {
|
||
$(this).html(value);
|
||
}
|
||
}
|
||
});
|
||
|
||
// Reload dynamic content
|
||
loadProperties();
|
||
loadTestimonials();
|
||
loadFAQ();
|
||
|
||
// Update modal content if open
|
||
updateModalContent();
|
||
}
|
||
|
||
function getNestedValue(obj, path) {
|
||
return path.split('.').reduce((acc, part) => acc && acc[part], obj);
|
||
}
|
||
|
||
// ============ MAP FUNCTIONS ============
|
||
let map;
|
||
let markersLayer;
|
||
|
||
function initMap() {
|
||
map = L.map('map').setView([28.2916, -16.6291], 10);
|
||
|
||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
|
||
maxZoom: 18
|
||
}).addTo(map);
|
||
|
||
markersLayer = L.markerClusterGroup();
|
||
map.addLayer(markersLayer);
|
||
|
||
addMarkersToMap();
|
||
}
|
||
|
||
function addMarkersToMap() {
|
||
markersLayer.clearLayers();
|
||
|
||
properties.forEach(property => {
|
||
const marker = L.marker(property.coordinates);
|
||
|
||
const badgeClass = property.type === 'agricultural' ? 'badge-agricultural' :
|
||
property.type === 'urban' ? 'badge-urban' :
|
||
property.type === 'house' ? 'badge-house' :
|
||
property.type === 'apartment' ? 'badge-exclusive' : 'badge-ruins';
|
||
|
||
const typeLabel = currentLang === 'es' ?
|
||
property.type.charAt(0).toUpperCase() + property.type.slice(1) :
|
||
property.type === 'agricultural' ? 'Сельхоз' :
|
||
property.type === 'urban' ? 'Городской' :
|
||
property.type === 'house' ? 'Дом' :
|
||
property.type === 'apartment' ? 'Квартира' : 'Руины';
|
||
|
||
marker.bindPopup(`
|
||
<div class="map-popup">
|
||
<img src="${property.image}" alt="${property.title[currentLang]}">
|
||
<div class="map-popup-content">
|
||
<span class="property-badge ${badgeClass}">${typeLabel}</span>
|
||
<h5>${property.title[currentLang]}</h5>
|
||
<p>${formatPrice(property.price)} €</p>
|
||
<small>${property.area.toLocaleString()} m²</small>
|
||
</div>
|
||
</div>
|
||
`);
|
||
|
||
marker.on('click', () => {
|
||
window.location.href = '/property/' + (property.slug || property.id);
|
||
});
|
||
|
||
markersLayer.addLayer(marker);
|
||
});
|
||
}
|
||
|
||
// ============ PROPERTIES FUNCTIONS ============
|
||
function loadProperties(filter = 'all') {
|
||
const container = $('#propertiesGrid');
|
||
container.empty();
|
||
|
||
let filteredProperties = properties;
|
||
if (filter !== 'all') {
|
||
filteredProperties = properties.filter(p => p.type === filter);
|
||
}
|
||
|
||
filteredProperties.forEach((property, index) => {
|
||
const badgeClass = property.badge === 'new' ? 'badge-new' :
|
||
property.badge === 'exclusive' ? 'badge-exclusive' :
|
||
property.type === 'agricultural' ? 'badge-agricultural' :
|
||
property.type === 'urban' ? 'badge-urban' :
|
||
property.type === 'house' ? 'badge-house' :
|
||
property.type === 'apartment' ? 'badge-apartment' : 'badge-ruins';
|
||
|
||
const typeLabel = getTypeLabel(property.type);
|
||
const location = property.location[currentLang];
|
||
const title = property.title[currentLang];
|
||
const priceFormatted = formatPrice(property.price);
|
||
const areaFormatted = property.area.toLocaleString();
|
||
|
||
const card = `
|
||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="${index * 100}">
|
||
<div class="property-card">
|
||
<div class="property-image">
|
||
<a href="/property/${property.slug || property.id}" data-property-id="${property.id}">
|
||
<img src="${property.image}" alt="${escapeHtml(title)}" loading="lazy">
|
||
</a>
|
||
<div class="property-badges">
|
||
<span class="property-badge ${badgeClass}">${typeLabel}</span>
|
||
${property.badge === 'exclusive' ? '<span class="property-badge badge-exclusive">Exclusivo</span>' : ''}
|
||
</div>
|
||
<button class="property-favorite" onclick="toggleFavorite(${property.id})" title="Añadir a favoritos">
|
||
<i class="bi bi-heart"></i>
|
||
</button>
|
||
</div>
|
||
<div class="property-content">
|
||
<div class="property-type">${typeLabel}</div>
|
||
<a href="/property/${property.slug || property.id}" class="property-title">${escapeHtml(title)}</a>
|
||
<p class="property-location">
|
||
<i class="bi bi-geo-alt"></i>
|
||
${escapeHtml(location)}
|
||
</p>
|
||
<div class="property-features">
|
||
<div class="property-feature">
|
||
<i class="bi bi-rulers"></i>
|
||
<span>${areaFormatted} m²</span>
|
||
</div>
|
||
${property.rooms ? `
|
||
<div class="property-feature">
|
||
<i class="bi bi-door-open"></i>
|
||
<span>${property.rooms} ${currentLang === 'es' ? 'hab.' : 'комн.'}</span>
|
||
</div>
|
||
` : ''}
|
||
${property.bathrooms ? `
|
||
<div class="property-feature">
|
||
<i class="bi bi-droplet"></i>
|
||
<span>${property.bathrooms} ${currentLang === 'es' ? 'baños' : 'ванн'}</span>
|
||
</div>
|
||
` : ''}
|
||
</div>
|
||
<div class="property-utilities">
|
||
${getUtilityIcons(property)}
|
||
</div>
|
||
<div class="property-price">
|
||
${priceFormatted} €
|
||
<span>${Math.round(property.price / property.area)} €/m²</span>
|
||
</div>
|
||
<div class="property-actions">
|
||
<a href="/property/${property.slug || property.id}" class="btn btn-primary-custom">
|
||
<i class="bi bi-eye me-2"></i>${currentLang === 'es' ? 'Ver' : 'Смотреть'}
|
||
</a>
|
||
<a href="https://wa.me/34600123456?text=${encodeURIComponent((currentLang === 'es' ? 'Hola, me interesa esta propiedad: ' : 'Здравствуйте, интересует объект: ') + title)}"
|
||
target="_blank" class="btn btn-whatsapp">
|
||
<i class="bi bi-whatsapp"></i>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;
|
||
container.append(card);
|
||
});
|
||
|
||
AOS.refresh();
|
||
}
|
||
|
||
function getTypeLabel(type) {
|
||
const labels = {
|
||
agricultural: currentLang === 'es' ? 'Agrícola' : 'Сельхоз',
|
||
urban: currentLang === 'es' ? 'Urbano' : 'Городской',
|
||
house: currentLang === 'es' ? 'Casa' : 'Дом',
|
||
apartment: currentLang === 'es' ? 'Apartamento' : 'Апартаменты',
|
||
ruins: currentLang === 'es' ? 'Ruinas' : 'Руины'
|
||
};
|
||
return labels[type] || type;
|
||
}
|
||
|
||
function getUtilityIcons(property) {
|
||
let icons = '';
|
||
icons += `<span class="utility-icon ${property.water ? 'has' : 'no'}" title="${currentLang === 'es' ? 'Agua' : 'Вода'}"><i class="bi bi-droplet-fill"></i></span>`;
|
||
icons += `<span class="utility-icon ${property.electricity ? 'has' : 'no'}" title="${currentLang === 'es' ? 'Electricidad' : 'Электричество'}"><i class="bi bi-lightning-fill"></i></span>`;
|
||
icons += `<span class="utility-icon ${property.road ? 'has' : 'no'}" title="${currentLang === 'es' ? 'Acceso' : 'Подъезд'}"><i class="bi bi-car-front-fill"></i></span>`;
|
||
if (property.seaView) {
|
||
icons += `<span class="utility-icon has" title="${currentLang === 'es' ? 'Vista al mar' : 'Вид на море'}"><i class="bi bi-water"></i></span>`;
|
||
}
|
||
return icons;
|
||
}
|
||
|
||
function formatPrice(price) {
|
||
return price.toLocaleString('de-DE');
|
||
}
|
||
|
||
function filterProperties(filter) {
|
||
loadProperties(filter);
|
||
if (map) {
|
||
map.setView([28.2916, -16.6291], 10);
|
||
}
|
||
}
|
||
|
||
function toggleView(view) {
|
||
if (view === 'grid') {
|
||
$('#gridView').show();
|
||
$('#mapView').hide();
|
||
} else {
|
||
$('#gridView').hide();
|
||
$('#mapView').show();
|
||
setTimeout(() => {
|
||
map.invalidateSize();
|
||
}, 100);
|
||
}
|
||
}
|
||
|
||
function applyFilters() {
|
||
const priceMin = parseInt($('#priceMin').val()) || 0;
|
||
const priceMax = parseInt($('#priceMax').val()) || Infinity;
|
||
const areaMin = parseInt($('#areaMin').val()) || 0;
|
||
const areaMax = parseInt($('#areaMax').val()) || Infinity;
|
||
const water = $('#filterWater').is(':checked');
|
||
const electricity = $('#filterElectricity').is(':checked');
|
||
const road = $('#filterRoad').is(':checked');
|
||
const ruins = $('#filterRuins').is(':checked');
|
||
const license = $('#filterLicense').is(':checked');
|
||
const seaView = $('#filterSeaView').is(':checked');
|
||
|
||
const container = $('#propertiesGrid');
|
||
container.empty();
|
||
|
||
let filteredProperties = properties.filter(p => {
|
||
if (p.price < priceMin || p.price > priceMax) return false;
|
||
if (p.area < areaMin || p.area > areaMax) return false;
|
||
if (water && !p.water) return false;
|
||
if (electricity && !p.electricity) return false;
|
||
if (road && !p.road) return false;
|
||
if (ruins && !p.ruins) return false;
|
||
if (license && !p.license) return false;
|
||
if (seaView && !p.seaView) return false;
|
||
return true;
|
||
});
|
||
|
||
if (filteredProperties.length === 0) {
|
||
container.html(`<div class="col-12 text-center py-5"><p class="text-muted">${currentLang === 'es' ? 'No se encontraron propiedades con estos filtros' : 'По данным фильтрам объекты не найдены'}</p></div>`);
|
||
return;
|
||
}
|
||
|
||
loadProperties('all');
|
||
// Re-filter would be more efficient but for demo purposes:
|
||
container.find('.col-lg-4').each(function() {
|
||
const card = $(this);
|
||
const title = card.find('.property-title').text();
|
||
const priceText = card.find('.property-price').text();
|
||
const price = parseInt(priceText.replace(/\D/g, ''));
|
||
|
||
// Simple visibility toggle (in production, regenerate cards)
|
||
});
|
||
}
|
||
|
||
// ============ MODAL FUNCTIONS ============
|
||
function openPropertyModal(id) {
|
||
const property = properties.find(p => p.id === id);
|
||
if (!property) return;
|
||
|
||
const modal = $('#propertyModal');
|
||
const badgeClass = property.type === 'agricultural' ? 'badge-agricultural' :
|
||
property.type === 'urban' ? 'badge-urban' :
|
||
property.type === 'house' ? 'badge-house' :
|
||
property.type === 'apartment' ? 'badge-exclusive' : 'badge-ruins';
|
||
|
||
$('#modalImage').attr('src', property.image).attr('alt', property.title[currentLang]);
|
||
$('#modalType').attr('class', `property-type ${badgeClass}`).text(getTypeLabel(property.type));
|
||
$('#modalTitle').text(property.title[currentLang]);
|
||
$('#modalLocation').html(`<i class="bi bi-geo-alt"></i> ${property.location[currentLang]}`);
|
||
$('#modalPrice').text(`${formatPrice(property.price)} €`);
|
||
|
||
let featuresHtml = `
|
||
<div class="modal-feature">
|
||
<i class="bi bi-rulers"></i>
|
||
<div>
|
||
<strong>${currentLang === 'es' ? 'Superficie' : 'Площадь'}</strong>
|
||
<p>${property.area.toLocaleString()} m²</p>
|
||
</div>
|
||
</div>
|
||
`;
|
||
if (property.rooms) {
|
||
featuresHtml += `
|
||
<div class="modal-feature">
|
||
<i class="bi bi-door-open"></i>
|
||
<div>
|
||
<strong>${currentLang === 'es' ? 'Habitaciones' : 'Комнаты'}</strong>
|
||
<p>${property.rooms}</p>
|
||
</div>
|
||
</div>
|
||
`;
|
||
}
|
||
if (property.bathrooms) {
|
||
featuresHtml += `
|
||
<div class="modal-feature">
|
||
<i class="bi bi-droplet"></i>
|
||
<div>
|
||
<strong>${currentLang === 'es' ? 'Baños' : 'Ванные'}</strong>
|
||
<p>${property.bathrooms}</p>
|
||
</div>
|
||
</div>
|
||
`;
|
||
}
|
||
if (property.parking) {
|
||
featuresHtml += `
|
||
<div class="modal-feature">
|
||
<i class="bi bi-car-front"></i>
|
||
<div>
|
||
<strong>${currentLang === 'es' ? 'Garaje' : 'Гараж'}</strong>
|
||
<p>${property.parking} ${currentLang === 'es' ? 'plazas' : 'мест'}</p>
|
||
</div>
|
||
</div>
|
||
`;
|
||
}
|
||
$('#modalFeatures').html(featuresHtml);
|
||
|
||
let utilitiesHtml = '';
|
||
utilitiesHtml += `<div class="modal-utility ${property.water ? 'has' : 'no'}"><i class="bi bi-droplet-fill"></i>${property.water ? (currentLang === 'es' ? 'Agua disponible' : 'Вода подключена') : (currentLang === 'es' ? 'Agua no disponible' : 'Вода не подключена')}</div>`;
|
||
utilitiesHtml += `<div class="modal-utility ${property.electricity ? 'has' : 'no'}"><i class="bi bi-lightning-fill"></i>${property.electricity ? (currentLang === 'es' ? 'Electricidad disponible' : 'Электричество подключено') : (currentLang === 'es' ? 'Electricidad no disponible' : 'Электричество не подключено')}</div>`;
|
||
utilitiesHtml += `<div class="modal-utility ${property.road ? 'has' : 'no'}"><i class="bi bi-car-front-fill"></i>${property.road ? (currentLang === 'es' ? 'Acceso rodado' : 'Подъезд') : (currentLang === 'es' ? 'Sin acceso rodado' : 'Без подъезда')}</div>`;
|
||
if (property.ruins) {
|
||
utilitiesHtml += `<div class="modal-utility has"><i class="bi bi-house-dash-fill"></i>${currentLang === 'es' ? 'Con ruinas/edificación' : 'С руинами/постройками'}</div>`;
|
||
}
|
||
if (property.license) {
|
||
utilitiesHtml += `<div class="modal-utility has"><i class="bi bi-file-earmark-check-fill"></i>${currentLang === 'es' ? 'Licencia de obras' : 'Разрешение на стройку'}</div>`;
|
||
}
|
||
if (property.seaView) {
|
||
utilitiesHtml += `<div class="modal-utility has"><i class="bi bi-water"></i>${currentLang === 'es' ? 'Vista al mar' : 'Вид на море'}</div>`;
|
||
}
|
||
$('#modalUtilities').html(utilitiesHtml);
|
||
|
||
const whatsappText = encodeURIComponent(`${currentLang === 'es' ? 'Hola, me interesa esta propiedad: ' : 'Здравствуйте, интересует объект: '} ${property.title[currentLang]} - ${formatPrice(property.price)}€`);
|
||
$('#modalWhatsapp').attr('href', `https://wa.me/34600123456?text=${whatsappText}`);
|
||
$('#modalSchedule').attr('href', `https://wa.me/34600123456?text=${whatsappText}`);
|
||
|
||
modal.modal('show');
|
||
}
|
||
|
||
function updateModalContent() {
|
||
// Modal content will be updated when reopened
|
||
}
|
||
|
||
function toggleFavorite(id) {
|
||
const btn = $(`.property-favorite`).eq(id - 1);
|
||
btn.toggleClass('active');
|
||
if (btn.hasClass('active')) {
|
||
btn.find('i').removeClass('bi-heart').addClass('bi-heart-fill');
|
||
} else {
|
||
btn.find('i').removeClass('bi-heart-fill').addClass('bi-heart');
|
||
}
|
||
}
|
||
|
||
// ============ TESTIMONIALS ============
|
||
function loadTestimonials() {
|
||
const container = $('#testimonialsCarousel');
|
||
container.empty();
|
||
|
||
testimonials.forEach((testimonial, index) => {
|
||
const stars = Array(5).fill('<i class="bi bi-star-fill"></i>').join('');
|
||
const card = `
|
||
<div class="col-lg-6" data-aos="fade-up" data-aos-delay="${index * 100}">
|
||
<div class="testimonial-card">
|
||
<div class="testimonial-stars">${stars}</div>
|
||
<p class="testimonial-text">${escapeHtml(testimonial.text[currentLang])}</p>
|
||
<div class="testimonial-author">
|
||
<img src="${testimonial.image}" alt="${escapeHtml(testimonial.name)}" class="testimonial-avatar">
|
||
<div>
|
||
<h5>${escapeHtml(testimonial.name)}</h5>
|
||
<p><i class="bi bi-geo-alt"></i> ${escapeHtml(testimonial.country[currentLang])}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;
|
||
container.append(card);
|
||
});
|
||
}
|
||
|
||
// ============ FAQ ============
|
||
function loadFAQ() {
|
||
const container = $('#faqAccordion');
|
||
container.empty();
|
||
|
||
faqItems.forEach((item, index) => {
|
||
const accordionItem = `
|
||
<div class="accordion-item">
|
||
<h2 class="accordion-header">
|
||
<button class="accordion-button ${index === 0 ? '' : 'collapsed'}" type="button" data-bs-toggle="collapse" data-bs-target="#faq${index}">
|
||
${escapeHtml(item.question[currentLang])}
|
||
</button>
|
||
</h2>
|
||
<div id="faq${index}" class="accordion-collapse collapse ${index === 0 ? 'show' : ''}" data-bs-parent="#faqAccordion">
|
||
<div class="accordion-body">
|
||
${escapeHtml(item.answer[currentLang])}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;
|
||
container.append(accordionItem);
|
||
});
|
||
}
|
||
|
||
// ============ FORM HANDLERS ============
|
||
function handleLeadForm(e) {
|
||
e.preventDefault();
|
||
const formData = {
|
||
name: $('#ctaName').val(),
|
||
phone: $('#ctaPhone').val(),
|
||
email: $('#ctaEmail').val(),
|
||
budget: $('#ctaBudget').val(),
|
||
type: $('#ctaType').val(),
|
||
message: $('#ctaMessage').val()
|
||
};
|
||
|
||
console.log('Lead form submitted:', formData);
|
||
showNotification('success', translations[currentLang].form.success);
|
||
$(this)[0].reset();
|
||
}
|
||
|
||
function handleContactForm(e) {
|
||
e.preventDefault();
|
||
const formData = {
|
||
name: $('#contactName').val(),
|
||
phone: $('#contactPhone').val(),
|
||
email: $('#contactEmail').val(),
|
||
subject: $('#contactSubject').val(),
|
||
message: $('#contactMessage').val()
|
||
};
|
||
|
||
console.log('Contact form submitted:', formData);
|
||
showNotification('success', translations[currentLang].form.success);
|
||
$(this)[0].reset();
|
||
}
|
||
|
||
function showNotification(type, message) {
|
||
const alertClass = type === 'success' ? 'alert-success' : 'alert-danger';
|
||
const notification = $(`
|
||
<div class="alert ${alertClass} position-fixed" style="top: 100px; right: 20px; z-index: 9999; animation: fadeInRight 0.5s ease;">
|
||
<i class="bi bi-${type === 'success' ? 'check-circle' : 'exclamation-circle'} me-2"></i>
|
||
${message}
|
||
</div>
|
||
`);
|
||
$('body').append(notification);
|
||
setTimeout(() => {
|
||
notification.fadeOut(500, function() { $(this).remove(); });
|
||
}, 4000);
|
||
}
|
||
|
||
// ============ COUNTER ANIMATION ============
|
||
function animateCounters() {
|
||
$('.stat-number').each(function() {
|
||
const $this = $(this);
|
||
const target = parseInt($this.data('count'));
|
||
const duration = 2000;
|
||
const step = target / (duration / 16);
|
||
let current = 0;
|
||
|
||
const observer = new IntersectionObserver((entries) => {
|
||
entries.forEach(entry => {
|
||
if (entry.isIntersecting && !$(this).hasClass('counted')) {
|
||
$(this).addClass('counted');
|
||
const timer = setInterval(() => {
|
||
current += step;
|
||
if (current >= target) {
|
||
$this.text(target + '+');
|
||
clearInterval(timer);
|
||
} else {
|
||
$this.text(Math.floor(current));
|
||
}
|
||
}, 16);
|
||
}
|
||
});
|
||
}, { threshold: 0.5 });
|
||
|
||
observer.observe(this);
|
||
});
|
||
}
|
||
|
||
// Add animation keyframes
|
||
$('head').append(`
|
||
<style>
|
||
@keyframes fadeInRight {
|
||
from { opacity: 0; transform: translateX(30px); }
|
||
to { opacity: 1; transform: translateX(0); }
|
||
}
|
||
</style>
|
||
`);
|
||
</script>
|
||
</body>
|
||
</html>
|