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://brincabrincaselpariente.net/wp-content/cache/autoptimize/css/autoptimize_11688bc0eba48d3f81a1aaf890487af8.css" rel="stylesheet"><title>Brincabrincas El Pariente Phoenix AZ - Party Rental and Bounce House Rental</title><meta name="description" content="Party and Event rentals of the highest quality. We have a large selection of clean equipment."/><meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/><link rel="canonical" href="https://brincabrincaselpariente.net/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="website" /><meta property="og:title" content="Brincabrincas El Pariente Phoenix AZ - Party Rental and Bounce House Rental" /><meta property="og:description" content="Party and Event rentals of the highest quality. We have a large selection of clean equipment." /><meta property="og:url" content="https://brincabrincaselpariente.net/" /><meta property="og:site_name" content="Brincabrincas El Pariente Phoenix AZ" /><meta property="og:updated_time" content="2026-07-31T23:39:49+00:00" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Brincabrincas El Pariente Phoenix AZ - Party Rental and Bounce House Rental" /><meta name="twitter:description" content="Party and Event rentals of the highest quality. We have a large selection of clean equipment." /><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="2 minutes" />
1<script type="application/ld+json" class="rank-math-schema">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://brincabrincaselpariente.net/#organization","name":"Brincabrincas El Pariente Phoenix AZ","url":"https://brincabrincaselpariente.net","email":"[email protected]","logo":{"@type":"ImageObject","@id":"https://brincabrincaselpariente.net/#logo","url":"https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-150x150.png","contentUrl":"https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-150x150.png","caption":"Brincabrincas El Pariente Phoenix AZ","inLanguage":"en-US"}},{"@type":"WebSite","@id":"https://brincabrincaselpariente.net/#website","url":"https://brincabrincaselpariente.net","name":"Brincabrincas El Pariente Phoenix AZ","publisher":{"@id":"https://brincabrincaselpariente.net/#organization"},"inLanguage":"en-US","potentialAction":{"@type":"SearchAction","target":"https://brincabrincaselpariente.net/?s={search_term_string}","query-input":"required name=search_term_string"}},{"@type":"ImageObject","@id":"https://brincabrincaselpariente.net/wp-content/uploads/2020/01/clean-shield.png","url":"https://brincabrincaselpariente.net/wp-content/uploads/2020/01/clean-shield.png","width":"200","height":"200","inLanguage":"en-US"},{"@type":"WebPage","@id":"https://brincabrincaselpariente.net/#webpage","url":"https://brincabrincaselpariente.net/","name":"Brincabrincas El Pariente Phoenix AZ - Party Rental and Bounce House Rental","datePublished":"2020-01-28T15:14:48+00:00","dateModified":"2026-07-31T23:39:49+00:00","about":{"@id":"https://brincabrincaselpariente.net/#organization"},"isPartOf":{"@id":"https://brincabrincaselpariente.net/#website"},"primaryImageOfPage":{"@id":"https://brincabrincaselpariente.net/wp-content/uploads/2020/01/clean-shield.png"},"inLanguage":"en-US"},{"@type":"Service","name":"Brincabrincas El Pariente Phoenix AZ - Party Rental and Bounce House Rental","description":"Party and Event rentals of the highest quality. We have a large selection of clean equipment.","serviceType":"Bounce House Rental","offers":{"@type":"Offer","availability":"InStock"},"image":{"@id":"https://brincabrincaselpariente.net/wp-content/uploads/2020/01/clean-shield.png"},"@id":"https://brincabrincaselpariente.net/#schema-20673","mainEntityOfPage":{"@id":"https://brincabrincaselpariente.net/#webpage"}}]}</script>
1 <link rel='dns-prefetch' href='//cdnjs.cloudflare.com' /><link rel="alternate" type="application/rss+xml" title="Brincabrincas El Pariente Phoenix AZ » Feed" href="https://brincabrincaselpariente.net/feed/" /><link rel="alternate" type="application/rss+xml" title="Brincabrincas El Pariente Phoenix AZ » Comments Feed" href="https://brincabrincaselpariente.net/comments/feed/" /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://brincabrincaselpariente.net/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbrincabrincaselpariente.net%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://brincabrincaselpariente.net/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbrincabrincaselpariente.net%2F&format=xml" /><style id="wp-img-auto-sizes-contain-inline-css">img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 2/*# sourceURL=wp-img-auto-sizes-contain-inline-css */</style><style id="classic-theme-styles-inline-css">/*! This file is auto-generated */ 3.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 4/*# sourceURL=/wp-includes/css/classic-themes.min.css */</style><style id="global-styles-inline-css">:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
4--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
4.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 5:root :where(.wp-block-icon svg){width: 24px;} 6:where(.wp-block-gallery.is-layout-flex){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}:where(.wp-block-gallery.is-layout-grid){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );} 7:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;} 8:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} 9:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;} 10:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} 11:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} 12/*# sourceURL=global-styles-inline-css */</style><link rel='stylesheet' id='slick-carousel-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css?ver=7.1.3' 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.3' media='all' />
12<script id="jquery-core-js" src="https://brincabrincaselpariente.net/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":"BrincabrincasElPariente","io_locationid":"0","io_phonenumber":"(602) 272-0499","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":"Brincabrincas El Pariente Phoenix AZ"}; 13//# sourceURL=io-scripts-js-extra</script>
13 <link rel="https://api.w.org/" href="https://brincabrincaselpariente.net/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://brincabrincaselpariente.net/wp-json/wp/v2/pages/109" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://brincabrincaselpariente.net/xmlrpc.php?rsd" /><link rel='shortlink' href='https://brincabrincaselpariente.net/' />
vendor: 65 bytes, line 13
13 <script async src="https://www.googletagmanager.com/gtag/js?id=
13AW-16496590631
vendor: 12 bytes, line 13
13"></script>
13<script>
vendor: 134 bytes, lines 13-17
13window.dataLayer = window.dataLayer || []; 14 function gtag(){dataLayer.push(arguments);} 15 gtag('js', new Date()); 16 17 gtag('config', '
17AW-16496590631
vendor: 3 bytes, line 17
17');
17</script>
17<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), 18 .e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * { 19 background-image: none !important; 20 } 21 @media screen and (max-height: 1024px) { 22 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload), 23 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * { 24 background-image: none !important; 25 } 26 } 27 @media screen and (max-height: 640px) { 28 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload), 29 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * { 30 background-image: none !important; 31 } 32 }</style><link rel="icon" href="https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-150x150.png" sizes="32x32" /><link rel="icon" href="https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-300x300.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-300x300.png" /><meta name="msapplication-TileImage" content="https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-300x300.png" /><style id="wp-custom-css">.grecaptcha-badge { visibility: hidden; } 33 34.search-submit{display:none;} 35 36.cartInfo{ 37 display:none !important; 38} 39.io-footer-link a { 40color: var(--e-global-color-accent, orange); 41} 42 43.catDescriptionIO.catDescriptionIO_small.elementor-widget-text-editor { 44 padding: 10px; 45 font-size: small; 46 text-align: left; 47} 48 49.io_brand { 50 margin-bottom: 20px; 51}</style></head><body class="home wp-singular page-template page-template-elementor_header_footer page page-id-109 wp-custom-logo wp-theme-io-kenos eio-default 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 mega-menu-max-mega-menu-9 mega-menu-max-mega-menu-10 elementor-default elementor-template-full-width elementor-kit-812 elementor-page elementor-page-109"><header data-elementor-type="header" data-elementor-id="14449" class="elementor elementor-14449 elementor-location-header" data-elementor-post-type="elementor_library"><div class="elementor-element elementor-element-b0bc370 e-flex e-con-boxed e-con e-parent" data-id="b0bc370" data-element_type="container" data-e-type="container" data-settings="{"background_background":"classic"}"><div class="e-con-inner"><div class="elementor-element elementor-element-cf474bd e-con-full e-flex e-con e-child" data-id="cf474bd" data-element_type="container" data-e-type="container"><div class="elementor-element elementor-element-8670ad6 elementor-mobile-align-center elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="8670ad6" 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"><li class="elementor-icon-list-item"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-tag"></i> </span> <span class="elementor-icon-list-text">ENJOY $10 OFF ANY INFLATABLE RENTAL</span></li></ul></div></div></div><div class="elementor-element elementor-element-8b626f7 e-con-full e-flex e-con e-child" data-id="8b626f7" data-element_type="container" data-e-type="container"><div class="elementor-element elementor-element-2fff7dd elementor-widget elementor-widget-heading" data-id="2fff7dd" 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">USE CODE: PROMO10</h2></div></div></div></div></div><div class="elementor-element elementor-element-542e7b56 e-con-full e-flex e-con e-parent" data-id="542e7b56" data-element_type="container" data-e-type="container" id="header_pop" data-settings="{"sticky":"top","sticky_on":["desktop","tablet","mobile"],"sticky_offset":0,"sticky_effects_offset":0,"sticky_anchor_link_offset":0}"><div class="elementor-element elementor-element-67aa7e26 e-flex e-con-boxed e-con e-child" data-id="67aa7e26" data-element_type="container" data-e-type="container" data-settings="{"background_background":"classic"}"><div class="e-con-inner"><div class="elementor-element elementor-element-7037cee7 elementor-hidden-mobile e-con-full e-flex e-con e-child" data-id="7037cee7" data-element_type="container" data-e-type="container"><div class="elementor-element elementor-element-7251c3ba elementor-icon-list--layout-inline elementor-align-start elementor-mobile-align-center elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="7251c3ba" 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-phone"></i> </span> <span class="elementor-icon-list-text">602-272-0499</span></li><li class="elementor-icon-list-item elementor-inline-item"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-map-marker-alt"></i> </span> <span class="elementor-icon-list-text">3840 W Indian School Rd. Phx, AZ 85019</span></li></ul></div></div></div><div class="elementor-element elementor-element-223fd5cb e-con-full e-flex e-con e-child" data-id="223fd5cb" data-element_type="container" data-e-type="container"><div class="elementor-element elementor-element-276c4052 elementor-search-form--skin-full_screen elementor-widget elementor-widget-search-form" data-id="276c4052" data-element_type="widget" data-e-type="widget" data-settings="{"skin":"full_screen"}" data-widget_type="search-form.default"><div class="elementor-widget-container"> <search role="search"><form class="elementor-search-form" action="https://brincabrincaselpariente.net" method="get"><div class="elementor-search-form__toggle" role="button" tabindex="0" aria-label="Search"> <i aria-hidden="true" class="fas fa-search"></i></div><div class="elementor-search-form__container"> <label class="elementor-screen-only" for="elementor-search-form-276c4052">Search</label> <input id="elementor-search-form-276c4052" placeholder="" class="elementor-search-form__input" type="search" name="s" value=""><div class="dialog-lightbox-close-button dialog-close-button" role="button" tabindex="0" aria-label="Close this search box."> <i aria-hidden="true" class="eicon-close"></i></div></div></form> </search></div></div><div class="elementor-element elementor-element-245788ba elementor-icon-list--layout-inline elementor-align-en
51d elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="245788ba" 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="https://www.instagram.com/brincabrincas_el_pariente?igsh=aTUzcHhlZ2I0Nm5q"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fab fa-instagram"></i> </span> <span class="elementor-icon-list-text"></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="https://www.tiktok.com/@jose.gaxiola?_t=ZP-90AhigITnBv&_r=1"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fab fa-tiktok"></i> </span> <span class="elementor-icon-list-text"></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="https://www.facebook.com/brincabrincaselparientellc"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fab fa-facebook-f"></i> </span> <span class="elementor-icon-list-text"></span> </a></li></ul></div></div></div></div></div><div class="elementor-element elementor-element-318b8a97 e-flex e-con-boxed e-con e-child" data-id="318b8a97" data-element_type="container" data-e-type="container" data-settings="{"background_background":"classic"}"><div class="e-con-inner"><div class="elementor-element elementor-element-5f9eb170 elementor-widget elementor-widget-image" data-id="5f9eb170" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <a href="https://brincabrincaselpariente.net"> <img fetchpriority="high" width="225" height="224" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/04/logo-PARIENTE_588613.jpg" class="attachment-large size-large wp-image-5297" alt="Brincabrincas El Pariente Phoenix AZ" srcset="https://brincabrincaselpariente.net/wp-content/uploads/2025/04/logo-PARIENTE_588613.jpg 225w, https://brincabrincaselpariente.net/wp-content/uploads/2025/04/logo-PARIENTE_588613-150x150.jpg 150w" sizes="(max-width: 225px) 100vw, 225px" /> </a></div></div><div class="elementor-element elementor-element-74ad78b elementor-mobile-align-end ioCart elementor-hidden-desktop elementor-hidden-tablet elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="74ad78b" 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"><li class="elementor-icon-list-item"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-shopping-cart"></i> </span> <span class="elementor-icon-list-text"></span></li></ul></div></div><div class="elementor-element elementor-element-4e99f697 elementor-nav-menu--stretch elementor-nav-menu__text-align-center elementor-nav-menu--dropdown-tablet elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu" data-id="4e99f697" data-element_type="widget" data-e-type="widget" data-settings="{"full_width":"stretch","layout":"horizontal","submenu_icon":{"value":"<i class=\"fas fa-caret-down\" aria-hidden=\"true\"><\/i>","library":"fa-solid"},"toggle":"burger"}" data-widget_type="nav-menu.default"><div class="elementor-widget-container"><nav aria-label="Menu" class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-underline e--animation-fade"><ul id="menu-1-4e99f697" class="elementor-nav-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11659"><a href="https://brincabrincaselpariente.net/rentals/bounce-houses/" class="elementor-item">Bounce Houses & Jumps</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9917"><a href="https://brincabrincaselpariente.net/rentals/tables-chairs/" class="elementor-item">Tables & Chairs</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14189"><a href="https://brincabrincaselpariente.net/rentals/table-linens-2/" class="elementor-item">Table Linens</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9929"><a href="https://brincabrincaselpariente.net/rentals/slides-combos/" class="elementor-item">Wet & Dry Combos</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9921"><a href="https://brincabrincaselpariente.net/rentals/interactive-inflatables-2/" class="elementor-item">Obstacle Courses & Sports Inflatables</a></li><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-10059"><a href="https://brincabrincaselpariente.net/rentals/" class="elementor-item">Other Rentals<span class="sub-arrow"><i class="fas fa-caret-down" aria-hidden="true"></i></span></a><ul class="sub-menu elementor-nav-menu--dropdown"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9943"><a href="https://brincabrincaselpariente.net/rentals/tents-canopies/" class="elementor-sub-item">Tents & Canopies</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10453"><a href="https://brincabrincaselpariente.net/rentals/toddler-units/" class="elementor-sub-item">Toddler & Junior Units</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9829"><a href="https://brincabrincaselpariente.net/rentals/games-equipment-more/" class="elementor-sub-item">Concessions, Games, Equipment & More</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9953"><a href="https://brincabrincaselpariente.net/rentals/waterslides/" class="elementor-sub-item">Waterslides</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9823"><a href="https://brincabrincaselpariente.net/rentals/halloween-bou
51nce-houses/" class="elementor-sub-item">Spooky & Festive Jumpers</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9831"><a href="https://brincabrincaselpariente.net/rentals/special-occasion-jumpers/" class="elementor-sub-item">Special Occasion Jumpers</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9833"><a href="https://brincabrincaselpariente.net/rentals/wedding-equipment/" class="elementor-sub-item">Wedding Equipment</a></li></ul></li></ul></nav><div class="elementor-menu-toggle" role="button" tabindex="0" aria-label="Menu Toggle" aria-expanded="false"> <i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--open eicon-menu-bar"></i><i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--close eicon-close"></i></div><nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true"><ul id="menu-2-4e99f697" class="elementor-nav-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11659"><a href="https://brincabrincaselpariente.net/rentals/bounce-houses/" class="elementor-item" tabindex="-1">Bounce Houses & Jumps</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9917"><a href="https://brincabrincaselpariente.net/rentals/tables-chairs/" class="elementor-item" tabindex="-1">Tables & Chairs</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14189"><a href="https://brincabrincaselpariente.net/rentals/table-linens-2/" class="elementor-item" tabindex="-1">Table Linens</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9929"><a href="https://brincabrincaselpariente.net/rentals/slides-combos/" class="elementor-item" tabindex="-1">Wet & Dry Combos</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9921"><a href="https://brincabrincaselpariente.net/rentals/interactive-inflatables-2/" class="elementor-item" tabindex="-1">Obstacle Courses & Sports Inflatables</a></li><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-10059"><a href="https://brincabrincaselpariente.net/rentals/" class="elementor-item" tabindex="-1">Other Rentals<span class="sub-arrow"><i class="fas fa-caret-down" aria-hidden="true"></i></span></a><ul class="sub-menu elementor-nav-menu--dropdown"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9943"><a href="https://brincabrincaselpariente.net/rentals/tents-canopies/" class="elementor-sub-item" tabindex="-1">Tents & Canopies</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10453"><a href="https://brincabrincaselpariente.net/rentals/toddler-units/" class="elementor-sub-item" tabindex="-1">Toddler & Junior Units</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9829"><a href="https://brincabrincaselpariente.net/rentals/games-equipment-more/" class="elementor-sub-item" tabindex="-1">Concessions, Games, Equipment & More</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9953"><a href="https://brincabrincaselpariente.net/rentals/waterslides/" class="elementor-sub-item" tabindex="-1">Waterslides</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9823"><a href="https://brincabrincaselpariente.net/rentals/halloween-bounce-houses/" class="elementor-sub-item" tabindex="-1">Spooky & Festive Jumpers</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9831"><a href="https://brincabrincaselpariente.net/rentals/special-occasion-jumpers/" class="elementor-sub-item" tabindex="-1">Special Occasion Jumpers</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9833"><a href="https://brincabrincaselpariente.net/rentals/wedding-equipment/" class="elementor-sub-item" tabindex="-1">Wedding Equipment</a></li></ul></li></ul></nav></div></div><div class="elementor-element elementor-element-7f19ae94 elementor-align-right elementor-hidden-phone ioCart elementor-widget elementor-widget-button" data-id="7f19ae94" 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-size-md" role="button"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-icon"> <i aria-hidden="true" class="fas fa-long-arrow-alt-right"></i> </span> <span class="elementor-button-text">Book Now</span> </span> </a></div></div></div></div></div></div></header><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-48eac65a elementor-section-full_width elementor-section-height-full elementor-section-height-default elementor-section-items-middle" data-id="48eac65a" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fcec3c5" data-id="fcec3c5" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-3ff7ef5 elementor-widget elementor-widget-heading" data-id="3ff7ef5" 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">ready to throw the</h2></div></div><div class="elementor-element elementor-element-4bdc211 elementor-headline--style-highlight elementor-widget elementor-widget-animated-headline" data-id="4bdc211" data-element_type="widget" data-e-type="widget" data-settings="{"marker":"underline_zigzag","highlighted_text":"Ultimate Party?","headline_style":"highlight","loop":"yes","highlight_animation_duration":1200,"highlight_iteration_delay":8000}" data-widget_type="animated-headline.default"><div class="elementor-widget-container"><h3 class="elementor-headline"> <span class="elementor-headline-dynamic-wrapper elementor-headline-text-wrapper"> <span class="elementor-headline-dynamic-text elementor-headline-text-active">
51Ultimate Party?</span> </span></h3></div></div><div class="elementor-element elementor-element-ef59224 elementor-widget elementor-widget-text-editor" data-id="ef59224" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><h1>We are your local go-to for inflatable, bounce house, and party event rentals.</h1></div></div><div class="elementor-element elementor-element-d0b0750 elementor-align-center elementor-tablet-align-center elementor-widget__width-initial elementor-widget elementor-widget-button" data-id="d0b0750" 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" href="https://brincabrincaselpariente.net/io_quoteform"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Get quote</span> </span> </a></div></div></div><div class="elementor-element elementor-element-1cd242d elementor-align-center elementor-tablet-align-center elementor-widget__width-initial elementor-widget elementor-widget-button" data-id="1cd242d" 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-lg" href="https://brincabrincaselpariente.net/rentals/slides-combos/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-icon"> <i aria-hidden="true" class="fas fa-check"></i> </span> <span class="elementor-button-text">Book Now</span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-1681d1b elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="1681d1b" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8215e75" data-id="8215e75" 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-ac7b7e7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="ac7b7e7" 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-8d1dd34" data-id="8d1dd34" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-e01cf18 elementor-align-center elementor-tablet-align-center elementor-mobile-align-justify elementor-widget elementor-widget-button" data-id="e01cf18" 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-sm" href="https://brincabrincaselpariente.net/rentals/bounce-houses/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Bounce Houses</span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-7428c43" data-id="7428c43" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-cb0ed6b elementor-align-center elementor-tablet-align-center elementor-mobile-align-justify elementor-widget elementor-widget-button" data-id="cb0ed6b" 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-sm" href="https://brincabrincaselpariente.net/rentals/obstacle-courses/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Obstacles</span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-59cf65c" data-id="59cf65c" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-9d48161 elementor-align-center elementor-tablet-align-center elementor-mobile-align-justify elementor-widget elementor-widget-button" data-id="9d48161" 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-sm" href="https://brincabrincaselpariente.net/rentals/waterslides/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Waterslides</span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-c004ba0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c004ba0" 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-65f9b27" data-id="65f9b27" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-9de7107 elementor-align-center elementor-tablet-align-center elementor-mobile-align-justify elementor-widget elementor-widget-button" data-id="9de7107" 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-sm" href="https://brincabrincaselpariente.net/rentals/interactive-inflatables/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Interactives</span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-cde70c6" data-id="cde70c6" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-c0e9072 elementor-align-center elementor-tablet-align-center elementor-mobile-align-justify elementor-widget elementor-widget-button" data-id="c0e9072" 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-sm" href="https://brincabrincaselpariente.net/rentals/tents-canopies/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">TENTS & CANOPIES</span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-87d4b31" data-id="87d4b31" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-281b2ed elementor-align-center elementor-tablet-align-center elementor-mobile-align-justify elementor-widget elementor-widget-button" data-id="281b2ed" 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-sm" href="https://brincabrincaselpariente.net/rentals/tables-chairs/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Tables & Chairs</span> </span> </a></div></div></div></div></div></div></section><div class="elementor-element elementor-element-4c8261c elementor-widget elementor-widget-spacer" data-id="4c8261c" data-element_type="widget" data-e-type="widget" data-widget_type="spacer.default"><div class="elementor-widget-container"><div class="elementor-spacer"><div class="elementor-spacer-inner"></div></div></div></div><div class="elementor-element elementor-element-689d321 elementor-widget elementor-widget-heading" data-id="689d321" 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-large">What makes us different</h3></div></div><section class="elementor-section elementor-inner-section elementor-element elementor-element-dd79f1f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="dd79f1f" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-wider"><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-748d938" data-id="748d938" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-74cfdbb elementor-view-framed elementor-position-inline-start elementor-shape-circle elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box" data-id="74cfdbb" data-element_type="widget" data-e-type="widget" data-widget_type="icon-box.default"><div class="elementor-widget-container"><div class="elementor-icon-box-wrapper"><div class="elementor-icon-box-icon"> <span class="elementor-icon"> <i aria-hidden="true" class="far fa-star"></i> </span></div><div class="elementor-icon-box-content"><h3 class="elementor-icon-box-title"> <span > A+ Service </span></h3><p class="elementor-icon-box-description"> We pride ourselves on our customer service. Take a look at our reviews to see why we are top rated.</p></div></div></div></div></div></div><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-efd195d" data-id="efd195d" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-61e1b5f elementor-view-framed elementor-position-inline-start elementor-shape-circle elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box" data-id="61e1b5f" data-element_type="widget" data-e-type="widget" data-widget_type="icon-box.default"><div class="elementor-widget-container"><div class="elementor-icon-box-wrapper"><div class="elementor-icon-box-icon"> <span class="elementor-icon"> <i aria-hidden="true" class="far fa-plus-square"></i> </span></div><div class="elementor-icon-box-content"><h3 class="elementor-icon-box-title"> <span > Reliable Inventory </span></h3><p class="elementor-icon-box-description"> Elevate your event with reliable party rentals—perfectly timed, perfectly executed, every time!</p></div></div></div></div></div></div></div></section></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-5442069f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5442069f" 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-72e77cc2 io_widget_home" data-id="72e77cc2" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-349e4e28 elementor-hidden-desktop elementor-hidden-tablet elementor-widget elementor-widget-wp-widget-searchio_live_search" data-id="349e4e28" 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://brincabrincaselpariente.net"> <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-2f5a4f98 elementor-widget elementor-widget-wp-widget-widget_featured" data-id="2f5a4f98" 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;">
51<script>jQuery(document).ready(function(){ 52 jQuery('.io_mm_item .io_item2_list').css('box-shadow', 'none') 53 jQuery('.io_mm_item .io_item2_list').addClass('nohover') 54 55 jQuery('.io_mm_item .io_item2_listcat').css('box-shadow', 'none') 56 jQuery('.io_mm_item .io_item2_listcat').addClass('nohover') 57 })</script>
57<div class="io_mm_outer io_widget_45651 " style="grid-template-columns:repeat(4, calc((100% - 45px)/4)); display:grid;"><style>.io_widget_45651 .io_item2_list_inner .rentNameIO_button {display:none !important;} .io_widget_45651 .io_item2_list_inner .rentNameIO_price {display:none !important;} .io_widget_45651 .io_item2_list .view-product-button {display:none !important;} .io_widget_45651 .io_item2_listcat .view-product-button {display:none !important;}</style><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/bounce-houses/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/11/OBSTACLES20COURSE2023_1762811565_big.png" alt="Bounce Houses & Jumps" title="Bounce Houses & Jumps" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/bounce-houses/"><p class="rentNameIO elementor-heading-title">Bounce Houses & Jumps</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Bring the fun to your next event! Our bounce houses are a great choice for birthday parties, family celebrations, school events, and special occasions. </span><span style="font-size: 16px;"></span><span style="font-size: 16px;"><span style="font-family: Tahoma,Geneva,sans-serif;">With different sizes, colors, and themes available, there’s a bounce house for every celebration!</span></span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/games-equipment-more/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/04/OBSTACLES20COURSE2010_1729038834_big.png" alt="Concessions, Games, Equipment & More" title="Concessions, Games, Equipment & More" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/games-equipment-more/"><p class="rentNameIO elementor-heading-title">Concessions, Games, Equipment & More</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">A flexible mix of party add-ons, including concession items, games, and helpful event equipment for all kinds of gatherings. Great for rounding out your setup with extra fun and convenience.</span></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/interactive-inflatables-2/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2026/10/OBSTACLES20COURSE2035_1790899934_big.png" alt="Obstacle Courses & Sports Inflatables" title="Obstacle Courses & Sports Inflatables" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/interactive-inflatables-2/"><p class="rentNameIO elementor-heading-title">Obstacle Courses & Sports Inflatables</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Ready for some friendly competition? Our sports and challenge inflatables are perfect for birthday parties, school events, sports events, team-building, and special celebrations.</span></p><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Choose from exciting sports games, challenges, competitions, and interactive inflatables designed to keep everyone active and entertained.</span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/special-occasion-jumpers/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2026/01/OBSTACLES20COURSE2032_1769024357_big.png" alt="Special Occasion Jumpers" title="Special Occasion Jumpers" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/special-occasion-jumpers/"><p class="rentNameIO elementor-heading-title">Special Occasion Jumpers</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Make every celebration extra special! Our themed jumpers are perfect for baby showers, gender reveals, baptisms, birthdays, and other special occasions.</span></p><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Choose from a variety of fun and festive designs that add the perfect touch of entertainment to your celebration.</span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/halloween-bou
57nce-houses/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2026/01/OBSTACLES20COURSE2033_1769024668_big.png" alt="Spooky & Festive Jumpers" title="Spooky & Festive Jumpers" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/halloween-bounce-houses/"><p class="rentNameIO elementor-heading-title">Spooky & Festive Jumpers</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Bring the fun and excitement to your seasonal celebrations! Our spooky and festive jumpers are perfect for Halloween parties, holiday events, themed parties, and special celebrations.</span></p><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Choose from fun, colorful, and festive designs that make every event more exciting and memorable.</span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/table-linens-2/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2026/01/OBSTACLES20COURSE2030_1769023892_big.png" alt="Table Linens" title="Table Linens" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/table-linens-2/"><p class="rentNameIO elementor-heading-title">Table Linens</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p style="text-align: left;"><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Elegant table linens that elevate any event setting. Available in a variety of colors and sizes to match your theme. Clean, pressed, and event-ready for a polished look. Perfect for weddings, parties, and special occasions.</span></p><ul><li style="text-align: left; font-family: Tahoma, Geneva, sans-serif; font-size: 16px;"><em>Tables and chairs not included. </em></li></ul></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/tables-chairs/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2026/01/OBSTACLES20COURSE2031_1769024032_big.png" alt="Tables & Chairs" title="Tables & Chairs" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/tables-chairs/"><p class="rentNameIO elementor-heading-title">Tables & Chairs</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Make your event complete with comfortable seating and quality tables for every occasion. Whether you're planning a birthday party, family gathering, wedding, corporate event, or special celebration, we have a variety of options to fit your needs.</span></p><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Choose from round tables, rectangle tables, kids' tables, cocktail tables, and folding chairs in different styles to create the perfect setup for your guests.</span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/tents-canopies/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/04/OBSTACLES20COURSE208_1717802627_big.png" alt="Tents & Canopies" title="Tents & Canopies" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/tents-canopies/"><p class="rentNameIO elementor-heading-title">Tents & Canopies</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p data-end="388" data-start="84"><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Create the perfect space for your next event! Our tents and canopies provide shade, comfort, and protection for your guests while adding a clean and professional look to your celebration. </span><span style="font-size: 16px;"><span style="font-family: Tahoma,Geneva,sans-serif;">Perfect for birthday parties, weddings, graduations, baby showers, corporate events, outdoor festivals, and special occasions.</span></span></p><p data-end="641" data-start="390"><span style="font-size: 16px;"><span style="font-family: Tahoma,Geneva,sans-serif;">Each rental is well-maintained, sturdy, and professionally installed to ensure safety and a polished appearance.</span></span></p><p data-end="388" data-start="84" style="text-align: left;"><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;"><strong>MULTIPLE SIZES • QUALITY SETUPS • PERFECT FOR ANY EVENT</strong></span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/toddler-units/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/11/OBSTACLES20COURSE2024_1762811941_big.png" alt="Toddler & Junior Units" title="Toddler & Junior Units" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/toddler-units/"><p class="rentNameIO elementor-heading-title">Toddler & Junior Units</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Fun, colorful, and designed especially for little ones! Our toddler inflatables are perfect for ages 2–7 and ideal for birthday parties, family gatherings, baby showers, and special celebrations.</span></p><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Choose from a variety of fun themes, slides, bounce areas, and interactive play features designed with toddlers and young children in mind. They’re a great way to keep little ones active, entertained, and smiling throughout the celebration!</span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/waterslides/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/09/OBSTACLES20COURSE2020_1757707375_big.png" alt="Waterslides" title="Waterslides" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/waterslides/"><p class="rentNameIO elementor-heading-title">Waterslides</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><p><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Make a splash at your next celebration with our exciting selection of water slides! From family-friendly slides for younger children to taller, faster options for older kids and teens, we have something for every level of adventure.</span></p><p><span style="font-size: 16px;"><span style="font-family: Tahoma,Geneva,sans-serif;">Our water slides feature wide and exciting slides, convenient climbing stairs, and splash pools designed for hours of summer fun. Perfect for birthdays, family gatherings, neighborhood parties, special events and more.<br></span></span></p></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/wedding-equipment/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2026/01/Copy20of20RENTA20DE20EQUIPO202_1769024779_big.png" alt="Wedding Equipment" title="Wedding Equipment" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/wedding-equipment/"><p class="rentNameIO elementor-heading-title">Wedding Equipment</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><span style="font-size: 16px; font-family: Tahoma, Geneva, sans-serif;">Create a polished wedding setup with essential rental items, including round and rectangular tables, garden chairs, cocktail tables, 32-gallon trash cans, lighting, and more. These versatile pieces help keep your ceremony or reception comfortable, organized, and ready for guests.</span></div> </a></div></div></div><div class="io_mm_item elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_brincabr" style="text-align:center"><div class="io_item2_listcat elementor-widget-heading"> <a href="https://brincabrincaselpariente.net/rentals/slides-combos/"><div class="cat_div"><div class="btn btn-primary view-product-button">View Products</div> <img decoding="async" class="cat_img" src="https://brincabrincaselpariente.net/wp-content/uploads/2025/09/OBSTACLES20COURSE2018_1757706668_big.png" alt="Wet & Dry Combos" title="Wet & Dry Combos" /></div> </a><div class="cat_div_inner"> <a href="https://brincabrincaselpariente.net/rentals/slides-combos/"><p class="rentNameIO elementor-heading-title">Wet & Dry Combos</p><div class="catDescriptionIO catDescriptionIO_small elementor-widget-text-editor"><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Our Wet & Dry Combos combine the excitement of a bounce house with interactive play features in one colorful inflatable rental. Designed for both sunny and cooler days, these colorful inflatable combos can be enjoyed as a dry play attraction or paired with water for refreshing summer fun. Available in a variety of fun themes and designs, kids can bounce, climb, slide, and explore while staying active and entertained. </span><br><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;"></span><br><span style="font-family: Tahoma, Geneva, sans-serif; font-size: 16px;">Perfect for birthday parties, school events, community celebrations, and family gatherings!</span></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-5a3909e elementor-section-height-min-height elementor-section-items-stretch elementor-section-boxed elementor-section-height-default" data-id="5a3909e" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3f0d362e" data-id="3f0d362e" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><section class="elementor-section elementor-inner-section elementor-element elementor-element-6b5316e8 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6b5316e8" 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-663d6e47" data-id="663d6e47" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6235e90e elementor-widget elementor-widget-text-editor" data-id="6235e90e" 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-6597a3c3 elementor-widget elementor-widget-text-editor" data-id="6597a3c3" 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-8f28513" data-id="8f28513" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-17ea3886 elementor-widget elementor-widget-image" data-id="17ea3886" 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://brincabrincaselpariente.net/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-2e8a7056" data-id="2e8a7056" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6ef01b3c elementor-widget elementor-widget-text-editor" data-id="6ef01b3c" 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-4fa5e5f6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4fa5e5f6" 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-357fd59c" data-id="357fd59c" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6c27926c elementor-widget elementor-widget-heading" data-id="6c27926c" 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-6922ee70 elementor-widget elementor-widget-image" data-id="6922ee70" 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://brincabrincaselpariente.net/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-430af59c elementor-widget elementor-widget-text-editor" data-id="430af59c" data-e
57lement_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Sweep<br />All Dust, Dirt, & Debris</p></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-316c229c" data-id="316c229c" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6fd0c14a elementor-widget elementor-widget-heading" data-id="6fd0c14a" 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-2f25b8ba elementor-widget elementor-widget-image" data-id="2f25b8ba" 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://brincabrincaselpariente.net/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-73ea2ac2 elementor-widget elementor-widget-text-editor" data-id="73ea2ac2" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Deep Clean Unit<br />with Cleaner & Sanitizer</p></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-656db32c" data-id="656db32c" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6b7030c2 elementor-widget elementor-widget-heading" data-id="6b7030c2" 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-435845ff elementor-widget elementor-widget-image" data-id="435845ff" 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://brincabrincaselpariente.net/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-26d834a7 elementor-widget elementor-widget-text-editor" data-id="26d834a7" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Clean, Sanitized &<br />Ready for Fun!</p></div></div></div></div></div></section></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-1e54a058 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1e54a058" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-40d771a2" data-id="40d771a2" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-44397c0f elementor-widget elementor-widget-heading" data-id="44397c0f" 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-large">Reviews you can trust</h3></div></div><div class="elementor-element elementor-element-5c6690bc elementor-widget elementor-widget-text-editor" data-id="5c6690bc" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Feel confident in your decision, our reviews will help.</p></div></div><div class="elementor-element elementor-element-1a493d7 elementor-arrows-yes elementor-pagination-type-bullets elementor-review--has-separator elementor--star-style-star_fontawesome elementor-widget elementor-widget-reviews" data-id="1a493d7" data-element_type="widget" data-e-type="widget" data-settings="{"show_arrows":"yes","pagination":"bullets","speed":500,"autoplay":"yes","autoplay_speed":5000,"loop":"yes","pause_on_hover":"yes","pause_on_interaction":"yes","space_between":{"unit":"px","size":10,"sizes":[]},"space_between_tablet":{"unit":"px","size":10,"sizes":[]},"space_between_mobile":{"unit":"px","size":10,"sizes":[]}}" data-widget_type="reviews.default"><div class="elementor-widget-container"><div class="elementor-swiper"><div class="elementor-main-swiper swiper" role="region" aria-roledescription="carousel" aria-label="Slides"><div class="swiper-wrapper"><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-testimonial elementor-repeater-item-0c424b1"><div class="elementor-testimonial__header"> <cite class="elementor-testimonial__cite"><span class="elementor-testimonial__name">Natalia M</span><div class="elementor-star-rating"><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i></div></cite><div class="elementor-testimonial__icon elementor-icon elementor-icon-" aria-label="Read More"></div></div><div class="elementor-testimonial__content"><div class="elementor-testimonial__text"> We had an incredible experience and time with Brincabrincas - they made our vision come true for a barnyard bash.. they offered everything we needed plus and it was a one stop shop! Staff was friendly, prompt with their responses and accommodating on many levels! Can’t wait to host another event and have them part of it!</div></div></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-testimonial elementor-repeater-item-1e81bf5"><div class="elementor-testimonial__header"> <cite class="elementor-testimonial__cite"><span class="elementor-testimonial__name">Jorge M</span><div class="elementor-star-rating"><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i></div></cite><div class="elementor-testimonial__icon elementor-icon elementor-icon-" aria-label="Read More"></div></div><div class="elementor-testimonial__content"><div class="elementor-testimonial__text"> Best party rental business in Arizona. If you want quality and reliability this is your one stop shop. I’ve been using them for over 5 years and have never let me down.</div></div></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-testimonial elementor-repeater-item-ca577c8"><div class="elementor-testimonial__header"> <cite class="elementor-testimonial__cite"><span class="elementor-testimonial__name">Valentina B</span><div class="elementor-star-rating"><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i></div></cite><div class="elementor-testimonial__icon elementor-icon elementor-icon-" aria-label="Read More"></div></div><div class="elementor-testimonial__content"><div class="elementor-testimonial__text"> Easy to schedule an event with Bricabrincas El Pariente. Communication was great via text and email. I was notified via text when the rental would be ready for drop off & set up. Set up was quick, efficient & arrived between previously agreed on time frame. Highly recommend & will book again.</div></div></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-testimonial elementor-repeater-item-197df59"><div class="elementor-testimonial__header"> <cite class="elementor-testimonial__cite"><span class="elementor-testimonial__name">Misael F</span><div class="elementor-star-rating"><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i></div></cite><div class="elementor-testimonial__icon elementor-icon elementor-icon-" aria-label="Read More"></div></div><div class="elementor-testimonial__content"><div class="elementor-testimonial__text"> Not only do they have the best price rates and services, but they were very helpful and understanding when it came to the event adju
57stments and special requests for the rentals. ALWAYS GO WITH THEM, THEY ARE THE BEST!!!!!!!!!!!!!!!!</div></div></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-testimonial elementor-repeater-item-8827c29"><div class="elementor-testimonial__header"> <cite class="elementor-testimonial__cite"><span class="elementor-testimonial__name">Jesus C</span><div class="elementor-star-rating"><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i></div></cite><div class="elementor-testimonial__icon elementor-icon elementor-icon-" aria-label="Read More"></div></div><div class="elementor-testimonial__content"><div class="elementor-testimonial__text"> I've worked with Jose and his family for a few years now. They've always been very customer oriented and are very dependable when planning our events. I've referred them to family members and friends with full confidence in their work and reliability. They are definitely my first call when we need entertainment options.</div></div></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-testimonial elementor-repeater-item-db8c9b4"><div class="elementor-testimonial__header"> <cite class="elementor-testimonial__cite"><span class="elementor-testimonial__name">Daimara M</span><div class="elementor-star-rating"><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i><i class="elementor-star-full"></i></div></cite><div class="elementor-testimonial__icon elementor-icon elementor-icon-" aria-label="Read More"></div></div><div class="elementor-testimonial__content"><div class="elementor-testimonial__text"> Rente un waterslide para el cumpleaños de mi hija y quedaron encantados los niños,el servicio estuvo muy muy eficiente muy puntual y muy amable ,sin dudas los recomiendo 100 porciento .</div></div></div></div></div><div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0" aria-label="Previous"> <i aria-hidden="true" class="eicon-chevron-left"></i></div><div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0" aria-label="Next"> <i aria-hidden="true" class="eicon-chevron-right"></i></div><div class="swiper-pagination"></div></div></div></div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-28559dae elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="28559dae" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic","shape_divider_top":"tilt","shape_divider_bottom":"tilt"}"><div class="elementor-background-overlay"></div><div class="elementor-shape elementor-shape-top" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 100" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M0,6V0h1000v100L0,6z"/> </svg></div><div class="elementor-shape elementor-shape-bottom" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 100" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M0,6V0h1000v100L0,6z"/> </svg></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-4c611399" data-id="4c611399" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-2d785a4c elementor-widget elementor-widget-theme-site-logo elementor-widget-image" data-id="2d785a4c" data-element_type="widget" data-e-type="widget" data-widget_type="theme-site-logo.default"><div class="elementor-widget-container"> <a href="https://brincabrincaselpariente.net"> <img loading="lazy" decoding="async" width="500" height="500" src="https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6.png" class="elementor-animation-grow attachment-full size-full wp-image-8189" alt="Untitled design 6 Home" srcset="https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6.png 500w, https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-300x300.png 300w, https://brincabrincaselpariente.net/wp-content/uploads/2020/02/Untitled-design-6-150x150.png 150w" sizes="(max-width: 500px) 100v
57w, 500px"> </a></div></div></div></div><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-4e4ad014" data-id="4e4ad014" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-10efbaa elementor-widget elementor-widget-heading" data-id="10efbaa" 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-large">Who we are</h3></div></div><div class="elementor-element elementor-element-3811e173 elementor-widget elementor-widget-text-editor" data-id="3811e173" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>We are your <strong>#1 source</strong> for inflatable and party rentals. We pride ourselves in providing the absolute <strong>best “bounce” for your buck</strong> in the industry. With every rental and every event, we focus on providing world-class service so you can focus on having <strong>FUN</strong>.</p><p>We also pride ourselves in providing <strong>clean and safe rentals</strong> at the most competitive pricing around. Each unit is cleaned and sanitized after every rental to guarantee your safety and satisfaction. We always follow the <strong>strictest safety guidelines</strong> and we absolutely will not sacrifice your safety for business. <strong>EVER</strong>. </p></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-873e20b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="873e20b" 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-78d90d2" data-id="78d90d2" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-05b6d5b elementor-widget elementor-widget-google_maps" data-id="05b6d5b" data-element_type="widget" data-e-type="widget" data-widget_type="google_maps.default"><div class="elementor-widget-container"><div class="elementor-custom-embed"> <iframe loading="lazy" 58 src="https://maps.google.com/maps?q=3840%20W%20Indian%20School%20Rd.&t=m&z=10&output=embed&iwloc=near" 59 title="3840 W Indian School Rd." 60 aria-label="3840 W Indian School Rd." 61 ></iframe></div></div></div></div></div></div></section></div><footer data-elementor-type="footer" data-elementor-id="468" class="elementor elementor-468 elementor-location-footer" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-586d06be elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="586d06be" data-element_type="section" data-e-type="section" id="io_contactform" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-5c25c82" data-id="5c25c82" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-14a8b138 elementor-widget elementor-widget-heading" data-id="14a8b138" 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-xxl">Contact Us</h2></div></div><div class="elementor-element elementor-element-e89f5c7 elementor-icon-list--layout-inline elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-global elementor-global-1877 elementor-widget-icon-list" data-id="e89f5c7" 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:(602)%20272-0499"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">(602) 272-0499</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-e483193 elementor-icon-list--layout-inline elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-global elementor-global-2496 elementor-widget-icon-list" data-id="e483193" 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">3840 W Indian School Rd Phoenix, AZ 85019</span></li></ul></div></div><div class="elementor-element elementor-element-ff1ff93 elementor-shape-rounded elementor-grid-0 e-grid-align-center elementor-widget elementor-widget-social-icons" data-id="ff1ff93" data-element_type="widget" data-e-type="widget" data-widget_type="social-icons.default"><div class="elementor-widget-container"><div class="elementor-social-icons-wrapper elementor-grid" role="list"> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-facebook elementor-repeater-item-e0e8ade" href="https://www.facebook.com/brincabrincaselparientellc" target="_blank"> <span class="elementor-screen-only">Facebook</span> <i aria-hidden="true" class="fab fa-facebook"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-instagram elementor-repeater-item-cfeb3a6" href="https://www.instagram.com/brincabrincas_el_pariente" target="_blank"> <span class="elementor-screen-only">Instagram</span> <i aria-hidden="true" class="fab fa-instagram"></i> </a> </span></div></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-4ef0b9ff" data-id="4ef0b9ff" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-9f7a821 elementor-button-align-stretch elementor-widget elementor-widget-global elementor-global-4712 elementor-widget-form" data-id="9f7a821" data-element_type="widget" data-e-type="widget" data-settings="{"step_next_label":"Next","step_previous_label":"Previous","button_width":"100","step_type":"number_text","step_icon_shape":"circle"}" data-widget_type="form.default"><div class="elementor-widget-container"><form class="elementor-form" method="post" id="io_contactusform" name="Request Call Back" aria-label="Request Call Back"> <input type="hidden" name="post_id" value="468"/> <input type="hidden" name="form_id" value="9f7a821"/> <input type="hidden" name="referer_title" value="Brincabrincas El Pariente Phoenix AZ - Party Rental and Bounce House Rental" /> <input type="hidden" name="queried_id" value="109"/><div class="elementor-form-fields-wrapper elementor-labels-"><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-firstandlastname elementor-col-33"> <label for="form-field-firstandlastname" class="elementor-field-label elementor-screen-only"> Name </label> <input size="1" type="text" name="form_fields[firstandlastname]" id="form-field-firstandlastname" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Name"></div><div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-33 elementor-field-required"> <label for="form-field-email" class="elementor-field-label elementor-screen-only"> Email </label> <input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Email" required="required"></div><div class="elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-cellphone elementor-col-33"> <label for="form-field-cellphone" class="elementor-field-label elementor-screen-only"> Phone </label> <input size="1" type="tel" name="form_fields[cellphone]" id="form-field-cellphone" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Phone" pattern="[0-9()#&+*-=.]+" title="Only numbers and phone characters (#, -, *, etc) are accepted."></div><div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-notes elementor-col-100"> <label for="form-field-notes" class="elementor-field-label elementor-screen-only"> Message </label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[notes]" id="form-field-notes" rows="3" placeholder=""I need help from a human sales rep.""></textarea></div><div class="elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_1a42aac elementor-col-100 recaptcha_v3-bottomright"><div class="elementor-field" id="form-field-field_1a42aac"><div class="elementor-g-recaptcha" data-sitekey="6LcSNw8eAAAAAN1cy4N20ZlzWX4YetiG7zmLXN_f" data-type="v3" data-action="Form" data-badge="bottomright" data-size="invisible"></div></div></div><div class="elementor-field-type-text"> <input size="1" type="text" name="form_fields[website_url]" id="form-field-website_url" class="elementor-field elementor-size-sm " style="display:none !important;"></div><div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons"> <button class="elementor-button elementor-size-sm elementor-animation-grow" type="submit" id="io_cub"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-icon"> <i aria-hidden="true" class="far fa-paper-plane"></i> </span> <span class="elementor-button-text">Send</span> </span> </button></div></div></form></div></div><div class="elementor-element elementor-element-6e039ac elementor-widget elementor-widget-text-editor" data-id="6e039ac" 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><div class="elementor-element elementor-element-0a792ff e-flex e-con-boxed e-con e-parent" data-id="0a792ff" data-element_type="container" data-e-type="container" data-settings="{"background_background":"classic"}"><div class="e-con-inner"><div class="elementor-element elementor-element-d021e14 e-flex e-con-boxed e-con e-child" data-id="d021e14" data-element_type="container" data-e-type="container"><div class="e-con-inner"><div class="elementor-element elementor-element-53b08c7 e-con-full e-flex e-con e-child" data-id="53b08c7" data-element_type="container" data-e-type="container"><div class="elementor-element elementor-element-71fabd0 e-flex e-con-boxed e-con e-child" data-id="71fabd0" data-element_type="container" data-e-type="container"><div class="e-con-inner"><div class="elementor-element elementor-element-c47c378 elementor-widget elementor-widget-heading" data-id="c47c378" 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">HELP</h2></div></div></div></div><div class="elementor-element elementor-element-ff0974b elementor-nav-menu--dropdown-tablet elementor-nav-menu__text-align-aside elementor-widget elementor-widget-nav-menu" data-id="ff0974b" data-element_type="widget" data-e-type="widget" data-settings="{"layout":"vertical","submenu_icon":{"value":"<i class=\"fas fa-caret-down\" aria-hidden=\"true\"><\/i>","library":"fa-solid"}}" data-widget_type="nav-menu.default"><div class="elementor-widget-container"><nav aria-label="Menu" class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-vertical e--pointer-underline e--animation-fade"><ul id="menu-1-ff0974b" class="elementor-nav-menu sm-vertical"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16963"><a href="https://brincabrincaselpariente.net/terms-conditions/" class="elementor-item">Terms & Conditions</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16829"><a href="https://brincabrincaselpariente.net/cancellation-refund-policy/" class="elementor-item">Cancellation & Refund Policy</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16961"><a href="https://brincabrincaselpariente.net/delivery-policy/" class="elementor-item">Delivery Policy</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4054"><a href="https://brincabrincaselpariente.net/faqs/" class="elementor-item">FAQs</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4051"><a href="https://brincabrincaselpariente.net/contact-us/" class="elementor-item">Contact Us</a></li></ul></nav><nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true"><ul id="menu-2-ff0974b" class="elementor-nav-menu sm-vertical"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16963"><a href="https://brincabrincaselpariente.net/terms-conditions/" class="elementor-item" tabindex="-1">Terms & Conditions</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16829"><a href="https://brincabrincaselpariente.net/cancellation-refund-policy/" class="elementor-item" tabindex="-1">Cancellation & Refund Policy</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16961"><a href="https://brincabrincaselpariente.net/delivery-policy/" class="elementor-item" tabindex="-1">Delivery Policy</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4054"><a href="https://brincabrincaselpariente.net/faqs/" class="elementor-item" tabindex="-1">FAQs</a></li><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4051"><a href="https://brincabrincaselpariente.net/contact-us/" class="elementor-item" tabindex="-1">Contact Us</a></li></ul></nav></div></div></div></div></div></div></div><section class="elementor-section elementor-top-section elementor-element elementor-element-ce36742 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="ce36742" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-753947bc" data-id="753947bc" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-b518968 elementor-widget elementor-widget-global elementor-global-1920 elementor-widget-text-editor" d
61ata-id="b518968" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Copyright © <span id="io_fbs">Brincabrincas El Pariente Phoenix AZ</span> All Rights Reserved | <a href="https://brincabrincaselpariente.net/privacy/">Privacy Policy</a> | Rental Software Powered By <a href="https://www.inflatableoffice.com/" target="_blank" rel="noopener">InflatableOffice</a></p></div></div></div></div></div></section></footer>
61<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>
61 <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,.io_product_price_48h,.io_product_price_additionalday{display: grid !important} 62 .io_product_cust_price 63 { 64 display: none !important; 65 } 66 #item_live_price_time_set_message 67 { 68 display: none !important; 69 } 70 71 /* ALWAYS hide toggle buttons and list view on inventory/all-items pages (no category ID) */ 72 body.io-no-category-id .io_view_toggle_container, 73 body.io-no-category-id .io_list_view_content 74 { 75 display: none !important; 76 } 77 78 /* Force grid/tile layout on pages without category IDs */ 79 body.io-no-category-id .io_catdiv2.list-view { 80 display: grid !important; 81 grid-template-columns: repeat(auto-fit, minmax(250px, 350px)) !important; 82 grid-gap: 10px !important; 83 margin: 50px !important; 84 max-width: none !important; 85 justify-content: space-evenly !important; 86 } 87 body.io-no-category-id .io_catdiv2.list-view .io_item2_list { 88 display: block !important; 89 flex-direction: column !important; 90 margin-bottom: 0 !important; 91 padding: 0 !important; 92 align-items: initial !important; 93 text-align: center !important; 94 } 95 body.io-no-category-id .io_catdiv2.list-view .cat_div { 96 flex: initial !important; 97 margin-right: 0 !important; 98 position: relative !important; 99 } 100 body.io-no-category-id .io_catdiv2.list-view .cat_img { 101 width: 100% !important; 102 height: auto !important; 103 object-fit: cover !important; 104 } 105 body.io-no-category-id .io_catdiv2.list-view .io_item2_list_inner { 106 flex: initial !important; 107 margin-top: initial !important; 108 display: block !important; 109 flex-direction: initial !important; 110 justify-content: initial !important; 111 min-height: auto !important; 112 height: auto !important; 113 } 114 115 .io_all_item_cat{ 116 display:none; 117 float:none; 118 width:100%; 119 margin-top:20px; 120 }</style>
120<script>var io_wp_local_path = ""; 121 var io_checkavail = "warn"; 122 var io_hidetimes = "off"; 123 var io_user_country = "US"; 124 var io_user_currency = "USD"; 125 var io_default_start_time = "11:00 am"; 126 var io_default_end_time = "3:00 pm"; 127 var io_default_duration = 4.00; 128 var io_force_blank_timepickers = "off"; 129 var io_hide_end_time = "off"; 130 var io_cart_date_format = "m/d/yy"; 131 var io_cart_message = "Please only reserve residential orders online. For all non-residential orders, please call our office or send us an email. Thank you."; 132 var io_cart_time_format = "g:i a"; 133 var io_multidayquote = "on"; 134 var io_cartdayselect = "dropdown_options"; 135 var io_cartAllowSameDay = "off"; 136 var io_overnightPickupTime = "10:00 am"; 137 var io_incartupsell = "on"; 138 var io_distancecharge = "on"; 139 var io_deliverymethod = "off"; 140 var io_brand = "IO"; 141 var io_restrict_times = "on"; 142 var io_restrict_time_start = "8:00 am"; 143 var io_restrict_time_end = "9:00 pm"; 144 var io_default_state = "AZ"; 145 var io_hide_zero = "1"; 146 var io_weekEndPrice = "off"; 147 var io_weekDayText = "Weekday price."; 148 var io_weekEndText = "Weekend price."; 149 var io_weekendDefine = "friday-sunday"; 150 var io_accessory_price = "off"; 151 var io_accessory_select = "off"; 152 var io_upsell_price = "off"; 153 var io_cart_party_planner_email = "off"; 154 var io_cart_party_planner_destination = "https://brincabrincaselpariente.net/plan-a-party/"; 155 var io_hideQuantityAvail = "off"; 156 var io_company_timeslots = []; 157 var io_info_required = "off"; 158 var io_always_display_live_price = "off"; 159 var io_default_delivery_method = "Delivery"; 160 var io_hide_live_prices = 1; 161 var io_info_required_data = []; 162 var io_prices = {"0":"isset","override_groups":[],"1":"io_product_price_24h","2":"io_product_price_48h","3":"io_product_price_additionalday"}; 163 var io_delivery_prices = {"default":[],"override":[]}; 164 var io_custom_prices = {"default":[],"override":[]}; 165 var io_delivery_methods = {"Delivery":{"restricted":"[]","id":"86915"},"Customer Pickup\/Dropoff":{"restricted":"[\"2250859\",\"2250925\",\"2256301\",\"2250919\",\"2250923\",\"2250921\",\"2250917\",\"2256305\",\"2256253\",\"2256287\",\"2256307\",\"2250869\",\"2250835\",\"2250875\",\"2250881\",\"2250903\",\"2250911\",\"2250913\",\"2250841\",\"2250853\",\"2256313\",\"2250915\",\"2256291\",\"2250857\",\"2250927\",\"2250929\",\"2256285\",\"2250827\",\"2250833\",\"2256355\",\"2256353\",\"2256325\",\"2256559\",\"2256319\",\"2369418\",\"2256359\",\"2256367\",\"2256377\",\"2256373\",\"2256385\",\"2256531\",\"2256535\",\"2256487\",\"2256439\",\"2256495\",\"2256515\",\"2256521\",\"2260735\",\"2260709\",\"2260725\",\"2260707\",\"2262913\",\"2260759\",\"2260741\",\"2260705\",\"2369386\",\"2260737\",\"2262911\",\"2260749\",\"2260715\",\"2260753\",\"2260757\",\"2260727\",\"2263071\",\"2263073\",\"2263079\",\"2260747\",\"2262925\",\"2262933\",\"2263329\",\"2260717\",\"2260719\",\"2260745\",\"2256589\",\"2256593\",\"2256565\",\"2256601\",\"2256613\",\"2256623\",\"2256631\",\"2256629\",\"2256619\",\"2256615\",\"2256621\",\"2263461\",\"2263339\",\"2263337\",\"2263341\",\"2369424\",\"2369428\",\"2263355\",\"2263379\",\"2263383\",\"2263377\",\"2263363\",\"2263425\",\"2263431\",\"2263429\",\"2263435\",\"2263451\",\"2263441\",\"2263453\",\"2263443\",\"2263445\",\"2263449\",\"2263437\",\"2263457\",\"2263459\",\"2263467\",\"2263465\",\"2256701\",\"2256693\",\"2256695\",\"2256699\",\"2369430\",\"2411437\",\"2411451\",\"2411457\",\"2411499\",\"2411505\",\"2411509\",\"2376519\",\"2376535\",\"2376543\",\"2369474\",\"2369476\",\"2369482\",\"2411463\",\"2411467\",\"2411471\",\"2369454\",\"2369458\",\"2369460\",\"2376599\",\"2376635\",\"2376649\",\"2376731\",\"2376739\",\"2376747\",\"2376757\",\"2376787\",\"2376797\",\"2376811\",\"2376817\",\"2376825\",\"2376839\",\"2376841\",\"2376845\",\"2376861\",\"2376865\",\"2376901\",\"2376911\",\"2376919\",\"2376921\",\"2439047\",\"2439041\",\"2439049\",\"2376929\",\"2376937\",\"2376941\",\"2376995\",\"2376997\",\"2377003\",\"2376955\",\"2376959\",\"2376971\",\"2376943\",\"2376949\",\"2376951\",\"2401467\",\"2370634\",\"2373469\",\"2373471\"]","id":"98255"}}; 166 var io_customer_geolocation = ""; 167 var io_customer_ip = "57.141.4.16"; 168 var io_delivery_methods_restrict = null; 169 var io_pagename = "Brincabrincas El Pariente"; 170 var io_categoryVariantImages = ""; 171 //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."; 172 jQuery( document ).ready(function() { 173 174 //force all quote form links to use cart data 175 //removing back to cart shortcode as this needs to only be done if cart is not empty IO-22561 176 /* 177 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 178 headerBookButton.addClass("ioCart_link"); 179 headerBookButton.attr("href", "javascript:;"); 180 */ 181 182 183 let last_cat_name = ""; 184 let ioTrigger = false;
185 jQuery(".io_all_item_cat").each(function() { 186 current_cat_name = jQuery(this).html(); 187 if(last_cat_name !== current_cat_name) { 188 jQuery(this).show(); 189 ioTrigger = true; 190 } 191 last_cat_name = current_cat_name; 192 }); 193 194 // Setup gen page blocks 195 let io_divs = document.querySelectorAll(".io_item2_list, .io_item2_listcat, .io_item2_listrent, .io_all_item_cat"); 196 let io_divscat = document.querySelectorAll(".io_item2_listcat"); 197 let io_divsrent = document.querySelectorAll(".io_item2_listrent"); 198 let io_divcat = document.querySelector(".io_catdiv2"); 199 let io_pcc = document.querySelector(".page-content"); 200 let io_html; 201 202 if (io_divs.length > 0) { 203 for (let i of io_divs) { 204 if(i.parentNode.className.indexOf("io_mm_") === -1){ 205 io_divcat.appendChild(i); 206 } 207 } 208 if(io_divcat!==null) io_divcat.style.display = "grid"; 209 } 210 211 if (ioTrigger) { 212 let pageBlock = document.querySelector(".io_catdiv2"); 213 pageBlock.classList.add("elementor-widget-heading"); 214 let scanRes = pageBlock.querySelectorAll(".io_item2_listrent"); 215 pageBlock.style.display = "block"; 216 pageBlock.style.margin = "auto"; 217 pageBlock.style.textAlign = "center"; 218 pageBlock.style.marginLeft = "5px"; 219 pageBlock.style.marginRight = "5px"; 220 for (let i of scanRes) { 221 i.style.display = "inline-block"; 222 i.style.marginLeft = "5px"; 223 i.style.marginRight = "5px"; 224 } 225 } 226 227 /* fix font color on older sites */ 228 if(jQuery("#cartData").css("background-color")=="rgb(35, 36, 37)"){ 229 jQuery("#cartData").css("color","white"); 230 } 231 });</script>
231<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:;" 232 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow" 233 style="text-decoration: none;">Apply</a></div><div class="elementor-widget-button" style="padding:10px;display:inline-block;"> <a onclick="calCancel()" href="javascript:;" 234 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow simpleCart_cancel" 235 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();
235" 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>
235<script>/* configurable globals */ 236 var start_default = "11:00 am"; 237 if(io_default_start_time != "") start_default = io_default_start_time; 238 var end_default = "3:00 pm"; 239 if(io_default_end_time != "") end_default = io_default_end_time; 240 241 if(io_user_currency){ 242 var currency = io_user_currency; 243 } else{ 244 var currency = "USD"; 245 } 246 247 if(io_user_country){ 248 var country = io_user_country; 249 } else{ 250 var country = "US"; 251 } 252 253 254 var timeFormat = "g:i a"; 255 if(io_cart_time_format != "") timeFormat = io_cart_time_format; 256 var dateFormat = "m/d/yy"; 257 if(io_cart_date_format != "") dateFormat = io_cart_date_format; 258 259 var restrictTimes = false; 260 if(io_restrict_times === "on") restrictTimes = true; 261 var restrictTimeStart = start_default; 262 if(io_restrict_time_start != "") restrictTimeStart = io_restrict_time_start; 263 var restrictTimeEnd = end_default; 264 if(io_restrict_time_end != "") restrictTimeEnd = io_restrict_time_end; 265 266 267 var multi_day = true; 268 if(io_multidayquote === "off" || io_cartdayselect == "Single Day") multi_day = false; 269 var in_cart_upsell = false; 270 if(io_incartupsell === "on") in_cart_upsell = true; 271 var io_distance_charge = false; 272 if(io_distancecharge === "on") io_distance_charge = true; 273 274 /* other globals */ 275 var pallet_color1 = ""; /* set in onready */ 276 /* track the date start/end of calendar clicking */ 277 var click_count = 0; 278 279 /* for configuring upsell carosel in cart */ 280 var cart_carousel_set = false; 281 282 /* for checking when we remove an item from the cart */ 283 var last_remove = 0; 284 var last_upsell_call = 0; 285 286 /* for buffering cart qty changes checkAvail calls for qty change only */ 287 var last_checkAvail_call = 0; 288 289 /* for cart loading animation */ 290 var io_cart_loading_active = false; 291 var io_cart_loading_count = 0; 292 var io_cart_loading_fallback_timer = null; 293 294 /*var start_default = "11:00"; 295 var end_default = "15:00"; 296 var currency = "EUR"; 297 var timeFormat = "G:i"; 298 var dateFormat = "d/m/yy";*/ 299 300 301 /* For weekday weekend pricing */ 302 var use_weekday_weekend = false; 303 if(io_weekEndPrice == "on") use_weekday_weekend = true; 304 305 /* Accessory and Upsell Prices */ 306 var show_accessory_price = false; 307 if(io_accessory_price == "on") show_accessory_price = true; 308 var show_upsell_price = false; 309 if(io_upsell_price == "on") show_upsell_price = true; 310 311 /* For customer geolocation shortcode */ 312 var storage_key = 'io_customer_location'; 313 314 /*<editor-fold defaultstate="collapsed" desc="On Ready">*/ 315 jQuery(document).ready(function () { 316 pallet_color1 = "var( --e-global-color-accent,green )"; 317 if(pallet_color1=="rgba(0, 0, 0, 0)" || pallet_color1=="rgb(255, 255, 255)") pallet_color1="rgb(25, 147, 35)"; 318 319 /*<editor-fold defaultstate="collapsed" desc="SimpleCart Init">*/ 320 simpleCart({ 321 currency: currency, 322 cartColumns: [{ 323 view: "image", 324 attr: "image", 325 label: "Image" 326 }, 327 { 328 attr: "name", 329 label: "Name" 330 }, 331 { 332 attr: "encoded", 333 label: false 334 }, 335 { 336 attr: "rentalid", 337 label: false 338 }, 339 { 340 attr: "availability", 341 label: false 342 }, 343 { 344 view: "decrement", 345 label: false, 346 text: "<i class='fas far fa-minus-square' style='color:" + pallet_color1 + "'></i>" 347 }, 348 { 349 view: "calculate_area", 350 label: false 351 }, 352 { 353 view:"input", 354 attr:"quantity" 355 356 }, 357 { 358 attr: "qtyincrement", 359 label: false 360 }, 361 { 362 attr: "inputtype", 363 label: false 364 }, 365 { 366 attr: "qtytype", 367 label: false 368 }, 369 { 370 attr: "vendorid", 371 label: false 372 }, 373 { 374 view: "increment", 375 label: false, 376 text: "<i class='fas far fa-plus-square' style='color:" + pallet_color1 + "'></i>" 377 }, 378 { 379 attr: "price", 380 label: "Price", 381 view: 'currency' 382 }, 383 { 384 view: "remove", 385 label: false,
386 text: "<i class='fas fa-trash' style='color:" + pallet_color1 + "'></i>" 387 }, 388 { 389 attr: "total", 390 label: "SubTotal", 391 view: 'currency' 392 }, 393 { 394 attr: "timeslots", 395 label: false 396 }, 397 { 398 attr: "timeslots-orig", 399 label: false 400 }, 401 { 402 attr: "href", 403 label: false 404 }, 405 { 406 attr: "linkqty", 407 label: false 408 }, 409 { 410 attr: "acc_dd_parent_limit", 411 label: false 412 } 413 ], 414 checkout: { 415 type: "SendForm", 416 method: "GET", 417 url: io_wp_local_path+"/io_quoteform/", 418 extra_data: { 419 /* name: decodeURIComponent("Brincabrincas El Pariente".replace(/[+]/gi, " ")), */ 420 clear_rentals: "1", 421 selected_only: "1", 422 wp_checkout: "1", 423 startdate: "", 424 enddate: "", 425 starttime: "", 426 endtime: "", 427 io_custguid: "" 428 } 429 } 430 }); 431 432 simpleCart.bind('update', cart_onUpdate); 433 simpleCart.bind('beforeSave', cart_hideTimepickerWrapper); 434 simpleCart.bind('beforeRemove', cart_beforeRemove); 435 simpleCart.bind('afterRemove', cart_afterRemove); 436 simpleCart.bind('afterQtyChange', cart_afterQtyChange); 437 simpleCart.bind('beforeCheckout', cart_beforeCheckout); 438 simpleCart.bind('afterAdd', cart_afterAdd); 439 simpleCart.bind('beforeAdd', cart_beforeAdd); 440 simpleCart.bind('load', cart_afterLoad) 441 /*</editor-fold>*/ 442 443 /* showAvail(""); */ 444 let io_star_pic = document.querySelector("#io_star_pic"); 445 if (io_star_pic != null) { 446 let io_star_src = io_star_pic.src; 447 if (io_star_src.indexOf("0star") > -1 || io_star_src.indexOf("1star") > -1 || io_star_src.indexOf("2star") > -1 || 448 io_star_src.indexOf("3star") > -1) { 449 io_star_pic.style.display = "none"; 450 } 451 } 452 453 /*<editor-fold desc="Build Thumb Images">*/ 454 /* build multiple thumb images */ 455 456 /*</editor-fold>*/ 457 458 /*<editor-fold desc="Set up Accessories">*/ 459 /* Add Add To Cart Buttons */ 460 let button_add = document.querySelector("#bookNowBtn"); 461 var main_id = 0; 462 if(jQuery(".io_product_container .item_rentalid")){ 463 main_id = jQuery(".io_product_container .item_rentalid").first().text(); 464 } 465 /* if main item is dd but not pkg (linen code) */ 466 if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){ 467 /* if order is defined, then reorder here. */ 468 var acc_cls = jQuery('.io_product_accessories') 469 acc_cls.hide(); 470 let pkg = document.querySelector(".io_product_acc_pkg"); 471 if(pkg==undefined){ 472 pkg = document.createElement("div"); 473 pkg.classList.add("io_product_acc_pkg"); 474 pkg.style.textAlign = "center"; 475 acc_cls.after(pkg); 476 } 477 for (let [key, value] of acc_obj_relate) { 478 elem = getAccElem(key,main_id); 479 if(elem){ 480 btn = makeAccBtn(elem,main_id); 481 pkg.append(btn); 482 } 483 484 } 485 let line = document.createElement("div"); 486 line.innerHTML = "<br>"; 487 pkg.append(line.cloneNode(true)); 488 for (let [key, value] of acc_obj_relate) { 489 for (key2 in acc_obj_relate.get(key)) { 490 if(Object.keys(value[key2]).length > 0){ 491 /* 3rd level */ 492 pkg.append(line.cloneNode(true)); 493 for (key3 in acc_obj_relate.get(key)[key2]) { 494 elem = getAccElem(key3,key2); 495 if(elem){ 496 btn = makeAccBtn(elem,key2); 497 btn.style.display = "none"; 498 pkg.append(btn); 499 } 500 } 501 }else{ 502 elem = getAccElem(key2,key); 503 if(elem){ 504 btn = makeAccBtn(elem,key); 505 btn.style.display = "none"; 506 pkg.append(btn); 507 } 508 509 } 510 } 511 } 512 }else { 513 let access_array = document.querySelectorAll(".io_acc_li"); 514 let count = 0; 515 for (let i of access_array) { 516 let path = i.id.replace("io_acc_",""); 517 count++; 518 let newButton = button_add.cloneNode(true); 519 newButton.id = button_add.id + count; 520 newButton.classList.remove("elementor-animation-grow"); 521 newButton.classList.add("elementor-animation-shrink"); 522 523 let path_arr = path.split("_"); 524 let pid = parseInt(path_arr[0]); 525 let this_id = parseInt(path_arr[1]); 526 if(path_arr.length==1) pid=0; 527 528 if(jQuery("#io_acc_accessorydd_"+path).first().text()==1){ 529 /* display different to provide choices in dd */ 530 //main_id = pid; 531 }else{ 532 /* hide accessories inside a pkg when under an accessory choice item until clicked */ 533 if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){ 534 }else{ 535 /* jpa - not finished/tested yet */ 536 /*jQuery("#io_acc_"+path).hide();*/ 537 } 538 /* Fix broken images for accessories. */ 539 let img_box = document.querySelectorAll(".io_acc_li_img_thumb"); 540 let firstImg = true; 541 let lastAcc = ""; 542 for (let i of img_box) { 543 if(lastAcc=="") lastAcc = i.id;
544 if(lastAcc!=i.id){ 545 lastAcc = i.id; 546 firstImg = true; 547 } 548 let io_img_src = i.src; 549 if(io_img_src!==null) io_img_src = io_img_src.toLowerCase(); 550 let io_img_datasrc = i.getAttribute("data-src"); 551 if(io_img_datasrc===null){ 552 io_img_datasrc = ""; 553 }else{ 554 io_img_datasrc = io_img_datasrc.toLowerCase(); 555 } 556 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)){ 557 i.style.display = "none"; 558 }else if(!firstImg && jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()!=1){ 559 i.style.display = "none"; 560 } 561 firstImg = false; 562 } 563 if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){ 564 /* Make the accessory category look more mike a label. */ 565 jQuery("#iothumb_"+main_id+"_"+pid).hide(); 566 jQuery("#io_acc_"+main_id+"_"+pid).css("border", "none"); 567 jQuery("#io_acc_"+main_id+"_"+pid).css("width", "100%"); 568 jQuery("#io_acc_"+main_id+"_"+pid).css("margin-bottom", "5vh"); 569 jQuery("#io_acc_"+main_id+"_"+pid).css("box-shadow", "none"); 570 jQuery("#io_acc_shortname_"+pid).css("font-weight", "bold"); 571 jQuery("#io_acc_shortname_"+pid).css("position", "absolute"); 572 /* Make this auto selected to fix an issue where we can not add to cart if this item is 573 a child of another hidden accessory on screen */ 574 jQuery("#io_acc_"+main_id+"_"+pid).prop("selected", true); 575 accessory_cat_text = jQuery("#io_acc_shortname_"+pid).first().text(); 576 /* This is necessary to make sure there are not multiple colons. */ 577 if(!accessory_cat_text.includes(":")){ 578 jQuery("#io_acc_shortname_"+pid).text(accessory_cat_text+":"); 579 } 580 /* Remove Href so we do not open images on click for dd accessories. */ 581 jQuery("[id^=io_acc_imgbig_"+pid+"_]").removeAttr("href"); 582 583 /* Get the accessory limit for this set of acessories, then set up click events. */ 584 /* Unbind is used to prevent cascading calls. */ 585 accLmt = parseInt(jQuery("#io_acc_accessorylimit_"+main_id+"_"+pid).prop("textContent")); 586 jQuery("[id^=io_acc_"+pid+"_]").unbind("click").click({pid: pid, accLmt: accLmt}, accDDClicked); 587 jQuery("[id^=io_acc_"+pid+"_]").css("cursor", "pointer"); 588 /* Set up the slected property of all children accessories. Default to false. */ 589 jQuery("[id^=io_acc_"+pid+"_]").prop("selected", false); 590 /* We need to add a hidden button so we can simulate a click on add_item for the cart. */ 591 let newButton = button_add.cloneNode(true); 592 newButton.id = button_add.id + count; 593 newButton.classList.remove("elementor-animation-grow"); 594 newButton.setAttribute("style", "display: none !important"); 595 i.appendChild(newButton); 596 }else{ 597 let button_wrap = document.createElement("div"); 598 button_wrap.classList.add("elementor-widget-button"); 599 button_wrap.classList.add("io_access_button"); 600 button_wrap.appendChild(newButton); 601 let req = false; 602 if(jQuery("#io_acc_required_"+path).first().text()>0) req = true; 603 if(!req){ 604 i.appendChild(button_wrap); 605 }else{ 606 var textnode = document.createTextNode("Included"); 607 i.appendChild(textnode); 608 } 609 } 610 } 611 } 612 } 613 /*</editor-fold>*/ 614 615 let upsell_array = document.querySelectorAll(".io_upsell_li"); 616 count = 0; 617 for (let i of upsell_array) { 618 count++; 619 let newButton = button_add.cloneNode(true); 620 newButton.id = button_add.id + count; 621 newButton.classList.remove("elementor-animation-grow"); 622 newButton.classList.add("elementor-animation-shrink"); 623 624 let button_wrap = document.createElement("div"); 625 button_wrap.classList.add("elementor-widget-button"); 626 button_wrap.classList.add("io_upsell_button"); 627 button_wrap.appendChild(newButton); 628 i.appendChild(button_wrap); 629 } 630 631 if(io_deliverymethod == "on" && jQuery(".calDeliveryMethodLabel").length==0){ 632 let delivery_method_container = jQuery("#ioDeliveryMethodContainer").first(); 633 delivery_method_container.append('<span class="calDeliveryMethodLabel">Select Delivery Method</span>'); 634 let delivery_method_html = '<select class="ioDeliveryMethods" onchange="deliveryMethodSelected()">'; 635 let delivery_methods = Object.keys(io_delivery_methods) 636 for(const index in delivery_methods){ 637 if(!io_delivery_methods_restrict){ 638 delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>'; 639 if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14); 640 }else if( !io_delivery_methods_restrict.includes( io_delivery_methods[ delivery_methods[index] ]["id"] ) ){ 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 } 644 } 645 delivery_method_container.append(delivery_method_html); 646 delivery_method_container.show(); 647 if(getCookie("io_delivery_method")){ 648 jQuery(".ioDeliveryMethods").val(getCookie("io_delivery_method")); 649 } 650 }else{
651 setCookie("io_delivery_method", "", 14); 652 } 653 654 let allow_same_day = 1; 655 if(io_cartAllowSameDay == "on"){ 656 allow_same_day = 0; 657 } 658 659 /*<editor-fold desc="Cart Calandar and Time Settings Setup">*/ 660 //var fullmonth_array = jQuery.datepicker.regional["en"].monthNames; 661 jQuery("#cartCalendar").datepicker({ 662 changeMonth: true, 663 changeYear: true, 664 //monthNamesShort : fullmonth_array, 665 dateFormat: dateFormat, 666 rangeSelect: true, 667 numberOfMonths: 1, 668 stepMonths: 1, 669 prevText: "<< Previous Months", 670 nextText: "Next Months >>", 671 speed: "fast", 672 showOn: "both", 673 onChangeMonthYear: cal_onChangeMonthYear, 674 onSelect: cal_onSelect, 675 buttonText: "Calendar", 676 minDate: allow_same_day, 677 firstDay: 0 678 }); 679 jQuery(".ui-datepicker-trigger").hide(); 680 if(restrictTimes){ 681 jQuery(".timepicker").timepicker({ 682 startTime: new Date(0, 0, 10, 0, 0, 0), 683 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 684 minTime:restrictTimeStart, 685 maxTime:restrictTimeEnd, 686 /*show24Hours: $show24Hours,*/ 687 timeFormat: timeFormat, 688 separator: ":", 689 className: "elementor-widget-text-editor", 690 step: 15, 691 disableTouchKeyboard: true 692 }).keypress(function(e){ 693 e.preventDefault(); 694 }); 695 } else{ 696 jQuery(".timepicker").timepicker({ 697 startTime: new Date(0, 0, 10, 0, 0, 0), 698 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 699 /*show24Hours: $show24Hours,*/ 700 timeFormat: timeFormat, 701 separator: ":", 702 className: "elementor-widget-text-editor", 703 step: 15, 704 disableTouchKeyboard: true 705 }); 706 } 707 708 /* if we have company wide timeslots, alter time select in cart. Do this only if we are set to single day only */ 709 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 710 let time_select_container = jQuery("#ioCartTimeSelectContainer").first(); 711 time_select_container.empty(); 712 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" />' 713 time_select_container.append(selected_date_html); 714 time_select_container.append("<br>") 715 time_select_container.append('<span class="calTimeLabel">Select Timeslot</span>'); 716 let timeslot_html = '<select class="ioCartCompanyTimeslots">'; 717 for(i=0; i<io_company_timeslots.length; ++i){ 718 timeslot_html += io_company_timeslots[i]; 719 } 720 timeslot_html += "</select>" 721 time_select_container.append(timeslot_html); 722 723 } 724 725 // Timeslot element on Quote Form 726 const timeslotSelectElement = jQuery(".controls select[name=timeslot]"); 727 728 /* jQuery( ".datepicker" ).datepicker({dateFormat: "m/d/yy",minDate:0}); */ 729 /* jQuery( ".datepicker" ).val(getCookie("checkDate")); */ 730 start_date = getCookie("io_dateStart"); 731 end_date = getCookie("io_dateEnd"); 732 start_time = getCookie("io_timeStart"); 733 end_time = getCookie("io_timeEnd"); 734 jQuery("input[name=dateStart]").val(start_date); 735 jQuery("input[name=dateEnd]").val(end_date); 736 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 737 jQuery(".ioCartCompanyTimeslots").val(getCookie("company_timeslot_selected")); 738 // Set it on the quote page too. 739 timeslotSelectElement.val(getCookie("io_company_timeslot_selected")); 740 } else{ 741 jQuery("input[name=timeStart]").val(start_time); 742 jQuery("input[name=timeEnd]").val(end_time); 743 } 744 745 timeslotSelectElement.on('change', function() { 746 // IO-31167: Upon timeslot change on Quote Form, 747 // update timeslot cookie value for persistence 748 if(this.value) { 749 setCookie('io_company_timeslot_selected', this.value, 14); 750 } 751 }); 752 753 if (jQuery("input[name=dateEnd]").val() != "") {
754 setCalBackground(); 755 jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total())); 756 if(getCookie("io_dateApplied") === "true") calCancel(); 757 else { 758 jQuery("input[name=dateStart]").val(getCookie("io_dateStart")); 759 jQuery("input[name=dateEnd]").val(getCookie("io_dateEnd")); 760 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 761 jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected")); 762 } 763 else if(io_force_blank_timepickers == "on") 764 { 765 setCookie("io_timeStart", "", 14); 766 setCookie("io_timeEnd", "", 14); 767 jQuery('[name=timeStart]').val(""); 768 jQuery('[name=timeEnd]').val(""); 769 } 770 else{ 771 jQuery("input[name=timeStart]").val(getCookie("io_timeStart")); 772 jQuery("input[name=timeEnd]").val(getCookie("io_timeEnd")); 773 } 774 775 jQuery(".changeDateLinkWrapper").hide(); 776 } 777 } 778 /*</editor-fold>*/ 779 780 jQuery("#io-dialog").dialog({ 781 autoOpen: false, 782 resizable: false, 783 modal: true, 784 dialogClass: "noTitleStuff", 785 width: 350, 786 open: function () { 787 jQuery(".ui-widget-overlay").bind("click", function () { 788 jQuery("#io-dialog").dialog("close"); 789 }) 790 } 791 }); 792 793 /* change jquery calendar next/prev buttons to fa arrows w/matching site color */ 794 jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1); 795 jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").css("color", pallet_color1); 796 797 /* hide sections if not set */ 798 if(jQuery(".io_product_circuits_right").first().text()=="0"){jQuery(".io_product_circuits_right,.io_product_circuits_left").hide();} 799 if(jQuery(".io_city_list").html()==""){jQuery(".io_landingpages").hide();} 800 /* using this instead as it will handle custom ones added */ 801 let io_field_valbox = document.querySelector(".io_product_infobox"); 802 if (io_field_valbox != null || io_field_valbox != undefined) { 803 let io_field_valarr = io_field_valbox.querySelectorAll(".io_product_detail_box"); 804 for (let i of io_field_valarr) { 805 let check = i.querySelector("p:nth-child(2)"); 806 if (check != null && check.innerText == "") i.style.display = "none"; 807 } 808 } 809 810 /* Hide description if there is no description */ 811 desc_box = document.querySelector(".io_product_desc") 812 if(desc_box != null && desc_box.innerText.length == 0 && desc_box.innerHTML.length == 0){ 813 desc_detail_box = desc_box.parentElement; 814 desc_detail_box.style.display = "none"; 815 } 816 817 if(document.querySelector(".io_product_reviewbox")!=null){ 818 if (document.querySelector(".io_product_reviewbox").innerText == "") { 819 if(document.querySelector(".io_star_rating")!=null) document.querySelector(".io_star_rating a").style.display = "none"; 820 } 821 } 822 823 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 824 let regex = new RegExp("^io_product_price_.*_" + rid + "$"); 825 for (const price_index in io_prices){ 826 if(regex.test(io_prices[price_index])){ 827 use_weekday_weekend = false; 828 } 829 } 830 831 /* hide end date input. */ 832 if(!multi_day){ 833 /* TODO: Need to wait and see if this is necessary. If so needs to be more involved than this. */ 834 /* jQuery("input[name=dateEnd]").style("visibility", "hidden"); */ 835 } 836 /* Call page avail now so we can display live price if its enabled */ 837 setTimeout(function(){ 838 if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){ 839 jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 840 checkAvailPageOnly(); 841 }else{ 842 checkAvailPageOnly(); 843 } 844 },50); 845 846 /* Adjust picbox for header heights */ 847 setTimeout(adjustPicBoxForHeader,500); 848 849 /* Show buttons for distance charge check if the setting is on. Hide or show map button if applicable*/ 850 if(io_distance_charge){ 851 jQuery(".delivery_charge_check_container").show(); 852 jQuery(".calc_price_with_map_container").hide(); 853 jQuery(".checkDeliveryCartContainer").show(); 854 } else { 855 jQuery(".delivery_charge_check_container").hide(); 856 jQuery(".calc_price_with_map_container").hide(); 857 jQuery(".checkDeliveryCartContainer").hide(); 858 } 859 if(io_brand=="EH"){ 860 jQuery(".delivery_charge_check_container").hide(); 861 jQuery(".eh_additional_description").show(); 862 } 863 if(jQuery(".io_product_infobox .item_inputtype").text() === "Map"){ 864 jQuery(".delivery_charge_check_container").hide(); 865 jQuery(".checkDeliveryCartContainer").hide(); 866 jQuery(".calc_price_with_map_container").show(); 867 } 868 869 /* If we have delivery set in cookie, be sure to show the charge in the cart. */ 870 if(getCookie("io_deliveryFee") && simpleCart.items().length > 0) { 871 setDeliverySubtotal(getCookie("io_deliveryFee")); 872 jQuery("#deliverSubtotalContainer").show(); 873 jQuery("#checkDeliveryMessage").hide(); 874 } else{ 875 jQuery("#deliverSubtotalContainer").hide(); 876 } 877 878 /* moved back here for IO-22561 */ 879 if(simpleCart.items().length > 0){ 880 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 881 headerBookButton.addClass("ioCart_link"); 882 headerBookButton.attr("href", "javascript:;"); 883 } 884 jQuery(".cartInfo").unbind("click").one("click", function(event){ 885 event.stopPropagation(); 886 event.stopImmediatePropagation(); 887 cartShow(); 888 }); 889 jQuery(".ioCart,.ioCart_link").unbind("click").one("click", function(event){ 890 event.stopPropagation(); 891 event.stopImmediatePropagation(); 892 cartShow(); 893 }); 894 895 /* hide if click outside cart */ 896 jQuery(document).mouseup(function(e){ 897 var container = jQuery("#cartPopover"); 898 var cartButton = jQuery(".cartInfo, .ioCart, .ioCart_link"); 899 var addButton = jQuery(".item_add"); 900 var timePicker = jQuery(".ui-timepicker-wrapper"); 901 902 if(jQuery(".cartInfo, .ioCart, .ioCart_link").hasClass("open")){ 903 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){ 904 cartHide(); 905 } 906 } 907 }); 908 909 if(!getCookie("io_state") && io_default_state){
910 setCookie("io_state", io_default_state, 14); 911 } 912 if(country != "US") { 913 jQuery("#io_cd_state").replaceWith('<input id="io_cd_state" style="display: table-cell" name="state" type="text"></input>'); 914 jQuery("#io_cdl_zip_label").text("Postal code"); 915 if(country == "CA"){ 916 jQuery("#io_cdl_state_label").text("Province"); 917 } else if(country == "AU"){ 918 jQuery("#io_cdl_city_label").text("Suburb"); 919 } 920 } else{ 921 jQuery("#io_cd_zip").attr("type", "number"); 922 } 923 /* Set up on change events to stop end timepickers from allowing users to pick times before start time */ 924 setTimeout(restrictEndTimepickers, 500); 925 if(io_hide_end_time == "on" && io_default_duration > 0){ 926 jQuery('[name="timeEnd"]').parent().hide(); 927 // Hide end time stuff on checkout page and in the text. 928 jQuery(".io_event_body_time .control-group:nth-child(2)").hide(); 929 jQuery(".io_event_body_time_display_text").text(jQuery(".io_event_body_time_display_text").text().replace(/\s*→.*/, "")) 930 jQuery('[name="timeStart"]').change(function(){ 931 const regex = /^(\d{1,2}):(\d{2})(?:\s*([AP]M))?$/i; 932 const match = this.value.match(regex); 933 934 let hours = parseInt(match[1], 10); 935 const minutes = parseInt(match[2], 10); 936 const period = match[3] ? match[3].toUpperCase() : null; 937 938 if (period) { 939 if (period === "PM" && hours !== 12) hours += 12; 940 if (period === "AM" && hours === 12) hours = 0; 941 } 942 943 const baseDate = new Date(1970, 0, 1, hours, minutes); 944 const newTime = new Date(baseDate.getTime() + io_default_duration * 3600000); 945 946 if (period) { 947 // 12-hour 948 let newHours = newTime.getHours(); 949 const newMinutes = newTime.getMinutes(); 950 const newPeriod = newHours >= 12 ? "PM" : "AM"; 951 newHours = newHours % 12; 952 if (newHours === 0) newHours = 12; 953 let end_time = `${newHours}:${newMinutes.toString().padStart(2, "0")} ${newPeriod}`; 954 jQuery('[name="timeEnd"]').val(end_time); 955 } else { 956 // 24 hour 957 let end_time = `${newTime.getHours().toString().padStart(2, "0")}:${newTime.getMinutes().toString().padStart(2, "0")}`; 958 jQuery('[name="timeEnd"]').val(end_time); 959 } 960 }); 961 } 962 963 /* If we have a custom message in cart, display it. */ 964 if(io_cart_message){ 965 show_cart_message(); 966 } 967 968 /* code for day select in cart */ 969 if(io_cartdayselect == "dropdown_options" && io_multidayquote === "on"){ 970 saved_whatday = getCookie("io_whatday"); 971 if(saved_whatday) jQuery("#whatday").val(saved_whatday); 972 endDisplay(); 973 setCalBackground(); 974 } else{ 975 jQuery("#div-overnight").hide(); 976 jQuery("#whatday").val(""); 977 } 978 979 checkRestrictedDeliveries() 980 /* If we are using the information gathering tool, we do not want to show this message. */ 981 if( live_pricing_is_on() && io_info_required == "off" ){ 982 if(!event_time_set() && io_always_display_live_price != "on"){ 983 jQuery("#item_live_price_time_set_message").show(); 984 }else{ 985 jQuery("#item_live_price_time_set_message").hide(); 986 } 987 } 988 989 990 /* Check if information gathering header exists. If it does, Remove set even button and add some classes on onclicks */ 991 if(jQuery("#ioInfoHeader").length){ 992 remove_set_event_buttton(); 993 add_classes_and_onClicks(); 994 header_increment_step(); 995 } 996 997 jQuery(".io_acc_li").each(function() { 998 if(jQuery(this).find(".item_required").first().text() > 0 && jQuery(this).find(".item_accessorydd").first().text() == 1){ 999 jQuery(jQuery(jQuery(this).parent()).prev()).appendTo(".io_product_requiredDD_accessories"); 1000 jQuery(jQuery(this).parent()).appendTo(".io_product_requiredDD_accessories"); 1001 jQuery(".io_product_requiredDD_accessories").show(); 1002 } 1003 }); 1004 1005 if(jQuery(".io_product_accessories .io_acc_li").length == 0) jQuery(".io_product_accessories").hide(); 1006 1007 /* Hide the cart add button for items with required accessories on category page */ 1008 jQuery(".item_hasRequiredAcc").each(function() { 1009 if (this.innerText == '1') { 1010 let rental_id_element = jQuery(this).parent().find(".item_rentalid")[0]; 1011 let addCartButton = jQuery(".io_item2_list_inner .add_cart_" + rental_id_element.innerText).find('.io_button'); 1012 addCartButton.removeClass("item_add"); 1013 addCartButton.html('<i class="fas fa-arrow-right"></i>'); 1014 1015 let itemHref = jQuery(this).parent().find(".item_href").text(); 1016 addCartButton.attr('href', itemHref); 1017 } 1018 }); 1019 1020 1021 /* If they have same day selection allowed, need to update checkout page datepicker on delay to make sure it works */ 1022 if(io_cartAllowSameDay == "on"){ 1023 setTimeout(allow_same_day_select_on_checkout, 500); 1024 } 1025 1026 if(io_info_required_data && io_info_required == "on"){ 1027 let io_required_data = io_info_required_data; 1028 jQuery("#ioAdditonalInformationContainer").show(); 1029 for (const [data, value] of Object.entries(io_required_data)) { 1030 if(value == 1){ 1031 jQuery("#io_info_modal_"+data).css("display", "inline-flex") 1032 jQuery("#io_im_"+data).val(getCookie(data)); 1033 } 1034 } 1035 show_or_hide_required_info_message() 1036 } 1037 if(jQuery(".bootstrap-timepicker").length == 0) { 1038 if (!/Mobi|Android/i.test(navigator.userAgent)) { 1039 jQuery("#cartPopover").scroll(function () { 1040 jQuery("[name=timeStart]").timepicker("hide"); 1041 jQuery("[name=timeEnd]").timepicker("hide"); 1042 }); 1043 jQuery(window).scroll(function () { 1044 jQuery("#cartPopover [name=timeStart]").timepicker("hide"); 1045 jQuery("#cartPopover [name=timeEnd]").timepicker("hide"); 1046 }); 1047 } 1048 } 1049 1050 if(jQuery(".io_product_infobox .item_inputtype").text() == "Map"){
1051 simpleCart.items().forEach(function (item, index){ 1052 if(item.get("rentalid") === jQuery(".io_product_infobox .item_rentalid").text()){ 1053 if(item.get("quantity") > 1){ 1054 let units; 1055 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 1056 units = "sq meters" 1057 if(country === "US") units = "sq feet" 1058 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 1059 units = "meters" 1060 if(country === "US") units = "feet" 1061 } 1062 set_price_on_item_page(units, item.get("quantity")); 1063 } 1064 } 1065 }); 1066 } 1067 /* IO-21808 */ 1068 jQuery(".io_product_price_box").each(function() { 1069 let classes = jQuery(this).attr("class"); 1070 jQuery(this).attr("class", classes.replace(":", "_")); 1071 }); 1072 1073 /* Set time instructions (IO-21496) */ 1074 set_cart_time_instructions(); 1075 1076 if(io_accessory_select === "on"){ 1077 if(jQuery(".io_product_acc_pkg").children().length > 0){ 1078 let main_rental_id = jQuery(".item_rentalid").text(); 1079 let sel_div = jQuery("<div class=\"io_product_acc_pkg\" style=\"display:flex; margin-top:10px;\"></div>"); 1080 let sel = jQuery("<select class=\"io_product_acc_pkg\" onchange=\"accOnClick(this)\" />"); 1081 sel.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>") 1082 jQuery("[id^=io_acc_shortname_"+main_rental_id+"]").each(function(){ 1083 sel.append("<option value="+this.id+">"+this.innerHTML+"</option>") 1084 if(this.id.split("_").length > 4){ 1085 let split_id = this.id.split("_"); 1086 let option_rental_id = split_id[split_id.length - 1]; 1087 let sel2 = jQuery("<select id=\"io_product_acc_pkg_sel_"+option_rental_id+"\" style=\"display:none; margin-left:5px;\" onchange=\"accOnClick(this)\" />"); 1088 sel2.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>") 1089 jQuery("[id^=io_acc_shortname_"+option_rental_id+"_]").each(function(){ 1090 sel2.append("<option value="+this.id+">"+this.innerHTML+"</option>") 1091 }); 1092 sel_div.append(sel2); 1093 } 1094 }); 1095 sel_div.prepend(sel); 1096 jQuery(".io_product_acc_pkg").replaceWith(sel_div); 1097 } 1098 } 1099 if(io_cart_party_planner_email === "on" && io_cart_party_planner_destination){ 1100 jQuery("#cartPartyBuilderEmailContainer").show() 1101 if(getCookie("io_email")){ 1102 jQuery("#cartPartyBuilderEmailInput").val(getCookie("io_email")); 1103 } 1104 } 1105 1106 if(io_brand == "PW"){ 1107 jQuery(".io_product_price_box").attr("style", "display: none !important;"); 1108 jQuery(".io_product_price_sqfoot").attr("style", "display: grid !important;"); 1109 } 1110 1111 setTimeout(simpleCart.init, 100); 1112 if(io_hide_zero == 1){ 1113 jQuery(".io_product_price_top_left").each(function (){ 1114 if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){ 1115 jQuery(this).parent().attr('style','display:none !important'); 1116 } 1117 }); 1118 jQuery(".io_product_price_left").each(function (){ 1119 if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){ 1120 jQuery(this).parent().attr('style','display:none !important'); 1121 } 1122 }); 1123 } 1124 if (io_categoryVariantImages == 'on'){ 1125 jQuery(".io_category_thumbox").show(); 1126 jQuery('.view-product-button').addClass('view-product-button2') 1127 } 1128 let giftcard_value = jQuery(".item_giftcardvalue"); 1129 if(giftcard_value && giftcard_value.text()){ 1130 jQuery(".delivery_charge_check_container").hide(); 1131 } 1132 1133 if (io_customer_geolocation == 'on') initializeGeolocation(); 1134 }); /*end of on-ready*/ 1135 /*</editor-fold>*/ 1136 1137 /*<editor-fold defaultstate="collapsed" desc="Helper Functions">*/ 1138 function phraseUpdateCount(inputElement) 1139 { 1140 //read the text and strip out spaces 1141 const fullText = inputElement.value; 1142 const lettersOnly = fullText.replace(/\s+/g, ""); 1143 const count = lettersOnly.length; 1144 1145 const cookieKey = inputElement.classList[0]; 1146 1147 document.querySelector(".item_quantity").textContent = count; 1148
1149 setCookie(cookieKey, fullText, 45); 1150 } 1151 function io_party_planner_email_submit(){ 1152 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,}))$/; 1153 let email = jQuery("#cartPartyBuilderEmailInput").val(); 1154 if(email){ 1155 if(email.match(valid_regex)){ 1156 setCookie("io_email", email, 14); 1157 window.open(io_cart_party_planner_destination, '_blank').focus(); 1158 }else{ 1159 jQuery("#cartPartyBuilderEmailWarning").show(); 1160 } 1161 }else{ 1162 jQuery("#cartPartyBuilderEmailWarning").show(); 1163 } 1164 } 1165 1166 function rid_in_batch(rid, batch_ids){ 1167 let result = batch_ids.filter(function(batch){ 1168 if(batch.includes(this)) return true; 1169 }, rid); 1170 return result 1171 } 1172 1173 function set_cart_time_instructions(){ 1174 /* Making it clearer that customers need to set the time in order to see pricing and availability. */ 1175 let instructions_container = jQuery("<p id=\"ioCartTimeInstructions\"></p>"); 1176 let instructions = ""; 1177 1178 if(multi_day){ 1179 instructions += "Select the event date or date range using the calendar"; 1180 }else{ 1181 instructions += "Select the event date using the calendar"; 1182 } 1183 instructions += "."; 1184 instructions_container.text(instructions); 1185 jQuery("#cartCalendar").append(instructions_container); 1186 } 1187 1188 function live_pricing_is_on(){ 1189 /* 1190 Checks to see if live pricing is on. Assumes it is on unless one of the following conditions: 1191 The setting Hide Live Price is off. 1192 The setting Show Weekend/Weekday Pricing is off. 1193 Delivery method pricing is enabled by default. 1194 We are on an item page that uses delivery method pricing. 1195 */ 1196 if(io_hide_live_prices != 1 || io_weekEndPrice != "on" || 1197 io_delivery_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"] || 1198 io_custom_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"]){ 1199 return false; 1200 } 1201 return true; 1202 } 1203 1204 function allow_same_day_select_on_checkout(){ 1205 jQuery(".jquery-datepicker").datepicker("option", "minDate", 0); 1206 } 1207 1208 function show_or_hide_required_info_message(){ 1209 if(io_info_required == "on"){ 1210 if(!all_info_provided()){ 1211 jQuery("#io_all_prices").hide(); 1212 jQuery("#item_additonal_info_open_message").show(); 1213 }else{ 1214 jQuery("#io_all_prices").show(); 1215 jQuery("#item_additonal_info_open_message").hide(); 1216 } 1217 } 1218 } 1219 1220 function all_info_provided(){ 1221 /* This is used for when the "Hide all pricing on page until information is provided" setting is on price settings. */ 1222 let all_data_provided = true; 1223 let io_required_data = io_info_required_data; 1224 for (const [data, value] of Object.entries(io_required_data)) { 1225 if(value == 1){ 1226 if(!getCookie(data)){ 1227 all_data_provided = false 1228 } 1229 } 1230 } 1231 1232 if(live_pricing_is_on() && !event_time_set()) { 1233 all_data_provided = false; 1234 } 1235 1236 return all_data_provided; 1237 } 1238 1239 function event_time_set(){ 1240 if(getCookie("io_timeStart") && 1241 getCookie("io_timeEnd") && 1242 getCookie("io_dateStart") && 1243 getCookie("io_dateEnd")){ 1244 return true; 1245 } else{ 1246 return false 1247 } 1248 } 1249 1250 function show_cart_message(){ 1251 message_container = jQuery("#cartCustomMessage"); 1252 message_container.html(io_cart_message); 1253 message_container.show(); 1254 } 1255 1256 function deliveryMethodSelected(){ 1257 setCookie("io_delivery_method", jQuery(".ioDeliveryMethods option:selected").text(), 14); 1258 checkRestrictedDeliveries(); 1259 } 1260 1261 function adjustPicBoxForHeader(){ 1262 /* For some reason its hard to get css with querySelector so we use jQuery to get the picbox. */ 1263 pic_box = jQuery(".io_product_picbox"); 1264 io_header = document.querySelector(".io_header"); 1265 if(pic_box != null && pic_box.css("position") == "sticky"){ 1266 if(io_header != null){ 1267 header_height = io_header.offsetHeight; 1268 pic_box.css("top", (10+header_height).toString()+"px"); 1269 } 1270 else{ 1271 possible_headers = document.querySelectorAll("header,section")
1272 possible_headers.forEach((ele) =>{ 1273 if(ele.style.top == "0px" && (ele.style.position == "fixed" || ele.style.position == "sticky")){ 1274 header = ele; 1275 header_height = header.offsetHeight; 1276 pic_box.css("top", (10+header_height).toString()+"px"); 1277 1278 } 1279 }); 1280 } 1281 } 1282 } 1283 function cart_times_all_set(){ 1284 if(jQuery("#ioCartTimeSelectContainer [name=dateStart]").val() == ""){ 1285 return false; 1286 } 1287 if(io_hidetimes === "off" || io_hidetimes === ""){ 1288 if(jQuery("#ioCartTimeSelectContainer [name=timeStart]").val() == ""){ 1289 return false; 1290 } 1291 if(jQuery("#ioCartTimeSelectContainer [name=timeEnd]").val() == ""){ 1292 return false; 1293 } 1294 } 1295 1296 return true; 1297 } 1298 function checkRestrictedDeliveries(){ 1299 let items = simpleCart.items() 1300 let restrictions_found = false; 1301 for(i in items){ 1302 let rid = items[i].get("rentalid"); 1303 if(typeof jQuery(".ioDeliveryMethods").val() != "undefined"){ 1304 if(io_delivery_methods[jQuery(".ioDeliveryMethods").val()]["restricted"].includes(rid)){ 1305 jQuery("#deliveryMethodWarning").show(); 1306 restrictions_found = true; 1307 } 1308 } 1309 } 1310 if(!restrictions_found){ 1311 jQuery("#deliveryMethodWarning").hide(); 1312 } 1313 } 1314 1315 function display_cart_warning(item){ 1316 let cart_warning_container = jQuery("#cartWarning"); 1317 1318 // Check if an event date if not we should tell them to set it. 1319 event_times = getAvailTimes(); 1320 if(!event_times[0] || !event_times[1]){ 1321 cart_warning_container.text("Please set the date and time for your event above."); 1322 cart_warning_container.show(); 1323 return false; 1324 } 1325 1326 let item_name = item.get("name"); 1327 let item_timeslots = item.get("timeslots"); 1328 let timeslot_name = getTimeslotName(item_timeslots); 1329 1330 let stop_loop = false; 1331 if(item_timeslots){ 1332 if(jQuery(item_timeslots).nodeName == "SELECT"){ 1333 /* NOTE: It should not be possible for timeslots to be empty. 1334 But in the event they somehow are, we should have this here. */ 1335 /* timeslots */ 1336 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 1337 if(typeof timeslot_sel_range != "undefined"){ 1338 var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range); 1339 } 1340 }else{ 1341 /* timepickers */ 1342 let [start_timepicker, end_timepicker] = get_cart_timepickers(timeslot_name); 1343 var start_time = start_timepicker.value; 1344 var end_time = end_timepicker.value; 1345 } 1346 if(!start_time || !end_time){ 1347 cart_warning_container.text("Please select a time range for the following item: " + item_name); 1348 cart_warning_container.show() 1349 stop_loop = true; 1350 } 1351 } else{ 1352 cart_warning_container.text("Some items are not available on this date."); 1353 cart_warning_container.show() 1354 } 1355 return stop_loop 1356 } 1357 1358 const io_personal_cookie_keys = ["io_email", "io_phone", "io_address", "io_city", "io_state", "io_zip"]; 1359 1360 function ioHasMarketingConsent(){ 1361 if(typeof cmplz_has_consent !== 'function'){ 1362 return true; 1363 } 1364 return cmplz_has_consent('marketing'); 1365 } 1366 1367 function ioUnwrapStoredValue(raw) { 1368 // Fully peel any {v,e} wrapper layers that may have accumulated when an 1369 // older plugin version re-saved an already-wrapped value (IO-36799). Cart 1370 // values (dates, times, addresses) are never JSON objects, so any layer 1371 // that parses to a {v,...} object is a wrapper to unwrap. Returns 1372 // { value, expired, malformed } describing the innermost stored string. 1373 var value = (raw == null) ? "" : String(raw); 1374 for (var depth = 0; depth < 25; depth++) { 1375 var trimmed = value.trim(); 1376 if (trimmed.charAt(0) !== '{') break; // plain value -> done 1377 var obj; 1378 try { 1379 obj = JSON.parse(trimmed); 1380 } catch (e) { 1381 break; // not parseable -> stop, keep value 1382 } 1383 if (!obj || typeof obj !== 'object' || !('v' in obj)) break; // not our wrapper 1384 if (obj.e && Date.now() > obj.e) { 1385 return { value: "", expired: true, malformed: false }; 1386 } 1387 value = (obj.v != null) ? String(obj.v) : ""; 1388 } 1389 // Only flag as malformed if what remains still looks like our own broken 1390 // {"v":...} wrapper (e.g. truncated) -- never an ordinary value that just 1391 // happens to start with "{", which must be preserved untouched. 1392 var malformed = /^\s*\{\s*"v"\s*:/.test(value); 1393 return { value: value, expired: false, malformed: malformed }; 1394 } 1395 1396 function setCookie(cname, cvalue, exdays) { 1397 if(io_personal_cookie_keys.indexOf(cname) !== -1 && !ioHasMarketingConsent()){ 1398 return; 1399 } 1400 // Store values in localStorage with an io_ prefix for uniqueness and emulate expiration
1401 try { 1402 // Unwrap first so an already-wrapped value can never be re-wrapped and 1403 // compound into nested {v,e} layers (IO-36799). 1404 var clean = ioUnwrapStoredValue(cvalue).value; 1405 var expiresAt = (typeof exdays === 'number' && exdays > 0) 1406 ? Date.now() + (exdays * 24 * 60 * 60 * 1000) 1407 : null; 1408 var payload = JSON.stringify({ v: clean, e: expiresAt }); 1409 window.localStorage.setItem(cname, payload); 1410 } catch (e) { 1411 // Swallow errors to keep behavior similar to cookie writes silently failing 1412 console.log(e); 1413 } 1414 } 1415 1416 function getCookie(cname) { 1417 // Read values from localStorage honoring expiration; return empty string if missing/expired 1418 try { 1419 var raw = window.localStorage.getItem(cname); 1420 if (!raw) return ""; 1421 var result = ioUnwrapStoredValue(raw); 1422 if (result.expired || result.malformed) { 1423 // Drop expired or corrupted entries so they self-heal instead of being 1424 // rendered as raw JSON in the date/time fields (IO-36799). 1425 try { window.localStorage.removeItem(cname); } catch (e) {} 1426 return ""; 1427 } 1428 return result.value; 1429 } catch (e) { 1430 return ""; 1431 } 1432 } 1433 async function fetchAndSetCookie(name) { 1434 var requestInit = { credentials: "include" }; 1435 fetch("https://rental.software/include/get_cookie.php?name=" + name, requestInit).then(function (response) { 1436 return response.json(); 1437 }).then(function (response) { 1438 return handleResponse(name, response); 1439 }); 1440 } 1441 1442 function handleResponse(name, response) { 1443 var currentCookieValue = getCookie(name); 1444 if (!!response.value && currentCookieValue !== response.value) { 1445 setCookie(name, response.value, 14); 1446 } 1447 return response.value; 1448 } 1449 1450 function clearIoPersonalDataForNoConsent(){ 1451 io_personal_cookie_keys.forEach(function(key){ 1452 try { 1453 window.localStorage.removeItem(key); 1454 } catch (e) { 1455 console.log(e); 1456 } 1457 }); 1458 1459 var trackingUrl = (window.location.href.indexOf("localhost") > -1) 1460 ? "http://localhost/io/bugs/include/iotracking.php" 1461 : "https://rental.software/include/iotracking.php"; 1462 var clearImg = new Image(); 1463 clearImg.src = trackingUrl + "?action=remove&nocache=" + Math.random(); 1464 } 1465 1466 document.addEventListener("cmplz_status_change", function (e) { 1467 if (e.detail.category === 'marketing' && e.detail.value === 'deny') { 1468 clearIoPersonalDataForNoConsent(); 1469 } 1470 }); 1471 1472 function break_timeslot_sel_range(timeslot_sel_range){ 1473 /* Takes a time range given by selected timeslot and gets the start and end time removing meridiem.*/ 1474 timeslot_sel_arr = timeslot_sel_range.split(" - "); 1475 var start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace(" "," "); 1476 var end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace(" "," "); 1477 1478 return Array(start_time, end_time); 1479 } 1480 function getAvailTimes(){ 1481 /* 1482 Commonly used helper function. Accomplishes two things: 1483 Returns an array containing start_date, start_time, and event duration. 1484 Sets cookies for start and end date, and start and end time. 1485 1486 Uses the inputs available in the cart if they are filled out, so dateStart, dateEnd, timeStart, and timeEnd. 1487 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. 1488 */ 1489 let start_date = jQuery("input[name=dateStart]").val(); 1490 let end_date = jQuery("input[name=dateEnd]").val(); 1491 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 1492 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 1493 if(cart_company_timeslot_selected){ 1494 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 1495 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 1496 var start_time = cart_company_timeslot_selected[0].trim(); 1497 var end_time = cart_company_timeslot_selected[1].trim(); 1498 } 1499 } else { 1500 var start_time = jQuery("input[name=timeStart]").val(); 1501 var end_time = jQuery("input[name=timeEnd]").val(); 1502 } 1503 1504 if (start_date.length == 0) { 1505 start_date = getCookie("io_dateStart"); 1506 end_date = getCookie("io_dateEnd"); 1507 start_time = getCookie("io_timeStart"); 1508 end_time = getCookie("io_timeEnd"); 1509 } 1510 1511 const has_selected_company_timeslot = io_company_timeslots.length != 0 1512 && io_cartdayselect == "single_day" 1513 && jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 1514 1515 if(io_hidetimes === "on" 1516 && io_force_blank_timepickers != "on" 1517 && !has_selected_company_timeslot) { 1518 start_time = start_default; 1519 end_time = end_default; 1520 jQuery("input[name=timeStart]").val(start_time); 1521 jQuery("input[name=timeEnd]").val(end_time); 1522 } 1523 1524 if(io_force_blank_timepickers != "on") 1525 { 1526 if(start_time.length == 0) 1527 { 1528 start_time = start_default; 1529 } 1530 if(end_time.length == 0) 1531 { 1532 end_time = end_default; 1533 } 1534 } 1535 1536 1537 /* no past dates */ 1538 if(start_date.length != 0 && convertDateStringtoDateObject(start_date, start_time) < new Date()){ 1539 start_date=""; 1540 end_date=""; 1541 } 1542 /* setCookie("checkDate", start_date, 14); */
1543 setCookie("io_dateStart", start_date, 14); 1544 setCookie("io_dateEnd", end_date, 14); 1545 setCookie("io_timeStart", start_time, 14); 1546 setCookie("io_timeEnd", end_time, 14); 1547 /* If we are using the information gathering tool, we do not want to show this message.*/ 1548 if( live_pricing_is_on() && io_info_required == "off" ){ 1549 if(!event_time_set() && io_always_display_live_price != "on"){ 1550 jQuery("#item_live_price_time_set_message").show(); 1551 }else{ 1552 jQuery("#item_live_price_time_set_message").hide(); 1553 } 1554 } 1555 1556 var newDate1 = convertDateStringtoDateObject(start_date, start_time); 1557 var newDate2 = convertDateStringtoDateObject(end_date, end_time); 1558 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 1559 return [start_date,start_time,time_duration]; 1560 } 1561 1562 function getAllRentalIDsFromCart(){ 1563 let rental_ids = ""; 1564 jQuery("[id^='cartItem_']").each(function(){ 1565 children = this.children 1566 for(let i = 0; i < children.length; ++i){ 1567 if(children[i].className == "item-rentalid") { 1568 rental_ids += children[i].innerText + "|"; 1569 break; 1570 } 1571 } 1572 }); 1573 return rental_ids 1574 } 1575 /*</editor-fold>*/ 1576 1577 /*<editor-fold defaultstate="collapsed" desc="Info Header Functions">*/ 1578 function init_date_timepicker_for_info_header(){ 1579 jQuery(".ioInfoDatepicker").datepicker({ 1580 changeMonth: true, 1581 changeYear: true, 1582 dateFormat: dateFormat, 1583 rangeSelect: true, 1584 numberOfMonths: 1, 1585 stepMonths: 1, 1586 speed: "fast", 1587 showOn: "both", 1588 onChangeMonthYear: cal_onChangeMonthYear, 1589 buttonText: "Calendar", 1590 minDate: 1, 1591 firstDay: 0 1592 }); 1593 jQuery("#ioHeaderDateStart").datepicker("option", { onSelect: function() { 1594 set_info_header_end_date(); 1595 saveInfoHeader(); 1596 // Add more functions if needed 1597 } 1598 }); 1599 1600 if(restrictTimes){ 1601 jQuery(".ioInfoTimepicker").timepicker({ 1602 startTime: new Date(0, 0, 10, 0, 0, 0), 1603 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 1604 minTime:restrictTimeStart, 1605 maxTime:restrictTimeEnd, 1606 /*show24Hours: $show24Hours,*/ 1607 timeFormat: timeFormat, 1608 separator: ":", 1609 className: "elementor-widget-text-editor", 1610 step: 15, 1611 disableTouchKeyboard: true 1612 }); 1613 } else{ 1614 jQuery(".ioInfoTimepicker").timepicker({ 1615 startTime: new Date(0, 0, 10, 0, 0, 0), 1616 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 1617 /*show24Hours: $show24Hours,*/ 1618 timeFormat: timeFormat, 1619 separator: ":", 1620 className: "elementor-widget-text-editor", 1621 step: 15, 1622 disableTouchKeyboard: true 1623 }); 1624 } 1625 setTimeout(setUpTimeRestrictions_infoHeaderTimepickers, 500); 1626 } 1627 1628 function saveInfoHeader(){ 1629 let info_header_start_date = jQuery("[id$=ioHeaderDateStart]"); 1630 let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]"); 1631 let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]"); 1632 let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]"); 1633 let info_header_address = jQuery("[id$=ioHeaderAddress]"); 1634 let info_header_city = jQuery("[id$=ioHeaderCity]"); 1635 let info_header_state = jQuery("[id$=ioHeaderState]"); 1636 let info_header_zip = jQuery("[id$=ioHeaderZipCode]"); 1637 let info_header_phone = jQuery("[id$=ioHeaderPhone]"); 1638 let info_header_email = jQuery("[id$=ioHeaderEmail]"); 1639 1640 if(info_header_start_time.val()) setCookie("io_timeStart", info_header_start_time.val(), 14); 1641 if(info_header_end_time.val()) setCookie("io_timeEnd", info_header_end_time.val(), 14); 1642 if(info_header_start_date.val()) setCookie("io_dateStart", info_header_start_date.val(), 14); 1643 if(info_header_end_date.val()) setCookie("io_dateEnd", info_header_end_date.val(), 14); 1644 if(info_header_address.val()) setCookie("io_address", info_header_address.val(), 14); 1645 if(info_header_city.val()) setCookie("io_city", info_header_city.val(), 14); 1646 if(info_header_state.val()) setCookie("io_state", info_header_state.val(), 14); 1647 if(info_header_zip.val()) setCookie("io_zip", info_header_zip.val(), 14); 1648 if(info_header_phone.val()) setCookie("io_phone", info_header_phone.val(), 14); 1649 if(info_header_email.val()) setCookie("io_email", info_header_email.val(), 14); 1650 1651 /* Set information in the cart. */ 1652 calCancel(); 1653 1654 header_increment_step(); 1655 1656 /* Stop form from doing anything else for elementor */ 1657 // jpa - still allow, turn off actions in form if wanted. to turn off io lead submission use the plugin settings 1658 //event.preventDefault(); 1659 //event.stopPropagation(); 1660 return true; 1661 } 1662 1663 function set_info_header_values(){ 1664 let info_header_start_date = jQuery("[id$=ioHeaderDateStart]"); 1665 let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]"); 1666 let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]"); 1667 let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]"); 1668 let info_header_street = jQuery("[id$=ioHeaderAddress]"); 1669 let info_header_city = jQuery("[id$=ioHeaderCity]"); 1670 let info_header_state = jQuery("[id$=ioHeaderState]"); 1671 let info_header_zip = jQuery("[id$=ioHeaderZipCode]"); 1672 let info_header_phone = jQuery("[id$=ioHeaderPhone]"); 1673 let info_header_email = jQuery("[id$=ioHeaderEmail]"); 1674 1675 if(getCookie("io_timeStart")) info_header_start_time.val(getCookie("io_timeStart")); 1676 if(getCookie("io_timeEnd")) info_header_end_time.val(getCookie("io_timeEnd")); 1677 if(getCookie("io_dateStart")) info_header_start_date.val(getCookie("io_dateStart")); 1678 if(getCookie("io_dateEnd")) info_header_end_date.val(getCookie("io_dateEnd")); 1679 if(getCookie("io_address")) info_header_street.val(getCookie("io_address")); 1680 if(getCookie("io_city")) info_header_city.val(getCookie("io_city")); 1681 if(getCookie("io_state")) info_header_state.val(getCookie("io_state")); 1682 if(getCookie("io_zip")) info_header_zip.val(getCookie("io_zip")); 1683 if(getCookie("io_phone")) info_header_phone.val(getCookie("io_phone")); 1684 if(getCookie("io_email")) info_header_email.val(getCookie("io_email")); 1685 } 1686 1687 function add_classes_and_onClicks(){ 1688 1689 /* First set up for dates */ 1690 let info_header_start_date = jQuery("#ioHeaderDateStart"); 1691 let info_header_end_date = jQuery("#ioHeaderDateEnd"); 1692 info_header_start_date.addClass("ioInfoDatepicker"); 1693 info_header_end_date.addClass("ioInfoDatepicker"); 1694 1695 /* Now Timepickers */ 1696 let info_header_start_time = jQuery("#ioHeaderTimeStart"); 1697 let info_header_end_time = jQuery("#ioHeaderTimeEnd"); 1698 info_header_start_time.addClass("ioInfoTimepicker"); 1699 info_header_end_time.addClass("ioInfoTimepicker"); 1700 1701 /* Add the onClick to the button */ 1702 let button = jQuery("#ioInfoHeaderSubmit"); 1703 button.click(saveInfoHeader); 1704 button.css("cursor", "pointer"); 1705 1706 /* Init datepicker and timepickers */ 1707 init_date_timepicker_for_info_header(); 1708 1709 /* Lastly set the values if they are set already */ 1710 set_info_header_values(); 1711 } 1712 1713 function remove_set_event_buttton(){ 1714 let set_event_button = jQuery(".pageDateRangeWrapper"); 1715 if(set_event_button.length > 0) set_event_button.hide(); 1716 } 1717 1718 function set_info_header_end_date(){ 1719 if(!jQuery("#ioHeaderDateEnd").val()){ 1720 jQuery("#ioHeaderDateEnd").val(jQuery("#ioHeaderDateStart").val()) 1721 } 1722 jQuery("#ioHeaderDateEnd").datepicker("option", { minDate: new Date(jQuery("#ioHeaderDateStart").val()) }); 1723 } 1724 1725 function header_increment_step(){ 1726 let active = jQuery(".io-step-active"); 1727 1728 switch(active.attr("id")){ 1729 case "io-step-1": 1730 if (/Mobi|Android/i.test(navigator.userAgent)) { 1731 jQuery("#io-step-2,#io-step-3,#io-step-4").hide(); 1732 } 1733 if(check_header_step_one(active)){ 1734 active.removeClass("io-step-active"); 1735 active.addClass("io-step-done") 1736 jQuery("#io-step-2").addClass("io-step-active") 1737 header_increment_step(); 1738 } 1739 break; 1740 case "io-step-2": 1741 if (/Mobi|Android/i.test(navigator.userAgent)) { 1742 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 1743 } 1744 if(simpleCart.items().length > 0){ 1745 active.removeClass("io-step-active"); 1746 active.addClass("io-step-done") 1747 jQuery("#io-step-3").addClass("io-step-active") 1748 header_increment_step(); 1749 } 1750 break; 1751 case "io-step-3": 1752 if (/Mobi|Android/i.test(navigator.userAgent)) { 1753 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 1754 } 1755 if(document.location.href.indexOf("io_quoteconfirm") >= 0){ 1756 active.removeClass("io-step-active"); 1757 active.addClass("io-step-done") 1758 jQuery("#io-step-4").addClass("io-step-active") 1759 header_increment_step(); 1760 } 1761 break; 1762 case "io-step-4": 1763 if (/Mobi|Android/i.test(navigator.userAgent)) { 1764 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 1765 } 1766 break; 1767 } 1768 } 1769 1770 function check_header_step_one(active) { 1771 var allInputs = active.find('input'); 1772 1773 for (var i = 0; i < allInputs.length; i++) { 1774 if (jQuery(allInputs[i]).val() === "") { 1775 return false; // Return false if any input is empty 1776 } 1777 } 1778 return true; // Return true if all inputs have a value 1779 } 1780 1781 /*</editor-fold>*/ 1782 1783 /*<editor-fold defaultstate="collapsed" desc="Accessory Click Functions">*/ 1784 function accDDClicked(event){ 1785 this_element = jQuery(this) 1786 if(!this_element.prop("selected")){ 1787 pid = event.data.pid 1788 accLmt = event.data.accLmt 1789 all_elements = jQuery("[id^=io_acc_"+pid+"_]") 1790 let count = 0; 1791 /* Tried using .filter and .length to get the count of selected items but could not make it work. */ 1792 for(i = 0; i < all_elements.length; ++i){ 1793 if(all_elements[i].selected){ 1794 ++count; 1795 } 1796 } 1797 if(accLmt == 0){ 1798 this_element.css("border", "5px solid #bbb"); 1799 this_element.prop("selected", true); 1800 } else if(count >= accLmt){ 1801 let selected_value = jQuery("[id^=io_acc_"+pid+"_]").filter(function() { 1802 return this["selected"]; 1803 }); 1804 /* be sure to unselect other slected values if our acc limit has been reached. */ 1805 selected_value.prop("selected", false); 1806 selected_value.css("border", "1px solid #bbb"); 1807 } 1808 this_element.css("border", "5px solid #bbb"); 1809 this_element.prop("selected", true); 1810 } else{ 1811 this_element.prop("selected", false); 1812 this_element.css("border", "1px solid #bbb"); 1813 } 1814 } 1815 1816 /* when accessory choice is clicked */ 1817 function accOnClick(acc_select=null){ 1818 /* set name/img back to original main in case they are just clicking on a 1st level size option */ 1819 jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 1820 jQuery(".io_product_title.item_name").html(main_name_orig); 1821 jQuery(".io_product_container .item_image").first().attr("src",main_img_src); 1822 jQuery(".io_product_container .item_image").first().attr("data-src",main_img_src); 1823 jQuery(".io_product_container .item_encoded").first().html(main_encoded); 1824 jQuery(".io_product_container .io_image_big").first().attr("src",main_img_src); 1825 jQuery(".io_product_container .io_image_big").first().attr("data-src",main_img_src); 1826 let main_id = jQuery(".io_product_container .item_rentalid").first().text();
1827 let main_id_arr = main_id.split(":") 1828 jQuery(".io_product_container .item_rentalid").html(main_id_arr[0]); 1829 let clk_id; 1830 if(jQuery(acc_select).find(":selected").val()){ 1831 clk_id = jQuery(acc_select).find(":selected").val().replace("io_acc_shortname_",""); 1832 }else{ 1833 clk_id = this.id.replace("io_acc_shortname_",""); 1834 } 1835 clk_id = clk_id.replace("iothumb_",""); 1836 let click_id_arr = clk_id.split("_"); 1837 /* let pid = main_id; */ 1838 /* if(main_id.split("_").length>1) pid = parseInt(click_id_arr[0]); */ 1839 let acc_obj_relate_is_map = acc_obj_relate instanceof Map; 1840 let acc_obj_relate_entries = acc_obj_relate_is_map ? acc_obj_relate.entries() : Object.entries(acc_obj_relate); 1841 for (let [key, value] of acc_obj_relate_entries) { 1842 let id = key; 1843 let children = acc_obj_relate_is_map ? acc_obj_relate.get(key) : value; 1844 if(Object.keys(children).length>0){ 1845 for (key2 in children) { 1846 if(Object.keys(children[key2]).length > 0){ 1847 /* 3rd level */ 1848 for (key3 in children[key2]) { 1849 displayPackageChoices(clk_id,key2,key3,children[key2]); 1850 } 1851 }else{ 1852 displayPackageChoices(clk_id,key,key2,children); 1853 } 1854 } 1855 }else{ 1856 displayPackageChoices(clk_id,0,id,acc_obj_relate); 1857 } 1858 } 1859 } 1860 1861 /* show/hide accessory levels as needed */ 1862 /* clk_id: one they clicked on, pid: parentid, id: iterator, arr: relationship array */ 1863 function displayPackageChoices(clk_id,pid,id,arr){ 1864 let main_id = jQuery(".io_product_container .item_rentalid").first().text(); 1865 let main_arr = main_id.split("_"); 1866 if(main_arr.length>1) main_id = parseInt(main_arr[0]); 1867 let click_id_arr = clk_id.split("_"); 1868 elem = getAccElem(id,pid); 1869 if(click_id_arr[0]==pid || click_id_arr[1]==pid || pid==0){ 1870 elem.style.display="inline-block"; 1871 }else{ 1872 elem.style.display="none"; 1873 } 1874 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)){ 1875 jQuery("#bookNowBtn").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 1876 updateMainItem(id,pid); 1877 } 1878 } 1879 1880 /* update it with accessory data for choices */ 1881 var main_img_src = jQuery("#single_image").first().attr("href"); 1882 var main_name_orig = jQuery(".io_product_title.item_name").html(); 1883 var main_encoded = jQuery(".io_product_container .item_encoded").html(); 1884 var main_desc = jQuery(".io_product_detailbox .io_product_desc").html(); 1885 function updateMainItem(id,pid){ 1886 /* update add to cart btn, name, img, desc */ 1887 let name = ""; 1888 let name_enc = ""; 1889 let main_id = jQuery(".io_product_container .item_rentalid").first().text(); 1890 let main_arr = main_id.split(":"); 1891 if(main_arr.length>1) main_id = main_arr[0]; 1892 if(pid!=0){ 1893 name += jQuery("#io_acc_itemname_"+pid).html()+":"; 1894 name_enc += jQuery("#io_acc_itemname_"+pid).html()+":"; 1895 name += jQuery("#io_acc_shortname_"+id).html(); 1896 name_enc += jQuery("#io_acc_itemname_"+id).html(); 1897 }else{ 1898 pid = main_id; 1899 name += jQuery("#io_acc_itemname_"+id).html(); 1900 name_enc += jQuery("#io_acc_itemname_"+id).html(); 1901 } 1902 jQuery(".io_product_container .item_encoded").html(encodeURIComponent(name_enc.replace(/[\u2032\u2019]+/ig,"'"))); 1903 jQuery(".io_product_container .item_rentalid").html(main_id+":"+pid+"_"+id); 1904 jQuery(".io_product_title.item_name").html(name); 1905 // Make sure the description actually displays text. 1906 let acc_desc = jQuery("#io_acc_desc_"+pid+"_"+id).first(); 1907 if(acc_desc.length>0 && acc_desc.text()){ 1908 jQuery(".io_product_container .io_product_desc").first().html(jQuery("#io_acc_desc_"+pid+"_"+id).first()[0].innerHTML); 1909 } 1910 1911 /* swap accessory image with main image pic for drop-down type items (linens) */ 1912 let img = jQuery("#io_acc_imgbig_"+pid+"_"+id).first().attr("href"); 1913 if(img==null) img = jQuery("#iothumb_"+pid+"_"+id).first().attr("src") 1914 if(img==null){ 1915 }else{ 1916 if(img.length==0 && pid==main_id){ 1917 /* for 1 level dd items that have no img, use the main img */ 1918 img = main_img_src; 1919 } 1920 jQuery(".io_product_container .io_image_big").first().attr("src",img); 1921 jQuery(".io_product_container .io_image_big").first().attr("data-src",
1921img); 1922 jQuery(".io_product_container .item_image").first().attr("src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src")); 1923 jQuery(".io_product_container .item_image").first().attr("data-src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src")); 1924 1925 jQuery("#single_image").first().attr("href",img).show(); 1926 } 1927 checkAvailFilter(); 1928 } 1929 1930 /* get either img or text for accessory choices */ 1931 function getAccElem(id,pid){ 1932 let path =pid+"_"+id; 1933 if(pid==0){ 1934 path=id; 1935 } 1936 let elem = null; 1937 try{ 1938 elem = document.querySelector("#ioAccButtonWrapper_"+path); 1939 }catch(e){} 1940 if(elem == null){ 1941 try{ 1942 elem = document.querySelector("#iothumb_"+path); 1943 }catch(e){} 1944 } 1945 if(elem==null){ 1946 try{ 1947 elem = document.querySelector("#io_product_acc_pkg_sel_"+pid); 1948 }catch(e){} 1949 if(elem!=null) return elem; 1950 }else{ return elem; } 1951 if(elem == null){ 1952 try{ 1953 elem = document.querySelector("#io_acc_shortname_"+path); 1954 }catch(e){} 1955 }else if(elem.src=="" | elem.getAttribute("data-src")==""){ 1956 try{ 1957 elem = document.querySelector("#io_acc_shortname_"+path); 1958 }catch(e){} 1959 }else if(elem.src.substr(-1)=="/"){ 1960 try{ 1961 elem = document.querySelector("#io_acc_shortname_"+path); 1962 }catch(e){} 1963 } 1964 if(elem==null){ 1965 try{ 1966 elem = document.querySelector("#io_acc_shortname_"+id); 1967 }catch(e){} 1968 } 1969 return elem; 1970 } 1971 1972 /* create the accessory choice btn (img/text) */ 1973 function makeAccBtn(button_add,pid){ 1974 let newButton; 1975 if(button_add.nodeName=="IMG"){ 1976 newButton = button_add; 1977 let id = newButton.id.replace("iothumb_"+pid,""); 1978 var wrapper = document.createElement("div"); 1979 wrapper.setAttribute("id", "ioAccButtonWrapper_"+pid+id); 1980 wrapper.style.display = "inline-block"; 1981 wrapper.appendChild(newButton); 1982 let acc_name = document.createElement("span"); 1983 acc_name.style.overflow = "hidden"; 1984 acc_name.style.textOverflow = "ellipsis"; 1985 acc_name.style.maxWidth = "80px"; 1986 acc_name.style.display = "block"; 1987 acc_name.style.whiteSpace = "nowrap"; 1988 acc_name.textContent = jQuery("#io_acc_shortname"+id).text(); 1989 acc_name.classList.add("accTextName"); 1990 acc_name.setAttribute("id", "io_acc_shortname_"+pid+id); 1991 wrapper.appendChild(document.createElement("br")); 1992 wrapper.appendChild(acc_name); 1993 1994 }else{ 1995 newButton = button_add.cloneNode(true); 1996 let id = newButton.id.replace("io_acc_shortname_",""); 1997 newButton.id = "io_acc_shortname_" + pid + "_" + id; 1998 } 1999 newButton.classList.add("elementor-animation-grow"); 2000 newButton.classList.remove("item_image"); 2001 newButton.style="cursor:pointer;border: solid 1px grey"; 2002 newButton.classList.add("io_access_button"); 2003 newButton.style.display = "inline-block"; 2004 newButton.style.verticalAlign = "top"; 2005 newButton.onclick=accOnClick; 2006 if(newButton.nodeName=="IMG"){ 2007 newButton.style.minWidth = "80px"; 2008 newButton.style.width = "80px"; 2009 newButton.style.margin = "2px"; 2010 newButton.style.height = "80px"; 2011 }else{ 2012 newButton.style.margin = "0px 2px 0px 2px"; 2013 } 2014 if(button_add.nodeName=="IMG"){ 2015 return wrapper 2016 } 2017 2018 return newButton; 2019 } 2020 /* when clicking the thumb swatches under main image (2nd image for an item) */ 2021 function updateMainPic(img) { 2022 let container = img.parentElement; 2023 while (container && !container.querySelector(".io_image_big")) { 2024 container = container.parentElement; 2025 } 2026 2027 const main_img = container ? container.querySelector(".io_image_big") : null; 2028 if (!main_img) return; 2029 2030 const dataBigSrc = img.getAttribute("data-big-src"); 2031 if (dataBigSrc) { 2032 main_img.src = dataBigSrc; 2033 return; 2034 } 2035 2036 let thumb_id = img.id; 2037 let big_id = thumb_id.replace("thumb", "big"); 2038 const img_big = document.getElementById(big_id); 2039 2040 if (img_big && img_big.href) { 2041 main_img.src = img_big.href; 2042 } 2043 } 2044 /*</editor-fold>*/ 2045 2046 /*<editor-fold defaultstate="collapsed" desc="Calendar Functions">*/ 2047 function calApply() { 2048 /* reset timeslots if filtering is on */ 2049 filterTimeslotsByDay_itemTimeslots();
2050 simpleCart.update(); 2051 2052 /* Prevent zero-duration selection: disallow identical start and end date/time */ 2053 try 2054 { 2055 var ds = jQuery("input[name=dateStart]").val(); 2056 var de = jQuery("input[name=dateEnd]").val(); 2057 var ts = jQuery("input[name=timeStart]").val(); 2058 var te = jQuery("input[name=timeEnd]").val(); 2059 if(ts && te && ds && de) 2060 { 2061 var s24 = convert12HourTo24Hour(ts); 2062 var e24 = convert12HourTo24Hour(te); 2063 var sObj = buildDateObj(ds.split("/"), s24); 2064 var eObj = buildDateObj(de.split("/"), e24); 2065 if(sObj && eObj && typeof sObj.getTime === 'function' && typeof eObj.getTime === 'function') 2066 { 2067 if(eObj.getTime() === sObj.getTime()) 2068 { 2069 alert("Please choose an end time that's after the start time."); 2070 jQuery("input[name=timeEnd]").val(""); 2071 return false; 2072 } 2073 } 2074 } 2075 }catch(e){} 2076 2077 if(cart_times_all_set()){ 2078 ioCartLoaderActivate(); 2079 setCookie("io_dateApplied", "true", 1) 2080 checkAvailAll(); 2081 // If no availability calls were made, hide loader shortly after 2082 setTimeout(function() 2083 { 2084 if(io_cart_loading_active && io_cart_loading_count === 0) 2085 { 2086 io_cart_loading_active = false; 2087 ioCartShowOverlay(false); 2088 } 2089 }, 300); 2090 calCancel(); 2091 } 2092 2093 2094 let io_required_data = io_info_required_data; 2095 for (const [data, value] of Object.entries(io_required_data)) { 2096 if(value == 1){ 2097 setCookie(data, jQuery("#io_im_"+data).val(), 14); 2098 } 2099 } 2100 2101 /* Check if information gathering header exists. If it does, update the times on there. */ 2102 if(jQuery("#ioInfoHeader").length){ 2103 jQuery("#ioHeaderTimeStart").val(jQuery("[name=timeStart]").val()); 2104 jQuery("#ioHeaderTimeEnd").val(jQuery("[name=timeEnd]").val()); 2105 jQuery("#ioHeaderDateStart").val(jQuery("[name=dateStart]").val()); 2106 jQuery("#ioHeaderDateEnd").val(jQuery("[name=dateEnd]").val()); 2107 header_increment_step(); 2108 } 2109 2110 show_or_hide_required_info_message() 2111 /* if(!cartStayOpen) cartHide(); */ 2112 } 2113 2114 function calCancel() { 2115 click_count = 0; 2116 start_date = getCookie("io_dateStart"); 2117 end_date = getCookie("io_dateEnd"); 2118 start_time = getCookie("io_timeStart"); 2119 end_time = getCookie("io_timeEnd"); 2120 jQuery("input[name=dateStart]").val(start_date); 2121 jQuery("input[name=dateEnd]").val(end_date); 2122 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 2123 jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected")); 2124 } else{ 2125 jQuery("input[name=timeStart]").val(start_time); 2126 jQuery("input[name=timeEnd]").val(end_time); 2127 } 2128 setCalBackground(); 2129 2130 jQuery(".ioDateRange").html(smartFormatDateRange()) 2131 jQuery("#cartCalendar, #cartTimePicker").hide(); 2132 jQuery(".ioDateRange").show(); 2133 jQuery(".changeDateLinkWrapper").show(); 2134 } 2135 2136 /* var cartStayOpen = false; */ 2137 function calSetDateRange(stayOpen) { 2138 /* 2139 if(stayOpen==1){ 2140 cartStayOpen = true; 2141 }else{ 2142 cartStayOpen = false; 2143 } 2144 */ 2145 jQuery(".changeDateLinkWrapper").hide(); 2146 jQuery("#cartCalendar, #cartTimePicker").show(); 2147 jQuery("#cartDateRange").hide(); 2148 } 2149 2150 function smartFormatDateRange() { 2151 let start_date = jQuery("input[name=dateStart]").val(); 2152 let end_date = jQuery("input[name=dateEnd]").val(); 2153 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2154 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 2155 if(cart_company_timeslot_selected){ 2156 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 2157 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 2158 var start_time = cart_company_timeslot_selected[0].trim(); 2159 var end_time = cart_company_timeslot_selected[1].trim(); 2160 } 2161 } else { 2162 var start_time = jQuery("input[name=timeStart]").val(); 2163 var end_time = jQuery("input[name=timeEnd]").val(); 2164 } 2165 2166 let text = ""; 2167 text = start_date; 2168 if(io_hidetimes!="on") text += " " + start_time; 2169 2170 if (start_date == end_date) { 2171 if(io_hidetimes!="on"){ 2172 text += " <i class='fas fa-arrow-right' style='padding:5px;'></i> "; 2173 text += end_time; 2174 } 2175 } else { 2176 text += " <i class='fas fa-arrow-right' style='padding:5px;'></i> "; 2177 text += end_date; 2178 if(io_hidetimes!="on") text += " " + end_time; 2179 } 2180 /* text += " <i class='fas fa-pencil-alt' style='margin-left:9px;color:"+pallet_color1+";'></i> "; */ 2181 2182 return text; 2183 } 2184 2185 2186 function resetCalButtons() { 2187 jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1); 2188 jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").
2188css("color", pallet_color1); 2189 } 2190 2191 function cal_onChangeMonthYear(year, month, obj) { 2192 setTimeout(resetCalButtons, 10); 2193 setTimeout(setCalBackground, 10); 2194 } 2195 2196 function cal_onSelect(dateText, obj) { 2197 setTimeout(resetCalButtons, 10); 2198 let whatday_choice = ""; 2199 if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){ 2200 let choice_obj = jQuery("#whatday"); 2201 if(choice_obj){ 2202 whatday_choice = choice_obj.val(); 2203 } 2204 } 2205 2206 click_count++; 2207 end_timepicker = jQuery("input[name=timeEnd]"); 2208 let timeStart = jQuery("input[name=timeStart]").val(); 2209 if(io_force_blank_timepickers != "on") 2210 { 2211 if (timeStart == "") { 2212 jQuery("input[name=timeStart]").val(start_default); 2213 jQuery("input[name=timeEnd]").val(end_default); 2214 } 2215 } 2216 2217 if (click_count == 1 || !multi_day || whatday_choice==="Same Day" || whatday_choice==="Overnight") { 2218 jQuery("input[name=dateStart]").val(dateText); 2219 jQuery("input[name=dateEnd]").val(dateText) 2220 end_timepicker.timepicker("option",{"minTime": jQuery("input[name=timeStart]").val()}); 2221 if(EndTimeLessThanStartTime( 2222 jQuery("input[name=timeStart]").val(), 2223 end_timepicker.val(), 2224 jQuery("[name='dateStart']").val(), 2225 jQuery("[name='dateEnd']").val() ) ) { 2226 end_timepicker.val(""); 2227 } 2228 if(io_cartAllowSameDay == "on"){ 2229 restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker); 2230 } 2231 } else if (click_count == 2) { 2232 jQuery("input[name=dateEnd]").val(dateText); 2233 let start_date_str = jQuery("input[name=dateStart]").val(); 2234 let start_date_obj = convertDateStringtoDateObject(start_date_str); 2235 let end_date_obj = convertDateStringtoDateObject(dateText); 2236 if(end_date_obj < start_date_obj){ 2237 jQuery("input[name=dateStart]").val(dateText); 2238 if(io_cartAllowSameDay == "on"){ 2239 restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker); 2240 } 2241 } else{ 2242 end_timepicker.timepicker("option",{"minTime": io_restrict_time_start}); 2243 } 2244 click_count = 0; 2245 } else { 2246 click_count = 0; 2247 } 2248 //custom code for suncoast_event 2249 if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){ 2250 endDisplay(); 2251 //daysSelect(); 2252 } 2253 filterTimeslotsByDay_companyTimeslots(); 2254 2255 setTimeout(setCalBackground, 10); 2256 } 2257 2258 function endDisplay(){ 2259 //todo: need to figure out if these work and set triggers 2260 // trigger enddisplay after date is selected or possibly when dateEnd changes? 2261 let choice = jQuery("#whatday").val(); 2262 2263 setCookie("io_whatday", choice, 14); 2264 let dateStart = jQuery("[name=dateStart]"); 2265 let timeStart = jQuery("[name=timeStart]"); 2266 let dateEnd = jQuery("[name=dateEnd]"); 2267 let timeEnd = jQuery("[name=timeEnd]"); 2268 if(choice==='Overnight'){ 2269 let startdate = dateStart.val(); 2270 let starttime = io_overnightPickupTime; 2271 let endcalc_date_obj = new Date(buildDateobjectstring(startdate,dateFormat,starttime)); 2272 let duration_hrs = 24; 2273 let end_date_obj = new Date(endcalc_date_obj.getTime()+duration_hrs*60*60*1000); 2274 if(!isNaN(end_date_obj)){ 2275 dateEnd.val(getFormatteddate(end_date_obj)); 2276 timeEnd.val(getFormattedtime(end_date_obj)); 2277 timeEnd.attr('readonly','readonly'); 2278 } 2279 }else if(choice==='Multi-Day'){ 2280 let startdate = dateStart.val(); 2281 let starttime = timeStart.val() || start_default; 2282 let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime)); 2283 if(!isNaN(start_date_obj)){ 2284 //dateEnd.val(getFormatteddate(start_date_obj)); 2285 let cal = jQuery("#cartCalendar"); 2286 let origOnSelect = cal.datepicker("option", "onSelect"); 2287 cal.datepicker("option", "onSelect", null); 2288 cal.datepicker("setDate", start_date_obj); 2289 cal.datepicker("option", "onSelect", origOnSelect); 2290 } 2291 timeEnd.removeAttr('readonly'); 2292 if(io_force_blank_timepickers == "on" && !timeEnd.val()){ 2293 timeEnd.val(""); 2294 } else if(!timeEnd.val()){ 2295 timeEnd.val(end_default); 2296 } 2297 }else{ 2298 let startdate = dateStart.val(); 2299 let starttime = timeStart.val() || start_default; 2300 let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime)); 2301 if(!isNaN(start_date_obj)){ 2302 dateEnd.val(getFormatteddate(start_date_obj)); 2303 let cal = jQuery("#cartCalendar"); 2304 let origOnSelect = cal.datepicker("option", "onSelect"); 2305 cal.datepicker("option", "onSelect", null); 2306 cal.datepicker("setDate", start_date_obj); 2307 cal.datepicker("option", "onSelect", origOnSelect); 2308 } 2309 timeEnd.removeAttr('readonly'); 2310 if(io_force_blank_timepickers == "on" && !timeEnd.val()){ 2311 timeEnd.val(""); 2312 } else if(!timeEnd.val()){ 2313 timeEnd.val(end_default); 2314 } 2315 click_count = 0; 2316 }
2317 setTimeout(setCalBackground, 10); 2318 } 2319 function setCalBackground() { 2320 let dateStart_string = jQuery("input[name=dateStart]").val(); 2321 let dateEnd_string = jQuery("input[name=dateEnd]").val(); 2322 2323 if (dateFormat == "d/m/yy") { 2324 let dateStartArray = dateStart_string.split("/"); 2325 let dateEndArray = dateEnd_string.split("/"); 2326 var dateStart = new Date(dateStartArray[2], Number(dateStartArray[1])-1, dateStartArray[0]); 2327 var dateEnd = new Date(dateEndArray[2], Number(dateEndArray[1])-1, dateEndArray[0]); 2328 } else { 2329 var dateStart = new Date(dateStart_string); 2330 var dateEnd = new Date(dateEnd_string); 2331 } 2332 2333 2334 let sday = dateStart.getDate(); 2335 let smonth = dateStart.getMonth(); 2336 let syear = dateStart.getFullYear(); 2337 2338 let eday = dateEnd.getDate(); 2339 let emonth = dateEnd.getMonth(); 2340 let eyear = dateEnd.getFullYear(); 2341 2342 /* clear any (in case of cancel) */ 2343 jQuery(".ui-datepicker-calendar [data-handler=selectDay]").css("background-color","initial"); 2344 2345 /* set the selected ones */ 2346 jQuery("#cartCalendar [data-month=" + smonth + "][data-year=" + syear + "], #cartCalendar [data-month=" + 2347 emonth + "][data-year=" + eyear + "]").each(function (i) { 2348 let cday = jQuery(this).find("a").first().text(); 2349 let cmonth = jQuery(this).attr("data-month"); 2350 let cyear = jQuery(this).attr("data-year"); 2351 /* let dateCurrent = new Date(Date.UTC(cyear,cmonth,cday,12)); */ 2352 let dateCurrent = new Date(cyear, cmonth, cday); 2353 if (click_count == 1 && dateEnd_string.length == 0) dateEnd = dateStart; 2354 if (dateCurrent.getTime() == dateStart.getTime() && dateCurrent.getTime() == dateEnd.getTime()) { 2355 jQuery(this).css("border-radius", "6px 6px 6px 6px"); 2356 } else if (dateCurrent.getTime() == dateStart.getTime()) { 2357 jQuery(this).css("border-radius", "6px 0 0 6px"); 2358 } else if (dateCurrent.getTime() == dateEnd.getTime()) { 2359 jQuery(this).css("border-radius", "0 6px 6px 0"); 2360 } 2361 2362 if (dateCurrent >= dateStart && dateCurrent <= dateEnd) { 2363 jQuery(this).css("background-color", pallet_color1); 2364 } 2365 2366 2367 }); 2368 } 2369 /*</editor-fold>*/ 2370 2371 /*<editor-fold defaultstate="collapsed" desc="Timeslot/Timepicker Functions">*/ 2372 /* called from simplecart */ 2373 function timeslotChange(){ 2374 checkAvailCartTimeslots(); 2375 } 2376 function filterTimeslotsByDay_companyTimeslots(){ 2377 var weekday = new Array(); 2378 weekday[0] = "Sunday"; 2379 weekday[1] = "Monday"; 2380 weekday[2] = "Tuesday"; 2381 weekday[3] = "Wednesday"; 2382 weekday[4] = "Thursday"; 2383 weekday[5] = "Friday"; 2384 weekday[6] = "Saturday"; 2385 2386 let times = getAvailTimes(); 2387 let start_date = times[0]; 2388 var newDate1 = convertDateStringtoDateObject(start_date); 2389 let day = weekday[new Date(newDate1).getDay()]; 2390 2391 let selected_option_label = jQuery(".ioCartCompanyTimeslots option:selected").first().text().toLowerCase(); 2392 if(optionHasDay(weekday, selected_option_label)){ 2393 if(selected_option_label.indexOf(day.toLowerCase()) === -1){ 2394 jQuery(".ioCartCompanyTimeslots").val(""); 2395 } 2396 } 2397 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2398 jQuery(".ioCartCompanyTimeslots > option").each(function() { 2399 if(optionHasDay(weekday, this.text.toLowerCase())){ 2400 for(i=0; i<weekday.length; ++i){ 2401 if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){ 2402 jQuery(this).show(); 2403 day_missing = false; 2404 } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){ 2405 jQuery(this).hide(); 2406 } 2407 } 2408 } 2409 }); 2410 } 2411 } 2412 2413 function filterTimeslotsByDay_itemTimeslots(){ 2414 var weekday = new Array(); 2415 weekday[0] = "Sunday"; 2416 weekday[1] = "Monday"; 2417 weekday[2] = "Tuesday"; 2418 weekday[3] = "Wednesday"; 2419 weekday[4] = "Thursday"; 2420 weekday[5] = "Friday"; 2421 weekday[6] = "Saturday"; 2422 2423 let times = getAvailTimes(); 2424 let start_date = times[0]; 2425 var newDate1 = convertDateStringtoDateObject(start_date); 2426 let day = weekday[new Date(newDate1).getDay()]; 2427 2428 simpleCart.each(function (item, x) { 2429 var timeslots_html = item.get('timeslots'); 2430 if(typeof timeslots_html != "undefined" && jQuery.parseHTML(timeslots_html)[0].nodeName == "SELECT"){ 2431 if(timeslots_html.length > 0){ 2432 var timeslot_name = getTimeslotName(timeslots_html); 2433 if(typeof item.get("timeslots-orig") == "undefined"){ 2434 var timeslots_obj = jQuery.parseHTML(timeslots_html); 2435 } else{ 2436 var timeslots_obj = jQuery.parseHTML(item.get('timeslots-orig')); 2437 } 2438 jQuery(timeslots_obj).find("option").each(function(){ 2439 if(optionHasDay(weekday, this.text.toLowerCase())){ 2440 for(i=0; i<weekday.length; ++i){ 2441 if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){ 2442 /* jQuery(this).show(); */ 2443 } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){ 2444 jQuery(this).remove(); 2445 } 2446 } 2447 } 2448 }); 2449 if(typeof item.get("timeslots-orig") == "undefined") item.set("timeslots-orig",item.get("timeslots")); 2450 item.set("timeslots",'<select class="simpleCart_timeslots" name="'+timeslot_name+'">'+jQuery(timeslots_obj).html()+'</select>'); 2451 } 2452 } 2453 }); 2454 } 2455 2456 function optionHasDay(weekdays, option_label){ 2457 for(i=0; i<weekdays.length; ++i){ 2458 if(option_label.indexOf(weekdays[i].toLowerCase()) !== -1){ 2459 return true; 2460 } 2461 } 2462 return false;
2463 } 2464 2465 function getTimeslotName(timeslots_html){ 2466 if(typeof timeslots_html=="undefined") return ""; 2467 var timeslot_name_s = timeslots_html.indexOf('name="'); 2468 timeslot_name_s += 6; 2469 var timeslot_name_e = timeslots_html.indexOf('"',timeslot_name_s); 2470 var timeslot_name = timeslots_html.substr(timeslot_name_s,timeslot_name_e-timeslot_name_s); 2471 return timeslot_name; 2472 } 2473 function setTimeslotSelected(item, timeslot_name){ 2474 jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected"); 2475 jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").attr("selected","selected"); 2476 if(jQuery(".item-timeslots [name=\""+timeslot_name+"\"]").length>0){ 2477 item.set("timeslots",jQuery(".item-timeslots [name=\""+timeslot_name+"\"]")[0].outerHTML); 2478 } 2479 2480 /* set on quote page */ 2481 jQuery(".controls [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected"); 2482 jQuery(".controls [name=\""+timeslot_name+"\"] option[value='"+jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val()+"']").attr("selected","selected"); 2483 } 2484 2485 function setTimePicker(item, timepicker_name){ 2486 let [start_timepicker, end_timepicker] = get_cart_timepickers(timepicker_name); 2487 let start_time = start_timepicker.value; 2488 let end_time = end_timepicker.value; 2489 2490 if(!start_time){ 2491 start_timepicker.style.borderColor = "red"; 2492 } else{ 2493 start_timepicker.style.borderColor = ""; 2494 } 2495 if(!end_time){ 2496 end_timepicker.style.borderColor = "red"; 2497 } else{ 2498 end_timepicker.style.borderColor = ""; 2499 } 2500 2501 let start_timepicker_html = start_timepicker.outerHTML; 2502 let end_timepicker_html = end_timepicker.outerHTML; 2503 if(document.querySelectorAll(".item-timeslots [name=\""+timepicker_name+"\"]").length>0){ 2504 start_timepicker_html = addOrReplaceValueInTimepicker(start_timepicker_html, start_time); 2505 end_timepicker_html = addOrReplaceValueInTimepicker(end_timepicker_html, end_time); 2506 item.set("timeslots", '<div name="'+timepicker_name+'"> Start: '+start_timepicker_html+' End: '+end_timepicker_html+'</div>'); 2507 } 2508 /* set on quote page */ 2509 /* For linen type items with timepickers */ 2510 let rental_id = item.get("rentalid"); 2511 let split_on_colon = rental_id.split(":"); 2512 if(split_on_colon.length > 1){ 2513 fix_time_name_for_linen_rid(timepicker_name, split_on_colon, start_time, end_time, rental_id) 2514 }else{ 2515 let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0]; 2516 let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0]; 2517 if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){ 2518 quote_page_start_timepicker.value = start_time; 2519 quote_page_end_timepicker.value = end_time; 2520 } 2521 } 2522 } 2523 2524 function fix_time_name_for_linen_rid(time_name, split_rid, start_time, end_time, rental_id){ 2525 for(let x = 0; x < split_rid.length; x++){ 2526 temp_timepicker_name = time_name.replace(rental_id, split_rid[x]); 2527 let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0]; 2528 let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0]; 2529 if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){ 2530 quote_page_start_timepicker.value = start_time; 2531 quote_page_end_timepicker.value = end_time; 2532 } 2533 } 2534 } 2535 2536 function addOrReplaceValueInTimepicker(timepicker_html, time_value){ 2537 if(timepicker_html.includes("value=")){ 2538 timepicker_html = [timepicker_html.slice(0, timepicker_html.indexOf("value=")), 'value="'+time_value+'"', timepicker_html.slice(timepicker_html.length-1)].join(""); 2539 }else{ 2540 /* No value defined. Add it at the end of the outer html. */ 2541 let position = timepicker_html.lastIndexOf(">"); 2542 timepicker_html = [timepicker_html.slice(0, position), ' value="'+time_value+'"', timepicker_html.slice(position)].join(""); 2543 } 2544 return timepicker_html 2545 } 2546 2547 function restrictEndTimepickers(){ 2548 setUpTimeRestrictions_cartTimepickers() 2549 setUpTimeRestrictions_timeBasedItems() 2550 } 2551 2552 function setUpTimeRestrictions_timeBasedItems(){ 2553 jQuery("input[name^=start_timeslot_]").change(function() 2554 { 2555 end_timepicker = jQuery("input[name='"+this.name.replace("start", "end")+"']"); 2556 end_timepicker = jQuery(end_timepicker[end_timepicker.length - 1]); 2557 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 2558 if( EndTimeLessThanStartTime( jQuery(this).val(), end_timepicker.val(), "0/0/0", "0/0/0" ) ){ 2559 end_timepicker.val(""); 2560 } 2561 }); 2562 } 2563 2564 function setUpTimeRestrictions_cartTimepickers(){ 2565 jQuery("input[name=timeStart]").change(function() 2566 { 2567 end_timepicker = jQuery("[name='"+this.name.replace("Start", "End")+"']"); 2568 if(jQuery("[name='dateStart']").val() === jQuery("input[name='dateEnd']").val()){ 2569 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 2570 if(EndTimeLessThanStartTime( 2571 jQuery(this).val(), 2572 end_timepicker.val(), 2573 jQuery("[name='dateStart']").val(), 2574 jQuery("[name='dateEnd']").val() ) ) { 2575 end_timepicker.val(""); 2576 } 2577 } 2578 }); 2579 } 2580 2581 function setUpTimeRestrictions_infoHeaderTimepickers(){ 2582 jQuery("#ioHeaderTimeStart").change(function() 2583 { 2584 end_timepicker = jQuery("#ioHeaderTimeEnd"); 2585 if(jQuery("#ioHeaderDateStart").val() === jQuery("#ioHeaderDateEnd").val()){ 2586 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 2587 if(EndTimeLessThanStartTime( 2588 jQuery(this).val(), 2589 end_timepicker.val(), 2590 jQuery("#ioHeaderDateStart").val(), 2591 jQuery("#ioHeaderDateEnd").val() ) ) { 2592 end_timepicker.val(""); 2593 } 2594 } 2595 }); 2596 } 2597 2598 /* 2599 helper function to see if the value from a start timepicker is less than the string value of an end timepicker. 2600 2601 param start_time: string representation of the start time picker. 12hr or 24hr. 2602 param end_time: string representation of the end time picker. 12hr or 24hr. 2603 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. 2604 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. 2605 2606 */ 2607 function EndTimeLessThanStartTime(start_time, end_time, start_date, end_date){ 2608 if(!start_time || !end_time) return false;
2609 start_time = convert12HourTo24Hour(start_time); 2610 end_time = convert12HourTo24Hour(end_time); 2611 var split_start_date = start_date.split("/"); 2612 var split_end_date = end_date.split("/"); 2613 var startDate = buildDateObj(split_start_date, start_time); 2614 var endDate = buildDateObj(split_end_date, end_time); 2615 if(endDate < startDate){ 2616 return true; 2617 } else { 2618 return false; 2619 } 2620 } 2621 function get_cart_timepickers(timepicker_name){ 2622 let start_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "start_timeslot_")); 2623 let end_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "end_timeslot_")); 2624 start_timepicker = start_timepicker[start_timepicker.length-1]; 2625 end_timepicker = end_timepicker[end_timepicker.length-1]; 2626 return Array(start_timepicker, end_timepicker); 2627 } 2628 function restrictStartTimepickerOnSameDaySelect(start_date_str, start_timepicker, end_timepicker){ 2629 let selected_date_obj = convertDateStringtoDateObject(start_date_str); 2630 let current_date_obj = new Date(); 2631 if(current_date_obj.getDate() == selected_date_obj.getDate() && 2632 current_date_obj.getMonth() == selected_date_obj.getMonth() && 2633 current_date_obj.getYear() == selected_date_obj.getYear()){ 2634 let next_hour_time_stamp = current_date_obj.setMinutes(60); 2635 let next_hour_str = getFormattedtime(new Date(next_hour_time_stamp)) 2636 start_timepicker.timepicker("option",{"minTime": next_hour_str}); 2637 2638 /* If the time in the input box is less than the time we just restricted too, then clear time inputs */ 2639 restricted_time_obj = convertDateStringtoDateObject(start_date_str, next_hour_str); 2640 currently_selected_time_obj = convertDateStringtoDateObject(start_date_str, start_timepicker.val()); 2641 if(currently_selected_time_obj < restricted_time_obj){ 2642 start_timepicker.val(next_hour_str); 2643 end_timepicker.val(""); 2644 end_timepicker.timepicker("option",{"minTime": next_hour_str}); 2645 } 2646 }else{ 2647 start_timepicker.timepicker("option",{"minTime": restrictTimeStart}); 2648 } 2649 } 2650 /*</editor-fold>*/ 2651 2652 /*<editor-fold defaultstate="collapsed" desc="Simple Cart Bound Functions">*/ 2653 function cart_onUpdate() { 2654 /* need slight delay so simplecart updates before this runs */ 2655 setTimeout(cart_onUpdate2, 500); 2656 try{ 2657 for(var i=0;i<document.getElementsByClassName("ioCart").length;i++){ 2658 document.getElementsByClassName("ioCart")[i].setAttribute("cnt", simpleCart.items().length); 2659 } 2660 }catch(e){} 2661 } 2662 2663 function cart_onUpdate2() { 2664 jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total())); 2665 if(io_checkavail=="off") return; 2666 jQuery("#cartWarning").hide(); 2667 let hasUnavail = false; 2668 gift_cards_only = false; 2669 simpleCart.each(function (item, x) { 2670 let item_id = item.get("id"); 2671 var giftCardValue = item.get("giftcardvalue"); 2672 if (giftCardValue && giftCardValue.trim()) { 2673 gift_cards_only = true; 2674 } 2675 let avail = 0; 2676 let stop_loop = false; 2677 if (item.get("availability") != null) avail = item.get("availability").replace(" available", ""); 2678 let quantity = Number(item.get("quantity")); 2679 if(item.get("inputtype") == "Map"){ 2680 quantity = 1 2681 } 2682 if(typeof item.get("availability") != 'undefined'){ 2683 if (quantity > Number(avail) || avail == "not") { 2684 /* item.set("availability","<span style=color:red>"+item.get("availability")+"</span>"); */ 2685 setTimeout(function () { 2686 jQuery("#cartItem_" + item_id + " .item-availability").css("color", "red") 2687 }, 10); 2688 //jQuery("#cartWarning").show(); 2689 stop_loop = display_cart_warning(item); 2690 hasUnavail = true; 2691 } else { 2692 jQuery("#cartItem_" + item_id + " .item-availability").css("color", "inherit"); 2693 } 2694 }else{ 2695 event_times = getAvailTimes(); 2696 if(!event_times[0] || !event_times[1]){ 2697 jQuery("#cartWarning").text("Please set the date and time for your event above."); 2698 jQuery("#cartWarning").show() 2699 } 2700 } 2701 2702 var timeslots_html = item.get("timeslots"); 2703 if(typeof timeslots_html != "undefined"){ 2704 if(timeslots_html.length > 0){ 2705 var timeslot_name = getTimeslotName(timeslots_html); 2706 if(timeslots_html.indexOf("<select") >= 0){ 2707 setTimeslotSelected(item, timeslot_name); 2708 }else{ 2709 setTimePicker(item, timeslot_name); 2710 } 2711 } 2712 } 2713 if(stop_loop){ 2714 return false;
2715 } 2716 }); 2717 2718 if(gift_cards_only){ 2719 jQuery("#cartCalendarTimePickerContainer").hide(); 2720 }else{ 2721 jQuery("#cartCalendarTimePickerContainer").show(); 2722 } 2723 2724 if(hasUnavail && io_checkavail!="off"){ 2725 jQuery(".simpleCart_checkout").removeClass("simpleCart_checkout").addClass("simpleCart_checkout_off").trigger("classChange").click(cartShow); 2726 }else if(io_checkavail!="off"){ 2727 jQuery(".simpleCart_checkout_off").removeClass("simpleCart_checkout_off").addClass("simpleCart_checkout").trigger("classChange"); 2728 } 2729 2730 add_cart_buttons = document.querySelectorAll("[class*=add_cart_]"); 2731 if(add_cart_buttons){ 2732 for(let i = 0; i < add_cart_buttons.length; ++i){ 2733 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-cart-arrow-down", "fa-shopping-cart"); 2734 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Added to Cart", "Add to Cart"); 2735 add_cart_buttons[i].style.filter = "brightness(100%)"; 2736 simpleCart.each(function (item, x) { 2737 if( add_cart_buttons[i].className.includes( item.get("rentalid") ) ){ 2738 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-shopping-cart", "fa-cart-arrow-down"); 2739 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Add to Cart", "Added to Cart"); 2740 add_cart_buttons[i].style.filter = "brightness(90%)"; 2741 } 2742 }); 2743 } 2744 } 2745 2746 /* init time-based items */ 2747 if(document.location.href.indexOf("io_quoteform") == -1){ 2748 let today = new Date(); 2749 let io_dd = today.getDate(); 2750 let io_mm = today.getMonth() + 1; 2751 let io_yyyy = today.getFullYear(); 2752 if(restrictTimes){ 2753 jQuery(".item-timeslots .timepicker").each( function() { 2754 if(this.name.includes("end")){ 2755 start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']"); 2756 start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]); 2757 2758 if (io_force_blank_timepickers == "on") 2759 { 2760 start_timepicker.val(""); 2761 jQuery(this).timepicker({ 2762 startTime: "", 2763 endTime: "", 2764 minTime: restrictTimeStart, 2765 maxTime: restrictTimeEnd, 2766 timeFormat: timeFormat, 2767 separator: ":", 2768 className: "elementor-widget-text-editor", 2769 step: 15, 2770 disableTouchKeyboard: true 2771 }); 2772 } 2773 else 2774 { 2775 // Existing logic if "force blank" is not active 2776 if (start_timepicker.val() != "") { 2777 jQuery(this).timepicker({ 2778 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 2779 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 2780 minTime: start_timepicker.val(), 2781 maxTime: restrictTimeEnd, 2782 timeFormat: timeFormat, 2783 separator: ":", 2784 className: "elementor-widget-text-editor", 2785 step: 15, 2786 disableTouchKeyboard: true 2787 }); 2788 } else { 2789 jQuery(this).timepicker({ 2790 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 2791 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 2792 minTime: restrictTimeStart, 2793 maxTime: restrictTimeEnd, 2794 timeFormat: timeFormat, 2795 separator: ":", 2796 className: "elementor-widget-text-editor", 2797 step: 15, 2798 disableTouchKeyboard: true 2799 }); 2800 } 2801 } 2802 2803 } 2804 else { 2805 if (io_force_blank_timepickers == "on") 2806 { 2807 start_timepicker.val(""); 2808 jQuery(this).timepicker({ 2809 startTime: "", 2810 endTime: "", 2811 minTime: restrictTimeStart, 2812 maxTime: restrictTimeEnd, 2813 timeFormat: timeFormat, 2814 separator: ":", 2815 className: "elementor-widget-text-editor", 2816 step: 15, 2817 disableTouchKeyboard: true 2818 }); 2819 } 2820 else 2821 { 2822 jQuery(this).timepicker({ 2823 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 2824 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 2825 minTime:restrictTimeStart, 2826 maxTime:restrictTimeEnd, 2827 timeFormat: timeFormat, 2828 separator: ":", 2829 className: "elementor-widget-text-editor", 2830 step: 15, 2831 disableTouchKeyboard: true 2832 }); 2833 } 2834 } 2835 }); 2836 } else{ 2837 jQuery(".item-timeslots .timepicker").each( function() { 2838 if(this.name.includes("end") != -1){ 2839 start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']"); 2840 start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]); 2841 if (io_force_blank_timepickers == "on") 2842 { 2843 start_timepicker.val(""); 2844 jQuery(this).timepicker({ 2845 startTime: "", 2846 endTime: "", 2847 minTime: restrictTimeStart, 2848 maxTime: restrictTimeEnd, 2849 timeFormat: timeFormat, 2850 separator: ":", 2851 className: "elementor-widget-text-editor", 2852 step: 15, 2853 disableTouchKeyboard: true 2854 }); 2855 } 2856 else 2857 { 2858 if (start_timepicker.val() != "") { 2859 jQuery(this).timepicker({ 2860 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 2861 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 2862 minTime: start_timepicker.val(), 2863 timeFormat: timeFormat, 2864 separator: ":", 2865 className: "elementor-widget-text-editor", 2866 step: 15, 2867 disableTouchKeyboard: true 2868 }); 2869 } else { 2870 jQuery(this).timepicker({ 2871 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 2872 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 2873 timeFormat: timeFormat, 2874 separator: ":", 2875 className: "elementor-widget-text-editor", 2876 step: 15, 2877 disableTouchKeyboard: true 2878 }); 2879 } 2880 } 2881 } 2882 else 2883 { 2884 if (io_force_blank_timepickers == "on") 2885 { 2886 start_timepicker.val(""); 2887 jQuery(this).timepicker({ 2888 startTime: "", 2889 endTime: "", 2890 minTime: restrictTimeStart, 2891 maxTime: restrictTimeEnd, 2892 timeFormat: timeFormat, 2893 separator: ":", 2894 className: "elementor-widget-text-editor", 2895 step: 15, 2896 disableTouchKeyboard: true 2897 }); 2898 } 2899 else 2900 { 2901 jQuery(this).timepicker({ 2902 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 2903 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 2904 timeFormat: timeFormat, 2905 separator: ":", 2906 className: "elementor-widget-text-editor", 2907 step: 15, 2908 disableTouchKeyboard: true 2909 }); 2910 } 2911 } 2912 }); 2913 } 2914 setUpTimeRestrictions_timeBasedItems(); 2915 if(!event_time_set()){ 2916 jQuery(".itemRow .item-total").hide(); 2917 }else{ 2918 jQuery(".itemRow .item-total").show(); 2919 } 2920 } 2921 } 2922 function cart_beforeCheckout(data) { 2923 data.startdate = jQuery("input[name=dateStart]").val(); 2924 data.enddate = jQuery("input[name=dateEnd]").val(); 2925 if(getCookie("guid")){ 2926 data.guid = getCookie("guid"); 2927 }else{ 2928 data.io_custguid = fetchAndSetCookie("guid"); 2929 } 2930 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2931 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 2932 if(cart_company_timeslot_selected){
2933 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 2934 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 2935 data.starttime = cart_company_timeslot_selected[0]; 2936 data.endtime = cart_company_timeslot_selected[1]; 2937 } 2938 } else { 2939 data.starttime = jQuery("input[name=timeStart]").val(); 2940 data.endtime = jQuery("input[name=timeEnd]").val(); 2941 } 2942 } 2943 function cart_beforeAdd(item) { 2944 var main_id = jQuery(".io_product_container .item_rentalid").first().text(); 2945 var item_id = item.get("rentalid"); 2946 2947 timeslots = item.get("timeslots"); 2948 if(timeslots){ 2949 if(timeslots.indexOf("<select") !== -1){ 2950 timeslot_name_id_start_pos = timeslots.lastIndexOf('name="timeslot_') + 'name="timeslot_'.length; 2951 timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos); 2952 new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)] 2953 new_timeslots = new_timeslots.join("") 2954 item.set("timeslots", new_timeslots); 2955 }else if(timeslots.indexOf("<div name=\"io_timepicker_") !== -1){ 2956 timeslot_name_id_start_pos = timeslots.lastIndexOf('name="io_timepicker_') + 'name="io_timepicker_'.length; 2957 timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos); 2958 new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)] 2959 new_timeslots = new_timeslots.join("") 2960 2961 timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="start_timeslot_') + 'name="start_timeslot_'.length; 2962 timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos); 2963 new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)] 2964 new_timeslots = new_timeslots.join("") 2965 2966 timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="end_timeslot_') + 'name="end_timeslot_'.length; 2967 timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos); 2968 new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)] 2969 new_timeslots = new_timeslots.join("") 2970 2971 item.set("timeslots", new_timeslots); 2972 } 2973 2974 } 2975 /* Here we are checking if we are on an item page and if we are adding the main item. 2976 If this is not true, we do not want to continue. Bail here. */ 2977 if((!main_id || !item_id)){ 2978 return true; 2979 }else if (item_id != main_id){ 2980 /* we are adding an accessory, We want to forcibly add the main item first. */ 2981 /* IO-26864 */ 2982 jQuery("#bookNowBtn").click(); 2983 } 2984 let required_dropdown_values = jQuery(".io_acc_li").filter(function() { 2985 let required_ele = jQuery(this).find(".item_required"); 2986 let required = 0; 2987 if(required_ele[0]){ 2988 required = required_ele[0].outerText; 2989 } 2990 let dropdown_ele = jQuery(this).find(".item_accessorydd"); 2991 let dropdown = 0; 2992 if(dropdown_ele[0]){ 2993 dropdown = dropdown_ele[0].outerText; 2994 } 2995 return (required > 0 && dropdown == 1) 2996 }); 2997 var required_selected = true; 2998 required_dropdown_values.each(function() { 2999 required_value_id = jQuery(this).find(".item_rentalid")[0].outerText; 3000 required_value_id = required_value_id.split("_"); 3001 required_value_id = required_value_id[required_value_id.length-1]; 3002 3003 let selected = jQuery("[id^='io_acc_"+required_value_id+"']").filter(function() { 3004 return this["selected"]; 3005 }); 3006 3007 //IO-22431 - This wasnt catching if [0] was undefined 3008 if(jQuery(this).find(".io_acc_li_name")[0] != undefined){ 3009 required_value_name = jQuery(this).find(".io_acc_li_name")[0].outerText ? jQuery(this).find(".io_acc_li_name")[0].outerText : ""; 3010 } 3011 if(selected.length < jQuery(this).find(".item_required")[0].outerText){ 3012 if(item_id == main_id){ 3013 alert(required_value_name+" is a required field."); 3014 } 3015 required_selected = false;
3016 } 3017 3018 if(!required_selected){ 3019 return false; 3020 } 3021 return true; 3022 }); 3023 if(!required_selected){ 3024 return false; 3025 } 3026 3027 /* IO-14857 */ 3028 if(jQuery(".io_product_measurement_price").length > 0){ 3029 let units; 3030 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 3031 units = "sq meters" 3032 if(country === "US") units = "sq feet" 3033 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 3034 units = "meters" 3035 if(country === "US") units = "feet" 3036 } 3037 item.set("units", units); 3038 item.set("quantity", jQuery(".io_measure_price_raw_measurement").text()); 3039 } 3040 } 3041 function cart_afterAdd(item) { 3042 /*loading animation*/ 3043 ioCartLoaderActivate(); 3044 setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300); 3045 3046 /* Add required Accessories */ 3047 let required_accs = jQuery("[id^=io_acc_required_]").filter(function() { 3048 return parseInt(this["outerText"]) > 0 && this.parentElement.style['display'] != 'none'; 3049 }); 3050 required_accs.each(function(index) { 3051 simpleCart.parse_html_and_add(this, true); 3052 }); 3053 3054 3055 let selected_values = jQuery("[id^=io_acc_]").filter(function() { 3056 return this["selected"]; 3057 }); 3058 3059 selected_values.each(function() { 3060 let info = {}; 3061 let rid = jQuery(this).find(".item_rentalid")[0].outerText; 3062 let split_rid = rid.split("_"); 3063 if(split_rid.length == 3){ 3064 let parent_rid = split_rid[1]; 3065 let main_item_rid = split_rid[0]; 3066 info["acc_dd_parent_limit"] = jQuery("#io_acc_accessorylimit_"+main_item_rid+"_"+parent_rid)[0].outerText; 3067 }else{ 3068 info["acc_dd_parent_limit"] = "0"; 3069 } 3070 info["name"] = jQuery(this).find(".io_acc_li_name")[0].outerText 3071 info["qtyincrement"] = jQuery(this).find(".item_qtyincrement")[0].outerText 3072 info["quantity"] = jQuery(this).find(".item_required")[0].outerText > 0 ? jQuery(this).find(".item_required")[0].outerText : 1; 3073 info["rentalid"] = jQuery(this).find(".item_rentalid")[0].outerText 3074 info["linkqty"] = jQuery(this).find(".item_linkqty")[0].outerText 3075 info["pagename"] = io_pagename; 3076 if(jQuery(this).find(".io_acc_li_img_thumb")[0]){ 3077 info["image"] = jQuery(this).find(".io_acc_li_img_thumb")[0].src 3078 } 3079 let already_added = simpleCart.items().filter((item) => item.get("rentalid").startsWith(split_rid[0]+"_"+split_rid[1])); 3080 if(jQuery(this).find(".item_accessorydd")[0].outerText != 1 && 3081 (info["acc_dd_parent_limit"] == "0" || already_added.length < info["acc_dd_parent_limit"]) ){ 3082 simpleCart.add(info, true); 3083 } 3084 }); 3085 3086 checkAvailCartOnly(true); 3087 3088 let last_upsell_call_time = Date.now() - last_upsell_call; 3089 if(in_cart_upsell && last_upsell_call_time > 2000){ 3090 let rental_ids = ""; 3091 3092 /* Get the last element in the cart. This is the last item added. */ 3093 last_added = jQuery("[id^='cartItem_']").last(); 3094 if(last_added.length){ 3095 last_added_children = last_added.children(); 3096 for(let i = 0; i < last_added_children.length; ++i){ 3097 if(last_added_children[i].className == "item-rentalid") { 3098 rental_ids += last_added_children[i].innerText + "|"; 3099 } 3100 } 3101 } 3102 3103 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3104 var times = getAvailTimes(); 3105 last_upsell_call = Date.now(); 3106 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3107 } 3108 else{ 3109 jQuery("#cart-carousel-container").hide(); 3110 } 3111 } 3112 3113 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 3114 filterTimeslotsByDay_itemTimeslots(); 3115 simpleCart.update(); 3116 } 3117 3118 if (jQuery(".cartInfo.open,.ioCart.open, .ioCart_link.open").length == 0) { 3119 setTimeout(function () { 3120 cartShow(); 3121 }, 100); 3122 } 3123 3124 if(simpleCart.items().length==0){
3125 jQuery(".simpleCart_checkout").hide() 3126 }else{ 3127 jQuery(".simpleCart_checkout").show(); 3128 } 3129 3130 if(simpleCart.items().length > 0){ 3131 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 3132 headerBookButton.addClass("ioCart_link"); 3133 headerBookButton.attr("href", "javascript:;"); 3134 } 3135 3136 checkRestrictedDeliveries() 3137 3138 if(jQuery("#ioInfoHeader").length){ 3139 header_increment_step(); 3140 } 3141 } 3142 function cart_afterQtyChange(){ 3143 let last_checkAvail_call_time = Date.now() - last_checkAvail_call; 3144 if(last_checkAvail_call_time > 2000){ 3145 /*loading animation*/ 3146 ioCartLoaderActivate(); 3147 setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300); 3148 last_checkAvail_call = Date.now(); 3149 checkAvailCart(); 3150 checkAvailCartTimeslots(); 3151 } 3152 } 3153 function cart_hideTimepickerWrapper(){ 3154 jQuery(".ui-timepicker-wrapper").hide(); 3155 } 3156 function cart_beforeRemove() { 3157 last_remove = Date.now(); 3158 } 3159 function cart_afterRemove(removed_item){ 3160 checkAvailCart(); 3161 last_upsell_call_time = Date.now() - last_upsell_call; 3162 if(in_cart_upsell && last_upsell_call_time > 2000){ 3163 rental_ids = getAllRentalIDsFromCart(); 3164 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3165 var times = getAvailTimes(); 3166 last_upsell_call = Date.now(); 3167 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3168 } 3169 else{ 3170 jQuery("#cart-carousel-container").hide(); 3171 } 3172 } 3173 3174 /* IO-24060 */
3175 simpleCart.items().forEach(function (item, index) { 3176 let expression = '^' + removed_item.get('rentalid') + '(?:[_:]\\d+)*'; 3177 if(item.get("rentalid").match(expression)){ 3178 item.remove(); 3179 } 3180 }); 3181 3182 3183 checkAvailCartTimeslots(); 3184 checkRestrictedDeliveries(); 3185 if(simpleCart.items().length==0){ 3186 jQuery(".simpleCart_checkout").hide() 3187 }else{ 3188 jQuery(".simpleCart_checkout").show(); 3189 } 3190 3191 if(jQuery("#ioInfoHeader").length && simpleCart.items().length == 0){ 3192 jQuery("#io-step-3").removeClass("io-step-active"); 3193 jQuery("#io-step-2").addClass("io-step-active"); 3194 jQuery("#io-step-2").removeClass("io-step-done") 3195 } 3196 } 3197 function cart_afterLoad(){ 3198 var items_removed = false; 3199 simpleCart.items().forEach(function(item){ 3200 if(item.get("pagename") != io_pagename){ 3201 item.remove() 3202 items_removed = true; 3203 } 3204 }) 3205 if(items_removed){ 3206 alert("Some items in the cart are from a different location and have been removed."); 3207 } 3208 } 3209 /*</editor-fold>*/ 3210 3211 /*<editor-fold defaultstate="collapsed" desc="Date/Time Object/String Conversion Functions">*/ 3212 function getFormatteddate(date_obj){ 3213 if(dateFormat.substring(0,1)=='d'){ 3214 let month = date_obj.getMonth() + 1; 3215 formatteddate = date_obj.getDate()+'/'+month+'/'+date_obj.getFullYear(); 3216 }else{ 3217 let month = date_obj.getMonth() + 1; 3218 formatteddate = month+'/'+date_obj.getDate()+'/'+date_obj.getFullYear(); 3219 } 3220 return formatteddate; 3221 } 3222 3223 function getFormattedtime(date_obj){ 3224 var hour24 = false;
3225 var ampm = 'am'; 3226 var starttime = jQuery('[name=timeStart]').val(); 3227 if(starttime.length>0 && starttime.indexOf('m')==-1) hour24 = true; 3228 if(hour24){ //24 hour return 3229 return date_obj.getHours()+':'+pad(date_obj.getMinutes(),2); 3230 }else{ //12 hour return 3231 var hour = date_obj.getHours(); 3232 if(hour==12) ampm='pm'; 3233 if(hour==0) hour=12; 3234 if(hour>12){ 3235 hour-=12; 3236 ampm='pm'; 3237 } 3238 return hour+':'+pad(date_obj.getMinutes(),2)+' '+ampm; 3239 } 3240 } 3241 3242 function buildDateobjectstring(date,dateformat,time){ 3243 var ampm = 'am'; 3244 var hour24 = false; 3245 if(typeof date == "undefined") return; 3246 if(typeof dateformat == "undefined") return; 3247 var start_arr = date.split('/'); 3248 if(dateformat.substring(0,1)=='d'){ 3249 date = start_arr[2]+'/'+pad(start_arr[1],2)+'/'+pad(start_arr[0],2); 3250 }else{ 3251 date = start_arr[2]+'/'+pad(start_arr[0],2)+'/'+pad(start_arr[1],2); 3252 } 3253 if(time.length>0 && time.indexOf('m')==-1) hour24 = true; 3254 if(hour24){ 3255 try{ 3256 var time_arr = time.split(':'); 3257 var hour = parseInt(time_arr[0]); 3258 var min = pad(time_arr[1], 2); 3259 time = hour + ':' + min + ':00'; 3260 }catch(err){ 3261 time = ""; 3262 } 3263 }else { 3264 try { 3265 time = time.replace('am', "").replace(' ', ""); 3266 if (time.indexOf('pm') != -1) ampm = 'pm'; 3267 time = time.replace('pm', "").replace(' ', ""); 3268 var time_arr = time.split(':'); 3269 var hour = parseInt(time_arr[0]); 3270 var min = pad(time_arr[1], 2); 3271 if (ampm == 'pm') { 3272 if (hour < 12) hour += 12; 3273 } else if (ampm == 'am' && hour == 12) { 3274 hour -= 12; 3275 } 3276 hour = pad(hour, 2); 3277 time = hour + ':' + min + ':00'; 3278 } catch (err) { 3279 time = ""; 3280 } 3281 } 3282 return date+' '+time; 3283 } 3284 3285 function pad(num, size) { 3286 var s = num+""; 3287 while (s.length < size) s = "0" + s; 3288 return s; 3289 } 3290 function convertDateStringtoDateObject(date_str, time_str=null){ 3291 if(date_str){ 3292 split_date_str = date_str.split("/"); 3293 /* Parse start and end time. */ 3294 if(time_str){ 3295 /* Check and see if we are in 12 hour format, if so convert it to 24 hour format. */ 3296 split_time_str = convert12HourTo24Hour(time_str); 3297 }else{ 3298 /* If we do not have a time, then default to zeros */ 3299 split_time_str = [0, 0]; 3300 } 3301 /* Create date object based off our set date format. */ 3302 date_obj = buildDateObj(split_date_str, split_time_str); 3303 return date_obj; 3304 }else{ 3305 return new Date(); 3306 } 3307 } 3308 3309 function buildDateObj(split_date_str, split_time_str){ 3310 if (dateFormat == "d/m/yy"){ 3311 return new Date(split_date_str[2], (+split_date_str[1] - 1).toString(), split_date_str[0], 3312 split_time_str[0], split_time_str[1]); 3313 }else{ 3314 return new Date(split_date_str[2], (+split_date_str[0] - 1).toString(), split_date_str[1], 3315 split_time_str[0], split_time_str[1]); 3316 } 3317 } 3318 3319 function convert12HourTo24Hour(time_str){ 3320 /* This function returns an array containing hours and minutes of provided string in 24 hour format. */ 3321 /* This is primarily used for creating JS Date objects */ 3322 split_time = time_str.split(":"); 3323 3324 /* We are in 12 hour format if there is an "m" attached to minutes portion. */ 3325 if(split_time[1].toLowerCase().search("m") != -1) { 3326 let separated_minutes = split_time[1].split(" "); 3327 if(separated_minutes.length==1){ 3328 split_time[1] = split_time[1].replace("am"," am"); 3329 split_time[1] = split_time[1].replace("pm"," pm"); 3330 separated_minutes = split_time[1].split(" "); 3331 } 3332 let minutes = separated_minutes[0]; 3333 let modifier = separated_minutes[1]; 3334 split_time[1] = minutes; 3335 3336 /* First assume that if the hours are 12, then its midnight. */ 3337 if(split_time[0] == "12"){ 3338 split_time[0] = "00"; 3339 } 3340 /* Second if there is a "p" in the modifier, then add twelve to the hours. */ 3341 if(typeof modifier != "undefined"){ 3342 if(modifier.toLowerCase().search("p") != -1){ 3343 split_time[0] = (parseInt(split_time[0], 10) + 12); 3344 } 3345 } 3346 } 3347 return split_time; 3348 } 3349 /*</editor-fold>*/ 3350 3351 /*<editor-fold defaultstate="collapsed" desc="Cart Show and Hide">*/ 3352 function cartShow() { 3353 jQuery("#cartPopover").show(); 3354 jQuery("#cartPopover").removeClass("cartOut"); 3355 jQuery("#cartPopover").addClass("cartIn"); 3356 jQuery(".cartInfo,.ioCart,.ioCart_link").addClass("open"); 3357 if (/Mobi|Android/i.test(navigator.userAgent)) { 3358 document.body.style.overflow = "hidden"; 3359 } 3360 /* jQuery(this).one("click", cartHide); */ 3361 jQuery(".cartInfo").unbind("click").one("click", function(event){ 3362 event.stopPropagation(); 3363 event.stopImmediatePropagation(); 3364 cartHide(); 3365 }); 3366 jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){ 3367 event.stopPropagation(); 3368 event.stopImmediatePropagation(); 3369 cartHide(); 3370 }); 3371 jQuery(".cartIcon").removeClass("fa-shopping-cart").addClass("fa-close"); 3372 if(simpleCart.items().length==0){
3373 jQuery(".simpleCart_checkout").hide() 3374 }else{ 3375 jQuery(".simpleCart_checkout").show(); 3376 } 3377 3378 checkAvailCartOnly(); 3379 3380 last_upsell_call_time = Date.now() - last_upsell_call; 3381 if(in_cart_upsell && last_upsell_call_time > 2000){ 3382 rental_ids = getAllRentalIDsFromCart(); 3383 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3384 var times = getAvailTimes(); 3385 last_upsell_call = Date.now(); 3386 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3387 } 3388 else{ 3389 jQuery("#cart-carousel-container").hide(); 3390 } 3391 } 3392 } 3393 3394 function cartHide() { 3395 jQuery("#cartPopover").removeClass("cartIn"); 3396 jQuery("#cartPopover").addClass("cartOut"); 3397 if (/Mobi|Android/i.test(navigator.userAgent)) { 3398 document.body.style.overflow = "auto"; 3399 } 3400 /* jQuery("#cartPopover").hide(); */ 3401 jQuery(".cartInfo,.ioCart, .ioCart_link").removeClass("open"); 3402 /* jQuery(this).one("click", cartShow); */ 3403 jQuery(".cartInfo").unbind("click").one("click", function(event){ 3404 event.stopPropagation(); 3405 event.stopImmediatePropagation(); 3406 cartShow(); 3407 }); 3408 jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){ 3409 event.stopPropagation(); 3410 event.stopImmediatePropagation(); 3411 cartShow(); 3412 }); 3413 jQuery(".cartIcon").removeClass("fa-close").addClass("fa-shopping-cart"); 3414 } 3415 /* 3416 function set_date_cookie(){ 3417 if(this.id.indexOf("start_") !== -1){ 3418 setCookie("dateStart", this.value, 14); 3419 } else if(this.id.indexOf("end_") !== -1){ 3420 setCookie("dateEnd", this.value, 14); 3421 } 3422 } 3423 */ 3424 jQuery(document).ready(function () {setTimeout(simpleCart.init, 3);}); 3425 /*</editor-fold>*/ 3426 3427 /*<editor-fold defaultstate="collapsed" desc="Check Avail All Call">*/ 3428 function checkAvailAll(){ 3429 checkAvailCart(); 3430 checkAvailCartTimeslots(); 3431 checkAvailFilter(); 3432 } 3433 /*</editor-fold>*/ 3434 3435 /*<editor-fold defaultstate="collapsed" desc="Check Avail - Page">*/ 3436 /* for items on page not in cart */ 3437 function checkAvailFilter() { 3438 let rental_names = ""; 3439 let rental_ids = ""; 3440 let batch_ids = []; 3441 let cart_rental_names = ""; 3442 let cart_rental_ids = ""; 3443 let item_id = ""; 3444 let main_id = ""; 3445 jQuery(".item_encoded").each(function(){ 3446 rental_names += this.innerText + "|"; 3447 }); 3448 jQuery(".io_product_infobox .item_rentalid").each(function(){ 3449 rental_ids += this.innerText + "|"; 3450 item_id = this.innerText; 3451 main_id = this.innerText; 3452 }); 3453 let batch_count = 0; 3454 let batch_index = 0; 3455 // If we have rental id string set, then we don't want to include availability checking for fpw items in header 3456 // IO-31498 3457 if(!rental_ids) { 3458 jQuery(".io_item2_list_inner .item_rentalid, .io_item2_listrent .item_rentalid").each(function () { 3459 /* 3460 if(rental_ids.indexOf(this.innerText+"|") == -1){ 3461 rental_ids += this.innerText + "|"; 3462 } 3463 */ 3464 if (batch_count < 9) { 3465 if (!batch_ids.length) batch_ids.push("") 3466 if (!rid_in_batch(this.innerText + "|", batch_ids).length) { 3467 batch_ids[batch_index] += this.innerText + "|"; 3468 batch_count++; 3469 } 3470 } else { 3471 if (!rid_in_batch(this.innerText + "|", batch_ids).length) { 3472 batch_ids[batch_index] += this.innerText + "|"; 3473 batch_index++; 3474 batch_count = 0; 3475 batch_ids.push(""); 3476 } 3477 } 3478 }); 3479 } 3480 simpleCart.each(function (item, x) { 3481 var cart_name = item.get("encoded"); 3482 if(cart_name==null){ 3483 cart_name = encodeURIComponent(item.get("name")); 3484 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 3485 } 3486 let quantity = item.get("quantity"); 3487 if(item.get("inputtype") == "Map"){ 3488 quantity = 1 3489 } 3490 cart_rental_names += cart_name + "-" + quantity + "|"; 3491 var cart_id = item.get("rentalid"); 3492 cart_rental_ids += cart_id + "-" + quantity + "|"; 3493 }); 3494 /* #14494 IO-13779 */ 3495 let delivery_methods_arr = []; 3496 var delivery_prices = []; 3497 if(io_delivery_prices){ 3498 if(Object.keys(io_delivery_prices["override"]).includes(item_id)){ 3499 delivery_prices = io_delivery_prices["override"][item_id] 3500 }else{ 3501 if(!item_is_in_overrride_group(main_id)){ 3502 delivery_prices = io_delivery_prices["default"] 3503 } 3504 } 3505 for(item in io_delivery_methods){ 3506 if(delivery_prices.includes(io_delivery_methods[item]["id"])){ 3507 delivery_methods_arr.push(item); 3508 } 3509 } 3510 } 3511
3512 let custom_prices_arr = []; 3513 if(io_custom_prices){ 3514 if(Object.keys(io_custom_prices["override"]).includes(item_id.replace(":", '_'))){ 3515 custom_prices_arr = io_custom_prices["override"][item_id.replace(":", '_')] 3516 }else{ 3517 if(!item_is_in_overrride_group(main_id)){ 3518 custom_prices_arr = io_custom_prices["default"] 3519 } 3520 } 3521 } 3522 3523 /* IO-13548 */ 3524 if(io_accessory_price == "on"){ 3525 let times = getAvailTimes(); 3526 let acc_rental_id_str = getAccIDforPrice(); 3527 let return_id = 0; 3528 if(acc_rental_id_str != ""){ 3529 checkAvailCall(times[0],times[1],times[2],rental_names,acc_rental_id_str,displayAccessoryPrices,0,[],[],return_id,0,null,1,"",1); 3530 } 3531 } 3532 3533 let times = getAvailTimes(); 3534 if(rental_names.length>0){ 3535 if(use_weekday_weekend && rental_ids && !item_is_in_overrride_group(main_id)){ 3536 let return_id = 0; 3537 let week_weekend = ""; 3538 if(rental_ids != ""){ 3539 return_id = 1; 3540 week_weekend = get_week_weekend_times(times, main_id); 3541 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); 3542 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); 3543 } 3544 } 3545 let return_id = 0; 3546 if(rental_ids != "" || batch_ids.length){ 3547 return_id = 1; 3548 } 3549 if(delivery_methods_arr && rental_ids){ 3550 delivery_methods_arr.forEach(function(delivery_method){ 3551 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); 3552 }); 3553 } 3554 if(custom_prices_arr && rental_ids){ 3555 custom_prices_arr.forEach(function(custom_price){ 3556 let start_date = times[0]; 3557 let start_time = times[1]; 3558 if(!start_date){ 3559 start_date = getFormatteddate(new Date()); 3560 } 3561 if(!start_time){ 3562 start_time = io_default_start_time; 3563 } 3564 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']); 3565 }); 3566 } 3567 3568 if(batch_ids.length){ 3569 batch_ids.forEach(function(rids){ 3570 return checkAvailCall(times[0],times[1],times[2],"",rids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1,"",1); 3571 }); 3572 }else{ 3573 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); 3574 } 3575 } 3576 } 3577 3578 function item_is_in_overrride_group(item_id){ 3579 for(const group_id in io_prices['override_groups']){ 3580 for(const search_id in io_prices['override_groups'][group_id]){ 3581 if(search_id == item_id){ 3582 return true; 3583 } 3584 } 3585 } 3586 return false 3587 } 3588 3589 function get_week_weekend_times(times, rid){ 3590 /* Create a copy instead of reference.*/ 3591 let temp_times = JSON.parse(JSON.stringify(times)); 3592 let start_date = temp_times[0]; 3593 if(!start_date){ 3594 start_date = getFormatteddate(new Date()); 3595 temp_times[0] = start_date; 3596 } 3597 temp_times[1] = io_default_start_time 3598 var newDate1 = convertDateStringtoDateObject(start_date, io_default_start_time); 3599 var newDate2 = convertDateStringtoDateObject(start_date, io_default_end_time); 3600 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 3601 temp_times[2] = time_duration; 3602 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 3603 let weekday_weekend = {}; 3604 weekday_weekend["rid"] = rid; 3605 if(io_weekendDefine == "friday-sunday"){ 3606 if(day == 5 || day == 6 || day == 0){ 3607 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3608 temp_times[0] = getNextMonday(temp_times[0]); 3609 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3610 }else if(day == 1 || day == 2 || day == 3 || day == 4){ 3611 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3612 temp_times[0] = getNextSaturday(temp_times[0]); 3613 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3614 } 3615 }else if(io_weekendDefine == "saturday-sunday") { 3616 if (day == 6 || day == 0) { 3617 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3618 temp_times[0] = getNextMonday(temp_times[0]); 3619 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3620 } else if (day == 1 || day == 2 || day == 3 || day == 4 || day == 5) { 3621 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3622 temp_times[0] = getNextSaturday(temp_times[0]); 3623 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3624 } 3625 }else if (io_weekendDefine == "friday-monday"){ 3626 if(day == 5 || day == 6 || day == 0 || day == 1){ 3627 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3628 temp_times[0] = getNextTuesday(temp_times[0]); 3629 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3630 }else if(day == 2 || day == 3 || day == 4){ 3631 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 3632 temp_times[0] = getNextSaturday(temp_times[0]); 3633 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 3634 } 3635 } 3636 return weekday_weekend; 3637 } 3638 3639 /* 3640 helper function found here: 3641 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. 3642 */ 3643 function getNextMonday(date_str) { 3644 const date_obj = parseDate(date_str, dateFormat); 3645 3646 const nextMonday = new Date( 3647 date_obj.setDate( 3648 date_obj.getDate() + ((7 - date_obj.getDay() + 1) % 7 || 7), 3649 ), 3650 ); 3651 3652 return getFormatteddate(nextMonday); 3653 } 3654 3655 function getNextTuesday(date_str) { 3656 const date_obj = parseDate(date_str, dateFormat); 3657 3658 const nextMonday = new Date( 3659 date_obj.setDate( 3660 date_obj.getDate() + ((7 - date_obj.getDay() + 2) % 7 || 7), 3661 ), 3662 ); 3663 3664 return getFormatteddate(nextMonday); 3665 } 3666 3667 function parseDate(date_str, format) { 3668 var parts = date_str.split(/[/.-]/); 3669 var day, month, year; 3670 3671 if (format === "m/d/yy") {
3672 month = parseInt(parts[0]) - 1; 3673 day = parseInt(parts[1]); 3674 year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0); 3675 } else if (format === "d/m/yy") { 3676 day = parseInt(parts[0]); 3677 month = parseInt(parts[1]) - 1; 3678 year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0); 3679 } else if (format === "yy/m/d") { 3680 year = parseInt(parts[0]) + (parts[0].length === 2 ? 2000 : 0); 3681 month = parseInt(parts[1]) - 1; 3682 day = parseInt(parts[2]); 3683 } else { 3684 throw new Error("Unsupported date format"); 3685 } 3686 3687 return new Date(year, month, day); 3688 } 3689 3690 /* modified from function above */ 3691 function getNextSaturday(date_str) { 3692 const date_obj = parseDate(date_str, dateFormat); 3693 3694 const next_friday = new Date( 3695 date_obj.setDate( 3696 date_obj.getDate() + ((7 - date_obj.getDay() + 6) % 7 || 7), 3697 ), 3698 ); 3699 3700 return getFormatteddate(next_friday); 3701 } 3702 3703 function updatePageAvail(data){ 3704 let use_id = data["return_id"] 3705 delete data["return_id"]; 3706 if(use_id == 1){ 3707 updatePageAvail_itemIDs(data) 3708 }else{ 3709 updatePageAvail_itemNames(data); 3710 } 3711 } 3712 function updatePageAvail_weekday(data){ 3713 jQuery.each(data, function (rental_id, qty){ 3714 if (rental_id == "price") { 3715 var prices = qty; 3716 jQuery.each(prices, function (price_id, amt) { 3717 let cust_price = document.querySelector(".io_product_cust_price_weekday"); 3718 if(cust_price==undefined){ 3719 var first_price = document.querySelector(".io_product_price_box"); 3720 if(first_price != null){ 3721 cust_price = first_price.cloneNode(true); 3722 /* clear all classes */ 3723 cust_price.className = ""; 3724 cust_price.classList.add("io_product_price_box"); 3725 cust_price.classList.add("io_product_cust_price_weekday"); 3726 cust_price.style.display = "none"; 3727 first_price.before(cust_price); 3728 } 3729 } 3730 3731 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3732 if(main_item_id == price_id && cust_price!=undefined){ 3733 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3734 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3735 let times = getAvailTimes(); 3736 cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekDayText; 3737 if(amt>0){ 3738 cust_price.style.display = "grid"; 3739 }else{ 3740 cust_price.style.display = "none"; 3741 } 3742 } 3743 }); 3744 } 3745 }); 3746 } 3747 function updatePageAvail_delivery_method(data){ 3748 var delivery_method = data["delivery_method"] 3749 jQuery.each(data, function (rental_id, qty){ 3750 if (rental_id == "price") { 3751 var prices = qty; 3752 jQuery.each(prices, function (price_id, amt) { 3753 let cust_price = document.querySelector(".io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]); 3754 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 3755 if(cust_price==undefined && !io_delivery_methods[delivery_method]["restricted"].includes(rid)){ 3756 var first_price = document.querySelector(".io_product_price_box"); 3757 if(first_price != null){ 3758 cust_price = first_price.cloneNode(true); 3759 /* clear all classes */ 3760 cust_price.className = ""; 3761 cust_price.classList.add("io_product_price_box"); 3762 cust_price.classList.add("io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]); 3763 cust_price.style.display = "none"; 3764 first_price.before(cust_price); 3765 } 3766 } 3767 3768 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3769 if(main_item_id == price_id && cust_price!=undefined){ 3770 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3771 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3772 let times = getAvailTimes(); 3773 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times, delivery_method); 3774 if(amt>0 && event_time_set()){ 3775 cust_price.style.display = "grid"; 3776 }else{ 3777 cust_price.style.display = "none"; 3778 } 3779 } 3780 }); 3781 } 3782 }); 3783 } 3784 function updatePageAvail_custom_price(data, custom_price_name){
3785 let custom_price_class_name = custom_price_name.replace(/[\s:./()!]/g, '_'); 3786 jQuery.each(data, function (rental_id, qty){ 3787 if (rental_id == "price") { 3788 var prices = qty; 3789 jQuery.each(prices, function (price_id, amt) { 3790 let cust_price = document.querySelector(".io_product_cust_price_"+custom_price_class_name); 3791 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 3792 if(cust_price==undefined){ 3793 var first_price = document.querySelector(".io_product_price_box"); 3794 if(first_price != null){ 3795 cust_price = first_price.cloneNode(true); 3796 /* clear all classes */ 3797 cust_price.className = ""; 3798 cust_price.classList.add("io_product_price_box"); 3799 cust_price.classList.add("io_product_cust_price_"+custom_price_class_name); 3800 cust_price.style.display = "none"; 3801 first_price.before(cust_price); 3802 } 3803 } 3804 3805 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3806 if(main_item_id == price_id && cust_price!=undefined){ 3807 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3808 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3809 cust_price.querySelector("p:nth-child(2)").innerHTML = "for " + custom_price_name; 3810 if(amt>0){ 3811 cust_price.style.display = "grid"; 3812 }else{ 3813 cust_price.style.display = "none"; 3814 } 3815 } 3816 }); 3817 } 3818 }); 3819 } 3820 function updatePageAvail_weekend(data){ 3821 jQuery.each(data, function (rental_id, qty){ 3822 if (rental_id == "price") { 3823 var prices = qty; 3824 jQuery.each(prices, function (price_id, amt) { 3825 let cust_price = document.querySelector(".io_product_cust_price_weekend"); 3826 if(cust_price==undefined){ 3827 var first_price = document.querySelector(".io_product_price_box"); 3828 if(first_price != null){ 3829 cust_price = first_price.cloneNode(true); 3830 /* clear all classes */ 3831 cust_price.className = ""; 3832 cust_price.classList.add("io_product_price_box"); 3833 cust_price.classList.add("io_product_cust_price_weekend"); 3834 cust_price.style.display = "none"; 3835 first_price.before(cust_price); 3836 } 3837 } 3838 3839 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3840 if(main_item_id == price_id && cust_price!=undefined){ 3841 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3842 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3843 let times = getAvailTimes(); 3844 cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekEndText; 3845 if(amt>0){ 3846 cust_price.style.display = "grid"; 3847 }else{ 3848 cust_price.style.display = "none"; 3849 } 3850 } 3851 }); 3852 } 3853 }); 3854 } 3855 function updatePageAvail_itemIDs(data){ 3856 jQuery.each(data, function (rental_id, qty){ 3857 if (rental_id == "price" && jQuery(".io_product_infobox .item_inputtype").text() != "Map") { 3858 var prices = qty; 3859 jQuery.each(prices, function (price_id, amt) { 3860 let cust_price = document.querySelector(".io_product_cust_price"); 3861 if(cust_price==undefined){ 3862 var first_price = document.querySelector(".io_product_price_box"); 3863 if(first_price != null){ 3864 cust_price = first_price.cloneNode(true); 3865 /* clear all classes */ 3866 cust_price.className = ""; 3867 cust_price.classList.add("io_product_price_box"); 3868 cust_price.classList.add("io_product_cust_price"); 3869 cust_price.style.display = "none"; 3870 first_price.before(cust_price); 3871 } 3872 } 3873 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 3874 if(main_item_id == price_id && cust_price!=undefined){ 3875 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3876 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 3877 let times = getAvailTimes(); 3878 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 3879 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 3880 cust_price.style.display = "grid"; 3881 }else{ 3882 cust_price.style.display = "none"; 3883 } 3884 } 3885 }); 3886 } 3887 3888 if(qty<=0 && rental_id != "delivery_method"){ 3889 /* cat,all-item,widget */ 3890 if(io_checkavail=="warn"){ 3891 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 3892 jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).show(); 3893 }
3894 if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().hide(); 3895 3896 /* product page */ 3897 if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){ 3898 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange"); 3899 jQuery(".io_product_container .unavailable_message").show(); 3900 } 3901 }else if(qty>0){ 3902 if(io_checkavail=="warn"){ 3903 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 3904 jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).hide(); 3905 } 3906 if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().show(); 3907 3908 /* product page */ 3909 if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){ 3910 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 3911 jQuery(".io_product_container .unavailable_message").hide(); 3912 } 3913 } 3914 }); 3915 } 3916 function updatePageAvail_itemNames(data){ 3917 jQuery.each(data, function (rental_name, qty) { 3918 rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'"); 3919 var main_name_temp = ""; 3920 if(typeof main_name_orig != "undefined"){ 3921 main_name_temp = main_name_orig.replace(/[\u2032\u2019]+/ig,"'"); 3922 } 3923 rental_name_esc = rental_name.replace(/'/g, "\\\\'"); 3924 if (rental_name == "price") { 3925 var prices = qty; 3926 jQuery.each(prices, function (price_name, amt) { 3927 /* var prices = document.querySelector(".io_product_price_box:not(.io_product_cust_price)"); */ 3928 /* if(prices != null) prices.remove(); */ 3929 let cust_price = document.querySelector(".io_product_cust_price"); 3930 if(cust_price==undefined){ 3931 var first_price = document.querySelector(".io_product_price_box"); 3932 if(first_price != null){ 3933 cust_price = first_price.cloneNode(true); 3934 /* clear all classes */ 3935 cust_price.className = ""; 3936 cust_price.classList.add("io_product_price_box"); 3937 cust_price.classList.add("io_product_cust_price"); 3938 cust_price.style.display = "none"; 3939 first_price.before(cust_price); 3940 } 3941 } 3942 try{ 3943 var main_name = decodeURIComponent(jQuery(".io_product_container .item_encoded").first().html().replace(/[+]/gi, "%20")); 3944 }catch(e){main_name=""} 3945 var i = main_name.lastIndexOf(":"); 3946 let acc_name = ""; 3947 let rental_name = ""; 3948 var i = main_name.lastIndexOf(":"); 3949 if(i>0){ 3950 rental_name = main_name.substring(0, i); 3951 acc_name = main_name.substring(i+1); 3952 } 3953 if (acc_name.toUpperCase() == price_name.toUpperCase() && cust_price!=undefined){ 3954 var rental_id = document.querySelector(".item_rentalid").innerText; 3955 if(rental_id != null){ 3956 rid_arr = rental_id.split(":"); 3957 /* ignore the main id for this */ 3958 rental_id = rid_arr[rid_arr.length-1]; 3959 if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){ 3960 amt = prices[acc_name]; 3961 }else{ 3962 let item_price = Number(prices[rental_name].replace(",","")); 3963 amt = Number(amt.replace(",","")) + item_price; 3964 amt = simpleCart.toCurrency(amt, {symbol:""}) 3965 } 3966 } 3967 cust_price.querySelector("p:nth-child(1)").innerText="$"+amt; 3968 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3969 let times = getAvailTimes(); 3970 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 3971 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 3972 cust_price.style.display = "grid"; 3973 }else{ 3974 cust_price.style.display = "none"; 3975 } 3976 3977 }else if(!rental_name && !acc_name && cust_price!=undefined){ 3978 amt = prices[main_name]; 3979 cust_price.querySelector("p:nth-child(1)").innerText="$"+amt; 3980 if(typeof amt == "string") amt = Number(amt.replace(",","")); 3981 let times = getAvailTimes(); 3982 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 3983 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 3984 cust_price.style.display = "grid"; 3985 }else{ 3986 cust_price.style.display = "none"; 3987 } 3988 } 3989 3990 }); 3991 } 3992 3993 if(qty<=0){ 3994 /* cat,all-item,widget */ 3995 if(io_checkavail=="warn"){ 3996 jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 3997 jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").show(); 3998 }
3999 if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").hide(); 4000 4001 /* product page */ 4002 if(jQuery(".io_product_container").length && io_checkavail!="off"){ 4003 if(main_name_temp==rental_name){ 4004 jQuery(".io_product_container .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4005 jQuery(".io_product_container .unavailable_message").show(); 4006 } 4007 } 4008 }else if(qty>0){ 4009 /* console.log("good"); */ 4010 if(io_checkavail=="warn"){ 4011 jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4012 jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").hide(); 4013 } 4014 if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").show(); 4015 4016 /* product page */ 4017 if(jQuery(".io_product_container").length && io_checkavail!="off"){ 4018 if(main_name_temp==rental_name){ 4019 jQuery(".io_product_container .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4020 jQuery(".io_product_container .unavailable_message").hide(); 4021 } 4022 } 4023 } 4024 }); 4025 } 4026 function displayAccessoryPrices(data) { 4027 if (data.price) { 4028 let acc_prices = data.price; 4029 for (const [key, value] of Object.entries(acc_prices)) { 4030 let new_key = key; 4031 if ((key.match(/_/g) || []).length > 1) { 4032 let split_key = key.split("_"); 4033 let second_to_last = split_key[split_key.length - 2]; 4034 let last = split_key[split_key.length - 1]; 4035 new_key = second_to_last + "_" + last; 4036 } 4037 if (io_hide_zero == 1 && value > 0) { 4038 let id_string = "#io_acc_desc_" + new_key; 4039 let formatted_price = simpleCart.toCurrency(value); 4040 if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) { 4041 jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price); 4042 } else { 4043 let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>'; 4044 jQuery(id_string).after(price_display); 4045 } 4046 } else if (io_hide_zero == 0) { 4047 let id_string = "#io_acc_desc_" + new_key; 4048 let formatted_price = simpleCart.toCurrency(value); 4049 if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) { 4050 jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price); 4051 } else { 4052 let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>'; 4053 jQuery(id_string).after(price_display); 4054 } 4055 } 4056 } 4057 } 4058 } 4059 function make_live_price_editable_time(times, delivery_method=null) { 4060 if(!delivery_method) delivery_method = getCookie("io_delivery_method"); 4061 let ele_text = ""; 4062 if(times[0]) ele_text = "on " + times[0] + " "; 4063 if(times[2] === 0) times[2] = 1; 4064 if(io_hidetimes!="on" && !isNaN(times[2])) ele_text += "for "+times[2]+" hours "; 4065 if(delivery_method) ele_text += "for " + delivery_method + ". "; 4066 ele_text += '<span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()>edit</span>'; 4067 return ele_text; 4068 } 4069 function checkAvailDateClick(){ 4070 cartShow(); 4071 /* expand the date picker */ 4072 setTimeout(calSetDateRange,100); 4073 } 4074 function checkAvailPageOnly(){ 4075 checkAvailFilter(); 4076 if(addressCookiesSet() && io_distance_charge){ 4077 runDeliveryCall(true); 4078 } 4079 } 4080 function getAccIDforPrice(){ 4081 let accessory_arr = jQuery(".io_acc_li").toArray(); 4082 let acc_rental_id_str = ""; 4083 for(let current_accessory = 0; current_accessory < accessory_arr.length; current_accessory++){ 4084 let required_tag = jQuery(accessory_arr[current_accessory]).find(".item_required"); 4085 if(required_tag.length > 0){ 4086 if(required_tag[0].innerText == 0){ 4087 acc_rental_id_str += jQuery(accessory_arr[current_accessory]).find(".item_rentalid")[0].innerText +"|"; 4088 } 4089 } 4090 } 4091 return acc_rental_id_str; 4092 } 4093 function getUpsellIDforPrice(){ 4094 let upsell_arr = jQuery(".page-carousel-rid").toArray(); 4095 let upsell_rental_id_str = ""; 4096 for(let current_upsell = 0; current_upsell < upsell_arr.length; current_upsell++){ 4097 upsell_rental_id_str +=upsell_arr[current_upsell].innerText+"|"; 4098 } 4099 return upsell_rental_id_str; 4100 } 4101 function displayUpsellPrices(data){ 4102 if(data.price){ 4103 let upsell_prices = data.price; 4104 for (const [key, value] of Object.entries(upsell_prices)) { 4105 if(io_hide_zero == 1 && value > 0){ 4106 let id_string = "#rid"+ key; 4107 let formatted_price = simpleCart.toCurrency(value); 4108 let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>'; 4109 jQuery(id_string).after(price_display); 4110 }else if(io_hide_zero == 0){ 4111 let id_string = "#rid"+ key; 4112 let formatted_price = simpleCart.toCurrency(value); 4113 let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>'; 4114 jQuery(id_string).after(price_display); 4115 } 4116 } 4117 pageFlickityRefresh(); 4118 } 4119 } 4120 /*</editor-fold>*/ 4121 4122 /*<editor-fold defaultstate="collapsed" desc="Check Avail - Cart">*/ 4123 function checkAvailCartOnly(skip_timer=false){ 4124 checkAvailCart(); 4125 checkAvailCartTimeslots(); 4126 } 4127 4128 function checkAvailCartTimeslots(){ 4129 let rental_names = ""; 4130 let rental_ids = "";
4131 let cart_rental_names = ""; 4132 let cart_rental_ids = ""; 4133 let times = getAvailTimes(); 4134 let start_date = times[0]; 4135 let event_duration = times[2]; 4136 let end_date = start_date; 4137 var event_start_time = getCookie("io_timeStart"); 4138 simpleCart.each(function (item, x) { 4139 var timeslots_html = item.get('timeslots'); 4140 if(typeof timeslots_html == "undefined") return; 4141 if(timeslots_html.length == 0) return; 4142 var cart_name = item.get("encoded"); 4143 if(cart_name==null) { 4144 cart_name = encodeURIComponent(item.get("name")); 4145 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 4146 } 4147 rental_id = item.get("rentalid"); 4148 4149 var timeslot_name = getTimeslotName(timeslots_html); 4150 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 4151 if(typeof timeslot_sel_range != "undefined"){ 4152 /* timeslots */ 4153 setTimeslotSelected(item, timeslot_name); 4154 }else{ 4155 /* timepickers */ 4156 setTimePicker(item, timeslot_name); 4157 let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_")); 4158 let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_")); 4159 timeslot_sel_range = start_timepicker[start_timepicker.length-1].value; 4160 timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value; 4161 } 4162 4163 var timeslot_sel_arr = ""; 4164 if(typeof timeslot_sel_range != "undefined"){ 4165 var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range); 4166 if(start_time && end_time){ 4167 let newDate1 = convertDateStringtoDateObject(start_date, start_time); 4168 let newDate2 = convertDateStringtoDateObject(end_date, end_time); 4169 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 4170 let quantity = item.get("quantity"); 4171 if(item.get("inputtype") == "Map"){ 4172 quantity = 1 4173 } 4174 rental_names += cart_name + "-" + quantity+"|"; 4175 rental_ids += rental_id+"-"+quantity+"-"+start_time+"-"+time_duration+"|"; 4176 cart_rental_names = rental_names; 4177 cart_rental_ids = rental_ids; 4178 } 4179 } 4180 }); 4181 if(rental_ids || rental_names){ 4182 checkAvailCall(start_date,event_start_time,event_duration,rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,1); 4183 } 4184 return true; 4185 } 4186 4187 function checkAvailCart(){ 4188 let rental_names = ""; 4189 let rental_ids = ""; 4190 let cart_rental_names = ""; 4191 let cart_rental_ids = ""; 4192 simpleCart.each(function (item, x) { 4193 if(typeof item.get('timeslots') != "undefined"){ 4194 if(item.get('timeslots').length > 0){ 4195 return; 4196 } 4197 } 4198 var cart_name = item.get("encoded"); 4199 if(cart_name==null){ 4200 cart_name = encodeURIComponent(item.get("name")); 4201 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 4202 } 4203 let quantity = item.get("quantity"); 4204 if(item.get("inputtype") == "Map"){ 4205 quantity = 1 4206 } 4207 rental_names += cart_name + "-" + quantity + "|"; 4208 cart_rental_names += cart_name + "-" + quantity + "|"; 4209 var cart_id = item.get("rentalid"); 4210 rental_ids += cart_id + "-" + quantity + "|"; 4211 cart_rental_ids += cart_id + "-" + quantity + "|"; 4212 }); 4213 var times = getAvailTimes(); 4214 let return_id = 0; 4215 if(rental_ids != ""){ 4216 return_id = 1; 4217 } 4218 if(rental_ids != "" || rental_names != ""){ 4219 return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,return_id); 4220 } 4221 return true; 4222 } 4223 function updateCartAvail(data){ 4224 let use_id = data["return_id"] 4225 delete data["return_id"]; 4226 if(use_id == 1){ 4227 updateCartAvail_itemIDs(data) 4228 }else{ 4229 updateCartAvail_itemNames(data); 4230 } 4231 console.log("cart update"); 4232 if(addressCookiesSet() && io_distance_charge){ 4233 runDeliveryCall(true); 4234 } 4235 /* simpleCart.trigger("update"); */
4236 simpleCart.update(); 4237 /* jQuery("#avail").html(output); */ 4238 } 4239 4240 function updateCartAvail_itemIDs(data){ 4241 jQuery.each(data, function (rental_id, qty){ 4242 simpleCart.each(function (item, x) { 4243 if(rental_id == item.get("rentalid")){ 4244 if(io_hideQuantityAvail == "off"){ 4245 if(qty>=9999 || item.get("inputtype") == "Map" || (item.get("giftcardvalue") && item.get("giftcardvalue").trim())){ 4246 item.set("availability", "available"); 4247 }else{ 4248 item.set("availability", qty + " available"); 4249 } 4250 }else if(io_hideQuantityAvail == "on"){ 4251 if(qty<=0 || qty < item.get("quantity")){ 4252 item.set("availability", "not available"); 4253 }else{ 4254 item.set("availability", "available"); 4255 } 4256 } 4257 var vendorid = item.get("vendorid"); 4258 if(vendorid && vendorid.trim()){ 4259 item.set("availability", "availability must be verified"); 4260 } 4261 } 4262 if (rental_id == "price") { 4263 var prices = qty; 4264 jQuery.each(prices, function (price_name, amt) { 4265 if(price_name == item.get("rentalid")){ 4266 if (typeof amt == "string" || amt instanceof String){ 4267 if(amt != "TBD"){ 4268 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4269 } 4270 } 4271 item.set("price", amt); 4272 } 4273 }); 4274 } 4275 }); 4276 }); 4277 } 4278 4279 function updateCartAvail_itemNames(data){ 4280 jQuery.each(data, function (rental_name, qty) { 4281 rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'"); 4282 simpleCart.each(function (item, x) { 4283 try{ 4284 var cart_name = decodeURIComponent(item.get("encoded").replace(/[+]/gi, "%20")); 4285 }catch(e){cart_name=null} 4286 if(cart_name==null) cart_name = item.get("name") 4287 cart_name = cart_name.replace(/[\u2032\u2019]+/ig,"'"); 4288 var i = cart_name.lastIndexOf(":"); 4289 if(i>0 && cart_name.toUpperCase() != rental_name.toUpperCase() && rental_name!="price"){cart_name = cart_name.substring(i+1)} 4290 if (cart_name.toUpperCase() == rental_name.toUpperCase()) { 4291 if(qty>9999){ 4292 item.set("availability", "available"); 4293 }else{ 4294 item.set("availability", qty + " available"); 4295 } 4296 } 4297 if (rental_name == "price") { 4298 var prices = qty; 4299 jQuery.each(prices, function (price_name, amt) { 4300 price_name = price_name.replace(/[\u2032\u2019]+/ig,"'"); 4301 let acc_name = ""; 4302 let rental_name = ""; 4303 var i = cart_name.lastIndexOf(":"); 4304 if(i>0){ 4305 rental_name = cart_name.substring(0, i); 4306 acc_name = cart_name.substring(i+1); 4307 } 4308 if (acc_name === price_name) { 4309 var rental_id = item.get("rentalid"); 4310 if(rental_id != null){ 4311 rid_arr = rental_id.split(":"); 4312 /* ignore the main id for this */ 4313 rental_id = rid_arr[rid_arr.length-1]; 4314 if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){ 4315 amt = prices[acc_name]; 4316 }else{ 4317 let item_price = Number(prices[rental_name].replace(",","")); 4318 amt = Number(amt.replace(",","")) + item_price; 4319 item.set("price", amt); 4320 return; 4321 } 4322 } 4323 if(amt==null){ 4324 amt = "0"; 4325 } 4326 /* returned price is per unit */ 4327 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4328 item.set("price", amt); 4329 }else if(!rental_name && !acc_name){ 4330 amt = Number(prices[cart_name].replace(",","")); 4331 item.set("price", amt); 4332 } 4333 }); 4334 } 4335 }); 4336 }); 4337 } 4338 /*</editor-fold>*/ 4339 4340 /*<editor-fold defaultstate="collapsed" desc="Upsell Carousels">*/ 4341 function updateCartUpsell(data){ 4342 let cart_carousel = jQuery(".cart-carousel"); 4343 viewport = jQuery(".cart-carousel .flickity-viewport"); 4344 if(viewport.length > 0){ 4345 cart_carousel.flickity("destroy"); 4346 } 4347 cart_carousel.empty(); 4348 data.forEach(function(upsell){ 4349 cell = createCartCarouselCell(upsell["image"], upsell["name"], upsell["page"]); 4350 cart_carousel.append(cell); 4351 }); 4352 makeCarousel(cart_carousel); 4353 jQuery("#cart-carousel-container").show(); 4354 setTimeout(cartFlickityRefresh, 500); 4355 } 4356 4357 function cartFlickityRefresh(){ 4358 jQuery(".cart-carousel").flickity("resize"); 4359 } 4360 4361 //IO-14031 4362 function isMobile() 4363 { 4364 // Modern detection 4365 if (navigator.userAgentData && navigator.userAgentData.mobile !== undefined) { 4366 return navigator.userAgentData.mobile; 4367 } 4368 4369 // Fallback for older browsers 4370 return /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent) || 4371 ('ontouchstart' in window && navigator.maxTouchPoints > 0); 4372 } 4373 4374 function makeCarousel(cart_carousel) 4375 { 4376 cart_carousel.flickity({ 4377 wrapAround: true, 4378 draggable: isMobile(), 4379 cellAlign: 'left', 4380 //autoPlay: 3000, 4381 groupCells: true, 4382 resize: true 4383 }); 4384 cart_carousel_set = true; 4385 } 4386 4387 function createCartCarouselCell(image, name, page){ 4388 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>'; 4389 return cell; 4390 } 4391 /*</editor-fold>*/ 4392 4393 /*<editor-fold defaultstate="collapsed" desc="Ajax Calls">*/ 4394 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) { 4395 /*
4396 IO-21459 If we have no duration set (event not set in cart), and we are doing the call for the page live 4397 price, and we have the setting on where we want to display this price even if the event date is not set: 4398 4399 We set the time_duration to 1 hour. This defaults the start date to January 1, 1970 with duration of 4400 1 hour in the lead meaning it will be available and we have the one hour price. 4401 */ 4402 if((isNaN(time_duration) || time_duration===0) && price_only==1 && io_always_display_live_price == "on"){ 4403 time_duration = 1; 4404 if(!start_date){ 4405 start_date = getFormatteddate(new Date()); 4406 } 4407 if(!start_time){ 4408 start_time = getFormattedtime(new Date()); 4409 } 4410 }else if((isNaN(time_duration) || time_duration===0) && price_only==0 && io_hidetimes === "on"){ 4411 /* 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. */ 4412 time_duration = 1; 4413 }else if(isNaN(time_duration) || time_duration===0){ 4414 return; 4415 } 4416 url = "https://rental.software/quotes/check_availability_v2.php?callback=?"; 4417 if(window.location.href.indexOf("localhost") > -1){ 4418 //url = "http://localhost/bugs/quotes/check_availability_v2.php?callback=?"; 4419 url = "http://localhost/io/bugs/quotes/check_availability_v2.php?callback=?"; 4420 //url = "http://localhost/jbug/trunk/quotes/check_availability_v2.php?callback=?"; 4421 } 4422 if(!delivery_method) delivery_method = getCookie("io_delivery_method"); 4423 let address_data = { 4424 "address": getCookie("io_address"), 4425 "state": getCookie("io_state"), 4426 "city": getCookie("io_city"), 4427 "zip": getCookie("io_zip") 4428 }; 4429 if(!ioHasMarketingConsent()){ 4430 address_data = {"address":"", "state":"", "city":"", "zip":""}; 4431 } 4432 url += 4433 "&name=" + encodeURIComponent("Brincabrincas El Pariente") + 4434 "&startdate=" + start_date + 4435 "&starttime=" + start_time + 4436 "&duration=" + time_duration + 4437 "&street=" + encodeURIComponent(address_data["address"]) + 4438 "&city=" + encodeURIComponent(address_data["city"]) + 4439 "&state=" + encodeURIComponent(address_data["state"]) + 4440 "&zip=" + encodeURIComponent(address_data["zip"]) + 4441 "&single_cart=" + singleCart + 4442 "&usecushion=1" + 4443 "&include_price=1" + 4444 "&showlocations=0" + 4445 "&rental_names=" + rental_names + 4446 "&rental_ids=" + rental_ids + 4447 "&cart_rental_names=" + cart_rental_names + 4448 "&cart_rental_ids=" + cart_rental_ids + 4449 "&return_id=" + return_id + 4450 "&delivery_method=" + delivery_method + 4451 "&temp=" + temp + 4452 "&skip_hidden_lead="+ skip_hidden_lead; 4453 if (custom_price_name) 4454 { 4455 ioCartLoaderIncrement(); 4456 jQuery.getJSON(url, function (data) 4457 { 4458 try 4459 { 4460 returnFunc(data, custom_price_name); 4461 } 4462 finally 4463 { 4464 ioCartLoaderDecrement(); 4465 } 4466 }); 4467 } 4468 else 4469 { 4470 ioCartLoaderIncrement(); 4471 jQuery.getJSON(url, function (data) 4472 { 4473 try 4474 { 4475 returnFunc(data); 4476 } 4477 finally 4478 { 4479 ioCartLoaderDecrement(); 4480 } 4481 }); 4482 } 4483 } 4484 4485 function getUpsellsCall(start_date,start_time,time_duration,rental_ids,returnFunc) { 4486 if(rental_ids.replace(/[|]/g,"").length==0){return;} 4487 url = "https://rental.software/quotes/in_cart_upsell.php?callback=?"; 4488 if(window.location.href.indexOf("localhost") > -1){ 4489 //url = "http://localhost/bugs/quotes/in_cart_upsell.php?callback=?" 4490 url = "http://localhost/io/bugs/quotes/in_cart_upsell.php?callback=?" 4491 } 4492 url += 4493 "&name=" + encodeURIComponent("Brincabrincas El Pariente") + 4494 "&startdate=" + start_date + 4495 "&starttime=" + start_time + 4496 "&duration=" + time_duration + 4497 "&usecushion=1" + 4498 "&include_price=1" + 4499 "&showlocations=0" + 4500 "&rental_ids=" + rental_ids; 4501 //IO-25557 4502 if(window.location.href.indexOf("dev.rental.software") > -1)//if it is a dev site, we need to send 4503 { 4504 let pattern = /(https:\/\/dev\.rental\.software\/[^\/]+\/)/; 4505 let matches = window.location.href.match(pattern); 4506 matches && matches.length > 0 ? url += "&site=" + matches[0]:0; 4507 } 4508 else 4509 { 4510 url += "&site=" + window.location.host; 4511 } 4512 jQuery.getJSON(url, returnFunc); 4513 } 4514 /*</editor-fold>*/ 4515 4516 /*<editor-fold defaultstate="collapsed" desc="Customer Geolocation Functions">*/ 4517 function setLocationInLocalStorage(city) 4518 {
4519 try 4520 { 4521 const location_data = 4522 { 4523 city: city, 4524 timestamp: Date.now() 4525 }; 4526 localStorage.setItem(storage_key, JSON.stringify(location_data)); 4527 return true; 4528 } 4529 catch (e) 4530 { 4531 console.warn('Failed to save location to localStorage:', e); 4532 return false; 4533 } 4534 } 4535 4536 function getLocationFromLocalStorage() 4537 { 4538 try 4539 { 4540 const location_data = localStorage.getItem(storage_key); 4541 if (location_data) 4542 { 4543 return JSON.parse(location_data); 4544 } 4545 4546 } 4547 catch (e) 4548 { 4549 console.warn('Failed to retrieve location from localStorage:', e); 4550 } 4551 return null; 4552 } 4553 4554 function displayLocation(city) 4555 { 4556 const location_element = jQuery('.io_geo_city'); 4557 const container_element = jQuery('#io_customer_geolocation'); 4558 4559 if (location_element.length && container_element.length) 4560 { 4561 location_element.text(`${city}`); 4562 container_element.show(); 4563 return true; 4564 } 4565 return false; 4566 } 4567 4568 function getCityFromIO(returnFunc) 4569 { 4570 var url = "https://rental.software/include/geolocation_handler.php?callback=?"; 4571 if(window.location.href.indexOf("localhost") > -1) 4572 { 4573 url = "http://localhost//features//include/geolocation_handler.php?callback=?"; 4574 } 4575 url += 4576 "&name=" + encodeURIComponent("Brincabrincas El Pariente") + 4577 "&ip=" + encodeURIComponent(io_customer_ip); 4578 4579 jQuery.getJSON(url, returnFunc); 4580 } 4581 4582 function initializeGeolocation() 4583 { 4584 try 4585 { 4586 // Check local storage first 4587 const cached_location = getLocationFromLocalStorage(); 4588 if (cached_location && cached_location.city) 4589 { 4590 if (displayLocation(cached_location.city)) 4591 { 4592 return; 4593 } 4594 } 4595 4596 // If no cached location, call the handler to get location 4597 getCityFromIO(function(location_data) 4598 { 4599 if (location_data && location_data.city && !location_data.error) 4600 { 4601 // Display and store the location 4602 if (displayLocation(location_data.city)) 4603 { 4604 setLocationInLocalStorage(location_data.city); 4605 } 4606 } 4607 else 4608 { 4609 console.warn('Failed to get location:', location_data ? location_data.error : 'Unknown error'); 4610 } 4611 }); 4612 } 4613 catch (error) 4614 { 4615 console.error('Geolocation initialization failed:', error); 4616 } 4617 } 4618 /*</editor-fold>*/ 4619 4620 /*<editor-fold defaultstate="collapsed" desc="Loading Animation Helpers">*/ 4621 4622 /** 4623 * Toggles the visibility of the cart loading overlay. 4624 * 4625 * @param {boolean} show - A boolean value to determine whether to show or hide the overlay. 4626 * If true, the overlay becomes visible; if false, it is hidden. 4627 * @return {void} This function does not return a value. 4628 */ 4629 function ioCartShowOverlay(show) 4630 { 4631 try 4632 { 4633 var overlay = document.getElementById('ioCartLoadingOverlay'); 4634 if (!overlay) return; 4635 if (show) 4636 { 4637 overlay.style.display = 'flex'; 4638 overlay.setAttribute('aria-hidden', 'false'); 4639 } 4640 else 4641 { 4642 overlay.style.display = 'none'; 4643 overlay.setAttribute('aria-hidden', 'true'); 4644 } 4645 } 4646 catch (e) 4647 {} 4648 } 4649 4650 /** 4651 * Activates the cart loader by setting the loading state to active, initializing the loading count, 4652 * and displaying the overlay. Includes a fallback to deactivate the loader if no response is received 4653 * within a specified timeout period. 4654 * 4655 * @return {void} This method does not return a value. 4656 */ 4657 function ioCartLoaderActivate() 4658 { 4659 io_cart_loading_active = true; 4660 io_cart_loading_count = 0; 4661 ioCartShowOverlay(true); 4662 4663 //fallback in case the availability call doesn't come back 4664 if (io_cart_loading_fallback_timer) clearTimeout(io_cart_loading_fallback_timer); 4665 io_cart_loading_fallback_timer = setTimeout(function () { 4666 if (io_cart_loading_active) { 4667 io_cart_loading_active = false;
4668 io_cart_loading_count = 0; 4669 ioCartShowOverlay(false); 4670 } 4671 }, 15000); 4672 } 4673 4674 /** 4675 * Increments the count of active cart loading operations and ensures the cart overlay is displayed. 4676 * 4677 * This method increases the `io_cart_loading_count` if the `io_cart_loading_active` flag is set to true. 4678 * It also calls the `ioCartShowOverlay` function with a true value to show the overlay. 4679 * 4680 * @return {void} This function does not return any value. 4681 */ 4682 function ioCartLoaderIncrement() 4683 { 4684 if (io_cart_loading_active) 4685 { 4686 io_cart_loading_count++; 4687 ioCartShowOverlay(true); 4688 } 4689 } 4690 4691 /** 4692 * Decrements the `io_cart_loading_count` if `io_cart_loading_active` is true. 4693 * If the count reaches zero, it deactivates the loader, removes the overlay, 4694 * and clears the fallback timer 4695 */ 4696 function ioCartLoaderDecrement() 4697 { 4698 if (io_cart_loading_active) 4699 { 4700 io_cart_loading_count = Math.max(0, io_cart_loading_count - 1); 4701 4702 if (io_cart_loading_count === 0) 4703 { 4704 io_cart_loading_active = false; 4705 ioCartShowOverlay(false); 4706 4707 if (io_cart_loading_fallback_timer) 4708 { 4709 clearTimeout(io_cart_loading_fallback_timer); 4710 io_cart_loading_fallback_timer = null; 4711 } 4712 } 4713 } 4714 } 4715 4716 /*</editor-fold>*/</script>
4716 <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" 4717 id="address_entry_submit" 4718 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>
4718<script>/* for checking delivery */ 4719 function runDeliveryCall(cart_only = false){ 4720 let address_fields = jQuery("[id^='io_cd_']"); 4721 let address_data = { 4722 "address": getCookie("io_address"), 4723 "state": getCookie("io_state"), 4724 "city": getCookie("io_city"), 4725 "zip": getCookie("io_zip") 4726 }; 4727 4728 let times = getAvailTimes(); 4729 4730 let start_date = times[0]; 4731 let end_date = start_date; 4732 let start_time = times[1]; 4733 let duration = times[2]; 4734 4735 let rental_ids = ""; 4736 simpleCart.each(function (item, x) { 4737 if(typeof item.get('timeslots') != "undefined"){ 4738 if(item.get('timeslots').length > 0){ 4739 var timeslots_html = item.get('timeslots'); 4740 var rental_id = item.get('rentalid'); 4741 if(typeof timeslots_html == "undefined") return; 4742 if(timeslots_html.length == 0) return; 4743 4744 var timeslot_name = getTimeslotName(timeslots_html); 4745 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 4746 if(typeof timeslot_sel_range != "undefined"){ 4747 /* timeslots */ 4748 setTimeslotSelected(item, timeslot_name); 4749 }else{ 4750 /* timepickers */ 4751 setTimePicker(item, timeslot_name);//todo? 4752 let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_")); 4753 let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_")); 4754 timeslot_sel_range = start_timepicker[start_timepicker.length-1].value; 4755 timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value; 4756 } 4757 4758 var timeslot_sel_arr = ""; 4759 if(typeof timeslot_sel_range != "undefined"){ 4760 timeslot_sel_arr = timeslot_sel_range.split(" - "); 4761 var timeslot_start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace(" "," "); 4762 var timeslot_end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace(" "," "); 4763 if(timeslot_start_time && timeslot_end_time){ 4764 let newDate1 = convertDateStringtoDateObject(start_date, timeslot_start_time); 4765 let newDate2 = convertDateStringtoDateObject(end_date, timeslot_end_time); 4766 let timeslot_duration = ((newDate2 - newDate1) / 3600) / 1000; 4767 rental_ids += rental_id+"-"+item.get("quantity")+"-"+timeslot_start_time+"-"+timeslot_duration+"|"; 4768 } 4769 } 4770 } 4771 } 4772 else{ 4773 var cart_id = item.get("rentalid"); 4774 rental_ids += cart_id + "-" + item.get("quantity") + "|"; 4775 } 4776 }); 4777 4778 address_fields.each(function() { 4779 let field = this.id.split("_")[2]; 4780 value = this.value; 4781 if(!value && !address_data[field]){ 4782 jQuery(this).addClass("invalid_address_field") 4783 } 4784 else if(value){ 4785 jQuery(this).removeClass("invalid_address_field") 4786 address_data[field] = this.value; 4787 } 4788 }); 4789 if(jQuery(".invalid_address_field").length > 0){ 4790 return; 4791 } 4792 let delivery_method = "" 4793 if(io_default_delivery_method) 4794 { 4795 delivery_method = io_default_delivery_method; 4796 } 4797 else if(getCookie("io_delivery_method")) 4798 { 4799 delivery_method = getCookie("io_delivery_method"); 4800 } 4801 4802 4803 setCookie("io_address", address_data["address"], 14); 4804 setCookie("io_city", address_data["city"], 14); 4805 setCookie("io_state", address_data["state"], 14); 4806 setCookie("io_zip", address_data["zip"], 14); 4807 4808 cart_total = simpleCart.total(); 4809 if(cart_total === "TBD") cart_total = 0; 4810 url = "https://rental.software/quotes/get_delivery_info.php?callback=?"; 4811 if(window.location.href.indexOf("localhost") > -1){ 4812 //url = "http://localhost/bugs/quotes/get_delivery_info.php?callback=?"; 4813 url = "http://localhost/io/bugs/quotes/get_delivery_info.php?callback=?"; 4814 } 4815 url += 4816 "&name=" + encodeURIComponent("Brincabrincas El Pariente") + 4817 "&rental_ids=" + rental_ids + 4818 "&street=" + encodeURIComponent(address_data["address"]) + 4819 "&city=" + encodeURIComponent(address_data["city"]) + 4820 "&state=" + encodeURIComponent(address_data["state"]) + 4821 "&zip=" + encodeURIComponent(address_data["zip"]) + 4822 "&startdate=" + start_date + 4823 "&starttime=" + start_time + 4824 "&duration=" + duration + 4825 "&delivery_method=" + encodeURIComponent(delivery_method) + 4826 "&total=" + cart_total + 4827 "&cart_only=" + cart_only; 4828 jQuery.getJSON(url, function(data){ 4829 if(data["delivery_restrict"] === 1){ 4830 data["charge"] = 0; 4831 }
4832 handleDeliveryInfo(data, cart_only); 4833 }); 4834 } 4835 4836 function handleDeliveryInfo(data, cart_only = false){ 4837 jQuery("#deliverSubtotalContainer").show(); 4838 jQuery("#checkDeliveryMessage").hide(); 4839 let info_box = jQuery("#delivery_charge_info_box"); 4840 if(data["delivery_restrict"] == 1){ 4841 jQuery("#info_box_header").text("Sorry..."); 4842 jQuery("#info_box_information").text(data["error"]) 4843 setDeliverySubtotal(data["charge"], true) 4844 } 4845 else{ 4846 setDeliverySubtotal(data["charge"]) 4847 jQuery("#info_box_header").text("Success!"); 4848 if(data["charge"] > 0){ 4849 jQuery("#info_box_information").html("We are able to deliver to your location with a " + simpleCart.toCurrency(data["charge"]) +" fee!"); 4850 } 4851 else{ 4852 jQuery("#info_box_information").html("We are able to deliver to your location with no charge!"); 4853 } 4854 } 4855 if(simpleCart.items().length == 0 && cart_only){ 4856 jQuery("#info_box_header").text("Items Required."); 4857 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!") 4858 } 4859 info_box.show(); 4860 jQuery.fancybox.update(jQuery(".address_entry")); 4861 } 4862 function showAddressEntry(cart_only=false){ 4863 cartHide(); 4864 jQuery(".invalid_address_field").removeClass("invalid_address_field") 4865 jQuery("#delivery_charge_info_box").hide(); 4866 jQuery("#io_cd_address").val(getCookie("io_address")); 4867 jQuery("#io_cd_state").val(getCookie("io_state")); 4868 jQuery("#io_cd_city").val(getCookie("io_city")); 4869 jQuery("#io_cd_zip").val(getCookie("io_zip")); 4870 if(!cart_only){ 4871 jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(); }); 4872 } else{ 4873 jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(cart_only); }); 4874 } 4875 jQuery.fancybox.open(jQuery(".address_entry")); 4876 } 4877 4878 function closeAddressEntry(){ 4879 jQuery.fancybox.close(); 4880 } 4881 4882 function setDeliverySubtotal(amount, unavailable=false){ 4883 if(unavailable){ 4884 jQuery("#deliverySubtotal").html("Unavailable"); 4885 } else{ 4886 jQuery("#deliverySubtotal").html(simpleCart.toCurrency(amount)); 4887 } 4888 } 4889 4890 function addressCookiesSet(){ 4891 if(getCookie("address") && getCookie("state") && getCookie("city") && getCookie("zip")){ 4892 return true; 4893 } else{ 4894 return false 4895 } 4896 }</script>
vendor: 1 bytes, line 4896
4896
4897<script>let map; 4898 let geocoder; 4899 let item_id_map; 4900 let drawingManager; 4901 let drawingListener; 4902 4903 let polygons = new Array(); 4904 4905 let polyline_markers = new Array(); 4906 let polylines = new Array(); 4907 let previous_marker; 4908 current_polyline = undefined; 4909 let previous_map_height = ""; 4910 4911 function initMap() { 4912 map = new google.maps.Map(document.getElementById("map_container"), { 4913 center: { lat: -34.397, lng: 150.644 }, 4914 zoom: 8, 4915 mapTypeId: "hybrid", 4916 disableDefaultUI: true, 4917 tilt: 0 4918 }); 4919 drawingManager = new google.maps.drawing.DrawingManager({ 4920 drawingControl: true, 4921 drawingControlOptions: { 4922 position: google.maps.ControlPosition.TOP_CENTER, 4923 drawingModes: [ 4924 google.maps.drawing.OverlayType.POLYGON, 4925 ], 4926 } 4927 }); 4928 4929 geocoder = new google.maps.Geocoder(); 4930 } 4931 4932 function io_geocode(){ 4933 let prefix = "#io_mc_" 4934 let request = "" 4935 let address_value = ""; 4936 if(jQuery(prefix+"address").length) { 4937 address_value = jQuery(prefix+"address").val(); 4938 if(address_value) setCookie("address", jQuery("#io_mc_address").val(), 14); 4939 } 4940 let city_value = ""; 4941 if(jQuery(prefix+"city").length){ 4942 city_value = jQuery(prefix+"city").val(); 4943 if(city_value) setCookie("city", jQuery("#io_mc_city").val(), 14); 4944 } 4945 let state_value = ""; 4946 if(jQuery(prefix+"state").length){ 4947 state_value = jQuery(prefix+"state").val(); 4948 if(state_value) setCookie("state", jQuery("#io_mc_state").val(), 14); 4949 } 4950 let zip_value = ""; 4951 if(jQuery(prefix+"zip").length){ 4952 zip_value = jQuery(prefix+"zip").val(); 4953 if(zip_value) setCookie("zip", jQuery("#io_mc_zip").val(), 14); 4954 } 4955 4956 request = address_value + " " + city_value + " " + state_value + " " + zip_value; 4957 if(request){ 4958 geocoder.geocode({address:request}).then((result) => { 4959 const { results } = result; 4960 map.setCenter(results[0].geometry.location); 4961 map.setZoom(24); 4962 return results; 4963 }); 4964 4965 } 4966 4967 if(!addressProvided()) { 4968 jQuery("#io_map_address_entry").attr("open", "open"); 4969 }else{ 4970 jQuery("#io_map_address_entry").removeAttr("open"); 4971 } 4972 } 4973 4974 function openMap(element){ 4975 cartHide() 4976 io_map_clear() 4977 let unit = "meters" 4978 if(country === "US") unit = "feet" 4979 polygons = new Array(); 4980 polyline_marker_sets = new Array(); 4981 polylines = new Array(); 4982 previous_marker = undefined; 4983 current_polyline = undefined; 4984 4985 jQuery("#io_mc_address").val(getCookie("address")); 4986 jQuery("#io_mc_state").val(getCookie("state")); 4987 jQuery("#io_mc_city").val(getCookie("city")); 4988 jQuery("#io_mc_zip").val(getCookie("zip")); 4989 io_geocode(); 4990 4991 google.maps.event.removeListener(drawingListener); 4992 4993 if(element.id == "calcPriceOpenMap"){ 4994 item_id_map = jQuery(".io_product_infobox .item_rentalid").text(); 4995 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 4996 setMapTools_Area(unit, true) 4997 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 4998 setMapTools_Perimeter(unit, true) 4999 } 5000 } 5001 else{ 5002 item_id_map = jQuery(element).parent().parent().find(".item-rentalid").text(); 5003 if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Area"){ 5004 setMapTools_Area(unit) 5005 }else if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Perimeter"){ 5006 setMapTools_Perimeter(unit) 5007 } 5008 } 5009 } 5010 5011 function addressProvided(){ 5012 if(jQuery("#io_mc_address").val() && jQuery("#io_mc_state").val() && 5013 jQuery("#io_mc_city").val() && jQuery("#io_mc_zip").val() ){ 5014 return true; 5015 } 5016 return false; 5017 } 5018 5019 function setMapTools_Area(unit, item_page=false){ 5020 jQuery.fancybox.open(jQuery(".map_fancybox")); 5021 drawingManager.setOptions({ 5022 drawingControlOptions: { 5023 drawingModes: [google.maps.drawing.OverlayType.POLYGON] 5024 }, 5025 drawingMode: google.maps.drawing.OverlayType.POLYGON, 5026 polygonOptions: { 5027 fillColor: "#0191fc", 5028 strokeColor: "#0113fc" 5029 }, 5030 }); 5031 let units = "meters" 5032 if(country === "US") units = "feet" 5033 5034 jQuery("#io_measurement_input_label").text("Approximate area in "+units+": "); 5035 jQuery("#io_map_manual_input").off("click"); 5036 jQuery("#io_map_manual_input").on("click", function(){manual_calc_price("Area", item_page)}); 5037 jQuery("#io_perimeter_options_container").hide(); 5038 jQuery("#io_map_new_line_container").hide(); 5039 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area y
5039ou 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>") 5040 5041 drawingListener = google.maps.event.addListener(drawingManager, "polygoncomplete", function(polygon) { 5042 polygons.push(polygon); 5043 let convert_feet = 1; 5044 if(country === "US") convert_feet = 10.764; 5045 let approx_area = 0; 5046 polygons.forEach(function(polygon) { 5047 approx_area += google.maps.geometry.spherical.computeArea(polygon.getPath()) * convert_feet; 5048 }); 5049 calcprice_approx_area(Math.round(approx_area)); 5050 }); 5051 drawingManager.setMap(map); 5052 } 5053 5054 function setMapTools_Perimeter(unit, item_page=false){ 5055 jQuery.fancybox.open(jQuery(".map_fancybox")); 5056 drawingManager.setOptions({ 5057 drawingControlOptions: { 5058 drawingModes: [google.maps.drawing.OverlayType.MARKER] 5059 }, 5060 drawingMode: google.maps.drawing.OverlayType.MARKER 5061 }); 5062 let height = jQuery("#perimeter_height").val(); 5063 let units = ""; 5064 if(height){ 5065 units = "sq meters" 5066 if(country === "US") units = "sq feet" 5067 jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": "); 5068 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>") 5069 5070 }else{ 5071 units = "meters" 5072 if(country === "US") units = "feet" 5073 jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": "); 5074 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>") 5075 5076 } 5077 5078 jQuery("#io_map_manual_input").off("click"); 5079 jQuery("#io_map_manual_input").bind("click", function(){manual_calc_price("Perimeter", item_page)}); 5080 jQuery("#perimeter_height").bind("change", function(){change_perimeter_instructions()}); 5081 jQuery("#io_perimeter_options_container").show(); 5082 jQuery("#io_map_clear_container").show(); 5083 jQuery("#io_map_new_line_container").show(); 5084 5085 current_polyline = new google.maps.Polyline({ 5086 map: map, 5087 path: [], 5088 strokeColor: "#0113fc", 5089 strokeOpacity: 1.0, 5090 strokeWeight: 2 5091 }) 5092 drawingListener = google.maps.event.addListener(drawingManager, "markercomplete", function(marker) { 5093 polyline_markers.push(marker) 5094 marker.setVisible(false); 5095 current_polyline.getPath().push(marker.getPosition()) 5096 if(previous_marker){ 5097 let convert_feet = 1; 5098 if(country === "US") convert_feet = 3.281; 5099 let approx_perimeter = 0; 5100 polylines.forEach(function(polyline) { 5101 if(convert_feet > 1) convert_feet = 10.764 5102 approx_perimeter += google.maps.geometry.spherical.computeArea(polyline.getPath()) * convert_feet; 5103 }); 5104 approx_perimeter += google.maps.geometry.spherical.computeLength(current_polyline.getPath()) * convert_feet; 5105 calcprice_approx_perimeter(Math.round(approx_perimeter)); 5106 } 5107 previous_marker = marker; 5108 }); 5109 5110 jQuery("#perimeter_height_contianer").show(); 5111
5112 drawingManager.setMap(map); 5113 } 5114 5115 function change_perimeter_instructions(){ 5116 let height = jQuery("#perimeter_height").val(); 5117 if(height){ 5118 units = "sq meters" 5119 if(country === "US") units = "sq feet" 5120 jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": "); 5121 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>") 5122 }else { 5123 units = "meters" 5124 if(country === "US") units = "feet" 5125 jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": "); 5126 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>") 5127 } 5128 } 5129 5130 function manual_calc_price(method, item_page){ 5131 let approx_measurement = parseInt(jQuery("#io_measurement_input").val()); 5132 let units = ""; 5133 if(approx_measurement){ 5134 if(method == "Area"){ 5135 units = "sq meters" 5136 if(country === "US") units = "sq feet" 5137 }else if(method == "Perimeter"){ 5138 let height = jQuery("#perimeter_height").val(); 5139 if(height){ 5140 units = "sq meters" 5141 if(country === "US") units = "sq feet" 5142 }else{ 5143 units = "meters" 5144 if(country === "US") units = "feet" 5145 } 5146 }
5147 simpleCart.items().forEach(function (item, index){ 5148 if(item.get("rentalid") === item_id_map){ 5149 item.set("units", units); 5150 item.set("quantity", approx_measurement); 5151 } 5152 }); 5153 5154 simpleCart.update(); 5155 5156 if(item_page || jQuery(".io_product_infobox .item_rentalid").text() == item_id_map) set_price_on_item_page(units, approx_measurement); 5157 if(!item_page) cartShow(); 5158 } 5159 jQuery.fancybox.close(); 5160 } 5161 5162 function calcprice_approx_area(approx_area){ 5163 jQuery("#io_measurement_input").val(approx_area); 5164 } 5165 5166 function calcprice_approx_perimeter(approx_perimeter){ 5167 let height = jQuery("#perimeter_height").val(); 5168 if(height && height > 0) approx_perimeter *= parseInt(height); 5169 5170 jQuery("#io_measurement_input").val(approx_perimeter); 5171 } 5172 5173 function set_price_on_item_page(units, measurement){ 5174 let measurement_price = document.querySelector(".io_product_measurement_price"); 5175 if(measurement_price==undefined){ 5176 var first_price = document.querySelector(".io_product_price_box"); 5177 if(first_price != null){ 5178 measurement_price = first_price.cloneNode(true); 5179 /* clear all classes */ 5180 measurement_price.className = ""; 5181 measurement_price.classList.add("io_product_price_box"); 5182 measurement_price.classList.add("io_product_measurement_price"); 5183 measurement_price.style.display = "grid"; 5184 /* Make a hidden data span for when adding to cart */ 5185 raw_measurement = document.createElement("span"); 5186 raw_measurement.classList.add("io_measure_price_raw_measurement"); 5187 raw_measurement.style.display = "none"; 5188 raw_measurement.textContent = measurement; 5189 measurement_price.appendChild(raw_measurement); 5190 first_price.before(measurement_price); 5191 } 5192 } 5193 var price_1h = Number(jQuery(".io_product_price_1h_"+jQuery(".io_product_infobox .item_rentalid").text()).text().replace(/[^0-9.-]+/g,"")); 5194 measurement_price.querySelector("p:nth-child(1)").innerHTML = simpleCart.toCurrency(price_1h*measurement); 5195 measurement_price.querySelector("p:nth-child(2)").innerHTML = "For approximately "+measurement+" "+units; 5196 } 5197 5198 function io_map_clear() { 5199 if(drawingManager.getDrawingMode() == "polygon"){ 5200 drawingManager.setDrawingMode("polygon"); 5201 } 5202 5203 if(polygons) polygons.forEach(function(polygon) { 5204 polygon.setMap(null); 5205 }); 5206 if(current_polyline) current_polyline.setMap(null); 5207 if(polylines) polylines.forEach(function(polyline) { 5208 polyline.setMap(null); 5209 }); 5210 if(polyline_markers) polyline_markers.forEach(function(marker) { 5211 marker.setMap(null); 5212 }); 5213 5214 current_polyline = new google.maps.Polyline({ 5215 map: map, 5216 path: [], 5217 strokeColor: "#0113fc", 5218 strokeOpacity: 1.0, 5219 strokeWeight: 2 5220 }); 5221 polygons = new Array(); 5222 polylines = new Array(); 5223 polyline_markers = new Array(); 5224 previous_marker = undefined; 5225 } 5226 5227 function io_map_new_line() { 5228 polylines.push(new google.maps.Polyline({ 5229 map: map, 5230 path: current_polyline.getPath(), 5231 strokeColor: "#0113fc", 5232 strokeOpacity: 1.0, 5233 strokeWeight: 2 5234 }) 5235 ); 5236 previous_marker = undefined; 5237 current_polyline.setMap(null); 5238 current_polyline = new google.maps.Polyline({ 5239 map: map, 5240 path: [], 5241 strokeColor: "#0113fc", 5242 strokeOpacity: 1.0, 5243 strokeWeight: 2 5244 }); 5245 } 5246 5247 function show_more_instruct_click(show_more_button) { 5248 if(show_more_button.textContent == "(more)") { 5249 show_more_button.textContent = "(hide)"; 5250 jQuery("#io_map_additional_instructions").show(); 5251 }else if(show_more_button.textContent == "(hide)") { 5252 show_more_button.textContent = "(more)"; 5253 jQuery("#io_map_additional_instructions").hide(); 5254 } 5255 } 5256 5257 function perimeter_height_changed(){ 5258 let current_map_height = jQuery("#perimeter_height").val(); 5259 if(current_map_height && current_map_height > 0){ 5260 if(jQuery("#io_measurement_input").val() && !previous_map_height){ 5261 let measurement = jQuery("#io_measurement_input").val(); 5262 jQuery("#io_measurement_input").val(measurement * current_map_height); 5263 }else if(jQuery("#io_measurement_input").val() && previous_map_height){ 5264 let measurement = jQuery("#io_measurement_input").val(); 5265 if(previous_map_height > 0){ 5266 measurement = measurement / previous_map_height; 5267 } 5268 jQuery("#io_measurement_input").val(measurement * current_map_height); 5269 } 5270 }else if (!current_map_height || current_map_height == 0){ 5271 if(jQuery("#io_measurement_input").val() && previous_map_height){ 5272 let measurement = jQuery("#io_measurement_input").val(); 5273 if(previous_map_height > 0){ 5274 measurement = measurement / previous_map_height; 5275 } 5276 jQuery("#io_measurement_input").val(measurement); 5277 } 5278 } 5279 previous_map_height = current_map_height; 5280 } 5281 5282 window.initMap = initMap;</script>
5282 <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" 5283 id="map_geocode_submit" 5284 onClick="io_geocode()" 5285 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" 5286 id="io_map_manual_input" 5287 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" 5288 id="io_map_clear_btn" 5289 onClick="io_map_clear()" 5290 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" 5291 id="io_map_new_line_btn" 5292 onClick="io_map_new_line()" 5293 href="javascript:;"> Add New Line </a></div></div></div></div> <br><div id="map_container">
5293<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEuvvqefKaUABPvydm00SV8Fr8tQeGVcw&libraries=drawing&callback=initMap" defer></script>
5293 </div></div>
5293<script>jQuery(".io_testimonials, #io_testimonials").each(function(){ 5294 io_get_reviews(this); 5295 }) 5296 setTimeout(function(){ 5297 jQuery(".io_testimonials .w3-ul li p").each(function(){ 5298 const container = jQuery(this).parent() 5299 const element = jQuery(this); 5300 5301 if (element[0].scrollHeight > container[0].clientHeight) { 5302 5303 jQuery(this).parent().parent().append(create_read_more()); 5304 } 5305 }); 5306 }, 500); 5307 5308 function create_read_more(){ 5309 let html = "<p class=\"io_review_readmore\" onClick=\"review_readmore_clicked(this)\">read more</p>" 5310 return html; 5311 } 5312 5313 function review_readmore_clicked(element){ 5314 let review_li = jQuery(element).parent().find("li:eq(3)"); 5315 new_height = jQuery(review_li).find("p").height() + 16; 5316 jQuery(review_li).height(new_height); 5317 jQuery(element).hide(); 5318 } 5319 5320 function io_get_reviews(element){ 5321 let io_un = "BrincabrincasElPariente"; 5322 let io_loc = "0"; 5323 let io_url1 = 'https://rental.software/testimonials_iframe.php?user='; 5324 if (location.hostname === "localhost"){ 5325 io_url1 = 'http://localhost/io/bugs/testimonials_iframe.php?user='; 5326 //io_url1 = 'http://localhost/jbug/trunk/testimonials_iframe.php?user='; 5327 } 5328 let io_url2 = '&location_id='; 5329 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'; 5330 let io_url_c = io_url1 + io_un + io_url2 + io_loc + io_url3; 5331 fetch(io_url_c, { 5332 method: 'get' 5333 }).then( 5334 function(response){ 5335 return response.json(); 5336 } 5337 ).then(function(data) { 5338 5339 5340 5341 //let element = document.getElementById("io_testimonials"); 5342 //DOM-built on purpose: literal markup in this inline script lands in the raw page 5343 //source and SEO crawlers read it as page content (IO-37932). 5344 element.textContent = ""; 5345 let review_cnt=0; 5346 let rating_sum = 0; 5347 data.forEach((user) => { 5348 const { name, review, rating, time } = user; 5349 rating_sum += Number(rating); 5350 review_cnt++; 5351 let review_div = document.createElement("div"); 5352 let review_list = document.createElement("ul"); 5353 review_list.className = "w3-ul"; 5354 let name_li = document.createElement("li"); 5355 name_li.textContent = name; 5356 let rating_li = document.createElement("li"); 5357 rating_li.textContent = rating + " "; 5358 let date_li = document.createElement("li"); 5359 date_li.textContent = time; 5360 let review_li = document.createElement("li"); 5361 let review_p = document.createElement("p"); 5362 review_p.textContent = review; 5363 review_li.appendChild(review_p); 5364 let img_star = Math.round(parseFloat(rating)); 5365 let star_img = document.createElement("img"); 5366 star_img.className = "review_img"; 5367 star_img.src = "https://rental.software/images/" + img_star + "star.png"; 5368 rating_li.appendChild(star_img); 5369 review_list.appendChild(name_li); 5370 review_list.appendChild(rating_li); 5371 review_list.appendChild(date_li); 5372 review_list.appendChild(review_li); 5373 review_div.appendChild(review_list); 5374 element.appendChild(review_div); 5375 }); 5376 let avg = (parseFloat(rating_sum)/parseFloat(review_cnt)).toFixed(1); 5377 let avg_img = Math.round(avg); 5378 let head = document.createElement("div"); 5379 let head_h2 = document.createElement("h2"); 5380 head_h2.textContent = "Avg Rating: " + avg; 5381 let head_img = document.createElement("img"); 5382 head_img.className = "review_avg_img"; 5383 head_img.src = "https://rental.software/images/" + avg_img + "star.png"; 5384 head.appendChild(head_h2); 5385 head.appendChild(head_img); 5386 element.prepend(head); 5387 }).catch(function(err) { 5388 console.log(err); 5389 }); 5390}</script>
5390 <style type="text/css">.searchio-live-search-results { 5391 opacity: 0; 5392 transition: opacity .25s ease-in-out; 5393 -moz-transition: opacity .25s ease-in-out; 5394 -webkit-transition: opacity .25s ease-in-out; 5395 height: 0; 5396 overflow: hidden; 5397 z-index: 9999995; /* Exceed searchIO Modal Search Form overlay. */ 5398 position: absolute; 5399 display: none; 5400 } 5401 5402 .searchio-live-search-results-showing { 5403 display: block; 5404 opacity: 1; 5405 height: auto; 5406 overflow: auto; 5407 } 5408 5409 .searchio-live-search-no-results { 5410 padding: 3em 2em 0; 5411 text-align: center; 5412 } 5413 5414 .searchio-live-search-no-min-chars:after { 5415 content: "Continue typing"; 5416 display: block; 5417 text-align: center; 5418 padding: 2em 2em 0; 5419 }</style>
5419<script>var _searchIO_LIVE_AJAX_SEARCH_BLOCKS = true; 5420 var _searchIO_LIVE_AJAX_SEARCH_ENGINE = 'default'; 5421 var _searchIO_LIVE_AJAX_SEARCH_CONFIG = 'default';</script>
5421
5421<script>( () => { 5422 const lazyloadRunObserver = () => { 5423 const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); 5424 const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { 5425 entries.forEach( ( entry ) => { 5426 if ( entry.isIntersecting ) { 5427 let lazyloadBackground = entry.target; 5428 if( lazyloadBackground ) { 5429 lazyloadBackground.classList.add( 'e-lazyloaded' ); 5430 } 5431 lazyloadBackgroundObserver.unobserve( entry.target ); 5432 } 5433 }); 5434 }, { rootMargin: '200px 0px 200px 0px' } ); 5435 lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { 5436 lazyloadBackgroundObserver.observe( lazyloadBackground ); 5437 } ); 5438 }; 5439 const events = [ 5440 'DOMContentLoaded', 5441 'elementor/lazyload/observe', 5442 ]; 5443 events.forEach( ( event ) => { 5444 document.addEventListener( event, lazyloadRunObserver ); 5445 } ); 5446 } )();</script>
5446
5446<script id="jquery-ui-core-js-before">jQuery.uiBackCompat = true; 5447//# sourceURL=jquery-ui-core-js-before</script>
5447
5447<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});}); 5448//# sourceURL=jquery-ui-datepicker-js-after</script>
5448
5448<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>
5448
5448<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,"container":true,"theme_builder_v2":true,"nested-elements":true,"import-export-customization":true,"e_pro_atomic_form":true,"e_pro_collection_loop":true},"urls":{"assets":"https:\/\/brincabrincaselpariente.net\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/brincabrincaselpariente.net\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/brincabrincaselpariente.net\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"475ad5c1ab","atomicFormsSendForm":"4b3fef8af9"},"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":"Brincabrincas%20El%20Pariente%20Phoenix%20AZ%20-%20Party%20Rental%20and%20Bounce%20House%20Rental","excerpt":"","featuredImage":false}}; 5449//# sourceURL=elementor-frontend-js-before</script>
5449
5449<script id="swp-live-search-client-js-extra">var searchio_live_search_params = []; 5450searchio_live_search_params = {"ajaxurl":"https:\/\/brincabrincaselpariente.net\/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"};; 5451//# sourceURL=swp-live-search-client-js-extra</script>
vendor: 131 bytes, line 5451
5451 <script id="elementor-recaptcha_v3-api-js" src="https://www.google.com/recaptcha/api.js?render=explicit&ver=4.3.1"></script>
5451<script id="wp-hooks-js" src="https://brincabrincaselpariente.net/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
5451
5451<script id="wp-i18n-js" src="https://brincabrincaselpariente.net/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
5451
5451<script id="wp-i18n-js-after">wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 5452//# sourceURL=wp-i18n-js-after</script>
5452
5452<script id="elementor-pro-frontend-js-before">var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/brincabrincaselpariente.net\/wp-admin\/admin-ajax.php","nonce":"f793261ede","urls":{"assets":"https:\/\/brincabrincaselpariente.net\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/brincabrincaselpariente.net\/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:\/\/brincabrincaselpariente.net\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; 5453//# sourceURL=elementor-pro-frontend-js-before</script>
5453
5453<script defer src="https://brincabrincaselpariente.net/wp-content/cache/autoptimize/js/autoptimize_85df37c808b3be0329c29509757bcd13.js"></script>
5453</body></html> 5454<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: October 8, 2026 11:34 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.