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 » Feed" href="https://iepnw.com/feed/" /><link rel="alternate" type="application/rss+xml" title="Inflatable Event Professionals LLC Spanaway WA » 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&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="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-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="{"background_background":"classic","sticky":"top","sticky_on":["desktop","tablet","mobile"],"sticky_offset":0,"sticky_effects_offset":0,"sticky_anchor_link_offset":0}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-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 </em></strong>in the Tacoma, Spanaway and the surrounding areas. Inflatable Event Professionals offers several great foam party options. 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. 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'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'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. </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. </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;"> 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="{"background_background":"classic"}"><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="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-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="{"background_background":"slideshow","background_slideshow_gallery":[{"id":5379,"url":"https:\/\/iepnw.com\/wp-content\/uploads\/2024\/04\/Tacoma-Inflatable-Castle-Bounce-House-Rental.jpg"},{"id":5368,"url":"https:\/\/iepnw.com\/wp-content\/uploads\/2024\/04\/Tacoma-Inflatable-Obstacle-Course-Rental.jpg"},{"id":4725,"url":"https:\/\/iepnw.com\/wp-content\/uploads\/2024\/04\/Fun20photo20booth20rental_1712520760_big.
264jpg"}],"background_slideshow_slide_transition":"slide_right","background_slideshow_loop":"yes","background_slideshow_slide_duration":5000,"background_slideshow_transition_duration":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="{"background_background":"classic"}"><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="{"gallery_layout":"justified","lazyload":"yes","ideal_row_height":{"unit":"px","size":200,"sizes":[]},"ideal_row_height_tablet":{"unit":"px","size":150,"sizes":[]},"ideal_row_height_mobile":{"unit":"px","size":150,"sizes":[]},"gap":{"unit":"px","size":10,"sizes":[]},"gap_tablet":{"unit":"px","size":10,"sizes":[]},"gap_mobile":{"unit":"px","size":10,"sizes":[]},"link_to":"file","overlay_background":"yes","content_hover_animation":"fade-in"}" 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="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1c373cdb" data-id="1c373cdb" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><section class="elementor-section elementor-inner-section elementor-element elementor-element-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="{"background_background":"classic"}"><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, & 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="{"background_background":"classic"}"><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 & 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="{"background_background":"classic"}"><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 &<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="{"video_type":"vimeo"}" 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&autopause=0&loop=0&muted=0&title=1&portrait=1&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="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-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’t find what you’re looking for or curious about one of our products? Don’t hesitate to give us a call or use our <a href="#io_contactform">contact form</a> to reach out to us anytime!</p></div></div><div class="elementor-element elementor-element-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="{"step_next_label":"Next","step_previous_label":"Previous","button_width":"100","step_type":"number_text","step_icon_shape":"circle"}" data-widget_type="form.default"><div class="elementor-widget-container"><form class="elementor-form" method="post" id="io_contactusform" name="Request Call Back" aria-label="Request Call Back"> <input type="hidden" name="post_id" value="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()#&+*-=.]+" title="Only numbers and phone characters (#, -, *, etc) are accepted."></div><div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-notes elementor-col-100"> <label for="form-field-notes" class="elementor-field-label elementor-screen-only"> Message </label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[notes]" id="form-field-notes" rows="3" placeholder=""I need help from a human sales rep.""></textarea></div><div class="elementor-field-type-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="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-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&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.