1 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="utf-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, maximum-scale=1.0" /> 7 <meta name="format-detection" content="telephone=no" /> 8 <meta property="og:locale" content="en_US" /> 9 <meta property="og:type" content="website" /> 10 <meta property="og:title" content="Treasures Jewelry - Paducah, KY" /> 11 <meta property="og:url" content="https://treasuresjewelryky.com/" /> 12 <meta property="og:image" content="https://du9m0k402rjmo.cloudfront.net/images/P_25532/8005bd29-14a9-4ccd-8216-4d89afd2c0e2.jpg" /> 13 <meta property="og:description" content="Since opening our doors in 1995, Treasures Jewelry has proudly served Paducah, KY, as a trusted, full-service jewelry store rooted in craftsmanship, quality, and personal service. What began as a local shop has grown into a beloved destination for those who appreciate the beauty and meaning behind every piece of jewelry. 14 15We specialize in carat-plus diamonds, vintage and estate jewelry, and custom designs that reflect the unique stories of our customers. Our talented in-house design team works closely with you to create one-of-a-kind pieces for any occasionâwhether it's a reimagined heirloom or a brand-new creation. And when it comes to care and maintenance, our on-site repair services are known for their precision, speed, and affordability. 16 17Treasures Jewelry is a one-stop store for those who appreciate truly unique jewelry. Our showroom features an ever-changing selection of fine jewelry and gifts, ensuring that every visit brings something new to discover. We also offer interest-free financing, making it easier to invest in the jewelry you love without compromise. 18 19Above all, we pride ourselves on creating a shopping experience that exceeds expectations. Whether you're buying, designing, repairing, or simply browsing, weâre here to help you find the perfect pieceâand make the moment memorable." /> 20 <meta name="description" content="Since opening our doors in 1995, Treasures Jewelry has proudly served Paducah, KY, as a trusted, full-service jewelry store rooted in craftsmanship, quality, and personal service. What began as a local shop has grown into a beloved destination for those who appreciate the beauty and meaning behind every piece of jewelry. 21 22We specialize in carat-plus diamonds, vintage and estate jewelry, and custom designs that reflect the unique stories of our customers. Our talented in-house design team works closely with you to create one-of-a-kind pieces for any occasionâwhether it's a reimagined heirloom or a brand-new creation. And when it comes to care and maintenance, our on-site repair services are known for their precision, speed, and affordability. 23 24Treasures Jewelry is a one-stop store for those who appreciate truly unique jewelry. Our showroom features an ever-changing selection of fine jewelry and gifts, ensuring that every visit brings something new to discover. We also offer interest-free financing, making it easier to invest in the jewelry you love without compromise. 25 26Above all, we pride ourselves on creating a shopping experience that exceeds expectations. Whether you're buying, designing, repairing, or simply browsing, weâre here to help you find the perfect pieceâand make the moment memorable." /> 27 <meta name="title" content="Treasures Jewelry - Paducah KY" /> 28 <meta name="keywords" content="High Carat Diamonds,Jeweler,Jewelry Store,Custom Jewelry,Custom Rings and Jewelry,Costume Jewelry,Heirloom Jewelry,Fine Jewelry,Navajo Jewelry,Gold Buyer,Christmas Gifts,Jewelry and Costume Jewelry" /> 29 <title>Treasures Jewelry - Paducah, KY</title> 30
30<script src="/Scripts/Profile/googleAnalytics.js" type="text/javascript"></script>
vendor: 112 bytes, lines 30-33
30 31 <script type="text/javascript" src="https://www.google.com/recaptcha/api.js" async defer></script> 32 33
33<script src="https://code.jquery.com/jquery-3.5.0.min.js" integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ=" crossorigin="anonymous"></script>
33 34 35
35<script>window.jQuery || document.write('
35<script src="/scripts/templates/jquery-3.5.0.min.js"><\/script>')</script>
35 36 37
37<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
37 38 39
39<script>if (typeof (Popper) === 'undefined') { document.write('
39<script src="/scripts/templates/popper.min.js"><\/script>') }</script>
39 40 41 <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous"> 42 43 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous"> 44 45
45<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" integrity="sha384-mrcBkRTg0HmTfecoh1I+48Ptm7cAe18uN+3GsS5SXXGSwzpjIhJZkxEJ5jYaZmE" crossorigin="anonymous"></script>
45 46 47
47<script>if (typeof ($.fn.modal) === 'undefined') { document.write('
47<script src="/scripts/templates/bootstrap.min.js"><\/script>') }</script>
47 48 49
49<script src="/Scripts/Templates/googleMaps.js" type="text/javascript"></script>
49 50 <link href="/Content/Templates/custom-bootstrap.css" type="text/css" rel="stylesheet" /> 51
51<script src="/Scripts/bootbox.min.js" type="text/javascript"></script>
51 52
52<script src="/Scripts/Profile/jquery.barrating.1.1.4.js" type="text/javascript"></script>
52 53
53<script src="/Scripts/Templates/cleave.min.js" type="text/javascript"></script>
53 54
54<script src="/Scripts/Templates/cleave-phone.us.js" type="text/javascript"></script>
54 55
55<script src="/Scripts/Templates/slick.min.js" type="text/javascript"></script>
55 56 <link href="/Content/Templates/slick.css" type="text/css" rel="stylesheet" /> 57 <link href="/Content/Templates/slick-theme.css" type="text/css" rel="stylesheet" /> 58
58<script src="/Scripts/Templates/googleMapsMultiLocation.js" type="text/javascript"></script>
vendor: 66 bytes, lines 58-59
58 59 <script src="https://www.google.com/recaptcha/api.js?render=
596LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH
vendor: 40 bytes, lines 59-60
59" type="text/javascript"></script> 60
60<script src="https://player.vimeo.com/api/player.js" type="text/javascript"></script>
60 61 62 <link href="/Content/Templates/chatbot.css" type="text/css" rel="stylesheet" /> 63 64 <meta name="viewport" content="width=device-width, user-scalable=yes,initial-scale=1, maximum-scale=2" /> 65 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 66 67 68 <style> 69 :root { 70 --text_color: 255, 255, 255, 1; 71 --text_color_rgba: rgba(var(--text_color)); 72 --customer_color: #046D7A; 73 --post_text_color: 255, 255, 255, 1; 74 --post_text_color_rgba: rgba(var(--post_text_color)); 75 } 76 </style> 77 <link href="/Content/Templates/template_6.css" type="text/css" rel="stylesheet" /> 78 79 <link rel="canonical" href="https://treasuresjewelryky.com/"> 80 81
82<script type="application/ld+json"> 83{ 84 "@context": "https://schema.org", 85 "@graph": [ 86 { 87 "@type": "LocalBusiness", 88 "@id": "https://treasuresjewelryky.com/#localbusiness", 89 "name": "Treasures Jewelry", 90 "url": "https://treasuresjewelryky.com/", 91 "description": "Since opening our doors in 1995, Treasures Jewelry has proudly served Paducah, KY, as a trusted, full-service jewelry store rooted in craftsmanship, quality, and personal service. What began as a local shop has grown into a beloved destination for those who appreciate the beauty and meaning behind every piece of jewelry. We specialize in carat-plus diamonds, vintage and estate jewelry, and custom designs that reflect the unique stories of our customers. Our talented in-house design team works closely with you to create one-of-a-kind pieces for any occasionâwhether it's a reimagined heirloom or a brand-new creation. And when it comes to care and maintenance, our on-site repair services are known for their precision, speed, and affordability. Treasures Jewelry is a one-stop store for those who appreciate truly unique jewelry. Our showroom features an ever-changing selection of fine jewelry and gifts, ensuring that every visit brings something new to discover. We also offer interest-free financing, making it easier to invest in the jewelry you love without compromise. Above all, we pride ourselves on creating a shopping experience that exceeds expectations. Whether you're buying, designing, repairing, or simply browsing, weâre here to help you find the perfect pieceâand make the moment memorable.", 92 "image": "https://du9m0k402rjmo.cloudfront.net/images/P_25532/8005bd29-14a9-4ccd-8216-4d89afd2c0e2.jpg", 93 "logo": "https://du9m0k402rjmo.cloudfront.net/images/P_25532/8005bd29-14a9-4ccd-8216-4d89afd2c0e2.jpg", 94 "address": { 95 "@type": "PostalAddress", 96 "streetAddress": "3790 Hinkleville Rd., Ste E", 97 "addressLocality": "Paducah", 98 "addressRegion": "KY", 99 "postalCode": "42001", 100 "addressCountry": "US" 101 }, 102 "telephone": "(270) 331-3000", 103 "email": "[email protected]", 104 "geo": { 105 "@type": "GeoCoordinates", 106 "latitude": 37.0831492, 107 "longitude": -88.6339159 108 }, 109 "openingHoursSpecification": [ 110 { 111 "@type": "OpeningHoursSpecification", 112 "dayOfWeek": "Tuesday", 113 "opens": "10:00", 114 "closes": "17:00" 115 }, 116 { 117 "@type": "OpeningHoursSpecification", 118 "dayOfWeek": "Wednesday", 119 "opens": "10:00", 120 "closes": "17:00" 121 }, 122 { 123 "@type": "OpeningHoursSpecification", 124 "dayOfWeek": "Thursday", 125 "opens": "10:00", 126 "closes": "17:00" 127 }, 128 { 129 "@type": "OpeningHoursSpecification", 130 "dayOfWeek": "Friday", 131 "opens": "10:00", 132 "closes": "17:00" 133 }, 134 { 135 "@type": "OpeningHoursSpecification", 136 "dayOfWeek": "Saturday", 137 "opens": "10:00", 138 "closes": "16:00" 139 } 140 ], 141 "paymentAccepted": "Checks, American Express, Discover, MasterCard, Visa, Debit Cards, Interest Free Financing", 142 "sameAs": [ 143 "https://www.google.com/maps/place/Carroll's+Treasures+Jewelry/@37.0834037,-88.6340631,17z/data=!4m5!3m4!1s0x887a107859156a9f:0xb503fb88db2dcc90!8m2!3d37.0831715!4d-88.6339014", 144 "https://www.facebook.com/CarrollsTreasuresJewelry/" 145 ] 146 }, 147 { 148 "@type": "WebSite", 149 "@id": "https://treasuresjewelryky.com/#website", 150 "url": "https://treasuresjewelryky.com/", 151 "name": "Treasures Jewelry", 152 "description": "Since opening our doors in 1995, Treasures Jewelry has proudly served Paducah, KY, as a trusted, full-service jewelry store rooted in craftsmanship, quality, and personal service. What began as a local shop has grown into a beloved destination for those who appreciate the beauty and meaning behind every piece of jewelry. We specialize in carat-plus diamonds, vintage and estate jewelry, and custom designs that reflect the unique stories of our customers. Our talented in-house design team works closely with you to create one-
152of-a-kind pieces for any occasionâwhether it's a reimagined heirloom or a brand-new creation. And when it comes to care and maintenance, our on-site repair services are known for their precision, speed, and affordability. Treasures Jewelry is a one-stop store for those who appreciate truly unique jewelry. Our showroom features an ever-changing selection of fine jewelry and gifts, ensuring that every visit brings something new to discover. We also offer interest-free financing, making it easier to invest in the jewelry you love without compromise. Above all, we pride ourselves on creating a shopping experience that exceeds expectations. Whether you're buying, designing, repairing, or simply browsing, weâre here to help you find the perfect pieceâand make the moment memorable.", 153 "potentialAction": { 154 "@type": "SearchAction", 155 "target": "https://treasuresjewelryky.com/?s={search_term_string}", 156 "query-input": "required name=search_term_string" 157 } 158 }, 159 { 160 "@type": "WebPage", 161 "@id": "https://treasuresjewelryky.com/#webpage", 162 "url": "https://treasuresjewelryky.com/", 163 "name": "Treasures Jewelry - Paducah, KY", 164 "description": "Since opening our doors in 1995, Treasures Jewelry has proudly served Paducah, KY, as a trusted, full-service jewelry store rooted in craftsmanship, quality, and personal service. What began as a local shop has grown into a beloved destination for those who appreciate the beauty and meaning behind every piece of jewelry. We specialize in carat-plus diamonds, vintage and estate jewelry, and custom designs that reflect the unique stories of our customers. Our talented in-house design team works closely with you to create one-of-a-kind pieces for any occasionâwhether it's a reimagined heirloom or a brand-new creation. And when it comes to care and maintenance, our on-site repair services are known for their precision, speed, and affordability. Treasures Jewelry is a one-stop store for those who appreciate truly unique jewelry. Our showroom features an ever-changing selection of fine jewelry and gifts, ensuring that every visit brings something new to discover. We also offer interest-free financing, making it easier to invest in the jewelry you love without compromise. Above all, we pride ourselves on creating a shopping experience that exceeds expectations. Whether you're buying, designing, repairing, or simply browsing, weâre here to help you find the perfect pieceâand make the moment memorable.", 165 "isPartOf": { 166 "@id": "https://treasuresjewelryky.com/#website" 167 }, 168 "about": { 169 "@id": "https://treasuresjewelryky.com/#localbusiness" 170 }, 171 "primaryImageOfPage": { 172 "@type": "ImageObject", 173 "url": "https://du9m0k402rjmo.cloudfront.net/images/P_25532/8005bd29-14a9-4ccd-8216-4d89afd2c0e2.jpg" 174 }, 175 "breadcrumb": { 176 "@type": "BreadcrumbList", 177 "itemListElement": [ 178 { 179 "@type": "ListItem", 180 "position": 1, 181 "name": "Home", 182 "item": "https://treasuresjewelryky.com/" 183 } 184 ] 185 } 186 }, 187 { 188 "@type": "Service", 189 "@id": "https://treasuresjewelryky.com/#service", 190 "name": "Our Services", 191 "provider": { 192 "@id": "https://treasuresjewelryky.com/#localbusiness" 193 }, 194 "serviceType": [ 195 "Jewelry Services: At Treasures, we treat your jewelry with the care it deserves. Our on-site services include professional cleaning to restore brilliance, precise sizing and resizing for a perfect fit, and thorough inspections and appraisals to ensure your pieces are in top condition and properly valued. We also assist with insurance replacements, helping you navigate claims with ease. Best of all, many of these services are available while you wait, so you can enjoy convenience without sacrificing quality.", 196 "Custom & Design Services: Your jewelry should be as unique as you are. Our on-site custom design service allows you to collaborate directly with our skilled jewelers to create one-
196of-a-kind pieces tailored to your style and vision. Whether you're redesigning a family heirloom or dreaming up something entirely new, we bring your ideas to life with craftsmanship and creativity.", 197 "Watch Services: Keep your timepieces ticking with our watch battery replacement service. Quick, reliable, and done on-site, we make it easy to maintain your favorite watches without the hassle of sending them away.", 198 "Gold & Buying Services: Turn your unused gold into immediate value with our gold buying services. We offer instant cash for gold, providing fair and competitive rates right on the spot. Whether you're selling old jewelry or broken pieces, we make the process simple and secure.", 199 "Financing & Specials: We believe everyone should have access to beautiful jewelry. Thatâs why we offer interest-free financing, making it easier to invest in meaningful pieces without financial strain. Be sure to check out our weekly and monthly specials for exciting deals and limited-time offers on select items and services." 200 ], 201 "description": "Professional services offered by Treasures Jewelry" 202 }, 203 { 204 "@type": "FAQPage", 205 "@id": "https://treasuresjewelryky.com/#faqpage", 206 "url": "https://treasuresjewelryky.com/#faq", 207 "name": "Frequently Asked Questions", 208 "description": "Frequently asked questions about Treasures Jewelry", 209 "mainEntity": [ 210 { 211 "@type": "Question", 212 "name": "What types of jewelry do you specialize in?", 213 "acceptedAnswer": { 214 "@type": "Answer", 215 "text": "We specialize in carat-plus diamonds, vintage and estate jewelry, and custom-designed pieces. Our collection is always evolving, so thereâs something new to discover with every visit." 216 } 217 }, 218 { 219 "@type": "Question", 220 "name": "Can I have a custom piece made?", 221 "acceptedAnswer": { 222 "@type": "Answer", 223 "text": "Absolutely! Our in-house design team can create one-of-a-kind custom jewelry tailored to your style and occasion. You can also click here and to start your own custom designs https://treasuresjewelryky.jewelershowcase.com/browse/3c-collection Stop by or contact us to start your design journey." 224 } 225 }, 226 { 227 "@type": "Question", 228 "name": "Do you offer jewelry repair?", 229 "acceptedAnswer": { 230 "@type": "Answer", 231 "text": "Yes, we offer on-site jewelry repair at some of the most competitive prices in the area. Many services are available while you wait." 232 } 233 }, 234 { 235 "@type": "Question", 236 "name": "Do you buy gold?", 237 "acceptedAnswer": { 238 "@type": "Answer", 239 "text": "Yes, we buy gold and silver and offer competitive prices with immediate cash payments. Our experienced team provides honest, transparent evaluations to ensure you receive fair value for your items." 240 } 241 }, 242 { 243 "@type": "Question", 244 "name": "Can I shop your jewelry online?", 245 "acceptedAnswer": { 246 "@type": "Answer", 247 "text": "Yes! You can browse our selection of diamonds and fine jewelry through our online showroom: https://treasuresjewelryky.jewelershowcase.com/ For custom pieces or estate items, we recommend visiting us in-store for the full experience." 248 } 249 }, 250 { 251 "@type": "Question", 252 "name": "Is everything in-store also available online?", 253 "acceptedAnswer": { 254 "@type": "Answer", 255 "text": "Not always. Our ever-changing inventory, especially vintage and estate pieces, may not be listed online. Visit us in person to explore the full collection or visit our online shop here: https://treasuresjewelryky.jewelershowcase.com/" 256 } 257 }, 258 { 259 "@type": "Question", 260 "name": "How do I contact you with questions or to start a custom order?",
261 "acceptedAnswer": { 262 "@type": "Answer", 263 "text": "You can reach us through our website contact and click the Contact & Hours, call us directly at 270-331-3000, or click Shop Our Inventory button. Weâre happy to help: https://treasuresjewelryky.jewelershowcase.com/" 264 } 265 } 266 ] 267 } 268 ] 269} 270</script>
270</head> 271<body> 272 <div id="bootstrapCssTest" class="d-none"></div> 273
273<script> 274 $(function () { 275 276 if ($('#bootstrapCssTest').is(':visible')) { 277 $("head").prepend('<link rel="stylesheet" href="/content/templates/bootstrap.min.css">'); 278 } 279 }); 280 </script>
280 281 282 283 284 285<input type="hidden" id="areaMarkers" /> 286 287<!-- NAVBAR --> 288<div class="container-fullwidth fixed-top"> 289 290 291 292 293 294<header class="content-header custom-background-color d-flex flex-wrap align-items-center justify-content-between py-0 px-2"> 295 296 297 <div class="nav-image-mobile-left"> 298 <a href="#home-section" id="HomeNav" onclick="DisplayPage('#homePage')"> 299 <img src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/8005bd29-14a9-4ccd-8216-4d89afd2c0e2.jpg" alt="navbar logo" class="d-line-block align-top nav-logo" /> 300 </a> 301 </div> 302 <div class="nav-location pt-2"> 303 <ul class="mx-auto p-0 header-address d-flex flex-wrap justify-content-center"> 304 305 <li class="nav-business_name text-center header-item mx-1 px-1 text-font-color"> 306 Treasures Jewelry 307 </li> 308 309 310 <li class="text-center header-item mx-1 px-1 text-font-color"> 311 312 3790 Hinkleville Rd. Ste E 313 </li> 314 315 <li class="text-center header-item mx-1 px-1 text-font-color"> 316 Paducah, KY 42001 317 </li> 318 <li class="navbar-hours-sm text-center header-item mx-1 px-1"> 319 <a href="#" id="navbar-hours-sm" class="text-font-color" onclick="DisplayPage('#contactPage')"><i class="fas fa-clock fa-lg px-1 text-font-color"></i>Click Here for Hours</a> 320 </li> 321 322 323 <li class="nav-phone-sm text-center header-item mx-1 px-1"> 324 <a id="PhoneNav" href="tel:2703313000" class="phone-nav-mobile text-font-color"> 325 <i class="fas fa-phone fa-inverse fa-xs fa-rotate-90"></i> 326 (270) 331-3000 327 </a> 328 </li> 329 </ul> 330 </div> 331 332 333 334 <div class="navbar-hours pb-1 mx-auto"> 335 <a href="#" id="navbar-hours" class="text-font-color" onclick="DisplayPage('#contactPage')"><i class="fas fa-clock fa-lg px-1 text-font-color"></i>Click Here for Hours</a> 336 </div> 337 338 339 340 <div class="nav-phone-social pb-1 d-flex flex-wrap justify-content-center"> 341 342 <div class="nav-phone flex-column align-self-center mx-1 px-1 pb-1"> 343 <a id="PhoneNav" href="tel:2703313000" class="phone-nav-mobile text-font-color"> 344 <i class="fas fa-phone fa-inverse fa-xs fa-rotate-90"></i> 345 (270) 331-3000 346 </a> 347 </div> 348 <div class="nav-social mx-1 px-1"> 349 <div class="mx-auto text-center d-flex flex-wrap justify-content-center"> 350 <div class="m-1"> 351 <a class="text-font-color social-link-footer" href="https://www.google.com/maps/place/Carroll's+Treasures+Jewelry/@37.0834037,-88.6340631,17z/data=!4m5!3m4!1s0x887a107859156a9f:0xb503fb88db2dcc90!8m2!3d37.0831715!4d-88.6339014" target="_blank" id="google-social-footer" title="Google"> 352 <i class="fab fa-google fa-lg text-font-color"></i> 353 </a> 354 </div> 355 <div class="m-1"> 356 <a class="text-font-color social-link-footer" href="https://www.facebook.com/CarrollsTreasuresJewelry/" target="_blank" id="facebook-social-footer" title="Facebook"> 357 <i class="fab fa-facebook-f fa-lg text-font-color"></i> 358 </a> 359 </div> 360 </div> 361 </div> 362 </div> 363</header> 364 365 366<nav class="bg-default-color navbar navbar-light bg-light navbar-expand-xl pt-1 pb-2"> 367 368 369 <div class="nav-image bg-default-color bg-light flex-column text-center nav-image-desktop"> 370 <a href="#home-section" class="navbar-brand ml-3" id="HomeNav" onclick="DisplayPage('#homePage')">
371 <img src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/8005bd29-14a9-4ccd-8216-4d89afd2c0e2.jpg" alt="navbar logo" class="d-line-block align-top nav-logo" /> 372 </a> 373 </div> 374 375 <button class="navbar-toggler nav-menu collapsed" type="button" data-toggle="collapse" data-target="#navbarToggler" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation"> 376 <span class="navbar-toggler-icon"></span> 377 <span class="my-1 mx-2 close">X</span> 378 </button> 379 380 <div class="collapse navbar-collapse flex-column mx-auto" id="navbarToggler"> 381 382 <div class="d-none d-xl-block nav-section"> 383 <div class="navbar-nav d-flex flex-wrap align-items-center"> 384 385 386<div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="HomePageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#homePage')">Home</a> 387</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="AboutPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#aboutPage')">About</a> 388</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a target="_blank" href="https://treasuresjewelryky.jewelershowcase.com/" id="DocumentPageNavigationLink" class="nav-link p-3">Shop Our Inventory</a> 389</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="ServicesPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#servicesPage')">Services</a> 390</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="FaqPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#faqPage')">FAQ</a> 391</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="PhotosNavigationLink" class="nav-link p-3" onclick="DisplayPage('#imageryPage')">Imagery</a> 392</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="testimonialsPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#testimonialsPage')">Testimonials</a> 393</div><div class="col nav-item text-center header-item mx-auto text-nowrap"> <a href="#" id="ContactPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#contactPage')">Contact & Hours</a> 394</div> </div> 395 </div> 396 397 <div class="d-xs-block d-xl-none"> 398 <ul class="navbar-nav mx-auto mr-auto mt-2 mt-xl-0 mb-2"> 399 <li class="nav-item text-center header-item mr-1 ml-1"> 400 Treasures Jewelry 401 </li> 402 403 404<li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="HomePageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#homePage')">Home</a> 405</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="AboutPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#aboutPage')">About</a> 406</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a target="_blank" href="https://treasuresjewelryky.jewelershowcase.com/" id="DocumentPageNavigationLink" class="nav-link p-3">Shop Our Inventory</a> 407</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="ServicesPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#servicesPage')">Services</a> 408</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="FaqPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#faqPage')">FAQ</a> 409</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="PhotosNavigationLink" class="nav-link p-3" onclick="DisplayPage('#imageryPage')">Imagery</a> 410</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="testimonialsPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#testimonialsPage')">Testimonials</a> 411</li><li class="nav-item text-center header-item mr-1 ml-1 text-nowrap"> <a href="#" id="ContactPageNavigationLink" class="nav-link p-3" onclick="DisplayPage('#contactPage')">Contact & Hours</a> 412</li> </ul> 413 </div> 414 </div> 415</nav> 416 417</div> 418 419<div id="pages" class="pages-left"> 420 <!--Home Page Information--> 421 <div class="content collapse show bg-alt-color" id="homePage"> 422 423<div class="d-flex flex-wrap"> 424 <div class="w-100 mx-auto home-banner"> 425 <div class="parallax w-100"> 426 <div class="img-fluid banner-image " style="background-image: url(https://du9m0k402rjmo.
426cloudfront.net/images/P_25532/e7296619-e342-4a72-a31e-aee17e1210e0.jpg)"></div> 427 <div class="home-content"> 428 <div class="d-flex flex-wrap justify-content-center align-items-center px-2"></div> 429 </div> 430 </div> 431 </div> 432 433 434 <div class="d-flex align-items-center justify-content-center col-12 text-center description mx-auto slogan p-3 slogan-speakable" style="color: #000000; opacity: 0.7"> 435 Specializing in Carat-Plus Diamonds! 436 </div> 437 <div class="slider-attributes-container"> 438 <div class="slider slider-attributes mx-auto"> 439 <div> 440 <div class="image-slider-attributes-border m-5"> 441 <div class="image-slider-attributes-border-inner"> 442 <div class="image-slider-attributes custom-background-color d-flex justify-content-center align-items-center"> 443 <span class="m-2 text-font-color">Navajo Jewelry</span> 444 </div> 445 </div> 446 </div> 447 </div> 448 <div> 449 <div class="image-slider-attributes-border m-5"> 450 <div class="image-slider-attributes-border-inner"> 451 <div class="image-slider-attributes custom-background-color d-flex justify-content-center align-items-center"> 452 <span class="m-2 text-font-color">Fine Jewelry</span> 453 </div> 454 </div> 455 </div> 456 </div> 457 <div> 458 <div class="image-slider-attributes-border m-5"> 459 <div class="image-slider-attributes-border-inner"> 460 <div class="image-slider-attributes custom-background-color d-flex justify-content-center align-items-center"> 461 <span class="m-2 text-font-color">Heirloom Jewelry</span> 462 </div> 463 </div> 464 </div> 465 </div> 466 <div> 467 <div class="image-slider-attributes-border m-5"> 468 <div class="image-slider-attributes-border-inner"> 469 <div class="image-slider-attributes custom-background-color d-flex justify-content-center align-items-center"> 470 <span class="m-2 text-font-color">Costume Jewelry</span> 471 </div> 472 </div> 473 </div> 474 </div> 475 <div> 476 <div class="image-slider-attributes-border m-5"> 477 <div class="image-slider-attributes-border-inner"> 478 <div class="image-slider-attributes custom-background-color d-flex justify-content-center align-items-center"> 479 <span class="m-2 text-font-color">Rings</span> 480 </div> 481 </div> 482 </div> 483 </div> 484 <div> 485 <div class="image-slider-attributes-border m-5"> 486 <div class="image-slider-attributes-border-inner"> 487 <div class="image-slider-attributes custom-background-color d-flex justify-content-center align-items-center"> 488 <span class="m-2 text-font-color">Earrings</span> 489 </div> 490 </div> 491 </div> 492 </div> 493 </div> 494 </div> 495 <nav id="circle-attributes" class="navbar-attribute custom-background-color w-100"> 496 <div class="w-100 d-flex flex-row justify-content-center text-center"> 497 <div class="inner py-1"> 498 <div class="col nav-item text-center header-item mx-auto text-wrap">
499 <span class="nav-link">Navajo Jewelry</span> 500 </div> 501 <div class="col nav-item text-center header-item mx-auto text-wrap"> 502 <span class="nav-link">Fine Jewelry</span> 503 </div> 504 <div class="col nav-item text-center header-item mx-auto text-wrap"> 505 <span class="nav-link">Heirloom Jewelry</span> 506 </div> 507 <div class="col nav-item text-center header-item mx-auto text-wrap"> 508 <span class="nav-link">Costume Jewelry</span> 509 </div> 510 <div class="col nav-item text-center header-item mx-auto text-wrap"> 511 <span class="nav-link">Rings</span> 512 </div> 513 <div class="col nav-item text-center header-item mx-auto text-wrap"> 514 <span class="nav-link">Earrings</span> 515 </div> 516 </div> 517 </div> 518 </nav> 519 <div class="w-100 w-lg-75 mx-auto text-center p-4"> 520 <div class="p-2 section-header text-center"> 521 Established in 1995 522 </div> 523 <div class="p-2 section-information text-center"> 524 Located in Paducah, KY 525 </div> 526 </div> 527 528 529 <div class="w-100 w-lg-75 mx-auto mt-4 mb-4"> 530 <div class="slider slider-single w-100"> 531 <div class="image-slider m-2"> 532 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/f324ab1e-94e6-4598-a8da-7387d7a175d0.jpg" class="img-fluid text-center mx-auto" /> 533 </div> 534 <div class="image-slider m-2"> 535 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/fbb3aa4d-62ab-4685-b5d6-d788b2a2afe2.jpg" class="img-fluid text-center mx-auto" /> 536 </div> 537 <div class="image-slider m-2"> 538 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c4d56bc0-021c-4023-977d-f2bcb7d898f9.jpg" class="img-fluid text-center mx-auto" /> 539 </div> 540 <div class="image-slider m-2"> 541 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/3917c280-f1e3-4fdc-8678-33875868981b.jpg" class="img-fluid text-center mx-auto" /> 542 </div> 543 <div class="image-slider m-2"> 544 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/a2b7ee9c-34d7-43dc-b769-72fd9de28490.jpg" class="img-fluid text-center mx-auto" /> 545 </div> 546 <div class="image-slider m-2"> 547 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/4554aa09-9fb9-4f94-9e63-a42a3f077ea0.jpg" class="img-fluid text-center mx-auto" /> 548 </div> 549 <div class="image-slider m-2"> 550 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/03bbfcb0-b644-4b84-9f10-99836bca8afb.jpeg" class="img-fluid text-center mx-auto" /> 551 </div> 552 <div class="image-slider m-2"> 553 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/8e25c82f-85c7-4634-baa3-dba52d543b5f.jpeg" class="img-fluid text-center mx-auto" /> 554 </div> 555 <div class="image-slider m-2"> 556 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/789df3c7-a24e-4b3b-88ab-fbfd8a83ba07.jpg" class="img-fluid text-center mx-auto" /> 557 </div> 558 <div class="image-slider m-2"> 559 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c950e5e7-0af9-402e-9976-6e1417d717f4.jpg" class="img-fluid text-center mx-auto" /> 560 </div> 561 <div class="image-slider m-2"> 562 <img alt="Image" src="https://du9m0k402rjmo.
562cloudfront.net/images/P_25532/b1a38da7-08cc-4206-a6a1-d732d75178f3.jpg" class="img-fluid text-center mx-auto" /> 563 </div> 564 <div class="image-slider m-2"> 565 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/4053eee0-d044-4c3b-832e-f6c25c0011c7.jpg" class="img-fluid text-center mx-auto" /> 566 </div> 567 <div class="image-slider m-2"> 568 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c71f7fbb-1e23-4339-b069-dc00ef1c6df0.jpg" class="img-fluid text-center mx-auto" /> 569 </div> 570 <div class="image-slider m-2"> 571 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/f1b57936-fb95-434c-a6f2-8a514aec0f3b.jpg" class="img-fluid text-center mx-auto" /> 572 </div> 573 <div class="image-slider m-2"> 574 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/b9cb7f5b-1421-4d92-a972-b6e9deeee22f.jpg" class="img-fluid text-center mx-auto" /> 575 </div> 576 <div class="image-slider m-2"> 577 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/1e2ed5cb-6f71-443f-a08d-c0d56e87de5a.jpg" class="img-fluid text-center mx-auto" /> 578 </div> 579 <div class="image-slider m-2"> 580 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/410e7b95-83ea-4697-a9ce-9291873bcf7e.jpg" class="img-fluid text-center mx-auto" /> 581 </div> 582 </div> 583 <div class="slider slider-nav w-45 mx-auto mt-3 mb-3"> 584 <div class="image-slider-thumbnail"> 585 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/f324ab1e-94e6-4598-a8da-7387d7a175d0.jpg" class="img-fluid text-center mx-auto" /> 586 </div> 587 <div class="image-slider-thumbnail"> 588 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/fbb3aa4d-62ab-4685-b5d6-d788b2a2afe2.jpg" class="img-fluid text-center mx-auto" /> 589 </div> 590 <div class="image-slider-thumbnail"> 591 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c4d56bc0-021c-4023-977d-f2bcb7d898f9.jpg" class="img-fluid text-center mx-auto" /> 592 </div> 593 <div class="image-slider-thumbnail"> 594 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/3917c280-f1e3-4fdc-8678-33875868981b.jpg" class="img-fluid text-center mx-auto" /> 595 </div> 596 <div class="image-slider-thumbnail"> 597 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/a2b7ee9c-34d7-43dc-b769-72fd9de28490.jpg" class="img-fluid text-center mx-auto" /> 598 </div> 599 <div class="image-slider-thumbnail"> 600 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/4554aa09-9fb9-4f94-9e63-a42a3f077ea0.jpg" class="img-fluid text-center mx-auto" /> 601 </div> 602 <div class="image-slider-thumbnail"> 603 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/03bbfcb0-b644-4b84-9f10-99836bca8afb.jpeg" class="img-fluid text-center mx-auto" /> 604 </div> 605 <div class="image-slider-thumbnail"> 606 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/8e25c82f-85c7-4634-baa3-dba52d543b5f.jpeg" class="img-fluid text-center mx-auto" /> 607 </div> 608 <div class="image-slider-thumbnail"> 609 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/
609789df3c7-a24e-4b3b-88ab-fbfd8a83ba07.jpg" class="img-fluid text-center mx-auto" /> 610 </div> 611 <div class="image-slider-thumbnail"> 612 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c950e5e7-0af9-402e-9976-6e1417d717f4.jpg" class="img-fluid text-center mx-auto" /> 613 </div> 614 <div class="image-slider-thumbnail"> 615 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/b1a38da7-08cc-4206-a6a1-d732d75178f3.jpg" class="img-fluid text-center mx-auto" /> 616 </div> 617 <div class="image-slider-thumbnail"> 618 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/4053eee0-d044-4c3b-832e-f6c25c0011c7.jpg" class="img-fluid text-center mx-auto" /> 619 </div> 620 <div class="image-slider-thumbnail"> 621 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c71f7fbb-1e23-4339-b069-dc00ef1c6df0.jpg" class="img-fluid text-center mx-auto" /> 622 </div> 623 <div class="image-slider-thumbnail"> 624 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/f1b57936-fb95-434c-a6f2-8a514aec0f3b.jpg" class="img-fluid text-center mx-auto" /> 625 </div> 626 <div class="image-slider-thumbnail"> 627 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/b9cb7f5b-1421-4d92-a972-b6e9deeee22f.jpg" class="img-fluid text-center mx-auto" /> 628 </div> 629 <div class="image-slider-thumbnail"> 630 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/1e2ed5cb-6f71-443f-a08d-c0d56e87de5a.jpg" class="img-fluid text-center mx-auto" /> 631 </div> 632 <div class="image-slider-thumbnail"> 633 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/410e7b95-83ea-4697-a9ce-9291873bcf7e.jpg" class="img-fluid text-center mx-auto" /> 634 </div> 635 </div> 636 </div> 637 <div class="w-100 p-0 mt-4 mb-4"> 638 <iframe id='gbvFrame' src="https://www.google.com/maps/embed?pb=!4v1788987139750!6m8!1m7!1sCAoSHENJQUJJaEFmd1c1VUdDbXlzc1MyejNLSS1BTW0.!2m2!1d37.08018587505894!2d-88.67347344926424!3f174.29288152645844!4f-3.6754048578813894!5f0.7820865974627469" width="100%" height="450px;" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="strict-origin-when-cross-origin"></iframe> 639 </div> 640 641 <div class="w-100 mx-auto bg-image-container"> 642 <div class="bg-image " style="background-image: url(https://du9m0k402rjmo.cloudfront.net/images/P_25532/2f3e621f-f8f1-4bc6-82c2-6a6585b6e134.jpg)"></div> 643 <div class="w-lg-40 p-3 mt-md-5 mb-md-5"> 644 <div class="mx-auto p-3 testimonial-blurb"> 645 <div class="blurb-review-info"> 646 <p class="paragraph-content"> 647 <div class="blurb-rating m-2 mt-3"> 648 <img class="star-rating-image" src="/content/profile/images/star_yellow_5.0.png" /> 649 </div> 650 <div class="blurb-authordate m-2 mb-3"> 651 <span class="blurb-author"> 652- Alan </span> 653 <span class="blurb-date"> 6547/26/2026 </span> 655 </div> 656 <div class="blurb m-2 mt-3 mb-3"> 657 658"Had a great experience here! Had a piece of custom jewelry that needed to be repaired, they got it done quickly! They also cleaned my jewelry as well for free! Customer service my extremely amazing as well! Will 100% be back! Great place to support!" </div> 659 <div class="blurb-more m-2 mt-3"> 660 <div class="d-flex flex-wrap flex-column text-center mx-auto mt-1 mb-1 p-0"> 661 <a id="testimonialsBlurbMore" href="#testimonialsPage" class="d-flex align-items-center justify-content-center btn btn-secondary p-2 mr-auto testimonialsBlurbMore" > 662 See More <i class="fas fa-arrow-right"></i> 663 </a> 664 </div> 665 </div> 666 </p> 667</div> 668 </div> 669 </div> 670 </div> 671</div> 672 </div> 673 674 <!--About Page Information--> 675 <div class="content collapse bg-alt-color" id="aboutPage"></div> 676 677 <!--Services Page Information--> 678 <div class="content collapse bg-alt-color" id="servicesPage"></div> 679 680 <!--Testimonial Page Information--> 681 <div class="content collapse bg-alt-color" id="testimonialsPage"></div> 682
683 <!-- REVIEW MODAL --> 684 <div id="reviewFormParentContainer"></div> 685 686 <!--Contact Page Information--> 687 <div class="content collapse bg-alt-color" id="contactPage"></div> 688 689 <!--Imagery Page Information--> 690 <div class="content collapse bg-alt-color" id="imageryPage"></div> 691 692 <!--Posts Page Information--> 693 694 <!--Locations Page Information--> 695 <div class="content collapse bg-alt-color" id="locationsPage"></div> 696 697 <!--360 Tour Page--> 698 <div class="content collapse bg-alt-color pt-3" id="gsvPage"></div> 699 700 <!--FAQ Page Information--> 701 <div class="content collapse bg-alt-color" id="faqPage"></div> 702 703 <!--Additional Content Page--> 704 <div class="content collapse bg-alt-color pt-3" id="contentPage"></div> 705 706</div> 707 708<!--FOOTER Information--> 709<footer id="footer-container" class="footer custom-background-color"> 710<div class="d-flex flex-wrap text-center justify-content-center p-3"> 711 <div class="footer-content mx-auto"> 712 713 <!--Payment Methods --> 714 <div id="paymentTypeDark" class="mx-auto mt-2 mb-2 text-center d-flex flex-wrap justify-content-center paymentType"> 715 <div class="m-2"> 716 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/americanexpress.png" /> 717 </div> 718 <div class="m-2"> 719 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/discover.png" /> 720 </div> 721 <div class="m-2"> 722 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/mastercard.png" /> 723 </div> 724 <div class="m-2"> 725 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/visa.png" /> 726 </div> 727 </div> 728 <div id="paymentTypeLight" class="mx-auto mt-2 mb-2 text-center d-flex flex-wrap justify-content-center paymentType"> 729 <div class="m-2"> 730 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/americanexpress_white.png" /> 731 </div> 732 <div class="m-2"> 733 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/discover_white.png" /> 734 </div> 735 <div class="m-2"> 736 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/mastercard_white.png" /> 737 </div> 738 <div class="m-2"> 739 <img alt="Payment Image" class="img-fluid text-center mx-auto payment-img" src="/content/Templates/images/payment/visa_white.png" /> 740 </div> 741 </div> 742 743 <div id="footer-address"> 744 <div class="d-flex flex-wrap justify-content-center pt-1"> 745 <ul class="mx-auto p-0 mt-2 mt-lg-0 mb-2 business-info-footer d-flex flex-wrap justify-content-center"> 746 <li class="text-center mr-1 ml-1 pl-1 pr-1 text-font-color footer-business-name"> 747 Treasures Jewelry 748 </li> 749 <li class="text-center header-item mr-1 ml-1 pl-1 pr-1 text-font-color"> 750 751 3790 Hinkleville Rd. Ste E 752 </li> 753 <li class="text-center header-item mr-1 ml-1 pl-1 pr-1 text-font-color"> 754 Paducah, KY 42001 755 </li> 756 </ul> 757 </div> 758 </div> 759 <div class="d-flex flex-wrap flex-column text-center mx-auto mt-1 mb-1 p-0"> 760 <a id="phoneLink" href="tel:2703313000" class="phoneLinkInput d-flex align-items-start justify-content-center btn btn-secondary p-2 mx-auto text-font-color"> 761 (270) 331-3000 762 </a> 763 </div> 764 <div class="mt-3"> 765 <div class="mx-auto mt-2 mb-2 text-center d-flex flex-wrap justify-content-center"> 766 <div class="m-2"> 767 <a class="text-font-color social-link-footer" href="https://www.google.com/maps/place/Carroll's+Treasures+Jewelry/@37.0834037,-88.6340631,17z/data=!4m5!3m4!1s0x887a107859156a9f:0xb503fb88db2dcc90!8m2!3d37.0831715!4d-88.6339014" target="_blank" id="google-social-footer" title="Google"> 768 <i class="fab fa-google fa-lg"></i> 769 </a> 770 </div> 771 <div class="m-2"> 772 <a class="text-font-color social-link-footer" href="https://www.facebook.com/CarrollsTreasuresJewelry/" target="_blank" id="facebook-social-footer" title="Facebook"> 773 <i class="fab fa-facebook-f fa-lg"></i> 774 </a> 775 </div> 776 </div> 777 </div> 778 <div class="text-center tos pt-4"> 779 <a class="text-font-color" href="/Home/TermsOfUse" id="tosLink" target="_blank">Terms of Use |</a> 780 <a class="text-font-color" href="/Home/PrivacyPolicy" id="ppLink" target="_blank">Privacy Policy</a> 781 </div> 782 <div class="text-center" style="font-size: 0.75rem; color: #999; padding-top: 0.5rem;"> 783 © 2026 American Marketing & Publishing, L.L.C. All rights reserved. Names, logos, and other marks displayed are the property of their respective owners. 784 </div> 785 </div> 786</div> 787</footer> 788 789 <div class="accessibility-img py-2 px-2"> 790 <div class="d-flex flex-wrap justify-content-center align-items-center text-center"> 791 <a href="/Accessibility?domain=treasuresjewelryky" target="_blank" class="dark"> 792 <img src="/Content/Templates/images/accessibility_icon.png" height="60" width="42" /> 793 </a> 794 </div> 795 </div> 796 797 798 799 800<div class="chatbot-toggle-container"> 801 <button id="chatbot-toggle"> 802 <img src="/Content/Templates/images/chat_icon.png" height="60" width="60" /> 803 </button> 804</div> 805 806<!-- Chat Window --> 807<div id="chat-window"> 808 <!-- Chat Header --> 809 <div class="chat-header"> 810 <div class="chat-header-content"> 811 <h3 class="chat-header-title">Treasures Jewelry Assistant</h3> 812 </div>
813 <button id="close-chat" class="chat-close-btn" aria-label="Close chat"> 814 <i class="fas fa-times"></i> 815 </button> 816 </div> 817 818 <!-- Chat Messages --> 819 <div id="chat-messages"> 820 <div class="chat-message-container"> 821 <div class="chat-message"> 822 Hi there! How can we help you today? 823 </div> 824 </div> 825 </div> 826 827 <div id="disclaimer-info"> 828 <div class="disclaimer-content"> 829 <div class="disclaimer-text"> 830 AI Responses not guaranteed; verify before reliance 831 </div> 832 </div> 833 </div> 834 835 <!-- Cost Display --> 836 <div id="cost-info"> 837 <div class="cost-info-row"> 838 <div class="cost-info-left"> 839 <i class="fas fa-dollar-sign fa-xs cost-icon"></i> 840 <span id="cost-display">Cost: $0.00000</span> 841 </div> 842 <span id="percentage-display">0.0% of $0.02</span> 843 </div> 844 <div class="cost-progress-bar"> 845 <div id="cost-progress"></div> 846 </div> 847 </div> 848 849 <!-- Chat Input --> 850 <div class="chat-input-container"> 851 <form id="chat-form"> 852 <input type="text" id="chat-input" placeholder="Type your message..." /> 853 <button type="submit" id="send-message"> 854 <i class="fas fa-paper-plane"></i> 855 </button> 856 </form> 857 <div id="character-count">0/250</div> 858 <div id="character-limit-message" style="display: none; color: #dc2626; font-size: 12px; margin-top: 4px;"> 859 Your message is too long. Please limit your question to 250 characters or less. 860 </div> 861 </div> 862</div> 863 864<!-- Contact Form Window --> 865<div id="contact-form-window"> 866 <div class="contact-form-header"> 867 <h3 class="contact-form-title">Contact Form</h3> 868 <button id="close-contact-form" class="contact-form-close-btn" aria-label="Close contact form"> 869 <i class="fas fa-times"></i> 870 </button> 871 </div> 872 873 <div class="contact-form-content"> 874 <form id="chatbot-contact-form"> 875 <input type="hidden" id="chat_captcha_alt" name="chat_captcha_alt" value="lQQ3D1/Gq4KfyHaWelQAzXMfGbIKTjtrrlkXj6AXlSo3wi3Jb9M4r+YBxY+RkPdd" /> 876 <input type="hidden" id="chat_g-Recaptcha-Response-Contact" name="chat_g-Recaptcha-Response-Contact" value="" /> 877 <input type="hidden" name="chat_aid" value="380253f5-c602-41d1-a8b4-5c0a0902920a" /> 878 <input type="hidden" name="chat_contactSubject" value="FrontDesk™ Contact Form" /> 879 <input type="hidden" name="chat_contactAddress" value="" /> 880 <input type="hidden" name="chat_contactZip" value="" /> 881 <input type="hidden" name="chat_contactCity" value="" /> 882 <input type="hidden" name="chat_contactState" value="" /> 883 884 <div class="ai-liability mt-1 mb-1">(Messages sent through this site are subject to third party moderation and are not encrypted or secure. We always try to respond as soon as possible, but off-hours inquiries may take us a little longer to reply.)</div> 885 886 <div class="form-group"> 887 <label for="chat_contactName" class="form-label">Name *</label> 888 <input type="text" id="chat_contactName" name="chat_contactName" class="form-input" required /> 889 </div> 890 891 <div class="form-group"> 892 <label for="chat_contactEmail" class="form-label">Email *</label> 893 <input type="email" id="chat_contactEmail" name="chat_contactEmail" class="form-input" required /> 894 </div> 895 896 <div class="form-group"> 897 <label for="chat_contactPhone" class="form-label">Phone</label> 898 <input type="tel" id="chat_contactPhone" name="chat_contactPhone" class="form-input" /> 899 </div> 900 901 <div class="form-group"> 902 <label for="chat_contactMessage" class="form-label">Message *</label> 903 <textarea id="chat_contactMessage" name="chat_contactMessage" rows="4" class="form-textarea" required></textarea> 904 </div> 905 906 <div id="classicCaptcha" class="d-flex flex-column"> 907 <div class="g-recaptcha ml-auto mb-3 captcha-responsive" data-sitekey="6LeprWcUAAAAAF533Xd5p6kCrnRs0z4ceJieYgeO"></div> 908 </div> 909 910 <!-- Sticky footer section with reCAPTCHA disclaimer and submit button --> 911 <div class="form-sticky-footer"> 912 <div class="grecaptcha-info"> 913 This site is protected by reCAPTCHA and the Google 914 <a href="https://policies.google.com/privacy">Privacy Policy</a> and 915 <a href="https://policies.google.com/terms">Terms of Service</a> apply. 916 </div> 917 <button type="submit" id="contact-submit-btn" class="form-submit-btn">Submit</button> 918 </div> 919 </form> 920 </div> 921</div> 922
923<script> 924 // Wrap entire chatbot functionality in a namespace to prevent conflicts 925 window.ChatbotModule = (function() { 926 'use strict'; 927 928 // Private variables 929 let isOpen = false; 930 let contactFormOpen = false; 931 let messages = [ 932 { role: 'assistant', content: 'Hi there! How can we help you today?' } 933 ]; 934 let isLoading = false; 935 let showContactForm = false; 936 let limitReached = false; 937 let apiCost = 0; 938 const maxCost = 0.5; 939 const maxQuestionLength = 250; 940 941 // Private element references 942 let $chatbotToggle; 943 let $chatWindow; 944 let $contactFormWindow; 945 let $closeChat; 946 let $closeContactForm; 947 let $chatMessages; 948 let $chatForm; 949 let $chatInput; 950 let $sendMessage; 951 let $characterCount; 952 let $costDisplay; 953 let $percentageDisplay; 954 let $costProgress; 955 let $contactForm; 956 957 // Initialize element references 958 function initializeElements() { 959 $chatbotToggle = $('#chatbot-toggle'); 960 $chatWindow = $('#chat-window'); 961 $contactFormWindow = $('#contact-form-window'); 962 $closeChat = $('#close-chat'); 963 $closeContactForm = $('#close-contact-form'); 964 $chatMessages = $('#chat-messages'); 965 $chatForm = $('#chat-form'); 966 $chatInput = $('#chat-input'); 967 $sendMessage = $('#send-message'); 968 $characterCount = $('#character-count'); 969 $costDisplay = $('#cost-display'); 970 $percentageDisplay = $('#percentage-display'); 971 $costProgress = $('#cost-progress'); 972 $contactForm = $('#chatbot-contact-form'); 973 } 974 975 // Initialize 976 function init() { 977 // Initialize element references 978 initializeElements(); 979 980 // Load cost from localStorage 981 const savedCost = localStorage.getItem('api_cost'); 982 if (savedCost) { 983 apiCost = parseFloat(savedCost); 984 985 // Check if cost limit is reached 986 if (apiCost >= maxCost) { 987 limitReached = true; 988 updateChatInputState(); 989 } 990 } 991 992 // Initialize character count display 993 updateCharacterCount(); 994 995 document.documentElement.style.setProperty('--adaptive-text-color', '#374151'); 996 document.documentElement.style.setProperty('--image-invert', 'none'); 997 998 setTimeout(updateTextColors, 100); 999 1000 // Ensure chatbot stays on top even when modals are opened 1001 $(document).on('shown.bs.modal', function (e) { 1002 // Temporarily boost chatbot z-index when modals are shown 1003 $('.chatbot-toggle-container').css('z-index', '2147483647'); 1004 $('#chat-window').css('z-index', '2147483646'); 1005 $('#contact-form-window').css('z-index', '2147483645'); 1006 }); 1007 1008 // Set up event listeners 1009 setupEventListeners(); 1010 } 1011 1012 // Event Listeners with namespacing 1013 function setupEventListeners() { 1014 // Remove any existing chatbot event listeners to prevent duplicates 1015 $chatbotToggle.off('.chatbot'); 1016 $closeChat.off('.chatbot'); 1017 $closeContactForm.off('.chatbot'); 1018 $chatForm.off('.chatbot'); 1019 $chatInput.off('.chatbot'); 1020 $contactForm.off('.chatbot'); 1021 1022 // Toggle chat window 1023 $chatbotToggle.on('click.chatbot', function(e) { 1024 e.preventDefault(); 1025 e.stopPropagation(); 1026 toggleChat(); 1027 }); 1028 1029 $closeChat.on('click.chatbot', function(e) { 1030 e.preventDefault(); 1031 e.stopPropagation(); 1032 closeChat(); 1033 }); 1034 1035 $closeContactForm.on('click.chatbot', function(e) { 1036 e.preventDefault(); 1037 e.stopPropagation(); 1038 hideContactForm(); 1039 }); 1040 1041 // Send message 1042 $chatForm.on('submit.chatbot', function (e) { 1043 e.preventDefault(); 1044 e.stopPropagation(); 1045 1046 // Check if submit button is disabled 1047 if ($sendMessage.prop('disabled') || $sendMessage.hasClass('disabled')) { 1048 return false; 1049 } 1050 1051 sendMessage(); 1052 }); 1053 1054 // Character count - update on every keystroke 1055 $chatInput.on('input.chatbot', function(e) { 1056 // Only handle if this is specifically the chatbot input 1057 if ($(this).attr('id') === 'chat-input') { 1058 updateCharacterCount(); 1059 } 1060 }); 1061 1062 // Also check on keyup to catch paste events 1063 $chatInput.on('keyup.chatbot paste.chatbot', function(e) { 1064 // Only handle if this is specifically the chatbot input 1065 if ($(this).attr('id') === 'chat-input') { 1066 setTimeout(updateCharacterCount, 10); 1067 } 1068 }); 1069 1070 // Handle "Enter" key for sending messages 1071 $chatInput.on('keydown.chatbot', function (e) { 1072 // Only handle if this is specifically the chatbot input 1073 if ($(this).attr('id') !== 'chat-input') { 1074 return; 1075 } 1076 1077 if (e.key === 'Enter' && !e.shiftKey && !limitReached) { 1078 e.preventDefault(); 1079 e.stopImmediatePropagation(); 1080 1081 // Check if submit button is disabled 1082 if ($sendMessage.prop('disabled') || $sendMessage.hasClass('disabled')) { 1083 return false; 1084 } 1085 1086 sendMessage(); 1087 return; 1088 } 1089 }); 1090 1091 // Contact form submission 1092 $contactForm.on('submit.chatbot', function (e) { 1093 e.preventDefault(); 1094 e.stopPropagation(); 1095 submitContactForm(); 1096 }); 1097 } 1098 1099 // Toggle chat window 1100 function toggleChat() { 1101 if (!isOpen) { 1102 // Opening the chat 1103 isOpen = true; 1104 1105 // Hide toggle button on both mobile and desktop 1106 $('.chatbot-toggle-container').addClass('hide-toggle'); 1107 1108 // First show the window (still off-screen) 1109 $chatWindow.show(); 1110 1111 // Force a reflow to ensure the transition will work 1112 $chatWindow[0].offsetHeight; 1113 1114 // Then add the class that triggers the slide-in animation 1115 setTimeout(function () { 1116 $chatWindow.addClass('show'); 1117 scrollToBottom(); 1118 }, 10); 1119 } else { 1120 // Closing the chat 1121 isOpen = false; 1122 1123 // Show toggle button again 1124 $('.chatbot-toggle-container').removeClass('hide-toggle'); 1125 1126 // Remove the show class to trigger slide-out animation 1127 $chatWindow.removeClass('show'); 1128 1129 // Hide the window after the animation completes 1130 setTimeout(function () { 1131 $chatWindow.hide(); 1132 }, 300); // Match the CSS transition duration 1133 1134 // Also hide contact form if open 1135 if (contactFormOpen) { 1136 hideContactForm(); 1137 } 1138 } 1139 } 1140 1141 // Close chat window 1142 function closeChat() { 1143 if (isOpen) { 1144 isOpen = false; 1145 1146 // Show toggle button again 1147 $('.chatbot-toggle-container').removeClass('hide-toggle'); 1148 1149 // Trigger slide-out animation 1150 $chatWindow.removeClass('show'); 1151 1152 // Hide after animation 1153 setTimeout(function () { 1154 $chatWindow.hide(); 1155 }, 300); 1156 1157 if (contactFormOpen) { 1158 hideContactForm(); 1159 } 1160 } 1161 } 1162 1163 // Update character count and submit button state 1164 function updateCharacterCount() { 1165 const count = $chatInput.val().length; 1166 const remaining = maxQuestionLength - count; 1167 const $limitMessage = $('#character-limit-message'); 1168 1169 if (count > maxQuestionLength) { 1170 // Over limit - disable submit button and show message 1171 $characterCount.text(`${count}/${maxQuestionLength} (${Math.abs(remaining)} over limit)`).css('color', '#dc2626'); 1172 $limitMessage.text(`Your message is too long. Please limit your question to ${maxQuestionLength} characters or less. Your message is currently ${count} characters.`).show(); 1173 $chatInput.addClass('over-limit'); 1174 1175 // Disable submit button with proper styling 1176 $sendMessage.prop('disabled', true).addClass('disabled'); 1177 $sendMessage.css({ 1178 'background-color': '#9ca3af', 1179 'color': '#6b7280', 1180 'cursor': 'not-allowed', 1181 'opacity': '0.5', 1182 'pointer-events': 'none' 1183 }); 1184 1185 } else if (remaining <= 20) { 1186 // Close to limit - show warning but allow submit 1187 $characterCount.text(`${count}/${maxQuestionLength}`).css('color', '#f59e0b'); 1188 $limitMessage.hide(); 1189 $chatInput.removeClass('over-limit'); 1190 1191 // Enable submit button and reset styling 1192 $sendMessage.prop('disabled', false).removeClass('disabled'); 1193 $sendMessage.css({ 1194 'background-color': '', 1195 'color': '', 1196 'cursor': '', 1197 'opacity': '', 1198 'pointer-events': '' 1199 }); 1200 1201 } else {
1202 // Within limit - normal state 1203 $characterCount.text(`${count}/${maxQuestionLength}`).css('color', '#6b7280'); 1204 $limitMessage.hide(); 1205 $chatInput.removeClass('over-limit'); 1206 1207 // Enable submit button and reset styling 1208 $sendMessage.prop('disabled', false).removeClass('disabled'); 1209 $sendMessage.css({ 1210 'background-color': '', 1211 'color': '', 1212 'cursor': '', 1213 'opacity': '', 1214 'pointer-events': '' 1215 }); 1216 } 1217 } 1218 1219 // Send message 1220 function sendMessage() { 1221 const message = $chatInput.val().trim(); 1222 if (!message || isLoading || limitReached) return; 1223 1224 // Double check character limit including whitespace 1225 if (message.length > maxQuestionLength) { 1226 appendMessage('assistant', `Your message is too long. Please limit your question to ${maxQuestionLength} characters or less. Your message is currently ${message.length} characters.`); 1227 return; 1228 } 1229 1230 // Add user message to chat 1231 messages.push({ role: 'user', content: message }); 1232 appendMessage('user', message); 1233 1234 // Clear input 1235 $chatInput.val(''); 1236 updateCharacterCount(); 1237 1238 // Send to API 1239 fetchChatResponse(messages); 1240 } 1241 1242 // Fetch chat response from API 1243 function fetchChatResponse(messages) { 1244 isLoading = true; 1245 showLoadingIndicator(); 1246 1247 $.ajax({
1248 url: '/Home/Chat', 1249 type: 'POST', 1250 contentType: 'application/json', 1251 data: JSON.stringify({ 1252 Messages: messages, 1253 ProfileId: '25532' 1254 }), 1255 headers: { 1256 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() 1257 }, 1258 success: function (response) { 1259 hideLoadingIndicator(); 1260 1261 if (response.error) { 1262 appendMessage('assistant', `Error: ${response.error}`); 1263 console.error('API Error:', response.error); 1264 isLoading = false; 1265 return; 1266 } 1267 1268 // Update cost 1269 apiCost = response.Cost; 1270 localStorage.setItem('api_cost', apiCost.toString()); 1271 1272 // Check if limit reached 1273 if (response.LimitReached) { 1274 limitReached = true; 1275 showContactFormWindow(); 1276 appendMessage('assistant', 'Our AI chat has reached its capacity. Please use the contact form to get in touch directly with us.'); 1277 } else { 1278 // Check if response contains contact form trigger 1279 if (response.Message.includes('<start_contact_form>')) { 1280 const cleanResponse = response.Message.replace('<start_contact_form>', ''); 1281 appendMessage('assistant', cleanResponse); 1282 showContactFormWindow(); 1283 } else { 1284 appendMessage('assistant', response.Message); 1285 } 1286 1287 // Add response to messages array 1288 messages.push({ role: 'assistant', content: response.Message }); 1289 } 1290 1291 isLoading = false; 1292 updateChatInputState(); 1293 }, 1294 error: function (xhr, status, error) { 1295 hideLoadingIndicator(); 1296 appendMessage('assistant', 'Sorry, I encountered an error. Please try again later.'); 1297 console.error('AJAX Error:', error); 1298 isLoading = false; 1299 } 1300 }); 1301 } 1302 1303 // Append message to chat 1304 function appendMessage(role, content) { 1305 content = convertMarkdownLinksToHTML(content); 1306 const rootStyles = getComputedStyle(document.documentElement); 1307 const customerColor = rootStyles.getPropertyValue('--customer_color').trim(); 1308 const adaptivefontColor = rootStyles.getPropertyValue('--adaptive-text-color').trim(); 1309 1310 const messageClass = role === 'user' ? 'flex-end' : 'flex-start'; 1311 const bgColor = role === 'user' ? customerColor : 'white'; 1312 const textColor = role === 'user' ? adaptivefontColor : '#374151'; 1313 const borderRadius = role === 'user' ? 'border-bottom-right-radius: 0;' : 'border-bottom-left-radius: 0;'; 1314 const border = role === 'user' ? '' : 'border: 1px solid #e5e7eb;'; 1315 1316 const messageHtml = ` 1317 <div style="display: flex; justify-content: ${messageClass}; margin-bottom: 16px;"> 1318 <div style="max-width: 75%; padding: 12px; border-radius: 8px; background-color: ${bgColor}; ${border} ${borderRadius} color: ${textColor}; word-wrap: break-word; overflow-wrap: break-word;"> 1319 ${content} 1320 </div> 1321 </div> 1322 `; 1323 1324 $chatMessages.append(messageHtml); 1325 scrollToBottom(); 1326 } 1327 1328 // Show loading indicator 1329 function showLoadingIndicator() { 1330 const loadingHtml = ` 1331 <div id="loading-indicator" style="display: flex; justify-content: flex-start; margin-bottom: 16px;"> 1332 <div style="max-width: 75%; padding: 12px; border-radius: 8px; background-color: white; border: 1px solid #e5e7eb; color: #374151; display: flex; gap: 4px;"> 1333 <div class="loading-dot" style="width: 8px; height: 8px; background-color: #9ca3af; border-radius: 50%;"></div> 1334 <div class="loading-dot" style="width: 8px; height: 8px; background-color: #9ca3af; border-radius: 50%;"></div> 1335 <div class="loading-dot" style="width: 8px; height: 8px; background-color: #9ca3af; border-radius: 50%;"></div> 1336 </div> 1337 </div> 1338 `; 1339 1340 $chatMessages.append(loadingHtml); 1341 animateLoadingDots(); 1342 scrollToBottom(); 1343 1344 // Disable input while loading 1345 $chatInput.prop('disabled', true); 1346 $sendMessage.prop('disabled', true); 1347 } 1348 1349 // Animate loading dots 1350 function animateLoadingDots() { 1351 if (!$("#loading-indicator").length) return; 1352 1353 $(".loading-dot").each(function (index) { 1354 var $dot = $(this); 1355 setTimeout(function () { 1356 $dot.animate({ opacity: 0.3 }, 300) 1357 .animate({ opacity: 1 }, 300); 1358 }, index * 200); 1359 }); 1360 1361 setTimeout(function () { 1362 animateLoadingDots(); 1363 }, 900); 1364 } 1365 1366 // Hide loading indicator 1367 function hideLoadingIndicator() { 1368 $('#loading-indicator').remove(); 1369 1370 // Enable input after loading (unless limit reached) 1371 if (!limitReached) { 1372 $chatInput.prop('disabled', false); 1373 updateCharacterCount(); // This will set the correct submit button state 1374 } 1375 } 1376 1377 // Scroll to bottom of chat 1378 function scrollToBottom() { 1379 $chatMessages.scrollTop($chatMessages[0].scrollHeight); 1380 } 1381 1382 // Update cost display 1383 function updateCostDisplay() { 1384 $("#cost-info").show(); 1385 $costDisplay.text(`Cost: $${apiCost.toFixed(5)}`); 1386 1387 const percentage = (apiCost / maxCost) * 100; 1388 $percentageDisplay.text(`${percentage.toFixed(1)}% of $${maxCost.toFixed(2)}`); 1389 1390 $costProgress.css('width', `${percentage}%`); 1391
1392 // Change progress bar color if near limit 1393 if (percentage > 80) { 1394 $costProgress.css("background-color", "#dc2626"); 1395 } else { 1396 $costProgress.css("background-color", "#4f46e5"); 1397 } 1398 1399 // Update chat input state 1400 updateChatInputState(); 1401 } 1402 1403 // Update chat input state based on limit 1404 function updateChatInputState() { 1405 if (limitReached) { 1406 $chatInput.prop('disabled', true); 1407 $sendMessage.prop('disabled', true); 1408 $chatInput.attr('placeholder', 'Chat Unavailable.'); 1409 } else { 1410 $chatInput.prop('disabled', false); 1411 updateCharacterCount(); // This will set the correct submit button state 1412 $chatInput.attr('placeholder', 'Type your message...'); 1413 } 1414 } 1415 1416 // Show contact form 1417 function showContactFormWindow() { 1418 if (!contactFormOpen) { 1419 contactFormOpen = true; 1420 1421 // Hide toggle button when contact form opens 1422 $('.chatbot-toggle-container').addClass('hide-toggle'); 1423 1424 if (isMobile()) { 1425 // On mobile, slide out chat and slide in contact form 1426 $chatWindow.removeClass('show'); 1427 setTimeout(function () { 1428 $chatWindow.hide(); 1429 $contactFormWindow.show(); 1430 // Force reflow 1431 $contactFormWindow[0].offsetHeight; 1432 // Add show class for slide animation 1433 setTimeout(function () { 1434 $contactFormWindow.addClass('show'); 1435 $('.contact-form-content').scrollTop(0); 1436 }, 10); 1437 }, 300); 1438 } else { 1439 // Desktop - slide chat to left and slide in contact form 1440 $chatWindow.animate({ right: '390px' }, 300); 1441 $contactFormWindow.show(); 1442 setTimeout(function () { 1443 $contactFormWindow.animate({ right: '20px' }, 300); 1444 }, 50); 1445 } 1446 } 1447 } 1448 1449 // Hide contact form - slides out and chat returns to original position 1450 function hideContactForm() { 1451 if (contactFormOpen) { 1452 contactFormOpen = false; 1453 1454 if (isMobile()) { 1455 // Slide out contact form 1456 $contactFormWindow.removeClass('show'); 1457 1458 setTimeout(function () { 1459 $contactFormWindow.hide(); 1460 // Show chat window again if it was open 1461 if (isOpen) { 1462 $chatWindow.show(); 1463 // Force reflow 1464 $chatWindow[0].offsetHeight; 1465 setTimeout(function () { 1466 $chatWindow.addClass('show'); 1467 }, 10); 1468 } else { 1469 // If chat is not open, show toggle button 1470 $('.chatbot-toggle-container').removeClass('hide-toggle'); 1471 } 1472 }, 300); 1473 } else { 1474 // Desktop - animate back 1475 $contactFormWindow.animate({ right: '-370px' }, 300, function () { 1476 $contactFormWindow.hide(); 1477 }); 1478 $chatWindow.animate({ right: '20px' }, 300); 1479 1480 // Only show toggle if both windows are closed 1481 if (!isOpen) { 1482 $('.chatbot-toggle-container').removeClass('hide-toggle'); 1483 } 1484 } 1485 } 1486 } 1487
1488 // Submit contact form 1489 function submitContactForm() { 1490 const name = $('#chat_contactName').val(); 1491 const email = $('#chat_contactEmail').val(); 1492 const phone = $('#chat_contactPhone').val(); 1493 const message = $('#chat_contactMessage').val(); 1494 1495 // Basic validation 1496 if (!name || !email || !message) { 1497 alert('Please fill out all required fields.'); 1498 return; 1499 } 1500 1501 // Email validation 1502 const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 1503 if (!emailRegex.test(email)) { 1504 alert('Please enter a valid email address.'); 1505 return; 1506 } 1507 1508 // Message length validation 1509 if (message.length < 10) { 1510 alert('Your message must be at least 10 characters long.'); 1511 return; 1512 } 1513 1514 // Disable form during submission 1515 $('#contact-submit-btn').prop('disabled', true).text('Sending...'); 1516 1517 var form = $("#chatbot-contact-form"); 1518 1519 // Execute reCAPTCHA before submitting 1520 grecaptcha.ready(function() { 1521 grecaptcha.execute('6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH', {action: 'contact_us'}).then(function(token) { 1522 // Set the reCAPTCHA token 1523 $("#chat_g-Recaptcha-Response-Contact").val(token); 1524 1525 // Submit the form with reCAPTCHA token 1526 $.ajax({
1527 url: "/Home/ChatContactPost", 1528 type: 'POST', 1529 data: form.serialize(), 1530 success: function (response) { 1531 if (typeof response === 'string' && response.indexOf('{"message":') != -1) { 1532 var jsonData = JSON.parse(response); 1533 if (jsonData.success) { 1534 appendMessage('assistant', 'Thanks for providing your information! We will get back to you soon.'); 1535 hideContactForm(); 1536 1537 // Reset the form 1538 $('#chat_contactName').val(''); 1539 $('#chat_contactEmail').val(''); 1540 $('#chat_contactPhone').val(''); 1541 $('#chat_contactMessage').val(''); 1542 } else { 1543 alert(jsonData.message || 'There was an error processing your request.'); 1544 } 1545 } else if (response.success) { 1546 appendMessage('assistant', 'Thanks for providing your information! We will get back to you soon.'); 1547 hideContactForm(); 1548 1549 // Reset the form 1550 $('#chat_contactName').val(''); 1551 $('#chat_contactEmail').val(''); 1552 $('#chat_contactPhone').val(''); 1553 $('#chat_contactMessage').val(''); 1554 1555 } else { 1556 alert(response.message || 'There was an error processing your request.'); 1557 } 1558 1559 $('#contact-submit-btn').prop('disabled', false).text('Submit'); 1560 }, 1561 error: function (xhr, status, error) { 1562 alert('Failed to submit your information. Please try again.'); 1563 console.error('AJAX Error:', error); 1564 $('#contact-submit-btn').prop('disabled', false).text('Submit'); 1565 } 1566 }); 1567 }); 1568 }); 1569 } 1570 1571 function convertMarkdownLinksToHTML(text) { 1572 return text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, linkText, url) => { 1573 // Add target="_blank" for http/https links 1574 if (url.startsWith('http://') || url.startsWith('https://')) { 1575 return `<a href="${url}" target="_blank" rel="noopener noreferrer">${linkText}</a>`; 1576 } 1577 // Keep tel: and mailto: links as-is 1578 return `<a href="${url}">${linkText}</a>`; 1579 }); 1580 } 1581 1582 function getLuminance(hex) { 1583 // Remove # if present 1584 hex = hex.replace('#', ''); 1585 1586 // Convert hex to RGB 1587 const r = parseInt(hex.substr(0, 2), 16) / 255; 1588 const g = parseInt(hex.substr(2, 2), 16) / 255; 1589 const b = parseInt(hex.substr(4, 2), 16) / 255; 1590 1591 // Calculate relative luminance 1592 const rLum = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4); 1593 const gLum = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4); 1594 const bLum = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4); 1595 1596 return 0.2126 * rLum + 0.7152 * gLum + 0.0722 * bLum; 1597 } 1598 1599 function isLightColor(hex) { 1600 const luminance = getLuminance(hex); 1601 return luminance > 0.5; // Threshold for light vs dark 1602 } 1603 1604 function updateTextColors() { 1605 const rootStyles = getComputedStyle(document.documentElement); 1606 let customerColor = rootStyles.getPropertyValue('--customer_color').trim(); 1607 1608 // Check if customer color is not set or is empty 1609 if (!customerColor || customerColor === '') { 1610 const defaultColor = '#f3f3f3'; 1611 1612 // Set the default customer color 1613 document.documentElement.style.setProperty('--customer_color', defaultColor); 1614 customerColor = defaultColor; 1615 } 1616 1617 const isLight = isLightColor(customerColor); 1618 const textColor = isLight ? '#000000b3' : '#ffffff'; 1619 1620 const $chatbotToggle = $('#chatbot-toggle'); 1621 if (isLight) { 1622 $chatbotToggle.removeClass('dark-background').addClass('light-background'); 1623 } else { 1624 $chatbotToggle.removeClass('light-background').addClass('dark-background'); 1625 } 1626 1627 // Update the CSS custom property 1628 document.documentElement.style.setProperty('--adaptive-text-color', textColor); 1629 } 1630 1631 function isMobile() { 1632 return window.innerWidth <= 768; 1633 } 1634 1635 // Public interface 1636 return { 1637 init: init 1638 }; 1639 })(); 1640 1641 // Initialize the chatbot module when document is ready 1642 $(document).ready(function () { 1643 if (window.ChatbotModule) {
1644 window.ChatbotModule.init(); 1645 } 1646 }); 1647</script>
1647 1648<!-- Modal --> 1649<div class="modal" id="carouselImageryPhotoModal"> 1650 <div class="modal-dialog modal-dialog-centered modal-lg"> 1651 <div class="modal-content"> 1652 <div class="modal-header"><button type="button" class="close" data-dismiss="modal">×</button></div> 1653 <div class="modal-body"> 1654 <div class="w-100 w-lg-75 mx-auto mt-4 mb-4"> 1655 <div class="slider slider-imagery w-100"> 1656 <div class="image-slider m-2"> 1657 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/f324ab1e-94e6-4598-a8da-7387d7a175d0.jpg" class="img-fluid text-center mx-auto" /> 1658 </div> 1659 <div class="image-slider m-2"> 1660 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/fbb3aa4d-62ab-4685-b5d6-d788b2a2afe2.jpg" class="img-fluid text-center mx-auto" /> 1661 </div> 1662 <div class="image-slider m-2"> 1663 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c4d56bc0-021c-4023-977d-f2bcb7d898f9.jpg" class="img-fluid text-center mx-auto" /> 1664 </div> 1665 <div class="image-slider m-2"> 1666 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/3917c280-f1e3-4fdc-8678-33875868981b.jpg" class="img-fluid text-center mx-auto" /> 1667 </div> 1668 <div class="image-slider m-2"> 1669 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/a2b7ee9c-34d7-43dc-b769-72fd9de28490.jpg" class="img-fluid text-center mx-auto" /> 1670 </div> 1671 <div class="image-slider m-2"> 1672 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/4554aa09-9fb9-4f94-9e63-a42a3f077ea0.jpg" class="img-fluid text-center mx-auto" /> 1673 </div> 1674 <div class="image-slider m-2"> 1675 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/03bbfcb0-b644-4b84-9f10-99836bca8afb.jpeg" class="img-fluid text-center mx-auto" /> 1676 </div> 1677 <div class="image-slider m-2"> 1678 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/8e25c82f-85c7-4634-baa3-dba52d543b5f.jpeg" class="img-fluid text-center mx-auto" /> 1679 </div> 1680 <div class="image-slider m-2"> 1681 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/789df3c7-a24e-4b3b-88ab-fbfd8a83ba07.jpg" class="img-fluid text-center mx-auto" /> 1682 </div> 1683 <div class="image-slider m-2"> 1684 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/c950e5e7-0af9-402e-9976-6e1417d717f4.jpg" class="img-fluid text-center mx-auto" /> 1685 </div> 1686 <div class="image-slider m-2"> 1687 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/b1a38da7-08cc-4206-a6a1-d732d75178f3.jpg" class="img-fluid text-center mx-auto" /> 1688 </div> 1689 <div class="image-slider m-2"> 1690 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/4053eee0-d044-4c3b-832e-f6c25c0011c7.jpg" class="img-fluid text-center mx-auto" /> 1691 </div> 1692 <div class="image-slider m-2"> 1693 <img alt="Image" src="https://du9m0k402rjmo.
1693cloudfront.net/images/P_25532/c71f7fbb-1e23-4339-b069-dc00ef1c6df0.jpg" class="img-fluid text-center mx-auto" /> 1694 </div> 1695 <div class="image-slider m-2"> 1696 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/f1b57936-fb95-434c-a6f2-8a514aec0f3b.jpg" class="img-fluid text-center mx-auto" /> 1697 </div> 1698 <div class="image-slider m-2"> 1699 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/b9cb7f5b-1421-4d92-a972-b6e9deeee22f.jpg" class="img-fluid text-center mx-auto" /> 1700 </div> 1701 <div class="image-slider m-2"> 1702 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/1e2ed5cb-6f71-443f-a08d-c0d56e87de5a.jpg" class="img-fluid text-center mx-auto" /> 1703 </div> 1704 <div class="image-slider m-2"> 1705 <img alt="Image" src="https://du9m0k402rjmo.cloudfront.net/images/P_25532/410e7b95-83ea-4697-a9ce-9291873bcf7e.jpg" class="img-fluid text-center mx-auto" /> 1706 </div> 1707 </div> 1708 </div> 1709 </div> 1710 </div> 1711 </div> 1712</div> 1713 1714<!-- Modal --> 1715<div class="modal" id="carouselImageryVideoModal"> 1716 <div class="modal-dialog modal-dialog-centered modal-xl"> 1717 <div class="modal-content"> 1718 <div class="modal-header"><button type="button" class="close" data-dismiss="modal">×</button></div> 1719 <div class="modal-body"> 1720 </div> 1721 </div> 1722 </div> 1723</div> 1724 1725<div id="loadingImg" class="loader" style="display:none !important"> 1726 <i class="fas fa-circle"></i> 1727 <i class="fas fa-circle"></i> 1728 <i class="fas fa-circle"></i> 1729</div> 1730
1731<script type="text/javascript"> 1732 var isMobile = false; 1733 var isTablet = false; 1734 var pageSize = 5; 1735 var pageIndex = 0; 1736 var notReputation = false; 1737 var hasbanner = false; 1738 var keepPostUp = false; 1739 var listOfSites = ""; 1740 var numOfReviews = 89; 1741 var numOfFilteredReviews = 89; 1742 var testimonialPageBackgroundColor = '#046D7A'; 1743 var numOfPosts = 0; 1744 var postsPageIndex = 0; 1745 var geocode = null; 1746 var isSubmittingReview = false; //global flag to track submission 1747 1748 $(document).ready(function () { 1749 1750 if ($(window).width() < 576) { 1751 $("#gallerysection").addClass("pr-3"); 1752 $("#gallerysection").addClass("pl-3"); 1753 } 1754 else { 1755 $("#gallerysection").removeClass("pr-3"); 1756 $("#gallerysection").removeClass("pl-3"); 1757 } 1758 1759 if($("#contact_us_phone").length > 0){ 1760 var cleave = new Cleave('#contact_us_phone', { 1761 phone: true, 1762 phoneRegionCode: 'US' 1763 }); 1764 } 1765 1766 // Load the review modal async on page load 1767 $.get('/Home/GetReviewModalContent', { id: 25532, template: "Template_6"}, function (data) { 1768 if (data != "") { 1769 $("#reviewFormParentContainer").append(data); 1770 $('#starRating').barrating({ 1771 theme: 'bootstrap-stars', 1772 deselectable: true, 1773 onSelect: function (value, text, event) { 1774 $('.br-widget').removeClass('error'); 1775 $('.alert').alert('close'); 1776 } 1777 }); 1778 1779 } 1780 }); 1781 1782 checkMobile(); 1783 checkTablet(); 1784 bgSlider(); 1785 initializeCarousel(); 1786 checkHashRoute(); 1787 1788 PauseVideoPlayer(); 1789 1790 if(hasbanner){ 1791 GetPostsBanner(); 1792 } 1793 1794 $(window).on('hashchange', function(){ 1795 checkHashRoute(); 1796 }); 1797 1798 document.addEventListener("visibilitychange", function () { 1799 if (document["hidden"]) { 1800 PauseVideoPlayer(); 1801 } 1802 }); 1803 1804 var navMain = $("#navbarToggler"); 1805 navMain.on("click", "a", null, function () { 1806 navMain.collapse('hide'); 1807 }); 1808 1809 $(window).scroll(function () { 1810 var scroll = $(window).scrollTop(); 1811 if (('True' == 'False') || ('True' == 'True' && window.outerWidth > 767.98)) { /*false=center/true=left*/ 1812 if (scroll > 150){ 1813 $(".content").addClass("page-section-adjust"); 1814 $(".nav-logo").addClass("nav-logo-adjust"); 1815 $(".nav-location").addClass("nav-item-adjust"); 1816 } 1817 else if(scroll <= 150){ 1818 $(".content").removeClass("page-section-adjust"); 1819 $(".nav-logo").removeClass("nav-logo-adjust"); 1820 $(".nav-location").removeClass("nav-item-adjust"); 1821 } 1822 } 1823 }); 1824 1825 $("#carouselImageryVideoModal").on('shown.bs.modal', function (e) { 1826 $("video").each(function () { this.pause() }); //stop html5 video from playing 1827 }); 1828 1829 $("#carouselImageryVideoModal").on('hidden.bs.modal', function (e) { 1830 $("video").each(function () { this.pause() }); //stop html5 video from playing 1831 $('.slider-video').slick('unslick'); //destroy slider to prevent video from playing after closing 1832 }); 1833 1834 $(document).on("click", "#btnContactPost", function (e) { 1835 $("#btnContactPost").prop('disabled', true); 1836 $("#btnContactPost").css('font-weight', 'normal'); 1837 contactUsPost(e); 1838 }); 1839 1840 1841 var analyticsCategory = "Desktop"; 1842 if (isMobile == true) { 1843 analyticsCategory = "Mobile"; 1844 } 1845 1846 if (testimonialPageBackgroundColor != null && testimonialPageBackgroundColor != '' && testimonialPageBackgroundColor != "#F5F5F5") { 1847 //set footer background color 1848 $('.custom-background-color').css('background-color', testimonialPageBackgroun
1848dColor); 1849 //set footer text color appropriately 1850 setFooterColor(testimonialPageBackgroundColor); 1851 } 1852 else { 1853 //set footer background color to white 1854 var white = "#FFFFFF"; 1855 $('.custom-background-color').css('background-color', white); 1856 //set footer text color appropriately 1857 setFooterColor(white); 1858 } 1859 1860 $("#HomePageNavigationLink").click(function(e){ 1861 $('html, body').animate({ scrollTop: 0 }, 'fast'); 1862 }); 1863 1864 $(".business-name").click(function(e){ 1865 $('html, body').animate({ scrollTop: 0 }, 'fast'); 1866 }); 1867 1868 $(".testimonialsBlurbMore").click(function(e){ 1869 $('html, body').animate({ scrollTop: 0 }, 'fast'); 1870 }); 1871 1872 $('#starRating').barrating({ 1873 theme: 'bootstrap-stars', 1874 deselectable: true, 1875 onSelect: function (value, text, event) { 1876 $('.br-widget').removeClass('error'); 1877 $('.alert').alert('close'); 1878 } 1879 }); 1880 1881 if(numOfPosts > 0){ 1882 GetPostsData(0); 1883 } 1884 1885 $(document).on('click', "#nextPosts", function (e) { 1886 ScrollForPosts(e); 1887 GetPostsData(1); 1888 }); 1889 1890 $(document).on('click', "#prevPosts", function (e) { 1891 ScrollForPosts(e); 1892 GetPostsData(-1); 1893 }); 1894 1895 $(document).on('click', "#postReview", function (e) { 1896 e.preventDefault(); 1897 e.stopPropagation(); 1898 1899 if (isSubmittingReview) { 1900 console.log('Review submission already in progress - blocking duplicate submission'); 1901 return false; 1902 } 1903 1904 var $button = $(this); 1905 var $form = $("#postReviewForm"); 1906 var $modal = $("#reviewFormSection"); 1907 1908 isSubmittingReview = true; 1909 console.log('Starting review submission'); 1910 1911 setProcessingState($button, $form, true); 1912 1913 var alertType = "success"; 1914 1915 if(validateReview("#postReview")) { 1916 console.log('Review validation passed'); 1917 ShowLoading(); 1918 1919 grecaptcha.ready(function() { 1920 grecaptcha.execute('6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH', {action: 'testimonial_review'}).then(function(token) { 1921 $("#g-Recaptcha-Response-Review").attr("value", token); 1922 1923 var rating = null; 1924 var selectElement = document.getElementById('starRating'); 1925 var selectRating = selectElement ? selectElement.value : null; 1926 var selectedOption = $('#starRating option:selected').val(); 1927 var barRating = null; 1928 var reviewerAlias = $('#review_alias').val() || ''; 1929 var reviewHeading = $('#review_heading').val() || ''; 1930 var antiForgeryToken = $('input[name="__RequestVerificationToken"]').val(); 1931 var recaptchaToken = $('#g-Recaptcha-Response-Review').val(); 1932 var timeToPost = $('#phoneNumber_alternative').val(); 1933 1934 var reviewText = $('#review').val() || ''; 1935 var profileId = 25532; 1936 1937 console.log('Trying to get rating value...'); 1938 1939 var selectRating = $('#starRating')[0] ? $('#starRating')[0].value : null; 1940 console.log('Select element direct value:', selectRating); 1941 1942 var jqueryRating = $('#starRating').val(); 1943 console.log('jQuery val() result:', jqueryRating, typeof jqueryRating); 1944 1945 if (typeof $('#starRating').barrating === 'function') { 1946 try { 1947 var barResult = $('#starRating').barrating('show'); 1948 1949 if (barResult && typeof barResult === 'string') { 1950 barRating = barResult; 1951 } else if (barResult && typeof barResult === 'number') { 1952 barRating = barResult.toString(); 1953 } 1954 } catch (e) { 1955 console.log('Error getting barrating value:', e); 1956 } 1957 } 1958 1959 var selectedOption = $('#starRating option:selected').val(); 1960 console.log('Selected option value:', selectedOption); 1961 1962 var jqueryResult = $('#starRating').val(); 1963 var jqueryRating = null; 1964 1965 if (jqueryResult && typeof jqueryResult === 'string') { 1966 jqueryRating = jqueryResult; 1967 } else if (jqueryResult && typeof jqueryResult === 'number') { 1968 jqueryRating = jqueryResult.toString(); 1969 } 1970 1971 if (barRating && barRating !== "" && barRating !== "0") { 1972 rating = barRating; 1973 } else if (selectRating && selectRating !== "" && selectRating !== "0") { 1974 rating = selectRating; 1975 } else if (selectedOption && selectedOption !== "" && selectedOption !== "0") { 1976 rating = selectedOption; 1977 } else if (jqueryRating && jqueryRating !== "" && jqueryRating !== "0") { 1978 rating = jqueryRating; 1979 } 1980 1981 if (rating && typeof rating !== 'string') { 1982 console.log('WARNING: Rating is not a string, converting:', rating, typeof rating);
1983 rating = String(rating); 1984 } 1985 1986 if (rating && typeof rating === 'object') { 1987 console.error('CRITICAL ERROR: Rating is still an object!', rating); 1988 rating = null; 1989 } 1990 1991 console.log('Validation check - rating found:', rating, typeof rating); 1992 console.log('Final rating value:', rating, typeof rating); 1993 1994 console.log('Form values before sending:'); 1995 console.log('- Review text:', reviewText); 1996 console.log('- Rating:', rating); 1997 console.log('- Profile ID:', profileId); 1998 console.log('- Reviewer alias:', reviewerAlias); 1999 console.log('- Review heading:', reviewHeading); 2000 console.log('- Anti-forgery token:', antiForgeryToken ? 'Present' : 'Missing'); 2001 2002 // Build form data 2003 var formDataArray = [ 2004 { name: 'profile_id', value: profileId }, 2005 { name: 'review', value: reviewText }, 2006 { name: 'review_rating', value: rating }, 2007 { name: 'reviewer_alias', value: reviewerAlias }, 2008 { name: 'review_heading', value: reviewHeading }, 2009 { name: '__RequestVerificationToken', value: antiForgeryToken }, 2010 { name: 'g-Recaptcha-Response-Review', value: recaptchaToken }, 2011 { name: 'phoneNumber_alternative', value: timeToPost }, 2012 { name: '_t', value: new Date().getTime() } 2013 ]; 2014 2015 var formData = formDataArray 2016 .filter(item => item.value !== undefined && item.value !== null && item.value !== '') 2017 .map(item => encodeURIComponent(item.name) + '=' + encodeURIComponent(item.value)) 2018 .join('&'); 2019 2020 console.log('Manual form data built:', formData); 2021 2022 $.ajax({
2023 url: "/Home/ReviewPost", 2024 type: "POST", 2025 data: formData, 2026 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 2027 dataType: "json", 2028 success: function(data) { 2029 console.log('Review submission response:', data); 2030 2031 if (!data.message || data.message.trim() === '') { 2032 data.message = data.success ? 2033 'Thank you for your review! It has been submitted successfully.' : 2034 'There was an issue submitting your review. Please check all fields and try again.'; 2035 } 2036 2037 alertType = data.success ? "success" : "warning"; 2038 2039 if (!data.success) { 2040 recaptchaReviewIncomplete(); 2041 showClassicCaptcha("review"); 2042 } 2043 2044 $form.find('.alert').remove(); 2045 2046 var alertHtml = '<div class="alert alert-' + alertType + ' alert-dismissible" role="alert">' + 2047 '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + 2048 '<span aria-hidden="true">×</span></button>' + 2049 data.message + '</div>'; 2050 2051 $form.prepend(alertHtml); 2052 2053 $modal.find('.modal-body').scrollTop(0); 2054 2055 if(alertType === "success") { 2056 // Auto-hide modal after showing success message 2057 setTimeout(function () { 2058 $modal.modal('hide'); 2059 ClearReviewFields(); 2060 }, 3000); 2061 } 2062 2063 // Fade out alert after delay 2064 setTimeout(function() { 2065 $form.find('.alert').fadeOut(500, function() { 2066 $(this).remove(); 2067 }); 2068 }, 6000); 2069 }, 2070 error: function(xhr, status, error) { 2071 console.error('AJAX Error:', status, error); 2072 console.error('Response Text:', xhr.responseText); 2073 2074 $form.find('.alert').remove(); 2075 var errorHtml = '<div class="alert alert-danger alert-dismissible" role="alert">' + 2076 '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + 2077 '<span aria-hidden="true">×</span></button>' + 2078 'An error occurred while submitting your review. Please try again.</div>'; 2079 $form.prepend(errorHtml); 2080 2081 $modal.find('.modal-body').scrollTop(0); 2082 }, 2083 complete: function() { 2084 // Reset states 2085 console.log('Resetting processing state'); 2086 setProcessingState($button, $form, false); 2087 HideLoading(); 2088 isSubmittingReview = false; 2089 console.log('Review submission completed'); 2090 } 2091 }); 2092 2093 }).catch(function(error) { 2094 console.error('reCAPTCHA Error:', error); 2095 2096 $form.find('.alert').remove(); 2097 var captchaErrorHtml = '<div class="alert alert-danger alert-dismissible" role="alert">
2097' + 2098 '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + 2099 '<span aria-hidden="true">×</span></button>' + 2100 'Security verification failed. Please refresh the page and try again.</div>'; 2101 $form.prepend(captchaErrorHtml); 2102 2103 $modal.find('.modal-body').scrollTop(0); 2104 setProcessingState($button, $form, false); 2105 HideLoading(); 2106 isSubmittingReview = false; 2107 }); 2108 }); 2109 } else { 2110 console.log('Review validation failed'); 2111 2112 var missingFields = []; 2113 if (!$('#review').val() || $('#review').val().trim() === '') { 2114 missingFields.push('review text'); 2115 } 2116 2117 var rating = null; 2118 var selectRating = $('#starRating')[0] ? $('#starRating')[0].value : null; 2119 var jqueryRating = $('#starRating').val(); 2120 var selectedOption = $('#starRating option:selected').val(); 2121 var barRating = null; 2122 2123 if (typeof $('#starRating').barrating === 'function') { 2124 try { 2125 barRating = $('#starRating').barrating('show'); 2126 } catch (e) { 2127 // Ignore error 2128 } 2129 } 2130 2131 if (barRating && barRating !== "" && barRating !== "0") { 2132 rating = barRating; 2133 } else if (selectRating && selectRating !== "" && selectRating !== "0") { 2134 rating = selectRating; 2135 } else if (selectedOption && selectedOption !== "" && selectedOption !== "0") { 2136 rating = selectedOption; 2137 } else if (typeof jqueryRating === 'string' && jqueryRating !== "" && jqueryRating !== "0") { 2138 rating = jqueryRating; 2139 } 2140 2141 console.log('Validation check - rating found:', rating); 2142 2143 if (!rating || rating === "" || rating === "0") { 2144 missingFields.push('rating'); 2145 } 2146 2147 var validationMessage = 'Please fill out the following required fields: ' + missingFields.join(' and ') + '.'; 2148 console.log('Validation message:', validationMessage); 2149 2150 $form.find('.alert').remove(); 2151 var validationHtml = '<div class="alert alert-warning alert-dismissible" role="alert">' + 2152 '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + 2153 '<span aria-hidden="true">×</span></button>' + 2154 validationMessage + '</div>'; 2155 $form.prepend(validationHtml); 2156 2157 $modal.find('.modal-body').scrollTop(0); 2158 setProcessingState($button, $form, false); 2159 isSubmittingReview = false; 2160 2161 return false; 2162 } 2163 }); 2164 2165 $('#reviewFormSection').on('hidden.bs.modal', function () { 2166 console.log('Modal hidden - resetting submission state'); 2167 isSubmittingReview = false; 2168 setProcessingState($("#postReview"), $("#postReviewForm"), false); 2169 $(this).find('.alert').remove(); 2170 }); 2171 2172 $('#reviewFormSection').on('show.bs.modal', function () { 2173 console.log('Modal shown - ensuring clean state'); 2174 isSubmittingReview = false; 2175 setProcessingState($("#postReview"), $("#postReviewForm"), false); 2176 2177 $("#postReview").prop('disabled', false); 2178 $("#postReview").css('font-weight', 'bold'); 2179 2180 setTimeout(function () { 2181 console.log('=== STAR RATING DEBUG ==='); 2182 console.log('Star rating element:', $('#starRating')[0]); 2183 console.log('Star rating jQuery object:', $('#starRating')); 2184 console.log('Star rating direct value:', $('#starRating')[0] ? $('#starRating')[0].value : 'N/A'); 2185 console.log('Star rating jQuery val():', $('#starRating').val()); 2186 console.log('Star rating selected option:', $('#starRating option:selected').val()); 2187 console.log('Barrating plugin available:', typeof $('#starRating').barrating === 'function'); 2188 if (typeof $('#starRating').barrating === 'function') { 2189 try { 2190 console.log('Barrating current value:', $('#starRating').barrating('show')); 2191 } catch (e) { 2192 console.log('Error getting barrating value:', e); 2193 } 2194 } 2195 console.log('=== END STAR RATING DEBUG ==='); 2196 }, 100); 2197 }); 2198 2199 // Prevent modal from closing during submission 2200 $('#reviewFormSection').on('hide.bs.modal', function (e) { 2201 if (isSubmittingReview) { 2202 console.log('Preventing modal close during submission'); 2203 e.preventDefault(); 2204 return false; 2205 } 2206 }); 2207 2208 $('a').on('click', function () { 2209 if (this.id !== "undefined" && this.id !== "") { 2210 gtag('event', 'Link Click', { 2211 'event_category': analyticsCategory, 2212 'event_label': this.id 2213 }); 2214 } 2215 }); 2216 2217 $('#PhoneNav').on('click', function () { 2218 gtag('event', 'Link Click', { 2219 'event_category': analyticsCategory, 2220 'event_label': "CustomerBusinessPhoneLinkTemplate6" 2221 }); 2222 }); 2223 $('.phoneLinkInput').on('click', function () { 2224 gtag('event', 'Link Click', { 2225 'event_category': analyticsCategory, 2226 'event_label': "CustomerBusinessPhoneLinkTemplate6-1" 2227 }); 2228 }); 2229 $('#contactPhoneLink').on('click', function () { 2230 gtag('event', 'Link Click', { 2231 'event_category': analyticsCategory, 2232 'event_label': "CustomerBusinessPhoneLinkTemplate6-2"
2233 }); 2234 }); 2235 $('#contactPrimaryPhoneLink').on('click', function () { 2236 gtag('event', 'Link Click', { 2237 'event_category': analyticsCategory, 2238 'event_label': "CustomerBusinessPhoneLinkTemplate6-3" 2239 }); 2240 }); 2241 $('#contactSecondaryPhoneLink').on('click', function () { 2242 gtag('event', 'Link Click', { 2243 'event_category': analyticsCategory, 2244 'event_label': "CustomerBusinessPhoneLinkTemplate6-4" 2245 }); 2246 }); 2247 $('#contactMobilePhoneLink').on('click', function () { 2248 gtag('event', 'Link Click', { 2249 'event_category': analyticsCategory, 2250 'event_label': "CustomerBusinessPhoneLinkTemplate6-5" 2251 }); 2252 }); 2253 $('#contactFaxPhoneLink').on('click', function () { 2254 gtag('event', 'Link Click', { 2255 'event_category': analyticsCategory, 2256 'event_label': "CustomerBusinessPhoneLinkTemplate6-6" 2257 }); 2258 }); 2259 $('#contactTollfreePhoneLink').on('click', function () { 2260 gtag('event', 'Link Click', { 2261 'event_category': analyticsCategory, 2262 'event_label': "CustomerBusinessPhoneLinkTemplate6-7" 2263 }); 2264 }); 2265 $('#contactPhoneC1').on('click', function () { 2266 gtag('event', 'Link Click', { 2267 'event_category': analyticsCategory, 2268 'event_label': "CustomerContactPhoneLinkTemplate6-8" 2269 }); 2270 }); 2271 $('#contactPhoneC2').on('click', function () { 2272 gtag('event', 'Link Click', { 2273 'event_category': analyticsCategory, 2274 'event_label': "CustomerContactPhoneLinkTemplate6-9" 2275 }); 2276 }); 2277 $('#contactPhoneC3').on('click', function () { 2278 gtag('event', 'Link Click', { 2279 'event_category': analyticsCategory, 2280 'event_label': "CustomerContactPhoneLinkTemplate6-10" 2281 }); 2282 }); 2283 $('#contactPhoneC4').on('click', function () { 2284 gtag('event', 'Link Click', { 2285 'event_category': analyticsCategory, 2286 'event_label': "CustomerContactPhoneLinkTemplate6-11" 2287 }); 2288 }); 2289 $('#contactPhoneC5').on('click', function () { 2290 gtag('event', 'Link Click', { 2291 'event_category': analyticsCategory, 2292 'event_label': "CustomerContactPhoneLinkTemplate6-12" 2293 }); 2294 }); 2295 $('#contactEmail').on('click', function () { 2296 gtag('event', 'Link Click', { 2297 'event_category': analyticsCategory, 2298 'event_label': "CustomerBusinessEmailLinkTemplate6" 2299 }); 2300 }); 2301 $('#writeReviewBt').on('click', function () { 2302 gtag('event', 'Button Click', { 2303 'event_category': analyticsCategory, 2304 'event_label': "WriteReviewButtonTemplate6" 2305 }); 2306 }); 2307 $(document).on('click', '#postReview', function () { 2308 gtag('event', 'Button Click', { 2309 'event_category': analyticsCategory, 2310 'event_label': "PostReviewButtonTemplate6" 2311 }); 2312 }); 2313 $('#nextReview').on('click', function () { 2314 gtag('event', 'Button Click', { 2315 'event_category': analyticsCategory, 2316 'event_label': "ShowNextReviewsButtonTemplate6" 2317 }); 2318 }); 2319 $('#prevReview').on('click', function () { 2320 gtag('event', 'Button Click', { 2321 'event_category': analyticsCategory, 2322 'event_label': "ShowPreviousReviewsButtonTemplate6" 2323 }); 2324 }); 2325 $('#google-social').on('click', function () { 2326 gtag('event', 'Link Click', { 2327 'event_category': analyticsCategory, 2328 'event_label': "CustomerGoogleSocialLinkTemplate6-1" 2329 }); 2330 }); 2331 $('#facebook-social').on('click', function () { 2332 gtag('event', 'Link Click', { 2333 'event_category': analyticsCategory, 2334 'event_label': "CustomerFacebookSocialLinkTemplate6-1" 2335 }); 2336 }); 2337 $('#yelp-social').on('click', function () { 2338 gtag('event', 'Link Click', { 2339 'event_category': analyticsCategory, 2340 'event_label': "CustomerYelpSocialLinkTemplate6-1" 2341 }); 2342 }); 2343 $('#twitter-social').on('click', function () { 2344 gtag('event', 'Link Click', { 2345 'event_category': analyticsCategory, 2346 'event_label': "CustomerTwitterSocialLinkTemplate6-1" 2347 }); 2348 }); 2349 $('#linkedin-social').on('click', function () { 2350 gtag('event', 'Link Click', { 2351 'event_category': analyticsCategory, 2352 'event_label': "CustomerLinkedinSocialLinkTemplate6-1" 2353 }); 2354 }); 2355 $('#instagram-social').on('click', function () { 2356 gtag('event', 'Link Click', { 2357 'event_category': analyticsCategory,
2358 'event_label': "CustomerInstagramSocialLinkTemplate6-1" 2359 }); 2360 }); 2361 $('#google-social-footer').on('click', function () { 2362 gtag('event', 'Link Click', { 2363 'event_category': analyticsCategory, 2364 'event_label': "CustomerGoogleSocialLinkTemplate6-2" 2365 }); 2366 }); 2367 $('#facebook-social-footer').on('click', function () { 2368 gtag('event', 'Link Click', { 2369 'event_category': analyticsCategory, 2370 'event_label': "CustomerFacebookSocialLinkTemplate6-2" 2371 }); 2372 }); 2373 $('#yelp-social-footer').on('click', function () { 2374 gtag('event', 'Link Click', { 2375 'event_category': analyticsCategory, 2376 'event_label': "CustomerYelpSocialLinkTemplate6-2" 2377 }); 2378 }); 2379 $('#twitter-social-footer').on('click', function () { 2380 gtag('event', 'Link Click', { 2381 'event_category': analyticsCategory, 2382 'event_label': "CustomerTwitterSocialLinkTemplate6-2" 2383 }); 2384 }); 2385 $('#linkedin-social-footer').on('click', function () { 2386 gtag('event', 'Link Click', { 2387 'event_category': analyticsCategory, 2388 'event_label': "CustomerLinkedinSocialLinkTemplate6-2" 2389 }); 2390 }); 2391 $('#instagram-social-footer').on('click', function () { 2392 gtag('event', 'Link Click', { 2393 'event_category': analyticsCategory, 2394 'event_label': "CustomerInstagramSocialLinkTemplate6-2" 2395 }); 2396 }); 2397 $('#contactEmailFooter').on('click', function () { 2398 gtag('event', 'Link Click', { 2399 'event_category': analyticsCategory, 2400 'event_label': "CustomerBusinessEmailLinkTemplate6-2" 2401 }); 2402 }); 2403 $('#btnContactPost').on('click', function () { 2404 gtag('event', 'Link Click', { 2405 'event_category': analyticsCategory, 2406 'event_label': "CustomerContactLeadPostTemplate6" 2407 }); 2408 }); 2409 $("#external-review-link").on('click', function () { 2410 gtag('event', 'Link Click', { 2411 'event_category': analyticsCategory, 2412 'event_label': "CustomerExternalReviewLinkTemplate6" 2413 }); 2414 }); 2415 $('#video').on('click', function () { 2416 gtag('event', 'Video Click', { 2417 'event_category': analyticsCategory, 2418 'event_label': "CustomerVideoTemplate6" 2419 }); 2420 }); 2421 $('#website-social').on('click', function () { 2422 gtag('event', 'Link Click', { 2423 'event_category': analyticsCategory, 2424 'event_label': "CustomerWebsiteSocialLinkTemplate6-1" 2425 }); 2426 }); 2427 $('#website-social-footer').on('click', function () { 2428 gtag('event', 'Link Click', { 2429 'event_category': analyticsCategory, 2430 'event_label': "CustomerWebsiteSocialLinkTemplate6-2" 2431 }); 2432 }); 2433 $('#photos-image-element').on('click', function () { 2434 gtag('event', 'Link Click', { 2435 'event_category': analyticsCategory, 2436 'event_label': "CustomerWebsiteImageryPhotoTemplate6" 2437 }); 2438 }); 2439 $('#HomePageNavigationLink').on('click', function () { 2440 gtag('event', 'Link Click', { 2441 'event_category': analyticsCategory, 2442 'event_label': "CustomerHomePageNavLinkTemplate6" 2443 }); 2444 }); 2445 $('#ContactPageNavigationLink').on('click', function () { 2446 gtag('event', 'Link Click', { 2447 'event_category': analyticsCategory, 2448 'event_label': "CustomerContactPageNavLinkTemplate6" 2449 }); 2450 }); 2451 $('#PhotosNavigationLink').on('click', function () { 2452 gtag('event', 'Link Click', { 2453 'event_category': analyticsCategory, 2454 'event_label': "CustomerPhotosPageNavLinkTemplate6" 2455 }); 2456 }); 2457 $('#testimoinalsPageNavigationLink').on('click', function () { 2458 gtag('event', 'Link Click', { 2459 'event_category': analyticsCategory, 2460 'event_label': "CustomerTestimonialsPageNavLinkTemplate6" 2461 }); 2462 }); 2463 $('#ServicesPageNavigationLink').on('click', function () { 2464 gtag('event', 'Link Click', { 2465 'event_category': analyticsCategory, 2466 'event_label': "CustomerServicesPageNavLinkTemplate6" 2467 }); 2468 }); 2469 $('#AboutPageNavigationLink').on('click', function () { 2470 gtag('event', 'Link Click', { 2471 'event_category': analyticsCategory, 2472 'event_label': "CustomerAboutPageNavLinkTemplate6" 2473 }); 2474 }); 2475 $('#GSVPageNavigationLink').on('click', function () { 2476 gtag('event', 'Link Click', { 2477 'event_category': analyticsCategory, 2478 'event_label': "CustomerGSVTourPageNavLinkTemplate3" 2479 }); 2480 }); 2481 //unable to directly track cross domain iFrame clicks. Track only first click on the iFrame itself 2482 var monitor = setInterval(function () { 2483 var elem = document.activeElement; 2484 if (elem && elem.tagName == "IFRAME" && elem.id == "googleMapEmbed") { 2485 gtag('event', 'iFrame Click', { 2486 'event_category': analyticsCategory, 2487 'event_label': "GoogleDirectionsTemplate6" 2488 }); 2489 clearInterval(monitor); 2490 } 2491 }, 1000); 2492 });
2493 2494 var servicesRendered = false; 2495 var aboutRendered = false; 2496 var testimonialsRendered = false; 2497 var contactRendered = false; 2498 var photosRendered = false; 2499 var locationsRendered = false; 2500 var gsvRendered = false; 2501 var faqRendered = false; 2502 var contentRendered = false; 2503 2504 function DisplayPage(page) { 2505 2506 PauseVideoPlayer(); 2507 2508 if (!$(page).hasClass("show")) { 2509 $("#pages div.collapse.show").collapse("hide"); 2510 } 2511 $(page).collapse("show"); 2512 2513 if(page == "#homePage") 2514 { 2515 var carousel = $(".slick-slider"); 2516 if(carousel != null) 2517 { 2518 carousel.slick('refresh'); 2519 } 2520 } 2521 2522 if (page == "#testimonialsPage") { 2523 // Load Testimonials via Ajax if not already loaded 2524 if (!testimonialsRendered) { 2525 ShowLoading(); 2526 $.get('/Home/GetTestimonialsContent', {id: 25532, template: "Template_6"}, function (data) { 2527 if (data != "") 2528 { 2529 $("#testimonialsPage").append(data); 2530 } 2531 }).always(function() { 2532 HideLoading(); 2533 testimonialsRendered = true; 2534 GetReviewData(0); 2535 }); 2536 } 2537 2538 $("html, body").animate({ scrollTop: 0 }, "fast"); 2539 } 2540 2541 if (page == "#aboutPage") { 2542 // Load About via Ajax if not already loaded 2543 if (!aboutRendered) { 2544 ShowLoading(); 2545 $.get('/Home/GetAboutContent', { id: 25532, template: "Template_6"}, function (data) { 2546 if (data != "") 2547 { 2548 $("#aboutPage").append(data); 2549 $.getScript("https://maps.googleapis.com/maps/api/js?key=AIzaSyB2UoPWVWPR8WrIFK_zqJ5nTN1NvGm9dqY&callback=initMap"); 2550 } 2551 }).always(function() { 2552 HideLoading(); 2553 aboutRendered = true; 2554 }); 2555 } 2556 } 2557 2558 if (page == "#servicesPage") { 2559 // Load Services via Ajax if not already loaded 2560 if (!servicesRendered) { 2561 ShowLoading(); 2562 $.get('/Home/GetServicesContent', { id: 25532, template: "Template_6"}, function (data) { 2563 if (data != "") 2564 { 2565 $("#servicesPage").append(data); 2566 } 2567 }).always(function() { 2568 HideLoading(); 2569 servicesRendered = true; 2570 }); 2571 } 2572 } 2573 2574 if (page == "#imageryPage") { 2575 // Load photos via Ajax if not already loaded 2576 if (!photosRendered) { 2577 ShowLoading(); 2578 $.get('/Home/GetPhotosContent', { id: 25532, template: "Template_6"}, function (data) { 2579 if (data != "") 2580 { 2581 $("#imageryPage").append(data); 2582 } 2583 }).always(function() { 2584 HideLoading(); 2585 photosRendered = true; 2586 }); 2587 } 2588 } 2589 2590 if (page == "#contactPage") { 2591 // Load Contact via Ajax if not already loaded 2592 if (!contactRendered) { 2593 ShowLoading(); 2594 $.get('/Home/GetContactContent', { id: 25532, template: "Template_6"}, function (data) { 2595 if (data != "") 2596 { 2597 $("#contactPage").append(data); 2598 } 2599 }).always(function() { 2600 HideLoading(); 2601 contactRendered = true; 2602 }); 2603 } 2604 } 2605 2606 if (page == "#locationsPage") { 2607 // Load Locations via Ajax if not already loaded 2608 if (!locationsRendered) { 2609 ShowLoading(); 2610 2611 $.get('/Home/GetLocationsContent', { id: 25532, template: "Template_6" }, function (data) { 2612 if (data != "") 2613 { 2614 $("#locationsPage").append(data); 2615 } 2616 }).always(function() { 2617 HideLoading(); 2618 locationsRendered = true; 2619 }); 2620 } 2621 } 2622 2623 if (page == "#gsvPage") { 2624 // Load GSV via Ajax if not already loaded 2625 if (!gsvRendered) { 2626 ShowLoading(); 2627 $.get('/Home/Get360TourContent', { id: 25532, template: "Template_6"}, function (data) { 2628 if (data != "") 2629 { 2630 $("#gsvPage").append(data); 2631 } 2632 }).always(function() { 2633 HideLoading(); 2634 gsvRendered = true; 2635 }); 2636 } 2637 } 2638 2639 if (page == "#faqPage") { 2640 // Load Faqs via Ajax if not already loaded 2641 if (!faqRendered) { 2642 ShowLoading(); 2643 2644 $.get('/Home/GetFAQContent', { id: 25532, template: "Template_6" }, function (data) { 2645 if (data != "") { 2646 $("#faqPage").append(data); 2647 } 2648 }).always(function () { 2649 HideLoading(); 2650 faqRendered = true; 2651 }); 2652 } 2653 } 2654 2655 if (page == "#contentPage") { 2656 if (!contentRendered) { 2657 ShowLoading(); 2658 2659 $.get('/Home/GetAdditionalContentContent', { id: 25532, template: "Template_6" }, function (data) { 2660 if (data != "") { 2661 $("#contentPage").append(data); 2662 } 2663 }).always(function () { 2664 HideLoading(); 2665 contentRendered = true; 2666 }); 2667 } 2668 } 2669 } 2670 2671 function nextReview() { 2672 ScrollForReviews(); 2673 GetReviewData(1); 2674 } 2675 2676 function prevReview() { 2677 ScrollForReviews(); 2678 GetReviewData(-1); 2679 } 2680 2681 function GetReviewData(i) 2682 { 2683 if(i != 0){ 2684 ShowLoading(); 2685 } 2686 pageIndex = pageIndex + i; 2687 $.get('/Home/GetEnhancedTestimonialReviewInfo', {id: 25532, pageIndex: pageIndex, pageSize: pageSize, notReputation: notReputation, file: '_TemplateReviewContent'}, function (data) { 2688 if (data != "") 2689 { 2690 $(".reviewInfo").html(data); 2691 } 2692 }).always(function() { 2693 HideLoading(); 2694 }); 2695 SetPaginationButtons(); 2696 } 2697 2698 function GetPostsData(i) 2699 { 2700 if(i != 0){ 2701 ShowLoading(); 2702 } 2703 postsPageIndex = postsPageIndex + i; 2704 $.get('/Home/GetTestimonialPostsInfo', {id: 25532, program_id: 17, profileDomain: 'https://treasuresjewelryky.com/', subdomain: 'treasuresjewelryky', testimonialSSL : 'False', domainSSL : 'True', pageIndex: postsPageIndex, pageSize: pageSize, file: '_TestimonialPostsContent'}, function (data) { 2705 if (data != "") 2706 { 2707 $(".postsInfo").html(data); 2708 } 2709 }).always(function() { 2710 HideLoading(); 2711 }); 2712 SetPostsPaginationButtons(); 2713 } 2714 2715 function GetPostsBanner() 2716 { 2717 ShowLoading(); 2718 var bannerObj = null; 2719 $.ajax({
2720 method: "POST", 2721 url: "/Home/GetPostBanner", 2722 data:JSON.stringify( 2723 { 2724 banner: bannerObj, 2725 testimonialPageColor: (false) ? 'transparent' :'#046D7A', 2726 postsColor: '#046D7A' 2727 }), 2728 contentType: 'application/json', 2729 success: function (data) { 2730 if(isMobile || isTablet){ 2731 setTimeout(function(){ 2732 $(".home-content").prepend(data); 2733 }, 5000); 2734 } 2735 else{ 2736 $(".home-content").prepend(data); 2737 } 2738 2739 //remove banner after 30 seconds regardless of mobile/tablet/desktop 2740 if (!keepPostUp) { 2741 setTimeout(function () { 2742 $("#posts-banner-alert").remove(); 2743 }, 30000); 2744 } 2745 } 2746 }).always(function() { 2747 HideLoading(); 2748 }); 2749 } 2750 2751 function SetPaginationButtons() 2752 { 2753 //look ahead by one 2754 if(((pageIndex + 1) * pageSize) >= numOfReviews){ 2755 $("#nextReview").hide(); 2756 } 2757 else{ 2758 $("#nextReview").show(); 2759 $("#nextReview").prop('disabled', false); 2760 } 2761 2762 if(pageIndex <= 0) { 2763 pageIndex = 0; 2764 $("#prevReview").hide(); 2765 } 2766 else if (pageIndex > 0){ 2767 $("#prevReview").show(); 2768 $("#prevReview").prop('disabled', false); 2769 } 2770 } 2771 2772 function SetPostsPaginationButtons() 2773 { 2774 //look ahead by one 2775 if(((postsPageIndex + 1) * pageSize) >= numOfPosts){ 2776 $("#nextPosts").hide(); 2777 } 2778 else{ 2779 $("#nextPosts").show(); 2780 $("#nextPosts").prop('disabled', false); 2781 } 2782 2783 if(postsPageIndex <= 0) { 2784 postsPageIndex = 0; 2785 $("#prevPosts").hide(); 2786 } 2787 else if (postsPageIndex > 0){ 2788 $("#prevPosts").show(); 2789 $("#prevPosts").prop('disabled', false); 2790 } 2791 } 2792 2793 function ShowLoading() 2794 { 2795 $("#loadingImg").show(); 2796 } 2797 2798 function HideLoading() 2799 { 2800 $("#loadingImg").hide(); 2801 } 2802 2803 function checkMobile() { 2804 var windowsize = $(window).width(); 2805 switch (true) { 2806 case /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent): 2807 isMobile = true; 2808 break; 2809 case windowsize < 800: 2810 isMobile = true; 2811 break; 2812 default: 2813 isMobile = false; 2814 } 2815 } 2816 2817 function checkTablet() { 2818 var windowsize = $(window).width(); 2819 switch (true) { 2820 case (windowsize >= 800) && (windowsize < 1200): 2821 isTablet = true; 2822 break; 2823 default: 2824 isTablet = false; 2825 } 2826 } 2827 2828 function DisplayPhoto(imageUrl){ 2829 bootbox.alert({ 2830 message:'<img class="img-fluid d-block mx-auto" src="' + imageUrl + '" />', 2831 size: "large", 2832 backdrop: true, 2833 buttons: { 2834 ok: { 2835 className: 'btn-outline-dark', 2836 label: 'Close' 2837 } 2838 } 2839 }); 2840 } 2841 2842 function DisplayPhotoSlider(index){ 2843 if(!$(".slider-imagery").hasClass("slick-initialized")) 2844 { 2845 $('.slider-imagery').slick({ 2846 slidesToShow: 1, 2847 slidesToScroll: 1, 2848 arrows: true, 2849 fade: false, 2850 adaptiveHeight: false, 2851 infinite: true, 2852 useTransform: true, 2853 speed: 400, 2854 cssEase: 'cubic-bezier(0.77, 0, 0.18, 1)', 2855 autoplay: true, 2856 }); 2857 } 2858 2859 $(".slider-imagery").slick('slickGoTo', index); 2860 2861 $("#carouselImageryPhotoModal").modal('show'); 2862 } 2863
2864 function DisplayVideoSlider(index) { 2865 2866 if(!$(".slider-video").hasClass("slick-initialized")) 2867 { 2868 $('.slider-video').slick({ 2869 slidesToShow: 1, 2870 slidesToScroll: 1, 2871 arrows: true, 2872 fade: false, 2873 adaptiveHeight: false, 2874 infinite: true, 2875 useTransform: true, 2876 speed: 400, 2877 cssEase: 'cubic-bezier(0.77, 0, 0.18, 1)', 2878 }); 2879 } 2880 2881 PauseVideoPlayer(); 2882 2883 //arrow onclick tracker 2884 var el = document.querySelectorAll(".slick-arrow"); 2885 for (var i = 0; i < el.length; i++) { 2886 el[i].onclick = function () { 2887 PauseVideoPlayer(); 2888 }; 2889 } 2890 2891 2892 $(".slider-video").slick('slickGoTo', index); 2893 2894 $("#carouselImageryVideoModal").modal('show'); 2895 } 2896 2897 function PauseVideoPlayer() { 2898 2899 var videos = document.querySelectorAll('video'); 2900 var iframes = document.querySelectorAll('iframe'); 2901 2902 //mp4 2903 Array.prototype.forEach.call(videos, video => { 2904 video.pause(); 2905 }); 2906 2907 //youtube 2908 Array.prototype.forEach.call(iframes, iframe => { 2909 iframe.contentWindow.postMessage(JSON.stringify({ 2910 event: 'command', 2911 func: 'pauseVideo' 2912 }), '*'); 2913 }); 2914 2915 //wistia + vimeo 2916 Array.prototype.forEach.call(iframes, iframe => { 2917 iframe.contentWindow.postMessage(JSON.stringify({ 2918 "method": "pause", 2919 "value": "true" 2920 }), '*'); 2921 }); 2922 } 2923 2924 function setFooterColor(hexColor) 2925 { 2926 //set footer text color based on background color 2927 var r = parseInt(hexColor.substr(1,2),16); 2928 var g = parseInt(hexColor.substr(3,2),16); 2929 var b = parseInt(hexColor.substr(5,2),16); 2930 var rgb = ((r*299)+(g*587)+(b*114))/1000; 2931 2932 var textColor = (rgb >= 128) ? 'black' : 'white'; 2933 //text needs to be black 2934 if(textColor == 'black') 2935 { 2936 //set payment method icons 2937 if ($('.paymentType').hasClass('light')) { 2938 $('.paymentType').removeClass('light'); 2939 $('.paymentType').remove('#paymentTypeLight'); 2940 } 2941 if (!$('.paymentType').hasClass('dark')) { 2942 $('.paymentType').addClass('dark'); 2943 $('.paymentType').remove('#paymentTypeLight'); 2944 $('.paymentType').add('#paymentTypeDark'); 2945 } 2946 } 2947 //text needs to be white 2948 else if(textColor == 'white') 2949 { 2950 //mobile menu hamburger 2951 if ($('.navbar-toggler').hasClass('dark')) { 2952 $('.navbar-toggler').css('background-color', 'transparent'); 2953 } 2954 if (!$('.navbar-toggler').hasClass('light')) { 2955 $('.navbar-toggler').css('background-color', 'white'); 2956 } 2957 2958 //set payment method icons 2959 if ($('.paymentType').hasClass('dark')) { 2960 $('.paymentType').removeClass('dark'); 2961 $('.paymentType').remove('#paymentTypeDark'); 2962 } 2963 if (!$('.paymentType').hasClass('light')) { 2964 $('.paymentType').addClass('light'); 2965 $('.paymentType').remove('#paymentTypeDark'); 2966 $('.paymentType').add('#paymentTypeLight'); 2967 } 2968 } 2969 } 2970 2971 function checkHashRoute() 2972 { 2973 if ((location.hash != null) && (location.hash != "") && (location.hash == '#homePage' || location.hash == '#aboutPage' || location.hash == '#servicesPage' || location.hash == '#testimonialsPage' || location.hash == '#contactPage' || location.hash == '#locationsPage' || location.hash == '#faqPage' || location.hash == '#gsvPage' || location.hash == '#contentPage') ) { 2974 DisplayPage(location.hash); 2975 } 2976 } 2977 2978 function contactUsPost(event) { 2979 var _contactForm = $("#ContactPostForm"); 2980 2981 // Clear previous validation states 2982 $('.validation-error-message').remove(); 2983 _contactForm.find('.validation-error').removeClass('validation-error'); 2984 $("#contactResponseMessage").empty(); 2985 2986 if (_contactForm[0].checkValidity()) { 2987 contactUsSubmit(event); 2988 } else { 2989 var firstInvalidField = null; 2990 2991 _contactForm.find('input[required], textarea[required], select[required]').each(function () { 2992 var $field = $(this); 2993 2994 if (!this.checkValidity()) { 2995 var fieldId = $field.attr('id') || $field.attr('name'); 2996 var fieldLabel = getFieldLabel(fieldId); 2997 2998 $field.addClass('validation-error'); 2999 3000 var errorMessage = getCustomErrorMessage($field, fieldLabel); 3001 $field.after(`<div class="validation-error-message">${errorMessage}</div>`); 3002 3003 if (!firstInvalidField) { 3004 firstInvalidField = $field; 3005 } 3006 } 3007 }); 3008 3009 // Focus first invalid field 3010 if (firstInvalidField) { 3011 firstInvalidField.focus(); 3012 } 3013 3014 // Re-enable submit button 3015 $("#btnContactPost").prop('disabled', false); 3016 $("#btnContactPost").css('font-weight', 'bold'); 3017 } 3018 } 3019 3020 function getFieldLabel(fieldId) { 3021 var labels = { 3022 'contact_us_phone': 'Phone Number', 3023 'contact_us_address': 'Address', 3024 'contact_us_city': 'City', 3025 'contact_us_state': 'State', 3026 'contact_us_zip': 'ZIP Code', 3027 'contact_us_subject': 'Subject', 3028 'contact_us_name': 'Name', 3029 'contact_us_email': 'Email', 3030 'contact_us_message': 'Message' 3031 }; 3032 return labels[fieldId] || 'This field'; 3033 } 3034 3035 function getCustomErrorMessage($field, fieldLabel) { 3036 if ($field.prop('required') && !$field.val().trim()) { 3037 return `${fieldLabel} required`; 3038 } 3039 3040 if ($field.attr('type') === 'email' && $field.val()) { 3041 return `Please enter a valid email address.`; 3042 } 3043 3044 return `Please enter a valid ${fieldLabel.toLowerCase()}.`; 3045 } 3046 3047 function contactUsSubmit(event) { 3048 event.preventDefault(); 3049 3050 var form = $("#ContactPostForm"); 3051 grecaptcha.ready(function() { 3052 grecaptcha.execute('6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH', {action: 'contact_us'}).then(function(token) { 3053 $("#g-Recaptcha-Response-Contact").attr("value", token); //add token for server side validation 3054 $.ajax({
3055 type: "POST", 3056 url: "/Home/ContactPost", 3057 data: form.serialize(), 3058 success: function(data){ 3059 if (data.indexOf('{"message":') != -1) { 3060 var jsonData = JSON.parse(data); 3061 if (!jsonData.success) { 3062 $("#contactResponseMessage").html('<div class="alert alert-warning alert-dissmisable" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>' + jsonData.message + '</div>'); 3063 recaptchaContactUsInComplete(); 3064 showClassicCaptcha("contact"); 3065 } 3066 else{ 3067 $("#contactResponseMessage").html('<div class="alert alert-success alert-dissmisable" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>' + jsonData.message + '</div>'); 3068 recaptchaContactUsComplete(); 3069 } 3070 } 3071 } 3072 }); 3073 }); 3074 }); 3075 } 3076 3077 function bgSlider() { 3078 var index = 0; 3079 var opacity = 'False'; 3080 3081 $imageEls = $('.parallax .parallax-image'); // Get the images to be cycled. 3082 3083 setInterval(function () { 3084 // Get the next index. If at end, restart to the beginning. 3085 index = index + 1 < $imageEls.length ? index + 1 : 0; 3086 3087 // Show the next 3088 if (opacity == 'True') { 3089 $imageEls.eq(index).addClass('opacity'); 3090 } 3091 else { 3092 $imageEls.eq(index).addClass('show'); 3093 } 3094 3095 // Hide the previous 3096 if (opacity == 'True') { 3097 $imageEls.eq(index - 1).removeClass('opacity'); 3098 } 3099 else { 3100 $imageEls.eq(index - 1).removeClass('show'); 3101 } 3102 }, 5000); 3103 } 3104 3105 function initializeCarousel(){ 3106 //https://codepen.io/dolce/pen/QarQde 3107 $('.slider-single').slick({ 3108 slidesToShow: 1, 3109 slidesToScroll: 1, 3110 arrows: true, 3111 fade: false, 3112 adaptiveHeight: false, 3113 infinite: true, 3114 useTransform: true, 3115 speed: 400, 3116 cssEase: 'cubic-bezier(0.77, 0, 0.18, 1)', 3117 autoplay: true, 3118 }); 3119 3120 $('.slider-nav') 3121 .on('init', function(event, slick) { 3122 $('.slider-nav .slick-slide.slick-current').addClass('is-active'); 3123 }) 3124 .slick({ 3125 slidesToShow: 5, 3126 slidesToScroll: 5, 3127 dots: false, 3128 focusOnSelect: false, 3129 infinite: true, 3130 }); 3131 3132 $('.slider-attributes') 3133 .on('init', function(event, slick) { 3134 $('.slider-attributes .slick-slide.slick-current').addClass('is-active'); 3135 }) 3136 .slick({ 3137 slidesToShow: 3, 3138 slidesToScroll: 3, 3139 dots: false, 3140 focusOnSelect: false, 3141 infinite: true 3142 }); 3143 3144 $('.slider-single').on('afterChange', function(event, slick, currentSlide) { 3145 $('.slider-nav').slick('slickGoTo', currentSlide); 3146 var currrentNavSlideElem = '.slider-nav .slick-slide[data-slick-index="' + currentSlide + '"]'; 3147 $('.slider-nav .slick-slide.is-active').removeClass('is-active'); 3148 $(currrentNavSlideElem).addClass('is-active'); 3149 3150 if (currentSlide > 6) { 3151 var m = parseInt(currentSlide / 6); 3152 var d = 6 * m; 3153 var currentAttributeSlide = currentSlide - d; 3154 } 3155 else if (currentSlide >= 3 && currentSlide <= 6) 3156 { 3157 var m = parseInt(currentSlide / 3); 3158 var d = 3 * m; 3159 var currentAttributeSlide = currentSlide - d; 3160 } 3161 else { 3162 currentAttributeSlide = currentSlide; 3163 } 3164 3165 if (6 > 3) { 3166 $('.slider-attributes').slick('slickGoTo', currentAttributeSlide); 3167 var currrentNavAttributeSlideElem = '.slider-attributes .slick-slide[data-slick-index="' + currentAttributeSlide + '"]'; 3168 $('.slider-attributes .slick-slide.is-active').removeClass('is-active'); 3169 $(currrentNavAttributeSlideElem).addClass('is-active'); 3170 } 3171 }); 3172 3173 $('.slider-nav').on('click', '.slick-slide', function(event) { 3174 event.preventDefault(); 3175 var goToSingleSlide = $(this).data('slick-index'); 3176 $('.slider-single').slick('slickGoTo', goToSingleSlide); 3177 }); 3178 3179 $('.slider-attributes').on('click', '.slick-slide', function(event) { 3180 event.preventDefault(); 3181 var goToSingleSlide = $(this).data('slick-index'); 3182 $('.slider-single').slick('slickGoTo', goToSingleSlide); 3183 }); 3184 } 3185 3186 function ScrollForReviews(){ 3187 // target element 3188 var $id = $(".review-partial-content"); 3189 if ($id.length === 0) { 3190 return; 3191 } 3192 3193 // prevent standard hash navigation (avoid blinking in IE) 3194 //e.preventDefault(); 3195 3196 // top position relative to the document 3197 var pos = $id.offset().top - $('.navbar').height(); 3198 3199 // animated top scrolling 3200 // .stop() keeps from scrolling to top then to element 3201 $('body, html').stop().animate({ scrollTop: pos }, 500); 3202 } 3203 3204 function ScrollForPosts(e){ 3205 // target element 3206 var $id = $(".posts-partial-content"); 3207 if ($id.length === 0) { 3208 return; 3209 } 3210 3211 // prevent standard hash navigation (avoid blinking in IE) 3212 e.preventDefault(); 3213 3214 // top position relative to the document 3215 var pos = $id.offset().top - $('.navbar').height(); 3216 3217 // animated top scrolling 3218 // .stop() keeps from scrolling to top then to element 3219 $('body, html').stop().animate({ scrollTop: pos }, 500); 3220 } 3221 3222 function recaptchaContactUsInComplete(){ 3223 $("#btnContactPost").prop('disabled', false); 3224 $("#btnContactPost").css('font-weight', 'bold'); 3225 } 3226 3227 function recaptchaContactUsComplete() { 3228 $("#btnContactPost").prop('disabled', false); 3229 $("#btnContactPost").css('font-weight', 'normal'); 3230 $("#ContactPostForm").trigger("reset"); 3231 } 3232 3233 function recaptchaReviewIncomplete(){ 3234 $("#postReview").prop('disabled', false); 3235 $("#postReview").css('font-weight', 'bold'); 3236 } 3237 3238 function recaptchaReviewComplete(){ 3239 $("#postReview").css('font-weight', 'normal'); 3240 $("#postReviewForm").trigger("reset"); 3241 $("#postReview").prop('disabled', false); 3242 } 3243 3244 function showClassicCaptcha(type) { 3245 if(type === "review"){ 3246 $("#classicCaptchaReview").show(); 3247 } 3248 else{ 3249 $("#classicCaptcha").show(); 3250 } 3251 } 3252 3253 function ClearReviewFields() { 3254 $('#starRating').barrating('clear'); 3255 $("#review").val(""); 3256 $("#review_alias").val(""); 3257 $("#review_heading").val(""); 3258 $("#reviewCaptcha").val(""); 3259 } 3260 3261 function resetReviewButton($button) { 3262 var $buttonText = $button.find('.button-text'); 3263 var $spinner = $button.find('.spinner'); 3264 3265 $button.prop('disabled', false); 3266 3267 if ($buttonText.length && $spinner.length) { 3268 $buttonText.show(); 3269 $spinner.hide(); 3270 } else { 3271 var originalText = $button.data('original-text'); 3272 if (originalText) { 3273 $button.html(originalText); 3274 } 3275 } 3276 } 3277 3278 function setProcessingState($button, $form, isProcessing) { 3279 var $buttonText = $button.find('.button-text'); 3280 var $spinner = $button.find('.spinner'); 3281 3282 if (isProcessing) { 3283 $button.prop('disabled', true); 3284 $form.addClass('review-form-processing'); 3285 $form.find('input, textarea, select').not('#profile_id, #g-Recaptcha-Response-Review, [type="hidden"]').prop('disabled', true); 3286 3287 if ($buttonText.length && $spinner.length) { 3288 $buttonText.hide(); 3289 $spinner.show(); 3290 } else { 3291 $button.data('original-text', $button.html()); 3292 $button.html('<i class="fas fa-spinner fa-spin"></i> Processing...'); 3293 } 3294 } else { 3295 $button.prop('disabled', false); 3296 $form.removeClass('review-form-processing'); 3297 $form.find('input, textarea, select').prop('disabled', false); 3298 3299 if ($buttonText.length && $spinner.length) { 3300 $buttonText.show(); 3301 $spinner.hide(); 3302 } else { 3303 var originalText = $button.data('original-text'); 3304 if (originalText) { 3305 $button.html(originalText); 3306 } 3307 } 3308 } 3309 } 3310 3311 function ClearReviewFields() { 3312 console.log('Clearing review fields'); 3313 $('#starRating').barrating('clear'); 3314 $("#review").val(""); 3315 $("#review_alias").val(""); 3316 $("#review_heading").val(""); 3317 $("#reviewCaptcha").val(""); 3318 3319 $("#postReviewForm input, #postReviewForm textarea").removeClass('error'); 3320 $("#postReviewForm .br-widget").removeClass('error'); 3321 } 3322 3323 function validateReview(btn) { 3324 var $form = $("#postReviewForm"); 3325 var isValid = true; 3326 3327 console.log('Starting validation...'); 3328 3329 $form.find('input, textarea').removeClass('error'); 3330 $form.find('.br-widget').removeClass('error'); 3331 3332 var reviewText = $('#review').val(); 3333 console.log('Review text length:', reviewText ? reviewText.trim().length : 0); 3334 3335 if (!reviewText || reviewText.trim().length === 0) { 3336 console.log('Review text validation failed - empty or whitespace only'); 3337 $('#review').addClass('error'); 3338 $('#review').focus(); 3339 isValid = false; 3340 } else { 3341 console.log('Review text validation passed'); 3342 } 3343 3344 var rating = null; 3345 var selectRating = $('#starRating')[0] ? $('#starRating')[0].value : null; 3346 var jqueryRating = $('#starRating').val(); 3347 var selectedOption = $('#starRating option:selected').val(); 3348 var barRating = null; 3349 3350 if (typeof $('#starRating').barrating === 'function') { 3351 try { 3352 var barResult = $('#starRating').barrating('show'); 3353 if (barResult && typeof barResult === 'string') { 3354 barRating = barResult; 3355 } else if (barResult && typeof barResult === 'number') { 3356 barRating = barResult.toString(); 3357 } 3358 } catch (e) { 3359 console.log('Error getting barrating value:', e); 3360 } 3361 } 3362 3363 if (jqueryRating && typeof jqueryRating === 'string') { 3364 } else if (jqueryRating && typeof jqueryRating === 'number') { 3365 jqueryRating = jqueryRating.toString(); 3366 } else { 3367 jqueryRating = null; 3368 } 3369 3370 if (barRating && barRating !== "" && barRating !== "0") { 3371 rating = barRating; 3372 } else if (selectRating && selectRating !== "" && selectRating !== "0") { 3373 rating = selectRating; 3374 } else if (selectedOption && selectedOption !== "" && selectedOption !== "0") { 3375 rating = selectedOption; 3376 } else if (jqueryRating && jqueryRating !== "" && jqueryRating !== "0") { 3377 rating = jqueryRating; 3378 } 3379 3380 if (rating && typeof rating !== 'string') { 3381 console.log('WARNING: Rating is not a string, converting:', rating, typeof rating);
3382 rating = String(rating); 3383 } 3384 3385 if (rating && typeof rating === 'object') { 3386 console.error('CRITICAL ERROR: Rating is still an object!', rating); 3387 rating = null; 3388 } 3389 3390 console.log('Validation - Final rating value:', rating, typeof rating); 3391 3392 if (!rating || rating === "" || rating === "0") { 3393 console.log('Rating validation failed'); 3394 $('.br-widget').addClass('error'); 3395 isValid = false; 3396 } else { 3397 console.log('Rating validation passed with value:', rating); 3398 } 3399 3400 console.log('Validation result:', isValid); 3401 return isValid; 3402 } 3403 3404 function validateReviewLength() { 3405 var text = $('#review').val(); 3406 var success = true; 3407 3408 if (text.trim().length == 0) { 3409 $('#review').addClass('error'); 3410 success = false; 3411 } 3412 return success; 3413 } 3414 3415 function validateRating() { 3416 var rating = null; 3417 3418 // Use the same rating detection logic 3419 var selectRating = $('#starRating')[0] ? $('#starRating')[0].value : null; 3420 var jqueryRating = $('#starRating').val(); 3421 var selectedOption = $('#starRating option:selected').val(); 3422 var barRating = null; 3423 3424 if (typeof $('#starRating').barrating === 'function') { 3425 try { 3426 barRating = $('#starRating').barrating('show'); 3427 } catch (e) { 3428 console.log('Error getting barrating value in validateRating:', e); 3429 } 3430 } 3431 3432 // Determine which rating to use 3433 if (barRating && barRating !== "" && barRating !== "0") { 3434 rating = barRating; 3435 } else if (selectRating && selectRating !== "" && selectRating !== "0") { 3436 rating = selectRating; 3437 } else if (selectedOption && selectedOption !== "" && selectedOption !== "0") { 3438 rating = selectedOption; 3439 } else if (typeof jqueryRating === 'string' && jqueryRating !== "" && jqueryRating !== "0") { 3440 rating = jqueryRating; 3441 } 3442 3443 var success = true; 3444 if (!rating || rating === "" || rating === "0") { 3445 $('.br-widget').addClass('error'); 3446 success = false; 3447 } 3448 return success; 3449 } 3450</script>
3450 3451</body> 3452</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.