Geoforest Park
About This Attraction
Kilim Geoforest Park in Langkawi is known for its unique geological formations and rich biodiversity. The park covers an area of over 100 square kilometers and includes mangrove forests, limestone cliffs, and a variety of wildlife such as monkeys, eagles, and monitor lizards. Visitors can explore the park by boat tours that often feature stops at bat caves and fish farms. Kilim Geoforest Park opening hours are typically from 8:30 AM to 5:00 PM, providing ample time for exploration.
The park is part of the Langkawi Geopark, which is recognized by UNESCO for its significant geological heritage. Educational tours offer insight into the ecosystem and conservation efforts in the region. Facilities like parking areas and restrooms are available to ensure a comfortable visit. Its advisable to wear comfortable clothing and footwear suitable for outdoor activities.
Location Details
Address
Kilim, 07000 Langkawi, Kedah, Malaysia
Visitor Information
Pricing & Ratings
Ticket Prices
Adult
250 MYR
Child
150 MYR
Student
200 MYR
Senior
200 MYR
Opening Hours & Booking
Open
Days
Monday to Sunday
Hours
8:30 AM to 5:00 PM
Seasonality
Year-round
Booking
Booking Required?
Yes
Book Your Visit
*Prices may vary. Check official website for the most up-to-date information.
Nearby Attractions
Pantai Cenang is a popular beach destination located on the island of Langkawi, Malaysia. Known…
Learn More
The Langkawi Sky Bridge is a remarkable curved pedestrian bridge located in Langkawi, Malaysia. It…
Learn More
Sunrise Beach in Koh Lipe is a popular destination known for its stunning sunrises and…
Learn More
Scenic viewpoint offering panoramic views of Koh Lipe and surrounding waters.
Scenic viewpoint offering panoramic views of Koh Lipe and surrounding islands.
A serene beach known for its clear waters and vibrant marine life, ideal for snorkeling…
A serene beach with clear waters, ideal for relaxation and snorkeling.
Secluded beach with crystal-clear waters and white sand.
A serene and secluded beach with clear waters and soft sand.
A vibrant street with shops, restaurants, and bars.
";
}
// Initialize modal controls
const initModalControls = function() {
console.log('Initializing modal controls');
const modal = document.getElementById('attraction-modal');
const closeBtn = document.querySelector('.attraction-modal-close');
if (closeBtn) {
closeBtn.addEventListener('click', function() {
modal.style.display = 'none';
document.body.style.overflow = '';
});
}
window.addEventListener('click', function(event) {
if (event.target === modal) {
modal.style.display = 'none';
document.body.style.overflow = '';
}
});
// Make attraction cards clickable
const attractionCards = document.querySelectorAll('.attraction-card');
console.log('Found ' + attractionCards.length + ' attraction cards');
attractionCards.forEach(card => {
card.addEventListener('click', function(e) {
openModalWithCardData(this);
});
});
};
// Function to open modal with card data
const openModalWithCardData = function(card) {
// Get data from hidden div
const data = card.querySelector('.attraction-full-data');
if (!data) {
console.error('No attraction data found in card');
return;
}
const modal = document.getElementById('attraction-modal');
if (!modal) {
console.error('Modal element still not found after creation attempt');
return;
}
// Helper function to safely get element text
function getElementText(selector) {
const element = data.querySelector(selector);
return element ? element.textContent : '';
}
try {
// Basic Info
document.getElementById('attraction-modal-title').textContent = getElementText('.attraction-name');
document.getElementById('attraction-modal-type').textContent = getElementText('.attraction-type-full');
document.getElementById('attraction-modal-description').textContent = getElementText('.attraction-description-full');
// Reset all containers to hidden
['attraction-modal-hours-container', 'attraction-modal-price-container',
'attraction-modal-address-container', 'attraction-modal-image-container'].forEach(id => {
const container = document.getElementById(id);
if (container) container.style.display = 'none';
});
// Rating
const ratingText = getElementText('.attraction-rating-full');
if (ratingText) {
const ratingValue = parseFloat(ratingText);
if (!isNaN(ratingValue)) {
const ratingValueEl = document.getElementById('attraction-modal-rating-value');
const ratingFillEl = document.getElementById('attraction-modal-rating-fill');
if (ratingValueEl) ratingValueEl.textContent = ratingValue.toFixed(1) + '/10';
if (ratingFillEl) ratingFillEl.style.width = (ratingValue * 10) + '%';
}
}
// Show the modal
modal.style.display = 'block';
document.body.style.overflow = 'hidden'; // Prevent background scrolling
console.log('Modal opened successfully');
} catch (error) {
console.error('Error opening modal:', error);
}
};
// Try to create the modal
const created = createModal();
console.log('Modal created:', created);
// If not created (already exists), initialize the controls
if (!created) {
initModalControls();
}
// Also initialize distance toggle
const distanceToggle = document.getElementById('distance-unit-toggle');
if (distanceToggle) {
distanceToggle.addEventListener('change', function() {
const showKm = this.checked;
// Update toggle labels
const labels = document.querySelectorAll('.toggle-label');
if (labels.length >= 2) {
labels[0].style.opacity = showKm ? '0.5' : '1';
labels[1].style.opacity = showKm ? '1' : '0.5';
}
// Update all distance displays
document.querySelectorAll('.nearby-attraction-card').forEach(card => {
const kmEl = card.querySelector('.distance-km');
const miEl = card.querySelector('.distance-mi');
if (kmEl && miEl) {
kmEl.style.display = showKm ? 'inline' : 'none';
miEl.style.display = showKm ? 'none' : 'inline';
}
});
});
}
});