935 lines
39 KiB
PHP
935 lines
39 KiB
PHP
<?php
|
|
// Start session before any output
|
|
ini_set('session.cookie_samesite', 'Lax');
|
|
ini_set('session.cookie_httponly', '1');
|
|
ini_set('session.cookie_secure', '0'); // Set to '1' if using HTTPS
|
|
session_start();
|
|
|
|
// Enhanced security headers
|
|
header('X-Content-Type-Options: nosniff');
|
|
header('X-Frame-Options: DENY');
|
|
header('X-XSS-Protection: 1; mode=block');
|
|
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
|
|
header('Referrer-Policy: strict-origin-when-cross-origin');
|
|
|
|
$page_title = "Get a Quote | UK Data Services - Professional Data Solutions";
|
|
$page_description = "Get a free, no-obligation quote for your data project. Tell us your requirements and we'll provide a detailed proposal within 24 hours.";
|
|
$canonical_url = "https://ukdataservices.co.uk/quote";
|
|
|
|
// Breadcrumb navigation
|
|
$breadcrumbs = [
|
|
['url' => '/', 'label' => 'Home'],
|
|
['url' => '', 'label' => 'Request Quote']
|
|
];
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title><?php echo htmlspecialchars($page_title); ?></title>
|
|
<meta name="description" content="<?php echo htmlspecialchars($page_description); ?>">
|
|
<meta name="keywords" content="data quote, web scraping quote, data extraction pricing, business intelligence cost, UK data services pricing">
|
|
<meta name="author" content="UK Data Services">
|
|
<meta name="robots" content="index, follow">
|
|
<link rel="canonical" href="<?php echo htmlspecialchars($canonical_url); ?>">
|
|
|
|
<!-- Open Graph / Social Media -->
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:url" content="<?php echo htmlspecialchars($canonical_url); ?>">
|
|
<meta property="og:title" content="<?php echo htmlspecialchars($page_title); ?>">
|
|
<meta property="og:description" content="<?php echo htmlspecialchars($page_description); ?>">
|
|
<meta property="og:image" content="https://ukdataservices.co.uk/assets/images/ukds-main-logo.png">
|
|
<meta property="og:locale" content="en_GB">
|
|
|
|
<!-- Twitter Card -->
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:url" content="<?php echo htmlspecialchars($canonical_url); ?>">
|
|
<meta name="twitter:title" content="<?php echo htmlspecialchars($page_title); ?>">
|
|
<meta name="twitter:description" content="<?php echo htmlspecialchars($page_description); ?>">
|
|
<meta name="twitter:image" content="https://ukdataservices.co.uk/assets/images/ukds-main-logo.png">
|
|
|
|
<!-- Favicon -->
|
|
<link rel="icon" type="image/x-icon" href="assets/images/favicon.ico">
|
|
|
|
<!-- Fonts -->
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
|
|
|
<!-- Styles -->
|
|
<link rel="stylesheet" href="assets/css/main.css">
|
|
|
|
<!-- Google reCAPTCHA v3 -->
|
|
<?php require_once '.recaptcha-config.php'; ?>
|
|
<script src="https://www.google.com/recaptcha/api.js?render=<?php echo RECAPTCHA_SITE_KEY; ?>"></script>
|
|
|
|
<!-- Quote Page Schema -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "WebPage",
|
|
"@id": "https://ukdataservices.co.uk/quote#webpage",
|
|
"url": "https://ukdataservices.co.uk/quote",
|
|
"name": "Get Free Quote - UK Data Services",
|
|
"description": "Request a free, no-obligation quote for professional web scraping and data extraction services. Get detailed proposal within 24 hours.",
|
|
"mainEntity": {
|
|
"@type": "Service",
|
|
"name": "Data Extraction Quote Service",
|
|
"description": "Free consultation and detailed quote for web scraping and data analytics projects",
|
|
"provider": {
|
|
"@id": "https://ukdataservices.co.uk#organization"
|
|
},
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"name": "Free Project Consultation",
|
|
"description": "Comprehensive project analysis and detailed quote within 24 hours",
|
|
"price": "0",
|
|
"priceCurrency": "GBP",
|
|
"availability": "https://schema.org/InStock",
|
|
"validFrom": "2024-01-01",
|
|
"priceValidUntil": "2025-12-31",
|
|
"areaServed": {
|
|
"@type": "Country",
|
|
"name": "United Kingdom"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<!-- Service Catalog Schema -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "ItemList",
|
|
"name": "UK Data Services - Service Catalog",
|
|
"description": "Comprehensive data services available for quote",
|
|
"numberOfItems": 6,
|
|
"itemListElement": [
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 1,
|
|
"item": {
|
|
"@type": "Service",
|
|
"name": "Web Scraping & Data Extraction",
|
|
"description": "Professional web scraping and data extraction services",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceRange": "£500-£50000",
|
|
"priceCurrency": "GBP"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 2,
|
|
"item": {
|
|
"@type": "Service",
|
|
"name": "Business Intelligence & Analytics",
|
|
"description": "Data analytics and business intelligence solutions",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceRange": "£1000-£25000",
|
|
"priceCurrency": "GBP"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 3,
|
|
"item": {
|
|
"@type": "Service",
|
|
"name": "Data Processing & Cleaning",
|
|
"description": "Data cleaning, transformation, and quality assurance",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceRange": "£750-£15000",
|
|
"priceCurrency": "GBP"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 4,
|
|
"item": {
|
|
"@type": "Service",
|
|
"name": "Automation & APIs",
|
|
"description": "Custom automation solutions and API integrations",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceRange": "£2000-£20000",
|
|
"priceCurrency": "GBP"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 5,
|
|
"item": {
|
|
"@type": "Service",
|
|
"name": "Custom Development",
|
|
"description": "Bespoke data solutions and custom development",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceRange": "£5000-£50000",
|
|
"priceCurrency": "GBP"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 6,
|
|
"item": {
|
|
"@type": "Service",
|
|
"name": "Compliance & Security",
|
|
"description": "GDPR compliance and data security consulting",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceRange": "£1000-£10000",
|
|
"priceCurrency": "GBP"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.quote-hero {
|
|
padding: 120px 0 60px;
|
|
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
|
text-align: center;
|
|
}
|
|
|
|
.quote-form-section {
|
|
padding: 60px 0;
|
|
background: white;
|
|
}
|
|
|
|
.quote-form-container {
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
background: white;
|
|
padding: 40px;
|
|
border-radius: 16px;
|
|
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.form-row {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 20px;
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.form-step {
|
|
margin-bottom: 40px;
|
|
padding-bottom: 40px;
|
|
border-bottom: 1px solid #e1e5e9;
|
|
}
|
|
|
|
.form-step:last-child {
|
|
border-bottom: none;
|
|
margin-bottom: 0;
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
/* Required field indicators */
|
|
.required-indicator {
|
|
color: #e74c3c;
|
|
font-weight: bold;
|
|
margin-left: 4px;
|
|
}
|
|
|
|
/* Error and success messages */
|
|
.message-container {
|
|
margin-bottom: 30px;
|
|
padding: 15px 20px;
|
|
border-radius: 8px;
|
|
display: none;
|
|
animation: slideDown 0.3s ease;
|
|
}
|
|
|
|
.message-container.error {
|
|
background: #fee;
|
|
border: 1px solid #fcc;
|
|
color: #c00;
|
|
}
|
|
|
|
.message-container.success {
|
|
background: #efe;
|
|
border: 1px solid #cfc;
|
|
color: #060;
|
|
}
|
|
|
|
.message-container.show {
|
|
display: block;
|
|
}
|
|
|
|
.message-title {
|
|
font-weight: bold;
|
|
margin-bottom: 10px;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.message-list {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.message-list li {
|
|
padding: 5px 0;
|
|
padding-left: 20px;
|
|
position: relative;
|
|
}
|
|
|
|
.message-list li:before {
|
|
content: '\2022';
|
|
position: absolute;
|
|
left: 0;
|
|
}
|
|
|
|
@keyframes slideDown {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(-10px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
.step-title {
|
|
font-size: 1.4rem;
|
|
font-weight: 600;
|
|
margin-bottom: 16px;
|
|
color: #1a1a1a;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
.step-number {
|
|
background: linear-gradient(135deg, #179e83 0%, #144784 100%);
|
|
color: white;
|
|
width: 30px;
|
|
height: 30px;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-weight: 600;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.checkbox-group {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
gap: 16px;
|
|
}
|
|
|
|
.checkbox-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 12px;
|
|
border: 2px solid #e1e5e9;
|
|
border-radius: 8px;
|
|
cursor: pointer;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.checkbox-item:hover {
|
|
border-color: #179e83;
|
|
background: #f8f9ff;
|
|
}
|
|
|
|
.checkbox-item input[type="checkbox"] {
|
|
margin-right: 12px;
|
|
transform: scale(1.2);
|
|
}
|
|
|
|
.checkbox-item.checked {
|
|
border-color: #179e83;
|
|
background: #f8f9ff;
|
|
}
|
|
|
|
.radio-group {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
gap: 16px;
|
|
}
|
|
|
|
.radio-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 16px;
|
|
border: 2px solid #e1e5e9;
|
|
border-radius: 8px;
|
|
cursor: pointer;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.radio-item:hover {
|
|
border-color: #179e83;
|
|
background: #f8f9ff;
|
|
}
|
|
|
|
.radio-item input[type="radio"] {
|
|
margin-right: 12px;
|
|
transform: scale(1.2);
|
|
}
|
|
|
|
.radio-item.checked {
|
|
border-color: #179e83;
|
|
background: #f8f9ff;
|
|
}
|
|
|
|
.quote-summary {
|
|
background: #f8f9fa;
|
|
padding: 30px;
|
|
border-radius: 12px;
|
|
margin-top: 40px;
|
|
}
|
|
|
|
.summary-item {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
padding: 12px 0;
|
|
border-bottom: 1px solid #e1e5e9;
|
|
}
|
|
|
|
.summary-item:last-child {
|
|
border-bottom: none;
|
|
font-weight: 600;
|
|
font-size: 1.2rem;
|
|
color: #179e83;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.form-row {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.checkbox-group,
|
|
.radio-group {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.quote-form-container {
|
|
padding: 30px 20px;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<!-- Event Schema for Consultation Booking -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Event",
|
|
"name": "Free Data Solutions Consultation",
|
|
"description": "Complimentary consultation session to discuss your web scraping and data analytics requirements with UK Data Services experts.",
|
|
"eventStatus": "https://schema.org/EventScheduled",
|
|
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
|
|
"location": {
|
|
"@type": "VirtualLocation",
|
|
"url": "https://ukdataservices.co.uk/consultation"
|
|
},
|
|
"organizer": {
|
|
"@type": "Organization",
|
|
"name": "UK Data Services",
|
|
"url": "https://ukdataservices.co.uk"
|
|
},
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"price": "0",
|
|
"priceCurrency": "GBP",
|
|
"availability": "https://schema.org/InStock",
|
|
"url": "https://ukdataservices.co.uk/quote"
|
|
},
|
|
"performer": {
|
|
"@type": "Organization",
|
|
"name": "UK Data Services Expert Team"
|
|
},
|
|
"startDate": "2025-01-09T09:00:00+00:00",
|
|
"endDate": "2025-12-31T17:00:00+00:00",
|
|
"duration": "PT30M",
|
|
"isAccessibleForFree": true
|
|
}
|
|
</script>
|
|
<?php include($_SERVER['DOCUMENT_ROOT'] . '/includes/breadcrumb-schema.php'); ?>
|
|
</head>
|
|
<body>
|
|
<!-- Skip to content link for accessibility -->
|
|
<a href="#main-content" class="skip-to-content">Skip to main content</a>
|
|
|
|
<!-- Navigation -->
|
|
<nav class="navbar" id="navbar">
|
|
<div class="nav-container">
|
|
<div class="nav-logo">
|
|
<a href="/">
|
|
<img src="assets/images/ukds-main-logo.png" alt="UK Data Services" class="logo">
|
|
</a>
|
|
</div>
|
|
<div class="nav-menu" id="nav-menu">
|
|
<a href="/" class="nav-link">Home</a>
|
|
<a href="/#services" class="nav-link">Services</a>
|
|
<a href="/project-types" class="nav-link">Project Types</a>
|
|
<a href="/about" class="nav-link">About</a>
|
|
<a href="/blog/" class="nav-link">Blog</a>
|
|
<a href="/#contact" class="nav-link">Contact</a>
|
|
<a href="/quote" class="nav-link cta-button">Request Consultation</a>
|
|
</div>
|
|
<div class="nav-toggle" id="nav-toggle">
|
|
<span class="bar"></span>
|
|
<span class="bar"></span>
|
|
<span class="bar"></span>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Quote Hero -->
|
|
<main id="main-content">
|
|
<section class="quote-hero">
|
|
<div class="container">
|
|
<h1>Free Web Scraping & Data Analytics Quote - UK Data Services</h1>
|
|
<p>Tell us about your project and we'll provide a detailed proposal within 24 hours</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Server-rendered content for SEO and no-JS fallback -->
|
|
<section class="quote-intro" style="padding: 40px 0; background: #fff;">
|
|
<div class="container" style="max-width: 900px; margin: 0 auto; padding: 0 20px;">
|
|
<h2 style="font-size: 1.8rem; margin-bottom: 20px; color: #1a1a1a;">How Our Quote Process Works</h2>
|
|
|
|
<p style="font-size: 1.1rem; line-height: 1.7; margin-bottom: 16px;">
|
|
Getting a quote from UK Data Services is straightforward and commitment-free. Simply tell us about your data requirements using the form below, and our team will review your project within 24 hours. You'll receive a detailed proposal outlining our recommended approach, timeline, and transparent pricing—no hidden fees or surprises.
|
|
</p>
|
|
|
|
<h3 style="font-size: 1.3rem; margin: 24px 0 12px; color: #1a1a1a;">What to Include in Your Request</h3>
|
|
<p style="font-size: 1.05rem; line-height: 1.7; margin-bottom: 16px;">
|
|
The more detail you provide, the more accurate our quote will be. Consider including: the websites or data sources you need to extract from, the specific data fields you require, how often you need the data updated, your preferred output format (CSV, JSON, database, API), and any compliance requirements. Don't worry if you're unsure about technical details—we're happy to advise during our free consultation call.
|
|
</p>
|
|
|
|
<h3 style="font-size: 1.3rem; margin: 24px 0 12px; color: #1a1a1a;">Why Choose UK Data Services?</h3>
|
|
<p style="font-size: 1.05rem; line-height: 1.7; margin-bottom: 16px;">
|
|
With over 500 successful projects delivered, we've helped businesses across the UK transform their operations with accurate, actionable data. We're fully GDPR compliant and take data security seriously—your information is handled with the utmost care and never shared with third parties. Our clients range from startups to enterprise organisations, and we tailor every solution to your specific needs.
|
|
</p>
|
|
|
|
<h3 style="font-size: 1.3rem; margin: 24px 0 12px; color: #1a1a1a;">Transparent Pricing</h3>
|
|
<p style="font-size: 1.05rem; line-height: 1.7; margin-bottom: 24px;">
|
|
Projects typically start from £500 for straightforward data extraction tasks, with larger enterprise solutions priced according to complexity and scale. We provide fixed-price quotes wherever possible so you know exactly what to expect. There's no obligation—receive your quote and take the time you need to decide.
|
|
</p>
|
|
|
|
<noscript>
|
|
<div style="background: #fff3cd; border: 1px solid #ffc107; border-radius: 8px; padding: 24px; margin: 24px 0;">
|
|
<h3 style="color: #856404; margin: 0 0 12px 0; font-size: 1.2rem;">JavaScript Required for Online Form</h3>
|
|
<p style="margin: 0 0 16px 0; color: #856404; line-height: 1.6;">
|
|
Our interactive quote form requires JavaScript to function. If you're unable to enable JavaScript, please contact us directly:
|
|
</p>
|
|
<ul style="margin: 0; padding-left: 20px; color: #856404; line-height: 1.8;">
|
|
<li><strong>Email:</strong> <a href="mailto:hello@ukdataservices.co.uk" style="color: #0056b3;">hello@ukdataservices.co.uk</a></li>
|
|
<li><strong>Phone:</strong> Available on request</li>
|
|
</ul>
|
|
<p style="margin: 16px 0 0 0; color: #856404; line-height: 1.6;">
|
|
Include your name, email, company (if applicable), and a description of your data requirements. We'll respond within 24 hours with a detailed proposal.
|
|
</p>
|
|
</div>
|
|
</noscript>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Quote Form -->
|
|
|
|
<section class="quote-form-section">
|
|
<div class="container">
|
|
<div class="quote-page-layout">
|
|
<!-- Main form -->
|
|
<div class="quote-form-main">
|
|
<div class="quote-form-container">
|
|
<!-- Message Container -->
|
|
<div id="message-container" class="message-container">
|
|
<div class="message-title"></div>
|
|
<ul class="message-list"></ul>
|
|
</div>
|
|
|
|
<form id="quote-form" action="quote-handler.php" method="POST">
|
|
<?php
|
|
// Session already started at top of file
|
|
if (!isset($_SESSION['csrf_token'])) {
|
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
}
|
|
// Set form start time for bot detection
|
|
$_SESSION['form_start_time'] = time();
|
|
?>
|
|
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
|
|
<input type="hidden" name="recaptcha_response" id="recaptchaResponseQuote" value="">
|
|
<input type="text" name="website" style="display: none !important; position: absolute !important; left: -9999px !important;" tabindex="-1" autocomplete="off">
|
|
|
|
<!-- STEP 1: Service & Scale -->
|
|
<div class="form-step" id="step-1" data-step="1">
|
|
<h2>Step 1: Tell us what you need</h2>
|
|
|
|
<div class="form-group">
|
|
<label for="service_type">What service are you interested in?</label>
|
|
<select name="service_type" id="service_type" required>
|
|
<option value="">Select a service...</option>
|
|
<option value="web-scraping">Web Scraping</option>
|
|
<option value="data-cleaning">Data Cleaning</option>
|
|
<option value="api-development">API Development</option>
|
|
<option value="automation">Automation</option>
|
|
<option value="custom">Custom Solution</option>
|
|
<option value="other">Other</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="scale">Estimated scale</label>
|
|
<select name="scale" id="scale" required>
|
|
<option value="">Select scale...</option>
|
|
<option value="small">Small (under 1,000 records)</option>
|
|
<option value="medium">Medium (1,000 - 50,000 records)</option>
|
|
<option value="large">Large (50,000 - 500,000 records)</option>
|
|
<option value="enterprise">Enterprise (500,000+ records)</option>
|
|
<option value="unsure">Not sure yet</option>
|
|
</select>
|
|
</div>
|
|
|
|
<button type="button" class="btn btn-primary next-step">Next →</button>
|
|
</div>
|
|
|
|
<!-- STEP 2: Contact & Timeline -->
|
|
<div class="form-step" id="step-2" data-step="2" style="display:none;">
|
|
<h2>Step 2: Your details</h2>
|
|
|
|
<div class="form-group">
|
|
<label for="quote-name">Your name</label>
|
|
<input type="text" name="name" id="quote-name" required>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="quote-email">Email address</label>
|
|
<input type="email" name="email" id="quote-email" required>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="quote-company">Company name</label>
|
|
<input type="text" name="company" id="quote-company">
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="timeline">When do you need this?</label>
|
|
<select name="timeline" id="timeline" required>
|
|
<option value="">Select timeline...</option>
|
|
<option value="asap">As soon as possible</option>
|
|
<option value="2weeks">Within 2 weeks</option>
|
|
<option value="1month">Within a month</option>
|
|
<option value="flexible">Flexible / No rush</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="form-buttons">
|
|
<button type="button" class="btn btn-secondary prev-step">← Back</button>
|
|
<button type="button" class="btn btn-primary next-step">Next →</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- STEP 3: Project Details -->
|
|
<div class="form-step" id="step-3" data-step="3" style="display:none;">
|
|
<h2>Step 3: Project details</h2>
|
|
|
|
<div class="form-group">
|
|
<label for="website_urls">Target website(s)</label>
|
|
<input type="text" name="data_sources" id="website_urls" placeholder="e.g., competitor.com, amazon.co.uk">
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="quote-requirements">Detailed requirements <span class="optional">(optional)</span></label>
|
|
<textarea name="requirements" id="quote-requirements" rows="5" placeholder="Tell us more about what data you need, how often, what format..."></textarea>
|
|
</div>
|
|
|
|
<div class="form-buttons">
|
|
<button type="button" class="btn btn-secondary prev-step">← Back</button>
|
|
<button type="submit" class="btn btn-primary">Get Your Free Proposal</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sidebar -->
|
|
<aside class="quote-sidebar">
|
|
<div class="testimonial-card">
|
|
<blockquote>
|
|
<p>"UK Data Services transformed how we track competitor pricing. The data is accurate, timely, and has directly impacted our revenue."</p>
|
|
<cite>— Client Testimonial</cite>
|
|
</blockquote>
|
|
</div>
|
|
|
|
<div class="what-happens-next">
|
|
<h3>What happens next?</h3>
|
|
<ol>
|
|
<li><strong>We review your request</strong> — our team assesses your requirements</li>
|
|
<li><strong>You receive a detailed proposal</strong> — within 24 hours</li>
|
|
<li><strong>Free consultation call</strong> — we schedule a call to discuss your project</li>
|
|
</ol>
|
|
</div>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<!-- Footer -->
|
|
<footer class="footer">
|
|
<div class="container">
|
|
<div class="footer-content">
|
|
<div class="footer-section">
|
|
<div class="footer-logo">
|
|
<img src="assets/images/logo-white.svg" alt="UK Data Services">
|
|
</div>
|
|
<p>Professional data solutions for modern businesses. Transform your operations with accurate, actionable insights.</p>
|
|
</div>
|
|
|
|
<div class="footer-section">
|
|
<h3>Our Services</h3>
|
|
<ul>
|
|
<li><a href="/services/competitive-intelligence">Competitive Intelligence</a></li>
|
|
<li><a href="/services/price-monitoring">Price Monitoring</a></li>
|
|
<li><a href="/services/data-cleaning">Data Cleaning</a></li>
|
|
<li><a href="/#services">All Services</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="footer-section">
|
|
<h3>Locations</h3>
|
|
<ul>
|
|
<li><a href="/locations/london">London</a></li>
|
|
<li><a href="/locations/manchester">Manchester</a></li>
|
|
<li><a href="/locations/birmingham">Birmingham</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="footer-section">
|
|
<h3>Resources & Insights</h3>
|
|
<ul>
|
|
<li><a href="/blog/">Data Intelligence Blog</a></li>
|
|
<li><a href="/case-studies/">Case Studies</a></li>
|
|
<li><a href="/about">About UK Data Services</a></li>
|
|
<li><a href="/project-types">Project Types</a></li>
|
|
<li><a href="/faq">FAQ</a></li>
|
|
<li><a href="/quote">Request Consultation</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="footer-section">
|
|
<h3>Legal</h3>
|
|
<ul>
|
|
<li><a href="/privacy-policy">Privacy Policy</a></li>
|
|
<li><a href="/terms-of-service">Terms of Service</a></li>
|
|
<li><a href="/cookie-policy">Cookie Policy</a></li>
|
|
<li><a href="/gdpr-compliance">GDPR Compliance</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer-bottom">
|
|
<p>© <?php echo date('Y'); ?> UK Data Services. All rights reserved.</p>
|
|
<div class="social-links">
|
|
<a href="https://linkedin.com/company/uk-data-services" aria-label="LinkedIn" target="_blank" rel="noopener noreferrer"><img src="assets/images/icon-linkedin.svg" alt="LinkedIn"></a>
|
|
<a href="https://twitter.com/ukdataservices" aria-label="Twitter" target="_blank" rel="noopener noreferrer"><img src="assets/images/icon-twitter.svg" alt="Twitter"></a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
<!-- Scripts -->
|
|
<script src="assets/js/main.js"></script>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const steps = document.querySelectorAll('.form-step');
|
|
const nextBtns = document.querySelectorAll('.next-step');
|
|
const prevBtns = document.querySelectorAll('.prev-step');
|
|
|
|
nextBtns.forEach(btn => {
|
|
btn.addEventListener('click', function() {
|
|
const current = this.closest('.form-step');
|
|
const currentStep = parseInt(current.dataset.step);
|
|
const requiredFields = current.querySelectorAll('[required]');
|
|
let valid = true;
|
|
requiredFields.forEach(field => {
|
|
if (!field.value) {
|
|
field.classList.add('error');
|
|
valid = false;
|
|
} else {
|
|
field.classList.remove('error');
|
|
}
|
|
});
|
|
if (!valid) return;
|
|
|
|
current.style.display = 'none';
|
|
document.querySelector('[data-step="' + (currentStep + 1) + '"]').style.display = 'block';
|
|
});
|
|
});
|
|
|
|
prevBtns.forEach(btn => {
|
|
btn.addEventListener('click', function() {
|
|
const current = this.closest('.form-step');
|
|
const currentStep = parseInt(current.dataset.step);
|
|
current.style.display = 'none';
|
|
document.querySelector('[data-step="' + (currentStep - 1) + '"]').style.display = 'block';
|
|
});
|
|
});
|
|
|
|
// Message display functions
|
|
function showMessage(type, title, messages) {
|
|
const container = document.getElementById('message-container');
|
|
const titleEl = container.querySelector('.message-title');
|
|
const listEl = container.querySelector('.message-list');
|
|
container.className = 'message-container';
|
|
container.classList.add(type);
|
|
titleEl.textContent = title;
|
|
listEl.innerHTML = '';
|
|
if (Array.isArray(messages)) {
|
|
messages.forEach(msg => {
|
|
const li = document.createElement('li');
|
|
li.textContent = msg;
|
|
listEl.appendChild(li);
|
|
});
|
|
} else {
|
|
const li = document.createElement('li');
|
|
li.textContent = messages;
|
|
listEl.appendChild(li);
|
|
}
|
|
container.classList.add('show');
|
|
container.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
}
|
|
|
|
function hideMessage() {
|
|
const container = document.getElementById('message-container');
|
|
container.classList.remove('show');
|
|
}
|
|
|
|
// Form submission with reCAPTCHA
|
|
const quoteForm = document.getElementById('quote-form');
|
|
|
|
// Track form interactions for bot detection
|
|
let formInteractions = {
|
|
mouseMovements: 0,
|
|
keystrokes: 0,
|
|
focusEvents: 0,
|
|
startTime: Date.now(),
|
|
fields: {}
|
|
};
|
|
|
|
const timestampField = document.createElement('input');
|
|
timestampField.type = 'hidden';
|
|
timestampField.name = 'form_timestamp';
|
|
timestampField.value = Date.now();
|
|
quoteForm.appendChild(timestampField);
|
|
|
|
const interactionToken = document.createElement('input');
|
|
interactionToken.type = 'hidden';
|
|
interactionToken.name = 'interaction_token';
|
|
quoteForm.appendChild(interactionToken);
|
|
|
|
document.addEventListener('mousemove', function() {
|
|
if (formInteractions.mouseMovements < 100) {
|
|
formInteractions.mouseMovements++;
|
|
}
|
|
});
|
|
|
|
quoteForm.querySelectorAll('input, textarea, select').forEach(field => {
|
|
field.addEventListener('keydown', function() {
|
|
formInteractions.keystrokes++;
|
|
});
|
|
field.addEventListener('focus', function() {
|
|
formInteractions.focusEvents++;
|
|
});
|
|
});
|
|
|
|
quoteForm.addEventListener('submit', function(e) {
|
|
e.preventDefault();
|
|
|
|
const timeSpent = Date.now() - formInteractions.startTime;
|
|
const interactionScore = Math.min(100,
|
|
(timeSpent > 5000 ? 20 : 0) +
|
|
(formInteractions.mouseMovements > 10 ? 20 : 0) +
|
|
(formInteractions.keystrokes > 20 ? 20 : 0) +
|
|
(formInteractions.focusEvents > 3 ? 10 : 0)
|
|
);
|
|
|
|
interactionToken.value = btoa(JSON.stringify({
|
|
score: interactionScore,
|
|
time: timeSpent,
|
|
interactions: formInteractions.mouseMovements + formInteractions.keystrokes + formInteractions.focusEvents
|
|
}));
|
|
|
|
const name = document.getElementById('quote-name').value.trim();
|
|
const email = document.getElementById('quote-email').value.trim();
|
|
let errors = [];
|
|
|
|
if (!name || name.length < 2) {
|
|
errors.push('Please enter your name');
|
|
}
|
|
if (!email || !email.includes('@')) {
|
|
errors.push('Please enter a valid email address');
|
|
}
|
|
|
|
if (errors.length > 0) {
|
|
showMessage('error', 'Please complete the following:', errors);
|
|
return;
|
|
}
|
|
|
|
hideMessage();
|
|
|
|
const self = this;
|
|
grecaptcha.ready(function() {
|
|
grecaptcha.execute('<?php echo RECAPTCHA_SITE_KEY; ?>', {action: 'quote'}).then(function(token) {
|
|
document.getElementById('recaptchaResponseQuote').value = token;
|
|
|
|
const submitButton = self.querySelector('button[type="submit"]');
|
|
const originalText = submitButton.textContent;
|
|
submitButton.textContent = 'Sending...';
|
|
submitButton.disabled = true;
|
|
|
|
const formData = new FormData(self);
|
|
|
|
fetch('quote-handler.php', {
|
|
method: 'POST',
|
|
body: formData,
|
|
credentials: 'same-origin',
|
|
headers: {
|
|
'X-Requested-With': 'XMLHttpRequest'
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.success) {
|
|
showMessage('success', 'Thank you!', 'Your quote request has been sent successfully. We will get back to you within 24 hours with a detailed proposal.');
|
|
self.reset();
|
|
document.querySelectorAll('.form-step').forEach(s => s.style.display = 'none');
|
|
document.querySelector('[data-step="1"]').style.display = 'block';
|
|
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
} else {
|
|
let errorMessages = data.message.includes('. ') ? data.message.split('. ').filter(msg => msg.trim()) : [data.message];
|
|
showMessage('error', 'There was a problem:', errorMessages);
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
showMessage('error', 'Connection Error', 'There was an error sending your request. Please try again or contact us at info@ukdataservices.co.uk');
|
|
})
|
|
.finally(() => {
|
|
submitButton.textContent = originalText;
|
|
submitButton.disabled = false;
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|