<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Zap Termite & Pest Control: Pest control services in Northern California. 24/7 service in Livermore, Pleasanton, Napa, and more.">
<meta name="keywords" content="pest control Rio Linda, termite control, rodent removal, bed bug extermination">
<title>Zap Termite & Pest Control</title>
<link rel="icon" type="image/png" href="/images/logo.png">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/@nlpjs/core@latest/dist/nlp-core-browser.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@nlpjs/nlp-util@latest/dist/nlp-util-browser.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@nlpjs/basic@latest/dist/nlp-basic-browser.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest/dist/tf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet"></script>
<style>
/* Dropdown styling */
details summary {
cursor: pointer;
display: inline-flex;
align-items: center;
color: #ef4444;
font-weight: 600;
}
details summary:hover {
color: #f87171;
}
details ul {
max-height: 200px;
overflow-y: auto;
background: #1f2937;
border: 1px solid #4b5563;
border-radius: 0.5rem;
padding: 1rem;
margin-top: 0.5rem;
color: white;
}
details ul li {
margin-bottom: 0.25rem;
}
/* Chatbot styling */
#chatbot {
position: fixed;
bottom: 1rem;
right: 1rem;
width: 300px;
background: #1f2937;
border: 1px solid #4b5563;
border-radius: 0.5rem;
display: none;
flex-direction: column;
}
#chatbot-header {
background: #ef4444;
color: white;
padding: 0.5rem;
border-radius: 0.5rem 0.5rem 0 0;
text-align: center;
font-weight: 600;
}
#chatbot-messages {
max-height: 200px;
overflow-y: auto;
padding: 0.5rem;
color: white;
}
#chatbot-input {
width: 100%;
padding: 0.5rem;
border: none;
background: #374151;
color: white;
}
#chatbot-toggle {
position: fixed;
bottom: 1rem;
right: 1rem;
background: #ef4444;
color: white;
padding: 0.5rem 1rem;
border-radius: 0.5rem;
cursor: pointer;
}
#chatbot-toggle:hover {
background: #f87171;
}
/* Icon styling */
.icon-link {
display: inline-flex;
align-items: center;
margin: 0 0.5rem;
}
.icon-link svg {
width: 24px;
height: 24px;
background: linear-gradient(to right, #ef4444, #991b1b);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
border-radius: 4px;
padding: 4px;
fill: white;
stroke: white;
stroke-width: 1;
transition: all 0.2s ease;
}
.icon-link:hover svg {
background: linear-gradient(to right, #f87171, #b91c1c);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4);
transform: scale(1.1);
}
/* 3D Button styling */
.portal-button {
background: linear-gradient(to right, #ef4444, #991b1b);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
transition: all 0.1s ease;
}
.portal-button:hover {
background: linear-gradient(to right, #f87171, #b91c1c);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4);
}
.portal-button:active {
transform: translateY(2px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
/* Image preview styling */
#image-preview {
max-width: 100%;
max-height: 100px;
margin: 0.5rem 0;
object-fit: contain; /* Maintain aspect ratio without distortion */
}
</style>
</head>
<body class="font-sans bg-black text-white">
<!-- Hero Section -->
<header class="text-center py-4 relative" style="background-image: url('/images/hero.jpg'); background-size: cover; background-position: center;">
<div class="container mx-auto px-4 pt-64">
<div class="space-x-4">
<a href="https://zappest.pestconnect.com/login" target="_blank" class="portal-button text-white px-6 py-3 rounded-lg">Customer Portal</a>
</div>
</div>
</header>
<!-- Contact Section -->
<section id="contact" class="py-16">
<div class="container mx-auto px-4 text-center">
<div class="mt-8 text-lg">
<p>
<span class="icon-link">
<svg aria-label="Call Zap Termite" class="w-6 h-6" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor">
<path d="M22 2H2v20h20V2zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm4-8h-2v2h-2v-2H8V8h4V6h2v2h2v2z"/>
</svg>
</span>
<a id="phone-number" href="tel:800-414-1515" class="text-red-500 hover:text-red-400">800-414-1515</a>
</p>
<p>
<span class="icon-link">
<svg aria-label="Email Zap Termite" class="w-6 h-6" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor">
<path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 2l-8 5-8-5h16zm0 12H4V8l8 5 8-5v10z"/>
</svg>
</span>
<a href="mailto:
[email protected]" class="text-red-500 hover:text-red-400">
[email protected]</a>
</p>
<details>
<summary>
<span class="icon-link">
<svg aria-label="Service Areas" class="w-6 h-6" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor">
<path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5S10.62 6.5 12 6.5s2.5 1.12 2.5 2.5S13.38 11.5 12 11.5z"/>
</svg>
</span>
Service Areas
</summary>
<ul>
<li>Acampo</li>
<li>American Canyon</li>
<li>Antelope</li>
<li>Antioch</li>
<li>Applegate</li>
<li>Auburn</li>
<li>Bay Point</li>
<li>Benicia</li>
<li>Brentwood</li>
<li>Browns Valley</li>
<li>Cameron Park</li>
<li>Carmichael</li>
<li>Ceres</li>
<li>Citrus Heights</li>
<li>Clarksburg</li>
<li>Clayton</li>
<li>Clements</li>
<li>Colfax</li>
<li>Concord</li>
<li>Cool</li>
<li>Danville</li>
<li>Davis</li>
<li>Diamond Springs</li>
<li>Dixon</li>
<li>Dublin</li>
<li>El Dorado</li>
<li>El Dorado Hills</li>
<li>Elk Grove</li>
<li>Elverta</li>
<li>Fairfield</li>
<li>Fair Oaks</li>
<li>Folsom</li>
<li>Galt</li>
<li>Garden Valley</li>
<li>Granite Bay</li>
<li>Grass Valley</li>
<li>Greenwood</li>
<li>Herald</li>
<li>Isleton</li>
<li>Lafayette</li>
<li>Lathrop</li>
<li>Lincoln</li>
<li>Livermore</li>
<li>Lockeford</li>
<li>Lodi</li>
<li>Loomis</li>
<li>Manteca</li>
<li>Martinez</li>
<li>Marysville</li>
<li>Meadow Vista</li>
<li>Modesto</li>
<li>Napa</li>
<li>Newcastle</li>
<li>North Highlands</li>
<li>Olivehurst</li>
<li>Orangevale</li>
<li>Penn Valley</li>
<li>Pittsburg</li>
<li>Placerville</li>
<li>Pleasant Hill</li>
<li>Pleasanton</li>
<li>Plumas Lake</li>
<li>Rancho Cordova</li>
<li>Rio Linda</li>
<li>Rio Vista</li>
<li>Rocklin</li>
<li>Roseville</li>
<li>Sacramento</li>
<li>San Ramon</li>
<li>Shingle Springs</li>
<li>Stockton</li>
<li>Suisun City</li>
<li>Tracy</li>
<li>Turlock</li>
<li>Vacaville</li>
<li>Vallejo</li>
<li>Valley Springs</li>
<li>Walnut Creek</li>
<li>Walnut Grove</li>
<li>West Sacramento</li>
<li>Winters</li>
<li>Woodland</li>
<li>Yuba City</li>
</ul>
</details>
<div class="mt-4">
<a href="https://x.com/zap747" target="_blank" class="icon-link">
<svg aria-label="Follow on X" class="w-6 h-6" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
<a href="https://maps.app.goo.gl/CpGA9ovzt2RFUJjT8" target="_blank" class="icon-link">
<svg aria-label="Google Business Profile" class="w-6 h-6" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor">
<path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5S10.62 6.5 12 6.5s2.5 1.12 2.5 2.5S13.38 11.5 12 11.5z"/>
<path d="M12 6.5l-3 3h3v3h3l-3-3v-3z"/>
</svg>
</a>
</div>
</div>
<!-- Compact Contact Form -->
<div class="mt-8 max-w-md mx-auto">
<h3 class="text-xl font-bold mb-4">Get in Touch</h3>
<form action="https://formspree.io/f/xpwljznj" method="POST" class="space-y-2">
<input type="text" name="name" placeholder="Name" class="w-full p-2 border border-gray-700 bg-black text-white rounded-lg text-sm" required>
<input type="email" name="email" placeholder="Email" class="w-full p-2 border border-gray-700 bg-black text-white rounded-lg text-sm" required>
<textarea name="message" placeholder="Pest Issue" class="w-full p-2 border border-gray-700 bg-black text-white rounded-lg text-sm" rows="2" required></textarea>
<button type="submit" class="bg-red-600 text-white px-4 py-2 rounded-lg hover:bg-red-700 text-sm">Submit</button>
</form>
</div>
<!-- Service Area Map -->
<iframe src="https://www.google.com/maps/embed?pb=!1m14!1m12!1m3!1d150000!2d-121.494704!3d38.581573!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!5e0!3m2!1sen!2sus!4v1722537600000" width="100%" height="300" style="border:0;" allowfullscreen="" loading="lazy" class="mt-8"></iframe>
</div>
</section>
<!-- Footer -->
<footer class="bg-black text-white text-center py-4">
<div class="container mx-auto px-4">
<p>© 2025 Zap Termite & Pest Control</p>
</div>
</footer>
<script>
// Zip code to phone number mapping
const phoneMap = {
'94558': '707-969-0747', '94503': '707-969-0747', '94533': '707-969-0747', '94590': '707-969-0747', '95620': '707-969-0747',
'95945': '530-377-0747', '95682': '530-377-0747', '95603': '530-377-0747', '95901': '530-377-0747', '95695': '530-377-0747',
'95350': '209-989-1747', '95202': '209-989-1747', '95376': '209-989-1747', '95240': '209-989-1747', '95632': '209-989-1747',
'95673': '916-999-9747', '95814': '916-999-9747', '95758': '916-999-9747', '95630': '916-999-9747', '94566': '916-999-9747',
'94568': '916-999-9747', '94598': '916-999-9747', '94509': '916-999-9747'
};
// Chatbot elements
const chatbot = document.getElementById('chatbot');
const chatbotMessages = document.getElementById('chatbot-messages');
const chatbotInput = document.getElementById('chatbot-input');
const chatbotToggle = document.getElementById('chatbot-toggle');
const uploadButton = document.getElementById('upload-button');
const imageUpload = document.getElementById('image-upload');
const imagePreview = document.getElementById('image-preview');
// Conversation state
let conversationState = {
lastPest: null,
userName: localStorage.getItem('userName') || null,
userEmail: localStorage.getItem('userEmail') || null
};
// NLP setup
let nlp;
async function initializeNLP() {
nlp = new window.Nlpjs.Nlp();
nlp.addLanguage('en');
// Intents
nlp.addDocument('en', 'termite problem', 'pest.termite');
nlp.addDocument('en', 'ants in house', 'pest.ant');
nlp.addDocument('en', 'cockroach issue', 'pest.cockroach');
nlp.addDocument('en', 'bed bugs', 'pest.bedbug');
nlp.addDocument('en', 'rat or mouse', 'pest.rodent');
nlp.addDocument('en', 'book appointment', 'book');
nlp.addDocument('en', 'schedule service', 'book');
nlp.addDocument('en', 'contact us', 'contact');
nlp.addDocument('en', 'who are you', 'info');
// Responses
nlp.addAnswer('en', 'pest.termite', 'Termites can be a serious issue! Drywood termites infest wood above ground, leaving sawdust-like frass. Want a free inspection? Book at https://zappest.pestconnect.com/login or describe the signs.');
nlp.addAnswer('en', 'pest.ant', 'Ants, like carpenter ants, can damage wood. We use targeted baits to eliminate colonies. Seen trails or nests? Book an inspection: https://zappest.pestconnect.com/login');
nlp.addAnswer('en', 'pest.cockroach', 'Cockroaches are nocturnal and spread allergens. Baiting is best for long-term control. Spot any at night? Book now: https://zappest.pestconnect.com/login');
nlp.addAnswer('en', 'pest.bedbug', 'Bed bugs hide in mattress seams and cause itchy bites. Heat treatments are effective. Found small brown bugs? Book at https://zappest.pestconnect.com/login');
nlp.addAnswer('en', 'pest.rodent', 'Rats and mice spread diseases and enter through tiny gaps. We seal entry points and use baits. Hearing noises or seeing droppings? Book at https://zappest.pestconnect.com/login');
nlp.addAnswer('en', 'book', 'Ready to zap those pests? Book now at our Customer Portal: https://zappest.pestconnect.com/login');
nlp.addAnswer('en', 'contact', 'Reach us at 800-414-1515,
[email protected], or book via https://zappest.pestconnect.com/login');
nlp.addAnswer('en', 'info', 'We’re Zap Termite & Pest Control, serving Northern California with 24/7 service. Ask about pests or book at https://zappest.pestconnect.com/login');
await nlp.train();
}
// Image classification setup
let mobilenetModel;
async function loadMobileNet() {
try {
mobilenetModel = await mobilenet.load();
console.log('MobileNet loaded');
} catch (error) {
console.error('Error loading MobileNet:', error);
}
}
// Initialize NLP and MobileNet
Promise.all([initializeNLP(), loadMobileNet()]).then(() => {
console.log('NLP and MobileNet initialized');
});
// Add message to chatbot
function addChatbotMessage(message) {
const msg = document.createElement('div');
msg.textContent = message;
msg.style.marginBottom = '0.5rem';
chatbotMessages.appendChild(msg);
chatbotMessages.scrollTop = chatbotMessages.scrollHeight;
}
// Dynamic phone number and chatbot personalization
fetch('https://ipapi.co/json/', { mode: 'cors' })
.then(response => response.json())
.then(data => {
const zip = data.postal || '';
const phone = phoneMap[zip] || '800-414-1515';
const phoneLink = document.getElementById('phone-number');
phoneLink.href = `tel:${phone}`;
phoneLink.textContent = phone;
const city = data.city || 'your area';
addChatbotMessage(`Welcome to Zap Termite & Pest Control! Got pests in ${city}? Ask about our services, upload a pest photo, or book via our portal!`);
})
.catch(() => {
const phoneLink = document.getElementById('phone-number');
phoneLink.href = 'tel:800-414-1515';
phoneLink.textContent = '800-414-1515';
addChatbotMessage('Welcome to Zap Termite & Pest Control! Got pests? Ask about our services, upload a pest photo, or book via our portal!');
});
// Toggle chatbot
chatbotToggle.addEventListener('click', () => {
chatbot.style.display = chatbot.style.display === 'none' ? 'flex' : 'none';
chatbotToggle.style.display = chatbot.style.display === 'none' ? 'block' : 'none';
if (chatbot.style.display === 'flex') {
chatbotInput.focus();
}
});
// Handle image upload
uploadButton.addEventListener('click', () => {
imageUpload.click();
});
imageUpload.addEventListener('change', async (e) => {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = async (event) => {
imagePreview.src = event.target.result;
imagePreview.style.display = 'block';
addChatbotMessage('You uploaded an image. Analyzing...');
try {
const img = new Image();
img.src = event.target.result;
img.onload = async () => {
const predictions = await mobilenetModel.classify(img);
const topPrediction = predictions[0];
let pestResponse = 'Couldn’t identify the pest clearly. Try describing it or book an inspection: https://zappest.pestconnect.com/login';
if (topPrediction.className.toLowerCase().includes('insect') || topPrediction.className.toLowerCase().includes('bug')) {
if (topPrediction.className.toLowerCase().includes('ant')) {
pestResponse = 'Looks like an ant! Carpenter ants can damage wood. We use targeted baits. Book an inspection: https://zappest.pestconnect.com/login';
conversationState.lastPest = 'ant';
} else if (topPrediction.className.toLowerCase().includes('cockroach')) {
pestResponse = 'Possibly a cockroach. They’re nocturnal and spread allergens. Baiting is best. Book now: https://zappest.pestconnect.com/login';
conversationState.lastPest = 'cockroach';
} else {
pestResponse = 'Looks like an insect! Could be ants, cockroaches, or similar. Describe it or book an inspection: https://zappest.pestconnect.com/login';
conversationState.lastPest = 'insect';
}
}
addChatbotMessage(pestResponse);
};
} catch (error) {
addChatbotMessage('Error analyzing image. Please describe the pest or book an inspection: https://zappest.pestconnect.com/login');
}
};
reader.readAsDataURL(file);
}
});
// Chatbot input handling
chatbotInput.addEventListener('keypress', async (e) => {
if (e.key === 'Enter' && chatbotInput.value.trim()) {
const userMessage = chatbotInput.value.trim();
addChatbotMessage(`You: ${userMessage}`);
if (!conversationState.userName && userMessage.toLowerCase().includes('my name is')) {
const nameMatch = userMessage.match(/my name is (\w+)/i);
if (nameMatch) {
conversationState.userName = nameMatch[1];
localStorage.setItem('userName', conversationState.userName);
addChatbotMessage(`Nice to meet you, ${conversationState.userName}! How can I help with your pest issue?`);
}
} else if (!conversationState.userEmail && userMessage.includes('@')) {
conversationState.userEmail = userMessage.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/)?.[0];
if (conversationState.userEmail) {
localStorage.setItem('userEmail', conversationState.userEmail);
addChatbotMessage(`Got your email, ${conversationState.userName || 'friend'}! Let’s tackle that pest problem. What’s the issue?`);
}
} else {
const response = await nlp.process('en', userMessage);
let reply = response.answer || 'I can help with pest questions or booking! Try asking about termites, rodents, or scheduling a service.';
if (response.intent === 'pest.termite') conversationState.lastPest = 'termite';
else if (response.intent === 'pest.ant') conversationState.lastPest = 'ant';
else if (response.intent === 'pest.cockroach') conversationState.lastPest = 'cockroach';
else if (response.intent === 'pest.bedbug') conversationState.lastPest = 'bedbug';
else if (response.intent === 'pest.rodent') conversationState.lastPest = 'rodent';
if (conversationState.lastPest && userMessage.toLowerCase().includes('more info')) {
reply = {
termite: 'Termites cause $7B in damage yearly in the US. Look for wings or frass. We offer fumigation or localized treatments. Book at https://zappest.pestconnect.com/login',
ant: 'Ants follow pheromone trails. Baits disrupt colonies effectively. Seen nests? Book an inspection: https://zappest.pestconnect.com/login',
cockroach: 'Cockroaches can live a month without food. Baiting outperforms sprays. Spot them at night? Book now: https://zappest.pestconnect.com/login',
bedbug: 'Bed bugs survive months without feeding. Heat treatment kills all stages. Found bites? Book at https://zappest.pestconnect.com/login',
rodent: 'Rats fit through 1/2-inch gaps. We seal entry points and use baits. Hearing noises? Book at https://zappest.pestconnect.com/login'
}[conversationState.lastPest] || reply;
}
if (!conversationState.userName && !userMessage.toLowerCase().includes('book') && !userMessage.toLowerCase().includes('contact')) {
reply += ' By the way, what’s your name?';
}
addChatbotMessage(reply);
}
chatbotInput.value = '';
}
});
// Keyboard accessibility for chatbot
chatbotToggle.addEventListener('keydown', (e) => {
if (e.key === 'Enter' || e.key === ' ') {
chatbotToggle.click();
}
});
chatbotInput.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
chatbot.style.display = 'none';
chatbotToggle.style.display = 'block';
chatbotToggle.focus();
}
});
uploadButton.addEventListener('keydown', (e) => {
if (e.key === 'Enter' || e.key === ' ') {
uploadButton.click();
}
});
</script>
</body>
</html>