Help
RSS
API
Feed
Maltego
Contact
Domain > www.fullmerlock.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2018-10-30
34.206.202.199
(
ClassC
)
2026-02-01
207.210.115.100
(
ClassC
)
Port 443
HTTP/1.1 200 OKcache-control: privatecontent-type: text/html; charsetutf-8server: Microsoft-IIS/10.0x-stackifyid: V2|392b5da4-74a8-4f28-9c27-f0d103d890bf|C80996|CD6x-aspnetmvc-version: 5.2x-aspnet-version: 4.0.30319x-powered-by: ASP.NETdate: Sun, 01 Feb 2026 05:19:05 GMTcontent-length: 147906 !DOCTYPE html>html>head> meta charsetutf-8 /> meta nameviewport contentwidthdevice-width, initial-scale1.0, viewport-fitcover, maximum-scale1.0 /> meta nameformat-detection contenttelephoneno /> meta propertyog:locale contenten_US /> meta propertyog:type contentwebsite /> meta propertyog:title contentFullmer Locksmith Service Inc - North Riverside, IL /> meta propertyog:url contenthttps://fullmerlock.com/ /> meta propertyog:image contenthttps://du9m0k402rjmo.cloudfront.net/images/P_27219/f7c99ec8-8ed0-4f84-aaf1-29acda83ccfd.jpg /> meta propertyog:description contentFullmer Locksmith Service Inc, located in North Riverside, IL, has been a trusted locksmith and lock supplier for the Forest Park, LaGrange, and Brookfield areas since 1960. As a family-owned and operated business for over 60 years, we pride ourselves on providing fast, friendly, and reliable service. Our expertise includes master key systems, panic devices, and high-security locks, featuring trusted brands such as Schlage, Corbin Russwin, and Falcon. Contact Fullmer Locksmith Service Inc for all your lock and security needs. /> meta namedescription contentFullmer Locksmith Service Inc, located in North Riverside, IL, has been a trusted locksmith and lock supplier for the Forest Park, LaGrange, and Brookfield areas since 1960. As a family-owned and operated business for over 60 years, we pride ourselves on providing fast, friendly, and reliable service. Our expertise includes master key systems, panic devices, and high-security locks, featuring trusted brands such as Schlage, Corbin Russwin, and Falcon. Contact Fullmer Locksmith Service Inc for all your lock and security needs. /> meta nametitle contentFullmer Locksmith Service Inc - North Riverside IL /> meta namekeywords contentLock Installation,Keyless Entry,Locksmith,Commercial Installation,Residential Installation,Industrial Installation,Lock Repair,Re Keys,Key & Lock Replacement,key /> title>Fullmer Locksmith Service Inc - North Riverside, IL/title> script src/Scripts/Profile/googleAnalytics.js typetext/javascript>/script> script typetext/javascript srchttps://www.google.com/recaptcha/api.js async defer>/script> script srchttps://code.jquery.com/jquery-3.3.1.min.js integritysha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8 crossoriginanonymous>/script> script>window.jQuery || document.write(script src/scripts/templates/jquery-3.3.1.min.js>\/script>)/script> script srchttps://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js integritysha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49 crossoriginanonymous>/script> script>if (typeof (Popper) undefined) { document.write(script src/scripts/templates/popper.min.js>\/script>) }/script> link relstylesheet hrefhttps://use.fontawesome.com/releases/v5.1.0/css/all.css integritysha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt crossoriginanonymous> link relstylesheet hrefhttps://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css integritysha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B crossoriginanonymous> script srchttps://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js integritysha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em crossoriginanonymous>/script> script>if (typeof ($.fn.modal) undefined) { document.write(script src/scripts/templates/bootstrap.min.js>\/script>) }/script> script src/Scripts/Templates/googleMaps.js typetext/javascript>/script> link href/Content/Templates/custom-bootstrap.css typetext/css relstylesheet /> script src/Scripts/bootbox.min.js typetext/javascript>/script> script src/Scripts/Profile/jquery.barrating.1.1.4.js typetext/javascript>/script> script src/Scripts/Templates/cleave.min.js typetext/javascript>/script> script src/Scripts/Templates/cleave-phone.us.js typetext/javascript>/script> script src/Scripts/Templates/slick.min.js typetext/javascript>/script> link href/Content/Templates/slick.css typetext/css relstylesheet /> link href/Content/Templates/slick-theme.css typetext/css relstylesheet /> script src/Scripts/Templates/googleMapsMultiLocation.js typetext/javascript>/script> script srchttps://www.google.com/recaptcha/api.js?render6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH typetext/javascript>/script> script srchttps://player.vimeo.com/api/player.js typetext/javascript>/script> link href/Content/Templates/chatbot.css typetext/css relstylesheet /> meta nameviewport contentwidthdevice-width, user-scalableyes,initial-scale1, maximum-scale2 /> meta http-equivContent-Type contenttext/html;charsetutf-8 /> style> :root { --text_color: 255, 255, 255, 1; --text_color_rgba: rgba(var(--text_color)); --customer_color: #0568A9; --post_text_color: 0, 0, 0, 1; --post_text_color_rgba: rgba(var(--post_text_color)); } /style> link href/Content/Templates/template_6.css typetext/css relstylesheet /> link relcanonical hrefhttps://fullmerlock.com/>script typeapplication/ld+json>{ @context: https://schema.org, @graph: { @type: LocalBusiness, @id: https://fullmerlock.com/#localbusiness, name: Fullmer Locksmith Service Inc, url: https://fullmerlock.com/, description: Fullmer Locksmith Service Inc, located in North Riverside, IL, has been a trusted locksmith and lock supplier for the Forest Park, LaGrange, and Brookfield areas since 1960. As a family-owned and operated business for over 60 years, we pride ourselves on providing fast, friendly, and reliable service. Our expertise includes master key systems, panic devices, and high-security locks, featuring trusted brands such as Schlage, Corbin Russwin, and Falcon. Contact Fullmer Locksmith Service Inc for all your lock and security needs., image: https://du9m0k402rjmo.cloudfront.net/images/P_27219/f7c99ec8-8ed0-4f84-aaf1-29acda83ccfd.jpg, logo: https://du9m0k402rjmo.cloudfront.net/images/P_27219/f7c99ec8-8ed0-4f84-aaf1-29acda83ccfd.jpg, address: { @type: PostalAddress, streetAddress: 8611 W Cermak Rd, addressLocality: North Riverside, addressRegion: IL, postalCode: 60546, addressCountry: US }, telephone: (708) 442-0300, email: fullmerlocksmith@sbcglobal.net, openingHoursSpecification: { @type: OpeningHoursSpecification, dayOfWeek: Monday, opens: 08:00, closes: 17:00 }, { @type: OpeningHoursSpecification, dayOfWeek: Tuesday, opens: 08:00, closes: 17:00 }, { @type: OpeningHoursSpecification, dayOfWeek: Wednesday, opens: 08:00, closes: 17:00 }, { @type: OpeningHoursSpecification, dayOfWeek: Thursday, opens: 08:00, closes: 17:00 }, { @type: OpeningHoursSpecification, dayOfWeek: Friday, opens: 08:00, closes: 17:00 } , paymentAccepted: Visa, MasterCard, American Express, Discover, Debit Cards, sameAs: https://www.google.com/maps/place/Fullmer+Locksmith+Service,+Inc./@41.8495242,-87.8383849,17z/data!3m1!4b1!4m5!3m4!1s0x880e35977cb30067:0xa68ed85ddb7c6115!8m2!3d41.8495242!4d-87.8383849, https://www.yelp.com/biz/fullmer-locksmith-service-north-riverside-2, https://www.facebook.com/Fullmer-Locksmith-Service-Inc-101737761984637/ }, { @type: WebSite, @id: https://fullmerlock.com/#website, url: https://fullmerlock.com/, name: Fullmer Locksmith Service Inc, description: Fullmer Locksmith Service Inc, located in North Riverside, IL, has been a trusted locksmith and lock supplier for the Forest Park, LaGrange, and Brookfield areas since 1960. As a family-owned and operated business for over 60 years, we pride ourselves on providing fast, friendly, and reliable service. Our expertise includes master key systems, panic devices, and high-security locks, featuring trusted brands such as Schlage, Corbin Russwin, and Falcon. Contact Fullmer Locksmith Service Inc for all your lock and security needs., potentialAction: { @type: SearchAction, target: https://fullmerlock.com/?s{search_term_string}, query-input: required namesearch_term_string } }, { @type: WebPage, @id: https://fullmerlock.com/#webpage, url: https://fullmerlock.com/, name: Fullmer Locksmith Service Inc - North Riverside, IL, description: Fullmer Locksmith Service Inc, located in North Riverside, IL, has been a trusted locksmith and lock supplier for the Forest Park, LaGrange, and Brookfield areas since 1960. As a family-owned and operated business for over 60 years, we pride ourselves on providing fast, friendly, and reliable service. Our expertise includes master key systems, panic devices, and high-security locks, featuring trusted brands such as Schlage, Corbin Russwin, and Falcon. Contact Fullmer Locksmith Service Inc for all your lock and security needs., isPartOf: { @id: https://fullmerlock.com/#website }, about: { @id: https://fullmerlock.com/#localbusiness }, primaryImageOfPage: { @type: ImageObject, url: https://du9m0k402rjmo.cloudfront.net/images/P_27219/f7c99ec8-8ed0-4f84-aaf1-29acda83ccfd.jpg }, breadcrumb: { @type: BreadcrumbList, itemListElement: { @type: ListItem, position: 1, name: Home, item: https://fullmerlock.com/ } } }, { @type: Service, @id: https://fullmerlock.com/#service, name: Our Services, provider: { @id: https://fullmerlock.com/#localbusiness }, serviceType: Residential Services: We offer drill outs, re-keying, and combination lock changing for homeowners. Our reliable technicians ensure your home is secure and accessible with efficient service., Commercial and Industrial Services: We provide security solutions like electric strikes, magnetic locks, and alarm locks for commercial and industrial properties. Our customized services enhance security and compliance., Retail and Onsite Services: Specializing in automatic door openers and door closers, we offer onsite services to improve retail operations. Our team ensures smooth, secure entry and exit systems. , description: Professional services offered by Fullmer Locksmith Service Inc }, { @type: FAQPage, @id: https://fullmerlock.com/#faqpage, url: https://fullmerlock.com/#faq, name: Frequently Asked Questions, description: Frequently asked questions about Fullmer Locksmith Service Inc, mainEntity: { @type: Question, name: What types of commercial locksmith services do you offer?, acceptedAnswer: { @type: Answer, text: We provide a wide range of commercial locksmith services, including installation and repair of high-security locks, master key systems, access control systems, and keyless entry solutions. } }, { @type: Question, name: Can you re-key locks for residential properties?, acceptedAnswer: { @type: Answer, text: Absolutely! While our primary focus is commercial locksmithing, we also offer re-keying services for residential properties to enhance your homes security. } }, { @type: Question, name: How long does it take to re-key a house?, acceptedAnswer: { @type: Answer, text: Re-keying a house typically takes about 15-30 minutes per lock, depending on the number of locks and their complexity. Well work efficiently to minimize any inconvenience. } }, { @type: Question, name: Why should I choose re-keying instead of changing my locks?, acceptedAnswer: { @type: Answer, text: Re-keying is a cost-effective way to enhance security without replacing the entire lock. Its ideal if youve lost keys, moved into a new home, or want to ensure previous keyholders no longer have access. } } } }/script>/head>body> div idbootstrapCssTest classd-none>/div> script> $(function () { if ($(#bootstrapCssTest).is(:visible)) { $(head).prepend(link relstylesheet href/content/templates/bootstrap.min.css>); } }); /script> input typehidden idareaMarkers />!-- NAVBAR -->div classcontainer-fullwidth fixed-top> header classcontent-header custom-background-color d-flex flex-wrap align-items-center justify-content-between py-0 px-2> div classnav-image-mobile-left> a href#home-section idHomeNav onclickDisplayPage(#homePage)> img srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/f7c99ec8-8ed0-4f84-aaf1-29acda83ccfd.jpg altnavbar logo classd-line-block align-top nav-logo /> /a> /div> div classnav-location pt-2> ul classmx-auto p-0 header-address d-flex flex-wrap justify-content-center> li classnav-business_name text-center header-item mx-1 px-1 text-font-color> Fullmer Locksmith Service Inc /li> li classtext-center header-item mx-1 px-1 text-font-color> 8611 W Cermak Rd /li> li classtext-center header-item mx-1 px-1 text-font-color> North Riverside, IL 60546 /li> li classnavbar-hours-sm text-center header-item mx-1 px-1> a href# idnavbar-hours-sm classtext-font-color onclickDisplayPage(#contactPage)>i classfas fa-clock fa-lg px-1 text-font-color>/i>Click Here for Hours/a> /li> li classnav-phone-sm text-center header-item mx-1 px-1> a idPhoneNav hreftel:7084420300 classphone-nav-mobile text-font-color> i classfas fa-phone fa-inverse fa-xs fa-rotate-90>/i> (708) 442-0300 /a> /li> /ul> /div> div classnavbar-hours pb-1 mx-auto> a href# idnavbar-hours classtext-font-color onclickDisplayPage(#contactPage)>i classfas fa-clock fa-lg px-1 text-font-color>/i>Click Here for Hours/a> /div> div classnav-phone-social pb-1 d-flex flex-wrap justify-content-center> div classnav-phone flex-column align-self-center mx-1 px-1 pb-1> a idPhoneNav hreftel:7084420300 classphone-nav-mobile text-font-color> i classfas fa-phone fa-inverse fa-xs fa-rotate-90>/i> (708) 442-0300 /a> /div> div classnav-social mx-1 px-1> div classmx-auto text-center d-flex flex-wrap justify-content-center> div classm-1> a classtext-font-color social-link-footer hrefhttps://www.google.com/maps/place/Fullmer+Locksmith+Service,+Inc./@41.8495242,-87.8383849,17z/data!3m1!4b1!4m5!3m4!1s0x880e35977cb30067:0xa68ed85ddb7c6115!8m2!3d41.8495242!4d-87.8383849 target_blank idgoogle-social-footer titleGoogle> i classfab fa-google fa-lg text-font-color>/i> /a> /div> div classm-1> a classtext-font-color social-link-footer hrefhttps://www.facebook.com/Fullmer-Locksmith-Service-Inc-101737761984637/ target_blank idfacebook-social-footer titleFacebook> i classfab fa-facebook-f fa-lg text-font-color>/i> /a> /div> div classm-1> a classtext-font-color social-link-footer hrefhttps://www.yelp.com/biz/fullmer-locksmith-service-north-riverside-2 target_blank idyelp-social-footer titleYelp> i classfab fa-yelp fa-lg text-font-color>/i> /a> /div> /div> /div> /div>/header>nav classbg-default-color navbar navbar-light bg-light navbar-expand-xl pt-1 pb-2> div classnav-image bg-default-color bg-light flex-column text-center nav-image-desktop> a href#home-section classnavbar-brand ml-3 idHomeNav onclickDisplayPage(#homePage)> img srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/f7c99ec8-8ed0-4f84-aaf1-29acda83ccfd.jpg altnavbar logo classd-line-block align-top nav-logo /> /a> /div> button classnavbar-toggler nav-menu collapsed typebutton data-togglecollapse data-target#navbarToggler aria-controlsnavbarToggler aria-expandedfalse aria-labelToggle navigation> span classnavbar-toggler-icon>/span> span classmy-1 mx-2 close>X/span> /button> div classcollapse navbar-collapse flex-column mx-auto idnavbarToggler> div classd-none d-xl-block nav-section> div classnavbar-nav d-flex flex-wrap align-items-center> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idHomePageNavigationLink classnav-link p-3 onclickDisplayPage(#homePage)>Home/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idAboutPageNavigationLink onclickDisplayPage(#aboutPage) classnav-link p-3>About/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idServicesPageNavigationLink onclickDisplayPage(#servicesPage) classnav-link p-3>Services/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idtestimonialsPageNavigationLink onclickDisplayPage(#testimonialsPage) classnav-link p-3>Testimonials/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idImageryPageNavigationLink onclickDisplayPage(#imageryPage) classnav-link p-3>Imagery/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idPostsPageNavigationLink onclickDisplayPage(#postsPage) classnav-link p-3>News/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idFaqPageNavigationLink onclickDisplayPage(#faqPage) classnav-link p-3>FAQ/a> /div> div classcol nav-item text-center header-item mx-auto text-nowrap> a href# idContactPageNavigationLink onclickDisplayPage(#contactPage) classnav-link p-3>Contact/a> /div> /div> /div> div classd-xs-block d-xl-none> ul classnavbar-nav mx-auto mr-auto mt-2 mt-xl-0 mb-2> li classnav-item text-center header-item mr-1 ml-1> Fullmer Locksmith Service Inc /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idHomePageNavigationLink classnav-link p-3 onclickDisplayPage(#homePage)>Home/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idAboutPageNavigationLink onclickDisplayPage(#aboutPage) classnav-link p-3>About/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idServicesPageNavigationLink onclickDisplayPage(#servicesPage) classnav-link p-3>Services/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idTestimonialsPageNavigationLink onclickDisplayPage(#testimonialsPage) classnav-link p-3>Testimonials/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idImageryPageNavigationLink onclickDisplayPage(#imageryPage) classnav-link p-3>Imagery/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idPostsPageNavigationLink onclickDisplayPage(#postsPage) classnav-link p-3>News/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idFaqPageNavigationLink onclickDisplayPage(#faqPage) classnav-link p-3>FAQ/a> /li> li classnav-item text-center header-item mr-1 ml-1 text-nowrap> a href# idContactPageNavigationLink onclickDisplayPage(#contactPage) classnav-link p-3>Contact/a> /li> /ul> /div> /div>/nav>/div>div idpages classpages-left> !--Home Page Information--> div classcontent collapse show bg-alt-color idhomePage>div classd-flex flex-wrap> div classw-100 mx-auto home-banner> div classparallax w-100> div classimg-fluid banner-image stylebackground-image: url(https://du9m0k402rjmo.cloudfront.net/images/P_27219/99474bdf-391e-4239-a6ef-3f8f566ff7b1.jpg)>/div> div classhome-content> div classd-flex flex-wrap justify-content-center align-items-center px-2>/div> /div> /div> /div> div classd-flex align-items-center justify-content-center col-12 text-center description mx-auto slogan p-3 slogan-speakable stylecolor: #002A54; opacity: 0.7> Fast, Friendly & Reliable Service That You Can Depend On /div> div classslider-attributes-container> div classslider slider-attributes mx-auto> div> div classimage-slider-attributes-border m-5> div classimage-slider-attributes-border-inner> div classimage-slider-attributes custom-background-color d-flex justify-content-center align-items-center> span classm-2 text-font-color>Safes/span> /div> /div> /div> /div> div> div classimage-slider-attributes-border m-5> div classimage-slider-attributes-border-inner> div classimage-slider-attributes custom-background-color d-flex justify-content-center align-items-center> span classm-2 text-font-color>Door Closers/span> /div> /div> /div> /div> div> div classimage-slider-attributes-border m-5> div classimage-slider-attributes-border-inner> div classimage-slider-attributes custom-background-color d-flex justify-content-center align-items-center> span classm-2 text-font-color>Panic Devices/span> /div> /div> /div> /div> div> div classimage-slider-attributes-border m-5> div classimage-slider-attributes-border-inner> div classimage-slider-attributes custom-background-color d-flex justify-content-center align-items-center> span classm-2 text-font-color>Deadbolts/span> /div> /div> /div> /div> div> div classimage-slider-attributes-border m-5> div classimage-slider-attributes-border-inner> div classimage-slider-attributes custom-background-color d-flex justify-content-center align-items-center> span classm-2 text-font-color>High Security Locks/span> /div> /div> /div> /div> div> div classimage-slider-attributes-border m-5> div classimage-slider-attributes-border-inner> div classimage-slider-attributes custom-background-color d-flex justify-content-center align-items-center> span classm-2 text-font-color>Key And Combination Safe Systems/span> /div> /div> /div> /div> /div> /div> nav idcircle-attributes classnavbar-attribute custom-background-color w-100> div classw-100 d-flex flex-row justify-content-center text-center> div classinner py-1> div classcol nav-item text-center header-item mx-auto text-wrap> span classnav-link>Safes/span> /div> div classcol nav-item text-center header-item mx-auto text-wrap> span classnav-link>Door Closers/span> /div> div classcol nav-item text-center header-item mx-auto text-wrap> span classnav-link>Panic Devices/span> /div> div classcol nav-item text-center header-item mx-auto text-wrap> span classnav-link>Deadbolts/span> /div> div classcol nav-item text-center header-item mx-auto text-wrap> span classnav-link>High Security Locks/span> /div> div classcol nav-item text-center header-item mx-auto text-wrap> span classnav-link>Key And Combination Safe Systems/span> /div> /div> /div> /nav> div classw-100 w-lg-75 mx-auto text-center p-4> div classp-2 section-header text-center> Established in 1960 /div> div classp-2 section-information text-center> Located in North Riverside, IL /div> /div> div classw-100 w-lg-75 mx-auto mt-4 mb-4> div classslider slider-single w-100> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/e86f49ee-c1bd-44d9-b3a9-5cecb4a0844b.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/2f0ce6b3-be18-4da8-b649-18699bf7fa78.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/1719b4f1-7fc5-4de6-9557-01d632a0d0a6.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/5989b344-a7cd-44cc-8c45-4ac978b3f691.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/0ce339ee-dcf7-4089-81d3-d8a5b2ede082.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/33e4df68-c268-4512-9236-77a76c050222.jpg classimg-fluid text-center mx-auto /> /div> /div> div classslider slider-nav w-45 mx-auto mt-3 mb-3> div classimage-slider-thumbnail> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/e86f49ee-c1bd-44d9-b3a9-5cecb4a0844b.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider-thumbnail> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/2f0ce6b3-be18-4da8-b649-18699bf7fa78.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider-thumbnail> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/1719b4f1-7fc5-4de6-9557-01d632a0d0a6.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider-thumbnail> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/5989b344-a7cd-44cc-8c45-4ac978b3f691.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider-thumbnail> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/0ce339ee-dcf7-4089-81d3-d8a5b2ede082.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider-thumbnail> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/33e4df68-c268-4512-9236-77a76c050222.jpg classimg-fluid text-center mx-auto /> /div> /div> /div> div classw-100 mx-auto bg-image-container> div classbg-image stylebackground-image: url(https://du9m0k402rjmo.cloudfront.net/images/P_27219/e19835f9-9da3-43fd-97a6-711cb17b9814.jpg)>/div> div classw-lg-40 p-3 mt-md-5 mb-md-5> div classmx-auto p-3 testimonial-blurb> div classblurb-review-info> p classparagraph-content> div classblurb-rating m-2 mt-3> img classstar-rating-image src/content/profile/images/star_yellow_5.0.png /> /div> div classblurb-authordate m-2 mb-3> span classblurb-author>- 1st See It Productions /span> span classblurb-date>1/11/2026 /span> /div> div classblurb m-2 mt-3 mb-3>"Have a unique mailbox key? Have no fear, Fullmer Locksmith is here!TOP TEN BEST Keys Made near Chicago, IL:1. Fullmer Locksmith Service IncIf they can make a copy of unique keys, then standard keys are nothing! I want a place that can do it all! They are better! Faster! That's a fact!" /div> div classblurb-more m-2 mt-3> div classd-flex flex-wrap flex-column text-center mx-auto mt-1 mb-1 p-0> a idtestimonialsBlurbMore href#testimonialsPage classd-flex align-items-center justify-content-center btn btn-secondary p-2 mr-auto testimonialsBlurbMore > See More i classfas fa-arrow-right>/i> /a> /div> /div> /p>/div> /div> /div> /div>/div> /div> !--About Page Information--> div classcontent collapse bg-alt-color idaboutPage>/div> !--Services Page Information--> div classcontent collapse bg-alt-color idservicesPage>/div> !--Testimonial Page Information--> div classcontent collapse bg-alt-color idtestimonialsPage>/div> !-- REVIEW MODAL --> div idreviewFormParentContainer>/div> !--Contact Page Information--> div classcontent collapse bg-alt-color idcontactPage>/div> !--Imagery Page Information--> div classcontent collapse bg-alt-color idimageryPage>/div> !--Posts Page Information--> div classcontent collapse bg-alt-color idpostsPage>div classd-flex flex-wrap> div classw-100 mx-auto text-center banner> div classparallax w-100 d-flex flex-wrap justify-content-center align-items-center> div classbanner-image stylebackground-image: url(https://du9m0k402rjmo.cloudfront.net/images/P_27219/4fe3acf3-c4d0-4a4a-b704-5616138fca8a.jpg)>/div> div classcol-12> div classd-flex align-items-center justify-content-center col-12 text-center heading mx-auto p-2 banner-information stylecolor: #000000> News /div> /div> /div> /div> div classw-100 mx-auto> div classd-flex flex-row flex-wrap justify-content-center text-center> div classposts-partial-content w-100> div classpostsInfo idtestimonialPostsInfo>/div> div classtext-center m-3> button typebutton idprevPosts classbtn btn-light btn-md disabled>i classfas fa-angle-left>/i> Previous/button> button typebutton idnextPosts classbtn btn-light btn-md>Next i classfas fa-angle-right>/i>/button> /div> /div> /div> /div>/div> /div> !--Locations Page Information--> div classcontent collapse bg-alt-color idlocationsPage>/div> !--360 Tour Page--> div classcontent collapse bg-alt-color pt-3 idgsvPage>/div> !--FAQ Page Information--> div classcontent collapse bg-alt-color idfaqPage>/div>/div> !--FOOTER Information-->footer idfooter-container classfooter custom-background-color>div classd-flex flex-wrap text-center justify-content-center p-3> div classfooter-content mx-auto> !--Payment Methods --> div idpaymentTypeDark classmx-auto mt-2 mb-2 text-center d-flex flex-wrap justify-content-center paymentType> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/visa.png /> /div> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/mastercard.png /> /div> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/americanexpress.png /> /div> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/discover.png /> /div> /div> div idpaymentTypeLight classmx-auto mt-2 mb-2 text-center d-flex flex-wrap justify-content-center paymentType> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/visa_white.png /> /div> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/mastercard_white.png /> /div> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/americanexpress_white.png /> /div> div classm-2> img altPayment Image classimg-fluid text-center mx-auto payment-img src/content/Templates/images/payment/discover_white.png /> /div> /div> div idfooter-address> div classd-flex flex-wrap justify-content-center pt-1> ul classmx-auto p-0 mt-2 mt-lg-0 mb-2 business-info-footer d-flex flex-wrap justify-content-center> li classtext-center mr-1 ml-1 pl-1 pr-1 text-font-color footer-business-name> Fullmer Locksmith Service Inc /li> li classtext-center header-item mr-1 ml-1 pl-1 pr-1 text-font-color> 8611 W Cermak Rd /li> li classtext-center header-item mr-1 ml-1 pl-1 pr-1 text-font-color> North Riverside, IL 60546 /li> /ul> /div> /div> div classd-flex flex-wrap flex-column text-center mx-auto mt-1 mb-1 p-0> a idphoneLink hreftel:7084420300 classphoneLinkInput d-flex align-items-start justify-content-center btn btn-secondary p-2 mx-auto text-font-color> (708) 442-0300 /a> /div> div classmt-3> div classmx-auto mt-2 mb-2 text-center d-flex flex-wrap justify-content-center> div classm-2> a classtext-font-color social-link-footer hrefhttps://www.google.com/maps/place/Fullmer+Locksmith+Service,+Inc./@41.8495242,-87.8383849,17z/data!3m1!4b1!4m5!3m4!1s0x880e35977cb30067:0xa68ed85ddb7c6115!8m2!3d41.8495242!4d-87.8383849 target_blank idgoogle-social-footer titleGoogle> i classfab fa-google fa-lg>/i> /a> /div> div classm-2> a classtext-font-color social-link-footer hrefhttps://www.facebook.com/Fullmer-Locksmith-Service-Inc-101737761984637/ target_blank idfacebook-social-footer titleFacebook> i classfab fa-facebook-f fa-lg>/i> /a> /div> div classm-2> a classtext-font-color social-link-footer hrefhttps://www.yelp.com/biz/fullmer-locksmith-service-north-riverside-2 target_blank idyelp-social-footer titleYelp> i classfab fa-yelp fa-lg>/i> /a> /div> /div> /div> div classtext-center tos pt-4> a classtext-font-color href/Home/TermsOfUse idtosLink target_blank>Terms of Use |/a> a classtext-font-color href/Home/PrivacyPolicy idppLink target_blank>Privacy Policy/a> /div> div classtext-center stylefont-size: 0.75rem; color: #999; padding-top: 0.5rem;> © 2026 American Marketing & Publishing, L.L.C. All rights reserved. Names, logos, and other marks displayed are the property of their respective owners. /div> /div>/div>/footer> div classaccessibility-img py-2 px-2> div classd-flex flex-wrap justify-content-center align-items-center text-center> a href/Accessibility?domainfullmerlock target_blank classdark> img src/Content/Templates/images/accessibility_icon.png height60 width42 /> /a> /div> /div>div classchatbot-toggle-container> button idchatbot-toggle> img src/Content/Templates/images/chat_icon.png height60 width60 /> /button>/div>!-- Chat Window -->div idchat-window> !-- Chat Header --> div classchat-header> div classchat-header-content> h3 classchat-header-title>Fullmer Locksmith Service Inc Assistant/h3> /div> button idclose-chat classchat-close-btn aria-labelClose chat> i classfas fa-times>/i> /button> /div> !-- Chat Messages --> div idchat-messages> div classchat-message-container> div classchat-message> Hi there! How can we help you today? /div> /div> /div> div iddisclaimer-info> div classdisclaimer-content> div classdisclaimer-text> AI Responses not guaranteed; verify before reliance /div> /div> /div> !-- Cost Display --> div idcost-info> div classcost-info-row> div classcost-info-left> i classfas fa-dollar-sign fa-xs cost-icon>/i> span idcost-display>Cost: $0.00000/span> /div> span idpercentage-display>0.0% of $0.02/span> /div> div classcost-progress-bar> div idcost-progress>/div> /div> /div> !-- Chat Input --> div classchat-input-container> form idchat-form> input typetext idchat-input placeholderType your message... /> button typesubmit idsend-message> i classfas fa-paper-plane>/i> /button> /form> div idcharacter-count>0/250/div> div idcharacter-limit-message styledisplay: none; color: #dc2626; font-size: 12px; margin-top: 4px;> Your message is too long. Please limit your question to 250 characters or less. /div> /div>/div>!-- Contact Form Window -->div idcontact-form-window> div classcontact-form-header> h3 classcontact-form-title>Contact Form/h3> button idclose-contact-form classcontact-form-close-btn aria-labelClose contact form> i classfas fa-times>/i> /button> /div> div classcontact-form-content> form idchatbot-contact-form> input typehidden idchat_captcha_alt namechat_captcha_alt valueBUq7PBluPhmmvlpxLECudiLuTWmRUqAnnRqQCZFh9DBDfGgIOutI9WQ0v+ouXDpr /> input typehidden idchat_g-Recaptcha-Response-Contact namechat_g-Recaptcha-Response-Contact value /> input typehidden namechat_aid valueaa71ad14-cd61-483b-850e-2ec0be0214e9 /> input typehidden namechat_contactSubject valueFrontDesk™ Contact Form /> input typehidden namechat_contactAddress value /> input typehidden namechat_contactZip value /> input typehidden namechat_contactCity value /> input typehidden namechat_contactState value /> div classai-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> div classform-group> label forchat_contactName classform-label>Name */label> input typetext idchat_contactName namechat_contactName classform-input required /> /div> div classform-group> label forchat_contactEmail classform-label>Email */label> input typeemail idchat_contactEmail namechat_contactEmail classform-input required /> /div> div classform-group> label forchat_contactPhone classform-label>Phone/label> input typetel idchat_contactPhone namechat_contactPhone classform-input /> /div> div classform-group> label forchat_contactMessage classform-label>Message */label> textarea idchat_contactMessage namechat_contactMessage rows4 classform-textarea required>/textarea> /div> div idclassicCaptcha classd-flex flex-column> div classg-recaptcha ml-auto mb-3 captcha-responsive data-sitekey6LeprWcUAAAAAF533Xd5p6kCrnRs0z4ceJieYgeO>/div> /div> !-- Sticky footer section with reCAPTCHA disclaimer and submit button --> div classform-sticky-footer> div classgrecaptcha-info> This site is protected by reCAPTCHA and the Google a hrefhttps://policies.google.com/privacy>Privacy Policy/a> and a hrefhttps://policies.google.com/terms>Terms of Service/a> apply. /div> button typesubmit idcontact-submit-btn classform-submit-btn>Submit/button> /div> /form> /div>/div>script> // Wrap entire chatbot functionality in a namespace to prevent conflicts window.ChatbotModule (function() { use strict; // Private variables let isOpen false; let contactFormOpen false; let messages { role: assistant, content: Hi there! How can we help you today? } ; let isLoading false; let showContactForm false; let limitReached false; let apiCost 0; const maxCost 0.5; const maxQuestionLength 250; // Private element references let $chatbotToggle; let $chatWindow; let $contactFormWindow; let $closeChat; let $closeContactForm; let $chatMessages; let $chatForm; let $chatInput; let $sendMessage; let $characterCount; let $costDisplay; let $percentageDisplay; let $costProgress; let $contactForm; // Initialize element references function initializeElements() { $chatbotToggle $(#chatbot-toggle); $chatWindow $(#chat-window); $contactFormWindow $(#contact-form-window); $closeChat $(#close-chat); $closeContactForm $(#close-contact-form); $chatMessages $(#chat-messages); $chatForm $(#chat-form); $chatInput $(#chat-input); $sendMessage $(#send-message); $characterCount $(#character-count); $costDisplay $(#cost-display); $percentageDisplay $(#percentage-display); $costProgress $(#cost-progress); $contactForm $(#chatbot-contact-form); } // Initialize function init() { // Initialize element references initializeElements(); // Load cost from localStorage const savedCost localStorage.getItem(api_cost); if (savedCost) { apiCost parseFloat(savedCost); // Check if cost limit is reached if (apiCost > maxCost) { limitReached true; updateChatInputState(); } } // Initialize character count display updateCharacterCount(); document.documentElement.style.setProperty(--adaptive-text-color, #374151); document.documentElement.style.setProperty(--image-invert, none); setTimeout(updateTextColors, 100); // Ensure chatbot stays on top even when modals are opened $(document).on(shown.bs.modal, function (e) { // Temporarily boost chatbot z-index when modals are shown $(.chatbot-toggle-container).css(z-index, 2147483647); $(#chat-window).css(z-index, 2147483646); $(#contact-form-window).css(z-index, 2147483645); }); // Set up event listeners setupEventListeners(); } // Event Listeners with namespacing function setupEventListeners() { // Remove any existing chatbot event listeners to prevent duplicates $chatbotToggle.off(.chatbot); $closeChat.off(.chatbot); $closeContactForm.off(.chatbot); $chatForm.off(.chatbot); $chatInput.off(.chatbot); $contactForm.off(.chatbot); // Toggle chat window $chatbotToggle.on(click.chatbot, function(e) { e.preventDefault(); e.stopPropagation(); toggleChat(); }); $closeChat.on(click.chatbot, function(e) { e.preventDefault(); e.stopPropagation(); closeChat(); }); $closeContactForm.on(click.chatbot, function(e) { e.preventDefault(); e.stopPropagation(); hideContactForm(); }); // Send message $chatForm.on(submit.chatbot, function (e) { e.preventDefault(); e.stopPropagation(); // Check if submit button is disabled if ($sendMessage.prop(disabled) || $sendMessage.hasClass(disabled)) { return false; } sendMessage(); }); // Character count - update on every keystroke $chatInput.on(input.chatbot, function(e) { // Only handle if this is specifically the chatbot input if ($(this).attr(id) chat-input) { updateCharacterCount(); } }); // Also check on keyup to catch paste events $chatInput.on(keyup.chatbot paste.chatbot, function(e) { // Only handle if this is specifically the chatbot input if ($(this).attr(id) chat-input) { setTimeout(updateCharacterCount, 10); } }); // Handle Enter key for sending messages $chatInput.on(keydown.chatbot, function (e) { // Only handle if this is specifically the chatbot input if ($(this).attr(id) ! chat-input) { return; } if (e.key Enter && !e.shiftKey && !limitReached) { e.preventDefault(); e.stopImmediatePropagation(); // Check if submit button is disabled if ($sendMessage.prop(disabled) || $sendMessage.hasClass(disabled)) { return false; } sendMessage(); return; } }); // Contact form submission $contactForm.on(submit.chatbot, function (e) { e.preventDefault(); e.stopPropagation(); submitContactForm(); }); } // Toggle chat window function toggleChat() { if (!isOpen) { // Opening the chat isOpen true; // Hide toggle button on both mobile and desktop $(.chatbot-toggle-container).addClass(hide-toggle); // First show the window (still off-screen) $chatWindow.show(); // Force a reflow to ensure the transition will work $chatWindow0.offsetHeight; // Then add the class that triggers the slide-in animation setTimeout(function () { $chatWindow.addClass(show); scrollToBottom(); }, 10); } else { // Closing the chat isOpen false; // Show toggle button again $(.chatbot-toggle-container).removeClass(hide-toggle); // Remove the show class to trigger slide-out animation $chatWindow.removeClass(show); // Hide the window after the animation completes setTimeout(function () { $chatWindow.hide(); }, 300); // Match the CSS transition duration // Also hide contact form if open if (contactFormOpen) { hideContactForm(); } } } // Close chat window function closeChat() { if (isOpen) { isOpen false; // Show toggle button again $(.chatbot-toggle-container).removeClass(hide-toggle); // Trigger slide-out animation $chatWindow.removeClass(show); // Hide after animation setTimeout(function () { $chatWindow.hide(); }, 300); if (contactFormOpen) { hideContactForm(); } } } // Update character count and submit button state function updateCharacterCount() { const count $chatInput.val().length; const remaining maxQuestionLength - count; const $limitMessage $(#character-limit-message); if (count > maxQuestionLength) { // Over limit - disable submit button and show message $characterCount.text(`${count}/${maxQuestionLength} (${Math.abs(remaining)} over limit)`).css(color, #dc2626); $limitMessage.text(`Your message is too long. Please limit your question to ${maxQuestionLength} characters or less. Your message is currently ${count} characters.`).show(); $chatInput.addClass(over-limit); // Disable submit button with proper styling $sendMessage.prop(disabled, true).addClass(disabled); $sendMessage.css({ background-color: #9ca3af, color: #6b7280, cursor: not-allowed, opacity: 0.5, pointer-events: none }); } else if (remaining 20) { // Close to limit - show warning but allow submit $characterCount.text(`${count}/${maxQuestionLength}`).css(color, #f59e0b); $limitMessage.hide(); $chatInput.removeClass(over-limit); // Enable submit button and reset styling $sendMessage.prop(disabled, false).removeClass(disabled); $sendMessage.css({ background-color: , color: , cursor: , opacity: , pointer-events: }); } else { // Within limit - normal state $characterCount.text(`${count}/${maxQuestionLength}`).css(color, #6b7280); $limitMessage.hide(); $chatInput.removeClass(over-limit); // Enable submit button and reset styling $sendMessage.prop(disabled, false).removeClass(disabled); $sendMessage.css({ background-color: , color: , cursor: , opacity: , pointer-events: }); } } // Send message function sendMessage() { const message $chatInput.val().trim(); if (!message || isLoading || limitReached) return; // Double check character limit including whitespace if (message.length > maxQuestionLength) { appendMessage(assistant, `Your message is too long. Please limit your question to ${maxQuestionLength} characters or less. Your message is currently ${message.length} characters.`); return; } // Add user message to chat messages.push({ role: user, content: message }); appendMessage(user, message); // Clear input $chatInput.val(); updateCharacterCount(); // Send to API fetchChatResponse(messages); } // Fetch chat response from API function fetchChatResponse(messages) { isLoading true; showLoadingIndicator(); $.ajax({ url: /Home/Chat, type: POST, contentType: application/json, data: JSON.stringify({ Messages: messages, ProfileId: 27219 }), headers: { RequestVerificationToken: $(inputname__RequestVerificationToken).val() }, success: function (response) { hideLoadingIndicator(); if (response.error) { appendMessage(assistant, `Error: ${response.error}`); console.error(API Error:, response.error); isLoading false; return; } // Update cost apiCost response.Cost; localStorage.setItem(api_cost, apiCost.toString()); // Check if limit reached if (response.LimitReached) { limitReached true; showContactFormWindow(); appendMessage(assistant, Our AI chat has reached its capacity. Please use the contact form to get in touch directly with us.); } else { // Check if response contains contact form trigger if (response.Message.includes(start_contact_form>)) { const cleanResponse response.Message.replace(start_contact_form>, ); appendMessage(assistant, cleanResponse); showContactFormWindow(); } else { appendMessage(assistant, response.Message); } // Add response to messages array messages.push({ role: assistant, content: response.Message }); } isLoading false; updateChatInputState(); }, error: function (xhr, status, error) { hideLoadingIndicator(); appendMessage(assistant, Sorry, I encountered an error. Please try again later.); console.error(AJAX Error:, error); isLoading false; } }); } // Append message to chat function appendMessage(role, content) { content convertMarkdownLinksToHTML(content); const rootStyles getComputedStyle(document.documentElement); const customerColor rootStyles.getPropertyValue(--customer_color).trim(); const adaptivefontColor rootStyles.getPropertyValue(--adaptive-text-color).trim(); const messageClass role user ? flex-end : flex-start; const bgColor role user ? customerColor : white; const textColor role user ? adaptivefontColor : #374151; const borderRadius role user ? border-bottom-right-radius: 0; : border-bottom-left-radius: 0;; const border role user ? : border: 1px solid #e5e7eb;; const messageHtml ` div styledisplay: flex; justify-content: ${messageClass}; margin-bottom: 16px;> div stylemax-width: 75%; padding: 12px; border-radius: 8px; background-color: ${bgColor}; ${border} ${borderRadius} color: ${textColor}; word-wrap: break-word; overflow-wrap: break-word;> ${content} /div> /div> `; $chatMessages.append(messageHtml); scrollToBottom(); } // Show loading indicator function showLoadingIndicator() { const loadingHtml ` div idloading-indicator styledisplay: flex; justify-content: flex-start; margin-bottom: 16px;> div stylemax-width: 75%; padding: 12px; border-radius: 8px; background-color: white; border: 1px solid #e5e7eb; color: #374151; display: flex; gap: 4px;> div classloading-dot stylewidth: 8px; height: 8px; background-color: #9ca3af; border-radius: 50%;>/div> div classloading-dot stylewidth: 8px; height: 8px; background-color: #9ca3af; border-radius: 50%;>/div> div classloading-dot stylewidth: 8px; height: 8px; background-color: #9ca3af; border-radius: 50%;>/div> /div> /div> `; $chatMessages.append(loadingHtml); animateLoadingDots(); scrollToBottom(); // Disable input while loading $chatInput.prop(disabled, true); $sendMessage.prop(disabled, true); } // Animate loading dots function animateLoadingDots() { if (!$(#loading-indicator).length) return; $(.loading-dot).each(function (index) { var $dot $(this); setTimeout(function () { $dot.animate({ opacity: 0.3 }, 300) .animate({ opacity: 1 }, 300); }, index * 200); }); setTimeout(function () { animateLoadingDots(); }, 900); } // Hide loading indicator function hideLoadingIndicator() { $(#loading-indicator).remove(); // Enable input after loading (unless limit reached) if (!limitReached) { $chatInput.prop(disabled, false); updateCharacterCount(); // This will set the correct submit button state } } // Scroll to bottom of chat function scrollToBottom() { $chatMessages.scrollTop($chatMessages0.scrollHeight); } // Update cost display function updateCostDisplay() { $(#cost-info).show(); $costDisplay.text(`Cost: $${apiCost.toFixed(5)}`); const percentage (apiCost / maxCost) * 100; $percentageDisplay.text(`${percentage.toFixed(1)}% of $${maxCost.toFixed(2)}`); $costProgress.css(width, `${percentage}%`); // Change progress bar color if near limit if (percentage > 80) { $costProgress.css(background-color, #dc2626); } else { $costProgress.css(background-color, #4f46e5); } // Update chat input state updateChatInputState(); } // Update chat input state based on limit function updateChatInputState() { if (limitReached) { $chatInput.prop(disabled, true); $sendMessage.prop(disabled, true); $chatInput.attr(placeholder, Chat Unavailable.); } else { $chatInput.prop(disabled, false); updateCharacterCount(); // This will set the correct submit button state $chatInput.attr(placeholder, Type your message...); } } // Show contact form function showContactFormWindow() { if (!contactFormOpen) { contactFormOpen true; // Hide toggle button when contact form opens $(.chatbot-toggle-container).addClass(hide-toggle); if (isMobile()) { // On mobile, slide out chat and slide in contact form $chatWindow.removeClass(show); setTimeout(function () { $chatWindow.hide(); $contactFormWindow.show(); // Force reflow $contactFormWindow0.offsetHeight; // Add show class for slide animation setTimeout(function () { $contactFormWindow.addClass(show); $(.contact-form-content).scrollTop(0); }, 10); }, 300); } else { // Desktop - slide chat to left and slide in contact form $chatWindow.animate({ right: 390px }, 300); $contactFormWindow.show(); setTimeout(function () { $contactFormWindow.animate({ right: 20px }, 300); }, 50); } } } // Hide contact form - slides out and chat returns to original position function hideContactForm() { if (contactFormOpen) { contactFormOpen false; if (isMobile()) { // Slide out contact form $contactFormWindow.removeClass(show); setTimeout(function () { $contactFormWindow.hide(); // Show chat window again if it was open if (isOpen) { $chatWindow.show(); // Force reflow $chatWindow0.offsetHeight; setTimeout(function () { $chatWindow.addClass(show); }, 10); } else { // If chat is not open, show toggle button $(.chatbot-toggle-container).removeClass(hide-toggle); } }, 300); } else { // Desktop - animate back $contactFormWindow.animate({ right: -370px }, 300, function () { $contactFormWindow.hide(); }); $chatWindow.animate({ right: 20px }, 300); // Only show toggle if both windows are closed if (!isOpen) { $(.chatbot-toggle-container).removeClass(hide-toggle); } } } } // Submit contact form function submitContactForm() { const name $(#chat_contactName).val(); const email $(#chat_contactEmail).val(); const phone $(#chat_contactPhone).val(); const message $(#chat_contactMessage).val(); // Basic validation if (!name || !email || !message) { alert(Please fill out all required fields.); return; } // Email validation const emailRegex /^^\s@+@^\s@+\.^\s@+$/; if (!emailRegex.test(email)) { alert(Please enter a valid email address.); return; } // Message length validation if (message.length 10) { alert(Your message must be at least 10 characters long.); return; } // Disable form during submission $(#contact-submit-btn).prop(disabled, true).text(Sending...); var form $(#chatbot-contact-form); // Execute reCAPTCHA before submitting grecaptcha.ready(function() { grecaptcha.execute(6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH, {action: contact_us}).then(function(token) { // Set the reCAPTCHA token $(#chat_g-Recaptcha-Response-Contact).val(token); // Submit the form with reCAPTCHA token $.ajax({ url: /Home/ChatContactPost, type: POST, data: form.serialize(), success: function (response) { if (typeof response string && response.indexOf({message:) ! -1) { var jsonData $.parseJSON(response); if (jsonData.success) { appendMessage(assistant, Thanks for providing your information! We will get back to you soon.); hideContactForm(); // Reset the form $(#chat_contactName).val(); $(#chat_contactEmail).val(); $(#chat_contactPhone).val(); $(#chat_contactMessage).val(); } else { alert(jsonData.message || There was an error processing your request.); } } else if (response.success) { appendMessage(assistant, Thanks for providing your information! We will get back to you soon.); hideContactForm(); // Reset the form $(#chat_contactName).val(); $(#chat_contactEmail).val(); $(#chat_contactPhone).val(); $(#chat_contactMessage).val(); } else { alert(response.message || There was an error processing your request.); } $(#contact-submit-btn).prop(disabled, false).text(Submit); }, error: function (xhr, status, error) { alert(Failed to submit your information. Please try again.); console.error(AJAX Error:, error); $(#contact-submit-btn).prop(disabled, false).text(Submit); } }); }); }); } function convertMarkdownLinksToHTML(text) { return text.replace(/\(^\+)\\((^)+)\)/g, (match, linkText, url) > { // Add target_blank for http/https links if (url.startsWith(http://) || url.startsWith(https://)) { return `a href${url} target_blank relnoopener noreferrer>${linkText}/a>`; } // Keep tel: and mailto: links as-is return `a href${url}>${linkText}/a>`; }); } function getLuminance(hex) { // Remove # if present hex hex.replace(#, ); // Convert hex to RGB const r parseInt(hex.substr(0, 2), 16) / 255; const g parseInt(hex.substr(2, 2), 16) / 255; const b parseInt(hex.substr(4, 2), 16) / 255; // Calculate relative luminance const rLum r 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4); const gLum g 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4); const bLum b 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4); return 0.2126 * rLum + 0.7152 * gLum + 0.0722 * bLum; } function isLightColor(hex) { const luminance getLuminance(hex); return luminance > 0.5; // Threshold for light vs dark } function updateTextColors() { const rootStyles getComputedStyle(document.documentElement); let customerColor rootStyles.getPropertyValue(--customer_color).trim(); // Check if customer color is not set or is empty if (!customerColor || customerColor ) { const defaultColor #f3f3f3; // Set the default customer color document.documentElement.style.setProperty(--customer_color, defaultColor); customerColor defaultColor; } const isLight isLightColor(customerColor); const textColor isLight ? #000000b3 : #ffffff; const $chatbotToggle $(#chatbot-toggle); if (isLight) { $chatbotToggle.removeClass(dark-background).addClass(light-background); } else { $chatbotToggle.removeClass(light-background).addClass(dark-background); } // Update the CSS custom property document.documentElement.style.setProperty(--adaptive-text-color, textColor); } function isMobile() { return window.innerWidth 768; } // Public interface return { init: init }; })(); // Initialize the chatbot module when document is ready $(document).ready(function () { if (window.ChatbotModule) { window.ChatbotModule.init(); } });/script>!-- Modal -->div classmodal idcarouselImageryPhotoModal> div classmodal-dialog modal-dialog-centered modal-lg> div classmodal-content> div classmodal-header>button typebutton classclose data-dismissmodal>×/button>/div> div classmodal-body> div classw-100 w-lg-75 mx-auto mt-4 mb-4> div classslider slider-imagery w-100> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/e86f49ee-c1bd-44d9-b3a9-5cecb4a0844b.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/2f0ce6b3-be18-4da8-b649-18699bf7fa78.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/1719b4f1-7fc5-4de6-9557-01d632a0d0a6.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/5989b344-a7cd-44cc-8c45-4ac978b3f691.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/0ce339ee-dcf7-4089-81d3-d8a5b2ede082.jpg classimg-fluid text-center mx-auto /> /div> div classimage-slider m-2> img altImage srchttps://du9m0k402rjmo.cloudfront.net/images/P_27219/33e4df68-c268-4512-9236-77a76c050222.jpg classimg-fluid text-center mx-auto /> /div> /div> /div> /div> /div> /div>/div>!-- Modal -->div classmodal idcarouselImageryVideoModal> div classmodal-dialog modal-dialog-centered modal-xl> div classmodal-content> div classmodal-header>button typebutton classclose data-dismissmodal>×/button>/div> div classmodal-body> /div> /div> /div>/div>div idloadingImg classloader styledisplay:none !important> i classfas fa-circle>/i> i classfas fa-circle>/i> i classfas fa-circle>/i>/div>script typetext/javascript> var isMobile false; var isTablet false; var pageSize 5; var pageIndex 0; var notReputation false; var hasbanner false; var keepPostUp false; var listOfSites ; var numOfReviews 80; var numOfFilteredReviews 80; var testimonialPageBackgroundColor #0568A9; var numOfPosts 7; var postsPageIndex 0; var geocode null; var isSubmittingReview false; //global flag to track submission $(document).ready(function () { if ($(window).width() 576) { $(#gallerysection).addClass(pr-3); $(#gallerysection).addClass(pl-3); } else { $(#gallerysection).removeClass(pr-3); $(#gallerysection).removeClass(pl-3); } if($(#contact_us_phone).length > 0){ var cleave new Cleave(#contact_us_phone, { phone: true, phoneRegionCode: US }); } // Load the review modal async on page load $.get(/Home/GetReviewModalContent, { id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#reviewFormParentContainer).append(data); $(#starRating).barrating({ theme: bootstrap-stars, deselectable: true, onSelect: function (value, text, event) { $(.br-widget).removeClass(error); $(.alert).alert(close); } }); } }); checkMobile(); checkTablet(); bgSlider(); initializeCarousel(); checkHashRoute(); PauseVideoPlayer(); if(hasbanner){ GetPostsBanner(); } $(window).on(hashchange, function(){ checkHashRoute(); }); document.addEventListener(visibilitychange, function () { if (documenthidden) { PauseVideoPlayer(); } }); var navMain $(#navbarToggler); navMain.on(click, a, null, function () { navMain.collapse(hide); }); $(window).scroll(function () { var scroll $(window).scrollTop(); if ((True False) || (True True && window.outerWidth > 767.98)) { /*falsecenter/trueleft*/ if (scroll > 150){ $(.content).addClass(page-section-adjust); $(.nav-logo).addClass(nav-logo-adjust); $(.nav-location).addClass(nav-item-adjust); } else if(scroll 150){ $(.content).removeClass(page-section-adjust); $(.nav-logo).removeClass(nav-logo-adjust); $(.nav-location).removeClass(nav-item-adjust); } } }); $(#carouselImageryVideoModal).on(shown.bs.modal, function (e) { $(video).each(function () { this.pause() }); //stop html5 video from playing }); $(#carouselImageryVideoModal).on(hidden.bs.modal, function (e) { $(video).each(function () { this.pause() }); //stop html5 video from playing $(.slider-video).slick(unslick); //destroy slider to prevent video from playing after closing }); $(document).on(click, #btnContactPost, function (e) { $(#btnContactPost).prop(disabled, true); $(#btnContactPost).css(font-weight, normal); contactUsPost(e); }); var analyticsCategory Desktop; if (isMobile true) { analyticsCategory Mobile; } if (testimonialPageBackgroundColor ! null && testimonialPageBackgroundColor ! && testimonialPageBackgroundColor ! #F5F5F5) { //set footer background color $(.custom-background-color).css(background-color, testimonialPageBackgroundColor); //set footer text color appropriately setFooterColor(testimonialPageBackgroundColor); } else { //set footer background color to white var white #FFFFFF; $(.custom-background-color).css(background-color, white); //set footer text color appropriately setFooterColor(white); } $(#HomePageNavigationLink).click(function(e){ $(html, body).animate({ scrollTop: 0 }, fast); }); $(.business-name).click(function(e){ $(html, body).animate({ scrollTop: 0 }, fast); }); $(.testimonialsBlurbMore).click(function(e){ $(html, body).animate({ scrollTop: 0 }, fast); }); $(#starRating).barrating({ theme: bootstrap-stars, deselectable: true, onSelect: function (value, text, event) { $(.br-widget).removeClass(error); $(.alert).alert(close); } }); if(numOfPosts > 0){ GetPostsData(0); } $(document).on(click, #nextPosts, function (e) { ScrollForPosts(e); GetPostsData(1); }); $(document).on(click, #prevPosts, function (e) { ScrollForPosts(e); GetPostsData(-1); }); $(document).on(click, #postReview, function (e) { e.preventDefault(); e.stopPropagation(); if (isSubmittingReview) { console.log(Review submission already in progress - blocking duplicate submission); return false; } var $button $(this); var $form $(#postReviewForm); var $modal $(#reviewFormSection); isSubmittingReview true; console.log(Starting review submission); setProcessingState($button, $form, true); var alertType success; if(validateReview(#postReview)) { console.log(Review validation passed); ShowLoading(); grecaptcha.ready(function() { grecaptcha.execute(6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH, {action: testimonial_review}).then(function(token) { $(#g-Recaptcha-Response-Review).attr(value, token); var rating null; var selectElement document.getElementById(starRating); var selectRating selectElement ? selectElement.value : null; var selectedOption $(#starRating option:selected).val(); var barRating null; var reviewerAlias $(#review_alias).val() || ; var reviewHeading $(#review_heading).val() || ; var antiForgeryToken $(inputname__RequestVerificationToken).val(); var recaptchaToken $(#g-Recaptcha-Response-Review).val(); var timeToPost $(#phoneNumber_alternative).val(); var reviewText $(#review).val() || ; var profileId 27219; console.log(Trying to get rating value...); var selectRating $(#starRating)0 ? $(#starRating)0.value : null; console.log(Select element direct value:, selectRating); var jqueryRating $(#starRating).val(); console.log(jQuery val() result:, jqueryRating, typeof jqueryRating); if (typeof $(#starRating).barrating function) { try { var barResult $(#starRating).barrating(show); if (barResult && typeof barResult string) { barRating barResult; } else if (barResult && typeof barResult number) { barRating barResult.toString(); } } catch (e) { console.log(Error getting barrating value:, e); } } var selectedOption $(#starRating option:selected).val(); console.log(Selected option value:, selectedOption); var jqueryResult $(#starRating).val(); var jqueryRating null; if (jqueryResult && typeof jqueryResult string) { jqueryRating jqueryResult; } else if (jqueryResult && typeof jqueryResult number) { jqueryRating jqueryResult.toString(); } if (barRating && barRating ! && barRating ! 0) { rating barRating; } else if (selectRating && selectRating ! && selectRating ! 0) { rating selectRating; } else if (selectedOption && selectedOption ! && selectedOption ! 0) { rating selectedOption; } else if (jqueryRating && jqueryRating ! && jqueryRating ! 0) { rating jqueryRating; } if (rating && typeof rating ! string) { console.log(WARNING: Rating is not a string, converting:, rating, typeof rating); rating String(rating); } if (rating && typeof rating object) { console.error(CRITICAL ERROR: Rating is still an object!, rating); rating null; } console.log(Validation check - rating found:, rating, typeof rating); console.log(Final rating value:, rating, typeof rating); console.log(Form values before sending:); console.log(- Review text:, reviewText); console.log(- Rating:, rating); console.log(- Profile ID:, profileId); console.log(- Reviewer alias:, reviewerAlias); console.log(- Review heading:, reviewHeading); console.log(- Anti-forgery token:, antiForgeryToken ? Present : Missing); // Build form data var formDataArray { name: profile_id, value: profileId }, { name: review, value: reviewText }, { name: review_rating, value: rating }, { name: reviewer_alias, value: reviewerAlias }, { name: review_heading, value: reviewHeading }, { name: __RequestVerificationToken, value: antiForgeryToken }, { name: g-Recaptcha-Response-Review, value: recaptchaToken }, { name: phoneNumber_alternative, value: timeToPost }, { name: _t, value: new Date().getTime() } ; var formData formDataArray .filter(item > item.value ! undefined && item.value ! null && item.value ! ) .map(item > encodeURIComponent(item.name) + + encodeURIComponent(item.value)) .join(&); console.log(Manual form data built:, formData); $.ajax({ url: /Home/ReviewPost, type: POST, data: formData, contentType: application/x-www-form-urlencoded; charsetUTF-8, dataType: json, success: function(data) { console.log(Review submission response:, data); if (!data.message || data.message.trim() ) { data.message data.success ? Thank you for your review! It has been submitted successfully. : There was an issue submitting your review. Please check all fields and try again.; } alertType data.success ? success : warning; if (!data.success) { recaptchaReviewIncomplete(); showClassicCaptcha(review); } $form.find(.alert).remove(); var alertHtml div classalert alert- + alertType + alert-dismissible rolealert> + button typebutton classclose data-dismissalert aria-labelClose> + span aria-hiddentrue>×/span>/button> + data.message + /div>; $form.prepend(alertHtml); $modal.find(.modal-body).scrollTop(0); if(alertType success) { // Auto-hide modal after showing success message setTimeout(function () { $modal.modal(hide); ClearReviewFields(); }, 3000); } // Fade out alert after delay setTimeout(function() { $form.find(.alert).fadeOut(500, function() { $(this).remove(); }); }, 6000); }, error: function(xhr, status, error) { console.error(AJAX Error:, status, error); console.error(Response Text:, xhr.responseText); $form.find(.alert).remove(); var errorHtml div classalert alert-danger alert-dismissible rolealert> + button typebutton classclose data-dismissalert aria-labelClose> + span aria-hiddentrue>×/span>/button> + An error occurred while submitting your review. Please try again./div>; $form.prepend(errorHtml); $modal.find(.modal-body).scrollTop(0); }, complete: function() { // Reset states console.log(Resetting processing state); setProcessingState($button, $form, false); HideLoading(); isSubmittingReview false; console.log(Review submission completed); } }); }).catch(function(error) { console.error(reCAPTCHA Error:, error); $form.find(.alert).remove(); var captchaErrorHtml div classalert alert-danger alert-dismissible rolealert> + button typebutton classclose data-dismissalert aria-labelClose> + span aria-hiddentrue>×/span>/button> + Security verification failed. Please refresh the page and try again./div>; $form.prepend(captchaErrorHtml); $modal.find(.modal-body).scrollTop(0); setProcessingState($button, $form, false); HideLoading(); isSubmittingReview false; }); }); } else { console.log(Review validation failed); var missingFields ; if (!$(#review).val() || $(#review).val().trim() ) { missingFields.push(review text); } var rating null; var selectRating $(#starRating)0 ? $(#starRating)0.value : null; var jqueryRating $(#starRating).val(); var selectedOption $(#starRating option:selected).val(); var barRating null; if (typeof $(#starRating).barrating function) { try { barRating $(#starRating).barrating(show); } catch (e) { // Ignore error } } if (barRating && barRating ! && barRating ! 0) { rating barRating; } else if (selectRating && selectRating ! && selectRating ! 0) { rating selectRating; } else if (selectedOption && selectedOption ! && selectedOption ! 0) { rating selectedOption; } else if (typeof jqueryRating string && jqueryRating ! && jqueryRating ! 0) { rating jqueryRating; } console.log(Validation check - rating found:, rating); if (!rating || rating || rating 0) { missingFields.push(rating); } var validationMessage Please fill out the following required fields: + missingFields.join( and ) + .; console.log(Validation message:, validationMessage); $form.find(.alert).remove(); var validationHtml div classalert alert-warning alert-dismissible rolealert> + button typebutton classclose data-dismissalert aria-labelClose> + span aria-hiddentrue>×/span>/button> + validationMessage + /div>; $form.prepend(validationHtml); $modal.find(.modal-body).scrollTop(0); setProcessingState($button, $form, false); isSubmittingReview false; return false; } }); $(#reviewFormSection).on(hidden.bs.modal, function () { console.log(Modal hidden - resetting submission state); isSubmittingReview false; setProcessingState($(#postReview), $(#postReviewForm), false); $(this).find(.alert).remove(); }); $(#reviewFormSection).on(show.bs.modal, function () { console.log(Modal shown - ensuring clean state); isSubmittingReview false; setProcessingState($(#postReview), $(#postReviewForm), false); $(#postReview).prop(disabled, false); $(#postReview).css(font-weight, bold); setTimeout(function () { console.log( STAR RATING DEBUG ); console.log(Star rating element:, $(#starRating)0); console.log(Star rating jQuery object:, $(#starRating)); console.log(Star rating direct value:, $(#starRating)0 ? $(#starRating)0.value : N/A); console.log(Star rating jQuery val():, $(#starRating).val()); console.log(Star rating selected option:, $(#starRating option:selected).val()); console.log(Barrating plugin available:, typeof $(#starRating).barrating function); if (typeof $(#starRating).barrating function) { try { console.log(Barrating current value:, $(#starRating).barrating(show)); } catch (e) { console.log(Error getting barrating value:, e); } } console.log( END STAR RATING DEBUG ); }, 100); }); // Prevent modal from closing during submission $(#reviewFormSection).on(hide.bs.modal, function (e) { if (isSubmittingReview) { console.log(Preventing modal close during submission); e.preventDefault(); return false; } }); $(a).on(click, function () { if (this.id ! undefined && this.id ! ) { gtag(event, Link Click, { event_category: analyticsCategory, event_label: this.id }); } }); $(#PhoneNav).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6 }); }); $(.phoneLinkInput).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-1 }); }); $(#contactPhoneLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-2 }); }); $(#contactPrimaryPhoneLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-3 }); }); $(#contactSecondaryPhoneLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-4 }); }); $(#contactMobilePhoneLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-5 }); }); $(#contactFaxPhoneLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-6 }); }); $(#contactTollfreePhoneLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessPhoneLinkTemplate6-7 }); }); $(#contactPhoneC1).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactPhoneLinkTemplate6-8 }); }); $(#contactPhoneC2).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactPhoneLinkTemplate6-9 }); }); $(#contactPhoneC3).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactPhoneLinkTemplate6-10 }); }); $(#contactPhoneC4).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactPhoneLinkTemplate6-11 }); }); $(#contactPhoneC5).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactPhoneLinkTemplate6-12 }); }); $(#contactEmail).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessEmailLinkTemplate6 }); }); $(#writeReviewBt).on(click, function () { gtag(event, Button Click, { event_category: analyticsCategory, event_label: WriteReviewButtonTemplate6 }); }); $(document).on(click, #postReview, function () { gtag(event, Button Click, { event_category: analyticsCategory, event_label: PostReviewButtonTemplate6 }); }); $(#nextReview).on(click, function () { gtag(event, Button Click, { event_category: analyticsCategory, event_label: ShowNextReviewsButtonTemplate6 }); }); $(#prevReview).on(click, function () { gtag(event, Button Click, { event_category: analyticsCategory, event_label: ShowPreviousReviewsButtonTemplate6 }); }); $(#google-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerGoogleSocialLinkTemplate6-1 }); }); $(#facebook-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerFacebookSocialLinkTemplate6-1 }); }); $(#yelp-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerYelpSocialLinkTemplate6-1 }); }); $(#twitter-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerTwitterSocialLinkTemplate6-1 }); }); $(#linkedin-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerLinkedinSocialLinkTemplate6-1 }); }); $(#instagram-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerInstagramSocialLinkTemplate6-1 }); }); $(#google-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerGoogleSocialLinkTemplate6-2 }); }); $(#facebook-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerFacebookSocialLinkTemplate6-2 }); }); $(#yelp-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerYelpSocialLinkTemplate6-2 }); }); $(#twitter-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerTwitterSocialLinkTemplate6-2 }); }); $(#linkedin-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerLinkedinSocialLinkTemplate6-2 }); }); $(#instagram-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerInstagramSocialLinkTemplate6-2 }); }); $(#contactEmailFooter).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerBusinessEmailLinkTemplate6-2 }); }); $(#btnContactPost).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactLeadPostTemplate6 }); }); $(#external-review-link).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerExternalReviewLinkTemplate6 }); }); $(#video).on(click, function () { gtag(event, Video Click, { event_category: analyticsCategory, event_label: CustomerVideoTemplate6 }); }); $(#website-social).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerWebsiteSocialLinkTemplate6-1 }); }); $(#website-social-footer).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerWebsiteSocialLinkTemplate6-2 }); }); $(#photos-image-element).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerWebsiteImageryPhotoTemplate6 }); }); $(#HomePageNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerHomePageNavLinkTemplate6 }); }); $(#ContactPageNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerContactPageNavLinkTemplate6 }); }); $(#PhotosNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerPhotosPageNavLinkTemplate6 }); }); $(#testimoinalsPageNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerTestimonialsPageNavLinkTemplate6 }); }); $(#ServicesPageNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerServicesPageNavLinkTemplate6 }); }); $(#AboutPageNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerAboutPageNavLinkTemplate6 }); }); $(#GSVPageNavigationLink).on(click, function () { gtag(event, Link Click, { event_category: analyticsCategory, event_label: CustomerGSVTourPageNavLinkTemplate3 }); }); //unable to directly track cross domain iFrame clicks. Track only first click on the iFrame itself var monitor setInterval(function () { var elem document.activeElement; if (elem && elem.tagName IFRAME && elem.id googleMapEmbed) { gtag(event, iFrame Click, { event_category: analyticsCategory, event_label: GoogleDirectionsTemplate6 }); clearInterval(monitor); } }, 1000); }); var servicesRendered false; var aboutRendered false; var testimonialsRendered false; var contactRendered false; var photosRendered false; var locationsRendered false; var gsvRendered false; var faqRendered false; function DisplayPage(page) { PauseVideoPlayer(); if (!$(page).hasClass(show)) { $(#pages div.collapse.show).collapse(hide); } $(page).collapse(show); if(page #homePage) { var carousel $(.slick-slider); if(carousel ! null) { carousel.slick(refresh); } } if (page #testimonialsPage) { // Load Testimonials via Ajax if not already loaded if (!testimonialsRendered) { ShowLoading(); $.get(/Home/GetTestimonialsContent, {id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#testimonialsPage).append(data); } }).always(function() { HideLoading(); testimonialsRendered true; GetReviewData(0); }); } $(html, body).animate({ scrollTop: 0 }, fast); } if (page #aboutPage) { // Load About via Ajax if not already loaded if (!aboutRendered) { ShowLoading(); $.get(/Home/GetAboutContent, { id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#aboutPage).append(data); $.getScript(https://maps.googleapis.com/maps/api/js?keyAIzaSyB2UoPWVWPR8WrIFK_zqJ5nTN1NvGm9dqY&callbackinitMap); } }).always(function() { HideLoading(); aboutRendered true; }); } } if (page #servicesPage) { // Load Services via Ajax if not already loaded if (!servicesRendered) { ShowLoading(); $.get(/Home/GetServicesContent, { id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#servicesPage).append(data); } }).always(function() { HideLoading(); servicesRendered true; }); } } if (page #imageryPage) { // Load photos via Ajax if not already loaded if (!photosRendered) { ShowLoading(); $.get(/Home/GetPhotosContent, { id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#imageryPage).append(data); } }).always(function() { HideLoading(); photosRendered true; }); } } if (page #contactPage) { // Load Contact via Ajax if not already loaded if (!contactRendered) { ShowLoading(); $.get(/Home/GetContactContent, { id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#contactPage).append(data); } }).always(function() { HideLoading(); contactRendered true; }); } } if (page #locationsPage) { // Load Locations via Ajax if not already loaded if (!locationsRendered) { ShowLoading(); $.get(/Home/GetLocationsContent, { id: 27219, template: Template_6 }, function (data) { if (data ! ) { $(#locationsPage).append(data); } }).always(function() { HideLoading(); locationsRendered true; }); } } if (page #gsvPage) { // Load GSV via Ajax if not already loaded if (!gsvRendered) { ShowLoading(); $.get(/Home/Get360TourContent, { id: 27219, template: Template_6}, function (data) { if (data ! ) { $(#gsvPage).append(data); } }).always(function() { HideLoading(); gsvRendered true; }); } } if (page #faqPage) { // Load Faqs via Ajax if not already loaded if (!faqRendered) { ShowLoading(); $.get(/Home/GetFAQContent, { id: 27219, template: Template_6 }, function (data) { if (data ! ) { $(#faqPage).append(data); } }).always(function () { HideLoading(); faqRendered true; }); } } } function nextReview() { ScrollForReviews(); GetReviewData(1); } function prevReview() { ScrollForReviews(); GetReviewData(-1); } function GetReviewData(i) { if(i ! 0){ ShowLoading(); } pageIndex pageIndex + i; $.get(/Home/GetEnhancedTestimonialReviewInfo, {id: 27219, pageIndex: pageIndex, pageSize: pageSize, notReputation: notReputation, file: _TemplateReviewContent}, function (data) { if (data ! ) { $(.reviewInfo).html(data); } }).always(function() { HideLoading(); }); SetPaginationButtons(); } function GetPostsData(i) { if(i ! 0){ ShowLoading(); } postsPageIndex postsPageIndex + i; $.get(/Home/GetTestimonialPostsInfo, {id: 27219, program_id: 11, profileDomain: https://fullmerlock.com/, subdomain: fullmerlock, testimonialSSL : False, domainSSL : True, pageIndex: postsPageIndex, pageSize: pageSize, file: _TestimonialPostsContent}, function (data) { if (data ! ) { $(.postsInfo).html(data); } }).always(function() { HideLoading(); }); SetPostsPaginationButtons(); } function GetPostsBanner() { ShowLoading(); var bannerObj null; $.ajax({ method: POST, url: /Home/GetPostBanner, data:JSON.stringify( { banner: bannerObj, testimonialPageColor: (false) ? transparent :, postsColor: #ffffff }), contentType: application/json, success: function (data) { if(isMobile || isTablet){ setTimeout(function(){ $(.home-content).prepend(data); }, 5000); } else{ $(.home-content).prepend(data); } //remove banner after 30 seconds regardless of mobile/tablet/desktop if (!keepPostUp) { setTimeout(function () { $(#posts-banner-alert).remove(); }, 30000); } } }).always(function() { HideLoading(); }); } function SetPaginationButtons() { //look ahead by one if(((pageIndex + 1) * pageSize) > numOfReviews){ $(#nextReview).hide(); } else{ $(#nextReview).show(); $(#nextReview).prop(disabled, false); } if(pageIndex 0) { pageIndex 0; $(#prevReview).hide(); } else if (pageIndex > 0){ $(#prevReview).show(); $(#prevReview).prop(disabled, false); } } function SetPostsPaginationButtons() { //look ahead by one if(((postsPageIndex + 1) * pageSize) > numOfPosts){ $(#nextPosts).hide(); } else{ $(#nextPosts).show(); $(#nextPosts).prop(disabled, false); } if(postsPageIndex 0) { postsPageIndex 0; $(#prevPosts).hide(); } else if (postsPageIndex > 0){ $(#prevPosts).show(); $(#prevPosts).prop(disabled, false); } } function ShowLoading() { $(#loadingImg).show(); } function HideLoading() { $(#loadingImg).hide(); } function checkMobile() { var windowsize $(window).width(); switch (true) { case /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent): isMobile true; break; case windowsize 800: isMobile true; break; default: isMobile false; } } function checkTablet() { var windowsize $(window).width(); switch (true) { case (windowsize > 800) && (windowsize 1200): isTablet true; break; default: isTablet false; } } function DisplayPhoto(imageUrl){ bootbox.alert({ message:img classimg-fluid d-block mx-auto src + imageUrl + />, size: large, backdrop: true, buttons: { ok: { className: btn-outline-dark, label: Close } } }); } function DisplayPhotoSlider(index){ if(!$(.slider-imagery).hasClass(slick-initialized)) { $(.slider-imagery).slick({ slidesToShow: 1, slidesToScroll: 1, arrows: true, fade: false, adaptiveHeight: false, infinite: true, useTransform: true, speed: 400, cssEase: cubic-bezier(0.77, 0, 0.18, 1), autoplay: true, }); } $(.slider-imagery).slick(slickGoTo, index); $(#carouselImageryPhotoModal).modal(show); } function DisplayVideoSlider(index) { if(!$(.slider-video).hasClass(slick-initialized)) { $(.slider-video).slick({ slidesToShow: 1, slidesToScroll: 1, arrows: true, fade: false, adaptiveHeight: false, infinite: true, useTransform: true, speed: 400, cssEase: cubic-bezier(0.77, 0, 0.18, 1), }); } PauseVideoPlayer(); //arrow onclick tracker var el document.querySelectorAll(.slick-arrow); for (var i 0; i el.length; i++) { eli.onclick function () { PauseVideoPlayer(); }; } $(.slider-video).slick(slickGoTo, index); $(#carouselImageryVideoModal).modal(show); } function PauseVideoPlayer() { var videos document.querySelectorAll(video); var iframes document.querySelectorAll(iframe); //mp4 Array.prototype.forEach.call(videos, video > { video.pause(); }); //youtube Array.prototype.forEach.call(iframes, iframe > { iframe.contentWindow.postMessage(JSON.stringify({ event: command, func: pauseVideo }), *); }); //wistia + vimeo Array.prototype.forEach.call(iframes, iframe > { iframe.contentWindow.postMessage(JSON.stringify({ method: pause, value: true }), *); }); } function setFooterColor(hexColor) { //set footer text color based on background color var r parseInt(hexColor.substr(1,2),16); var g parseInt(hexColor.substr(3,2),16); var b parseInt(hexColor.substr(5,2),16); var rgb ((r*299)+(g*587)+(b*114))/1000; var textColor (rgb > 128) ? black : white; //text needs to be black if(textColor black) { //set payment method icons if ($(.paymentType).hasClass(light)) { $(.paymentType).removeClass(light); $(.paymentType).remove(#paymentTypeLight); } if (!$(.paymentType).hasClass(dark)) { $(.paymentType).addClass(dark); $(.paymentType).remove(#paymentTypeLight); $(.paymentType).add(#paymentTypeDark); } } //text needs to be white else if(textColor white) { //mobile menu hamburger if ($(.navbar-toggler).hasClass(dark)) { $(.navbar-toggler).css(background-color, transparent); } if (!$(.navbar-toggler).hasClass(light)) { $(.navbar-toggler).css(background-color, white); } //set payment method icons if ($(.paymentType).hasClass(dark)) { $(.paymentType).removeClass(dark); $(.paymentType).remove(#paymentTypeDark); } if (!$(.paymentType).hasClass(light)) { $(.paymentType).addClass(light); $(.paymentType).remove(#paymentTypeDark); $(.paymentType).add(#paymentTypeLight); } } } function checkHashRoute() { 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) ) { DisplayPage(location.hash); } } function contactUsPost(event) { var _contactForm $(#ContactPostForm); // Clear previous validation states $(.validation-error-message).remove(); _contactForm.find(.validation-error).removeClass(validation-error); $(#contactResponseMessage).empty(); if (_contactForm0.checkValidity()) { contactUsSubmit(event); } else { var firstInvalidField null; _contactForm.find(inputrequired, textarearequired, selectrequired).each(function () { var $field $(this); if (!this.checkValidity()) { var fieldId $field.attr(id) || $field.attr(name); var fieldLabel getFieldLabel(fieldId); $field.addClass(validation-error); var errorMessage getCustomErrorMessage($field, fieldLabel); $field.after(`div classvalidation-error-message>${errorMessage}/div>`); if (!firstInvalidField) { firstInvalidField $field; } } }); // Focus first invalid field if (firstInvalidField) { firstInvalidField.focus(); } // Re-enable submit button $(#btnContactPost).prop(disabled, false); $(#btnContactPost).css(font-weight, bold); } } function getFieldLabel(fieldId) { var labels { contact_us_phone: Phone Number, contact_us_address: Address, contact_us_city: City, contact_us_state: State, contact_us_zip: ZIP Code, contact_us_subject: Subject, contact_us_name: Name, contact_us_email: Email, contact_us_message: Message }; return labelsfieldId || This field; } function getCustomErrorMessage($field, fieldLabel) { if ($field.prop(required) && !$field.val().trim()) { return `${fieldLabel} required`; } if ($field.attr(type) email && $field.val()) { return `Please enter a valid email address.`; } return `Please enter a valid ${fieldLabel.toLowerCase()}.`; } function contactUsSubmit(event) { event.preventDefault(); var form $(#ContactPostForm); grecaptcha.ready(function() { grecaptcha.execute(6LcokacUAAAAAH_snk3O5bpdYwjpC5XAuXNLrJLH, {action: contact_us}).then(function(token) { $(#g-Recaptcha-Response-Contact).attr(value, token); //add token for server side validation $.ajax({ type: POST, url: /Home/ContactPost, data: form.serialize(), success: function(data){ if (data.indexOf({message:) ! -1) { var jsonData $.parseJSON(data); if (!jsonData.success) { $(#contactResponseMessage).html(div classalert alert-warning alert-dissmisable rolealert>button typebutton classclose data-dismissalert aria-labelClose>span aria-hiddentrue>×/span>/button> + jsonData.message + /div>); recaptchaContactUsInComplete(); showClassicCaptcha(contact); } else{ $(#contactResponseMessage).html(div classalert alert-success alert-dissmisable rolealert>button typebutton classclose data-dismissalert aria-labelClose>span aria-hiddentrue>×/span>/button> + jsonData.message + /div>); recaptchaContactUsComplete(); } } } }); }); }); } function bgSlider() { var index 0; var opacity False; $imageEls $(.parallax .parallax-image); // Get the images to be cycled. setInterval(function () { // Get the next index. If at end, restart to the beginning. index index + 1 $imageEls.length ? index + 1 : 0; // Show the next if (opacity True) { $imageEls.eq(index).addClass(opacity); } else { $imageEls.eq(index).addClass(show); } // Hide the previous if (opacity True) { $imageEls.eq(index - 1).removeClass(opacity); } else { $imageEls.eq(index - 1).removeClass(show); } }, 5000); } function initializeCarousel(){ //https://codepen.io/dolce/pen/QarQde $(.slider-single).slick({ slidesToShow: 1, slidesToScroll: 1, arrows: true, fade: false, adaptiveHeight: false, infinite: true, useTransform: true, speed: 400, cssEase: cubic-bezier(0.77, 0, 0.18, 1), autoplay: true, }); $(.slider-nav) .on(init, function(event, slick) { $(.slider-nav .slick-slide.slick-current).addClass(is-active); }) .slick({ slidesToShow: 5, slidesToScroll: 5, dots: false, focusOnSelect: false, infinite: true, }); $(.slider-attributes) .on(init, function(event, slick) { $(.slider-attributes .slick-slide.slick-current).addClass(is-active); }) .slick({ slidesToShow: 3, slidesToScroll: 3, dots: false, focusOnSelect: false, infinite: true }); $(.slider-single).on(afterChange, function(event, slick, currentSlide) { $(.slider-nav).slick(slickGoTo, currentSlide); var currrentNavSlideElem .slider-nav .slick-slidedata-slick-index + currentSlide + ; $(.slider-nav .slick-slide.is-active).removeClass(is-active); $(currrentNavSlideElem).addClass(is-active); if (currentSlide > 6) { var m parseInt(currentSlide / 6); var d 6 * m; var currentAttributeSlide currentSlide - d; } else if (currentSlide > 3 && currentSlide 6) { var m parseInt(currentSlide / 3); var d 3 * m; var currentAttributeSlide currentSlide - d; } else { currentAttributeSlide currentSlide; } if (6 > 3) { $(.slider-attributes).slick(slickGoTo, currentAttributeSlide); var currrentNavAttributeSlideElem .slider-attributes .slick-slidedata-slick-index + currentAttributeSlide + ; $(.slider-attributes .slick-slide.is-active).removeClass(is-active); $(currrentNavAttributeSlideElem).addClass(is-active); } }); $(.slider-nav).on(click, .slick-slide, function(event) { event.preventDefault(); var goToSingleSlide $(this).data(slick-index); $(.slider-single).slick(slickGoTo, goToSingleSlide); }); $(.slider-attributes).on(click, .slick-slide, function(event) { event.preventDefault(); var goToSingleSlide $(this).data(slick-index); $(.slider-single).slick(slickGoTo, goToSingleSlide); }); } function ScrollForReviews(){ // target element var $id $(.review-partial-content); if ($id.length 0) { return; } // prevent standard hash navigation (avoid blinking in IE) //e.preventDefault(); // top position relative to the document var pos $id.offset().top - $(.navbar).height(); // animated top scrolling // .stop() keeps from scrolling to top then to element $(body, html).stop().animate({ scrollTop: pos }, 500); } function ScrollForPosts(e){ // target element var $id $(.posts-partial-content); if ($id.length 0) { return; } // prevent standard hash navigation (avoid blinking in IE) e.preventDefault(); // top position relative to the document var pos $id.offset().top - $(.navbar).height(); // animated top scrolling // .stop() keeps from scrolling to top then to element $(body, html).stop().animate({ scrollTop: pos }, 500); } function recaptchaContactUsInComplete(){ $(#btnContactPost).prop(disabled, false); $(#btnContactPost).css(font-weight, bold); } function recaptchaContactUsComplete() { $(#btnContactPost).prop(disabled, false); $(#btnContactPost).css(font-weight, normal); $(#ContactPostForm).trigger(reset); } function recaptchaReviewIncomplete(){ $(#postReview).prop(disabled, false); $(#postReview).css(font-weight, bold); } function recaptchaReviewComplete(){ $(#postReview).css(font-weight, normal); $(#postReviewForm).trigger(reset); $(#postReview).prop(disabled, false); } function showClassicCaptcha(type) { if(type review){ $(#classicCaptchaReview).show(); } else{ $(#classicCaptcha).show(); } } function ClearReviewFields() { $(#starRating).barrating(clear); $(#review).val(); $(#review_alias).val(); $(#review_heading).val(); $(#reviewCaptcha).val(); } function resetReviewButton($button) { var $buttonText $button.find(.button-text); var $spinner $button.find(.spinner); $button.prop(disabled, false); if ($buttonText.length && $spinner.length) { $buttonText.show(); $spinner.hide(); } else { var originalText $button.data(original-text); if (originalText) { $button.html(originalText); } } } function setProcessingState($button, $form, isProcessing) { var $buttonText $button.find(.button-text); var $spinner $button.find(.spinner); if (isProcessing) { $button.prop(disabled, true); $form.addClass(review-form-processing); $form.find(input, textarea, select).not(#profile_id, #g-Recaptcha-Response-Review, typehidden).prop(disabled, true); if ($buttonText.length && $spinner.length) { $buttonText.hide(); $spinner.show(); } else { $button.data(original-text, $button.html()); $button.html(i classfas fa-spinner fa-spin>/i> Processing...); } } else { $button.prop(disabled, false); $form.removeClass(review-form-processing); $form.find(input, textarea, select).prop(disabled, false); if ($buttonText.length && $spinner.length) { $buttonText.show(); $spinner.hide(); } else { var originalText $button.data(original-text); if (originalText) { $button.html(originalText); } } } } function ClearReviewFields() { console.log(Clearing review fields); $(#starRating).barrating(clear); $(#review).val(); $(#review_alias).val(); $(#review_heading).val(); $(#reviewCaptcha).val(); $(#postReviewForm input, #postReviewForm textarea).removeClass(error); $(#postReviewForm .br-widget).removeClass(error); } function validateReview(btn) { var $form $(#postReviewForm); var isValid true; console.log(Starting validation...); $form.find(input, textarea).removeClass(error); $form.find(.br-widget).removeClass(error); var reviewText $(#review).val(); console.log(Review text length:, reviewText ? reviewText.trim().length : 0); if (!reviewText || reviewText.trim().length 0) { console.log(Review text validation failed - empty or whitespace only); $(#review).addClass(error); $(#review).focus(); isValid false; } else { console.log(Review text validation passed); } var rating null; var selectRating $(#starRating)0 ? $(#starRating)0.value : null; var jqueryRating $(#starRating).val(); var selectedOption $(#starRating option:selected).val(); var barRating null; if (typeof $(#starRating).barrating function) { try { var barResult $(#starRating).barrating(show); if (barResult && typeof barResult string) { barRating barResult; } else if (barResult && typeof barResult number) { barRating barResult.toString(); } } catch (e) { console.log(Error getting barrating value:, e); } } if (jqueryRating && typeof jqueryRating string) { } else if (jqueryRating && typeof jqueryRating number) { jqueryRating jqueryRating.toString(); } else { jqueryRating null; } if (barRating && barRating ! && barRating ! 0) { rating barRating; } else if (selectRating && selectRating ! && selectRating ! 0) { rating selectRating; } else if (selectedOption && selectedOption ! && selectedOption ! 0) { rating selectedOption; } else if (jqueryRating && jqueryRating ! && jqueryRating ! 0) { rating jqueryRating; } if (rating && typeof rating ! string) { console.log(WARNING: Rating is not a string, converting:, rating, typeof rating); rating String(rating); } if (rating && typeof rating object) { console.error(CRITICAL ERROR: Rating is still an object!, rating); rating null; } console.log(Validation - Final rating value:, rating, typeof rating); if (!rating || rating || rating 0) { console.log(Rating validation failed); $(.br-widget).addClass(error); isValid false; } else { console.log(Rating validation passed with value:, rating); } console.log(Validation result:, isValid); return isValid; } function validateReviewLength() { var text $(#review).val(); var success true; if ($.trim(text).length 0) { $(#review).addClass(error); success false; } return success; } function validateRating() { var rating null; // Use the same rating detection logic var selectRating $(#starRating)0 ? $(#starRating)0.value : null; var jqueryRating $(#starRating).val(); var selectedOption $(#starRating option:selected).val(); var barRating null; if (typeof $(#starRating).barrating function) { try { barRating $(#starRating).barrating(show); } catch (e) { console.log(Error getting barrating value in validateRating:, e); } } // Determine which rating to use if (barRating && barRating ! && barRating ! 0) { rating barRating; } else if (selectRating && selectRating ! && selectRating ! 0) { rating selectRating; } else if (selectedOption && selectedOption ! && selectedOption ! 0) { rating selectedOption; } else if (typeof jqueryRating string && jqueryRating ! && jqueryRating ! 0) { rating jqueryRating; } var success true; if (!rating || rating || rating 0) { $(.br-widget).addClass(error); success false; } return success; }/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]