1<!doctype html><html lang="en-US" prefix="og: https://ogp.me/ns#"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="profile" href="https://gmpg.org/xfn/11"><link media="all" href="https://mountainbouncers.com/wp-content/cache/autoptimize/css/autoptimize_e0877e244e6fe5e6a5a1b0a87ca46e9c.css" rel="stylesheet"><title>Mountain Bouncers LLC - Party Rental and Bounce House Rental</title><meta name="description" content="Quality inflatable and Event Tent Rentals. We have a large selection of clean equipment. We offer Bounce houses, waterslides and obstacles."/><meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/><link rel="canonical" href="https://mountainbouncers.com/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="website" /><meta property="og:title" content="Mountain Bouncers LLC - Party Rental and Bounce House Rental" /><meta property="og:description" content="Quality inflatable and Event Tent Rentals. We have a large selection of clean equipment. We offer Bounce houses, waterslides and obstacles." /><meta property="og:url" content="https://mountainbouncers.com/" /><meta property="og:site_name" content="Mountain Bouncers" /><meta property="og:updated_time" content="2026-02-21T22:31:10+00:00" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Mountain Bouncers LLC - Party Rental and Bounce House Rental" /><meta name="twitter:description" content="Quality inflatable and Event Tent Rentals. We have a large selection of clean equipment. We offer Bounce houses, waterslides and obstacles." /><meta name="twitter:label1" content="Written by" /><meta name="twitter:data1" content="io" /><meta name="twitter:label2" content="Time to read" /><meta name="twitter:data2" content="3 minutes" />
1<script type="application/ld+json" class="rank-math-schema">{"@context":"https://schema.org","@graph":[{"@type":"Place","@id":"https://mountainbouncers.com/#place","address":{"@type":"PostalAddress","streetAddress":"852 Boardman Hill Rd","addressLocality":"West Rutland","addressRegion":"Vermont","postalCode":"05777","addressCountry":"United States"}},{"@type":"Organization","@id":"https://mountainbouncers.com/#organization","name":"Mountain Bouncers","url":"https://mountainbouncers.com","email":"[email protected]","address":{"@type":"PostalAddress","streetAddress":"852 Boardman Hill Rd","addressLocality":"West Rutland","addressRegion":"Vermont","postalCode":"05777","addressCountry":"United States"},"logo":{"@type":"ImageObject","@id":"https://mountainbouncers.com/#logo","url":"https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background.png","contentUrl":"https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background.png","caption":"Mountain Bouncers","inLanguage":"en-US","width":"1261","height":"1339"},"contactPoint":[{"@type":"ContactPoint","telephone":"802-353-2201","contactType":"customer support"}],"description":"Located in Rutland County, Vermont. We provide great service and top quality Bounce houses, Obstacle courses, Combo units, Water slides, Slip and slides, event Tents, tables and chairs for weddings, corporate events, schools, and church events as well as back yard birthday parties. We are your one stop shop for all your party needs! Fully Insured ","location":{"@id":"https://mountainbouncers.com/#place"}},{"@type":"WebSite","@id":"https://mountainbouncers.com/#website","url":"https://mountainbouncers.com","name":"Mountain Bouncers","publisher":{"@id":"https://mountainbouncers.com/#organization"},"inLanguage":"en-US","potentialAction":{"@type":"SearchAction","target":"https://mountainbouncers.com/?s={search_term_string}","query-input":"required name=search_term_string"}},{"@type":"ImageObject","@id":"https://mountainbouncers.com/wp-content/uploads/2020/01/clean-shield.png","url":"https://mountainbouncers.com/wp-content/uploads/2020/01/clean-shield.png","width":"200","height":"200","inLanguage":"en-US"},{"@type":"WebPage","@id":"https://mountainbouncers.com/#webpage","url":"https://mountainbouncers.com/","name":"Mountain Bouncers LLC - Party Rental and Bounce House Rental","datePublished":"2020-01-28T15:14:48+00:00","dateModified":"2026-02-21T22:31:10+00:00","about":{"@id":"https://mountainbouncers.com/#organization"},"isPartOf":{"@id":"https://mountainbouncers.com/#website"},"primaryImageOfPage":{"@id":"https://mountainbouncers.com/wp-content/uploads/2020/01/clean-shield.png"},"inLanguage":"en-US"},{"@type":"Service","name":"Mountain Bouncers LLC - Party Rental and Bounce House Rental","description":"Quality inflatable and Event Tent Rentals. We have a large selection of clean equipment. We offer Bounce houses, waterslides and obstacles.","serviceType":"Bounce House Rental","offers":{"@type":"Offer","availability":"InStock"},"image":{"@id":"https://mountainbouncers.com/wp-content/uploads/2020/01/clean-shield.png"},"@id":"https://mountainbouncers.com/#schema-20673","mainEntityOfPage":{"@id":"https://mountainbouncers.com/#webpage"}}]}</script>
1 <link rel='dns-prefetch' href='//cdnjs.cloudflare.com' /><link rel="alternate" type="application/rss+xml" title="Mountain Bouncers LLC » Feed" href="https://mountainbouncers.com/feed/" /><link rel="alternate" type="application/rss+xml" title="Mountain Bouncers LLC » Comments Feed" href="https://mountainbouncers.com/comments/feed/" /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://mountainbouncers.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmountainbouncers.com%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://mountainbouncers.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmountainbouncers.com%2F&format=xml" /><style id="wp-img-auto-sizes-contain-inline-css">img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 2/*# sourceURL=wp-img-auto-sizes-contain-inline-css */</style><style id="classic-theme-styles-inline-css">/*! This file is auto-generated */ 3.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 4/*# sourceURL=/wp-includes/css/classic-themes.min.css */</style><style id="global-styles-inline-css">:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
4--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
4.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 5:root :where(.wp-block-icon svg){width: 24px;} 6:where(.wp-block-gallery.is-layout-flex){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}:where(.wp-block-gallery.is-layout-grid){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );} 7:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;} 8:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} 9:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;} 10:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} 11:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} 12/*# sourceURL=global-styles-inline-css */</style><link rel='stylesheet' id='slick-carousel-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css?ver=7.1.2' media='all' /><link rel='stylesheet' id='slick-carousel-theme-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css?ver=7.1.2' media='all' />
12<script id="jquery-core-js" src="https://mountainbouncers.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
12
12<script id="io-scripts-js-extra">var io_scripts_vars = {"io_username":"Mountainbouncers","io_locationid":"0","io_phonenumber":"(802) 353-2201","io_emailaddress":"[email protected]","io_businesshours":"","io_facebooklink":"https://www.facebook.com/","io_twitterlink":"https://twitter.com/","io_instagramlink":"https://www.instagram.com/","io_youtubelink":"","io_fpnumber":"","io_companyname":"Mountain Bouncers LLC"}; 13//# sourceURL=io-scripts-js-extra</script>
13 <link rel="https://api.w.org/" href="https://mountainbouncers.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://mountainbouncers.com/wp-json/wp/v2/pages/109" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://mountainbouncers.com/xmlrpc.php?rsd" /><link rel='shortlink' href='https://mountainbouncers.com/' />
13<script id='pixel-script-poptin' src='https://cdn.popt.in/pixel.js?id=4a9cd5def0446' async='true'></script>
vendor: 66 bytes, lines 13-14
13 14 <script async src="https://www.googletagmanager.com/gtag/js?id=
14G-E4EZ30Y6RJ
vendor: 12 bytes, line 14
14"></script>
14<script>
vendor: 134 bytes, lines 14-18
14window.dataLayer = window.dataLayer || []; 15 function gtag(){dataLayer.push(arguments);} 16 gtag('js', new Date()); 17 18 gtag('config', '
18G-E4EZ30Y6RJ
vendor: 3 bytes, line 18
18');
18</script>
18
18<script type="text/javascript">(function () { 19 var s = document.createElement("script"), 20 h = document.head; 21 s.async = 1; 22 s.src = "https://monitor.fraudblocker.com/fbt.js?sid=ArdksP218ytzgjUF3ea03"; 23 h.appendChild(s); 24 })();</script>
24 <noscript> <a href="https://fraudblocker.com" rel="nofollow"> <img src="https://monitor.fraudblocker.com/fbt.gif?sid=ArdksP218ytzgjUF3ea03" alt="Fraud Blocker" /> </a> </noscript><meta name="ti-site-data" content="eyJyIjoiMTowITc6MCEzMDowIiwibyI6Imh0dHBzOlwvXC9tb3VudGFpbmJvdW5jZXJzLmNvbT90aS1vbmxpbmUtdXNlcnMtZ29vZ2xlPTEmYW1wO3A9JTJGJmFtcDtfd3Bub25jZT0yMTFlNjgzYTUxIn0=" /><meta name="generator" content="Elementor 4.3.4; features: additional_custom_breakpoints; settings: css_print_method-external, google_font-enabled, font_display-auto"><style>.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload), 25 .e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * { 26 background-image: none !important; 27 } 28 @media screen and (max-height: 1024px) { 29 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload), 30 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * { 31 background-image: none !important; 32 } 33 } 34 @media screen and (max-height: 640px) { 35 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload), 36 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * { 37 background-image: none !important; 38 } 39 }</style><link rel="shortcut icon" type="image/x-icon" href="data:image/gif;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA4dLCAN3UxQDe1MUAmTgrANvTyADVy8YA1NPJAJY1LADd0cYA3dXDAIssJQB/IB4AAontALS1tADJcUAA3dLEANrRxwDe0sQA29HHANzLvwDX1McA39LEANjUxwC7u7wACcLiAAKJ7gChPzIA1tbCAMlyPgA6OTcA3dLFANnVxQAZc+EAljUuAMzSxgBJRkQAfSAgANnSxgDb0sYA19HJANDOuQAwMDEA19DEANjQxAAODg4AynM9ANbWxADb08QA19LHAIorIwAFo68A1M7CAAHAygDT0csACGhuANfPwADL0tEA3dLIAOHTxQDIcTwAnDYuAMlwPwDa0MYAiYJ7ANDRzAACydMAmJWQAAhjbQDh1MQAmDctAMhyOwC0r6oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA7FQoKMhsLBQIDOgcAAAAkQxhBIwsbCzY5DkAeAAAAACpENRkNGhpCMzctAAAAAAA9LgAGAAAAFwAuRgAAAAAABA8ANAAAACAALkYAAAAAAEYdADEAAAASAC5GAAAAAABGPjgTAAAAFhYuRgAAAAAlCDwrLAAAACYWLkYlAAAADCJHPyYoACgJFi5GJQAAAC9FKRwnJiYmJhEUHwEAAABIAkgASABIAEgASDBIAAAAAEgAAAAAAAAAAABIAAAAAAAhAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAAwAEAAMABAADgAwAA5dMAAOXTAADl0wAA4cMAAMHBAADAgQAAwAEAAMVRAADv+wAA7/sAAP//AAA=" /><style id="wp-custom-css">.grecaptcha-badge { visibility: hidden; } 40 41.search-submit{display:none;} 42 43.cartInfo{ 44 display:none !important; 45} 46.io-footer-link a { 47color: var(--e-global-color-accent, orange); 48} 49 50.catDescriptionIO.catDescriptionIO_small.elementor-widget-text-editor { 51 padding: 10px; 52 font-size: small; 53 text-align: left; 54}</style></head><body class="home wp-singular page-template-default page page-id-109 wp-custom-logo wp-theme-io-kenos mega-menu-max-mega-menu-4 mega-menu-max-mega-menu-5 mega-menu-max-mega-menu-6 mega-menu-max-mega-menu-7 mega-menu-max-mega-menu-8 elementor-default elementor-kit-812 elementor-page elementor-page-109"><header data-elementor-type="header" data-elementor-id="216" class="elementor elementor-216 elementor-location-header" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-4583e055 elementor-section-full_width io_header elementor-section-height-default elementor-section-height-default" data-id="4583e055" data-element_type="section" data-e-type="section" id="top" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3be5d860" data-id="3be5d860" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><section class="elementor-section elementor-inner-section elementor-element elementor-element-647eb66f elementor-section-height-min-height elementor-section-boxed elementor-section-height-default" data-id="647eb66f" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic","sticky":"top","sticky_on":["desktop","tablet","mobile"],"sticky_offset":0,"sticky_effects_offset":0,"sticky_anchor_link_offset":0}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-9b7ab34" data-id="9b7ab34" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1271c4a7 elementor-widget elementor-widget-theme-site-logo elementor-widget-image" data-id="1271c4a7" data-element_type="widget" data-e-type="widget" data-widget_type="theme-site-logo.default"><div class="elementor-widget-container"> <a href="https://mountainbouncers.com"> <img fetchpriority="high" width="283" height="300" src="https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Backgroun
54d-283x300.png" class="elementor-animation-grow attachment-medium size-medium wp-image-4154" alt="" srcset="https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background-283x300.png 283w, https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background-964x1024.png 964w, https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background-768x816.png 768w, https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background.png 1261w" sizes="(max-width: 283px) 100vw, 283px" /> </a></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-107d6899" data-id="107d6899" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-61337d5b elementor-widget elementor-widget-wp-widget-maxmegamenu" data-id="61337d5b" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-maxmegamenu.default"><div class="elementor-widget-container"><div id="mega-menu-wrap-max_mega_menu_4" class="mega-menu-wrap"><div class="mega-menu-toggle"><div class="mega-toggle-blocks-left"></div><div class="mega-toggle-blocks-center"><div class='mega-toggle-block mega-menu-toggle-block mega-toggle-block-1' id='mega-toggle-block-1'><span aria-expanded="false" aria-haspopup="true" role="button" class='mega-toggle-label'><span class='mega-toggle-label-closed'></span><span class='mega-toggle-label-open'></span></span></div></div><div class="mega-toggle-blocks-right"></div></div><ul id="mega-menu-max_mega_menu_4" class="mega-menu max-mega-menu mega-menu-horizontal mega-no-js" data-event="hover_intent" data-effect="fade_up" data-effect-speed="200" data-effect-mobile="disabled" data-effect-speed-mobile="0" data-mobile-force-width="body" data-second-click="go" data-document-click="collapse" data-vertical-behaviour="standard" data-breakpoint="600" data-unbind="true" data-mobile-state="collapse_all" data-mobile-direction="vertical"><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-megamenu mega-menu-item-has-children mega-align-bottom-left mega-menu-item-806" id="mega-menu-item-806"><a class="mega-menu-link" href="https://mountainbouncers.com/rentals/" aria-expanded="false" aria-controls="mega-sub-menu-806">Inventory<span class="mega-indicator" aria-hidden="true"></span></a><ul class="mega-sub-menu" id='mega-sub-menu-806'><li class="mega-menu-item mega-menu-item-type-widget widget_widget_featured mega-menu-column-standard mega-menu-columns-6-of-6 mega-menu-item-widget_featured-2" style="--columns:6; --span:6" id="mega-menu-item-widget_featured-2"><div class="widget-text wp_widget_plugin_box panel-grid panel-has-style" style="margin-top:0px;">
54<script>jQuery(document).ready(function(){ 55 jQuery('.io_mm_item .io_item2_list').css('box-shadow', 'none') 56 jQuery('.io_mm_item .io_item2_list').addClass('nohover') 57 58 jQuery('.io_mm_item .io_item2_listcat').css('box-shadow', 'none') 59 jQuery('.io_mm_item .io_item2_listcat').addClass('nohover') 60 })</script>
60<div class="io_mm_outer io_widget_ " style="grid-template-columns:repeat(4, calc((100% - 45px)/4)); display:grid;"><style>.io_widget_ .io_item2_list_inner .rentNameIO_button {display:none !important;} .io_widget_ .io_item2_list_inner .rentNameIO_price {display:none !important;} .io_widget_ .io_item2_list .view-product-button {display:none !important;} .io_widget_ .io_item2_listcat .view-product-button {display:none !important;} .io_widget_ .io_item2_listcat .catDescriptionIO {display:none;}</style><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/slide-combos/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000d89471fdacd403a109717a64_1771703468_big.png" alt="Slide Combos" title="Slide Combos" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/slide-combos/"><p class="rentNameIO elementor-heading-title">Slide Combos</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Inflatable bounce house combos are great for getting energy out. A few of these combo bouncers come with things like a basketball hoop or water slide constructed right in with a bounce space! We specialize in bounce houses rentals and would be delighted to help you with your party needs.<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/water/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_0000000001bc71fd966394299984a30c_1771703490_big.png" alt="Waterslides" title="Waterslides" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/water/"><p class="rentNameIO elementor-heading-title">Waterslides</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><div style='display: block; width: 603.203px; margin: 50px auto auto; text-align: left; background: rgba(0, 0, 0, 0.03); border-radius: 6px; color: rgb(0, 0, 0); font-family: "Open Sans", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;'><div style="overflow-x: auto; min-height: 30px;"><div style="font-size: 1px; page-break-after: always; height: 1px; background-color: rgb(192, 192, 192);" contenteditable="false" title="Page Break"></div></div></div></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/obstacle-course/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000027c71fda291d9f17dce058e_1771704298_big.png" alt="Obstacle Course" title="Obstacle Course" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/obstacle-course/"><p class="rentNameIO elementor-heading-title">Obstacle Course</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Large inflatable slides are available to be rented from us, as can inflatable play areas. Obstacle course inflatables offer greater interaction and are an enjoyable way for children to race each other and to get lots of energy.<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/bouncy-houses/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000cec871fd930c0cf670a7e652_1771708685_big.png" alt="Bouncy Houses" title="Bouncy Houses" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/bouncy-houses/"><p class="rentNameIO elementor-heading-title">Bouncy Houses</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Inflatable bounce houses are great for getting some energy out. We also offer combination bouncers that have things like a basketball hoop or slide built right inside with a bounce space! We are specialists in renting bounce houses and are able to be adapted to any occasion.<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/toddler-bouncers/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000065871fd838c0a4c2e8cb526_1771708701_big.png" alt="Toddler Bouncers!!" title="Toddler Bouncers!!" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/toddler-bouncers/"><p class="rentNameIO elementor-heading-title">Toddler Bouncers!!</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Rides for young kids that are safe and enjoyable. Kids will be thrilled by these small toddler bounce house rentals as well as the fun playland. <p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/equipment/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_0000000044d071fd8f3f1afd0df4fea0_1771709431_big.png" alt="Equipment" title="Equipment" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/equipment/"><p class="rentNameIO elementor-heading-title">Equipment</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">If you're planning to hold your party in the park or at another location without electricity then you will require a generator for powering the units. The generator we offer is powerful and sturdy.</div> </a></div></div></div></div></div><style>.io_mm_item .io_item2_list, .io_mm_item .io_item2_listcat, .io_mm_item .io_item2_listrent { margin-bottom: 0px !important; }</style></li></ul></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-494" id="mega-menu-item-494"><a class="mega-menu-link" href="https://mountainbouncers.com/about-us/" aria-expanded="false" aria-controls="mega-sub-menu-494">About Us<span class="mega-indicator" aria-hidden="true"></span></a><ul class="mega-sub-menu" id='mega-sub-menu-494'><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-493" id="mega-menu-item-493"><a class="mega-menu-link" href="https://mountainbouncers.com/faqs/">FAQs</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-3296" id="mega-menu-item-3296"><a class="mega-menu-link" href="https://mountainbouncers.com/contact-us/">Contact Us</a></li></ul></li></ul></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-71a780ec" data-id="71a780ec" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-69e5dc1d ioCart elementor-view-default elementor-widget elementor-widget-icon" data-id="69e5dc1d" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default"><div class="elementor-widget-container"><div class="elementor-icon-wrapper"><div class="elementor-icon"> <i aria-hidden="true" class="fas fa-shopping-cart"></i></div></div></div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-48094f7b elementor-section-content-mid
60dle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="48094f7b" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-20ce0d9f" data-id="20ce0d9f" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-85cc792 elementor-icon-list--layout-inline elementor-mobile-align-start elementor-tablet-align-center elementor-hidden-mobile elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="85cc792" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:(802)%20353-2201"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">(802) 353-2201</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="mailto:[email protected]"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-envelope"></i> </span> <span class="elementor-icon-list-text">[email protected]</span> </a></li></ul></div></div><div class="elementor-element elementor-element-c914423 elementor-icon-list--layout-inline elementor-mobile-align-center elementor-tablet-align-center elementor-hidden-desktop elementor-hidden-tablet elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="c914423" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:(802)%20353-2201"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text"></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="mailto:[email protected]"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-envelope"></i> </span> <span class="elementor-icon-list-text"></span> </a></li></ul></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-f53ace8" data-id="f53ace8" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-104f03e0 elementor-align-left elementor-mobile-align-center elementor-tablet-align-center elementor-widget elementor-widget-button" data-id="104f03e0" data-element_type="widget" data-e-type="widget" data-widget_type="button.default"><div class="elementor-widget-container"><div class="elementor-button-wrapper"> <a class="elementor-button elementor-button-link elementor-size-xs elementor-animation-grow" href="https://mountainbouncers.com/io_quoteform/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Check Availability! </span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-3e1fff3b elementor-hidden-mobile" data-id="3e1fff3b" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1955476e elementor-widget elementor-widget-wp-widget-searchio_live_search" data-id="1955476e" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-searchio_live_search.default"><div class="elementor-widget-container"><form role="search" method="get" class="searchio-live-search-widget-search-form" action="https://mountainbouncers.com"> <label> <span class="screen-reader-text">Search for:</span> <input type="search" class="search-field" style="width: 220px" placeholder="Search for..." value="" name="s" data-swplive="true" data-swpengine="default" data-swpconfig="default" autocomplete="off"> </label> <input type="submit" class="search-submit" style="display:none;" value="Search"></form></div></div></div></div></div></section></div></div></div></section></header><main id="main" class="site-main" role="main"><header class="page-header io_phshow"><div class ="elementor-widget-heading"></div></header><div class="page-content"><div data-elementor-type="wp-page" data-elementor-id="109" class="elementor elementor-109" data-elementor-post-type="page"><section class="elementor-section elementor-top-section elementor-element elementor-element-8b28e81 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8b28e81" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-16c65b7f" data-id="16c65b7f" data-element_type="column" data-e-type="column" data-settings="{"background_background":"gradient"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-background-overlay"></div><div class="elementor-element elementor-element-1cf940dc elementor-invisible elementor-widget elementor-widget-heading" data-id="1cf940dc" data-element_type="widget" data-e-type="widget" data-settings="{"_animation":"bounceIn"}" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-large">let's bounce!</h2></div></div><div class="elementor-element elementor-element-136f0895 elementor-widget elementor-widget-heading" data-id="136f0895" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-large">Your Premium Bounce house and party rental company of Vermont and New York. proudly Serving rutland county,windsor county,warren county,washington County,essex county & addison county<br>802-353-2201</h2></div></div><div class="elementor-element elementor-element-2b674f21 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="2b674f21" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default"><div class="elementor-widget-container"><div class="elementor-divider"> <span class="elementor-divider-separator"> </span></div></div></div><div class="elementor-element elementor-element-e31b9a0 elementor-headline--style-rotate elementor-hidden-tablet elementor-hidden-phone elementor-widget elementor-widget-animated-headline" data-id="e31b9a0" data-element_type="widget" data-e-type="widget" data-settings="{"rotating_text":"bounce house\nFUN!","headline_style":"rotate","animation_type":"typing","loop":"yes","rotate_iteration_delay":2500}" data-widget_type="animated-headline.default"><div class="elementor-widget-container"><p class="elementor-headline elementor-headline-animation-type-typing elementor-headline-letters"> <span class="elementor-headline-plain-text elementor-headline-text-wrapper">We are your</span> <span class="elementor-headline-dynamic-wrapper elementor-headline-text-wrapper"> <span class="elementor-headline-dynamic-text elementor-headline-text-active"> bounce house </span> <span class="elementor-headline-dynamic-text"> FUN! </span> </span> <span class="elementor-headline-plain-text elementor-headline-text-wrapper">specialists of Rutland County and surrounding areas</span></p></div></div><div class="elementor-element elementor-element-1e42bbfd elementor-align-center elementor-widget elementor-widget-button" data-id="1e42bbfd" data-element_type="widget" data-e-type="widget" data-widget_type="button.default"><div class="elementor-widget-container"><div class="elementor-button-wrapper"> <a class="elementor-button elementor-button-link elementor-size-xl elementor-animation-grow" href="https://mountainbouncers.com/io_quoteform"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Check Availability </span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-8c7e9c8 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8c7e9c8" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e20211" data-id="3e20211" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-46cc769 elementor-widget elementor-widget-text-editor" data-id="46cc769" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><h1>We are your Insured go-to for inflatable, bounce house, and party tent rentals.</h1></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-930b031 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="930b031" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bfce6e0" data-id="bfce6e0" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-cac7d04 elementor-widget elementor-widget-shortcode" data-id="cac7d04" data-element_type="widget" data-e-type="widget" data-widget_type="shortcode.default"><div class="elementor-widget-container"><div class="elementor-shortcode"><link data-noptimize="1" data-no-optimize="1" data-no-minify="1" data-no-defer="1" rel="stylesheet" href="https://mountainbouncers.com/wp-content/cache/autoptimize/css/autoptimize_single_869e167c0d240398162ceaa60fc74b32.css?1787140082" media="all"><pre class="ti-widget"><div style="opacity: 0;height: 0 !important;overflow: hidden !important" data-css-url="https://mountainbouncers.com/wp-content/uploads/trustindex-google-widget.css?1787140082" class=" ti-widget ti-goog ti-review-text-mode-readmore ti-text-align-left" data-no-translation="true" data-time-locale="%d %s ago|today|day|days|week|weeks|month|months|year|years" data-plugin-version="14.2" data-layout-id="5" data-layout-category="slider" data-set-id="light-background" data-pid="wp-widget" data-language="en" data-close-locale="Close" data-review-target-width="275" data-css-version="2" data-reply-by-locale="Owner's reply" data-only-rating-locale="This user only left a rating." data-pager-autoplay-timeout="6"> <div class="ti-widget-container ti-col-4"> <div class="ti-footer ti-footer-grid source-Google"> <div class="ti-fade-container"> <div class="ti-rating-text"> <strong class="ti-rating ti-rating-large"> EXCELLENT </strong> </div> <span class="ti-stars star-lg"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" /></span> <div class="ti-rating-text"> <span class="nowrap">Based on <strong>122 reviews</strong></span> </div> <div class="ti-large-logo"> <div class="ti-v-center"> <img loading="lazy" decoding="async" class="ti-logo-fb skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/logo.svg" width="150" height="25" loading="lazy" alt="Google" /> </div> </div> </div> </div> <div class="ti-reviews-container"> <div class="ti-controls"> <div class="ti-next" aria-label="Next review" role="button" tabindex="0"></div> <div class="ti-prev" aria-label="Previous review" role="button" tabindex="0"></div> </div> <div class="ti-reviews-container-wrapper"> <div data-empty="0" data-time="1767052800" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfc
60d208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a/ACg8ocKkCUqewkzJdwJ2qFm783pRycA2Bt49GHdyJmnSZGrbK0LeyA=w40-h40-c-rp-mo-ba3-br100" srcset="https://lh3.googleusercontent.com/a/ACg8ocKkCUqewkzJdwJ2qFm783pRycA2Bt49GHdyJmnSZGrbK0LeyA=w80-h80-c-rp-mo-ba3-br100 2x" alt="Jonathan Studley profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Jonathan Studley </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" /><span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">I’m grateful that they were able to accommodate my company on short notice. Great customer service, all products in great condition.</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1764633600" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a/ACg8ocKMvbFYrvQ0oQOZRLtQ8Jrc0yzOTfh5uxG4ekRxPas22CiNiw=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a/ACg8ocKMvbFYrvQ0oQOZRLtQ8Jrc0yzOTfh5uxG4ekRxPas22CiNiw=w80-h80-c-rp-mo-br100 2x" alt="Brittany Pratt profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Brittany Pratt </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" />
60<span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">Good quality rentals, kind, respectful, helpful employee's, and they deliver/pick up! Happy we found them.</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1763424000" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a/ACg8ocIA-ihQZz0gtu9G5y1AX8GIBYpjr3YPjDTV5SQ1-TjwgApySA=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a/ACg8ocIA-ihQZz0gtu9G5y1AX8GIBYpjr3YPjDTV5SQ1-TjwgApySA=w80-h80-c-rp-mo-br100 2x" alt="Vanessa Boothe profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Vanessa Boothe </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" /><span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">I highly recommend Mountain Bouncers! We used them for my daughter’s birthday party and all the kids loved it! The process was easy and the communication was great. We will definitely be using them again.</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1762905600" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a-/ALV-UjVuYyrbErYwhby4ST0OfD0ckT0h4GPv_Hg6CS14NBWlM-7iNzicVw=w40-h40-c-rp-mo-ba2-br100" srcset="https://lh3.googleusercontent.com/a-/ALV-UjVuYyrbErYwhby4ST0OfD0ckT0h4GPv_Hg6CS14NBWlM-7iNzicVw=w80-h80-c-rp-mo-ba2-br100 2x" alt="Michael Peltier profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Michael Peltier </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" />
60<span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">RJ and his staff At Mountain bouncers are the nicest people to work with. It was very easy to set up the date they were on time, they were very courteous to adjust the product to a bigger bouncy house when I realized more kids were coming than I expected.. and they accommodated us with ease.. a very top-notch company to rent from... Thank you for helping make this 4-year-olds birthday a success..</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1762387200" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a-/ALV-UjULpQ_ME6xZPLlXW-S2uMc9C4CJvT2kkiygG9YxTo2vD8CLvhk=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a-/ALV-UjULpQ_ME6xZPLlXW-S2uMc9C4CJvT2kkiygG9YxTo2vD8CLvhk=w80-h80-c-rp-mo-br100 2x" alt="Kathryn Lorenz profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Kathryn Lorenz </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" /><span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">We rented a bouncy castle for my 6-yr-old's birthday, and everything went off without a hitch! RJ was very communicative and answered all of my questions in a timely manner. Set-up and take-down were both on time and efficient. And naturally, the kids loved it :)</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1761868800" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a-/ALV-UjXLkT6oJSRnuUehmEkKQZtss99-i0CXF5Xl04ZgAaU2DkzC0iAQ=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a-/ALV-UjXLkT6oJSRnuUehmEkKQZtss99-i0CXF5Xl04ZgAaU2DkzC0iAQ=w80-h80-c-rp-mo-br100 2x" alt="Ryan Rice profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Ryan Rice </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" />
60<span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">RJ and mountain bouncers provided an excellent bounce house that the kids enjoyed all night! He was prompt, professional, and a pleasure to deal with. Look no further!</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1761609600" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a-/ALV-UjXeTuamZsyq9rrhm2lerPtsUOBjapwKxjupnOoHxplMqHT0x-m3=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a-/ALV-UjXeTuamZsyq9rrhm2lerPtsUOBjapwKxjupnOoHxplMqHT0x-m3=w80-h80-c-rp-mo-br100 2x" alt="Jennifer Lagor profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Jennifer Lagor </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" /><span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">Outstanding service - rental equipment was in great condition. Will definitely use Mountain Bouncers again.</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1761264000" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a/ACg8ocJoptJKAUlA_yt50Z7t8ywVFpYEvYXBjnkY-PfPZB6TmzoS6A=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a/ACg8ocJoptJKAUlA_yt50Z7t8ywVFpYEvYXBjnkY-PfPZB6TmzoS6A=w80-h80-c-rp-mo-br100 2x" alt="Emily Whitcomb profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Emily Whitcomb </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" />
60<span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">Would definitely recommend Randall and this company. Setup and pick up were quick and easy, and the bounce house was a huge hit!</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1761004800" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a/ACg8ocJasmeGGPx0kKPIRc2ZS8me9TK93UsCmgKp-y2JHghOidYOWA=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a/ACg8ocJasmeGGPx0kKPIRc2ZS8me9TK93UsCmgKp-y2JHghOidYOWA=w80-h80-c-rp-mo-br100 2x" alt="Ananda Boyer profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Ananda Boyer </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" /><span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">Incredibly bouncy obstacle course - kids & adults loved for HOURS. Service is just the best. Worth every penny.</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> <div data-empty="0" data-time="1761004800" class="ti-review-item source-Google ti-image-layout-thumbnail" data-id="cfcd208495d565ef66e7dff9f98764da" data-language=""> <div class="ti-inner"> <div class="ti-review-header"> <div class="ti-platform-icon ti-with-tooltip"> <span class="ti-tooltip">Posted on Google</span> <img loading="lazy" decoding="async" class="skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/icon.svg" alt="Google" width="20" height="20" loading="lazy" /> </div> <div class="ti-profile-img"> <img decoding="async" class="skip-lazy" src="https://lh3.googleusercontent.com/a-/ALV-UjX56Rex-vopHW4kCHQuk4hiPDxzSuXx9EWOKgLSfq5hoeYF7DXt=w40-h40-c-rp-mo-br100" srcset="https://lh3.googleusercontent.com/a-/ALV-UjX56Rex-vopHW4kCHQuk4hiPDxzSuXx9EWOKgLSfq5hoeYF7DXt=w80-h80-c-rp-mo-br100 2x" alt="Maria Luisa Alfaro profile picture" loading="lazy" /> </div> <div class="ti-profile-details"> <div class="ti-name"> Maria Luisa Alfaro </div> <div class="ti-date"></div> </div> </div> <span class="ti-stars"><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 1" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 2" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 3" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 4" width="17" height="17" loading="lazy" /><img loading="lazy" decoding="async" class="ti-star skip-lazy" src="https://cdn.trustindex.io/assets/platform/Google/star/f.svg" alt="Google star 5" width="17" height="17" loading="lazy" />
60<span class="ti-verified-review ti-verified-platform"><span class="ti-verified-tooltip">Trustindex verifies that the original source of the review is Google.</span></span></span> <div class="ti-review-text-container ti-review-content">This is our third year in a row renting a bouncy house from Mountain Bouncers for my kid’s birthday. Always punctual, flexible, and responsive.</div> <span class="ti-read-more" data-container=".ti-review-content" data-collapse-text="Hide" data-open-text="Read more"></span> </div> </div> </div> <div class="ti-controls-line"> <div class="dot"></div> </div> </div> </div> </div> </pre><pre class="ti-hidden-markup" hidden style="display: none">
60<script>(function () { if (window.tiLoaderFallback) { return; } window.tiLoaderFallback = true; function tiLoadLoader() { if (window.TrustindexWidget || document.querySelector('script[src*="https://cdn.trustindex.io/loader.js"]')) { return; } let script = document.createElement("script"); script.async = true; script.src = "https://cdn.trustindex.io/loader.js"; script.setAttribute("data-ccm-injected", "1"); document.head.appendChild(script); } if ("loading" === document.readyState) { document.addEventListener("DOMContentLoaded", tiLoadLoader); } else { tiLoadLoader(); } })();</script>
60 </pre></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-29bec10b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="29bec10b" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7893b361" data-id="7893b361" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-70fee19c elementor-invisible elementor-widget elementor-widget-heading" data-id="70fee19c" data-element_type="widget" data-e-type="widget" data-settings="{"_animation":"bounceIn"}" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">It's Party Time!</h2></div></div><div class="elementor-element elementor-element-3cb886d8 elementor-widget elementor-widget-text-editor" data-id="3cb886d8" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>We have everything you need to throw unforgettable, once in a lifetime events. Whether it’s in your backyard or a huge corporate event, we specialize in making sure your event is a fun, stress free experience from start to finish. </p></div></div><div class="elementor-element elementor-element-77ae124d elementor-align-center elementor-widget elementor-widget-button" data-id="77ae124d" data-element_type="widget" data-e-type="widget" data-widget_type="button.default"><div class="elementor-widget-container"><div class="elementor-button-wrapper"> <a class="elementor-button elementor-button-link elementor-size-xl elementor-animation-grow" href="https://mountainbouncers.com/rentals"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">View Our Inventory</span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-a42f10e elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="a42f10e" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-62293d3b io_widget_home" data-id="62293d3b" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-2f9398c6 elementor-hidden-desktop elementor-hidden-tablet elementor-widget elementor-widget-wp-widget-searchio_live_search" data-id="2f9398c6" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-searchio_live_search.default"><div class="elementor-widget-container"><form role="search" method="get" class="searchio-live-search-widget-search-form" action="https://mountainbouncers.com"> <label> <span class="screen-reader-text">Search for:</span> <input type="search" class="search-field" style="width: 220px" placeholder="Search for..." value="" name="s" data-swplive="true" data-swpengine="default" data-swpconfig="default" autocomplete="off"> </label> <input type="submit" class="search-submit" value="Search"></form></div></div><div class="elementor-element elementor-element-3d806704 elementor-widget elementor-widget-wp-widget-widget_featured" data-id="3d806704" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-widget_featured.default"><div class="elementor-widget-container"><div class="widget-text wp_widget_plugin_box panel-grid panel-has-style" style="margin-top:0px;">
60<script>jQuery(document).ready(function(){ 61 jQuery('.io_mm_item .io_item2_list').css('box-shadow', 'none') 62 jQuery('.io_mm_item .io_item2_list').addClass('nohover') 63 64 jQuery('.io_mm_item .io_item2_listcat').css('box-shadow', 'none') 65 jQuery('.io_mm_item .io_item2_listcat').addClass('nohover') 66 })</script>
66<div class="io_mm_outer io_widget_82646 " style="grid-template-columns:repeat(4, calc((100% - 45px)/4)); display:grid;"><style>.io_widget_82646 .io_item2_list_inner .rentNameIO_button {display:none !important;} .io_widget_82646 .io_item2_list_inner .rentNameIO_price {display:none !important;} .io_widget_82646 .io_item2_list .view-product-button {display:none !important;} .io_widget_82646 .io_item2_listcat .view-product-button {display:none !important;}</style><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/slide-combos/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000d89471fdacd403a109717a64_1771703468_big.png" alt="Slide Combos" title="Slide Combos" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/slide-combos/"><p class="rentNameIO elementor-heading-title">Slide Combos</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Inflatable bounce house combos are great for getting energy out. A few of these combo bouncers come with things like a basketball hoop or water slide constructed right in with a bounce space! We specialize in bounce houses rentals and would be delighted to help you with your party needs.<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/water/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_0000000001bc71fd966394299984a30c_1771703490_big.png" alt="Waterslides" title="Waterslides" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/water/"><p class="rentNameIO elementor-heading-title">Waterslides</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><div style='display: block; width: 603.203px; margin: 50px auto auto; text-align: left; background: rgba(0, 0, 0, 0.03); border-radius: 6px; color: rgb(0, 0, 0); font-family: "Open Sans", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;'><div style="overflow-x: auto; min-height: 30px;"><div style="font-size: 1px; page-break-after: always; height: 1px; background-color: rgb(192, 192, 192);" contenteditable="false" title="Page Break"></div></div></div></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/obstacle-course/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000027c71fda291d9f17dce058e_1771704298_big.png" alt="Obstacle Course" title="Obstacle Course" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/obstacle-course/"><p class="rentNameIO elementor-heading-title">Obstacle Course</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Large inflatable slides are available to be rented from us, as can inflatable play areas. Obstacle course inflatables offer greater interaction and are an enjoyable way for children to race each other and to get lots of energy.<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/bouncy-houses/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000cec871fd930c0cf670a7e652_1771708685_big.png" alt="Bouncy Houses" title="Bouncy Houses" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/bouncy-houses/"><p class="rentNameIO elementor-heading-title">Bouncy Houses</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Inflatable bounce houses are great for getting some energy out. We also offer combination bouncers that have things like a basketball hoop or slide built right inside with a bounce space! We are specialists in renting bounce houses and are able to be adapted to any occasion.<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/toddler-bouncers/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_00000000065871fd838c0a4c2e8cb526_1771708701_big.png" alt="Toddler Bouncers!!" title="Toddler Bouncers!!" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/toddler-bouncers/"><p class="rentNameIO elementor-heading-title">Toddler Bouncers!!</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">Rides for young kids that are safe and enjoyable. Kids will be thrilled by these small toddler bounce house rentals as well as the fun playland. <p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York. </p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_tainbounc" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://mountainbouncers.com/rentals/equipment/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://mountainbouncers.com/wp-content/uploads/2026/02/file_0000000044d071fd8f3f1afd0df4fea0_1771709431_big.png" alt="Equipment" title="Equipment" /></div> </a><div class="cat_div_inner"> <a href="https://mountainbouncers.com/rentals/equipment/"><p class="rentNameIO elementor-heading-title">Equipment</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor">If you're planning to hold your party in the park or at another location without electricity then you will require a generator for powering the units. The generator we offer is powerful and sturdy.</div> </a></div></div></div></div></div><style>.io_mm_item .io_item2_list, .io_mm_item .io_item2_listcat, .io_mm_item .io_item2_listrent { margin-bottom: 0px !important; }</style></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-634b8faf elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="634b8faf" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-7596b6f7" data-id="7596b6f7" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-2f16e994 elementor-flip-box--effect-push elementor-flip-box--direction-up elementor-widget elementor-widget-flip-box" data-id="2f16e994" data-element_type="widget" data-e-type="widget" data-widget_type="flip-box.default"><div class="elementor-widget-container"><div class="elementor-flip-box" tabindex="0"><div class="elementor-flip-box__layer elementor-flip-box__front"><div class="elementor-flip-box__layer__overlay"><div class="elementor-flip-box__layer__inner"><div class="elementor-icon-wrapper elementor-view-default"><div class="elementor-icon"> <i aria-hidden="true" class="fas fa-star"></i></div></div><h3 class="elementor-flip-box__layer__title"> Party Rentals</h3><div class="elementor-flip-box__layer__description"> Everything you need to throw the ultimate event.</div></div></div></div> <a class="elementor-flip-box__layer elementor-flip-box__back" href="https://mountainbouncers.com/rentals"><div class="elementor-flip-box__layer__overlay"><div class="elementor-flip-box__layer__inner"> <span class="elementor-flip-box__button elementor-button elementor-size-lg"> Browse </span></div></div> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-f6565d2" data-id="f6565d2" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-7f3c117e elementor-flip-box--effect-push elementor-flip-box--direction-up elementor-widget elementor-widget-flip-box" data-id="7f3c117e" data-element_type="widget" data-e-type="widget" data-widget_type="flip-box.default"><div class="elementor-widget-container"><div class="elementor-flip-box" tabindex="0"><div class="elementor-flip-box__layer elementor-flip-box__front"><div class="elementor-flip-box__layer__overlay"><div class="elementor-flip-box__layer__inner"><div class="elementor-icon-wrapper elementor-view-default"><div class="elementor-icon"> <i aria-hidden="true" class="fas fa-star"></i></div></div><h3 class="elementor-flip-box__layer__title"> Specials</h3><div class="elementor-flip-box__layer__description"> Combine rentals and accessories to save money.</div></div></div></div> <a class="elementor-flip-box__layer elementor-flip-box__back" href="https://mountainbouncers.com/rentals"><div class="elementor-flip-box__layer__overlay"><div class="elementor-flip-box__layer__inner"> <span class="elementor-flip-box__button elementor-button elementor-size-lg"> Browse </span></div></div> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-a2ad830" data-id="a2ad830" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-38fc7784 elementor-flip-box--effect-push elementor-flip-box--direction-up elementor-widget elementor-widget-flip-box" data-id="38fc7784" data-element_type="widget" data-e-type="widget" data-widget_type="flip-box.default"><div class="elementor-widget-container"><div class="elementor-flip-box" tabindex="0"><div class="elementor-flip-box__layer elementor-flip-box__front"><div class="elementor-flip-box__layer__overlay"><div class="elementor-flip-box__layer__inner"><div class="elementor-icon-wrapper elementor-view-default"><div class="elementor-icon"> <i aria-hidden="true" class="fas fa-star"></i></div></div><h3 class="elementor-flip-box__layer__title"> Special Events</h3><div class="elementor-flip-box__layer__description"> We rent to events both big and small.</div></div></div></div><div class="elementor-flip-box__layer elementor-flip-box__back"><div class="elementor-flip-box__layer__overlay"><div class="elementor-flip-box__layer__inner"> <a class="elementor-flip-box__button elementor-button elementor-size-lg" href="#io_contactform"> Contact Us </a></div></div></div></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-1e16fd9d elementor-section-height-min-height elementor-section-items-stretch elementor-section-boxed elementor-section-height-default" data-id="1e16fd9d" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b
660e4b77" data-id="b0e4b77" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><section class="elementor-section elementor-inner-section elementor-element elementor-element-547796e1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="547796e1" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-53c90fb9" data-id="53c90fb9" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6b6cdfa2 elementor-widget elementor-widget-text-editor" data-id="6b6cdfa2" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>3-Step Clean</p></div></div><div class="elementor-element elementor-element-3c25ed98 elementor-widget elementor-widget-text-editor" data-id="3c25ed98" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Keeping Your Family Safe!</p></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-6bd45117" data-id="6bd45117" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1388b7ad elementor-widget elementor-widget-image" data-id="1388b7ad" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img decoding="async" width="140" height="171" src="https://mountainbouncers.com/wp-content/uploads/2020/01/clean-shield.png" class="attachment-large size-large wp-image-1092" alt="clean shield Home"></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-23013330" data-id="23013330" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-4d7e6e21 elementor-widget elementor-widget-text-editor" data-id="4d7e6e21" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"> We honor and value your trust in our service and equipment. We are dedicated to providing our customers with properly cleaned and sanitized rentals each and every time.</div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-151639e0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="151639e0" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-19773d1a" data-id="19773d1a" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-bd2b361 elementor-widget elementor-widget-heading" data-id="bd2b361" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default">Step 1</h3></div></div><div class="elementor-element elementor-element-6d729327 elementor-widget elementor-widget-image" data-id="6d729327" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img decoding="async" width="147" height="147" src="https://mountainbouncers.com/wp-content/uploads/2020/01/brush-dust.png" class="attachment-large size-large wp-image-1089" alt="brush dust Home"></div></div><div class="elementor-element elementor-element-cf0497a elementor-widget elementor-widget-text-editor" data-id="cf0497a" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Sweep<br />All Dust, Dirt, & Debris</p></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-71bc2d44" data-id="71bc2d44" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1e6932df elementor-widget elementor-widget-heading" data-id="1e6932df" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default">Step 2</h3></div></div><div class="elementor-element elementor-element-1f78a37 elementor-widget elementor-widget-image" data-id="1f78a37" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img loading="lazy" decoding="async" width="214" height="171" src="https://mountainbouncers.com/wp-content/uploads/2020/01/sanitize.png" class="attachment-large size-large wp-image-1090" alt="sanitize Home"></div></div><div class="elementor-element elementor-element-1bccda36 elementor-widget elementor-widget-text-editor" data-id="1bccda36" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Deep Clean Unit<br />with Cleaner & Sanitizer</p></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-815d9c4" data-id="815d9c4" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-45c8498c elementor-widget elementor-widget-heading" data-id="45c8498c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default">Step 3</h3></div></div><div class="elementor-element elementor-element-5e34979a elementor-widget elementor-widget-image" data-id="5e34979a" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img loading="lazy" decoding="async" width="169" height="158" src="https://mountainbouncers.com/wp-content/uploads/2020/01/ready-fun.png" class="attachment-large size-large wp-image-1091" alt="ready fun Home"></div></div><div class="elementor-element elementor-element-217b83f4 elementor-widget elementor-widget-text-editor" data-id="217b83f4" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Clean, Sanitized &<br />Ready for Fun!</p></div></div></div></div></div></section></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-5acbef18 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5acbef18" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1db71a0a" data-id="1db71a0a" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><section class="elementor-section elementor-inner-section elementor-element elementor-element-77ec99e elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="77ec99e" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-e4ec181" data-id="e4ec181" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-8a0a7b8 elementor-widget elementor-widget-theme-site-logo elementor-widget-image" data-id="8a0a7b8" data-element_type="widget" data-e-type="widget" data-widget_type="theme-site-logo.default"><div class="elementor-widget-container"> <a href="https://mountainbouncers.com"> <img loading="lazy" decoding="async" width="1261" height="1339" src="https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Backgroun
66d.png" class="elementor-animation-grow attachment-full size-full wp-image-4154" alt="Mountain Bouncers Transparent Background Home" srcset="https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background.png 1261w, https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background-283x300.png 283w, https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background-964x1024.png 964w, https://mountainbouncers.com/wp-content/uploads/2020/02/Mountain-Bouncers-Transparent-Background-768x816.png 768w" sizes="(max-width: 1261px) 100vw, 1261px"> </a></div></div></div></div><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-9df9cbf" data-id="9df9cbf" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-2e770565 elementor-widget elementor-widget-heading" data-id="2e770565" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">Who We Are</h2></div></div><div class="elementor-element elementor-element-7017cfbf elementor-widget elementor-widget-text-editor" data-id="7017cfbf" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p><strong>Welcome to Mountain Bouncers!</strong></p><p>At Mountain Bouncers, we turn every event into a spectacular celebration. Located right here in the beautiful state of Vermont, we are passionate about providing top-quality party rentals that bring joy and excitement to your special occasions.</p><p>Founded with a love for parties and a commitment to exceptional service, our family-owned business has been serving the community for over 3 years. I RJ, along with my amazing wife Kristen and our three wonderful daughters, have dedicated ourselves to making your events unforgettable. Whether you’re planning a birthday bash, a wedding reception, or a corporate event, we’ve got everything you need to make it a success.</p><p><strong>Why Choose Us?</strong></p><ul><li><strong>Wide Selection:</strong> From bounce houses and tents to tables and chairs, we have a diverse range of rentals to suit any event theme or size.</li><li><strong>Impeccable Quality:</strong> We take pride in maintaining our equipment to the highest standards. Every item is clean, safe, and ready for fun.</li><li><strong>Friendly Service:</strong> Our team is dedicated to providing you with a seamless rental experience. We’re here to help from start to finish, ensuring your event goes off without a hitch.</li><li><strong>Local Touch:</strong> As a local business, we understand the unique needs of our community. We love being a part of your celebrations and making memories together.</li><li><strong>Family-Driven:</strong> Our company is a family affair, run with the combined effort of my wife, our three daughters, and myself. Our personal touch ensures that every event we help create is filled with joy and care.</li><li><strong>Competitive Pricing:</strong> We offer fair and transparent pricing, so you can get the best value without breaking the bank.</li></ul><p>Thank you for choosing Mountain Bouncers as your trusted party rental provider. We’re excited to be a part of your next event and help you create memories that will last a lifetime!</p><div> </div></div></div></div></div></div></section><div class="elementor-element elementor-element-3df69ca elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="3df69ca" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default"><div class="elementor-widget-container"><div class="elementor-divider"> <span class="elementor-divider-separator"> </span></div></div></div><div class="elementor-element elementor-element-3b898d5 elementor-widget elementor-widget-heading" data-id="3b898d5" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">Satisfaction Guaranteed!</h2></div></div><div class="elementor-element elementor-element-3b4df279 elementor-widget elementor-widget-text-editor" data-id="3b4df279" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>When we say your <strong>
66satisfaction is guaranteed, we mean it</strong>. If we didn’t cover your type of party or event, please feel free to give us a call or message us on our <a href="#io_contactform"><u>Contact Us</u></a> form. We will promptly respond with any necessary feedback.</p></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-639be6b0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="639be6b0" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-5603243f" data-id="5603243f" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-223b2978 elementor-view-default elementor-widget elementor-widget-icon" data-id="223b2978" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default"><div class="elementor-widget-container"><div class="elementor-icon-wrapper"><div class="elementor-icon"> <i aria-hidden="true" class="far fa-comment-dots"></i></div></div></div></div><div class="elementor-element elementor-element-71bb1528 elementor-widget elementor-widget-heading" data-id="71bb1528" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-xl"><a href="https://mountainbouncers.com/io_reviews/">What Our Customers Are Saying...</a></h2></div></div></div></div><div class="elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-493063c7" data-id="493063c7" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-f319d1b elementor-widget elementor-widget-html" data-id="f319d1b" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"><div class="elementor-widget-container"><div class="testi_wrapper"><div class="io_testimonials"></div></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-6a3e61ca elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6a3e61ca" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-7947044f" data-id="7947044f" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-27eeead elementor-cta--skin-cover elementor-bg-transform elementor-bg-transform-zoom-out elementor-animated-content elementor-widget elementor-widget-call-to-action" data-id="27eeead" data-element_type="widget" data-e-type="widget" data-widget_type="call-to-action.default"><div class="elementor-widget-container"> <a class="elementor-cta" href="https://mountainbouncers.com/io_quoteform/"><div class="elementor-cta__bg-wrapper"><div class="elementor-cta__bg elementor-bg" style="background-image: url();" role="img" aria-label=""></div><div class="elementor-cta__bg-overlay"></div></div><div class="elementor-cta__content"><div class="elementor-content-item elementor-cta__content-item elementor-icon-wrapper elementor-cta__icon elementor-view-default elementor-animated-item--grow"><div class="elementor-icon"> <i aria-hidden="true" class="fas fa-star"></i></div></div><h2 class="elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow"> Stress-Free. Fun. Done.</h2><div class="elementor-cta__description elementor-cta__content-item elementor-content-item elementor-animated-item--grow"> Book with us for the event of a lifetime today!</div><div class="elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item elementor-animated-item--grow"> <span class="elementor-cta__button elementor-button elementor-size-"> Book An Event Now! </span></div></div> </a></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-29caebaf" data-id="29caebaf" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-2fb7524f elementor-cta--skin-cover elementor-widget elementor-widget-call-to-action" data-id="2fb7524f" data-element_type="widget" data-e-type="widget" data-widget_type="call-to-action.default"><div class="elementor-widget-container"><div class="elementor-cta"><div class="elementor-cta__bg-wrapper"><div class="elementor-cta__bg elementor-bg" style="background-image: url(https://mountainbouncers.com/wp-content/uploads/2020/01/original_bounce_house_john_shurlock.png);" role="img" aria-label="original_bounce_house_john_shurlock"></div><div class="elementor-cta__bg-overlay"></div></div><div class="elementor-cta__content"><h2 class="elementor-cta__title elementor-cta__content-item elementor-content-item"> Bounce House Facts</h2><div class="elementor-cta__description elementor-cta__content-item elementor-content-item"> The first inflatable structure was designed in 1959 by John Scurlock in Shreveport, Louisiana who was experimenting with inflatable covers for a government request for proposal when he noticed his sons enjoyed jumping on the air structure. He was an electrical engineer and liked physics.</div></div></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-3ea2bcf elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3ea2bcf" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7df307d" data-id="7df307d" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap"></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-2eff625 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2eff625" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0e13df2" data-id="0e13df2" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-7d775f3 elementor-widget elementor-widget-image" data-id="7d775f3" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img loading="lazy" decoding="async" width="1024" height="768" src="https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-1024x768.jpg" class="attachment-large size-large wp-image-5160" alt="20240615 104958 Home" srcset="https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-1024x768.jpg 1024w, https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-300x225.jpg 300w, https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-768x576.jpg 768w, https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-1536x1152.jpg 1536w, https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-2048x1536.jpg 2048w, https://mountainbouncers.com/wp-content/uploads/2024/08/20240615_104958-scaled.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px"></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-0bc5c9b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="0bc5c9b" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8b1ca17" data-id="8b1ca17" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-b59d37e elementor-widget elementor-widget-heading" data-id="b59d37e" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h1 class="elementor-heading-title elementor-size-default">Bounce House & Event Rentals in Rutland County, VT | Mountain Bouncers</h1></div></div><div class="elementor-element elementor-element-00c9b4e elementor-widget elementor-widget-heading" data-id="00c9b4e" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">Premium Bounce House Rentals in Rutland County & Surrounding Vermont Towns 67Obstacle Courses, Waterslides & Toddler Inflatables for Every Event 68Tent, Table, Chair & Linen Rentals for Weddings and Corporate Events 69Dunk Tanks, Inflatable Nightclubs & Interactive Party Rentals 70Professional Lighting, Sound Systems & Event Power Equipment
71Serving Dorset VT, Manchester VT, Woodstock VT, Middlebury VT, Brandon VT & Pittsford VT 72Clean, Safe & On-Time Event Rental Delivery You Can Trust 73Book Your Vermont Event Rentals Today</h2></div></div></div></div></div></section></div></div></main><footer data-elementor-type="footer" data-elementor-id="220" class="elementor elementor-220 elementor-location-footer" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-16dfcfef elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="16dfcfef" data-element_type="section" data-e-type="section" id="io_contactform" data-settings="{"background_background":"classic","shape_divider_top":"opacity-tilt"}"><div class="elementor-shape elementor-shape-top" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2600 131.1" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M0 0L2600 0 2600 69.1 0 0z"/> <path class="elementor-shape-fill" style="opacity:0.5" d="M0 0L2600 0 2600 69.1 0 69.1z"/> <path class="elementor-shape-fill" style="opacity:0.25" d="M2600 0L0 0 0 130.1 2600 69.1z"/> </svg></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-2ed81d20" data-id="2ed81d20" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-663b4594 elementor-widget elementor-widget-heading" data-id="663b4594" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-xl">Contact Us</h2></div></div><div class="elementor-element elementor-element-2d23fd02 elementor-widget elementor-widget-text-editor" data-id="2d23fd02" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Have questions? We have answers! Can’t find what you’re looking for or curious about one of our products? Don’t hesitate to give us a call or use our <a href="#io_contactform">contact form</a> to reach out to us anytime!</p></div></div><div class="elementor-element elementor-element-54b9ff53 elementor-icon-list--layout-inline elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="54b9ff53" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:(802)%20353-2201"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">(802) 353-2201</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="mailto:[email protected]"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-envelope"></i> </span> <span class="elementor-icon-list-text">[email protected]</span> </a></li></ul></div></div><div class="elementor-element elementor-element-555e5bbc elementor-icon-list--layout-inline elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="555e5bbc" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-map-marked-alt"></i> </span> <span class="elementor-icon-list-text">West Rutland, VT</span></li></ul></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-e76e585" data-id="e76e585" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-76af4c3c elementor-button-align-stretch elementor-widget elementor-widget-form" data-id="76af4c3c" data-element_type="widget" data-e-type="widget" data-settings="{"step_next_label":"Next","step_previous_label":"Previous","button_width":"100","step_type":"number_text","step_icon_shape":"circle"}" data-widget_type="form.default"><div class="elementor-widget-container"><form class="elementor-form" method="post" id="io_contactusform" name="Request Call Back" aria-label="Request Call Back"> <input type="hidden" name="post_id" value="220"/> <input type="hidden" name="form_id" value="76af4c3c"/> <input type="hidden" name="referer_title" value="Mountain Bouncers LLC - Party Rental and Bounce House Rental" /> <input type="hidden" name="queried_id" value="109"/><div class="elementor-form-fields-wrapper elementor-labels-"><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-firstandlastname elementor-col-33"> <label for="form-field-firstandlastname" class="elementor-field-label elementor-screen-only"> Name </label> <input size="1" type="text" name="form_fields[firstandlastname]" id="form-field-firstandlastname" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Name"></div><div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-33 elementor-field-required"> <label for="form-field-email" class="elementor-field-label elementor-screen-only"> Email </label> <input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Email" required="required"></div><div class="elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-cellphone elementor-col-33"> <label for="form-field-cellphone" class="elementor-field-label elementor-screen-only"> Phone </label> <input size="1" type="tel" name="form_fields[cellphone]" id="form-field-cellphone" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Phone" pattern="[0-9()#&+*-=.]+" title="Only numbers and phone characters (#, -, *, etc) are accepted."></div><div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-notes elementor-col-100"> <label for="form-field-notes" class="elementor-field-label elementor-screen-only"> Message </label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[notes]" id="form-field-notes" rows="3" placeholder=""I need help from a human sales rep.""></textarea></div><div class="elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_1a42aac elementor-col-100 recaptcha_v3-bottomright"><div class="elementor-field" id="form-field-field_1a42aac"><div class="elementor-g-recaptcha" data-sitekey="6LcSNw8eAAAAAN1cy4N20ZlzWX4YetiG7zmLXN_f" data-type="v3" data-action="Form" data-badge="bottomright" data-size="invisible"></div></div></div><div class="elementor-field-type-text"> <input size="1" type="text" name="form_fields[website_url]" id="form-field-website_url" class="elementor-field elementor-size-sm " style="display:none !important;"></div><div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons"> <button class="elementor-button elementor-size-sm elementor-animation-grow" type="submit" id="io_cub"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-icon"> <i aria-hidden="true" class="far fa-paper-plane"></i> </span> <span class="elementor-button-text">Send</span> </span> </button></div></div></form></div></div><div class="elementor-element elementor-element-f430e84 elementor-widget elementor-widget-text-editor" data-id="f430e84" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply.</div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-ea9489a elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle" data-id="ea9489a" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5784b69c" data-id="5784b69c" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-7996f660 elementor-widget elementor-widget-text-editor" data-id="7996f
73660" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Copyright © <span id="ioyeario">2022</span><span id="io_fbs"> Mountain Bouncers LLC</span> All Rights Reserved | Rental Software Powered By <a href="https://www.inflatableoffice.com/" target="_blank" rel="noopener">InflatableOffice</a></p></div></div></div></div></div></section></footer>
73<script type="speculationrules">{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/io-kenos/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}</script>
73 <img src="https://rental.software/include/iotracking.php" style="display:none;" importance="low" alt="dynamic io trk code" /><style>.io_product_price_4h,.io_product_price_8h,.io_product_price_24h,.io_product_price_additionalday{display:none}.io_product_price_24h{display: grid !important}.io_product_price_24h_1861737,.io_product_price_24h_1905817,.io_product_price_24h_1861743{display: grid !important}.io_product_price_68141_1861737,.io_product_price_68141_1905817,.io_product_price_68141_1861743,.io_product_price_68141_1861737,.io_product_price_68141_1905817,.io_product_price_68141_1861743{display: none !important} 74 /* ALWAYS hide toggle buttons and list view on inventory/all-items pages (no category ID) */ 75 body.io-no-category-id .io_view_toggle_container, 76 body.io-no-category-id .io_list_view_content 77 { 78 display: none !important; 79 } 80 81 /* Force grid/tile layout on pages without category IDs */ 82 body.io-no-category-id .io_catdiv2.list-view { 83 display: grid !important; 84 grid-template-columns: repeat(auto-fit, minmax(250px, 350px)) !important; 85 grid-gap: 10px !important; 86 margin: 50px !important; 87 max-width: none !important; 88 justify-content: space-evenly !important; 89 } 90 body.io-no-category-id .io_catdiv2.list-view .io_item2_list { 91 display: block !important; 92 flex-direction: column !important; 93 margin-bottom: 0 !important; 94 padding: 0 !important; 95 align-items: initial !important; 96 text-align: center !important; 97 } 98 body.io-no-category-id .io_catdiv2.list-view .cat_div { 99 flex: initial !important; 100 margin-right: 0 !important; 101 position: relative !important; 102 } 103 body.io-no-category-id .io_catdiv2.list-view .cat_img { 104 width: 100% !important; 105 height: auto !important; 106 object-fit: cover !important; 107 } 108 body.io-no-category-id .io_catdiv2.list-view .io_item2_list_inner { 109 flex: initial !important; 110 margin-top: initial !important; 111 display: block !important; 112 flex-direction: initial !important; 113 justify-content: initial !important; 114 min-height: auto !important; 115 height: auto !important; 116 } 117 118 .io_all_item_cat{ 119 display:none; 120 float:none; 121 width:100%; 122 margin-top:20px; 123 }</style>
123<script>var io_wp_local_path = ""; 124 var io_checkavail = "warn"; 125 var io_hidetimes = "off"; 126 var io_user_country = "US"; 127 var io_user_currency = "USD"; 128 var io_default_start_time = "12:00 pm"; 129 var io_default_end_time = "4:00 pm"; 130 var io_default_duration = 4.00; 131 var io_force_blank_timepickers = ""; 132 var io_hide_end_time = ""; 133 var io_cart_date_format = "m/d/yy"; 134 var io_cart_message = ""; 135 var io_cart_time_format = "g:i a"; 136 var io_multidayquote = "on"; 137 var io_cartdayselect = "single_day"; 138 var io_cartAllowSameDay = "off"; 139 var io_overnightPickupTime = "10:00 am"; 140 var io_incartupsell = "on"; 141 var io_distancecharge = "on"; 142 var io_deliverymethod = "off"; 143 var io_brand = "IO"; 144 var io_restrict_times = "on"; 145 var io_restrict_time_start = "8:00 am"; 146 var io_restrict_time_end = "9:00 pm"; 147 var io_default_state = "VT"; 148 var io_hide_zero = "0"; 149 var io_weekEndPrice = "off"; 150 var io_weekDayText = "Weekday price."; 151 var io_weekEndText = "Weekend price."; 152 var io_weekendDefine = "friday-sunday"; 153 var io_accessory_price = "off"; 154 var io_accessory_select = ""; 155 var io_upsell_price = "off"; 156 var io_cart_party_planner_email = ""; 157 var io_cart_party_planner_destination = ""; 158 var io_hideQuantityAvail = "on"; 159 var io_company_timeslots = []; 160 var io_info_required = "off"; 161 var io_always_display_live_price = "on"; 162 var io_default_delivery_method = ""; 163 var io_hide_live_prices = 1; 164 var io_info_required_data = []; 165 var io_prices = {"0":"isset","override_groups":{"793429":{"1861737":1,"1905817":1,"1861743":1}},"1":"io_product_price_24h","2":"io_delivery_price_68141","3":"io_product_price_24h_1861737","4":"io_product_price_24h_1905817","5":"io_product_price_24h_1861743","6":"io_delivery_price_68141_1861737","7":"io_delivery_price_68141_1905817","8":"io_delivery_price_68141_1861743"}; 166 var io_delivery_prices = {"default":["68141"],"override":{"1861737":["68141"],"1905817":["68141"],"1861743":["68141"]}}; 167 var io_custom_prices = {"default":[], "override":[]}; 168 var io_delivery_methods = {"Delivery and Set-up":{"restricted":"[]","id":"68141"},"Staffed event":{"restricted":"[]","id":"123611"},"Contactless Delivery and Set up":{"restricted":"[]","id":"123615"},"Drop Off":{"restricted":"[]","id":"127713"}}; 169 var io_customer_geolocation = ""; 170 var io_customer_ip = "208.92.218.146"; 171 var io_delivery_methods_restrict = null; 172 var io_pagename = "Mountain Bouncers LLC"; 173 var io_categoryVariantImages = ""; 174 //var io_seocitylinktext = "Professional delivery to <span class=\"io_city_list\">%%landing_pages%%</span> and surrounding areas. Please submit a quote or contact us to be sure we service your area."; 175 jQuery( document ).ready(function() { 176 177 //force all quote form links to use cart data 178 //removing back to cart shortcode as this needs to only be done if cart is not empty IO-22561 179 /* 180 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 181 headerBookButton.addClass("ioCart_link"); 182 headerBookButton.attr("href", "javascript:;"); 183 */ 184 185 186 let last_cat_name = ""; 187 let ioTrigger = false; 188 jQuery(".io_all_item_cat").each(function() { 189 current_cat_name = jQuery(this).html(); 190 if(last_cat_name !== current_cat_name) { 191 jQuery(this).show(); 192 ioTrigger = true; 193 } 194 last_cat_name = current_cat_name; 195 }); 196 197 // Setup gen page blocks 198 let io_divs = document.querySelectorAll(".io_item2_list, .io_item2_listcat, .io_item2_listrent, .io_all_item_cat"); 199 let io_divscat = document.querySelectorAll(".io_item2_listcat"); 200 let io_divsrent = document.querySelectorAll(".io_item2_listrent"); 201 let io_divcat = document.querySelector(".io_catdiv2"); 202 let io_pcc = document.querySelector(".page-content"); 203 let io_html; 204 205 if (io_divs.length > 0) { 206 for (let i of io_divs) { 207 if(i.parentNode.className.indexOf("io_mm_") === -1){ 208 io_divcat.appendChild(i); 209 } 210 } 211 if(io_divcat!==null) io_divcat.style.display = "grid"; 212 } 213 214 if (ioTrigger) { 215 let pageBlock = document.querySelector(".io_catdiv2"); 216 pageBlock.classList.add("elementor-widget-heading"); 217 let scanRes = pageBlock.querySelectorAll(".io_item2_listrent"); 218 pageBlock.style.display = "block"; 219 pageBlock.style.margin = "auto"; 220 pageBlock.style.textAlign = "center"; 221 pageBlock.style.marginLeft = "5px"; 222 pageBlock.style.marginRight = "5px"; 223 for (let i of scanRes) { 224 i.style.display = "inline-block"; 225 i.style.marginLeft = "5px"; 226 i.style.marginRight = "5px"; 227 } 228 } 229 230 /* fix font color on older sites */ 231 if(jQuery("#cartData").css("background-color")=="rgb(35, 36, 37)"){ 232 jQuery("#cartData").css("color","white"); 233 } 234 });</script>
234<style>.ui-datepicker-trigger{display:none}</style><div id="cartPopover"><div id="ioCartLoadingOverlay" aria-hidden="true"><div class="io-spinner" role="status" aria-live="polite" aria-label="Loading"></div></div><div id="triangle"></div><div id="cartCalendarTimePickerContainer"><div id="cartCalendar"></div><div id="cartTimePicker"><div id="div-overnight"> Days <select style="color:black;" name="whatday" id="whatday" onchange="endDisplay();"><option value="Same Day" selected="selected">Single Day</option><option value="Overnight">Overnight</option><option value="Multi-Day">Multi-Day</option> </select></div> <br><div id="ioCartTimeSelectContainer"><div> <span class="calTimeLabel calTimeLabelStart">Start</span> <i class="fas fa-calendar-check"></i> <input type="text" name="dateStart" class="ioCartDateInput" readonly="readonly" /> <i class="fas fa-clock"></i> <input type="text" name="timeStart" class="timepicker" style="width:75px;" /></div><div> <span class="calTimeLabel calTimeLabelEnd">End</span> <i class="fas fa-calendar-check"></i> <input type="text" name="dateEnd" class="ioCartDateInput" readonly="readonly" /> <i class="fas fa-clock"></i> <input type="text" name="timeEnd" class="timepicker" style="width:75px;" /></div></div> <br><div id="ioDeliveryMethodContainer" style="display:none; text-align: center;"></div> <br><div id="ioAdditonalInformationContainer" style="display:none; text-align: center;"><div class="io_info_modal_data_container" id="io_info_modal_address"> <label for="address" id="io_iml_address_label" style="width:105px"> Street Address </label> <input class="io_modal_input_address" style="margin-left:5px" id="io_im_address" name="address" type="text"></input> <br></div><div class="io_info_modal_data_container" id="io_info_modal_city"> <label for="city" id="io_iml_city_label" style="width:105px"> City </label> <input class="io_modal_input_city" style="margin-left:5px" id="io_im_city" name="city" type="text"></input> <br></div><div class="io_info_modal_data_container" id="io_info_modal_zip"> <label for="zip" id="io_iml_zip_label" style="width:105px"> Zip Code </label> <input class="io_modal_input_zip" id="io_im_zip" style="margin-left:5px" name="zip" type="text"></input></div></div> <br><div class="elementor-widget-button" style="padding:10px;display:inline-block;"> <a onclick="calApply()" href="javascript:;" 235 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow" 236 style="text-decoration: none;">Apply</a></div><div class="elementor-widget-button" style="padding:10px;display:inline-block;"> <a onclick="calCancel()" href="javascript:;" 237 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow simpleCart_cancel" 238 style="text-decoration: none;">Cancel</a></div></div><div id="cartDateRange" class="ioDateRange" onclick="calSetDateRange(1)" style="display:none;"></div><div class="changeDateLinkWrapper elementor-widget-button"><div id="changeDateLink" onclick="calSetDateRange(1)" class="elementor-button elementor-animation-grow">Change Date</div></div></div><div id="cartPartyBuilderEmailContainer" style="display:none;text-align:center"><p>Provide an email address here to recieve our free party planner!</p> <input type="text" id="cartPartyBuilderEmailInput"><div class="elementor-widget-button" style="display:inline-block;"> <a onclick="io_party_planner_email_submit()" href="javascript:;" class="elementor-button-link elementor-button elementor-size-sm" style="padding: 6px 15px;text-decoration: none;">Go</a></div><div id="cartPartyBuilderEmailWarning" style="display:none">Pleave provide a valid email address.</div> <br><br></div><div id="cartCustomMessage" style="display:none;text-align:center"></div><div id="cartWarning" class="clearfix"></div><div id="deliveryMethodWarning" class="clearfix">Some items are not available for the selected delivery method.</div> <span class="io_locationRedirectLink">You may not be on the correct site. Click here to change location.</span><div id="cartData" class="clearfix"><div class="simpleCart_items"></div></div><div class="cartSubtotalBox"> Subtotal (estimate):<div id="cartSubtotal"></div></div><div class="checkDeliveryCartContainer"><div id="checkDeliveryMessage" class="cartDeliverytotalBox"><a class="cartLink" href="javascript:;" onClick="showAddressEntry(true)">Check Delivery</a></div><div id="deliverSubtotalContainer" class="cartDeliverytotalBox"> Delivery Fee (<span><a class="cartLink" href="javascript:;" onClick="showAddressEntry(true)">Change Address</a></span>):<div id="deliverySubtotal"></div></div></div><div id="cartCheckoutButton" class="clearfix"><div class="elementor-widget-button"> <a href="javascript:cartHide();
238" class="simpleCart_continue elementor-button elementor-size-sm elementor-animation-grow io_button">Continue Shopping</a> <a href="javascript:;" class="simpleCart_checkout elementor-button elementor-size-sm elementor-animation-grow io_button">Checkout</a></div><div id="cart-carousel-container" style="display:none"> <label> Some items you may be interested in: </label> <br><div class="cart-carousel"></div></div><div class="ioLink"><a href="https://www.inflatableoffice.com" target="_blank">powered by io</a></div></div></div>
238<script>/* configurable globals */ 239 var start_default = "11:00 am"; 240 if(io_default_start_time != "") start_default = io_default_start_time; 241 var end_default = "3:00 pm"; 242 if(io_default_end_time != "") end_default = io_default_end_time; 243 244 if(io_user_currency){ 245 var currency = io_user_currency; 246 } else{ 247 var currency = "USD"; 248 } 249 250 if(io_user_country){ 251 var country = io_user_country; 252 } else{ 253 var country = "US"; 254 } 255 256 257 var timeFormat = "g:i a"; 258 if(io_cart_time_format != "") timeFormat = io_cart_time_format; 259 var dateFormat = "m/d/yy"; 260 if(io_cart_date_format != "") dateFormat = io_cart_date_format; 261 262 var restrictTimes = false; 263 if(io_restrict_times === "on") restrictTimes = true; 264 var restrictTimeStart = start_default; 265 if(io_restrict_time_start != "") restrictTimeStart = io_restrict_time_start; 266 var restrictTimeEnd = end_default; 267 if(io_restrict_time_end != "") restrictTimeEnd = io_restrict_time_end; 268 269 270 var multi_day = true; 271 if(io_multidayquote === "off" || io_cartdayselect == "Single Day") multi_day = false; 272 var in_cart_upsell = false; 273 if(io_incartupsell === "on") in_cart_upsell = true; 274 var io_distance_charge = false; 275 if(io_distancecharge === "on") io_distance_charge = true; 276 277 /* other globals */ 278 var pallet_color1 = ""; /* set in onready */ 279 /* track the date start/end of calendar clicking */ 280 var click_count = 0; 281 282 /* for configuring upsell carosel in cart */ 283 var cart_carousel_set = false; 284 285 /* for checking when we remove an item from the cart */ 286 var last_remove = 0; 287 var last_upsell_call = 0; 288 289 /* for buffering cart qty changes checkAvail calls for qty change only */ 290 var last_checkAvail_call = 0; 291 292 /* for cart loading animation */ 293 var io_cart_loading_active = false; 294 var io_cart_loading_count = 0; 295 var io_cart_loading_fallback_timer = null; 296 297 /*var start_default = "11:00"; 298 var end_default = "15:00"; 299 var currency = "EUR"; 300 var timeFormat = "G:i"; 301 var dateFormat = "d/m/yy";*/ 302 303 304 /* For weekday weekend pricing */ 305 var use_weekday_weekend = false; 306 if(io_weekEndPrice == "on") use_weekday_weekend = true; 307 308 /* Accessory and Upsell Prices */ 309 var show_accessory_price = false; 310 if(io_accessory_price == "on") show_accessory_price = true; 311 var show_upsell_price = false; 312 if(io_upsell_price == "on") show_upsell_price = true; 313 314 /* For customer geolocation shortcode */ 315 var storage_key = 'io_customer_location'; 316 317 /*<editor-fold defaultstate="collapsed" desc="On Ready">*/ 318 jQuery(document).ready(function () { 319 pallet_color1 = "var( --e-global-color-accent,green )"; 320 if(pallet_color1=="rgba(0, 0, 0, 0)" || pallet_color1=="rgb(255, 255, 255)") pallet_color1="rgb(25, 147, 35)"; 321 322 /*<editor-fold defaultstate="collapsed" desc="SimpleCart Init">*/ 323 simpleCart({ 324 currency: currency, 325 cartColumns: [{ 326 view: "image", 327 attr: "image", 328 label: "Image" 329 }, 330 { 331 attr: "name", 332 label: "Name" 333 }, 334 { 335 attr: "encoded", 336 label: false 337 }, 338 { 339 attr: "rentalid", 340 label: false 341 }, 342 { 343 attr: "availability", 344 label: false 345 }, 346 { 347 view: "decrement", 348 label: false, 349 text: "<i class='fas far fa-minus-square' style='color:" + pallet_color1 + "'></i>" 350 }, 351 { 352 view: "calculate_area", 353 label: false 354 }, 355 { 356 view:"input", 357 attr:"quantity" 358 359 }, 360 { 361 attr: "qtyincrement", 362 label: false 363 }, 364 { 365 attr: "inputtype", 366 label: false 367 }, 368 { 369 attr: "qtytype", 370 label: false 371 }, 372 { 373 attr: "vendorid", 374 label: false 375 }, 376 { 377 view: "increment", 378 label: false, 379 text: "<i class='fas far fa-plus-square' style='color:" + pallet_color1 + "'></i>" 380 }, 381 { 382 attr: "price", 383 label: "Price", 384 view: 'currency' 385 }, 386 { 387 view: "remove", 388 label: false,
389 text: "<i class='fas fa-trash' style='color:" + pallet_color1 + "'></i>" 390 }, 391 { 392 attr: "total", 393 label: "SubTotal", 394 view: 'currency' 395 }, 396 { 397 attr: "timeslots", 398 label: false 399 }, 400 { 401 attr: "timeslots-orig", 402 label: false 403 }, 404 { 405 attr: "href", 406 label: false 407 }, 408 { 409 attr: "linkqty", 410 label: false 411 }, 412 { 413 attr: "acc_dd_parent_limit", 414 label: false 415 } 416 ], 417 checkout: { 418 type: "SendForm", 419 method: "GET", 420 url: io_wp_local_path+"/io_quoteform/", 421 extra_data: { 422 /* name: decodeURIComponent("Mountain Bouncers LLC".replace(/[+]/gi, " ")), */ 423 clear_rentals: "1", 424 selected_only: "1", 425 wp_checkout: "1", 426 startdate: "", 427 enddate: "", 428 starttime: "", 429 endtime: "", 430 io_custguid: "" 431 } 432 } 433 }); 434 435 simpleCart.bind('update', cart_onUpdate); 436 simpleCart.bind('beforeSave', cart_hideTimepickerWrapper); 437 simpleCart.bind('beforeRemove', cart_beforeRemove); 438 simpleCart.bind('afterRemove', cart_afterRemove); 439 simpleCart.bind('afterQtyChange', cart_afterQtyChange); 440 simpleCart.bind('beforeCheckout', cart_beforeCheckout); 441 simpleCart.bind('afterAdd', cart_afterAdd); 442 simpleCart.bind('beforeAdd', cart_beforeAdd); 443 simpleCart.bind('load', cart_afterLoad) 444 /*</editor-fold>*/ 445 446 /* showAvail(""); */ 447 let io_star_pic = document.querySelector("#io_star_pic"); 448 if (io_star_pic != null) { 449 let io_star_src = io_star_pic.src; 450 if (io_star_src.indexOf("0star") > -1 || io_star_src.indexOf("1star") > -1 || io_star_src.indexOf("2star") > -1 || 451 io_star_src.indexOf("3star") > -1) { 452 io_star_pic.style.display = "none"; 453 } 454 } 455 456 /*<editor-fold desc="Build Thumb Images">*/ 457 /* build multiple thumb images */ 458 459 /*</editor-fold>*/ 460 461 /*<editor-fold desc="Set up Accessories">*/ 462 /* Add Add To Cart Buttons */ 463 let button_add = document.querySelector("#bookNowBtn"); 464 var main_id = 0; 465 if(jQuery(".io_product_container .item_rentalid")){ 466 main_id = jQuery(".io_product_container .item_rentalid").first().text(); 467 } 468 /* if main item is dd but not pkg (linen code) */ 469 if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){ 470 /* if order is defined, then reorder here. */ 471 var acc_cls = jQuery('.io_product_accessories') 472 acc_cls.hide(); 473 let pkg = document.querySelector(".io_product_acc_pkg"); 474 if(pkg==undefined){ 475 pkg = document.createElement("div"); 476 pkg.classList.add("io_product_acc_pkg"); 477 pkg.style.textAlign = "center"; 478 acc_cls.after(pkg); 479 } 480 for (let [key, value] of acc_obj_relate) { 481 elem = getAccElem(key,main_id); 482 if(elem){ 483 btn = makeAccBtn(elem,main_id); 484 pkg.append(btn); 485 } 486 487 } 488 let line = document.createElement("div"); 489 line.innerHTML = "<br>"; 490 pkg.append(line.cloneNode(true)); 491 for (let [key, value] of acc_obj_relate) { 492 for (key2 in acc_obj_relate.get(key)) { 493 if(Object.keys(value[key2]).length > 0){ 494 /* 3rd level */ 495 pkg.append(line.cloneNode(true)); 496 for (key3 in acc_obj_relate.get(key)[key2]) { 497 elem = getAccElem(key3,key2); 498 if(elem){ 499 btn = makeAccBtn(elem,key2); 500 btn.style.display = "none"; 501 pkg.append(btn); 502 } 503 } 504 }else{ 505 elem = getAccElem(key2,key); 506 if(elem){ 507 btn = makeAccBtn(elem,key); 508 btn.style.display = "none"; 509 pkg.append(btn); 510 } 511 512 } 513 } 514 } 515 }else { 516 let access_array = document.querySelectorAll(".io_acc_li"); 517 let count = 0; 518 for (let i of access_array) { 519 let path = i.id.replace("io_acc_",""); 520 count++; 521 let newButton = button_add.cloneNode(true); 522 newButton.id = button_add.id + count; 523 newButton.classList.remove("elementor-animation-grow"); 524 newButton.classList.add("elementor-animation-shrink"); 525 526 let path_arr = path.split("_"); 527 let pid = parseInt(path_arr[0]); 528 let this_id = parseInt(path_arr[1]); 529 if(path_arr.length==1) pid=0; 530 531 if(jQuery("#io_acc_accessorydd_"+path).first().text()==1){ 532 /* display different to provide choices in dd */ 533 //main_id = pid; 534 }else{ 535 /* hide accessories inside a pkg when under an accessory choice item until clicked */ 536 if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){ 537 }else{ 538 /* jpa - not finished/tested yet */ 539 /*jQuery("#io_acc_"+path).hide();*/ 540 } 541 /* Fix broken images for accessories. */ 542 let img_box = document.querySelectorAll(".io_acc_li_img_thumb"); 543 let firstImg = true; 544 let lastAcc = ""; 545 for (let i of img_box) { 546 if(lastAcc=="") lastAcc = i.id;
547 if(lastAcc!=i.id){ 548 lastAcc = i.id; 549 firstImg = true; 550 } 551 let io_img_src = i.src; 552 if(io_img_src!==null) io_img_src = io_img_src.toLowerCase(); 553 let io_img_datasrc = i.getAttribute("data-src"); 554 if(io_img_datasrc===null){ 555 io_img_datasrc = ""; 556 }else{ 557 io_img_datasrc = io_img_datasrc.toLowerCase(); 558 } 559 if ((io_img_src.indexOf("io_noimage.png") >= 0 || io_img_datasrc.indexOf("io_noimage.png") >= 0) || (io_img_src.indexOf(".jpg") == -1 && io_img_src.indexOf(".jpe") == -1 && io_img_src.indexOf(".png") == -1 && io_img_src.indexOf(".gif") == -1 && io_img_src.indexOf(".tif") == -1 && io_img_src.indexOf(".webp") == -1)){ 560 i.style.display = "none"; 561 }else if(!firstImg && jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()!=1){ 562 i.style.display = "none"; 563 } 564 firstImg = false; 565 } 566 if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){ 567 /* Make the accessory category look more mike a label. */ 568 jQuery("#iothumb_"+main_id+"_"+pid).hide(); 569 jQuery("#io_acc_"+main_id+"_"+pid).css("border", "none"); 570 jQuery("#io_acc_"+main_id+"_"+pid).css("width", "100%"); 571 jQuery("#io_acc_"+main_id+"_"+pid).css("margin-bottom", "5vh"); 572 jQuery("#io_acc_"+main_id+"_"+pid).css("box-shadow", "none"); 573 jQuery("#io_acc_shortname_"+pid).css("font-weight", "bold"); 574 jQuery("#io_acc_shortname_"+pid).css("position", "absolute"); 575 /* Make this auto selected to fix an issue where we can not add to cart if this item is 576 a child of another hidden accessory on screen */ 577 jQuery("#io_acc_"+main_id+"_"+pid).prop("selected", true); 578 accessory_cat_text = jQuery("#io_acc_shortname_"+pid).first().text(); 579 /* This is necessary to make sure there are not multiple colons. */ 580 if(!accessory_cat_text.includes(":")){ 581 jQuery("#io_acc_shortname_"+pid).text(accessory_cat_text+":"); 582 } 583 /* Remove Href so we do not open images on click for dd accessories. */ 584 jQuery("[id^=io_acc_imgbig_"+pid+"_]").removeAttr("href"); 585 586 /* Get the accessory limit for this set of acessories, then set up click events. */ 587 /* Unbind is used to prevent cascading calls. */ 588 accLmt = parseInt(jQuery("#io_acc_accessorylimit_"+main_id+"_"+pid).prop("textContent")); 589 jQuery("[id^=io_acc_"+pid+"_]").unbind("click").click({pid: pid, accLmt: accLmt}, accDDClicked); 590 jQuery("[id^=io_acc_"+pid+"_]").css("cursor", "pointer"); 591 /* Set up the slected property of all children accessories. Default to false. */ 592 jQuery("[id^=io_acc_"+pid+"_]").prop("selected", false); 593 /* We need to add a hidden button so we can simulate a click on add_item for the cart. */ 594 let newButton = button_add.cloneNode(true); 595 newButton.id = button_add.id + count; 596 newButton.classList.remove("elementor-animation-grow"); 597 newButton.setAttribute("style", "display: none !important"); 598 i.appendChild(newButton); 599 }else{ 600 let button_wrap = document.createElement("div"); 601 button_wrap.classList.add("elementor-widget-button"); 602 button_wrap.classList.add("io_access_button"); 603 button_wrap.appendChild(newButton); 604 let req = false; 605 if(jQuery("#io_acc_required_"+path).first().text()>0) req = true; 606 if(!req){ 607 i.appendChild(button_wrap); 608 }else{ 609 var textnode = document.createTextNode("Included"); 610 i.appendChild(textnode); 611 } 612 } 613 } 614 } 615 } 616 /*</editor-fold>*/ 617 618 let upsell_array = document.querySelectorAll(".io_upsell_li"); 619 count = 0; 620 for (let i of upsell_array) { 621 count++; 622 let newButton = button_add.cloneNode(true); 623 newButton.id = button_add.id + count; 624 newButton.classList.remove("elementor-animation-grow"); 625 newButton.classList.add("elementor-animation-shrink"); 626 627 let button_wrap = document.createElement("div"); 628 button_wrap.classList.add("elementor-widget-button"); 629 button_wrap.classList.add("io_upsell_button"); 630 button_wrap.appendChild(newButton); 631 i.appendChild(button_wrap); 632 } 633 634 if(io_deliverymethod == "on" && jQuery(".calDeliveryMethodLabel").length==0){ 635 let delivery_method_container = jQuery("#ioDeliveryMethodContainer").first(); 636 delivery_method_container.append('<span class="calDeliveryMethodLabel">Select Delivery Method</span>'); 637 let delivery_method_html = '<select class="ioDeliveryMethods" onchange="deliveryMethodSelected()">'; 638 let delivery_methods = Object.keys(io_delivery_methods) 639 for(const index in delivery_methods){ 640 if(!io_delivery_methods_restrict){ 641 delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>'; 642 if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14); 643 }else if( !io_delivery_methods_restrict.includes( io_delivery_methods[ delivery_methods[index] ]["id"] ) ){ 644 delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>'; 645 if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14); 646 } 647 } 648 delivery_method_container.append(delivery_method_html); 649 delivery_method_container.show(); 650 if(getCookie("io_delivery_method")){ 651 jQuery(".ioDeliveryMethods").val(getCookie("io_delivery_method")); 652 } 653 }else{
654 setCookie("io_delivery_method", "", 14); 655 } 656 657 let allow_same_day = 1; 658 if(io_cartAllowSameDay == "on"){ 659 allow_same_day = 0; 660 } 661 662 /*<editor-fold desc="Cart Calandar and Time Settings Setup">*/ 663 //var fullmonth_array = jQuery.datepicker.regional["en"].monthNames; 664 jQuery("#cartCalendar").datepicker({ 665 changeMonth: true, 666 changeYear: true, 667 //monthNamesShort : fullmonth_array, 668 dateFormat: dateFormat, 669 rangeSelect: true, 670 numberOfMonths: 1, 671 stepMonths: 1, 672 prevText: "<< Previous Months", 673 nextText: "Next Months >>", 674 speed: "fast", 675 showOn: "both", 676 onChangeMonthYear: cal_onChangeMonthYear, 677 onSelect: cal_onSelect, 678 buttonText: "Calendar", 679 minDate: allow_same_day, 680 firstDay: 0 681 }); 682 jQuery(".ui-datepicker-trigger").hide(); 683 if(restrictTimes){ 684 jQuery(".timepicker").timepicker({ 685 startTime: new Date(0, 0, 10, 0, 0, 0), 686 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 687 minTime:restrictTimeStart, 688 maxTime:restrictTimeEnd, 689 /*show24Hours: $show24Hours,*/ 690 timeFormat: timeFormat, 691 separator: ":", 692 className: "elementor-widget-text-editor", 693 step: 15, 694 disableTouchKeyboard: true 695 }).keypress(function(e){ 696 e.preventDefault(); 697 }); 698 } else{ 699 jQuery(".timepicker").timepicker({ 700 startTime: new Date(0, 0, 10, 0, 0, 0), 701 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 702 /*show24Hours: $show24Hours,*/ 703 timeFormat: timeFormat, 704 separator: ":", 705 className: "elementor-widget-text-editor", 706 step: 15, 707 disableTouchKeyboard: true 708 }); 709 } 710 711 /* if we have company wide timeslots, alter time select in cart. Do this only if we are set to single day only */ 712 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 713 let time_select_container = jQuery("#ioCartTimeSelectContainer").first(); 714 time_select_container.empty(); 715 let selected_date_html = '<span style="margin-right: 5px !important" class="calTimeLabel">Date</span><i class="fas fa-calendar-check"></i><input style="margin-left: 5px !important" type="text" name="dateStart" class="ioCartDateInput" readonly="readonly" /><input style="display: none !important" type="text" name="dateEnd" class="ioCartDateInput" readonly="readonly" />' 716 time_select_container.append(selected_date_html); 717 time_select_container.append("<br>") 718 time_select_container.append('<span class="calTimeLabel">Select Timeslot</span>'); 719 let timeslot_html = '<select class="ioCartCompanyTimeslots">'; 720 for(i=0; i<io_company_timeslots.length; ++i){ 721 timeslot_html += io_company_timeslots[i]; 722 } 723 timeslot_html += "</select>" 724 time_select_container.append(timeslot_html); 725 726 } 727 728 // Timeslot element on Quote Form 729 const timeslotSelectElement = jQuery(".controls select[name=timeslot]"); 730 731 /* jQuery( ".datepicker" ).datepicker({dateFormat: "m/d/yy",minDate:0}); */ 732 /* jQuery( ".datepicker" ).val(getCookie("checkDate")); */ 733 start_date = getCookie("io_dateStart"); 734 end_date = getCookie("io_dateEnd"); 735 start_time = getCookie("io_timeStart"); 736 end_time = getCookie("io_timeEnd"); 737 jQuery("input[name=dateStart]").val(start_date); 738 jQuery("input[name=dateEnd]").val(end_date); 739 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 740 jQuery(".ioCartCompanyTimeslots").val(getCookie("company_timeslot_selected")); 741 // Set it on the quote page too. 742 timeslotSelectElement.val(getCookie("io_company_timeslot_selected")); 743 } else{ 744 jQuery("input[name=timeStart]").val(start_time); 745 jQuery("input[name=timeEnd]").val(end_time); 746 } 747 748 timeslotSelectElement.on('change', function() { 749 // IO-31167: Upon timeslot change on Quote Form, 750 // update timeslot cookie value for persistence 751 if(this.value) { 752 setCookie('io_company_timeslot_selected', this.value, 14); 753 } 754 }); 755 756 if (jQuery("input[name=dateEnd]").val() != "") {
757 setCalBackground(); 758 jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total())); 759 if(getCookie("io_dateApplied") === "true") calCancel(); 760 else { 761 jQuery("input[name=dateStart]").val(getCookie("io_dateStart")); 762 jQuery("input[name=dateEnd]").val(getCookie("io_dateEnd")); 763 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 764 jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected")); 765 } 766 else if(io_force_blank_timepickers == "on") 767 { 768 setCookie("io_timeStart", "", 14); 769 setCookie("io_timeEnd", "", 14); 770 jQuery('[name=timeStart]').val(""); 771 jQuery('[name=timeEnd]').val(""); 772 } 773 else{ 774 jQuery("input[name=timeStart]").val(getCookie("io_timeStart")); 775 jQuery("input[name=timeEnd]").val(getCookie("io_timeEnd")); 776 } 777 778 jQuery(".changeDateLinkWrapper").hide(); 779 } 780 } 781 /*</editor-fold>*/ 782 783 jQuery("#io-dialog").dialog({ 784 autoOpen: false, 785 resizable: false, 786 modal: true, 787 dialogClass: "noTitleStuff", 788 width: 350, 789 open: function () { 790 jQuery(".ui-widget-overlay").bind("click", function () { 791 jQuery("#io-dialog").dialog("close"); 792 }) 793 } 794 }); 795 796 /* change jquery calendar next/prev buttons to fa arrows w/matching site color */ 797 jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1); 798 jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").css("color", pallet_color1); 799 800 /* hide sections if not set */ 801 if(jQuery(".io_product_circuits_right").first().text()=="0"){jQuery(".io_product_circuits_right,.io_product_circuits_left").hide();} 802 if(jQuery(".io_city_list").html()==""){jQuery(".io_landingpages").hide();} 803 /* using this instead as it will handle custom ones added */ 804 let io_field_valbox = document.querySelector(".io_product_infobox"); 805 if (io_field_valbox != null || io_field_valbox != undefined) { 806 let io_field_valarr = io_field_valbox.querySelectorAll(".io_product_detail_box"); 807 for (let i of io_field_valarr) { 808 let check = i.querySelector("p:nth-child(2)"); 809 if (check != null && check.innerText == "") i.style.display = "none"; 810 } 811 } 812 813 /* Hide description if there is no description */ 814 desc_box = document.querySelector(".io_product_desc") 815 if(desc_box != null && desc_box.innerText.length == 0 && desc_box.innerHTML.length == 0){ 816 desc_detail_box = desc_box.parentElement; 817 desc_detail_box.style.display = "none"; 818 } 819 820 if(document.querySelector(".io_product_reviewbox")!=null){ 821 if (document.querySelector(".io_product_reviewbox").innerText == "") { 822 if(document.querySelector(".io_star_rating")!=null) document.querySelector(".io_star_rating a").style.display = "none"; 823 } 824 } 825 826 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 827 let regex = new RegExp("^io_product_price_.*_" + rid + "$"); 828 for (const price_index in io_prices){ 829 if(regex.test(io_prices[price_index])){ 830 use_weekday_weekend = false; 831 } 832 } 833 834 /* hide end date input. */ 835 if(!multi_day){ 836 /* TODO: Need to wait and see if this is necessary. If so needs to be more involved than this. */ 837 /* jQuery("input[name=dateEnd]").style("visibility", "hidden"); */ 838 } 839 /* Call page avail now so we can display live price if its enabled */ 840 setTimeout(function(){ 841 if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){ 842 jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 843 checkAvailPageOnly(); 844 }else{ 845 checkAvailPageOnly(); 846 } 847 },50); 848 849 /* Adjust picbox for header heights */ 850 setTimeout(adjustPicBoxForHeader,500); 851 852 /* Show buttons for distance charge check if the setting is on. Hide or show map button if applicable*/ 853 if(io_distance_charge){ 854 jQuery(".delivery_charge_check_container").show(); 855 jQuery(".calc_price_with_map_container").hide(); 856 jQuery(".checkDeliveryCartContainer").show(); 857 } else { 858 jQuery(".delivery_charge_check_container").hide(); 859 jQuery(".calc_price_with_map_container").hide(); 860 jQuery(".checkDeliveryCartContainer").hide(); 861 } 862 if(io_brand=="EH"){ 863 jQuery(".delivery_charge_check_container").hide(); 864 jQuery(".eh_additional_description").show(); 865 } 866 if(jQuery(".io_product_infobox .item_inputtype").text() === "Map"){ 867 jQuery(".delivery_charge_check_container").hide(); 868 jQuery(".checkDeliveryCartContainer").hide(); 869 jQuery(".calc_price_with_map_container").show(); 870 } 871 872 /* If we have delivery set in cookie, be sure to show the charge in the cart. */ 873 if(getCookie("io_deliveryFee") && simpleCart.items().length > 0) { 874 setDeliverySubtotal(getCookie("io_deliveryFee")); 875 jQuery("#deliverSubtotalContainer").show(); 876 jQuery("#checkDeliveryMessage").hide(); 877 } else{ 878 jQuery("#deliverSubtotalContainer").hide(); 879 } 880 881 /* moved back here for IO-22561 */ 882 if(simpleCart.items().length > 0){ 883 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 884 headerBookButton.addClass("ioCart_link"); 885 headerBookButton.attr("href", "javascript:;"); 886 } 887 jQuery(".cartInfo").unbind("click").one("click", function(event){ 888 event.stopPropagation(); 889 event.stopImmediatePropagation(); 890 cartShow(); 891 }); 892 jQuery(".ioCart,.ioCart_link").unbind("click").one("click", function(event){ 893 event.stopPropagation(); 894 event.stopImmediatePropagation(); 895 cartShow(); 896 }); 897 898 /* hide if click outside cart */ 899 jQuery(document).mouseup(function(e){ 900 var container = jQuery("#cartPopover"); 901 var cartButton = jQuery(".cartInfo, .ioCart, .ioCart_link"); 902 var addButton = jQuery(".item_add"); 903 var timePicker = jQuery(".ui-timepicker-wrapper"); 904 905 if(jQuery(".cartInfo, .ioCart, .ioCart_link").hasClass("open")){ 906 if(!container.is(e.target) && container.has(e.target).length === 0 && !cartButton.is(e.target) && cartButton.has(e.target).length === 0 && !addButton.is(e.target) && addButton.has(e.target).length === 0 && !timePicker.is(e.target) && timePicker.has(e.target).length === 0 && !jQuery(".address_entry").is(e.target) && jQuery(".address_entry").has(e.target).length === 0){ 907 cartHide(); 908 } 909 } 910 }); 911 912 if(!getCookie("io_state") && io_default_state){
913 setCookie("io_state", io_default_state, 14); 914 } 915 if(country != "US") { 916 jQuery("#io_cd_state").replaceWith('<input id="io_cd_state" style="display: table-cell" name="state" type="text"></input>'); 917 jQuery("#io_cdl_zip_label").text("Postal code"); 918 if(country == "CA"){ 919 jQuery("#io_cdl_state_label").text("Province"); 920 } else if(country == "AU"){ 921 jQuery("#io_cdl_city_label").text("Suburb"); 922 } 923 } else{ 924 jQuery("#io_cd_zip").attr("type", "number"); 925 } 926 /* Set up on change events to stop end timepickers from allowing users to pick times before start time */ 927 setTimeout(restrictEndTimepickers, 500); 928 if(io_hide_end_time == "on" && io_default_duration > 0){ 929 jQuery('[name="timeEnd"]').parent().hide(); 930 // Hide end time stuff on checkout page and in the text. 931 jQuery(".io_event_body_time .control-group:nth-child(2)").hide(); 932 jQuery(".io_event_body_time_display_text").text(jQuery(".io_event_body_time_display_text").text().replace(/\s*→.*/, "")) 933 jQuery('[name="timeStart"]').change(function(){ 934 const regex = /^(\d{1,2}):(\d{2})(?:\s*([AP]M))?$/i; 935 const match = this.value.match(regex); 936 937 let hours = parseInt(match[1], 10); 938 const minutes = parseInt(match[2], 10); 939 const period = match[3] ? match[3].toUpperCase() : null; 940 941 if (period) { 942 if (period === "PM" && hours !== 12) hours += 12; 943 if (period === "AM" && hours === 12) hours = 0; 944 } 945 946 const baseDate = new Date(1970, 0, 1, hours, minutes); 947 const newTime = new Date(baseDate.getTime() + io_default_duration * 3600000); 948 949 if (period) { 950 // 12-hour 951 let newHours = newTime.getHours(); 952 const newMinutes = newTime.getMinutes(); 953 const newPeriod = newHours >= 12 ? "PM" : "AM"; 954 newHours = newHours % 12; 955 if (newHours === 0) newHours = 12; 956 let end_time = `${newHours}:${newMinutes.toString().padStart(2, "0")} ${newPeriod}`; 957 jQuery('[name="timeEnd"]').val(end_time); 958 } else { 959 // 24 hour 960 let end_time = `${newTime.getHours().toString().padStart(2, "0")}:${newTime.getMinutes().toString().padStart(2, "0")}`; 961 jQuery('[name="timeEnd"]').val(end_time); 962 } 963 }); 964 } 965 966 /* If we have a custom message in cart, display it. */ 967 if(io_cart_message){ 968 show_cart_message(); 969 } 970 971 /* code for day select in cart */ 972 if(io_cartdayselect == "dropdown_options" && io_multidayquote === "on"){ 973 saved_whatday = getCookie("io_whatday"); 974 if(saved_whatday) jQuery("#whatday").val(saved_whatday); 975 endDisplay(); 976 setCalBackground(); 977 } else{ 978 jQuery("#div-overnight").hide(); 979 jQuery("#whatday").val(""); 980 } 981 982 checkRestrictedDeliveries() 983 /* If we are using the information gathering tool, we do not want to show this message. */ 984 if( live_pricing_is_on() && io_info_required == "off" ){ 985 if(!event_time_set() && io_always_display_live_price != "on"){ 986 jQuery("#item_live_price_time_set_message").show(); 987 }else{ 988 jQuery("#item_live_price_time_set_message").hide(); 989 } 990 } 991 992 993 /* Check if information gathering header exists. If it does, Remove set even button and add some classes on onclicks */ 994 if(jQuery("#ioInfoHeader").length){ 995 remove_set_event_buttton(); 996 add_classes_and_onClicks(); 997 header_increment_step(); 998 } 999 1000 jQuery(".io_acc_li").each(function() { 1001 if(jQuery(this).find(".item_required").first().text() > 0 && jQuery(this).find(".item_accessorydd").first().text() == 1){ 1002 jQuery(jQuery(jQuery(this).parent()).prev()).appendTo(".io_product_requiredDD_accessories"); 1003 jQuery(jQuery(this).parent()).appendTo(".io_product_requiredDD_accessories"); 1004 jQuery(".io_product_requiredDD_accessories").show(); 1005 } 1006 }); 1007 1008 if(jQuery(".io_product_accessories .io_acc_li").length == 0) jQuery(".io_product_accessories").hide(); 1009 1010 /* Hide the cart add button for items with required accessories on category page */ 1011 jQuery(".item_hasRequiredAcc").each(function() { 1012 if (this.innerText == '1') { 1013 let rental_id_element = jQuery(this).parent().find(".item_rentalid")[0]; 1014 let addCartButton = jQuery(".io_item2_list_inner .add_cart_" + rental_id_element.innerText).find('.io_button'); 1015 addCartButton.removeClass("item_add"); 1016 addCartButton.html('<i class="fas fa-arrow-right"></i>'); 1017 1018 let itemHref = jQuery(this).parent().find(".item_href").text(); 1019 addCartButton.attr('href', itemHref); 1020 } 1021 }); 1022 1023 1024 /* If they have same day selection allowed, need to update checkout page datepicker on delay to make sure it works */ 1025 if(io_cartAllowSameDay == "on"){ 1026 setTimeout(allow_same_day_select_on_checkout, 500); 1027 } 1028 1029 if(io_info_required_data && io_info_required == "on"){ 1030 let io_required_data = io_info_required_data; 1031 jQuery("#ioAdditonalInformationContainer").show(); 1032 for (const [data, value] of Object.entries(io_required_data)) { 1033 if(value == 1){ 1034 jQuery("#io_info_modal_"+data).css("display", "inline-flex") 1035 jQuery("#io_im_"+data).val(getCookie(data)); 1036 } 1037 } 1038 show_or_hide_required_info_message() 1039 } 1040 if(jQuery(".bootstrap-timepicker").length == 0) { 1041 if (!/Mobi|Android/i.test(navigator.userAgent)) { 1042 jQuery("#cartPopover").scroll(function () { 1043 jQuery("[name=timeStart]").timepicker("hide"); 1044 jQuery("[name=timeEnd]").timepicker("hide"); 1045 }); 1046 jQuery(window).scroll(function () { 1047 jQuery("#cartPopover [name=timeStart]").timepicker("hide"); 1048 jQuery("#cartPopover [name=timeEnd]").timepicker("hide"); 1049 }); 1050 } 1051 } 1052 1053 if(jQuery(".io_product_infobox .item_inputtype").text() == "Map"){
1054 simpleCart.items().forEach(function (item, index){ 1055 if(item.get("rentalid") === jQuery(".io_product_infobox .item_rentalid").text()){ 1056 if(item.get("quantity") > 1){ 1057 let units; 1058 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 1059 units = "sq meters" 1060 if(country === "US") units = "sq feet" 1061 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 1062 units = "meters" 1063 if(country === "US") units = "feet" 1064 } 1065 set_price_on_item_page(units, item.get("quantity")); 1066 } 1067 } 1068 }); 1069 } 1070 /* IO-21808 */ 1071 jQuery(".io_product_price_box").each(function() { 1072 let classes = jQuery(this).attr("class"); 1073 jQuery(this).attr("class", classes.replace(":", "_")); 1074 }); 1075 1076 /* Set time instructions (IO-21496) */ 1077 set_cart_time_instructions(); 1078 1079 if(io_accessory_select === "on"){ 1080 if(jQuery(".io_product_acc_pkg").children().length > 0){ 1081 let main_rental_id = jQuery(".item_rentalid").text(); 1082 let sel_div = jQuery("<div class=\"io_product_acc_pkg\" style=\"display:flex; margin-top:10px;\"></div>"); 1083 let sel = jQuery("<select class=\"io_product_acc_pkg\" onchange=\"accOnClick(this)\" />"); 1084 sel.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>") 1085 jQuery("[id^=io_acc_shortname_"+main_rental_id+"]").each(function(){ 1086 sel.append("<option value="+this.id+">"+this.innerHTML+"</option>") 1087 if(this.id.split("_").length > 4){ 1088 let split_id = this.id.split("_"); 1089 let option_rental_id = split_id[split_id.length - 1]; 1090 let sel2 = jQuery("<select id=\"io_product_acc_pkg_sel_"+option_rental_id+"\" style=\"display:none; margin-left:5px;\" onchange=\"accOnClick(this)\" />"); 1091 sel2.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>") 1092 jQuery("[id^=io_acc_shortname_"+option_rental_id+"_]").each(function(){ 1093 sel2.append("<option value="+this.id+">"+this.innerHTML+"</option>") 1094 }); 1095 sel_div.append(sel2); 1096 } 1097 }); 1098 sel_div.prepend(sel); 1099 jQuery(".io_product_acc_pkg").replaceWith(sel_div); 1100 } 1101 } 1102 if(io_cart_party_planner_email === "on" && io_cart_party_planner_destination){ 1103 jQuery("#cartPartyBuilderEmailContainer").show() 1104 if(getCookie("io_email")){ 1105 jQuery("#cartPartyBuilderEmailInput").val(getCookie("io_email")); 1106 } 1107 } 1108 1109 if(io_brand == "PW"){ 1110 jQuery(".io_product_price_box").attr("style", "display: none !important;"); 1111 jQuery(".io_product_price_sqfoot").attr("style", "display: grid !important;"); 1112 } 1113 1114 setTimeout(simpleCart.init, 100); 1115 if(io_hide_zero == 1){ 1116 jQuery(".io_product_price_top_left").each(function (){ 1117 if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){ 1118 jQuery(this).parent().attr('style','display:none !important'); 1119 } 1120 }); 1121 jQuery(".io_product_price_left").each(function (){ 1122 if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){ 1123 jQuery(this).parent().attr('style','display:none !important'); 1124 } 1125 }); 1126 } 1127 if (io_categoryVariantImages == 'on'){ 1128 jQuery(".io_category_thumbox").show(); 1129 jQuery('.view-product-button').addClass('view-product-button2') 1130 } 1131 let giftcard_value = jQuery(".item_giftcardvalue"); 1132 if(giftcard_value && giftcard_value.text()){ 1133 jQuery(".delivery_charge_check_container").hide(); 1134 } 1135 1136 if (io_customer_geolocation == 'on') initializeGeolocation(); 1137 }); /*end of on-ready*/ 1138 /*</editor-fold>*/ 1139 1140 /*<editor-fold defaultstate="collapsed" desc="Helper Functions">*/ 1141 function phraseUpdateCount(inputElement) 1142 { 1143 //read the text and strip out spaces 1144 const fullText = inputElement.value; 1145 const lettersOnly = fullText.replace(/\s+/g, ""); 1146 const count = lettersOnly.length; 1147 1148 const cookieKey = inputElement.classList[0]; 1149 1150 document.querySelector(".item_quantity").textContent = count; 1151
1152 setCookie(cookieKey, fullText, 45); 1153 } 1154 function io_party_planner_email_submit(){ 1155 let valid_regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 1156 let email = jQuery("#cartPartyBuilderEmailInput").val(); 1157 if(email){ 1158 if(email.match(valid_regex)){ 1159 setCookie("io_email", email, 14); 1160 window.open(io_cart_party_planner_destination, '_blank').focus(); 1161 }else{ 1162 jQuery("#cartPartyBuilderEmailWarning").show(); 1163 } 1164 }else{ 1165 jQuery("#cartPartyBuilderEmailWarning").show(); 1166 } 1167 } 1168 1169 function rid_in_batch(rid, batch_ids){ 1170 let result = batch_ids.filter(function(batch){ 1171 if(batch.includes(this)) return true; 1172 }, rid); 1173 return result 1174 } 1175 1176 function set_cart_time_instructions(){ 1177 /* Making it clearer that customers need to set the time in order to see pricing and availability. */ 1178 let instructions_container = jQuery("<p id=\"ioCartTimeInstructions\"></p>"); 1179 let instructions = ""; 1180 1181 if(multi_day){ 1182 instructions += "Select the event date or date range using the calendar"; 1183 }else{ 1184 instructions += "Select the event date using the calendar"; 1185 } 1186 instructions += "."; 1187 instructions_container.text(instructions); 1188 jQuery("#cartCalendar").append(instructions_container); 1189 } 1190 1191 function live_pricing_is_on(){ 1192 /* 1193 Checks to see if live pricing is on. Assumes it is on unless one of the following conditions: 1194 The setting Hide Live Price is off. 1195 The setting Show Weekend/Weekday Pricing is off. 1196 Delivery method pricing is enabled by default. 1197 We are on an item page that uses delivery method pricing. 1198 */ 1199 if(io_hide_live_prices != 1 || io_weekEndPrice != "on" || 1200 io_delivery_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"] || 1201 io_custom_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"]){ 1202 return false; 1203 } 1204 return true; 1205 } 1206 1207 function allow_same_day_select_on_checkout(){ 1208 jQuery(".jquery-datepicker").datepicker("option", "minDate", 0); 1209 } 1210 1211 function show_or_hide_required_info_message(){ 1212 if(io_info_required == "on"){ 1213 if(!all_info_provided()){ 1214 jQuery("#io_all_prices").hide(); 1215 jQuery("#item_additonal_info_open_message").show(); 1216 }else{ 1217 jQuery("#io_all_prices").show(); 1218 jQuery("#item_additonal_info_open_message").hide(); 1219 } 1220 } 1221 } 1222 1223 function all_info_provided(){ 1224 /* This is used for when the "Hide all pricing on page until information is provided" setting is on price settings. */ 1225 let all_data_provided = true; 1226 let io_required_data = io_info_required_data; 1227 for (const [data, value] of Object.entries(io_required_data)) { 1228 if(value == 1){ 1229 if(!getCookie(data)){ 1230 all_data_provided = false 1231 } 1232 } 1233 } 1234 1235 if(live_pricing_is_on() && !event_time_set()) { 1236 all_data_provided = false; 1237 } 1238 1239 return all_data_provided; 1240 } 1241 1242 function event_time_set(){ 1243 if(getCookie("io_timeStart") && 1244 getCookie("io_timeEnd") && 1245 getCookie("io_dateStart") && 1246 getCookie("io_dateEnd")){ 1247 return true; 1248 } else{ 1249 return false 1250 } 1251 } 1252 1253 function show_cart_message(){ 1254 message_container = jQuery("#cartCustomMessage"); 1255 message_container.html(io_cart_message); 1256 message_container.show(); 1257 } 1258 1259 function deliveryMethodSelected(){ 1260 setCookie("io_delivery_method", jQuery(".ioDeliveryMethods option:selected").text(), 14); 1261 checkRestrictedDeliveries(); 1262 } 1263 1264 function adjustPicBoxForHeader(){ 1265 /* For some reason its hard to get css with querySelector so we use jQuery to get the picbox. */ 1266 pic_box = jQuery(".io_product_picbox"); 1267 io_header = document.querySelector(".io_header"); 1268 if(pic_box != null && pic_box.css("position") == "sticky"){ 1269 if(io_header != null){ 1270 header_height = io_header.offsetHeight; 1271 pic_box.css("top", (10+header_height).toString()+"px"); 1272 } 1273 else{ 1274 possible_headers = document.querySelectorAll("header,section")
1275 possible_headers.forEach((ele) =>{ 1276 if(ele.style.top == "0px" && (ele.style.position == "fixed" || ele.style.position == "sticky")){ 1277 header = ele; 1278 header_height = header.offsetHeight; 1279 pic_box.css("top", (10+header_height).toString()+"px"); 1280 1281 } 1282 }); 1283 } 1284 } 1285 } 1286 function cart_times_all_set(){ 1287 if(jQuery("#ioCartTimeSelectContainer [name=dateStart]").val() == ""){ 1288 return false; 1289 } 1290 if(io_hidetimes === "off" || io_hidetimes === ""){ 1291 if(jQuery("#ioCartTimeSelectContainer [name=timeStart]").val() == ""){ 1292 return false; 1293 } 1294 if(jQuery("#ioCartTimeSelectContainer [name=timeEnd]").val() == ""){ 1295 return false; 1296 } 1297 } 1298 1299 return true; 1300 } 1301 function checkRestrictedDeliveries(){ 1302 let items = simpleCart.items() 1303 let restrictions_found = false; 1304 for(i in items){ 1305 let rid = items[i].get("rentalid"); 1306 if(typeof jQuery(".ioDeliveryMethods").val() != "undefined"){ 1307 if(io_delivery_methods[jQuery(".ioDeliveryMethods").val()]["restricted"].includes(rid)){ 1308 jQuery("#deliveryMethodWarning").show(); 1309 restrictions_found = true; 1310 } 1311 } 1312 } 1313 if(!restrictions_found){ 1314 jQuery("#deliveryMethodWarning").hide(); 1315 } 1316 } 1317 1318 function display_cart_warning(item){ 1319 let cart_warning_container = jQuery("#cartWarning"); 1320 1321 // Check if an event date if not we should tell them to set it. 1322 event_times = getAvailTimes(); 1323 if(!event_times[0] || !event_times[1]){ 1324 cart_warning_container.text("Please set the date and time for your event above."); 1325 cart_warning_container.show(); 1326 return false; 1327 } 1328 1329 let item_name = item.get("name"); 1330 let item_timeslots = item.get("timeslots"); 1331 let timeslot_name = getTimeslotName(item_timeslots); 1332 1333 let stop_loop = false; 1334 if(item_timeslots){ 1335 if(jQuery(item_timeslots).nodeName == "SELECT"){ 1336 /* NOTE: It should not be possible for timeslots to be empty. 1337 But in the event they somehow are, we should have this here. */ 1338 /* timeslots */ 1339 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 1340 if(typeof timeslot_sel_range != "undefined"){ 1341 var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range); 1342 } 1343 }else{ 1344 /* timepickers */ 1345 let [start_timepicker, end_timepicker] = get_cart_timepickers(timeslot_name); 1346 var start_time = start_timepicker.value; 1347 var end_time = end_timepicker.value; 1348 } 1349 if(!start_time || !end_time){ 1350 cart_warning_container.text("Please select a time range for the following item: " + item_name); 1351 cart_warning_container.show() 1352 stop_loop = true; 1353 } 1354 } else{ 1355 cart_warning_container.text("Some items are not available on this date."); 1356 cart_warning_container.show() 1357 } 1358 return stop_loop 1359 } 1360 1361 const io_personal_cookie_keys = ["io_email", "io_phone", "io_address", "io_city", "io_state", "io_zip"]; 1362 1363 function ioHasMarketingConsent(){ 1364 if(typeof cmplz_has_consent !== 'function'){ 1365 return true; 1366 } 1367 return cmplz_has_consent('marketing'); 1368 } 1369 1370 function ioUnwrapStoredValue(raw) { 1371 // Fully peel any {v,e} wrapper layers that may have accumulated when an 1372 // older plugin version re-saved an already-wrapped value (IO-36799). Cart 1373 // values (dates, times, addresses) are never JSON objects, so any layer 1374 // that parses to a {v,...} object is a wrapper to unwrap. Returns 1375 // { value, expired, malformed } describing the innermost stored string. 1376 var value = (raw == null) ? "" : String(raw); 1377 for (var depth = 0; depth < 25; depth++) { 1378 var trimmed = value.trim(); 1379 if (trimmed.charAt(0) !== '{') break; // plain value -> done 1380 var obj; 1381 try { 1382 obj = JSON.parse(trimmed); 1383 } catch (e) { 1384 break; // not parseable -> stop, keep value 1385 } 1386 if (!obj || typeof obj !== 'object' || !('v' in obj)) break; // not our wrapper 1387 if (obj.e && Date.now() > obj.e) { 1388 return { value: "", expired: true, malformed: false }; 1389 } 1390 value = (obj.v != null) ? String(obj.v) : ""; 1391 } 1392 // Only flag as malformed if what remains still looks like our own broken 1393 // {"v":...} wrapper (e.g. truncated) -- never an ordinary value that just 1394 // happens to start with "{", which must be preserved untouched. 1395 var malformed = /^\s*\{\s*"v"\s*:/.test(value); 1396 return { value: value, expired: false, malformed: malformed }; 1397 } 1398 1399 function setCookie(cname, cvalue, exdays) { 1400 if(io_personal_cookie_keys.indexOf(cname) !== -1 && !ioHasMarketingConsent()){ 1401 return; 1402 } 1403 // Store values in localStorage with an io_ prefix for uniqueness and emulate expiration
1404 try { 1405 // Unwrap first so an already-wrapped value can never be re-wrapped and 1406 // compound into nested {v,e} layers (IO-36799). 1407 var clean = ioUnwrapStoredValue(cvalue).value; 1408 var expiresAt = (typeof exdays === 'number' && exdays > 0) 1409 ? Date.now() + (exdays * 24 * 60 * 60 * 1000) 1410 : null; 1411 var payload = JSON.stringify({ v: clean, e: expiresAt }); 1412 window.localStorage.setItem(cname, payload); 1413 } catch (e) { 1414 // Swallow errors to keep behavior similar to cookie writes silently failing 1415 console.log(e); 1416 } 1417 } 1418 1419 function getCookie(cname) { 1420 // Read values from localStorage honoring expiration; return empty string if missing/expired 1421 try { 1422 var raw = window.localStorage.getItem(cname); 1423 if (!raw) return ""; 1424 var result = ioUnwrapStoredValue(raw); 1425 if (result.expired || result.malformed) { 1426 // Drop expired or corrupted entries so they self-heal instead of being 1427 // rendered as raw JSON in the date/time fields (IO-36799). 1428 try { window.localStorage.removeItem(cname); } catch (e) {} 1429 return ""; 1430 } 1431 return result.value; 1432 } catch (e) { 1433 return ""; 1434 } 1435 } 1436 async function fetchAndSetCookie(name) { 1437 var requestInit = { credentials: "include" }; 1438 fetch("https://rental.software/include/get_cookie.php?name=" + name, requestInit).then(function (response) { 1439 return response.json(); 1440 }).then(function (response) { 1441 return handleResponse(name, response); 1442 }); 1443 } 1444 1445 function handleResponse(name, response) { 1446 var currentCookieValue = getCookie(name); 1447 if (!!response.value && currentCookieValue !== response.value) { 1448 setCookie(name, response.value, 14); 1449 } 1450 return response.value; 1451 } 1452 1453 function clearIoPersonalDataForNoConsent(){ 1454 io_personal_cookie_keys.forEach(function(key){ 1455 try { 1456 window.localStorage.removeItem(key); 1457 } catch (e) { 1458 console.log(e); 1459 } 1460 }); 1461 1462 var trackingUrl = (window.location.href.indexOf("localhost") > -1) 1463 ? "http://localhost/io/bugs/include/iotracking.php" 1464 : "https://rental.software/include/iotracking.php"; 1465 var clearImg = new Image(); 1466 clearImg.src = trackingUrl + "?action=remove&nocache=" + Math.random(); 1467 } 1468 1469 document.addEventListener("cmplz_status_change", function (e) { 1470 if (e.detail.category === 'marketing' && e.detail.value === 'deny') { 1471 clearIoPersonalDataForNoConsent(); 1472 } 1473 }); 1474 1475 function break_timeslot_sel_range(timeslot_sel_range){ 1476 /* Takes a time range given by selected timeslot and gets the start and end time removing meridiem.*/ 1477 timeslot_sel_arr = timeslot_sel_range.split(" - "); 1478 var start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace(" "," "); 1479 var end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace(" "," "); 1480 1481 return Array(start_time, end_time); 1482 } 1483 function getAvailTimes(){ 1484 /* 1485 Commonly used helper function. Accomplishes two things: 1486 Returns an array containing start_date, start_time, and event duration. 1487 Sets cookies for start and end date, and start and end time. 1488 1489 Uses the inputs available in the cart if they are filled out, so dateStart, dateEnd, timeStart, and timeEnd. 1490 If timeslots are being used in cart it chooses the selected timeslot and breaks it on - and gets the start ane end time from that. 1491 */ 1492 let start_date = jQuery("input[name=dateStart]").val(); 1493 let end_date = jQuery("input[name=dateEnd]").val(); 1494 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 1495 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 1496 if(cart_company_timeslot_selected){ 1497 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 1498 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 1499 var start_time = cart_company_timeslot_selected[0].trim(); 1500 var end_time = cart_company_timeslot_selected[1].trim(); 1501 } 1502 } else { 1503 var start_time = jQuery("input[name=timeStart]").val(); 1504 var end_time = jQuery("input[name=timeEnd]").val(); 1505 } 1506 1507 if (start_date.length == 0) { 1508 start_date = getCookie("io_dateStart"); 1509 end_date = getCookie("io_dateEnd"); 1510 start_time = getCookie("io_timeStart"); 1511 end_time = getCookie("io_timeEnd"); 1512 } 1513 1514 const has_selected_company_timeslot = io_company_timeslots.length != 0 1515 && io_cartdayselect == "single_day" 1516 && jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 1517 1518 if(io_hidetimes === "on" 1519 && io_force_blank_timepickers != "on" 1520 && !has_selected_company_timeslot) { 1521 start_time = start_default; 1522 end_time = end_default; 1523 jQuery("input[name=timeStart]").val(start_time); 1524 jQuery("input[name=timeEnd]").val(end_time); 1525 } 1526 1527 if(io_force_blank_timepickers != "on") 1528 { 1529 if(start_time.length == 0) 1530 { 1531 start_time = start_default; 1532 } 1533 if(end_time.length == 0) 1534 { 1535 end_time = end_default; 1536 } 1537 } 1538 1539 1540 /* no past dates */ 1541 if(start_date.length != 0 && convertDateStringtoDateObject(start_date, start_time) < new Date()){ 1542 start_date=""; 1543 end_date=""; 1544 } 1545 /* setCookie("checkDate", start_date, 14); */
1546 setCookie("io_dateStart", start_date, 14); 1547 setCookie("io_dateEnd", end_date, 14); 1548 setCookie("io_timeStart", start_time, 14); 1549 setCookie("io_timeEnd", end_time, 14); 1550 /* If we are using the information gathering tool, we do not want to show this message.*/ 1551 if( live_pricing_is_on() && io_info_required == "off" ){ 1552 if(!event_time_set() && io_always_display_live_price != "on"){ 1553 jQuery("#item_live_price_time_set_message").show(); 1554 }else{ 1555 jQuery("#item_live_price_time_set_message").hide(); 1556 } 1557 } 1558 1559 var newDate1 = convertDateStringtoDateObject(start_date, start_time); 1560 var newDate2 = convertDateStringtoDateObject(end_date, end_time); 1561 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 1562 return [start_date,start_time,time_duration]; 1563 } 1564 1565 function getAllRentalIDsFromCart(){ 1566 let rental_ids = ""; 1567 jQuery("[id^='cartItem_']").each(function(){ 1568 children = this.children 1569 for(let i = 0; i < children.length; ++i){ 1570 if(children[i].className == "item-rentalid") { 1571 rental_ids += children[i].innerText + "|"; 1572 break; 1573 } 1574 } 1575 }); 1576 return rental_ids 1577 } 1578 /*</editor-fold>*/ 1579 1580 /*<editor-fold defaultstate="collapsed" desc="Info Header Functions">*/ 1581 function init_date_timepicker_for_info_header(){ 1582 jQuery(".ioInfoDatepicker").datepicker({ 1583 changeMonth: true, 1584 changeYear: true, 1585 dateFormat: dateFormat, 1586 rangeSelect: true, 1587 numberOfMonths: 1, 1588 stepMonths: 1, 1589 speed: "fast", 1590 showOn: "both", 1591 onChangeMonthYear: cal_onChangeMonthYear, 1592 buttonText: "Calendar", 1593 minDate: 1, 1594 firstDay: 0 1595 }); 1596 jQuery("#ioHeaderDateStart").datepicker("option", { onSelect: function() { 1597 set_info_header_end_date(); 1598 saveInfoHeader(); 1599 // Add more functions if needed 1600 } 1601 }); 1602 1603 if(restrictTimes){ 1604 jQuery(".ioInfoTimepicker").timepicker({ 1605 startTime: new Date(0, 0, 10, 0, 0, 0), 1606 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 1607 minTime:restrictTimeStart, 1608 maxTime:restrictTimeEnd, 1609 /*show24Hours: $show24Hours,*/ 1610 timeFormat: timeFormat, 1611 separator: ":", 1612 className: "elementor-widget-text-editor", 1613 step: 15, 1614 disableTouchKeyboard: true 1615 }); 1616 } else{ 1617 jQuery(".ioInfoTimepicker").timepicker({ 1618 startTime: new Date(0, 0, 10, 0, 0, 0), 1619 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 1620 /*show24Hours: $show24Hours,*/ 1621 timeFormat: timeFormat, 1622 separator: ":", 1623 className: "elementor-widget-text-editor", 1624 step: 15, 1625 disableTouchKeyboard: true 1626 }); 1627 } 1628 setTimeout(setUpTimeRestrictions_infoHeaderTimepickers, 500); 1629 } 1630 1631 function saveInfoHeader(){ 1632 let info_header_start_date = jQuery("[id$=ioHeaderDateStart]"); 1633 let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]"); 1634 let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]"); 1635 let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]"); 1636 let info_header_address = jQuery("[id$=ioHeaderAddress]"); 1637 let info_header_city = jQuery("[id$=ioHeaderCity]"); 1638 let info_header_state = jQuery("[id$=ioHeaderState]"); 1639 let info_header_zip = jQuery("[id$=ioHeaderZipCode]"); 1640 let info_header_phone = jQuery("[id$=ioHeaderPhone]"); 1641 let info_header_email = jQuery("[id$=ioHeaderEmail]"); 1642 1643 if(info_header_start_time.val()) setCookie("io_timeStart", info_header_start_time.val(), 14); 1644 if(info_header_end_time.val()) setCookie("io_timeEnd", info_header_end_time.val(), 14); 1645 if(info_header_start_date.val()) setCookie("io_dateStart", info_header_start_date.val(), 14); 1646 if(info_header_end_date.val()) setCookie("io_dateEnd", info_header_end_date.val(), 14); 1647 if(info_header_address.val()) setCookie("io_address", info_header_address.val(), 14); 1648 if(info_header_city.val()) setCookie("io_city", info_header_city.val(), 14); 1649 if(info_header_state.val()) setCookie("io_state", info_header_state.val(), 14); 1650 if(info_header_zip.val()) setCookie("io_zip", info_header_zip.val(), 14); 1651 if(info_header_phone.val()) setCookie("io_phone", info_header_phone.val(), 14); 1652 if(info_header_email.val()) setCookie("io_email", info_header_email.val(), 14); 1653 1654 /* Set information in the cart. */ 1655 calCancel(); 1656 1657 header_increment_step(); 1658 1659 /* Stop form from doing anything else for elementor */ 1660 // jpa - still allow, turn off actions in form if wanted. to turn off io lead submission use the plugin settings 1661 //event.preventDefault(); 1662 //event.stopPropagation(); 1663 return true; 1664 } 1665 1666 function set_info_header_values(){ 1667 let info_header_start_date = jQuery("[id$=ioHeaderDateStart]"); 1668 let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]"); 1669 let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]"); 1670 let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]"); 1671 let info_header_street = jQuery("[id$=ioHeaderAddress]"); 1672 let info_header_city = jQuery("[id$=ioHeaderCity]"); 1673 let info_header_state = jQuery("[id$=ioHeaderState]"); 1674 let info_header_zip = jQuery("[id$=ioHeaderZipCode]"); 1675 let info_header_phone = jQuery("[id$=ioHeaderPhone]"); 1676 let info_header_email = jQuery("[id$=ioHeaderEmail]"); 1677 1678 if(getCookie("io_timeStart")) info_header_start_time.val(getCookie("io_timeStart")); 1679 if(getCookie("io_timeEnd")) info_header_end_time.val(getCookie("io_timeEnd")); 1680 if(getCookie("io_dateStart")) info_header_start_date.val(getCookie("io_dateStart")); 1681 if(getCookie("io_dateEnd")) info_header_end_date.val(getCookie("io_dateEnd")); 1682 if(getCookie("io_address")) info_header_street.val(getCookie("io_address")); 1683 if(getCookie("io_city")) info_header_city.val(getCookie("io_city")); 1684 if(getCookie("io_state")) info_header_state.val(getCookie("io_state")); 1685 if(getCookie("io_zip")) info_header_zip.val(getCookie("io_zip")); 1686 if(getCookie("io_phone")) info_header_phone.val(getCookie("io_phone")); 1687 if(getCookie("io_email")) info_header_email.val(getCookie("io_email")); 1688 } 1689 1690 function add_classes_and_onClicks(){ 1691 1692 /* First set up for dates */ 1693 let info_header_start_date = jQuery("#ioHeaderDateStart"); 1694 let info_header_end_date = jQuery("#ioHeaderDateEnd"); 1695 info_header_start_date.addClass("ioInfoDatepicker"); 1696 info_header_end_date.addClass("ioInfoDatepicker"); 1697 1698 /* Now Timepickers */ 1699 let info_header_start_time = jQuery("#ioHeaderTimeStart"); 1700 let info_header_end_time = jQuery("#ioHeaderTimeEnd"); 1701 info_header_start_time.addClass("ioInfoTimepicker"); 1702 info_header_end_time.addClass("ioInfoTimepicker"); 1703 1704 /* Add the onClick to the button */ 1705 let button = jQuery("#ioInfoHeaderSubmit"); 1706 button.click(saveInfoHeader); 1707 button.css("cursor", "pointer"); 1708 1709 /* Init datepicker and timepickers */ 1710 init_date_timepicker_for_info_header(); 1711 1712 /* Lastly set the values if they are set already */ 1713 set_info_header_values(); 1714 } 1715 1716 function remove_set_event_buttton(){ 1717 let set_event_button = jQuery(".pageDateRangeWrapper"); 1718 if(set_event_button.length > 0) set_event_button.hide(); 1719 } 1720 1721 function set_info_header_end_date(){ 1722 if(!jQuery("#ioHeaderDateEnd").val()){ 1723 jQuery("#ioHeaderDateEnd").val(jQuery("#ioHeaderDateStart").val()) 1724 } 1725 jQuery("#ioHeaderDateEnd").datepicker("option", { minDate: new Date(jQuery("#ioHeaderDateStart").val()) }); 1726 } 1727 1728 function header_increment_step(){ 1729 let active = jQuery(".io-step-active"); 1730 1731 switch(active.attr("id")){ 1732 case "io-step-1": 1733 if (/Mobi|Android/i.test(navigator.userAgent)) { 1734 jQuery("#io-step-2,#io-step-3,#io-step-4").hide(); 1735 } 1736 if(check_header_step_one(active)){ 1737 active.removeClass("io-step-active"); 1738 active.addClass("io-step-done") 1739 jQuery("#io-step-2").addClass("io-step-active") 1740 header_increment_step(); 1741 } 1742 break; 1743 case "io-step-2": 1744 if (/Mobi|Android/i.test(navigator.userAgent)) { 1745 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 1746 } 1747 if(simpleCart.items().length > 0){ 1748 active.removeClass("io-step-active"); 1749 active.addClass("io-step-done") 1750 jQuery("#io-step-3").addClass("io-step-active") 1751 header_increment_step(); 1752 } 1753 break; 1754 case "io-step-3": 1755 if (/Mobi|Android/i.test(navigator.userAgent)) { 1756 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 1757 } 1758 if(document.location.href.indexOf("io_quoteconfirm") >= 0){ 1759 active.removeClass("io-step-active"); 1760 active.addClass("io-step-done") 1761 jQuery("#io-step-4").addClass("io-step-active") 1762 header_increment_step(); 1763 } 1764 break; 1765 case "io-step-4": 1766 if (/Mobi|Android/i.test(navigator.userAgent)) { 1767 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 1768 } 1769 break; 1770 } 1771 } 1772 1773 function check_header_step_one(active) { 1774 var allInputs = active.find('input'); 1775 1776 for (var i = 0; i < allInputs.length; i++) { 1777 if (jQuery(allInputs[i]).val() === "") { 1778 return false; // Return false if any input is empty 1779 } 1780 } 1781 return true; // Return true if all inputs have a value 1782 } 1783 1784 /*</editor-fold>*/ 1785 1786 /*<editor-fold defaultstate="collapsed" desc="Accessory Click Functions">*/ 1787 function accDDClicked(event){ 1788 this_element = jQuery(this) 1789 if(!this_element.prop("selected")){ 1790 pid = event.data.pid 1791 accLmt = event.data.accLmt 1792 all_elements = jQuery("[id^=io_acc_"+pid+"_]") 1793 let count = 0; 1794 /* Tried using .filter and .length to get the count of selected items but could not make it work. */ 1795 for(i = 0; i < all_elements.length; ++i){ 1796 if(all_elements[i].selected){ 1797 ++count; 1798 } 1799 } 1800 if(accLmt == 0){ 1801 this_element.css("border", "5px solid #bbb"); 1802 this_element.prop("selected", true); 1803 } else if(count >= accLmt){ 1804 let selected_value = jQuery("[id^=io_acc_"+pid+"_]").filter(function() { 1805 return this["selected"]; 1806 }); 1807 /* be sure to unselect other slected values if our acc limit has been reached. */ 1808 selected_value.prop("selected", false); 1809 selected_value.css("border", "1px solid #bbb"); 1810 } 1811 this_element.css("border", "5px solid #bbb"); 1812 this_element.prop("selected", true); 1813 } else{ 1814 this_element.prop("selected", false); 1815 this_element.css("border", "1px solid #bbb"); 1816 } 1817 } 1818 1819 /* when accessory choice is clicked */ 1820 function accOnClick(acc_select=null){ 1821 /* set name/img back to original main in case they are just clicking on a 1st level size option */ 1822 jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 1823 jQuery(".io_product_title.item_name").html(main_name_orig); 1824 jQuery(".io_product_container .item_image").first().attr("src",main_img_src); 1825 jQuery(".io_product_container .item_image").first().attr("data-src",main_img_src); 1826 jQuery(".io_product_container .item_encoded").first().html(main_encoded); 1827 jQuery(".io_product_container .io_image_big").first().attr("src",main_img_src); 1828 jQuery(".io_product_container .io_image_big").first().attr("data-src",main_img_src); 1829 let main_id = jQuery(".io_product_container .item_rentalid").first().text();
1830 let main_id_arr = main_id.split(":") 1831 jQuery(".io_product_container .item_rentalid").html(main_id_arr[0]); 1832 let clk_id; 1833 if(jQuery(acc_select).find(":selected").val()){ 1834 clk_id = jQuery(acc_select).find(":selected").val().replace("io_acc_shortname_",""); 1835 }else{ 1836 clk_id = this.id.replace("io_acc_shortname_",""); 1837 } 1838 clk_id = clk_id.replace("iothumb_",""); 1839 let click_id_arr = clk_id.split("_"); 1840 /* let pid = main_id; */ 1841 /* if(main_id.split("_").length>1) pid = parseInt(click_id_arr[0]); */ 1842 let acc_obj_relate_is_map = acc_obj_relate instanceof Map; 1843 let acc_obj_relate_entries = acc_obj_relate_is_map ? acc_obj_relate.entries() : Object.entries(acc_obj_relate); 1844 for (let [key, value] of acc_obj_relate_entries) { 1845 let id = key; 1846 let children = acc_obj_relate_is_map ? acc_obj_relate.get(key) : value; 1847 if(Object.keys(children).length>0){ 1848 for (key2 in children) { 1849 if(Object.keys(children[key2]).length > 0){ 1850 /* 3rd level */ 1851 for (key3 in children[key2]) { 1852 displayPackageChoices(clk_id,key2,key3,children[key2]); 1853 } 1854 }else{ 1855 displayPackageChoices(clk_id,key,key2,children); 1856 } 1857 } 1858 }else{ 1859 displayPackageChoices(clk_id,0,id,acc_obj_relate); 1860 } 1861 } 1862 } 1863 1864 /* show/hide accessory levels as needed */ 1865 /* clk_id: one they clicked on, pid: parentid, id: iterator, arr: relationship array */ 1866 function displayPackageChoices(clk_id,pid,id,arr){ 1867 let main_id = jQuery(".io_product_container .item_rentalid").first().text(); 1868 let main_arr = main_id.split("_"); 1869 if(main_arr.length>1) main_id = parseInt(main_arr[0]); 1870 let click_id_arr = clk_id.split("_"); 1871 elem = getAccElem(id,pid); 1872 if(click_id_arr[0]==pid || click_id_arr[1]==pid || pid==0){ 1873 elem.style.display="inline-block"; 1874 }else{ 1875 elem.style.display="none"; 1876 } 1877 if(click_id_arr[1]==id && (click_id_arr[0]==pid || (pid==0 && click_id_arr[0]==main_id) ) || (click_id_arr.length==1 && click_id_arr[0]==id)){ 1878 jQuery("#bookNowBtn").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 1879 updateMainItem(id,pid); 1880 } 1881 } 1882 1883 /* update it with accessory data for choices */ 1884 var main_img_src = jQuery("#single_image").first().attr("href"); 1885 var main_name_orig = jQuery(".io_product_title.item_name").html(); 1886 var main_encoded = jQuery(".io_product_container .item_encoded").html(); 1887 var main_desc = jQuery(".io_product_detailbox .io_product_desc").html(); 1888 function updateMainItem(id,pid){ 1889 /* update add to cart btn, name, img, desc */ 1890 let name = ""; 1891 let name_enc = ""; 1892 let main_id = jQuery(".io_product_container .item_rentalid").first().text(); 1893 let main_arr = main_id.split(":"); 1894 if(main_arr.length>1) main_id = main_arr[0]; 1895 if(pid!=0){ 1896 name += jQuery("#io_acc_itemname_"+pid).html()+":"; 1897 name_enc += jQuery("#io_acc_itemname_"+pid).html()+":"; 1898 name += jQuery("#io_acc_shortname_"+id).html(); 1899 name_enc += jQuery("#io_acc_itemname_"+id).html(); 1900 }else{ 1901 pid = main_id; 1902 name += jQuery("#io_acc_itemname_"+id).html(); 1903 name_enc += jQuery("#io_acc_itemname_"+id).html(); 1904 } 1905 jQuery(".io_product_container .item_encoded").html(encodeURIComponent(name_enc.replace(/[\u2032\u2019]+/ig,"'"))); 1906 jQuery(".io_product_container .item_rentalid").html(main_id+":"+pid+"_"+id); 1907 jQuery(".io_product_title.item_name").html(name); 1908 // Make sure the description actually displays text. 1909 let acc_desc = jQuery("#io_acc_desc_"+pid+"_"+id).first(); 1910 if(acc_desc.length>0 && acc_desc.text()){ 1911 jQuery(".io_product_container .io_product_desc").first().html(jQuery("#io_acc_desc_"+pid+"_"+id).first()[0].innerHTML); 1912 } 1913 1914 /* swap accessory image with main image pic for drop-down type items (linens) */ 1915 let img = jQuery("#io_acc_imgbig_"+pid+"_"+id).first().attr("href"); 1916 if(img==null) img = jQuery("#iothumb_"+pid+"_"+id).first().attr("src") 1917 if(img==null){ 1918 }else{ 1919 if(img.length==0 && pid==main_id){ 1920 /* for 1 level dd items that have no img, use the main img */ 1921 img = main_img_src; 1922 } 1923 jQuery(".io_product_container .io_image_big").first().attr("src",img); 1924 jQuery(".io_product_container .io_image_big").first().attr("data-src",
1924img); 1925 jQuery(".io_product_container .item_image").first().attr("src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src")); 1926 jQuery(".io_product_container .item_image").first().attr("data-src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src")); 1927 1928 jQuery("#single_image").first().attr("href",img).show(); 1929 } 1930 checkAvailFilter(); 1931 } 1932 1933 /* get either img or text for accessory choices */ 1934 function getAccElem(id,pid){ 1935 let path =pid+"_"+id; 1936 if(pid==0){ 1937 path=id; 1938 } 1939 let elem = null; 1940 try{ 1941 elem = document.querySelector("#ioAccButtonWrapper_"+path); 1942 }catch(e){} 1943 if(elem == null){ 1944 try{ 1945 elem = document.querySelector("#iothumb_"+path); 1946 }catch(e){} 1947 } 1948 if(elem==null){ 1949 try{ 1950 elem = document.querySelector("#io_product_acc_pkg_sel_"+pid); 1951 }catch(e){} 1952 if(elem!=null) return elem; 1953 }else{ return elem; } 1954 if(elem == null){ 1955 try{ 1956 elem = document.querySelector("#io_acc_shortname_"+path); 1957 }catch(e){} 1958 }else if(elem.src=="" | elem.getAttribute("data-src")==""){ 1959 try{ 1960 elem = document.querySelector("#io_acc_shortname_"+path); 1961 }catch(e){} 1962 }else if(elem.src.substr(-1)=="/"){ 1963 try{ 1964 elem = document.querySelector("#io_acc_shortname_"+path); 1965 }catch(e){} 1966 } 1967 if(elem==null){ 1968 try{ 1969 elem = document.querySelector("#io_acc_shortname_"+id); 1970 }catch(e){} 1971 } 1972 return elem; 1973 } 1974 1975 /* create the accessory choice btn (img/text) */ 1976 function makeAccBtn(button_add,pid){ 1977 let newButton; 1978 if(button_add.nodeName=="IMG"){ 1979 newButton = button_add; 1980 let id = newButton.id.replace("iothumb_"+pid,""); 1981 var wrapper = document.createElement("div"); 1982 wrapper.setAttribute("id", "ioAccButtonWrapper_"+pid+id); 1983 wrapper.style.display = "inline-block"; 1984 wrapper.appendChild(newButton); 1985 let acc_name = document.createElement("span"); 1986 acc_name.style.overflow = "hidden"; 1987 acc_name.style.textOverflow = "ellipsis"; 1988 acc_name.style.maxWidth = "80px"; 1989 acc_name.style.display = "block"; 1990 acc_name.style.whiteSpace = "nowrap"; 1991 acc_name.textContent = jQuery("#io_acc_shortname"+id).text(); 1992 acc_name.classList.add("accTextName"); 1993 acc_name.setAttribute("id", "io_acc_shortname_"+pid+id); 1994 wrapper.appendChild(document.createElement("br")); 1995 wrapper.appendChild(acc_name); 1996 1997 }else{ 1998 newButton = button_add.cloneNode(true); 1999 let id = newButton.id.replace("io_acc_shortname_",""); 2000 newButton.id = "io_acc_shortname_" + pid + "_" + id; 2001 } 2002 newButton.classList.add("elementor-animation-grow"); 2003 newButton.classList.remove("item_image"); 2004 newButton.style="cursor:pointer;border: solid 1px grey"; 2005 newButton.classList.add("io_access_button"); 2006 newButton.style.display = "inline-block"; 2007 newButton.style.verticalAlign = "top"; 2008 newButton.onclick=accOnClick; 2009 if(newButton.nodeName=="IMG"){ 2010 newButton.style.minWidth = "80px"; 2011 newButton.style.width = "80px"; 2012 newButton.style.margin = "2px"; 2013 newButton.style.height = "80px"; 2014 }else{ 2015 newButton.style.margin = "0px 2px 0px 2px"; 2016 } 2017 if(button_add.nodeName=="IMG"){ 2018 return wrapper 2019 } 2020 2021 return newButton; 2022 } 2023 /* when clicking the thumb swatches under main image (2nd image for an item) */ 2024 function updateMainPic(img) { 2025 let container = img.parentElement; 2026 while (container && !container.querySelector(".io_image_big")) { 2027 container = container.parentElement; 2028 } 2029 2030 const main_img = container ? container.querySelector(".io_image_big") : null; 2031 if (!main_img) return; 2032 2033 const dataBigSrc = img.getAttribute("data-big-src"); 2034 if (dataBigSrc) { 2035 main_img.src = dataBigSrc; 2036 return; 2037 } 2038 2039 let thumb_id = img.id; 2040 let big_id = thumb_id.replace("thumb", "big"); 2041 const img_big = document.getElementById(big_id); 2042 2043 if (img_big && img_big.href) { 2044 main_img.src = img_big.href; 2045 } 2046 } 2047 /*</editor-fold>*/ 2048 2049 /*<editor-fold defaultstate="collapsed" desc="Calendar Functions">*/ 2050 function calApply() { 2051 /* reset timeslots if filtering is on */ 2052 filterTimeslotsByDay_itemTimeslots();
2053 simpleCart.update(); 2054 2055 /* Prevent zero-duration selection: disallow identical start and end date/time */ 2056 try 2057 { 2058 var ds = jQuery("input[name=dateStart]").val(); 2059 var de = jQuery("input[name=dateEnd]").val(); 2060 var ts = jQuery("input[name=timeStart]").val(); 2061 var te = jQuery("input[name=timeEnd]").val(); 2062 if(ts && te && ds && de) 2063 { 2064 var s24 = convert12HourTo24Hour(ts); 2065 var e24 = convert12HourTo24Hour(te); 2066 var sObj = buildDateObj(ds.split("/"), s24); 2067 var eObj = buildDateObj(de.split("/"), e24); 2068 if(sObj && eObj && typeof sObj.getTime === 'function' && typeof eObj.getTime === 'function') 2069 { 2070 if(eObj.getTime() === sObj.getTime()) 2071 { 2072 alert("Please choose an end time that's after the start time."); 2073 jQuery("input[name=timeEnd]").val(""); 2074 return false; 2075 } 2076 } 2077 } 2078 }catch(e){} 2079 2080 if(cart_times_all_set()){ 2081 ioCartLoaderActivate(); 2082 setCookie("io_dateApplied", "true", 1) 2083 checkAvailAll(); 2084 // If no availability calls were made, hide loader shortly after 2085 setTimeout(function() 2086 { 2087 if(io_cart_loading_active && io_cart_loading_count === 0) 2088 { 2089 io_cart_loading_active = false; 2090 ioCartShowOverlay(false); 2091 } 2092 }, 300); 2093 calCancel(); 2094 } 2095 2096 2097 let io_required_data = io_info_required_data; 2098 for (const [data, value] of Object.entries(io_required_data)) { 2099 if(value == 1){ 2100 setCookie(data, jQuery("#io_im_"+data).val(), 14); 2101 } 2102 } 2103 2104 /* Check if information gathering header exists. If it does, update the times on there. */ 2105 if(jQuery("#ioInfoHeader").length){ 2106 jQuery("#ioHeaderTimeStart").val(jQuery("[name=timeStart]").val()); 2107 jQuery("#ioHeaderTimeEnd").val(jQuery("[name=timeEnd]").val()); 2108 jQuery("#ioHeaderDateStart").val(jQuery("[name=dateStart]").val()); 2109 jQuery("#ioHeaderDateEnd").val(jQuery("[name=dateEnd]").val()); 2110 header_increment_step(); 2111 } 2112 2113 show_or_hide_required_info_message() 2114 /* if(!cartStayOpen) cartHide(); */ 2115 } 2116 2117 function calCancel() { 2118 click_count = 0; 2119 start_date = getCookie("io_dateStart"); 2120 end_date = getCookie("io_dateEnd"); 2121 start_time = getCookie("io_timeStart"); 2122 end_time = getCookie("io_timeEnd"); 2123 jQuery("input[name=dateStart]").val(start_date); 2124 jQuery("input[name=dateEnd]").val(end_date); 2125 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 2126 jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected")); 2127 } else{ 2128 jQuery("input[name=timeStart]").val(start_time); 2129 jQuery("input[name=timeEnd]").val(end_time); 2130 } 2131 setCalBackground(); 2132 2133 jQuery(".ioDateRange").html(smartFormatDateRange()) 2134 jQuery("#cartCalendar, #cartTimePicker").hide(); 2135 jQuery(".ioDateRange").show(); 2136 jQuery(".changeDateLinkWrapper").show(); 2137 } 2138 2139 /* var cartStayOpen = false; */ 2140 function calSetDateRange(stayOpen) { 2141 /* 2142 if(stayOpen==1){ 2143 cartStayOpen = true; 2144 }else{ 2145 cartStayOpen = false; 2146 } 2147 */ 2148 jQuery(".changeDateLinkWrapper").hide(); 2149 jQuery("#cartCalendar, #cartTimePicker").show(); 2150 jQuery("#cartDateRange").hide(); 2151 } 2152 2153 function smartFormatDateRange() { 2154 let start_date = jQuery("input[name=dateStart]").val(); 2155 let end_date = jQuery("input[name=dateEnd]").val(); 2156 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2157 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 2158 if(cart_company_timeslot_selected){ 2159 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 2160 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 2161 var start_time = cart_company_timeslot_selected[0].trim(); 2162 var end_time = cart_company_timeslot_selected[1].trim(); 2163 } 2164 } else { 2165 var start_time = jQuery("input[name=timeStart]").val(); 2166 var end_time = jQuery("input[name=timeEnd]").val(); 2167 } 2168 2169 let text = ""; 2170 text = start_date; 2171 if(io_hidetimes!="on") text += " " + start_time; 2172 2173 if (start_date == end_date) { 2174 if(io_hidetimes!="on"){ 2175 text += " <i class='fas fa-arrow-right' style='padding:5px;'></i> "; 2176 text += end_time; 2177 } 2178 } else { 2179 text += " <i class='fas fa-arrow-right' style='padding:5px;'></i> "; 2180 text += end_date; 2181 if(io_hidetimes!="on") text += " " + end_time; 2182 } 2183 /* text += " <i class='fas fa-pencil-alt' style='margin-left:9px;color:"+pallet_color1+";'></i> "; */ 2184 2185 return text; 2186 } 2187 2188 2189 function resetCalButtons() { 2190 jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1); 2191 jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").
2191css("color", pallet_color1); 2192 } 2193 2194 function cal_onChangeMonthYear(year, month, obj) { 2195 setTimeout(resetCalButtons, 10); 2196 setTimeout(setCalBackground, 10); 2197 } 2198 2199 function cal_onSelect(dateText, obj) { 2200 setTimeout(resetCalButtons, 10); 2201 let whatday_choice = ""; 2202 if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){ 2203 let choice_obj = jQuery("#whatday"); 2204 if(choice_obj){ 2205 whatday_choice = choice_obj.val(); 2206 } 2207 } 2208 2209 click_count++; 2210 end_timepicker = jQuery("input[name=timeEnd]"); 2211 let timeStart = jQuery("input[name=timeStart]").val(); 2212 if(io_force_blank_timepickers != "on") 2213 { 2214 if (timeStart == "") { 2215 jQuery("input[name=timeStart]").val(start_default); 2216 jQuery("input[name=timeEnd]").val(end_default); 2217 } 2218 } 2219 2220 if (click_count == 1 || !multi_day || whatday_choice==="Same Day" || whatday_choice==="Overnight") { 2221 jQuery("input[name=dateStart]").val(dateText); 2222 jQuery("input[name=dateEnd]").val(dateText) 2223 end_timepicker.timepicker("option",{"minTime": jQuery("input[name=timeStart]").val()}); 2224 if(EndTimeLessThanStartTime( 2225 jQuery("input[name=timeStart]").val(), 2226 end_timepicker.val(), 2227 jQuery("[name='dateStart']").val(), 2228 jQuery("[name='dateEnd']").val() ) ) { 2229 end_timepicker.val(""); 2230 } 2231 if(io_cartAllowSameDay == "on"){ 2232 restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker); 2233 } 2234 } else if (click_count == 2) { 2235 jQuery("input[name=dateEnd]").val(dateText); 2236 let start_date_str = jQuery("input[name=dateStart]").val(); 2237 let start_date_obj = convertDateStringtoDateObject(start_date_str); 2238 let end_date_obj = convertDateStringtoDateObject(dateText); 2239 if(end_date_obj < start_date_obj){ 2240 jQuery("input[name=dateStart]").val(dateText); 2241 if(io_cartAllowSameDay == "on"){ 2242 restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker); 2243 } 2244 } else{ 2245 end_timepicker.timepicker("option",{"minTime": io_restrict_time_start}); 2246 } 2247 click_count = 0; 2248 } else { 2249 click_count = 0; 2250 } 2251 //custom code for suncoast_event 2252 if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){ 2253 endDisplay(); 2254 //daysSelect(); 2255 } 2256 filterTimeslotsByDay_companyTimeslots(); 2257 2258 setTimeout(setCalBackground, 10); 2259 } 2260 2261 function endDisplay(){ 2262 //todo: need to figure out if these work and set triggers 2263 // trigger enddisplay after date is selected or possibly when dateEnd changes? 2264 let choice = jQuery("#whatday").val(); 2265 2266 setCookie("io_whatday", choice, 14); 2267 let dateStart = jQuery("[name=dateStart]"); 2268 let timeStart = jQuery("[name=timeStart]"); 2269 let dateEnd = jQuery("[name=dateEnd]"); 2270 let timeEnd = jQuery("[name=timeEnd]"); 2271 if(choice==='Overnight'){ 2272 let startdate = dateStart.val(); 2273 let starttime = io_overnightPickupTime; 2274 let endcalc_date_obj = new Date(buildDateobjectstring(startdate,dateFormat,starttime)); 2275 let duration_hrs = 24; 2276 let end_date_obj = new Date(endcalc_date_obj.getTime()+duration_hrs*60*60*1000); 2277 if(!isNaN(end_date_obj)){ 2278 dateEnd.val(getFormatteddate(end_date_obj)); 2279 timeEnd.val(getFormattedtime(end_date_obj)); 2280 timeEnd.attr('readonly','readonly'); 2281 } 2282 }else if(choice==='Multi-Day'){ 2283 let startdate = dateStart.val(); 2284 let starttime = timeStart.val() || start_default; 2285 let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime)); 2286 if(!isNaN(start_date_obj)){ 2287 //dateEnd.val(getFormatteddate(start_date_obj)); 2288 let cal = jQuery("#cartCalendar"); 2289 let origOnSelect = cal.datepicker("option", "onSelect"); 2290 cal.datepicker("option", "onSelect", null); 2291 cal.datepicker("setDate", start_date_obj); 2292 cal.datepicker("option", "onSelect", origOnSelect); 2293 } 2294 timeEnd.removeAttr('readonly'); 2295 if(io_force_blank_timepickers == "on" && !timeEnd.val()){ 2296 timeEnd.val(""); 2297 } else if(!timeEnd.val()){ 2298 timeEnd.val(end_default); 2299 } 2300 }else{ 2301 let startdate = dateStart.val(); 2302 let starttime = timeStart.val() || start_default; 2303 let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime)); 2304 if(!isNaN(start_date_obj)){ 2305 dateEnd.val(getFormatteddate(start_date_obj)); 2306 let cal = jQuery("#cartCalendar"); 2307 let origOnSelect = cal.datepicker("option", "onSelect"); 2308 cal.datepicker("option", "onSelect", null); 2309 cal.datepicker("setDate", start_date_obj); 2310 cal.datepicker("option", "onSelect", origOnSelect); 2311 } 2312 timeEnd.removeAttr('readonly'); 2313 if(io_force_blank_timepickers == "on" && !timeEnd.val()){ 2314 timeEnd.val(""); 2315 } else if(!timeEnd.val()){ 2316 timeEnd.val(end_default); 2317 } 2318 click_count = 0; 2319 }
2320 setTimeout(setCalBackground, 10); 2321 } 2322 function setCalBackground() { 2323 let dateStart_string = jQuery("input[name=dateStart]").val(); 2324 let dateEnd_string = jQuery("input[name=dateEnd]").val(); 2325 2326 if (dateFormat == "d/m/yy") { 2327 let dateStartArray = dateStart_string.split("/"); 2328 let dateEndArray = dateEnd_string.split("/"); 2329 var dateStart = new Date(dateStartArray[2], Number(dateStartArray[1])-1, dateStartArray[0]); 2330 var dateEnd = new Date(dateEndArray[2], Number(dateEndArray[1])-1, dateEndArray[0]); 2331 } else { 2332 var dateStart = new Date(dateStart_string); 2333 var dateEnd = new Date(dateEnd_string); 2334 } 2335 2336 2337 let sday = dateStart.getDate(); 2338 let smonth = dateStart.getMonth(); 2339 let syear = dateStart.getFullYear(); 2340 2341 let eday = dateEnd.getDate(); 2342 let emonth = dateEnd.getMonth(); 2343 let eyear = dateEnd.getFullYear(); 2344 2345 /* clear any (in case of cancel) */ 2346 jQuery(".ui-datepicker-calendar [data-handler=selectDay]").css("background-color","initial"); 2347 2348 /* set the selected ones */ 2349 jQuery("#cartCalendar [data-month=" + smonth + "][data-year=" + syear + "], #cartCalendar [data-month=" + 2350 emonth + "][data-year=" + eyear + "]").each(function (i) { 2351 let cday = jQuery(this).find("a").first().text(); 2352 let cmonth = jQuery(this).attr("data-month"); 2353 let cyear = jQuery(this).attr("data-year"); 2354 /* let dateCurrent = new Date(Date.UTC(cyear,cmonth,cday,12)); */ 2355 let dateCurrent = new Date(cyear, cmonth, cday); 2356 if (click_count == 1 && dateEnd_string.length == 0) dateEnd = dateStart; 2357 if (dateCurrent.getTime() == dateStart.getTime() && dateCurrent.getTime() == dateEnd.getTime()) { 2358 jQuery(this).css("border-radius", "6px 6px 6px 6px"); 2359 } else if (dateCurrent.getTime() == dateStart.getTime()) { 2360 jQuery(this).css("border-radius", "6px 0 0 6px"); 2361 } else if (dateCurrent.getTime() == dateEnd.getTime()) { 2362 jQuery(this).css("border-radius", "0 6px 6px 0"); 2363 } 2364 2365 if (dateCurrent >= dateStart && dateCurrent <= dateEnd) { 2366 jQuery(this).css("background-color", pallet_color1); 2367 } 2368 2369 2370 }); 2371 } 2372 /*</editor-fold>*/ 2373 2374 /*<editor-fold defaultstate="collapsed" desc="Timeslot/Timepicker Functions">*/ 2375 /* called from simplecart */ 2376 function timeslotChange(){ 2377 checkAvailCartTimeslots(); 2378 } 2379 function filterTimeslotsByDay_companyTimeslots(){ 2380 var weekday = new Array(); 2381 weekday[0] = "Sunday"; 2382 weekday[1] = "Monday"; 2383 weekday[2] = "Tuesday"; 2384 weekday[3] = "Wednesday"; 2385 weekday[4] = "Thursday"; 2386 weekday[5] = "Friday"; 2387 weekday[6] = "Saturday"; 2388 2389 let times = getAvailTimes(); 2390 let start_date = times[0]; 2391 var newDate1 = convertDateStringtoDateObject(start_date); 2392 let day = weekday[new Date(newDate1).getDay()]; 2393 2394 let selected_option_label = jQuery(".ioCartCompanyTimeslots option:selected").first().text().toLowerCase(); 2395 if(optionHasDay(weekday, selected_option_label)){ 2396 if(selected_option_label.indexOf(day.toLowerCase()) === -1){ 2397 jQuery(".ioCartCompanyTimeslots").val(""); 2398 } 2399 } 2400 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2401 jQuery(".ioCartCompanyTimeslots > option").each(function() { 2402 if(optionHasDay(weekday, this.text.toLowerCase())){ 2403 for(i=0; i<weekday.length; ++i){ 2404 if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){ 2405 jQuery(this).show(); 2406 day_missing = false; 2407 } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){ 2408 jQuery(this).hide(); 2409 } 2410 } 2411 } 2412 }); 2413 } 2414 } 2415 2416 function filterTimeslotsByDay_itemTimeslots(){ 2417 var weekday = new Array(); 2418 weekday[0] = "Sunday"; 2419 weekday[1] = "Monday"; 2420 weekday[2] = "Tuesday"; 2421 weekday[3] = "Wednesday"; 2422 weekday[4] = "Thursday"; 2423 weekday[5] = "Friday"; 2424 weekday[6] = "Saturday"; 2425 2426 let times = getAvailTimes(); 2427 let start_date = times[0]; 2428 var newDate1 = convertDateStringtoDateObject(start_date); 2429 let day = weekday[new Date(newDate1).getDay()]; 2430 2431 simpleCart.each(function (item, x) { 2432 var timeslots_html = item.get('timeslots'); 2433 if(typeof timeslots_html != "undefined" && jQuery.parseHTML(timeslots_html)[0].nodeName == "SELECT"){ 2434 if(timeslots_html.length > 0){ 2435 var timeslot_name = getTimeslotName(timeslots_html); 2436 if(typeof item.get("timeslots-orig") == "undefined"){ 2437 var timeslots_obj = jQuery.parseHTML(timeslots_html); 2438 } else{ 2439 var timeslots_obj = jQuery.parseHTML(item.get('timeslots-orig')); 2440 } 2441 jQuery(timeslots_obj).find("option").each(function(){ 2442 if(optionHasDay(weekday, this.text.toLowerCase())){ 2443 for(i=0; i<weekday.length; ++i){ 2444 if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){ 2445 /* jQuery(this).show(); */ 2446 } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){ 2447 jQuery(this).remove(); 2448 } 2449 } 2450 } 2451 }); 2452 if(typeof item.get("timeslots-orig") == "undefined") item.set("timeslots-orig",item.get("timeslots")); 2453 item.set("timeslots",'<select class="simpleCart_timeslots" name="'+timeslot_name+'">'+jQuery(timeslots_obj).html()+'</select>'); 2454 } 2455 } 2456 }); 2457 } 2458 2459 function optionHasDay(weekdays, option_label){ 2460 for(i=0; i<weekdays.length; ++i){ 2461 if(option_label.indexOf(weekdays[i].toLowerCase()) !== -1){ 2462 return true; 2463 } 2464 } 2465 return false;
2466 } 2467 2468 function getTimeslotName(timeslots_html){ 2469 if(typeof timeslots_html=="undefined") return ""; 2470 var timeslot_name_s = timeslots_html.indexOf('name="'); 2471 timeslot_name_s += 6; 2472 var timeslot_name_e = timeslots_html.indexOf('"',timeslot_name_s); 2473 var timeslot_name = timeslots_html.substr(timeslot_name_s,timeslot_name_e-timeslot_name_s); 2474 return timeslot_name; 2475 } 2476 function setTimeslotSelected(item, timeslot_name){ 2477 jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected"); 2478 jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").attr("selected","selected"); 2479 if(jQuery(".item-timeslots [name=\""+timeslot_name+"\"]").length>0){ 2480 item.set("timeslots",jQuery(".item-timeslots [name=\""+timeslot_name+"\"]")[0].outerHTML); 2481 } 2482 2483 /* set on quote page */ 2484 jQuery(".controls [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected"); 2485 jQuery(".controls [name=\""+timeslot_name+"\"] option[value='"+jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val()+"']").attr("selected","selected"); 2486 } 2487 2488 function setTimePicker(item, timepicker_name){ 2489 let [start_timepicker, end_timepicker] = get_cart_timepickers(timepicker_name); 2490 let start_time = start_timepicker.value; 2491 let end_time = end_timepicker.value; 2492 2493 if(!start_time){ 2494 start_timepicker.style.borderColor = "red"; 2495 } else{ 2496 start_timepicker.style.borderColor = ""; 2497 } 2498 if(!end_time){ 2499 end_timepicker.style.borderColor = "red"; 2500 } else{ 2501 end_timepicker.style.borderColor = ""; 2502 } 2503 2504 let start_timepicker_html = start_timepicker.outerHTML; 2505 let end_timepicker_html = end_timepicker.outerHTML; 2506 if(document.querySelectorAll(".item-timeslots [name=\""+timepicker_name+"\"]").length>0){ 2507 start_timepicker_html = addOrReplaceValueInTimepicker(start_timepicker_html, start_time); 2508 end_timepicker_html = addOrReplaceValueInTimepicker(end_timepicker_html, end_time); 2509 item.set("timeslots", '<div name="'+timepicker_name+'"> Start: '+start_timepicker_html+' End: '+end_timepicker_html+'</div>'); 2510 } 2511 /* set on quote page */ 2512 /* For linen type items with timepickers */ 2513 let rental_id = item.get("rentalid"); 2514 let split_on_colon = rental_id.split(":"); 2515 if(split_on_colon.length > 1){ 2516 fix_time_name_for_linen_rid(timepicker_name, split_on_colon, start_time, end_time, rental_id) 2517 }else{ 2518 let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0]; 2519 let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0]; 2520 if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){ 2521 quote_page_start_timepicker.value = start_time; 2522 quote_page_end_timepicker.value = end_time; 2523 } 2524 } 2525 } 2526 2527 function fix_time_name_for_linen_rid(time_name, split_rid, start_time, end_time, rental_id){ 2528 for(let x = 0; x < split_rid.length; x++){ 2529 temp_timepicker_name = time_name.replace(rental_id, split_rid[x]); 2530 let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0]; 2531 let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0]; 2532 if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){ 2533 quote_page_start_timepicker.value = start_time; 2534 quote_page_end_timepicker.value = end_time; 2535 } 2536 } 2537 } 2538 2539 function addOrReplaceValueInTimepicker(timepicker_html, time_value){ 2540 if(timepicker_html.includes("value=")){ 2541 timepicker_html = [timepicker_html.slice(0, timepicker_html.indexOf("value=")), 'value="'+time_value+'"', timepicker_html.slice(timepicker_html.length-1)].join(""); 2542 }else{ 2543 /* No value defined. Add it at the end of the outer html. */ 2544 let position = timepicker_html.lastIndexOf(">"); 2545 timepicker_html = [timepicker_html.slice(0, position), ' value="'+time_value+'"', timepicker_html.slice(position)].join(""); 2546 } 2547 return timepicker_html 2548 } 2549 2550 function restrictEndTimepickers(){ 2551 setUpTimeRestrictions_cartTimepickers() 2552 setUpTimeRestrictions_timeBasedItems() 2553 } 2554 2555 function setUpTimeRestrictions_timeBasedItems(){ 2556 jQuery("input[name^=start_timeslot_]").change(function() 2557 { 2558 end_timepicker = jQuery("input[name='"+this.name.replace("start", "end")+"']"); 2559 end_timepicker = jQuery(end_timepicker[end_timepicker.length - 1]); 2560 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 2561 if( EndTimeLessThanStartTime( jQuery(this).val(), end_timepicker.val(), "0/0/0", "0/0/0" ) ){ 2562 end_timepicker.val(""); 2563 } 2564 }); 2565 } 2566 2567 function setUpTimeRestrictions_cartTimepickers(){ 2568 jQuery("input[name=timeStart]").change(function() 2569 { 2570 end_timepicker = jQuery("[name='"+this.name.replace("Start", "End")+"']"); 2571 if(jQuery("[name='dateStart']").val() === jQuery("input[name='dateEnd']").val()){ 2572 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 2573 if(EndTimeLessThanStartTime( 2574 jQuery(this).val(), 2575 end_timepicker.val(), 2576 jQuery("[name='dateStart']").val(), 2577 jQuery("[name='dateEnd']").val() ) ) { 2578 end_timepicker.val(""); 2579 } 2580 } 2581 }); 2582 } 2583 2584 function setUpTimeRestrictions_infoHeaderTimepickers(){ 2585 jQuery("#ioHeaderTimeStart").change(function() 2586 { 2587 end_timepicker = jQuery("#ioHeaderTimeEnd"); 2588 if(jQuery("#ioHeaderDateStart").val() === jQuery("#ioHeaderDateEnd").val()){ 2589 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 2590 if(EndTimeLessThanStartTime( 2591 jQuery(this).val(), 2592 end_timepicker.val(), 2593 jQuery("#ioHeaderDateStart").val(), 2594 jQuery("#ioHeaderDateEnd").val() ) ) { 2595 end_timepicker.val(""); 2596 } 2597 } 2598 }); 2599 } 2600 2601 /* 2602 helper function to see if the value from a start timepicker is less than the string value of an end timepicker. 2603 2604 param start_time: string representation of the start time picker. 12hr or 24hr. 2605 param end_time: string representation of the end time picker. 12hr or 24hr. 2606 param start_date: string representation of the start date, seperated by "/". Can be wither d/m/y or m/d/y. Pass "0/0/0" if dates do not matter. 2607 param end_date: string representation of the end date, seperated by "/". Can be wither d/m/y or m/d/y. Pass "0/0/0" if dates do not matter. 2608 2609 */ 2610 function EndTimeLessThanStartTime(start_time, end_time, start_date, end_date){ 2611 if(!start_time || !end_time) return false;
2612 start_time = convert12HourTo24Hour(start_time); 2613 end_time = convert12HourTo24Hour(end_time); 2614 var split_start_date = start_date.split("/"); 2615 var split_end_date = end_date.split("/"); 2616 var startDate = buildDateObj(split_start_date, start_time); 2617 var endDate = buildDateObj(split_end_date, end_time); 2618 if(endDate < startDate){ 2619 return true; 2620 } else { 2621 return false; 2622 } 2623 } 2624 function get_cart_timepickers(timepicker_name){ 2625 let start_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "start_timeslot_")); 2626 let end_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "end_timeslot_")); 2627 start_timepicker = start_timepicker[start_timepicker.length-1]; 2628 end_timepicker = end_timepicker[end_timepicker.length-1]; 2629 return Array(start_timepicker, end_timepicker); 2630 } 2631 function restrictStartTimepickerOnSameDaySelect(start_date_str, start_timepicker, end_timepicker){ 2632 let selected_date_obj = convertDateStringtoDateObject(start_date_str); 2633 let current_date_obj = new Date(); 2634 if(current_date_obj.getDate() == selected_date_obj.getDate() && 2635 current_date_obj.getMonth() == selected_date_obj.getMonth() && 2636 current_date_obj.getYear() == selected_date_obj.getYear()){ 2637 let next_hour_time_stamp = current_date_obj.setMinutes(60); 2638 let next_hour_str = getFormattedtime(new Date(next_hour_time_stamp)) 2639 start_timepicker.timepicker("option",{"minTime": next_hour_str}); 2640 2641 /* If the time in the input box is less than the time we just restricted too, then clear time inputs */ 2642 restricted_time_obj = convertDateStringtoDateObject(start_date_str, next_hour_str); 2643 currently_selected_time_obj = convertDateStringtoDateObject(start_date_str, start_timepicker.val()); 2644 if(currently_selected_time_obj < restricted_time_obj){ 2645 start_timepicker.val(next_hour_str); 2646 end_timepicker.val(""); 2647 end_timepicker.timepicker("option",{"minTime": next_hour_str}); 2648 } 2649 }else{ 2650 start_timepicker.timepicker("option",{"minTime": restrictTimeStart}); 2651 } 2652 } 2653 /*</editor-fold>*/ 2654 2655 /*<editor-fold defaultstate="collapsed" desc="Simple Cart Bound Functions">*/ 2656 function cart_onUpdate() { 2657 /* need slight delay so simplecart updates before this runs */ 2658 setTimeout(cart_onUpdate2, 500); 2659 try{ 2660 for(var i=0;i<document.getElementsByClassName("ioCart").length;i++){ 2661 document.getElementsByClassName("ioCart")[i].setAttribute("cnt", simpleCart.items().length); 2662 } 2663 }catch(e){} 2664 } 2665 2666 function cart_onUpdate2() { 2667 jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total())); 2668 if(io_checkavail=="off") return; 2669 jQuery("#cartWarning").hide(); 2670 let hasUnavail = false; 2671 gift_cards_only = false; 2672 simpleCart.each(function (item, x) { 2673 let item_id = item.get("id"); 2674 var giftCardValue = item.get("giftcardvalue"); 2675 if (giftCardValue && giftCardValue.trim()) { 2676 gift_cards_only = true; 2677 } 2678 let avail = 0; 2679 let stop_loop = false; 2680 if (item.get("availability") != null) avail = item.get("availability").replace(" available", ""); 2681 let quantity = Number(item.get("quantity")); 2682 if(item.get("inputtype") == "Map"){ 2683 quantity = 1 2684 } 2685 if(typeof item.get("availability") != 'undefined'){ 2686 if (quantity > Number(avail) || avail == "not") { 2687 /* item.set("availability","<span style=color:red>"+item.get("availability")+"</span>"); */ 2688 setTimeout(function () { 2689 jQuery("#cartItem_" + item_id + " .item-availability").css("color", "red") 2690 }, 10); 2691 //jQuery("#cartWarning").show(); 2692 stop_loop = display_cart_warning(item); 2693 hasUnavail = true; 2694 } else { 2695 jQuery("#cartItem_" + item_id + " .item-availability").css("color", "inherit"); 2696 } 2697 }else{ 2698 event_times = getAvailTimes(); 2699 if(!event_times[0] || !event_times[1]){ 2700 jQuery("#cartWarning").text("Please set the date and time for your event above."); 2701 jQuery("#cartWarning").show() 2702 } 2703 } 2704 2705 var timeslots_html = item.get("timeslots"); 2706 if(typeof timeslots_html != "undefined"){ 2707 if(timeslots_html.length > 0){ 2708 var timeslot_name = getTimeslotName(timeslots_html); 2709 if(timeslots_html.indexOf("<select") >= 0){ 2710 setTimeslotSelected(item, timeslot_name); 2711 }else{ 2712 setTimePicker(item, timeslot_name); 2713 } 2714 } 2715 } 2716 if(stop_loop){ 2717 return false;
2718 } 2719 }); 2720 2721 if(gift_cards_only){ 2722 jQuery("#cartCalendarTimePickerContainer").hide(); 2723 }else{ 2724 jQuery("#cartCalendarTimePickerContainer").show(); 2725 } 2726 2727 if(hasUnavail && io_checkavail!="off"){ 2728 jQuery(".simpleCart_checkout").removeClass("simpleCart_checkout").addClass("simpleCart_checkout_off").trigger("classChange").click(cartShow); 2729 }else if(io_checkavail!="off"){ 2730 jQuery(".simpleCart_checkout_off").removeClass("simpleCart_checkout_off").addClass("simpleCart_checkout").trigger("classChange"); 2731 } 2732 2733 add_cart_buttons = document.querySelectorAll("[class*=add_cart_]"); 2734 if(add_cart_buttons){ 2735 for(let i = 0; i < add_cart_buttons.length; ++i){ 2736 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-cart-arrow-down", "fa-shopping-cart"); 2737 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Added to Cart", "Add to Cart"); 2738 add_cart_buttons[i].style.filter = "brightness(100%)"; 2739 simpleCart.each(function (item, x) { 2740 if( add_cart_buttons[i].className.includes( item.get("rentalid") ) ){ 2741 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-shopping-cart", "fa-cart-arrow-down"); 2742 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Add to Cart", "Added to Cart"); 2743 add_cart_buttons[i].style.filter = "brightness(90%)"; 2744 } 2745 }); 2746 } 2747 } 2748 2749 /* init time-based items */ 2750 if(document.location.href.indexOf("io_quoteform") == -1){ 2751 let today = new Date(); 2752 let io_dd = today.getDate(); 2753 let io_mm = today.getMonth() + 1; 2754 let io_yyyy = today.getFullYear(); 2755 if(restrictTimes){ 2756 jQuery(".item-timeslots .timepicker").each( function() { 2757 if(this.name.includes("end")){ 2758 start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']"); 2759 start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]); 2760 2761 if (io_force_blank_timepickers == "on") 2762 { 2763 start_timepicker.val(""); 2764 jQuery(this).timepicker({ 2765 startTime: "", 2766 endTime: "", 2767 minTime: restrictTimeStart, 2768 maxTime: restrictTimeEnd, 2769 timeFormat: timeFormat, 2770 separator: ":", 2771 className: "elementor-widget-text-editor", 2772 step: 15, 2773 disableTouchKeyboard: true 2774 }); 2775 } 2776 else 2777 { 2778 // Existing logic if "force blank" is not active 2779 if (start_timepicker.val() != "") { 2780 jQuery(this).timepicker({ 2781 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 2782 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 2783 minTime: start_timepicker.val(), 2784 maxTime: restrictTimeEnd, 2785 timeFormat: timeFormat, 2786 separator: ":", 2787 className: "elementor-widget-text-editor", 2788 step: 15, 2789 disableTouchKeyboard: true 2790 }); 2791 } else { 2792 jQuery(this).timepicker({ 2793 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 2794 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 2795 minTime: restrictTimeStart, 2796 maxTime: restrictTimeEnd, 2797 timeFormat: timeFormat, 2798 separator: ":", 2799 className: "elementor-widget-text-editor", 2800 step: 15, 2801 disableTouchKeyboard: true 2802 }); 2803 } 2804 } 2805 2806 } 2807 else { 2808 if (io_force_blank_timepickers == "on") 2809 { 2810 start_timepicker.val(""); 2811 jQuery(this).timepicker({ 2812 startTime: "", 2813 endTime: "", 2814 minTime: restrictTimeStart, 2815 maxTime: restrictTimeEnd, 2816 timeFormat: timeFormat, 2817 separator: ":", 2818 className: "elementor-widget-text-editor", 2819 step: 15, 2820 disableTouchKeyboard: true 2821 }); 2822 } 2823 else 2824 { 2825 jQuery(this).timepicker({ 2826 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 2827 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 2828 minTime:restrictTimeStart, 2829 maxTime:restrictTimeEnd, 2830 timeFormat: timeFormat, 2831 separator: ":", 2832 className: "elementor-widget-text-editor", 2833 step: 15, 2834 disableTouchKeyboard: true 2835 }); 2836 } 2837 } 2838 }); 2839 } else{ 2840 jQuery(".item-timeslots .timepicker").each( function() { 2841 if(this.name.includes("end") != -1){ 2842 start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']"); 2843 start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]); 2844 if (io_force_blank_timepickers == "on") 2845 { 2846 start_timepicker.val(""); 2847 jQuery(this).timepicker({ 2848 startTime: "", 2849 endTime: "", 2850 minTime: restrictTimeStart, 2851 maxTime: restrictTimeEnd, 2852 timeFormat: timeFormat, 2853 separator: ":", 2854 className: "elementor-widget-text-editor", 2855 step: 15, 2856 disableTouchKeyboard: true 2857 }); 2858 } 2859 else 2860 { 2861 if (start_timepicker.val() != "") { 2862 jQuery(this).timepicker({ 2863 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 2864 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 2865 minTime: start_timepicker.val(), 2866 timeFormat: timeFormat, 2867 separator: ":", 2868 className: "elementor-widget-text-editor", 2869 step: 15, 2870 disableTouchKeyboard: true 2871 }); 2872 } else { 2873 jQuery(this).timepicker({ 2874 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 2875 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 2876 timeFormat: timeFormat, 2877 separator: ":", 2878 className: "elementor-widget-text-editor", 2879 step: 15, 2880 disableTouchKeyboard: true 2881 }); 2882 } 2883 } 2884 } 2885 else 2886 { 2887 if (io_force_blank_timepickers == "on") 2888 { 2889 start_timepicker.val(""); 2890 jQuery(this).timepicker({ 2891 startTime: "", 2892 endTime: "", 2893 minTime: restrictTimeStart, 2894 maxTime: restrictTimeEnd, 2895 timeFormat: timeFormat, 2896 separator: ":", 2897 className: "elementor-widget-text-editor", 2898 step: 15, 2899 disableTouchKeyboard: true 2900 }); 2901 } 2902 else 2903 { 2904 jQuery(this).timepicker({ 2905 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 2906 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 2907 timeFormat: timeFormat, 2908 separator: ":", 2909 className: "elementor-widget-text-editor", 2910 step: 15, 2911 disableTouchKeyboard: true 2912 }); 2913 } 2914 } 2915 }); 2916 } 2917 setUpTimeRestrictions_timeBasedItems(); 2918 if(!event_time_set()){ 2919 jQuery(".itemRow .item-total").hide(); 2920 }else{ 2921 jQuery(".itemRow .item-total").show(); 2922 } 2923 } 2924 } 2925 function cart_beforeCheckout(data) { 2926 data.startdate = jQuery("input[name=dateStart]").val(); 2927 data.enddate = jQuery("input[name=dateEnd]").val(); 2928 if(getCookie("guid")){ 2929 data.guid = getCookie("guid"); 2930 }else{ 2931 data.io_custguid = fetchAndSetCookie("guid"); 2932 } 2933 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2934 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 2935 if(cart_company_timeslot_selected){
2936 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 2937 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 2938 data.starttime = cart_company_timeslot_selected[0]; 2939 data.endtime = cart_company_timeslot_selected[1]; 2940 } 2941 } else { 2942 data.starttime = jQuery("input[name=timeStart]").val(); 2943 data.endtime = jQuery("input[name=timeEnd]").val(); 2944 } 2945 } 2946 function cart_beforeAdd(item) { 2947 var main_id = jQuery(".io_product_container .item_rentalid").first().text(); 2948 var item_id = item.get("rentalid"); 2949 2950 timeslots = item.get("timeslots"); 2951 if(timeslots){ 2952 if(timeslots.indexOf("<select") !== -1){ 2953 timeslot_name_id_start_pos = timeslots.lastIndexOf('name="timeslot_') + 'name="timeslot_'.length; 2954 timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos); 2955 new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)] 2956 new_timeslots = new_timeslots.join("") 2957 item.set("timeslots", new_timeslots); 2958 }else if(timeslots.indexOf("<div name=\"io_timepicker_") !== -1){ 2959 timeslot_name_id_start_pos = timeslots.lastIndexOf('name="io_timepicker_') + 'name="io_timepicker_'.length; 2960 timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos); 2961 new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)] 2962 new_timeslots = new_timeslots.join("") 2963 2964 timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="start_timeslot_') + 'name="start_timeslot_'.length; 2965 timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos); 2966 new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)] 2967 new_timeslots = new_timeslots.join("") 2968 2969 timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="end_timeslot_') + 'name="end_timeslot_'.length; 2970 timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos); 2971 new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)] 2972 new_timeslots = new_timeslots.join("") 2973 2974 item.set("timeslots", new_timeslots); 2975 } 2976 2977 } 2978 /* Here we are checking if we are on an item page and if we are adding the main item. 2979 If this is not true, we do not want to continue. Bail here. */ 2980 if((!main_id || !item_id)){ 2981 return true; 2982 }else if (item_id != main_id){ 2983 /* we are adding an accessory, We want to forcibly add the main item first. */ 2984 /* IO-26864 */ 2985 jQuery("#bookNowBtn").click(); 2986 } 2987 let required_dropdown_values = jQuery(".io_acc_li").filter(function() { 2988 let required_ele = jQuery(this).find(".item_required"); 2989 let required = 0; 2990 if(required_ele[0]){ 2991 required = required_ele[0].outerText; 2992 } 2993 let dropdown_ele = jQuery(this).find(".item_accessorydd"); 2994 let dropdown = 0; 2995 if(dropdown_ele[0]){ 2996 dropdown = dropdown_ele[0].outerText; 2997 } 2998 return (required > 0 && dropdown == 1) 2999 }); 3000 var required_selected = true; 3001 required_dropdown_values.each(function() { 3002 required_value_id = jQuery(this).find(".item_rentalid")[0].outerText; 3003 required_value_id = required_value_id.split("_"); 3004 required_value_id = required_value_id[required_value_id.length-1]; 3005 3006 let selected = jQuery("[id^='io_acc_"+required_value_id+"']").filter(function() { 3007 return this["selected"]; 3008 }); 3009 3010 //IO-22431 - This wasnt catching if [0] was undefined 3011 if(jQuery(this).find(".io_acc_li_name")[0] != undefined){ 3012 required_value_name = jQuery(this).find(".io_acc_li_name")[0].outerText ? jQuery(this).find(".io_acc_li_name")[0].outerText : ""; 3013 } 3014 if(selected.length < jQuery(this).find(".item_required")[0].outerText){ 3015 if(item_id == main_id){ 3016 alert(required_value_name+" is a required field."); 3017 } 3018 required_selected = false;
3019 } 3020 3021 if(!required_selected){ 3022 return false; 3023 } 3024 return true; 3025 }); 3026 if(!required_selected){ 3027 return false; 3028 } 3029 3030 /* IO-14857 */ 3031 if(jQuery(".io_product_measurement_price").length > 0){ 3032 let units; 3033 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 3034 units = "sq meters" 3035 if(country === "US") units = "sq feet" 3036 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 3037 units = "meters" 3038 if(country === "US") units = "feet" 3039 } 3040 item.set("units", units); 3041 item.set("quantity", jQuery(".io_measure_price_raw_measurement").text()); 3042 } 3043 } 3044 function cart_afterAdd(item) { 3045 /*loading animation*/ 3046 ioCartLoaderActivate(); 3047 setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300); 3048 3049 /* Add required Accessories */ 3050 let required_accs = jQuery("[id^=io_acc_required_]").filter(function() { 3051 return parseInt(this["outerText"]) > 0 && this.parentElement.style['display'] != 'none'; 3052 }); 3053 required_accs.each(function(index) { 3054 simpleCart.parse_html_and_add(this, true); 3055 }); 3056 3057 3058 let selected_values = jQuery("[id^=io_acc_]").filter(function() { 3059 return this["selected"]; 3060 }); 3061 3062 selected_values.each(function() { 3063 let info = {}; 3064 let rid = jQuery(this).find(".item_rentalid")[0].outerText; 3065 let split_rid = rid.split("_"); 3066 if(split_rid.length == 3){ 3067 let parent_rid = split_rid[1]; 3068 let main_item_rid = split_rid[0]; 3069 info["acc_dd_parent_limit"] = jQuery("#io_acc_accessorylimit_"+main_item_rid+"_"+parent_rid)[0].outerText; 3070 }else{ 3071 info["acc_dd_parent_limit"] = "0"; 3072 } 3073 info["name"] = jQuery(this).find(".io_acc_li_name")[0].outerText 3074 info["qtyincrement"] = jQuery(this).find(".item_qtyincrement")[0].outerText 3075 info["quantity"] = jQuery(this).find(".item_required")[0].outerText > 0 ? jQuery(this).find(".item_required")[0].outerText : 1; 3076 info["rentalid"] = jQuery(this).find(".item_rentalid")[0].outerText 3077 info["linkqty"] = jQuery(this).find(".item_linkqty")[0].outerText 3078 info["pagename"] = io_pagename; 3079 if(jQuery(this).find(".io_acc_li_img_thumb")[0]){ 3080 info["image"] = jQuery(this).find(".io_acc_li_img_thumb")[0].src 3081 } 3082 let already_added = simpleCart.items().filter((item) => item.get("rentalid").startsWith(split_rid[0]+"_"+split_rid[1])); 3083 if(jQuery(this).find(".item_accessorydd")[0].outerText != 1 && 3084 (info["acc_dd_parent_limit"] == "0" || already_added.length < info["acc_dd_parent_limit"]) ){ 3085 simpleCart.add(info, true); 3086 } 3087 }); 3088 3089 checkAvailCartOnly(true); 3090 3091 let last_upsell_call_time = Date.now() - last_upsell_call; 3092 if(in_cart_upsell && last_upsell_call_time > 2000){ 3093 let rental_ids = ""; 3094 3095 /* Get the last element in the cart. This is the last item added. */ 3096 last_added = jQuery("[id^='cartItem_']").last(); 3097 if(last_added.length){ 3098 last_added_children = last_added.children(); 3099 for(let i = 0; i < last_added_children.length; ++i){ 3100 if(last_added_children[i].className == "item-rentalid") { 3101 rental_ids += last_added_children[i].innerText + "|"; 3102 } 3103 } 3104 } 3105 3106 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3107 var times = getAvailTimes(); 3108 last_upsell_call = Date.now(); 3109 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3110 } 3111 else{ 3112 jQuery("#cart-carousel-container").hide(); 3113 } 3114 } 3115 3116 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 3117 filterTimeslotsByDay_itemTimeslots(); 3118 simpleCart.update(); 3119 } 3120 3121 if (jQuery(".cartInfo.open,.ioCart.open, .ioCart_link.open").length == 0) { 3122 setTimeout(function () { 3123 cartShow(); 3124 }, 100); 3125 } 3126 3127 if(simpleCart.items().length==0){
3128 jQuery(".simpleCart_checkout").hide() 3129 }else{ 3130 jQuery(".simpleCart_checkout").show(); 3131 } 3132 3133 if(simpleCart.items().length > 0){ 3134 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 3135 headerBookButton.addClass("ioCart_link"); 3136 headerBookButton.attr("href", "javascript:;"); 3137 } 3138 3139 checkRestrictedDeliveries() 3140 3141 if(jQuery("#ioInfoHeader").length){ 3142 header_increment_step(); 3143 } 3144 } 3145 function cart_afterQtyChange(){ 3146 let last_checkAvail_call_time = Date.now() - last_checkAvail_call; 3147 if(last_checkAvail_call_time > 2000){ 3148 /*loading animation*/ 3149 ioCartLoaderActivate(); 3150 setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300); 3151 last_checkAvail_call = Date.now(); 3152 checkAvailCart(); 3153 checkAvailCartTimeslots(); 3154 } 3155 } 3156 function cart_hideTimepickerWrapper(){ 3157 jQuery(".ui-timepicker-wrapper").hide(); 3158 } 3159 function cart_beforeRemove() { 3160 last_remove = Date.now(); 3161 } 3162 function cart_afterRemove(removed_item){ 3163 checkAvailCart(); 3164 last_upsell_call_time = Date.now() - last_upsell_call; 3165 if(in_cart_upsell && last_upsell_call_time > 2000){ 3166 rental_ids = getAllRentalIDsFromCart(); 3167 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3168 var times = getAvailTimes(); 3169 last_upsell_call = Date.now(); 3170 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3171 } 3172 else{ 3173 jQuery("#cart-carousel-container").hide(); 3174 } 3175 } 3176 3177 /* IO-24060 */
3178 simpleCart.items().forEach(function (item, index) { 3179 let expression = '^' + removed_item.get('rentalid') + '(?:[_:]\\d+)*'; 3180 if(item.get("rentalid").match(expression)){ 3181 item.remove(); 3182 } 3183 }); 3184 3185 3186 checkAvailCartTimeslots(); 3187 checkRestrictedDeliveries(); 3188 if(simpleCart.items().length==0){ 3189 jQuery(".simpleCart_checkout").hide() 3190 }else{ 3191 jQuery(".simpleCart_checkout").show(); 3192 } 3193 3194 if(jQuery("#ioInfoHeader").length && simpleCart.items().length == 0){ 3195 jQuery("#io-step-3").removeClass("io-step-active"); 3196 jQuery("#io-step-2").addClass("io-step-active"); 3197 jQuery("#io-step-2").removeClass("io-step-done") 3198 } 3199 } 3200 function cart_afterLoad(){ 3201 var items_removed = false; 3202 simpleCart.items().forEach(function(item){ 3203 if(item.get("pagename") != io_pagename){ 3204 item.remove() 3205 items_removed = true; 3206 } 3207 }) 3208 if(items_removed){ 3209 alert("Some items in the cart are from a different location and have been removed."); 3210 } 3211 } 3212 /*</editor-fold>*/ 3213 3214 /*<editor-fold defaultstate="collapsed" desc="Date/Time Object/String Conversion Functions">*/ 3215 function getFormatteddate(date_obj){ 3216 if(dateFormat.substring(0,1)=='d'){ 3217 let month = date_obj.getMonth() + 1; 3218 formatteddate = date_obj.getDate()+'/'+month+'/'+date_obj.getFullYear(); 3219 }else{ 3220 let month = date_obj.getMonth() + 1; 3221 formatteddate = month+'/'+date_obj.getDate()+'/'+date_obj.getFullYear(); 3222 } 3223 return formatteddate; 3224 } 3225 3226 function getFormattedtime(date_obj){ 3227 var hour24 = false;
3228 var ampm = 'am'; 3229 var starttime = jQuery('[name=timeStart]').val(); 3230 if(starttime.length>0 && starttime.indexOf('m')==-1) hour24 = true; 3231 if(hour24){ //24 hour return 3232 return date_obj.getHours()+':'+pad(date_obj.getMinutes(),2); 3233 }else{ //12 hour return 3234 var hour = date_obj.getHours(); 3235 if(hour==12) ampm='pm'; 3236 if(hour==0) hour=12; 3237 if(hour>12){ 3238 hour-=12; 3239 ampm='pm'; 3240 } 3241 return hour+':'+pad(date_obj.getMinutes(),2)+' '+ampm; 3242 } 3243 } 3244 3245 function buildDateobjectstring(date,dateformat,time){ 3246 var ampm = 'am'; 3247 var hour24 = false; 3248 if(typeof date == "undefined") return; 3249 if(typeof dateformat == "undefined") return; 3250 var start_arr = date.split('/'); 3251 if(dateformat.substring(0,1)=='d'){ 3252 date = start_arr[2]+'/'+pad(start_arr[1],2)+'/'+pad(start_arr[0],2); 3253 }else{ 3254 date = start_arr[2]+'/'+pad(start_arr[0],2)+'/'+pad(start_arr[1],2); 3255 } 3256 if(time.length>0 && time.indexOf('m')==-1) hour24 = true; 3257 if(hour24){ 3258 try{ 3259 var time_arr = time.split(':'); 3260 var hour = parseInt(time_arr[0]); 3261 var min = pad(time_arr[1], 2); 3262 time = hour + ':' + min + ':00'; 3263 }catch(err){ 3264 time = ""; 3265 } 3266 }else { 3267 try { 3268 time = time.replace('am', "").replace(' ', ""); 3269 if (time.indexOf('pm') != -1) ampm = 'pm'; 3270 time = time.replace('pm', "").replace(' ', ""); 3271 var time_arr = time.split(':'); 3272 var hour = parseInt(time_arr[0]); 3273 var min = pad(time_arr[1], 2); 3274 if (ampm == 'pm') { 3275 if (hour < 12) hour += 12; 3276 } else if (ampm == 'am' && hour == 12) { 3277 hour -= 12; 3278 } 3279 hour = pad(hour, 2); 3280 time = hour + ':' + min + ':00'; 3281 } catch (err) { 3282 time = ""; 3283 } 3284 } 3285 return date+' '+time; 3286 } 3287 3288 function pad(num, size) { 3289 var s = num+""; 3290 while (s.length < size) s = "0" + s; 3291 return s; 3292 } 3293 function convertDateStringtoDateObject(date_str, time_str=null){ 3294 if(date_str){ 3295 split_date_str = date_str.split("/"); 3296 /* Parse start and end time. */ 3297 if(time_str){ 3298 /* Check and see if we are in 12 hour format, if so convert it to 24 hour format. */ 3299 split_time_str = convert12HourTo24Hour(time_str); 3300 }else{ 3301 /* If we do not have a time, then default to zeros */ 3302 split_time_str = [0, 0]; 3303 } 3304 /* Create date object based off our set date format. */ 3305 date_obj = buildDateObj(split_date_str, split_time_str); 3306 return date_obj; 3307 }else{ 3308 return new Date(); 3309 } 3310 } 3311 3312 function buildDateObj(split_date_str, split_time_str){ 3313 if (dateFormat == "d/m/yy"){ 3314 return new Date(split_date_str[2], (+split_date_str[1] - 1).toString(), split_date_str[0], 3315 split_time_str[0], split_time_str[1]); 3316 }else{ 3317 return new Date(split_date_str[2], (+split_date_str[0] - 1).toString(), split_date_str[1], 3318 split_time_str[0], split_time_str[1]); 3319 } 3320 } 3321 3322 function convert12HourTo24Hour(time_str){ 3323 /* This function returns an array containing hours and minutes of provided string in 24 hour format. */ 3324 /* This is primarily used for creating JS Date objects */ 3325 split_time = time_str.split(":"); 3326 3327 /* We are in 12 hour format if there is an "m" attached to minutes portion. */ 3328 if(split_time[1].toLowerCase().search("m") != -1) { 3329 let separated_minutes = split_time[1].split(" "); 3330 if(separated_minutes.length==1){ 3331 split_time[1] = split_time[1].replace("am"," am"); 3332 split_time[1] = split_time[1].replace("pm"," pm"); 3333 separated_minutes = split_time[1].split(" "); 3334 } 3335 let minutes = separated_minutes[0]; 3336 let modifier = separated_minutes[1]; 3337 split_time[1] = minutes; 3338 3339 /* First assume that if the hours are 12, then its midnight. */ 3340 if(split_time[0] == "12"){ 3341 split_time[0] = "00"; 3342 } 3343 /* Second if there is a "p" in the modifier, then add twelve to the hours. */ 3344 if(typeof modifier != "undefined"){ 3345 if(modifier.toLowerCase().search("p") != -1){ 3346 split_time[0] = (parseInt(split_time[0], 10) + 12); 3347 } 3348 } 3349 } 3350 return split_time; 3351 } 3352 /*</editor-fold>*/ 3353 3354 /*<editor-fold defaultstate="collapsed" desc="Cart Show and Hide">*/ 3355 function cartShow() { 3356 jQuery("#cartPopover").show(); 3357 jQuery("#cartPopover").removeClass("cartOut"); 3358 jQuery("#cartPopover").addClass("cartIn"); 3359 jQuery(".cartInfo,.ioCart,.ioCart_link").addClass("open"); 3360 if (/Mobi|Android/i.test(navigator.userAgent)) { 3361 document.body.style.overflow = "hidden"; 3362 } 3363 /* jQuery(this).one("click", cartHide); */ 3364 jQuery(".cartInfo").unbind("click").one("click", function(event){ 3365 event.stopPropagation(); 3366 event.stopImmediatePropagation(); 3367 cartHide(); 3368 }); 3369 jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){ 3370 event.stopPropagation(); 3371 event.stopImmediatePropagation(); 3372 cartHide(); 3373 }); 3374 jQuery(".cartIcon").removeClass("fa-shopping-cart").addClass("fa-close"); 3375 if(simpleCart.items().length==0){
3376 jQuery(".simpleCart_checkout").hide() 3377 }else{ 3378 jQuery(".simpleCart_checkout").show(); 3379 } 3380 3381 checkAvailCartOnly(); 3382 3383 last_upsell_call_time = Date.now() - last_upsell_call; 3384 if(in_cart_upsell && last_upsell_call_time > 2000){ 3385 rental_ids = getAllRentalIDsFromCart(); 3386 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3387 var times = getAvailTimes(); 3388 last_upsell_call = Date.now(); 3389 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3390 } 3391 else{ 3392 jQuery("#cart-carousel-container").hide(); 3393 } 3394 } 3395 } 3396 3397 function cartHide() { 3398 jQuery("#cartPopover").removeClass("cartIn"); 3399 jQuery("#cartPopover").addClass("cartOut"); 3400 if (/Mobi|Android/i.test(navigator.userAgent)) { 3401 document.body.style.overflow = "auto"; 3402 } 3403 /* jQuery("#cartPopover").hide(); */ 3404 jQuery(".cartInfo,.ioCart, .ioCart_link").removeClass("open"); 3405 /* jQuery(this).one("click", cartShow); */ 3406 jQuery(".cartInfo").unbind("click").one("click", function(event){ 3407 event.stopPropagation(); 3408 event.stopImmediatePropagation(); 3409 cartShow(); 3410 }); 3411 jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){ 3412 event.stopPropagation(); 3413 event.stopImmediatePropagation(); 3414 cartShow(); 3415 }); 3416 jQuery(".cartIcon").removeClass("fa-close").addClass("fa-shopping-cart"); 3417 } 3418 /* 3419 function set_date_cookie(){ 3420 if(this.id.indexOf("start_") !== -1){ 3421 setCookie("dateStart", this.value, 14); 3422 } else if(this.id.indexOf("end_") !== -1){ 3423 setCookie("dateEnd", this.value, 14); 3424 } 3425 } 3426 */ 3427 jQuery(document).ready(function () {setTimeout(simpleCart.init, 3);}); 3428 /*</editor-fold>*/ 3429 3430 /*<editor-fold defaultstate="collapsed" desc="Check Avail All Call">*/ 3431 function checkAvailAll(){ 3432 checkAvailCart(); 3433 checkAvailCartTimeslots(); 3434 checkAvailFilter(); 3435 } 3436 /*</editor-fold>*/ 3437 3438 /*<editor-fold defaultstate="collapsed" desc="Check Avail - Page">*/ 3439 /* for items on page not in cart */ 3440 function checkAvailFilter() { 3441 let rental_names = ""; 3442 let rental_ids = ""; 3443 let batch_ids = []; 3444 let cart_rental_names = ""; 3445 let cart_rental_ids = ""; 3446 let item_id = ""; 3447 let main_id = ""; 3448 jQuery(".item_encoded").each(function(){ 3449 rental_names += this.innerText + "|"; 3450 }); 3451 jQuery(".io_product_infobox .item_rentalid").each(function(){ 3452 rental_ids += this.innerText + "|"; 3453 item_id = this.innerText; 3454 main_id = this.innerText; 3455 }); 3456 let batch_count = 0; 3457 let batch_index = 0; 3458 // If we have rental id string set, then we don't want to include availability checking for fpw items in header 3459 // IO-31498 3460 if(!rental_ids) { 3461 jQuery(".io_item2_list_inner .item_rentalid, .io_item2_listrent .item_rentalid").each(function () { 3462 /* 3463 if(rental_ids.indexOf(this.innerText+"|") == -1){ 3464 rental_ids += this.innerText + "|"; 3465 } 3466 */ 3467 if (batch_count < 9) { 3468 if (!batch_ids.length) batch_ids.push("") 3469 if (!rid_in_batch(this.innerText + "|", batch_ids).length) { 3470 batch_ids[batch_index] += this.innerText + "|"; 3471 batch_count++; 3472 } 3473 } else { 3474 if (!rid_in_batch(this.innerText + "|", batch_ids).length) { 3475 batch_ids[batch_index] += this.innerText + "|"; 3476 batch_index++; 3477 batch_count = 0; 3478 batch_ids.push(""); 3479 } 3480 } 3481 }); 3482 } 3483 simpleCart.each(function (item, x) { 3484 var cart_name = item.get("encoded"); 3485 if(cart_name==null){ 3486 cart_name = encodeURIComponent(item.get("name")); 3487 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 3488 } 3489 let quantity = item.get("quantity"); 3490 if(item.get("inputtype") == "Map"){ 3491 quantity = 1 3492 } 3493 cart_rental_names += cart_name + "-" + quantity + "|"; 3494 var cart_id = item.get("rentalid"); 3495 cart_rental_ids += cart_id + "-" + quantity + "|"; 3496 }); 3497 /* #14494 IO-13779 */ 3498 let delivery_methods_arr = []; 3499 var delivery_prices = []; 3500 if(io_delivery_prices){ 3501 if(Object.keys(io_delivery_prices["override"]).includes(item_id)){ 3502 delivery_prices = io_delivery_prices["override"][item_id] 3503 }else{ 3504 if(!item_is_in_overrride_group(main_id)){ 3505 delivery_prices = io_delivery_prices["default"] 3506 } 3507 } 3508 for(item in io_delivery_methods){ 3509 if(delivery_prices.includes(io_delivery_methods[item]["id"])){ 3510 delivery_methods_arr.push(item); 3511 } 3512 } 3513 } 3514
3515 let custom_prices_arr = []; 3516 if(io_custom_prices){ 3517 if(Object.keys(io_custom_prices["override"]).includes(item_id.replace(":", '_'))){ 3518 custom_prices_arr = io_custom_prices["override"][item_id.replace(":", '_')] 3519 }else{ 3520 if(!item_is_in_overrride_group(main_id)){ 3521 custom_prices_arr = io_custom_prices["default"] 3522 } 3523 } 3524 } 3525 3526 /* IO-13548 */ 3527 if(io_accessory_price == "on"){ 3528 let times = getAvailTimes(); 3529 let acc_rental_id_str = getAccIDforPrice(); 3530 let return_id = 0; 3531 if(acc_rental_id_str != ""){ 3532 checkAvailCall(times[0],times[1],times[2],rental_names,acc_rental_id_str,displayAccessoryPrices,0,[],[],return_id,0,null,1,"",1); 3533 } 3534 } 3535 3536 let times = getAvailTimes(); 3537 if(rental_names.length>0){ 3538 if(use_weekday_weekend && rental_ids && !item_is_in_overrride_group(main_id)){ 3539 let return_id = 0; 3540 let week_weekend = ""; 3541 if(rental_ids != ""){ 3542 return_id = 1; 3543 week_weekend = get_week_weekend_times(times, main_id); 3544 checkAvailCall(week_weekend["weekday"][0],week_weekend["weekday"][1],week_weekend["weekday"][2],rental_names,rental_ids,updatePageAvail_weekday,0,cart_rental_ids,cart_rental_names,return_id,1); 3545 checkAvailCall(week_weekend["weekend"][0],week_weekend["weekend"][1],week_weekend["weekend"][2],rental_names,rental_ids,updatePageAvail_weekend,0,cart_rental_ids,cart_rental_names,return_id,1); 3546 } 3547 } 3548 let return_id = 0; 3549 if(rental_ids != "" || batch_ids.length){ 3550 return_id = 1; 3551 } 3552 if(delivery_methods_arr && rental_ids){ 3553 delivery_methods_arr.forEach(function(delivery_method){ 3554 checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updatePageAvail_delivery_method,0,cart_rental_ids,cart_rental_names,return_id,1,delivery_method); 3555 }); 3556 } 3557 if(custom_prices_arr && rental_ids){ 3558 custom_prices_arr.forEach(function(custom_price){ 3559 let start_date = times[0]; 3560 let start_time = times[1]; 3561 if(!start_date){ 3562 start_date = getFormatteddate(new Date()); 3563 } 3564 if(!start_time){ 3565 start_time = io_default_start_time; 3566 } 3567 checkAvailCall(start_date,start_time,custom_price['duration'],rental_names,rental_ids,updatePageAvail_custom_price,0,cart_rental_ids,cart_rental_names,return_id,1,"",1,custom_price['name']); 3568 }); 3569 } 3570 3571 if(batch_ids.length){ 3572 batch_ids.forEach(function(rids){ 3573 return checkAvailCall(times[0],times[1],times[2],"",rids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1,"",1); 3574 }); 3575 }else{ 3576 return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1); 3577 } 3578 } 3579 } 3580 3581 function item_is_in_overrride_group(item_id){ 3582 for(const group_id in io_prices['override_groups']){ 3583 for(const search_id in io_prices['override_groups'][group_id]){ 3584 if(search_id == item_id){ 3585 return true; 3586 } 3587 } 3588 } 3589 return false 3590 } 3591 3592 function get_week_weekend_times(times, rid){ 3593 /* Create a copy instead of reference.*/ 3594 let temp_times = JSON.parse(JSON.stringify(times)); 3595 let start_date = temp_times[0]; 3596 if(!start_date){ 3597 start_date = getFormatteddate(new Date()); 3598 temp_times[0] = start_date; 3599 } 3600 temp_times[1] = io_default_start_time 3601 var newDate1 = convertDateStringtoDateObject(start_date, io_default_start_time); 3602 var newDate2 = convertDateStringtoDateObject(start_date, io_default_end_time); 3603 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 3604 temp_times[2] = time_duration; 3605 let day = new Date(newDate1).getDay(); //IO-28150 - Other countries put the date dd/mm/yy so using the formatted newDate1 instead of start_date accounts for this 3606 let weekday_weekend = {}; 3607 weekday_weekend["rid"] = rid; 3608 if(io_weekendDefine == "friday-sunday"){ 3609 if(day == 5 || day == 6 || day == 0){ 3610 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3611 temp_times[0] = getNextMonday(temp_times[0]); 3612 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3613 }else if(day == 1 || day == 2 || day == 3 || day == 4){ 3614 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3615 temp_times[0] = getNextSaturday(temp_times[0]); 3616 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3617 } 3618 }else if(io_weekendDefine == "saturday-sunday") { 3619 if (day == 6 || day == 0) { 3620 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3621 temp_times[0] = getNextMonday(temp_times[0]); 3622 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3623 } else if (day == 1 || day == 2 || day == 3 || day == 4 || day == 5) { 3624 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3625 temp_times[0] = getNextSaturday(temp_times[0]); 3626 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3627 } 3628 }else if (io_weekendDefine == "friday-monday"){ 3629 if(day == 5 || day == 6 || day == 0 || day == 1){ 3630 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3631 temp_times[0] = getNextTuesday(temp_times[0]); 3632 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3633 }else if(day == 2 || day == 3 || day == 4){ 3634 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3635 temp_times[0] = getNextSaturday(temp_times[0]); 3636 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3637 } 3638 } 3639 return weekday_weekend; 3640 } 3641 3642 /* 3643 helper function found here: 3644 https://bobbyhadz.com/blog/javascript-get-date-of-next-monday#:~:text=To%20get%20the%20next%20Monday%2C%20we%3A&text=If%20the%20remainder%20is%20equal,month%20for%20the%20next%20Monday. 3645 */ 3646 function getNextMonday(date_str) { 3647 const date_obj = parseDate(date_str, dateFormat); 3648 3649 const nextMonday = new Date( 3650 date_obj.setDate( 3651 date_obj.getDate() + ((7 - date_obj.getDay() + 1) % 7 || 7), 3652 ), 3653 ); 3654 3655 return getFormatteddate(nextMonday); 3656 } 3657 3658 function getNextTuesday(date_str) { 3659 const date_obj = parseDate(date_str, dateFormat); 3660 3661 const nextMonday = new Date( 3662 date_obj.setDate( 3663 date_obj.getDate() + ((7 - date_obj.getDay() + 2) % 7 || 7), 3664 ), 3665 ); 3666 3667 return getFormatteddate(nextMonday); 3668 } 3669 3670 function parseDate(date_str, format) { 3671 var parts = date_str.split(/[/.-]/); 3672 var day, month, year; 3673 3674 if (format === "m/d/yy") {
3675 month = parseInt(parts[0]) - 1; 3676 day = parseInt(parts[1]); 3677 year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0); 3678 } else if (format === "d/m/yy") { 3679 day = parseInt(parts[0]); 3680 month = parseInt(parts[1]) - 1; 3681 year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0); 3682 } else if (format === "yy/m/d") { 3683 year = parseInt(parts[0]) + (parts[0].length === 2 ? 2000 : 0); 3684 month = parseInt(parts[1]) - 1; 3685 day = parseInt(parts[2]); 3686 } else { 3687 throw new Error("Unsupported date format"); 3688 } 3689 3690 return new Date(year, month, day); 3691 } 3692 3693 /* modified from function above */ 3694 function getNextSaturday(date_str) { 3695 const date_obj = parseDate(date_str, dateFormat); 3696 3697 const next_friday = new Date( 3698 date_obj.setDate( 3699 date_obj.getDate() + ((7 - date_obj.getDay() + 6) % 7 || 7), 3700 ), 3701 ); 3702 3703 return getFormatteddate(next_friday); 3704 } 3705 3706 function updatePageAvail(data){ 3707 let use_id = data["return_id"] 3708 delete data["return_id"]; 3709 if(use_id == 1){ 3710 updatePageAvail_itemIDs(data) 3711 }else{ 3712 updatePageAvail_itemNames(data); 3713 } 3714 } 3715 function updatePageAvail_weekday(data){ 3716 jQuery.each(data, function (rental_id, qty){ 3717 if (rental_id == "price") { 3718 var prices = qty; 3719 jQuery.each(prices, function (price_id, amt) { 3720 let cust_price = document.querySelector(".io_product_cust_price_weekday"); 3721 if(cust_price==undefined){ 3722 var first_price = document.querySelector(".io_product_price_box"); 3723 if(first_price != null){ 3724 cust_price = first_price.cloneNode(true); 3725 /* clear all classes */ 3726 cust_price.className = ""; 3727 cust_price.classList.add("io_product_price_box"); 3728 cust_price.classList.add("io_product_cust_price_weekday"); 3729 cust_price.style.display = "none"; 3730 first_price.before(cust_price); 3731 } 3732 } 3733 3734 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3735 if(main_item_id == price_id && cust_price!=undefined){ 3736 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3737 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3738 let times = getAvailTimes(); 3739 cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekDayText; 3740 if(amt>0){ 3741 cust_price.style.display = "grid"; 3742 }else{ 3743 cust_price.style.display = "none"; 3744 } 3745 } 3746 }); 3747 } 3748 }); 3749 } 3750 function updatePageAvail_delivery_method(data){ 3751 var delivery_method = data["delivery_method"] 3752 jQuery.each(data, function (rental_id, qty){ 3753 if (rental_id == "price") { 3754 var prices = qty; 3755 jQuery.each(prices, function (price_id, amt) { 3756 let cust_price = document.querySelector(".io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]); 3757 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 3758 if(cust_price==undefined && !io_delivery_methods[delivery_method]["restricted"].includes(rid)){ 3759 var first_price = document.querySelector(".io_product_price_box"); 3760 if(first_price != null){ 3761 cust_price = first_price.cloneNode(true); 3762 /* clear all classes */ 3763 cust_price.className = ""; 3764 cust_price.classList.add("io_product_price_box"); 3765 cust_price.classList.add("io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]); 3766 cust_price.style.display = "none"; 3767 first_price.before(cust_price); 3768 } 3769 } 3770 3771 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3772 if(main_item_id == price_id && cust_price!=undefined){ 3773 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3774 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3775 let times = getAvailTimes(); 3776 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times, delivery_method); 3777 if(amt>0 && event_time_set()){ 3778 cust_price.style.display = "grid"; 3779 }else{ 3780 cust_price.style.display = "none"; 3781 } 3782 } 3783 }); 3784 } 3785 }); 3786 } 3787 function updatePageAvail_custom_price(data, custom_price_name){
3788 let custom_price_class_name = custom_price_name.replace(/[\s:./()!]/g, '_'); 3789 jQuery.each(data, function (rental_id, qty){ 3790 if (rental_id == "price") { 3791 var prices = qty; 3792 jQuery.each(prices, function (price_id, amt) { 3793 let cust_price = document.querySelector(".io_product_cust_price_"+custom_price_class_name); 3794 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 3795 if(cust_price==undefined){ 3796 var first_price = document.querySelector(".io_product_price_box"); 3797 if(first_price != null){ 3798 cust_price = first_price.cloneNode(true); 3799 /* clear all classes */ 3800 cust_price.className = ""; 3801 cust_price.classList.add("io_product_price_box"); 3802 cust_price.classList.add("io_product_cust_price_"+custom_price_class_name); 3803 cust_price.style.display = "none"; 3804 first_price.before(cust_price); 3805 } 3806 } 3807 3808 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3809 if(main_item_id == price_id && cust_price!=undefined){ 3810 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3811 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3812 cust_price.querySelector("p:nth-child(2)").innerHTML = "for " + custom_price_name; 3813 if(amt>0){ 3814 cust_price.style.display = "grid"; 3815 }else{ 3816 cust_price.style.display = "none"; 3817 } 3818 } 3819 }); 3820 } 3821 }); 3822 } 3823 function updatePageAvail_weekend(data){ 3824 jQuery.each(data, function (rental_id, qty){ 3825 if (rental_id == "price") { 3826 var prices = qty; 3827 jQuery.each(prices, function (price_id, amt) { 3828 let cust_price = document.querySelector(".io_product_cust_price_weekend"); 3829 if(cust_price==undefined){ 3830 var first_price = document.querySelector(".io_product_price_box"); 3831 if(first_price != null){ 3832 cust_price = first_price.cloneNode(true); 3833 /* clear all classes */ 3834 cust_price.className = ""; 3835 cust_price.classList.add("io_product_price_box"); 3836 cust_price.classList.add("io_product_cust_price_weekend"); 3837 cust_price.style.display = "none"; 3838 first_price.before(cust_price); 3839 } 3840 } 3841 3842 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3843 if(main_item_id == price_id && cust_price!=undefined){ 3844 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3845 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3846 let times = getAvailTimes(); 3847 cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekEndText; 3848 if(amt>0){ 3849 cust_price.style.display = "grid"; 3850 }else{ 3851 cust_price.style.display = "none"; 3852 } 3853 } 3854 }); 3855 } 3856 }); 3857 } 3858 function updatePageAvail_itemIDs(data){ 3859 jQuery.each(data, function (rental_id, qty){ 3860 if (rental_id == "price" && jQuery(".io_product_infobox .item_inputtype").text() != "Map") { 3861 var prices = qty; 3862 jQuery.each(prices, function (price_id, amt) { 3863 let cust_price = document.querySelector(".io_product_cust_price"); 3864 if(cust_price==undefined){ 3865 var first_price = document.querySelector(".io_product_price_box"); 3866 if(first_price != null){ 3867 cust_price = first_price.cloneNode(true); 3868 /* clear all classes */ 3869 cust_price.className = ""; 3870 cust_price.classList.add("io_product_price_box"); 3871 cust_price.classList.add("io_product_cust_price"); 3872 cust_price.style.display = "none"; 3873 first_price.before(cust_price); 3874 } 3875 } 3876 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3877 if(main_item_id == price_id && cust_price!=undefined){ 3878 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3879 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3880 let times = getAvailTimes(); 3881 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 3882 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 3883 cust_price.style.display = "grid"; 3884 }else{ 3885 cust_price.style.display = "none"; 3886 } 3887 } 3888 }); 3889 } 3890 3891 if(qty<=0 && rental_id != "delivery_method"){ 3892 /* cat,all-item,widget */ 3893 if(io_checkavail=="warn"){ 3894 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 3895 jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).show(); 3896 }
3897 if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().hide(); 3898 3899 /* product page */ 3900 if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){ 3901 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange"); 3902 jQuery(".io_product_container .unavailable_message").show(); 3903 } 3904 }else if(qty>0){ 3905 if(io_checkavail=="warn"){ 3906 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 3907 jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).hide(); 3908 } 3909 if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().show(); 3910 3911 /* product page */ 3912 if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){ 3913 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 3914 jQuery(".io_product_container .unavailable_message").hide(); 3915 } 3916 } 3917 }); 3918 } 3919 function updatePageAvail_itemNames(data){ 3920 jQuery.each(data, function (rental_name, qty) { 3921 rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'"); 3922 var main_name_temp = ""; 3923 if(typeof main_name_orig != "undefined"){ 3924 main_name_temp = main_name_orig.replace(/[\u2032\u2019]+/ig,"'"); 3925 } 3926 rental_name_esc = rental_name.replace(/'/g, "\\\\'"); 3927 if (rental_name == "price") { 3928 var prices = qty; 3929 jQuery.each(prices, function (price_name, amt) { 3930 /* var prices = document.querySelector(".io_product_price_box:not(.io_product_cust_price)"); */ 3931 /* if(prices != null) prices.remove(); */ 3932 let cust_price = document.querySelector(".io_product_cust_price"); 3933 if(cust_price==undefined){ 3934 var first_price = document.querySelector(".io_product_price_box"); 3935 if(first_price != null){ 3936 cust_price = first_price.cloneNode(true); 3937 /* clear all classes */ 3938 cust_price.className = ""; 3939 cust_price.classList.add("io_product_price_box"); 3940 cust_price.classList.add("io_product_cust_price"); 3941 cust_price.style.display = "none"; 3942 first_price.before(cust_price); 3943 } 3944 } 3945 try{ 3946 var main_name = decodeURIComponent(jQuery(".io_product_container .item_encoded").first().html().replace(/[+]/gi, "%20")); 3947 }catch(e){main_name=""} 3948 var i = main_name.lastIndexOf(":"); 3949 let acc_name = ""; 3950 let rental_name = ""; 3951 var i = main_name.lastIndexOf(":"); 3952 if(i>0){ 3953 rental_name = main_name.substring(0, i); 3954 acc_name = main_name.substring(i+1); 3955 } 3956 if (acc_name.toUpperCase() == price_name.toUpperCase() && cust_price!=undefined){ 3957 var rental_id = document.querySelector(".item_rentalid").innerText; 3958 if(rental_id != null){ 3959 rid_arr = rental_id.split(":"); 3960 /* ignore the main id for this */ 3961 rental_id = rid_arr[rid_arr.length-1]; 3962 if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){ 3963 amt = prices[acc_name]; 3964 }else{ 3965 let item_price = Number(prices[rental_name].replace(",","")); 3966 amt = Number(amt.replace(",","")) + item_price; 3967 amt = simpleCart.toCurrency(amt, {symbol:""}) 3968 } 3969 } 3970 cust_price.querySelector("p:nth-child(1)").innerText="$"+amt; 3971 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3972 let times = getAvailTimes(); 3973 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 3974 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 3975 cust_price.style.display = "grid"; 3976 }else{ 3977 cust_price.style.display = "none"; 3978 } 3979 3980 }else if(!rental_name && !acc_name && cust_price!=undefined){ 3981 amt = prices[main_name]; 3982 cust_price.querySelector("p:nth-child(1)").innerText="$"+amt; 3983 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3984 let times = getAvailTimes(); 3985 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 3986 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 3987 cust_price.style.display = "grid"; 3988 }else{ 3989 cust_price.style.display = "none"; 3990 } 3991 } 3992 3993 }); 3994 } 3995 3996 if(qty<=0){ 3997 /* cat,all-item,widget */ 3998 if(io_checkavail=="warn"){ 3999 jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4000 jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").show(); 4001 }
4002 if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").hide(); 4003 4004 /* product page */ 4005 if(jQuery(".io_product_container").length && io_checkavail!="off"){ 4006 if(main_name_temp==rental_name){ 4007 jQuery(".io_product_container .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4008 jQuery(".io_product_container .unavailable_message").show(); 4009 } 4010 } 4011 }else if(qty>0){ 4012 /* console.log("good"); */ 4013 if(io_checkavail=="warn"){ 4014 jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4015 jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").hide(); 4016 } 4017 if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").show(); 4018 4019 /* product page */ 4020 if(jQuery(".io_product_container").length && io_checkavail!="off"){ 4021 if(main_name_temp==rental_name){ 4022 jQuery(".io_product_container .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4023 jQuery(".io_product_container .unavailable_message").hide(); 4024 } 4025 } 4026 } 4027 }); 4028 } 4029 function displayAccessoryPrices(data) { 4030 if (data.price) { 4031 let acc_prices = data.price; 4032 for (const [key, value] of Object.entries(acc_prices)) { 4033 let new_key = key; 4034 if ((key.match(/_/g) || []).length > 1) { 4035 let split_key = key.split("_"); 4036 let second_to_last = split_key[split_key.length - 2]; 4037 let last = split_key[split_key.length - 1]; 4038 new_key = second_to_last + "_" + last; 4039 } 4040 if (io_hide_zero == 1 && value > 0) { 4041 let id_string = "#io_acc_desc_" + new_key; 4042 let formatted_price = simpleCart.toCurrency(value); 4043 if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) { 4044 jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price); 4045 } else { 4046 let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>'; 4047 jQuery(id_string).after(price_display); 4048 } 4049 } else if (io_hide_zero == 0) { 4050 let id_string = "#io_acc_desc_" + new_key; 4051 let formatted_price = simpleCart.toCurrency(value); 4052 if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) { 4053 jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price); 4054 } else { 4055 let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>'; 4056 jQuery(id_string).after(price_display); 4057 } 4058 } 4059 } 4060 } 4061 } 4062 function make_live_price_editable_time(times, delivery_method=null) { 4063 if(!delivery_method) delivery_method = getCookie("io_delivery_method"); 4064 let ele_text = ""; 4065 if(times[0]) ele_text = "on " + times[0] + " "; 4066 if(times[2] === 0) times[2] = 1; 4067 if(io_hidetimes!="on" && !isNaN(times[2])) ele_text += "for "+times[2]+" hours "; 4068 if(delivery_method) ele_text += "for " + delivery_method + ". "; 4069 ele_text += '<span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()>edit</span>'; 4070 return ele_text; 4071 } 4072 function checkAvailDateClick(){ 4073 cartShow(); 4074 /* expand the date picker */ 4075 setTimeout(calSetDateRange,100); 4076 } 4077 function checkAvailPageOnly(){ 4078 checkAvailFilter(); 4079 if(addressCookiesSet() && io_distance_charge){ 4080 runDeliveryCall(true); 4081 } 4082 } 4083 function getAccIDforPrice(){ 4084 let accessory_arr = jQuery(".io_acc_li").toArray(); 4085 let acc_rental_id_str = ""; 4086 for(let current_accessory = 0; current_accessory < accessory_arr.length; current_accessory++){ 4087 let required_tag = jQuery(accessory_arr[current_accessory]).find(".item_required"); 4088 if(required_tag.length > 0){ 4089 if(required_tag[0].innerText == 0){ 4090 acc_rental_id_str += jQuery(accessory_arr[current_accessory]).find(".item_rentalid")[0].innerText +"|"; 4091 } 4092 } 4093 } 4094 return acc_rental_id_str; 4095 } 4096 function getUpsellIDforPrice(){ 4097 let upsell_arr = jQuery(".page-carousel-rid").toArray(); 4098 let upsell_rental_id_str = ""; 4099 for(let current_upsell = 0; current_upsell < upsell_arr.length; current_upsell++){ 4100 upsell_rental_id_str +=upsell_arr[current_upsell].innerText+"|"; 4101 } 4102 return upsell_rental_id_str; 4103 } 4104 function displayUpsellPrices(data){ 4105 if(data.price){ 4106 let upsell_prices = data.price; 4107 for (const [key, value] of Object.entries(upsell_prices)) { 4108 if(io_hide_zero == 1 && value > 0){ 4109 let id_string = "#rid"+ key; 4110 let formatted_price = simpleCart.toCurrency(value); 4111 let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>'; 4112 jQuery(id_string).after(price_display); 4113 }else if(io_hide_zero == 0){ 4114 let id_string = "#rid"+ key; 4115 let formatted_price = simpleCart.toCurrency(value); 4116 let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>'; 4117 jQuery(id_string).after(price_display); 4118 } 4119 } 4120 pageFlickityRefresh(); 4121 } 4122 } 4123 /*</editor-fold>*/ 4124 4125 /*<editor-fold defaultstate="collapsed" desc="Check Avail - Cart">*/ 4126 function checkAvailCartOnly(skip_timer=false){ 4127 checkAvailCart(); 4128 checkAvailCartTimeslots(); 4129 } 4130 4131 function checkAvailCartTimeslots(){ 4132 let rental_names = ""; 4133 let rental_ids = "";
4134 let cart_rental_names = ""; 4135 let cart_rental_ids = ""; 4136 let times = getAvailTimes(); 4137 let start_date = times[0]; 4138 let event_duration = times[2]; 4139 let end_date = start_date; 4140 var event_start_time = getCookie("io_timeStart"); 4141 simpleCart.each(function (item, x) { 4142 var timeslots_html = item.get('timeslots'); 4143 if(typeof timeslots_html == "undefined") return; 4144 if(timeslots_html.length == 0) return; 4145 var cart_name = item.get("encoded"); 4146 if(cart_name==null) { 4147 cart_name = encodeURIComponent(item.get("name")); 4148 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 4149 } 4150 rental_id = item.get("rentalid"); 4151 4152 var timeslot_name = getTimeslotName(timeslots_html); 4153 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 4154 if(typeof timeslot_sel_range != "undefined"){ 4155 /* timeslots */ 4156 setTimeslotSelected(item, timeslot_name); 4157 }else{ 4158 /* timepickers */ 4159 setTimePicker(item, timeslot_name); 4160 let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_")); 4161 let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_")); 4162 timeslot_sel_range = start_timepicker[start_timepicker.length-1].value; 4163 timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value; 4164 } 4165 4166 var timeslot_sel_arr = ""; 4167 if(typeof timeslot_sel_range != "undefined"){ 4168 var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range); 4169 if(start_time && end_time){ 4170 let newDate1 = convertDateStringtoDateObject(start_date, start_time); 4171 let newDate2 = convertDateStringtoDateObject(end_date, end_time); 4172 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 4173 let quantity = item.get("quantity"); 4174 if(item.get("inputtype") == "Map"){ 4175 quantity = 1 4176 } 4177 rental_names += cart_name + "-" + quantity+"|"; 4178 rental_ids += rental_id+"-"+quantity+"-"+start_time+"-"+time_duration+"|"; 4179 cart_rental_names = rental_names; 4180 cart_rental_ids = rental_ids; 4181 } 4182 } 4183 }); 4184 if(rental_ids || rental_names){ 4185 checkAvailCall(start_date,event_start_time,event_duration,rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,1); 4186 } 4187 return true; 4188 } 4189 4190 function checkAvailCart(){ 4191 let rental_names = ""; 4192 let rental_ids = ""; 4193 let cart_rental_names = ""; 4194 let cart_rental_ids = ""; 4195 simpleCart.each(function (item, x) { 4196 if(typeof item.get('timeslots') != "undefined"){ 4197 if(item.get('timeslots').length > 0){ 4198 return; 4199 } 4200 } 4201 var cart_name = item.get("encoded"); 4202 if(cart_name==null){ 4203 cart_name = encodeURIComponent(item.get("name")); 4204 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 4205 } 4206 let quantity = item.get("quantity"); 4207 if(item.get("inputtype") == "Map"){ 4208 quantity = 1 4209 } 4210 rental_names += cart_name + "-" + quantity + "|"; 4211 cart_rental_names += cart_name + "-" + quantity + "|"; 4212 var cart_id = item.get("rentalid"); 4213 rental_ids += cart_id + "-" + quantity + "|"; 4214 cart_rental_ids += cart_id + "-" + quantity + "|"; 4215 }); 4216 var times = getAvailTimes(); 4217 let return_id = 0; 4218 if(rental_ids != ""){ 4219 return_id = 1; 4220 } 4221 if(rental_ids != "" || rental_names != ""){ 4222 return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,return_id); 4223 } 4224 return true; 4225 } 4226 function updateCartAvail(data){ 4227 let use_id = data["return_id"] 4228 delete data["return_id"]; 4229 if(use_id == 1){ 4230 updateCartAvail_itemIDs(data) 4231 }else{ 4232 updateCartAvail_itemNames(data); 4233 } 4234 console.log("cart update"); 4235 if(addressCookiesSet() && io_distance_charge){ 4236 runDeliveryCall(true); 4237 } 4238 /* simpleCart.trigger("update"); */
4239 simpleCart.update(); 4240 /* jQuery("#avail").html(output); */ 4241 } 4242 4243 function updateCartAvail_itemIDs(data){ 4244 jQuery.each(data, function (rental_id, qty){ 4245 simpleCart.each(function (item, x) { 4246 if(rental_id == item.get("rentalid")){ 4247 if(io_hideQuantityAvail == "off"){ 4248 if(qty>=9999 || item.get("inputtype") == "Map" || (item.get("giftcardvalue") && item.get("giftcardvalue").trim())){ 4249 item.set("availability", "available"); 4250 }else{ 4251 item.set("availability", qty + " available"); 4252 } 4253 }else if(io_hideQuantityAvail == "on"){ 4254 if(qty<=0 || qty < item.get("quantity")){ 4255 item.set("availability", "not available"); 4256 }else{ 4257 item.set("availability", "available"); 4258 } 4259 } 4260 var vendorid = item.get("vendorid"); 4261 if(vendorid && vendorid.trim()){ 4262 item.set("availability", "availability must be verified"); 4263 } 4264 } 4265 if (rental_id == "price") { 4266 var prices = qty; 4267 jQuery.each(prices, function (price_name, amt) { 4268 if(price_name == item.get("rentalid")){ 4269 if (typeof amt == "string" || amt instanceof String){ 4270 if(amt != "TBD"){ 4271 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4272 } 4273 } 4274 item.set("price", amt); 4275 } 4276 }); 4277 } 4278 }); 4279 }); 4280 } 4281 4282 function updateCartAvail_itemNames(data){ 4283 jQuery.each(data, function (rental_name, qty) { 4284 rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'"); 4285 simpleCart.each(function (item, x) { 4286 try{ 4287 var cart_name = decodeURIComponent(item.get("encoded").replace(/[+]/gi, "%20")); 4288 }catch(e){cart_name=null} 4289 if(cart_name==null) cart_name = item.get("name") 4290 cart_name = cart_name.replace(/[\u2032\u2019]+/ig,"'"); 4291 var i = cart_name.lastIndexOf(":"); 4292 if(i>0 && cart_name.toUpperCase() != rental_name.toUpperCase() && rental_name!="price"){cart_name = cart_name.substring(i+1)} 4293 if (cart_name.toUpperCase() == rental_name.toUpperCase()) { 4294 if(qty>9999){ 4295 item.set("availability", "available"); 4296 }else{ 4297 item.set("availability", qty + " available"); 4298 } 4299 } 4300 if (rental_name == "price") { 4301 var prices = qty; 4302 jQuery.each(prices, function (price_name, amt) { 4303 price_name = price_name.replace(/[\u2032\u2019]+/ig,"'"); 4304 let acc_name = ""; 4305 let rental_name = ""; 4306 var i = cart_name.lastIndexOf(":"); 4307 if(i>0){ 4308 rental_name = cart_name.substring(0, i); 4309 acc_name = cart_name.substring(i+1); 4310 } 4311 if (acc_name === price_name) { 4312 var rental_id = item.get("rentalid"); 4313 if(rental_id != null){ 4314 rid_arr = rental_id.split(":"); 4315 /* ignore the main id for this */ 4316 rental_id = rid_arr[rid_arr.length-1]; 4317 if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){ 4318 amt = prices[acc_name]; 4319 }else{ 4320 let item_price = Number(prices[rental_name].replace(",","")); 4321 amt = Number(amt.replace(",","")) + item_price; 4322 item.set("price", amt); 4323 return; 4324 } 4325 } 4326 if(amt==null){ 4327 amt = "0"; 4328 } 4329 /* returned price is per unit */ 4330 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4331 item.set("price", amt); 4332 }else if(!rental_name && !acc_name){ 4333 amt = Number(prices[cart_name].replace(",","")); 4334 item.set("price", amt); 4335 } 4336 }); 4337 } 4338 }); 4339 }); 4340 } 4341 /*</editor-fold>*/ 4342 4343 /*<editor-fold defaultstate="collapsed" desc="Upsell Carousels">*/ 4344 function updateCartUpsell(data){ 4345 let cart_carousel = jQuery(".cart-carousel"); 4346 viewport = jQuery(".cart-carousel .flickity-viewport"); 4347 if(viewport.length > 0){ 4348 cart_carousel.flickity("destroy"); 4349 } 4350 cart_carousel.empty(); 4351 data.forEach(function(upsell){ 4352 cell = createCartCarouselCell(upsell["image"], upsell["name"], upsell["page"]); 4353 cart_carousel.append(cell); 4354 }); 4355 makeCarousel(cart_carousel); 4356 jQuery("#cart-carousel-container").show(); 4357 setTimeout(cartFlickityRefresh, 500); 4358 } 4359 4360 function cartFlickityRefresh(){ 4361 jQuery(".cart-carousel").flickity("resize"); 4362 } 4363 4364 //IO-14031 4365 function isMobile() 4366 { 4367 // Modern detection 4368 if (navigator.userAgentData && navigator.userAgentData.mobile !== undefined) { 4369 return navigator.userAgentData.mobile; 4370 } 4371 4372 // Fallback for older browsers 4373 return /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent) || 4374 ('ontouchstart' in window && navigator.maxTouchPoints > 0); 4375 } 4376 4377 function makeCarousel(cart_carousel) 4378 { 4379 cart_carousel.flickity({ 4380 wrapAround: true, 4381 draggable: isMobile(), 4382 cellAlign: 'left', 4383 //autoPlay: 3000, 4384 groupCells: true, 4385 resize: true 4386 }); 4387 cart_carousel_set = true; 4388 } 4389 4390 function createCartCarouselCell(image, name, page){ 4391 cell = '<div class="io_cart_carousel_cell"> <a href='+page+' class="cart-carousel-link"> <img class="cart-carousel-image" src='+image+'> <p class="cart-carousel-name"> '+name+' </p> </a> </div>'; 4392 return cell; 4393 } 4394 /*</editor-fold>*/ 4395 4396 /*<editor-fold defaultstate="collapsed" desc="Ajax Calls">*/ 4397 function checkAvailCall(start_date,start_time,time_duration,rental_names,rental_ids,returnFunc,singleCart,cart_rental_ids,cart_rental_names,return_id,temp=0,delivery_method=null,price_only=0,custom_price_name="", skip_hidden_lead = 0) { 4398 /*
4399 IO-21459 If we have no duration set (event not set in cart), and we are doing the call for the page live 4400 price, and we have the setting on where we want to display this price even if the event date is not set: 4401 4402 We set the time_duration to 1 hour. This defaults the start date to January 1, 1970 with duration of 4403 1 hour in the lead meaning it will be available and we have the one hour price. 4404 */ 4405 if((isNaN(time_duration) || time_duration===0) && price_only==1 && io_always_display_live_price == "on"){ 4406 time_duration = 1; 4407 if(!start_date){ 4408 start_date = getFormatteddate(new Date()); 4409 } 4410 if(!start_time){ 4411 start_time = getFormattedtime(new Date()); 4412 } 4413 }else if((isNaN(time_duration) || time_duration===0) && price_only==0 && io_hidetimes === "on"){ 4414 /* IO-22689 if they have times hidden, and happen to have the same default start and end time, we still want to do the call. */ 4415 time_duration = 1; 4416 }else if(isNaN(time_duration) || time_duration===0){ 4417 return; 4418 } 4419 url = "https://rental.software/quotes/check_availability_v2.php?callback=?"; 4420 if(window.location.href.indexOf("localhost") > -1){ 4421 //url = "http://localhost/bugs/quotes/check_availability_v2.php?callback=?"; 4422 url = "http://localhost/io/bugs/quotes/check_availability_v2.php?callback=?"; 4423 //url = "http://localhost/jbug/trunk/quotes/check_availability_v2.php?callback=?"; 4424 } 4425 if(!delivery_method) delivery_method = getCookie("io_delivery_method"); 4426 let address_data = { 4427 "address": getCookie("io_address"), 4428 "state": getCookie("io_state"), 4429 "city": getCookie("io_city"), 4430 "zip": getCookie("io_zip") 4431 }; 4432 if(!ioHasMarketingConsent()){ 4433 address_data = {"address":"", "state":"", "city":"", "zip":""}; 4434 } 4435 url += 4436 "&name=" + encodeURIComponent("Mountain Bouncers LLC") + 4437 "&startdate=" + start_date + 4438 "&starttime=" + start_time + 4439 "&duration=" + time_duration + 4440 "&street=" + encodeURIComponent(address_data["address"]) + 4441 "&city=" + encodeURIComponent(address_data["city"]) + 4442 "&state=" + encodeURIComponent(address_data["state"]) + 4443 "&zip=" + encodeURIComponent(address_data["zip"]) + 4444 "&single_cart=" + singleCart + 4445 "&usecushion=1" + 4446 "&include_price=1" + 4447 "&showlocations=0" + 4448 "&rental_names=" + rental_names + 4449 "&rental_ids=" + rental_ids + 4450 "&cart_rental_names=" + cart_rental_names + 4451 "&cart_rental_ids=" + cart_rental_ids + 4452 "&return_id=" + return_id + 4453 "&delivery_method=" + delivery_method + 4454 "&temp=" + temp + 4455 "&skip_hidden_lead="+ skip_hidden_lead; 4456 if (custom_price_name) 4457 { 4458 ioCartLoaderIncrement(); 4459 jQuery.getJSON(url, function (data) 4460 { 4461 try 4462 { 4463 returnFunc(data, custom_price_name); 4464 } 4465 finally 4466 { 4467 ioCartLoaderDecrement(); 4468 } 4469 }); 4470 } 4471 else 4472 { 4473 ioCartLoaderIncrement(); 4474 jQuery.getJSON(url, function (data) 4475 { 4476 try 4477 { 4478 returnFunc(data); 4479 } 4480 finally 4481 { 4482 ioCartLoaderDecrement(); 4483 } 4484 }); 4485 } 4486 } 4487 4488 function getUpsellsCall(start_date,start_time,time_duration,rental_ids,returnFunc) { 4489 if(rental_ids.replace(/[|]/g,"").length==0){return;} 4490 url = "https://rental.software/quotes/in_cart_upsell.php?callback=?"; 4491 if(window.location.href.indexOf("localhost") > -1){ 4492 //url = "http://localhost/bugs/quotes/in_cart_upsell.php?callback=?" 4493 url = "http://localhost/io/bugs/quotes/in_cart_upsell.php?callback=?" 4494 } 4495 url += 4496 "&name=" + encodeURIComponent("Mountain Bouncers LLC") + 4497 "&startdate=" + start_date + 4498 "&starttime=" + start_time + 4499 "&duration=" + time_duration + 4500 "&usecushion=1" + 4501 "&include_price=1" + 4502 "&showlocations=0" + 4503 "&rental_ids=" + rental_ids; 4504 //IO-25557 4505 if(window.location.href.indexOf("dev.rental.software") > -1)//if it is a dev site, we need to send 4506 { 4507 let pattern = /(https:\/\/dev\.rental\.software\/[^\/]+\/)/; 4508 let matches = window.location.href.match(pattern); 4509 matches && matches.length > 0 ? url += "&site=" + matches[0]:0; 4510 } 4511 else 4512 { 4513 url += "&site=" + window.location.host; 4514 } 4515 jQuery.getJSON(url, returnFunc); 4516 } 4517 /*</editor-fold>*/ 4518 4519 /*<editor-fold defaultstate="collapsed" desc="Customer Geolocation Functions">*/ 4520 function setLocationInLocalStorage(city) 4521 {
4522 try 4523 { 4524 const location_data = 4525 { 4526 city: city, 4527 timestamp: Date.now() 4528 }; 4529 localStorage.setItem(storage_key, JSON.stringify(location_data)); 4530 return true; 4531 } 4532 catch (e) 4533 { 4534 console.warn('Failed to save location to localStorage:', e); 4535 return false; 4536 } 4537 } 4538 4539 function getLocationFromLocalStorage() 4540 { 4541 try 4542 { 4543 const location_data = localStorage.getItem(storage_key); 4544 if (location_data) 4545 { 4546 return JSON.parse(location_data); 4547 } 4548 4549 } 4550 catch (e) 4551 { 4552 console.warn('Failed to retrieve location from localStorage:', e); 4553 } 4554 return null; 4555 } 4556 4557 function displayLocation(city) 4558 { 4559 const location_element = jQuery('.io_geo_city'); 4560 const container_element = jQuery('#io_customer_geolocation'); 4561 4562 if (location_element.length && container_element.length) 4563 { 4564 location_element.text(`${city}`); 4565 container_element.show(); 4566 return true; 4567 } 4568 return false; 4569 } 4570 4571 function getCityFromIO(returnFunc) 4572 { 4573 var url = "https://rental.software/include/geolocation_handler.php?callback=?"; 4574 if(window.location.href.indexOf("localhost") > -1) 4575 { 4576 url = "http://localhost//features//include/geolocation_handler.php?callback=?"; 4577 } 4578 url += 4579 "&name=" + encodeURIComponent("Mountain Bouncers LLC") + 4580 "&ip=" + encodeURIComponent(io_customer_ip); 4581 4582 jQuery.getJSON(url, returnFunc); 4583 } 4584 4585 function initializeGeolocation() 4586 { 4587 try 4588 { 4589 // Check local storage first 4590 const cached_location = getLocationFromLocalStorage(); 4591 if (cached_location && cached_location.city) 4592 { 4593 if (displayLocation(cached_location.city)) 4594 { 4595 return; 4596 } 4597 } 4598 4599 // If no cached location, call the handler to get location 4600 getCityFromIO(function(location_data) 4601 { 4602 if (location_data && location_data.city && !location_data.error) 4603 { 4604 // Display and store the location 4605 if (displayLocation(location_data.city)) 4606 { 4607 setLocationInLocalStorage(location_data.city); 4608 } 4609 } 4610 else 4611 { 4612 console.warn('Failed to get location:', location_data ? location_data.error : 'Unknown error'); 4613 } 4614 }); 4615 } 4616 catch (error) 4617 { 4618 console.error('Geolocation initialization failed:', error); 4619 } 4620 } 4621 /*</editor-fold>*/ 4622 4623 /*<editor-fold defaultstate="collapsed" desc="Loading Animation Helpers">*/ 4624 4625 /** 4626 * Toggles the visibility of the cart loading overlay. 4627 * 4628 * @param {boolean} show - A boolean value to determine whether to show or hide the overlay. 4629 * If true, the overlay becomes visible; if false, it is hidden. 4630 * @return {void} This function does not return a value. 4631 */ 4632 function ioCartShowOverlay(show) 4633 { 4634 try 4635 { 4636 var overlay = document.getElementById('ioCartLoadingOverlay'); 4637 if (!overlay) return; 4638 if (show) 4639 { 4640 overlay.style.display = 'flex'; 4641 overlay.setAttribute('aria-hidden', 'false'); 4642 } 4643 else 4644 { 4645 overlay.style.display = 'none'; 4646 overlay.setAttribute('aria-hidden', 'true'); 4647 } 4648 } 4649 catch (e) 4650 {} 4651 } 4652 4653 /** 4654 * Activates the cart loader by setting the loading state to active, initializing the loading count, 4655 * and displaying the overlay. Includes a fallback to deactivate the loader if no response is received 4656 * within a specified timeout period. 4657 * 4658 * @return {void} This method does not return a value. 4659 */ 4660 function ioCartLoaderActivate() 4661 { 4662 io_cart_loading_active = true; 4663 io_cart_loading_count = 0; 4664 ioCartShowOverlay(true); 4665 4666 //fallback in case the availability call doesn't come back 4667 if (io_cart_loading_fallback_timer) clearTimeout(io_cart_loading_fallback_timer); 4668 io_cart_loading_fallback_timer = setTimeout(function () { 4669 if (io_cart_loading_active) { 4670 io_cart_loading_active = false;
4671 io_cart_loading_count = 0; 4672 ioCartShowOverlay(false); 4673 } 4674 }, 15000); 4675 } 4676 4677 /** 4678 * Increments the count of active cart loading operations and ensures the cart overlay is displayed. 4679 * 4680 * This method increases the `io_cart_loading_count` if the `io_cart_loading_active` flag is set to true. 4681 * It also calls the `ioCartShowOverlay` function with a true value to show the overlay. 4682 * 4683 * @return {void} This function does not return any value. 4684 */ 4685 function ioCartLoaderIncrement() 4686 { 4687 if (io_cart_loading_active) 4688 { 4689 io_cart_loading_count++; 4690 ioCartShowOverlay(true); 4691 } 4692 } 4693 4694 /** 4695 * Decrements the `io_cart_loading_count` if `io_cart_loading_active` is true. 4696 * If the count reaches zero, it deactivates the loader, removes the overlay, 4697 * and clears the fallback timer 4698 */ 4699 function ioCartLoaderDecrement() 4700 { 4701 if (io_cart_loading_active) 4702 { 4703 io_cart_loading_count = Math.max(0, io_cart_loading_count - 1); 4704 4705 if (io_cart_loading_count === 0) 4706 { 4707 io_cart_loading_active = false; 4708 ioCartShowOverlay(false); 4709 4710 if (io_cart_loading_fallback_timer) 4711 { 4712 clearTimeout(io_cart_loading_fallback_timer); 4713 io_cart_loading_fallback_timer = null; 4714 } 4715 } 4716 } 4717 } 4718 4719 /*</editor-fold>*/</script>
4719 <div class="address_entry elementor-widget-text-editor"><table><tr><td> <label for="address" id="io_cdl_address_label" style="display: table-cell"> Street Address </label></td><td> <input id="io_cd_address" style="display: table-cell" name="address" type="text"></input></td></tr><tr><td> <label for="city" id="io_cdl_city_label" style="display: table-cell"> City </label></td><td> <input id="io_cd_city" style="display: table-cell" name="city" type="text"></input></td></tr><tr id="us-state-select"><td> <label for="state" id="io_cdl_state_label" style="display: table-cell"> State </label></td><td> <select name="state" id="io_cd_state" style="display: table-cell" class="input-mini"><option value=""></option><option value="AK">AK</option><option value="AL">AL</option><option value="AR">AR</option><option value="AZ">AZ</option><option value="CA">CA</option><option value="CO">CO</option><option value="CT">CT</option><option value="DC">DC</option><option value="DE">DE</option><option value="FL">FL</option><option value="GA">GA</option><option value="HI">HI</option><option value="IA">IA</option><option value="ID">ID</option><option value="IL">IL</option><option value="IN">IN</option><option value="KS">KS</option><option value="KY">KY</option><option value="LA">LA</option><option value="MA">MA</option><option value="MD">MD</option><option value="ME">ME</option><option value="MI">MI</option><option value="MN">MN</option><option value="MO">MO</option><option value="MS">MS</option><option value="MT">MT</option><option value="NC">NC</option><option value="ND">ND</option><option value="NE">NE</option><option value="NH">NH</option><option value="NJ">NJ</option><option value="NM">NM</option><option value="NV">NV</option><option value="NY">NY</option><option value="OH">OH</option><option value="OK">OK</option><option value="OR">OR</option><option value="PA">PA</option><option value="RI">RI</option><option value="SC">SC</option><option value="SD">SD</option><option value="TN">TN</option><option value="TX">TX</option><option value="UT">UT</option><option value="VA">VA</option><option value="VT">VT</option><option value="WA">WA</option><option value="WI">WI</option><option value="WV">WV</option><option value="WY">WY</option> </select></td></tr><tr><td> <label for="zip" id="io_cdl_zip_label" style="display: table-cell"> Zip Code </label></td><td> <input id="io_cd_zip" style="display: table-cell" name="zip" type="text"></input></td></tr></table> <a class="elementor-button elementor-size-sm io_button" 4720 id="address_entry_submit" 4721 href="javascript:;"> Save Address </a><div id="delivery_charge_info_box"><hr><h3 id="info_box_header"></h3><p id="info_box_information"></p> <a href="javascript:;" onClick="closeAddressEntry()" class="delivery_info_continue elementor-button elementor-size-sm io_button">Continue Shopping</a></div></div>
4721<script>/* for checking delivery */ 4722 function runDeliveryCall(cart_only = false){ 4723 let address_fields = jQuery("[id^='io_cd_']"); 4724 let address_data = { 4725 "address": getCookie("io_address"), 4726 "state": getCookie("io_state"), 4727 "city": getCookie("io_city"), 4728 "zip": getCookie("io_zip") 4729 }; 4730 4731 let times = getAvailTimes(); 4732 4733 let start_date = times[0]; 4734 let end_date = start_date; 4735 let start_time = times[1]; 4736 let duration = times[2]; 4737 4738 let rental_ids = ""; 4739 simpleCart.each(function (item, x) { 4740 if(typeof item.get('timeslots') != "undefined"){ 4741 if(item.get('timeslots').length > 0){ 4742 var timeslots_html = item.get('timeslots'); 4743 var rental_id = item.get('rentalid'); 4744 if(typeof timeslots_html == "undefined") return; 4745 if(timeslots_html.length == 0) return; 4746 4747 var timeslot_name = getTimeslotName(timeslots_html); 4748 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 4749 if(typeof timeslot_sel_range != "undefined"){ 4750 /* timeslots */ 4751 setTimeslotSelected(item, timeslot_name); 4752 }else{ 4753 /* timepickers */ 4754 setTimePicker(item, timeslot_name);//todo? 4755 let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_")); 4756 let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_")); 4757 timeslot_sel_range = start_timepicker[start_timepicker.length-1].value; 4758 timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value; 4759 } 4760 4761 var timeslot_sel_arr = ""; 4762 if(typeof timeslot_sel_range != "undefined"){ 4763 timeslot_sel_arr = timeslot_sel_range.split(" - "); 4764 var timeslot_start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace(" "," "); 4765 var timeslot_end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace(" "," "); 4766 if(timeslot_start_time && timeslot_end_time){ 4767 let newDate1 = convertDateStringtoDateObject(start_date, timeslot_start_time); 4768 let newDate2 = convertDateStringtoDateObject(end_date, timeslot_end_time); 4769 let timeslot_duration = ((newDate2 - newDate1) / 3600) / 1000; 4770 rental_ids += rental_id+"-"+item.get("quantity")+"-"+timeslot_start_time+"-"+timeslot_duration+"|"; 4771 } 4772 } 4773 } 4774 } 4775 else{ 4776 var cart_id = item.get("rentalid"); 4777 rental_ids += cart_id + "-" + item.get("quantity") + "|"; 4778 } 4779 }); 4780 4781 address_fields.each(function() { 4782 let field = this.id.split("_")[2]; 4783 value = this.value; 4784 if(!value && !address_data[field]){ 4785 jQuery(this).addClass("invalid_address_field") 4786 } 4787 else if(value){ 4788 jQuery(this).removeClass("invalid_address_field") 4789 address_data[field] = this.value; 4790 } 4791 }); 4792 if(jQuery(".invalid_address_field").length > 0){ 4793 return; 4794 } 4795 let delivery_method = "" 4796 if(io_default_delivery_method) 4797 { 4798 delivery_method = io_default_delivery_method; 4799 } 4800 else if(getCookie("io_delivery_method")) 4801 { 4802 delivery_method = getCookie("io_delivery_method"); 4803 } 4804 4805 4806 setCookie("io_address", address_data["address"], 14); 4807 setCookie("io_city", address_data["city"], 14); 4808 setCookie("io_state", address_data["state"], 14); 4809 setCookie("io_zip", address_data["zip"], 14); 4810 4811 cart_total = simpleCart.total(); 4812 if(cart_total === "TBD") cart_total = 0; 4813 url = "https://rental.software/quotes/get_delivery_info.php?callback=?"; 4814 if(window.location.href.indexOf("localhost") > -1){ 4815 //url = "http://localhost/bugs/quotes/get_delivery_info.php?callback=?"; 4816 url = "http://localhost/io/bugs/quotes/get_delivery_info.php?callback=?"; 4817 } 4818 url += 4819 "&name=" + encodeURIComponent("Mountain Bouncers LLC") + 4820 "&rental_ids=" + rental_ids + 4821 "&street=" + encodeURIComponent(address_data["address"]) + 4822 "&city=" + encodeURIComponent(address_data["city"]) + 4823 "&state=" + encodeURIComponent(address_data["state"]) + 4824 "&zip=" + encodeURIComponent(address_data["zip"]) + 4825 "&startdate=" + start_date + 4826 "&starttime=" + start_time + 4827 "&duration=" + duration + 4828 "&delivery_method=" + encodeURIComponent(delivery_method) + 4829 "&total=" + cart_total + 4830 "&cart_only=" + cart_only; 4831 jQuery.getJSON(url, function(data){ 4832 if(data["delivery_restrict"] === 1){ 4833 data["charge"] = 0; 4834 }
4835 handleDeliveryInfo(data, cart_only); 4836 }); 4837 } 4838 4839 function handleDeliveryInfo(data, cart_only = false){ 4840 jQuery("#deliverSubtotalContainer").show(); 4841 jQuery("#checkDeliveryMessage").hide(); 4842 let info_box = jQuery("#delivery_charge_info_box"); 4843 if(data["delivery_restrict"] == 1){ 4844 jQuery("#info_box_header").text("Sorry..."); 4845 jQuery("#info_box_information").text(data["error"]) 4846 setDeliverySubtotal(data["charge"], true) 4847 } 4848 else{ 4849 setDeliverySubtotal(data["charge"]) 4850 jQuery("#info_box_header").text("Success!"); 4851 if(data["charge"] > 0){ 4852 jQuery("#info_box_information").html("We are able to deliver to your location with a " + simpleCart.toCurrency(data["charge"]) +" fee!"); 4853 } 4854 else{ 4855 jQuery("#info_box_information").html("We are able to deliver to your location with no charge!"); 4856 } 4857 } 4858 if(simpleCart.items().length == 0 && cart_only){ 4859 jQuery("#info_box_header").text("Items Required."); 4860 jQuery("#info_box_information").html("There needs to be items in your cart to check for delivery fees. But we will save the address information so you don't have to enter it again!") 4861 } 4862 info_box.show(); 4863 jQuery.fancybox.update(jQuery(".address_entry")); 4864 } 4865 function showAddressEntry(cart_only=false){ 4866 cartHide(); 4867 jQuery(".invalid_address_field").removeClass("invalid_address_field") 4868 jQuery("#delivery_charge_info_box").hide(); 4869 jQuery("#io_cd_address").val(getCookie("io_address")); 4870 jQuery("#io_cd_state").val(getCookie("io_state")); 4871 jQuery("#io_cd_city").val(getCookie("io_city")); 4872 jQuery("#io_cd_zip").val(getCookie("io_zip")); 4873 if(!cart_only){ 4874 jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(); }); 4875 } else{ 4876 jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(cart_only); }); 4877 } 4878 jQuery.fancybox.open(jQuery(".address_entry")); 4879 } 4880 4881 function closeAddressEntry(){ 4882 jQuery.fancybox.close(); 4883 } 4884 4885 function setDeliverySubtotal(amount, unavailable=false){ 4886 if(unavailable){ 4887 jQuery("#deliverySubtotal").html("Unavailable"); 4888 } else{ 4889 jQuery("#deliverySubtotal").html(simpleCart.toCurrency(amount)); 4890 } 4891 } 4892 4893 function addressCookiesSet(){ 4894 if(getCookie("address") && getCookie("state") && getCookie("city") && getCookie("zip")){ 4895 return true; 4896 } else{ 4897 return false 4898 } 4899 }</script>
vendor: 1 bytes, line 4899
4899
4900<script>let map; 4901 let geocoder; 4902 let item_id_map; 4903 let drawingManager; 4904 let drawingListener; 4905 4906 let polygons = new Array(); 4907 4908 let polyline_markers = new Array(); 4909 let polylines = new Array(); 4910 let previous_marker; 4911 current_polyline = undefined; 4912 let previous_map_height = ""; 4913 4914 function initMap() { 4915 map = new google.maps.Map(document.getElementById("map_container"), { 4916 center: { lat: -34.397, lng: 150.644 }, 4917 zoom: 8, 4918 mapTypeId: "hybrid", 4919 disableDefaultUI: true, 4920 tilt: 0 4921 }); 4922 drawingManager = new google.maps.drawing.DrawingManager({ 4923 drawingControl: true, 4924 drawingControlOptions: { 4925 position: google.maps.ControlPosition.TOP_CENTER, 4926 drawingModes: [ 4927 google.maps.drawing.OverlayType.POLYGON, 4928 ], 4929 } 4930 }); 4931 4932 geocoder = new google.maps.Geocoder(); 4933 } 4934 4935 function io_geocode(){ 4936 let prefix = "#io_mc_" 4937 let request = "" 4938 let address_value = ""; 4939 if(jQuery(prefix+"address").length) { 4940 address_value = jQuery(prefix+"address").val(); 4941 if(address_value) setCookie("address", jQuery("#io_mc_address").val(), 14); 4942 } 4943 let city_value = ""; 4944 if(jQuery(prefix+"city").length){ 4945 city_value = jQuery(prefix+"city").val(); 4946 if(city_value) setCookie("city", jQuery("#io_mc_city").val(), 14); 4947 } 4948 let state_value = ""; 4949 if(jQuery(prefix+"state").length){ 4950 state_value = jQuery(prefix+"state").val(); 4951 if(state_value) setCookie("state", jQuery("#io_mc_state").val(), 14); 4952 } 4953 let zip_value = ""; 4954 if(jQuery(prefix+"zip").length){ 4955 zip_value = jQuery(prefix+"zip").val(); 4956 if(zip_value) setCookie("zip", jQuery("#io_mc_zip").val(), 14); 4957 } 4958 4959 request = address_value + " " + city_value + " " + state_value + " " + zip_value; 4960 if(request){ 4961 geocoder.geocode({address:request}).then((result) => { 4962 const { results } = result; 4963 map.setCenter(results[0].geometry.location); 4964 map.setZoom(24); 4965 return results; 4966 }); 4967 4968 } 4969 4970 if(!addressProvided()) { 4971 jQuery("#io_map_address_entry").attr("open", "open"); 4972 }else{ 4973 jQuery("#io_map_address_entry").removeAttr("open"); 4974 } 4975 } 4976 4977 function openMap(element){ 4978 cartHide() 4979 io_map_clear() 4980 let unit = "meters" 4981 if(country === "US") unit = "feet" 4982 polygons = new Array(); 4983 polyline_marker_sets = new Array(); 4984 polylines = new Array(); 4985 previous_marker = undefined; 4986 current_polyline = undefined; 4987 4988 jQuery("#io_mc_address").val(getCookie("address")); 4989 jQuery("#io_mc_state").val(getCookie("state")); 4990 jQuery("#io_mc_city").val(getCookie("city")); 4991 jQuery("#io_mc_zip").val(getCookie("zip")); 4992 io_geocode(); 4993 4994 google.maps.event.removeListener(drawingListener); 4995 4996 if(element.id == "calcPriceOpenMap"){ 4997 item_id_map = jQuery(".io_product_infobox .item_rentalid").text(); 4998 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 4999 setMapTools_Area(unit, true) 5000 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 5001 setMapTools_Perimeter(unit, true) 5002 } 5003 } 5004 else{ 5005 item_id_map = jQuery(element).parent().parent().find(".item-rentalid").text(); 5006 if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Area"){ 5007 setMapTools_Area(unit) 5008 }else if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Perimeter"){ 5009 setMapTools_Perimeter(unit) 5010 } 5011 } 5012 } 5013 5014 function addressProvided(){ 5015 if(jQuery("#io_mc_address").val() && jQuery("#io_mc_state").val() && 5016 jQuery("#io_mc_city").val() && jQuery("#io_mc_zip").val() ){ 5017 return true; 5018 } 5019 return false; 5020 } 5021 5022 function setMapTools_Area(unit, item_page=false){ 5023 jQuery.fancybox.open(jQuery(".map_fancybox")); 5024 drawingManager.setOptions({ 5025 drawingControlOptions: { 5026 drawingModes: [google.maps.drawing.OverlayType.POLYGON] 5027 }, 5028 drawingMode: google.maps.drawing.OverlayType.POLYGON, 5029 polygonOptions: { 5030 fillColor: "#0191fc", 5031 strokeColor: "#0113fc" 5032 }, 5033 }); 5034 let units = "meters" 5035 if(country === "US") units = "feet" 5036 5037 jQuery("#io_measurement_input_label").text("Approximate area in "+units+": "); 5038 jQuery("#io_map_manual_input").off("click"); 5039 jQuery("#io_map_manual_input").on("click", function(){manual_calc_price("Area", item_page)}); 5040 jQuery("#io_perimeter_options_container").hide(); 5041 jQuery("#io_map_new_line_container").hide(); 5042 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area y
5042ou want to measure. <span id=\"io_map_additional_instructions\">You can draw multiple polygons to include multiple separate surfaces in the total area. Press Clear to remove all polygons and start again. Alternatively if you know the approximate area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5043 5044 drawingListener = google.maps.event.addListener(drawingManager, "polygoncomplete", function(polygon) { 5045 polygons.push(polygon); 5046 let convert_feet = 1; 5047 if(country === "US") convert_feet = 10.764; 5048 let approx_area = 0; 5049 polygons.forEach(function(polygon) { 5050 approx_area += google.maps.geometry.spherical.computeArea(polygon.getPath()) * convert_feet; 5051 }); 5052 calcprice_approx_area(Math.round(approx_area)); 5053 }); 5054 drawingManager.setMap(map); 5055 } 5056 5057 function setMapTools_Perimeter(unit, item_page=false){ 5058 jQuery.fancybox.open(jQuery(".map_fancybox")); 5059 drawingManager.setOptions({ 5060 drawingControlOptions: { 5061 drawingModes: [google.maps.drawing.OverlayType.MARKER] 5062 }, 5063 drawingMode: google.maps.drawing.OverlayType.MARKER 5064 }); 5065 let height = jQuery("#perimeter_height").val(); 5066 let units = ""; 5067 if(height){ 5068 units = "sq meters" 5069 if(country === "US") units = "sq feet" 5070 jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": "); 5071 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate surface area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5072 5073 }else{ 5074 units = "meters" 5075 if(country === "US") units = "feet" 5076 jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": "); 5077 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate perimeter in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5078 5079 } 5080 5081 jQuery("#io_map_manual_input").off("click"); 5082 jQuery("#io_map_manual_input").bind("click", function(){manual_calc_price("Perimeter", item_page)}); 5083 jQuery("#perimeter_height").bind("change", function(){change_perimeter_instructions()}); 5084 jQuery("#io_perimeter_options_container").show(); 5085 jQuery("#io_map_clear_container").show(); 5086 jQuery("#io_map_new_line_container").show(); 5087 5088 current_polyline = new google.maps.Polyline({ 5089 map: map, 5090 path: [], 5091 strokeColor: "#0113fc", 5092 strokeOpacity: 1.0, 5093 strokeWeight: 2 5094 }) 5095 drawingListener = google.maps.event.addListener(drawingManager, "markercomplete", function(marker) { 5096 polyline_markers.push(marker) 5097 marker.setVisible(false); 5098 current_polyline.getPath().push(marker.getPosition()) 5099 if(previous_marker){ 5100 let convert_feet = 1; 5101 if(country === "US") convert_feet = 3.281; 5102 let approx_perimeter = 0; 5103 polylines.forEach(function(polyline) { 5104 if(convert_feet > 1) convert_feet = 10.764 5105 approx_perimeter += google.maps.geometry.spherical.computeArea(polyline.getPath()) * convert_feet; 5106 }); 5107 approx_perimeter += google.maps.geometry.spherical.computeLength(current_polyline.getPath()) * convert_feet; 5108 calcprice_approx_perimeter(Math.round(approx_perimeter)); 5109 } 5110 previous_marker = marker; 5111 }); 5112 5113 jQuery("#perimeter_height_contianer").show(); 5114
5115 drawingManager.setMap(map); 5116 } 5117 5118 function change_perimeter_instructions(){ 5119 let height = jQuery("#perimeter_height").val(); 5120 if(height){ 5121 units = "sq meters" 5122 if(country === "US") units = "sq feet" 5123 jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": "); 5124 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate surface area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5125 }else { 5126 units = "meters" 5127 if(country === "US") units = "feet" 5128 jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": "); 5129 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate perimeter in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5130 } 5131 } 5132 5133 function manual_calc_price(method, item_page){ 5134 let approx_measurement = parseInt(jQuery("#io_measurement_input").val()); 5135 let units = ""; 5136 if(approx_measurement){ 5137 if(method == "Area"){ 5138 units = "sq meters" 5139 if(country === "US") units = "sq feet" 5140 }else if(method == "Perimeter"){ 5141 let height = jQuery("#perimeter_height").val(); 5142 if(height){ 5143 units = "sq meters" 5144 if(country === "US") units = "sq feet" 5145 }else{ 5146 units = "meters" 5147 if(country === "US") units = "feet" 5148 } 5149 }
5150 simpleCart.items().forEach(function (item, index){ 5151 if(item.get("rentalid") === item_id_map){ 5152 item.set("units", units); 5153 item.set("quantity", approx_measurement); 5154 } 5155 }); 5156 5157 simpleCart.update(); 5158 5159 if(item_page || jQuery(".io_product_infobox .item_rentalid").text() == item_id_map) set_price_on_item_page(units, approx_measurement); 5160 if(!item_page) cartShow(); 5161 } 5162 jQuery.fancybox.close(); 5163 } 5164 5165 function calcprice_approx_area(approx_area){ 5166 jQuery("#io_measurement_input").val(approx_area); 5167 } 5168 5169 function calcprice_approx_perimeter(approx_perimeter){ 5170 let height = jQuery("#perimeter_height").val(); 5171 if(height && height > 0) approx_perimeter *= parseInt(height); 5172 5173 jQuery("#io_measurement_input").val(approx_perimeter); 5174 } 5175 5176 function set_price_on_item_page(units, measurement){ 5177 let measurement_price = document.querySelector(".io_product_measurement_price"); 5178 if(measurement_price==undefined){ 5179 var first_price = document.querySelector(".io_product_price_box"); 5180 if(first_price != null){ 5181 measurement_price = first_price.cloneNode(true); 5182 /* clear all classes */ 5183 measurement_price.className = ""; 5184 measurement_price.classList.add("io_product_price_box"); 5185 measurement_price.classList.add("io_product_measurement_price"); 5186 measurement_price.style.display = "grid"; 5187 /* Make a hidden data span for when adding to cart */ 5188 raw_measurement = document.createElement("span"); 5189 raw_measurement.classList.add("io_measure_price_raw_measurement"); 5190 raw_measurement.style.display = "none"; 5191 raw_measurement.textContent = measurement; 5192 measurement_price.appendChild(raw_measurement); 5193 first_price.before(measurement_price); 5194 } 5195 } 5196 var price_1h = Number(jQuery(".io_product_price_1h_"+jQuery(".io_product_infobox .item_rentalid").text()).text().replace(/[^0-9.-]+/g,"")); 5197 measurement_price.querySelector("p:nth-child(1)").innerHTML = simpleCart.toCurrency(price_1h*measurement); 5198 measurement_price.querySelector("p:nth-child(2)").innerHTML = "For approximately "+measurement+" "+units; 5199 } 5200 5201 function io_map_clear() { 5202 if(drawingManager.getDrawingMode() == "polygon"){ 5203 drawingManager.setDrawingMode("polygon"); 5204 } 5205 5206 if(polygons) polygons.forEach(function(polygon) { 5207 polygon.setMap(null); 5208 }); 5209 if(current_polyline) current_polyline.setMap(null); 5210 if(polylines) polylines.forEach(function(polyline) { 5211 polyline.setMap(null); 5212 }); 5213 if(polyline_markers) polyline_markers.forEach(function(marker) { 5214 marker.setMap(null); 5215 }); 5216 5217 current_polyline = new google.maps.Polyline({ 5218 map: map, 5219 path: [], 5220 strokeColor: "#0113fc", 5221 strokeOpacity: 1.0, 5222 strokeWeight: 2 5223 }); 5224 polygons = new Array(); 5225 polylines = new Array(); 5226 polyline_markers = new Array(); 5227 previous_marker = undefined; 5228 } 5229 5230 function io_map_new_line() { 5231 polylines.push(new google.maps.Polyline({ 5232 map: map, 5233 path: current_polyline.getPath(), 5234 strokeColor: "#0113fc", 5235 strokeOpacity: 1.0, 5236 strokeWeight: 2 5237 }) 5238 ); 5239 previous_marker = undefined; 5240 current_polyline.setMap(null); 5241 current_polyline = new google.maps.Polyline({ 5242 map: map, 5243 path: [], 5244 strokeColor: "#0113fc", 5245 strokeOpacity: 1.0, 5246 strokeWeight: 2 5247 }); 5248 } 5249 5250 function show_more_instruct_click(show_more_button) { 5251 if(show_more_button.textContent == "(more)") { 5252 show_more_button.textContent = "(hide)"; 5253 jQuery("#io_map_additional_instructions").show(); 5254 }else if(show_more_button.textContent == "(hide)") { 5255 show_more_button.textContent = "(more)"; 5256 jQuery("#io_map_additional_instructions").hide(); 5257 } 5258 } 5259 5260 function perimeter_height_changed(){ 5261 let current_map_height = jQuery("#perimeter_height").val(); 5262 if(current_map_height && current_map_height > 0){ 5263 if(jQuery("#io_measurement_input").val() && !previous_map_height){ 5264 let measurement = jQuery("#io_measurement_input").val(); 5265 jQuery("#io_measurement_input").val(measurement * current_map_height); 5266 }else if(jQuery("#io_measurement_input").val() && previous_map_height){ 5267 let measurement = jQuery("#io_measurement_input").val(); 5268 if(previous_map_height > 0){ 5269 measurement = measurement / previous_map_height; 5270 } 5271 jQuery("#io_measurement_input").val(measurement * current_map_height); 5272 } 5273 }else if (!current_map_height || current_map_height == 0){ 5274 if(jQuery("#io_measurement_input").val() && previous_map_height){ 5275 let measurement = jQuery("#io_measurement_input").val(); 5276 if(previous_map_height > 0){ 5277 measurement = measurement / previous_map_height; 5278 } 5279 jQuery("#io_measurement_input").val(measurement); 5280 } 5281 } 5282 previous_map_height = current_map_height; 5283 } 5284 5285 window.initMap = initMap;</script>
5285 <div class="map_fancybox"><div class="elementor-widget-text-editor"><div> <details id="io_map_address_entry"> <summary style = "cursor:pointer">Enter Address Information (edit)</summary><table style="margin-left: 10px"><tr><td> <label for="address" id="io_mcl_address_label" style="display: table-cell"> Street Address </label></td><td> <input id="io_mc_address" style="display: table-cell" name="address" type="text"></input></td></tr><tr><td> <label for="city" id="io_mcl_city_label" style="display: table-cell"> City </label></td><td> <input id="io_mc_city" style="display: table-cell" name="city" type="text"></input></td></tr><tr id="io_mc_us-state-select"><td> <label for="state" id="io_mcl_state_label" style="display: table-cell"> State </label></td><td> <select name="state" id="io_mc_state" style="display: table-cell" class="input-mini"><option value=""></option><option value="AK">AK</option><option value="AL">AL</option><option value="AR">AR</option><option value="AZ">AZ</option><option value="CA">CA</option><option value="CO">CO</option><option value="CT">CT</option><option value="DC">DC</option><option value="DE">DE</option><option value="FL">FL</option><option value="GA">GA</option><option value="HI">HI</option><option value="IA">IA</option><option value="ID">ID</option><option value="IL">IL</option><option value="IN">IN</option><option value="KS">KS</option><option value="KY">KY</option><option value="LA">LA</option><option value="MA">MA</option><option value="MD">MD</option><option value="ME">ME</option><option value="MI">MI</option><option value="MN">MN</option><option value="MO">MO</option><option value="MS">MS</option><option value="MT">MT</option><option value="NC">NC</option><option value="ND">ND</option><option value="NE">NE</option><option value="NH">NH</option><option value="NJ">NJ</option><option value="NM">NM</option><option value="NV">NV</option><option value="NY">NY</option><option value="OH">OH</option><option value="OK">OK</option><option value="OR">OR</option><option value="PA">PA</option><option value="RI">RI</option><option value="SC">SC</option><option value="SD">SD</option><option value="TN">TN</option><option value="TX">TX</option><option value="UT">UT</option><option value="VA">VA</option><option value="VT">VT</option><option value="WA">WA</option><option value="WI">WI</option><option value="WV">WV</option><option value="WY">WY</option> </select></td></tr><tr><td> <label for="zip" id="io_mcl_zip_label" style="display: table-cell"> Zip Code </label></td><td> <input id="io_mc_zip" style="display: table-cell" name="zip" type="text"></input></td></tr></table> <a class="elementor-button elementor-size-sm io_button" 5286 id="map_geocode_submit" 5287 onClick="io_geocode()" 5288 href="javascript:;"> Locate </a> </details><div id="perimeter_height_contianer"><p>If you are taking measurements for a structure such as a building or fence, please provide the height of the structure here. If height does not apply to the wash, for instance for a gutter wash, leave this field empty. <strong> Please note if you enter a value here after taking measurements, you will need to take measurements again. </strong></p> <label> Height of structure: </label> <input type="number" id="perimeter_height" onChange="perimeter_height_changed()"/></div><div><p id="io_map_instructions"></p></div><div id="io_measurement_input_container"> <label id="io_measurement_input_label"> </label> <input type="number" id="io_measurement_input"/> <a class="elementor-button elementor-size-sm io_button" 5289 id="io_map_manual_input" 5290 href="javascript:;"> Done </a></div><div style="display: inline-flex"><div id="io_map_clear_container"> <a class="elementor-button elementor-size-sm io_button" 5291 id="io_map_clear_btn" 5292 onClick="io_map_clear()" 5293 href="javascript:;"> Clear </a></div><div id="io_map_new_line_container" style="margin-left:5px"> <a class="elementor-button elementor-size-sm io_button" 5294 id="io_map_new_line_btn" 5295 onClick="io_map_new_line()" 5296 href="javascript:;"> Add New Line </a></div></div></div></div> <br><div id="map_container">
5296<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEuvvqefKaUABPvydm00SV8Fr8tQeGVcw&libraries=drawing&callback=initMap" defer></script>
5296 </div></div>
5296<script>jQuery(".io_testimonials, #io_testimonials").each(function(){ 5297 io_get_reviews(this); 5298 }) 5299 setTimeout(function(){ 5300 jQuery(".io_testimonials .w3-ul li p").each(function(){ 5301 const container = jQuery(this).parent() 5302 const element = jQuery(this); 5303 5304 if (element[0].scrollHeight > container[0].clientHeight) { 5305 5306 jQuery(this).parent().parent().append(create_read_more()); 5307 } 5308 }); 5309 }, 500); 5310 5311 function create_read_more(){ 5312 let html = "<p class=\"io_review_readmore\" onClick=\"review_readmore_clicked(this)\">read more</p>" 5313 return html; 5314 } 5315 5316 function review_readmore_clicked(element){ 5317 let review_li = jQuery(element).parent().find("li:eq(3)"); 5318 new_height = jQuery(review_li).find("p").height() + 16; 5319 jQuery(review_li).height(new_height); 5320 jQuery(element).hide(); 5321 } 5322 5323 function io_get_reviews(element){ 5324 let io_un = "Mountainbouncers"; 5325 let io_loc = "0"; 5326 let io_url1 = 'https://rental.software/testimonials_iframe.php?user='; 5327 if (location.hostname === "localhost"){ 5328 io_url1 = 'http://localhost/io/bugs/testimonials_iframe.php?user='; 5329 //io_url1 = 'http://localhost/jbug/trunk/testimonials_iframe.php?user='; 5330 } 5331 let io_url2 = '&location_id='; 5332 let io_url3 = '&width=100%&number_of_reviews=10&show_average_rating=1&show_stars=1&show_date=&show_reviewer_name=1&orderby=time&iframe=0'; 5333 let io_url_c = io_url1 + io_un + io_url2 + io_loc + io_url3; 5334 fetch(io_url_c, { 5335 method: 'get' 5336 }).then( 5337 function(response){ 5338 return response.json(); 5339 } 5340 ).then(function(data) { 5341 5342 5343 5344 //let element = document.getElementById("io_testimonials"); 5345 //DOM-built on purpose: literal markup in this inline script lands in the raw page 5346 //source and SEO crawlers read it as page content (IO-37932). 5347 element.textContent = ""; 5348 let review_cnt=0; 5349 let rating_sum = 0; 5350 data.forEach((user) => { 5351 const { name, review, rating, time } = user; 5352 rating_sum += Number(rating); 5353 review_cnt++; 5354 let review_div = document.createElement("div"); 5355 let review_list = document.createElement("ul"); 5356 review_list.className = "w3-ul"; 5357 let name_li = document.createElement("li"); 5358 name_li.textContent = name; 5359 let rating_li = document.createElement("li"); 5360 rating_li.textContent = rating + " "; 5361 let date_li = document.createElement("li"); 5362 date_li.textContent = time; 5363 let review_li = document.createElement("li"); 5364 let review_p = document.createElement("p"); 5365 review_p.textContent = review; 5366 review_li.appendChild(review_p); 5367 let img_star = Math.round(parseFloat(rating)); 5368 let star_img = document.createElement("img"); 5369 star_img.className = "review_img"; 5370 star_img.src = "https://rental.software/images/" + img_star + "star.png"; 5371 rating_li.appendChild(star_img); 5372 review_list.appendChild(name_li); 5373 review_list.appendChild(rating_li); 5374 review_list.appendChild(date_li); 5375 review_list.appendChild(review_li); 5376 review_div.appendChild(review_list); 5377 element.appendChild(review_div); 5378 }); 5379 let avg = (parseFloat(rating_sum)/parseFloat(review_cnt)).toFixed(1); 5380 let avg_img = Math.round(avg); 5381 let head = document.createElement("div"); 5382 let head_h2 = document.createElement("h2"); 5383 head_h2.textContent = "Avg Rating: " + avg; 5384 let head_img = document.createElement("img"); 5385 head_img.className = "review_avg_img"; 5386 head_img.src = "https://rental.software/images/" + avg_img + "star.png"; 5387 head.appendChild(head_h2); 5388 head.appendChild(head_img); 5389 element.prepend(head); 5390 }).catch(function(err) { 5391 console.log(err); 5392 }); 5393}</script>
5393 <style type="text/css">.searchio-live-search-results { 5394 opacity: 0; 5395 transition: opacity .25s ease-in-out; 5396 -moz-transition: opacity .25s ease-in-out; 5397 -webkit-transition: opacity .25s ease-in-out; 5398 height: 0; 5399 overflow: hidden; 5400 z-index: 9999995; /* Exceed searchIO Modal Search Form overlay. */ 5401 position: absolute; 5402 display: none; 5403 } 5404 5405 .searchio-live-search-results-showing { 5406 display: block; 5407 opacity: 1; 5408 height: auto; 5409 overflow: auto; 5410 } 5411 5412 .searchio-live-search-no-results { 5413 padding: 3em 2em 0; 5414 text-align: center; 5415 } 5416 5417 .searchio-live-search-no-min-chars:after { 5418 content: "Continue typing"; 5419 display: block; 5420 text-align: center; 5421 padding: 2em 2em 0; 5422 }</style>
5422<script>var _searchIO_LIVE_AJAX_SEARCH_BLOCKS = true; 5423 var _searchIO_LIVE_AJAX_SEARCH_ENGINE = 'default'; 5424 var _searchIO_LIVE_AJAX_SEARCH_CONFIG = 'default';</script>
5424
5424<script>( () => { 5425 const lazyloadRunObserver = () => { 5426 const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); 5427 const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { 5428 entries.forEach( ( entry ) => { 5429 if ( entry.isIntersecting ) { 5430 let lazyloadBackground = entry.target; 5431 if( lazyloadBackground ) { 5432 lazyloadBackground.classList.add( 'e-lazyloaded' ); 5433 } 5434 lazyloadBackgroundObserver.unobserve( entry.target ); 5435 } 5436 }); 5437 }, { rootMargin: '200px 0px 200px 0px' } ); 5438 lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { 5439 lazyloadBackgroundObserver.observe( lazyloadBackground ); 5440 } ); 5441 }; 5442 const events = [ 5443 'DOMContentLoaded', 5444 'elementor/lazyload/observe', 5445 ]; 5446 events.forEach( ( event ) => { 5447 document.addEventListener( event, lazyloadRunObserver ); 5448 } ); 5449 } )();</script>
5449 <link data-noptimize="1" data-no-optimize="1" data-no-minify="1" data-no-defer="1" rel='stylesheet' id='trustindex-widget-css-ccb54decacbadac9bd13e16ce74a20a5-css' href='https://mountainbouncers.com/wp-content/cache/autoptimize/css/autoptimize_single_869e167c0d240398162ceaa60fc74b32.css?1787140082' media='all' />
5449<script id="jquery-ui-core-js-before">jQuery.uiBackCompat = true; 5450//# sourceURL=jquery-ui-core-js-before</script>
5450
5450<script id="jquery-ui-datepicker-js-after">jQuery(function(jQuery){jQuery.datepicker.setDefaults({"closeText":"Close","currentText":"Today","monthNames":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthNamesShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"nextText":"Next","prevText":"Previous","dayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dayNamesShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dayNamesMin":["S","M","T","W","T","F","S"],"dateFormat":"MM d, yy","firstDay":1,"isRTL":false});}); 5451//# sourceURL=jquery-ui-datepicker-js-after</script>
5451
5451<script id="slick-carousel-js-js" src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js?ver=1.8.1"></script>
5451
5451<script id="elementor-frontend-js-before">var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnX":"Share on X","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":false},"version":"4.3.4","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"theme_builder_v2":true,"landing-pages":true,"import-export-customization":true,"e_pro_atomic_form":true,"e_pro_collection_loop":true,"e_pro_variables":true,"e_pro_interactions":true},"urls":{"assets":"https:\/\/mountainbouncers.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/mountainbouncers.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/mountainbouncers.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"8099b7aecc","atomicFormsSendForm":"6af07bac49"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"body_background_background":"classic","active_breakpoints":["viewport_mobile","viewport_tablet"],"lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":109,"title":"Mountain%20Bouncers%20LLC%20-%20Party%20Rental%20and%20Bounce%20House%20Rental","excerpt":"","featuredImage":false}}; 5452//# sourceURL=elementor-frontend-js-before</script>
5452
5452<script id="swp-live-search-client-js-extra">var searchio_live_search_params = []; 5453searchio_live_search_params = {"ajaxurl":"https:\/\/mountainbouncers.com\/wp-admin\/admin-ajax.php","origin_id":109,"config":{"default":{"engine":"default","input":{"delay":300,"min_chars":3},"results":{"position":"bottom","width":"auto","offset":{"x":0,"y":5}},"spinner":{"lines":12,"length":8,"width":3,"radius":8,"scale":1,"corners":1,"color":"#424242","fadeColor":"transparent","speed":1,"rotate":0,"animation":"searchio-spinner-line-fade-quick","direction":1,"zIndex":2000000000,"className":"spinner","top":"50%","left":"50%","shadow":"0 0 1px transparent","position":"absolute"}}},"msg_no_config_found":"No valid searchIO Live Search configuration found!","aria_instructions":"When autocomplete results are available use up and down arrows to review and enter to go to the desired page. Touch device users, explore by touch or with swipe gestures.","io_search_results_same_width":"1","io_search_results_width":"400","io_search_results_align":"right"};; 5454//# sourceURL=swp-live-search-client-js-extra</script>
5454
5454<script data-ccm-injected="1" async data-wp-strategy="async" id="trustindex-loader-js-js" src="https://cdn.trustindex.io/loader.js"></script>
vendor: 131 bytes, line 5454
5454 <script id="elementor-recaptcha_v3-api-js" src="https://www.google.com/recaptcha/api.js?render=explicit&ver=4.2.2"></script>
5454<script id="wp-hooks-js" src="https://mountainbouncers.com/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
5454
5454<script id="wp-i18n-js" src="https://mountainbouncers.com/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
5454
5454<script id="wp-i18n-js-after">wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 5455//# sourceURL=wp-i18n-js-after</script>
5455
5455<script id="elementor-pro-frontend-js-before">var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/mountainbouncers.com\/wp-admin\/admin-ajax.php","nonce":"31828b67b0","urls":{"assets":"https:\/\/mountainbouncers.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/mountainbouncers.com\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":true},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/mountainbouncers.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; 5456//# sourceURL=elementor-pro-frontend-js-before</script>
5456
5456<script defer src="https://mountainbouncers.com/wp-content/cache/autoptimize/js/autoptimize_0b55f68a0d56a6c72c7cde61ffd32f75.js"></script>
5456</body></html> 5457<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: October 6, 2026 1:09 pm (UTC:0) -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.