PageSourceSearch

https://mountainbouncers.com/

html mountainbouncers.com collected 2026-10-07 03:14:39 UTC 361,503 bytes, 5,457 lines download raw bytes

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 &raquo; Feed" href="https://mountainbouncers.com/feed/" /><link rel="alternate" type="application/rss+xml" title="Mountain Bouncers LLC &raquo; 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&#038;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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;,&quot;sticky&quot;:&quot;top&quot;,&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;],&quot;sticky_offset&quot;:0,&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;: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.&nbsp;</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.&nbsp;</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.&nbsp;</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.&nbsp;<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York.&nbsp;</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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;gradient&quot;}"><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="{&quot;_animation&quot;:&quot;bounceIn&quot;}" 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 &amp; 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="{&quot;rotating_text&quot;:&quot;bounce house\nFUN!&quot;,&quot;headline_style&quot;:&quot;rotate&quot;,&quot;animation_type&quot;:&quot;typing&quot;,&quot;loop&quot;:&quot;yes&quot;,&quot;rotate_iteration_delay&quot;: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&nbsp;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="{&quot;background_background&quot;:&quot;classic&quot;}"><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&apos;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 &amp; 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="{&quot;_animation&quot;:&quot;bounceIn&quot;}" 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&#8217;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.&nbsp;</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.&nbsp;</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.&nbsp;</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.&nbsp;<p>Mountain Bouncers is Insured for all small and large events. We Service Rutland County and All Surrounding Counties in Vermont and New York.&nbsp;</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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;}"><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="{&quot;background_background&quot;:&quot;classic&quot;}"><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, &amp; 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="{&quot;background_background&quot;:&quot;classic&quot;}"><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 &amp; 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="{&quot;background_background&quot;:&quot;classic&quot;}"><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 &amp;<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&#8217;re planning a birthday bash, a wedding reception, or a corporate event, we&#8217;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&#8217;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&#8217;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="{&quot;background_background&quot;:&quot;classic&quot;}"><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 &amp; 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 &amp; Surrounding Vermont Towns
67Obstacle Courses, Waterslides &amp; Toddler Inflatables for Every Event
68Tent, Table, Chair &amp; Linen Rentals for Weddings and Corporate Events
69Dunk Tanks, Inflatable Nightclubs &amp; Interactive Party Rentals
70Professional Lighting, Sound Systems &amp; Event Power Equipment
71Serving Dorset VT, Manchester VT, Woodstock VT, Middlebury VT, Brandon VT &amp; Pittsford VT
72Clean, Safe &amp; 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="{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;opacity-tilt&quot;}"><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&#8217;t find what you&#8217;re looking for or curious about one of our products? Don&#8217;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="{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}" 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()#&amp;+*-=.]+" 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="&quot;I need help from a human sales rep.&quot;"></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="{&quot;background_background&quot;:&quot;classic&quot;}"><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&#038;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.