PageSourceSearch

https://iepnw.com/

html iepnw.com collected 2026-09-26 12:24:37 UTC 327,975 bytes, 5,675 lines download raw bytes

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